Living reference — planning + field evidence

ScanCraft Suite

ScanCraft is the blank slate: one room contract, one capture pipeline, three surfaces. Every client-facing product is a framework built on top of it, scoped to that client's professional field — real-estate staging first, paint estimating second. This sheet set stays live: as fresh scans come in from each surface, the showcase below replaces its placeholders with the real thing.

SheetS-001, A-000 … A-008
Revisionliving — 06
Date2026-08-30
HandoffCoda CLI (build)
platform sheet describes ScanCraft itself framework sheet describes a client-facing product built on it
working parked / unverified planned / new paint-specific detail
S-001

Field Showcase

3 of 3 pending capture

Proof over description. Once fresh scans are taken, each tile below is replaced with the real capture — same room, three surfaces. Send the screenshots/renders in and this section is republished to the same link; no self-serve upload is wired into the page itself, since asset storage isn't available for this artifact yet. Web turned out to be a special case: it's already live (Sheet A-006), so its tile is pending a screenshot, not pending a build.

AWAITING CAPTURE
Mobile
capture-ios · RoomPlan scan
The scan itself, on-device. Real ~6MB bundles already exist as indirect proof this runs — this tile is the direct proof: an actual screenshot from an actual device.
indirect proof only so far
AWAITING CAPTURE
PC App
scenes/main.tscn · Godot 4.7
The same room staged — scan-mesh or parametric shell, furnished, day or evening.
awaiting capture
AWAITING CAPTURE it's already live — just not screenshotted here
Web
parallax-scans.pages.dev
Confirmed live: room scan + furniture placement in-browser, built for Michelle & Elisa. Self-described as raw — unfinished walls, starter furniture set. Link to the ScanCraft pipeline unconfirmed (RFI 03).
live — early / raw
PlatformA-000

Platform & Frameworks

the recontextualization

ScanCraft itself stays generic on purpose — it doesn't know what a "room" is for. Everything a specific client needs is a framework layered on top, scoped to their professional field. Real-estate staging was the first framework built; paint estimating is the second. Nothing about the platform changes to add a third.

REAL ESTATE STAGING framework — built, sheet A-004 adds: furniture catalog · dollhouse evening lighting · (parked) wall paint client: real-estate agents / stagers PAINT ESTIMATE framework — planned, sheet A-005 adds: paintable_area() · dummy $/sqft cost calc · per-wall quote UI client: your neighbor, painter SCANCRAFT — blank slate RoomModel contract · capture pipeline · refinery · base viewer / trace built on built on
Fig. A-000 — Two frameworks today, same core underneath. A third client vertical is a third box on this line, not a change to the box underneath it — that's the test for whether something belongs in the platform or in a framework.
PlatformA-001

System Overview

RFI 01 · 03 · 08

Three surfaces share one data contract — the RoomModel (walls + openings, meters). Today the PC app is the only one confirmed to read it end to end; mobile capture exists but is unrun on real hardware; the web surface turned out to already exist as a live prototype (Sheet A-006) — just not yet confirmed to speak the same contract.

