# AGENTS.md ## Project Overview Snap2Sim / Inside the Machine is a Build Small Hackathon Backyard AI project for curious tinkerers and makers. The app is intended to accept a photo of a hardware component, infer its internal mechanism, and render an annotated technical cutaway animation. ## Commit Instructions - When Codex creates a git commit in this repository, include this trailer in the commit message: `Co-authored-by: OpenAI Codex ` - Do not rewrite already-pushed public history only to add a co-author trailer unless the user explicitly asks for that history rewrite. ## Runtime Notes - Preferred model path: `unsloth/NVIDIA-Nemotron-3-Nano-Omni-30B-A3B-Reasoning-GGUF` through llama.cpp. - Verification note from June 13, 2026: the Unsloth GGUF repo lists `mmproj` files and llama.cpp usage instructions. Modal GPU smoke testing confirms the selected `UD-Q4_K_M` GGUF and `mmproj-F16.gguf` work with `llama-mtmd-cli` image input. - Fallback model path: `nvidia/Nemotron-3-Nano-Omni-30B-A3B-Reasoning-NVFP4` through Transformers/custom code for the vision step if GGUF endpoint quality is not reliable enough for the demo. - Local code serves a trusted `index.html` through `gradio.Server` and exposes `/analyze_image` plus `/generate_scene`. The final public Space is `build-small-hackathon/Snap2Sim` at `https://build-small-hackathon-snap2sim.hf.space`; any new code changes still need the normal GitHub-to-HF sync and deployment verification. - Scene rendering is deterministic browser-side Three.js from the validated analysis JSON. Do not reintroduce model-authored HTML scene injection. - Endpoint naming is `generate_scene` everywhere in active code. - Bonus claims after Modal deployment: Llama Champion confirmed, NVIDIA Nemotron Quest confirmed, Off-Brand confirmed, Modal Award confirmed. Do not claim Off the Grid unless the final deployment moves inference to ZeroGPU or another non-cloud-API path that satisfies that bonus. ## Project Structure - `prompts/` - archived build prompts and Codex task specs. - `docs/` - implementation notes, review passes, and representative fixtures. - `README.md` - quickstart, runtime decision, and repo map. - `SECURITY.md` - public deployment data handling rules for humans and agents. - `.env.example` - public Hugging Face Space / local demo variables. - `.hfignore` - excludes local credentials, caches, GGUF files, and artifacts from Hugging Face uploads. - `.github/workflows/sync_to_hf.yml` - GitHub Actions workflow that syncs GitHub `main` to an existing Hugging Face Space. - `requirements.txt` - Python dependencies for the Gradio Space and Modal scaffold. - `app.py` - Hugging Face Space entry point using `gradio.Server`; serves `index.html` at `/` and exposes `/analyze_image` plus `/generate_scene`. - `index.html` - self-contained HTML/CSS/JS shell loaded by `gradio.Server`; includes Three.js, upload UI, source-photo preview, pipeline orchestration, and deterministic Three.js rendering. - `modal_app.py` - Modal app scaffold with runtime asset caching, a llama.cpp GPU smoke-test function, a `runtime_probe` diagnostic endpoint, and placeholder plus experimental llama.cpp `analyze_image` / `generate_scene` web endpoints. - `scripts/verify_runtime_assets.py` - Hugging Face metadata preflight for the selected GGUF quant and `mmproj` file. - `snap2sim/__init__.py` - package marker. - `snap2sim/backend.py` - backend config, local placeholder inference, Modal HTTP client, and image base64 encoding. - `snap2sim/prompts.py` - prompt template for the vision analysis step. - `snap2sim/schema.py` - structured JSON schema plus a sample mechanism payload. ## What Has Been Done - Read `prompts/PROMPT.md` and implemented the requested initial scaffold. - Added a modular Gradio app with a two-pane technical cutaway / field manual visual direction. - Added loading/status language and a styled fallback visualization path so the viewport is not blank when Three.js generation is unavailable. - Added a backend abstraction controlled by `INFERENCE_BACKEND`. - Added placeholder Modal endpoints for the two required inference steps. - Added a Modal Volume-based runtime asset cache helper and runtime probe. - Added `smoke_test_llamacpp_image`, which builds llama.cpp with CUDA on Modal and runs one image prompt through `llama-mtmd-cli` using the selected GGUF and `mmproj-F16.gguf`. - Confirmed `smoke_test_llamacpp_image` returns `"ok": true`. - Confirmed `run_analysis_endpoint_check` returns a validated mechanism payload from the real llama.cpp analysis task. - Changed runtime asset resolution so endpoint calls use cached Modal Volume files directly; repeated `Fetching 3 files` logs were cached Hugging Face metadata checks, not full model downloads. - Added `run_runtime_preflight` local entrypoint to cache assets and run the GPU smoke test in one Modal command. - Added a local Hugging Face metadata preflight script and confirmed it passes for `UD-Q4_K_M` plus `mmproj-F16.gguf`. - Modal is authenticated under the `bigstonks1` workspace; use `$env:PYTHONIOENCODING='utf-8'; python -m modal ...` on Windows to avoid CLI Unicode/charmap errors. - Defined the vision-to-scene JSON schema for parts, geometry hints, and motion. - Added JSON-schema validation before scene generation. - Added deterministic Three.js scene generation for local and Modal placeholder mode, so validated payloads render as an animated 3D cutaway before model code-generation is wired in. - Added model response parsing helpers for JSON analysis payloads and complete HTML documents. - Added a local coercion fallback for verbose/partial model JSON so the analysis endpoint does not launch a second slow repair generation. - Added experimental `analyze_image_llamacpp` and scene-generation Modal GPU endpoints. They are not wired into the Gradio app by default; point `MODAL_ANALYZE_URL` / `MODAL_GENERATE_URL` at them only after the smoke test passes. - Fixed Modal packaging for local `snap2sim` imports by adding `add_local_python_source("snap2sim")` as the final image step for both Modal images. - Added `check_remote_imports`; `python -m modal run modal_app.py::check_remote_imports` now creates the `PythonPackage:snap2sim` mount and hydrates the web functions without `ModuleNotFoundError`. - Added prompt templates for image analysis and Three.js scene generation. - Deployed `modal_app.py` to Modal at `https://modal.com/apps/bigstonks1/main/deployed/snap2sim-inside-the-machine`. - Production endpoint checks passed for `runtime_probe`, `analyze_image_llamacpp`, and deterministic scene generation before the current endpoint rename. - Modal web endpoints are secured with `Authorization: Bearer SNAP2SIM_API_TOKEN`; the token lives in Modal secret `snap2sim-api-auth` and Hugging Face Space secret `SNAP2SIM_API_TOKEN`. - Verified unauthenticated Modal requests return `401 Unauthorized`. - Added `SECURITY.md`, `.env.example`, and `.hfignore` so public deployment config is explicit while credentials and runtime caches stay out of uploads. - Added Hugging Face Space metadata to `README.md`. - Hugging Face auth is now valid for user `jasondo111`. - Uploaded the Space to `jasondo111/Snap2Sim`; the Space is `RUNNING` on `cpu-basic` at `https://jasondo111-snap2sim.hf.space`. - The Space remains private as of the latest deployment. - User decision on June 13, 2026: keep the Hugging Face Space private for now. Do not make it public unless the user explicitly asks. - Removed accidentally uploaded Playwright artifacts/screenshots from the Space and expanded `.gitignore` so future `hf upload` runs skip them. - Verified the private Space with an authenticated `gradio_client` call using `handle_file`; the `/run_pipeline` API returned `CUTAWAY READY`. - Re-verified `/run_pipeline` after endpoint auth was added; it still returns `CUTAWAY READY`. - Added `.github/workflows/sync_to_hf.yml` for one-way GitHub to Hugging Face Space sync on pushes to `main`. The workflow targets `jasondo111/Snap2Sim` and requires GitHub secret `HF_TOKEN`. - User reported the GitHub Actions `HF_TOKEN` secret has been added. - PR #1 was merged to `main`. The first GitHub-to-HF sync run reached the final push step but failed with Hugging Face HTTP `429`; the workflow was updated to retry that final push with bounded backoff. - The next GitHub Actions sync run succeeded: `https://github.com/Bigstonks1/Snap2Sim/actions/runs/27487136019`. - Hugging Face Space `jasondo111/Snap2Sim` reports SHA `d70e374bea16acaa41c322942815d3cb213745f4`, matching GitHub `main`. - `prompts/PROMPT.md` was updated with a new critical path: `gradio.Server`, `index.html`, A-Frame model scene generation, `generate_scene` naming, and a deterministic Three.js fallback in browser JS. - Documented GitHub as the source of truth: `https://github.com/Bigstonks1/Snap2Sim`. Do not edit files directly on the Hugging Face Space; they will be overwritten by the sync workflow. - Added README acknowledgement: built by Jason Do with implementation assistance from OpenAI Codex. - Updated `README.md` with local run instructions, runtime preflight, Modal deployment path, and the current runtime decision. - Rewrote `app.py` as a `gradio.Server` app with `/`, `/analyze_image`, and `/generate_scene` routes. - Added `index.html` with upload orchestration, analysis readout, A-Frame scene injection, 3-second blank-scene fallback, play/pause, and deterministic browser-side Three.js fallback. - Renamed active backend and Modal scene generation paths to `generate_scene`. - Updated scene-generation prompts and parsing for `...` output. - Deleted the legacy Gradio Blocks UI, Python iframe Three.js generator, and SVG fallback modules. - Local verification passed with FastAPI `TestClient`: `/` returned the HTML shell, `/analyze_image` returned the placeholder analysis, and `/generate_scene` returned an `` block. - Deployed the renamed Modal app on June 14, 2026. Modal now exposes `generate_scene` and `generate_scene_llamacpp` web endpoints. - Updated Hugging Face Space variable `MODAL_GENERATE_URL` to the deployed `generate_scene` endpoint. `MODAL_ANALYZE_URL` remains pointed at the verified `analyze_image_llamacpp` endpoint. - PR #2 merged to `main`; GitHub Actions sync run `https://github.com/Bigstonks1/Snap2Sim/actions/runs/27492198915` completed successfully. - Hugging Face Space `jasondo111/Snap2Sim` reported SHA `9175771c1d3a2e39d7191b24e5729473fdaae0ef`, matching GitHub `main`, and remained private/running on `cpu-basic`. - Verified the private Space root with authenticated HTTP on June 14, 2026: status `200`, trusted `index.html` shell text present. - Verified the private Space endpoint chain with an authenticated image request on June 14, 2026: `/analyze_image` returned a validated mechanism payload through the secured Modal bearer-token flow, and `/generate_scene` returned an A-Frame `` block. - Implemented the `docs/reviews/security-hardening.md` security pass on June 14, 2026: Space-layer rate limiting for `/analyze_image` and `/generate_scene`, upload-size caps, PIL decompression-bomb handling, clean image decode errors, unique Modal temp image files with cleanup, and no model-authored scene HTML. - Consolidated rendering on deterministic browser-side Three.js from validated analysis JSON. Removed the A-Frame runtime import, unused Gradio client import, A-Frame scene builder, A-Frame scene prompt, and raw scene parser. - Updated the UI with source-photo preview, screen-reader live status, lighter muted text, client-side image validation, keyboard-accessible drop zone, a retry affordance, and a disabled initial Play state. - PR #3 merged to `main`; GitHub Actions sync run `https://github.com/Bigstonks1/Snap2Sim/actions/runs/27495583577` completed successfully. - Hugging Face Space `jasondo111/Snap2Sim` reported SHA `62cfa90093cc5d7de8d12dec831210d142c08a9d`, matching GitHub `main`, and the private root served the trusted Three.js shell. - Verified the private Space endpoint chain after the security pass: `/analyze_image` returned a validated mechanism payload through the secured Modal bearer-token flow, and `/generate_scene` returned `{ "renderer": "three", "analysis": ... }` with no HTML field. - Implemented the `docs/reviews/interaction-and-fallback-review.md` local code pass on June 14, 2026: fixed the label-overlay pointer-events bug that blocked OrbitControls, added bounded camera controls plus Reset view and orbit/zoom hint, changed the source-photo preview to a stable contained image box, added optional normalized per-part `annotation` fields, added `render_mode` scene descriptors, and added a browser-side annotated-photo fallback plus an honest unavailable state. - Updated model prompting/parsing for longer reasoning: prompts may allow reasoning before the final JSON, parser strips `` blocks and prefers the last complete JSON object, and llama.cpp analysis now uses larger token/context/timeout budgets (`4096` output tokens, `8192` context, `300s` timeout at the analysis call site). - Local verification after the `docs/reviews/interaction-and-fallback-review.md` pass: schema/parser checks passed, FastAPI `TestClient` confirmed `/`, `/analyze_image`, and `/generate_scene`, and browser verification confirmed left-drag orbit, right-drag pan, wheel zoom, mobile canvas event targeting, contained source preview, annotated-photo fallback, and unavailable retry state. - Modal reasoning-budget follow-up on June 14, 2026: an initial `run_analysis_endpoint_check` returned a generic fallback, so a local-only `run_analysis_raw_check` diagnostic was added. The raw diagnostic showed the model used schema-adjacent fields (`radius`, `height`, string axes). The prompt now explicitly requires `size` vectors and numeric axis vectors, and coercion preserves common radius/height/length/axis-string mistakes instead of accepting nested JSON fragments as generic fallbacks. After the fix, `run_analysis_raw_check` parsed strict JSON successfully in `35.12s`, and `run_analysis_endpoint_check` returned a parsed per-image `targeting reticle` payload at `0.7` confidence. - User decision after the `docs/reviews/interaction-and-fallback-review.md` pass: use the real Modal `analyze_image_llamacpp` analysis path for the demo. `INFERENCE_BACKEND` now defaults to `modal`; `INFERENCE_BACKEND=local` is an explicit UI-development sample mode only and should not be used for public submission. - Deployed the updated Modal app after the real-analysis decision on June 14, 2026. The stable deployment exposes `analyze_image_llamacpp` with the latest prompt/parsing/coercion fixes. A lightweight deployed `runtime_probe` request without credentials returned `401 Unauthorized`. Authenticated deployed web verification could not be run from the local shell because `SNAP2SIM_API_TOKEN` was not set locally; use the Hugging Face Space secret or a local secret store for the normal authenticated check. - Committed and pushed `51992f4` (`Use real Modal analysis path`) to GitHub `main`. GitHub Actions sync run `27509085142` completed successfully, and the private Hugging Face Space reported SHA `51992f4d9aff7f298fc377791228999e98054579`. - Authenticated private Space verification after the real-analysis sync: root returned `200`, a blank tan synthetic image returned the honest `unavailable` photo-render state, and the target-like synthetic image returned a real Modal analysis for `reticle assembly` at `0.7` confidence with 4 parts; `/generate_scene` returned `render_mode: three` and `renderer: three`. - Implemented the optional visual-polish pass after private deployment verification: component watermark populated from the analysis component name, subtle static noise overlay, stronger viewport vignette, and refined scan-line reveal. Local browser verification confirmed the scene still renders, orbit drag still works, the canvas remains the pointer target, the source preview remains contained, and the mobile layout has no horizontal overflow. - Implemented the `docs/features/confidence-threshold.md` confidence-threshold control on June 14, 2026: added a toolbar slider defaulting to `0.5`, made the browser recompute render mode from cached analysis plus the current slider value, and kept slider changes local with no extra `/analyze_image` or `/generate_scene` calls. Added `DEFAULT_CONFIDENCE_THRESHOLD = 0.5` for the server's advisory fallback. Local verification passed for schema/parser checks, FastAPI `TestClient`, slider downgrade/promote behavior, annotated-photo fallback, keyboard slider operation, mobile no-overflow layout, and canvas pointer targeting. - Committed and pushed `a0540e9` (`Add confidence threshold control`) to GitHub `main`. GitHub Actions sync run `27515143658` completed successfully, and the private Hugging Face Space reported SHA `a0540e92f19174f8b828374b201c1da94ef125a4`. - Authenticated private Space verification after the confidence-threshold sync: root returned `200` with the slider shell present, a synthetic target image returned real Modal analysis for `Target Reticle` at `0.7` confidence with 3 parts, and `/generate_scene` returned `renderer: three`, `render_mode: three`, and no HTML field. - Implemented the `docs/features/confidence-threshold.md` confidence-threshold re-spec on June 14, 2026: the slider is enabled before the first upload, sends `confidence_threshold` only with `/generate_scene`, no longer re-renders cached analysis on slider movement, and the server clamps/coerces the threshold before selecting `render_mode`. The browser now trusts the server's `render_mode` and only downgrades when geometry or annotation data is missing. - Implemented the `docs/features/annotated-photo-fallback.md` fallback pass: fixed portrait and landscape image containment by giving the annotation frame a definite viewport-bounded box, added numbered marker dots, leader lines, and optional annotation bounding boxes, and kept all annotation text rendered through `textContent`. - Implemented the `docs/features/renderer-vocabulary.md` renderer/prompt vocabulary pass: added deterministic `cone`, `capsule`, `torus`, and `spring` shapes; added `screw`, `orbit`, and `pulse` motions; raised the usable part cap to 6 across prompt, schema, coercion, and browser renderability; and updated the sample analysis to exercise all four new primitives. - Local verification after the `docs/features/annotated-photo-fallback.md` / `docs/features/renderer-vocabulary.md` pass: schema and coercion checks passed, FastAPI `TestClient` confirmed `/`, `/analyze_image`, and `/generate_scene`, browser verification confirmed contained portrait and landscape annotated-photo fallbacks with labels in bounds and no mobile horizontal overflow, and the deterministic Three.js path reached `CUTAWAY READY` with a nonblank six-part scene. - Committed and pushed `682623a` (`Expand renderer vocabulary and annotation fallback`) to GitHub `main`. GitHub Actions sync run `27518719440` completed successfully, and the private Hugging Face Space reported SHA `682623a979e351c3fb6d5b5b9ade907c7a979aea`. - Deployed the updated Modal app after the `docs/features/annotated-photo-fallback.md` / `docs/features/renderer-vocabulary.md` pass so `analyze_image_llamacpp` uses the richer prompt plus expanded schema and coercion. Authenticated private Space verification passed: root returned `200` with the updated vocabulary shell, a synthetic target image returned a real Modal analysis for `piston mechanism` at `0.85` confidence with 3 parts, `/generate_scene` returned `renderer: three`, `render_mode: three`, and no HTML field, and a high confidence threshold returned `render_mode: annotate`. - Implemented the `docs/features/vision-prompt-roles.md` prompt-role split on June 15, 2026: moved the invariant analysis contract into `VISION_SYSTEM_PROMPT`, reduced `build_vision_prompt()` to a backward-compatible per-image user-prompt alias, added `build_vision_messages()`, and wired Modal llama.cpp analysis calls to pass `-sys` with a fallback that prepends the system text only if the deployed binary rejects the system-prompt flag. - Verification after the `docs/features/vision-prompt-roles.md` pass: prompt-helper checks, schema/parser/coercion checks, FastAPI `TestClient` checks for `/`, `/analyze_image`, and `/generate_scene`, and a `modal_app.py` import/helper check all passed locally. Modal dev raw analysis parsed strict JSON in `28.59s` with `coerced_render_mode: three`, and the endpoint-style Modal diagnostic returned a validated two-part mechanism payload. Stable Modal deploy completed on June 15, 2026, and the stable unauthenticated `runtime_probe` request returned `401 Unauthorized`. - Committed and pushed `f24826e` (`Split vision prompt roles`) to GitHub `main`. GitHub Actions sync run `27530875972` completed successfully, and the private Hugging Face Space reported SHA `f24826e7a4f7335cb4310f88c01baef7d8155860`. - Authenticated private Space verification after the prompt-role sync: root returned `200`, the trusted shell was present, the synthetic target image returned a real Modal analysis for `cutaway mechanism` at `0.7` confidence with 3 parts, and `/generate_scene` returned `renderer: three`, `render_mode: three`, and no HTML field. - Implemented the `docs/reviews/scene-geometry-review.md` deterministic renderer pass on June 15, 2026: axial and disk-like primitives now infer their axis from `geometry.size`, radius comes from the cross-section pair, explicit `geometry.rotation` remains additive, the Three.js assembly recenters before reveal animation, camera/OrbitControls fit is derived from the bounding sphere and viewport aspect, the grid moves to the recentered assembly bottom, and label projection uses world positions. Prompt wording now tells the model that the renderer infers primitive orientation from the odd-one-out size dimension. - Local verification after the `docs/reviews/scene-geometry-review.md` pass: prompt/schema imports, schema validation, parser/coercion validation, FastAPI `TestClient` checks in `INFERENCE_BACKEND=local`, browser verification for `docs/fixtures/mini-fan-analysis.json` and `EXAMPLE_ANALYSIS`, desktop/mobile nonblank screenshots, mobile no-overflow measurement, orbit drag, and Reset view all passed. - Reworked `README.md` for Build Small judging on June 15, 2026: added judge-facing YAML tags for the Backyard AI track plus Llama Champion, NVIDIA Nemotron Quest, Modal Award, OpenAI Codex, Off-Brand, Best Demo, and Sharing is Caring; shifted the body from a maintainer runbook to a public pitch with concise idea, demo, tech stack, verification, and setup sections; kept private Modal endpoint URLs and credentials out of public docs. - Cleaned up repository notes on June 15, 2026: moved feature specs to `docs/features/`, review passes to `docs/reviews/`, and the mini-fan model output fixture to `docs/fixtures/mini-fan-analysis.json`; added `docs/README.md` as an index. - Implemented the `docs/reviews/motion-axis-bias.md` pass on June 15, 2026: de-anchored the vision prompt from `[0, 1, 0]`, added balanced X/Y/Z axis examples and a shaft exemplar, made missing browser-side motion axes derive from the same size-based primitive axis used for geometry orientation, and removed the hard-coded Y axis from the generic fallback rotor. - Verification after the motion-axis pass: schema/parser/coercion checks passed, FastAPI `TestClient` checks passed in `INFERENCE_BACKEND=local`, Playwright renderer probes confirmed missing-axis X, Y, and Z parts infer the expected axes with no horizontal overflow, Modal dev `run_analysis_endpoint_check` returned a rotating `dial` with `axis: [1, 0, 0]`, stable Modal deploy completed, and unauthenticated stable `runtime_probe` still returned `401 Unauthorized`. - Committed and pushed `5e65d06` (`Reduce motion axis bias`) to GitHub `main`. The first GitHub-to-HF sync failed because the new README `short_description` exceeded Hugging Face's 60-character metadata limit. Committed and pushed `e7369eb` (`Fix Space metadata length`), after which GitHub Actions sync run `27544185461` completed successfully. - Hugging Face Space `jasondo111/Snap2Sim` reported SHA `e7369eb7e22f8e25bbbac95a1531bacf242446cb`, remained private, and was running on `cpu-basic`. Authenticated private Space verification after the motion-axis sync: root returned `200` with the trusted shell present, the synthetic target image returned real Modal analysis for `rotating shaft assembly` at `0.65` confidence with an emitted motion axis of `[1.0, 0.0, 0.0]`, and `/generate_scene` returned `renderer: three`, `render_mode: three`, and no HTML field. - User made Hugging Face Space `jasondo111/Snap2Sim` public on June 15, 2026. Verification confirmed Hub metadata `private=false`, the public Space page returned `200`, and the public app host `https://jasondo111-snap2sim.hf.space` returned the trusted shell with the confidence slider present. The Space has not been transferred to `build-small-hackathon/Snap2Sim`; that target repo did not exist at the time of verification. - Public endpoint smoke verification on June 15, 2026 passed: `/generate_scene` returned `renderer: three` with no HTML field for `EXAMPLE_ANALYSIS`, and `/analyze_image` returned a real Modal analysis for a synthetic target-like image as `rotary indexer` at `0.6` confidence with 3 parts. - Committed and pushed `92853cc` (`Add hackathon presentation deck`) to GitHub `main`. GitHub Actions sync run `27576590128` completed successfully, and the public Hugging Face Space reported SHA `92853cc9acf19555524a7f65b189926e9088f4fb`. The synced Space includes `prompts/PRESENTATION_PROMPT.md`, `presentation/deck.html`, and `presentation/assets/.gitkeep`. - User transferred the public Space to `build-small-hackathon/Snap2Sim` on June 15, 2026. Verification confirmed the org-owned Space is public, running on `cpu-basic`, and serves `https://build-small-hackathon-snap2sim.hf.space`. The transferred Space kept SHA `f4134f7379db5abd0b6b58130da2d677c0fcb218` at verification time. - Org-owned Space endpoint smoke verification on June 15, 2026 passed: `/generate_scene` returned `renderer: three`, `render_mode: three`, and no HTML field for `EXAMPLE_ANALYSIS`; `/analyze_image` returned a real Modal analysis for a synthetic target-like image as `rotary indexing mechanism` at `0.85` confidence with 3 parts. - Final public submission links were added on June 15, 2026: YouTube demo `https://youtu.be/nuisDKMyyF8` and X post `https://x.com/Ryno67114241/status/2066660199558152411`. ## Final State / Maintenance Notes - The Hugging Face Space is now public under `build-small-hackathon/Snap2Sim`. Keep README, presentation links, and `.github/workflows/sync_to_hf.yml` pointed at that org-owned Space. - The public submission is complete with the app, README, presentation deck, YouTube demo, and X post linked from the repository. - Keep the README opening hook intact: "You find a small metal cylinder at a flea market. What is it? How does it work inside?" Maintain the judge-facing YAML tags and public pitch if future README updates are needed.