MOBILE RoomPlan capture (capture-ios, iOS 17+/LiDAR) RUNTIME UNVERIFIED PC APP staging · floorplan · dollhouse wall trace · refinery pipeline + paint-cost estimate (new) "everything" WEB parallaxfuture.io (gated hub) + parallax-scans.pages.dev live — early / raw prototype MLS? listing sync — assumed SCAN INBOX /api/scan/* — token unminted on parallaxfuture.io, gate-exempt room.json + room.usdz + sensors.zip (~6MB) export (unconfirmed link — RFI 3)
Fig. A-001 — Mobile hands the PC app a room bundle over AirDrop/Files. Web is now two confirmed Cloudflare Pages projects (Sheet A-006) rather than an unbuilt guess — but whether either one reads the same RoomModel/export pipeline as the PC app, or was hand-built separately, is still unconfirmed (dashed). MLS sync stays an open assumption.
PlatformA-002

Mobile — Capture

README claim likely stale

capture-ios/ — a Swift RoomPlan app, written without a Mac and compiled only via .github/workflows/ios-capture.yml on GitHub's macOS runners (unsigned .ipa artifact). Its own README still says "RUNTIME UNVERIFIED — never run on a physical device." That's contradicted by evidence on this pass: real sensors.zip bundles from real scanned rooms exist (~6MB each) — a bundle that specific can only come from this app actually completing a RoomPlan/ARSession capture on real LiDAR hardware. The README needs its honest-status section updated; thermal/memory behavior and confidence-map accuracy at scale are still genuinely unproven.

Export contract

One scan produces three files, dropped into the desktop app's import folder in one share-sheet send:

  • room.json — parametric walls/doors/windows (the RoomModel contract)
  • room.usdz — the visual mesh backdrop, registered on the desktop side
  • sensors.zip — RGB + depth + pose bundle for photoreal reconstruction. Real scans have run ~6MB, comfortably under any relevant size limit, so bundles are now included going forward rather than treated as a maybe-too-big afterthought.

Sideload path

PathStatusNote
AltStoredocumentedFree Apple ID, auto-refreshes over shared Wi-Fi every 7 days. Confirmed in capture-ios/README.md.
Sideloadly + batch fileplannedBatch file on the Windows desktop pulls the latest Actions IPA and hands it to Sideloadly for install. Sideloadly's scriptability isn't confirmed — normally a GUI tool. Verify before building; AltStore is the fallback that's known to work headlessly.
Cannot build from here — this session has no connector or access to your local Windows desktop (checked: no Desktop Commander / filesystem connector attached). The batch file has to be written and placed by you or by Coda CLI running locally.
FrameworkA-003

Real Estate Staging

mostly working

The first framework built on ScanCraft, and the one client vertical currently shipping. Godot 4.7, scenes/main.tscn / scripts/app.gd. Everything below reads the platform's RoomModel — nothing here reads geometry from the scan mesh directly, so none of it is actually staging-specific at the data layer, only at the UI layer.

Modes

  • 1 / 2scan layer ↔ parametric shell layerworking
  • 3dollhouse (roofless) viewworking
  • F2D floorplan overlayworking
  • Tday / evening lighting + lamp toggleworking
  • 4–9furniture: arm, place, drag, rotate, delete — 163-piece true-scale catalogworking
  • Cwall trace — parametric capture without Polycamworking
  • wall paint (visual repaint of a clicked wall)parked — flat, unlit

Paint cost estimating is a separate framework (A-005), not a mode of this one — it needs none of the above, only the platform underneath it.

PlatformA-004

Data Pipeline

real bundles now on hand

Every capture forks into two lanes that never touch until they land in the same app. The parametric lane is what paint, floorplan, and furniture actually read; the photoreal lane is backdrop only.

ROOMPLAN SCAN room.json RoomModel walls + openings PC APP shell · floorplan · furniture · trace · estimate sensors.zip ~6MB / scan Room Refinery Open3D TSDF, offline PC-side validated on synthetic bundle only textured .glb not yet imported to Godot scan-mesh layer
Fig. A-004 — Parametric lane (top) drives everything a room "does"; photoreal lane (bottom) only ever supplies a backdrop. The Refinery has proven the math on a synthetic dataset — real ~6MB bundles are the next thing to run through it end to end, followed by an actual Godot import of its GLB output.
FrameworkA-005

Paint Estimate

planned

The second framework on ScanCraft, for a different client field entirely — a painter, not a real-estate agent. It shares nothing with the Staging framework except the platform underneath: same RoomModel, same three import paths (capture / trace / DXF), none of the furniture/dollhouse/lighting layer. Its only job is turning a scanned room into a number.

RoomModel walls + openings Wall.paintable_area() new — length×height − openings reuses WallBuilder's own hole rects dummy cost area × flat $/sqft placeholder — v1 only UI per-wall + total
Fig. A-005 — The estimate reads geometry no differently than the (parked) visual paint feature does; only the last step changes, from "recolor a quad" to "multiply by a placeholder rate." Swapping the dummy formula for coverage/coats/real pricing later touches only the middle box.
PlatformA-006

Web Infrastructure

1 secret un-minted

Cloudflare Pages, one account, three projects — confirmed on record, checked live this pass. Only parallax-scans.pages.dev is directly ScanCraft's; parallaxfuture.io hosts its inbox lane; the third is unrelated.

Projects

ProjectDomainRole
parallaxfutureparallaxfuture.io + www
alias: parallaxfuture.pages.dev
Whole-site passphrase gate (_worker.js). Confirmed 401 live this pass. Hosts the /api/scan/* ingest lane for ScanCraft, exempted from the gate — see below.
parallax-scansparallax-scans.pages.devAlready live — checked this pass. A working "Stagecraft — prototype" demo: scan a room, place furniture, in-browser. Built for two named users, Michelle & Elisa. Self-labeled raw: unfinished walls, starter furniture. This is real evidence for Sheet A-003's staging framework, on a surface nobody had confirmed existed.
bulmer-consignmentbulmer-consignment.pages.devThomaston auction gallery — unrelated business, noted for completeness only.

Deploy (parallaxfuture)

Repo: A:\Parallax\parallaxfuture-site\

node drift-check.mjs && node build-dist.mjs
npx wrangler pages deploy _dist --project-name=parallaxfuture --branch=master --commit-dirty=true

Never — deploy the repo root; deploy _dist only. A 200 isn't proof — open the page and look.

Scan inbox lane

/api/scan/* on parallaxfuture.io is gate-exempt (alongside eBay/Flip machinery routes) — reserved for ScanCraft. Its access token, SCAN_INBOX_TOKEN, has never been created. Until it is, the lane has no way to authenticate a real upload:

npx wrangler pages secret put SCAN_INBOX_TOKEN --project-name=parallaxfuture

Secret handling — the site's whole-gate passphrase (SITE_GATE_PASS) was shared in conversation while assembling this sheet. It is deliberately not reproduced here — a live credential doesn't belong in a document that might later be shared. Rotate it via wrangler pages secret put SITE_GATE_PASS --project-name=parallaxfuture if this plan or the conversation it came from is ever shared onward.
PlatformA-007

Skills & Agent Tooling

4 drafted, sent as files

Resident-expert briefs for whichever agent (Coda CLI included) picks up work on a given surface — same idea as this sheet set, but scoped to sit next to the code as .claude/skills/<name>/SKILL.md rather than live as a standalone page. Drafted from what's actually been read this session, not guessed. Sent as .skill files rather than committed — this session has read-only access to parallax-stagecraft, no push.

Drafted

SkillCoversGrounded in
scancraftMeta/resident brief — platform vs. framework, the RoomModel contract, where each surface's detail skill lives, pointer to this sheet set as the living source of truth.Full repo read, Sheets A-000/A-001
scancraft-godotPC app — layout, mode table, why paint is parked and what not to do about it, the verification pattern (shot_app.gd-style driver scripts), which demo scenes are stale.scripts/app.gd, room_model.gd, wall_builder.gd, PAINT-PARKED.md
scancraft-capture-iosThe no-Mac build constraint, the export + sensor-bundle contracts, sideload paths, the stale-README flag (RFI 09).capture-ios/README.md, the CI workflow
scancraft-refineryPython/Open3D environment quirks, the pose-conversion math, why trimesh over Open3D's own GLB writer, what's proven vs. still synthetic-only.tools/refinery/README.md

Not drafted — Web / frontend

Deliberately skipped rather than guessed. parallaxfuture-site and scan-showcase live at local paths (A:\Parallax\...) not attached to or confirmed present on GitHub in this session — no code has actually been read, only the deployed output (Sheet A-006). Writing a "frontend" skill without reading the frontend would be exactly the kind of fabrication these skills are meant to prevent.

To install — drop each .skill file's SKILL.md into .claude/skills/<name>/SKILL.md in the parallax-stagecraft repo (or wherever Coda CLI's skills directory is configured). They validated clean against skill-creator's checker but were not run through its full eval loop — reasonable for resident-brief documentation skills, less so if any of them grow real generative behavior later.
PlatformA-008

Agent Groups & Parallel Work

1 open item

Two tracks that share almost no files, so they run in parallel by default: Meta/Marketing, and App Coding split three ways by surface. The one thing that crosses tracks is the RoomModel/export contract — whoever touches it posts to the Hub before changing it, since Web, iPhone, and PC all read it.

META / MARKETING parallaxfuture.io — mockups · brand testing mission statement, maintained here Ichi (Gemini) · Shep (ChatGPT) · ComfyUI + sourced SVG device assets, see below APP CODING WEB parallax-scans + /api/scan IPHONE capture-ios/ Swift/RoomPlan PC app.gd + refinery/ shared: RoomModel / export contract — coordinate before changing HUB coda-coop-space.json — shared agent door status status
Fig. A-008 — Meta/Marketing and App Coding run in parallel by default since they share almost no files. App Coding's three groups (Web/iPhone/PC) run in parallel too, except for the one contract all three read.

Group M — Meta / Marketing

Mockups, brand testing, the mission statement — lives on parallaxfuture.io (the gated hub), separate from parallax-scans.pages.dev, which is Group W's product surface, not Group M's marketing surface. Don't conflate the two when routing work.

  • Ichi = Gemini, Shep = ChatGPT — used alongside ComfyUI for branding and graphics generation.
  • SVG device assets, for phone-render marketing images: SVG Repo, Vecteezy — raw vector device frames.
  • Screenshot-to-device-frame generators, once there's a real app screenshot to frame: Screenhance, MockupShot — both browser-based, nothing uploaded.

Group App — three parallel surfaces

GroupScopeSkill
W — Webparallax-scans.pages.dev + the /api/scan/* ingest lane on parallaxfuture.io (Sheet A-006)none yet — repo not attached (Sheet A-007)
I — iPhonecapture-ios/, Swift/RoomPlan (Sheet A-002)scancraft-capture-ios
P — PCscripts/app.gd and the Godot app (Sheet A-003), plus the Python Refinery pipeline (Sheet A-004) as PC-side tooling feeding itscancraft-godot, scancraft-refinery

Coordination

The Hub (coda-coop-space.json) is already the shared agent door for cross-agent handoffs, per the parallax-app skill — both tracks post status and shipped-work notes there rather than only in this sheet. This sheet stays the human-readable architecture record and RFI log; the Hub is the machine-speed coordination layer underneath it.

RFI

Open Items

10 open
#ItemAssumption made here
01"milds" functionality on mobileRead as MLS listing sync. Diagrammed dashed on Sheet A-001 pending confirmation.
02Sideloadly automationAssumed scriptable for the desktop batch file; unconfirmed. AltStore is the proven fallback (Sheet A-002).
03Web viewer scopePartly resolved. Web is real: parallaxfuture.io (gated) + a confirmed-live prototype at parallax-scans.pages.dev (Sheet A-006). Still open: does that prototype read the same RoomModel/export pipeline as the PC app, or is it a separate hand-built implementation? And is it the long-term Web framework, or a precursor folded into parallaxfuture.io later?
04Paint cost formulav1 is a flat $/sqft placeholder (Sheet A-005) to see the UI shape. Coverage rate, coat count, price source, and per-wall vs. per-room rounding are all still open from the earlier planning pass.
05Estimate labor costOut of scope for v1 — materials-only placeholder, no labor field yet.
06Product renamed to ScanCraftApplied on this sheet set only. The name still lives in real code/config the app runs on — project.godot's config/name, the in-app HUD string ("STAGECRAFT · 58 Western Ave" in app.gd), the export source tags (stagecraft-capture-ios, stagecraft-trace), capture-ios/README.md, and the parallax-stagecraft GitHub repo name itself. Renaming those is a real change for Coda CLI to make, not done here.
07Framework packagingPlatform/framework is a conceptual split (Sheet A-000) introduced this pass — not yet a code or repo split. Open: does each framework (Staging, Paint Estimate, future clients) ship as its own Godot export with the platform as a shared module, or do they stay modes toggled inside one app like today's app.gd? The former scales to more clients without one app accreting every vertical's UI; the latter is far less restructuring right now. Recommend Coda CLI decide this before building A-005, since it changes where estimate.gd lives.
08SCAN_INBOX_TOKEN un-mintedThe /api/scan/* lane on parallaxfuture.io is carved out and gate-exempt but has no access token yet (Sheet A-006) — it can't authenticate a real upload until one is created. On you: npx wrangler pages secret put SCAN_INBOX_TOKEN --project-name=parallaxfuture. Not something this session can run — no Cloudflare/wrangler access from here.
09capture-ios/README.md stale status claimSays "RUNTIME UNVERIFIED — never run on a device"; real ~6MB scan bundles say otherwise (Sheet A-002). Small fix, not yet made — flagged in the new scancraft-capture-ios skill (Sheet A-007) so whoever picks this up checks before repeating the stale claim.
10Where branding output landsIchi/Shep/ComfyUI graphics and sourced SVGs (Sheet A-008) don't have a defined handoff point yet — same Hub as code status notes, a separate asset folder, or something else? Affects whether Group M's output is discoverable by the other groups or just sits wherever it was generated.