Version. 0.2
Date. 2026-07-19
Author. Claude.ai, on Operator direction.
Status. Scoping handoff. Orients a fresh chat for Stage 3 scoping. Supersedes v0.1 for orientation; v0.1 is preserved as the pre-close draft.
Reads with. The Stage 2 completion report (loomworks-record/completion-records/, c79dc08), the security incident record (loomworks-record/security/), loomworks-stage-2-build-brief-v0_2, loomworks-dunin7-perimeter-session-handoff-v0_4, CR-2026-152 (v0.26 in the record).
v0.1 was drafted while Stage 2 was still closing. Stage 2 is now closed and pushed. This version folds in: the entry condition being met, the authentication-bypass incident and its three follow-ons, the pending display-name rename, and an inbound second tool (FORAY Integration Example Generator) the Operator has named.
Stage 1 built the door. Stage 2 moved the sales generator inside — metered, capped, gated at representative standing, reachable from the surface the Operator lands on, proven live on a real passkey session. Stage 3 lets people in and improves what they find: provision identities for Aldous, Warwick, and test users; advance the generator content past the v0.23 freeze; land the consequences of representatives existing; and close the config-posture gap the Stage 2 incident exposed.
Stage 2 closed in the record: five gated routes on the job pattern, per-principal metering, runaway ceiling, tools affordance reachable from the arrival surface, live UI proof on a production-posture passkey session, completion report and security incident filed and pushed. All four repos in sync (engine 2a0cf71, OL fbc576e, record c79dc08, marketing 1735b6f). The fresh chat verifies this against loomworks-record before scoping — it is already true, so this is a confirmation, not a blocker.
strings.ts. Does not touch route paths, the tool key in metering rows (sales.analyze etc. — internal identifiers, renaming breaks parity with existing usage rows), or the gate. A one-line change plus a test; no Step-0 needed.FORAY Integration Example Generator. A second perimeter tool, parallel to the sales generator. Not yet built. When scoped, it inherits the whole Stage 2 pattern for free — the job transport, the representative gate, the metering, the ceiling, the tools menu, the sibling key resolver — because that pattern is now the road every such tool runs on. What it needs of its own: its content (prompts, validators, budgets) and its parity discipline (mechanical extraction, hash-pinning, differential testing) exactly as the sales tool got. Naming pattern is settled by the rename above: subject-prefix. Treat it as a content-and-parity effort on a proven substrate, not a new architecture.
Provision representative identities: Aldous (Miami/London), Warwick Halcrow (Sydney), and test users.
The open scoping question, and it is the big one: enrollment. Sign-in is passkey-based; identity is the system UUID; there is no email-based identity or recovery, by seed commitment. Today the only enrolled person is the Operator. Aldous and Warwick are remote. The fresh chat's first job is a Step-0 inspection: what enrollment paths exist in the engine and Stele v0.4.0 today (invitation flow? add_passkey ceremony reachability? anything from Phase 48's operator sign-in work?), and what the gap is between what exists and "a person in Sydney enrolls a passkey against app.dunin7.com without the Operator's hands on their device." The Stele Phase 7 material (CR-2026-116, the ~100-line add_passkey ceremony lift) is prior art to inspect, not assume.
Representative standing: today a declared list (system_config key dunin7_representative_person_ids). Stage 3 is the named point where this moves to a host_account column — representatives become administered, not declared. Scope the migration and the admin surface (who grants standing, through what UI, with what Operator approval step — Operator-authority applies to standing grants).
Person-tier keys: the sibling resolver's tier 2 means a representative with their own Anthropic key pays their own way; otherwise the system key pays. Default recommendation: system key for both Aldous and Warwick at Stage 3 start — cost attribution is what the metering is for, and asking a pilot prospect to bring an API key is friction with no upside. Operator confirms or overrides in the fresh chat.
cr-2026-152-sales-v0_25-wip (d8a718a, marketing repo) — the seventh landscape section, a new leave-behind budget, reversals of v0.21/v0.22 rules from the second real client run (2026-07-17). First content action: review whether that work is finished or mid-thought, finish it deliberately, and land it into the engine's sales_tools package — the marketing branch is history now; the engine is where content lives. Prompt changes re-run the parity discipline: hashes update, the design commentary updates with them, recorded as a content version, not a silent edit.
The Stage 2 authentication-bypass incident (production posture defeated by an explicit LOOMWORKS_ENV=development when public hostnames were pointed at a former dev box; live ~1 day; contained, swept clean with limits stated) left three queued items:
.env serves two postures; posture must not be a value someone remembers to change when a machine's role changes. The structural fix (config split, or a startup refusal to serve public origins in development posture) is guarantees-in-code applied to deployment posture — belongs in Stage 3's Step-0 inspection scope, because representative onboarding will multiply the cost of getting posture wrong.
From the completion report §14 and prior handoffs: b0dc30b classifier prompt (cherry-pick, test the three contrast cases plus the "Set the pH to 6.5" control, land-or-discard); secrets-hygiene sweep (.dev.vars key still live); session-scoped-list scoping (/engagements 200-empty vs 401); Node symlink maintenance (~/.local/bin/loomworks-node repoint after nvm upgrade); test_stele_router_mount (harness-only, test-correctness priority); VPS cutover (the standing fix for login-dependent availability — the job pattern and launchd services were built to inherit it, and it must recreate the machine state named below, not carry development forward); and the two branch merges (engine and OL stage-2-sales-relocation → main, clean fast-forwards when last checked, perishable).
Machine state a cutover must recreate (never carried forward from development): LOOMWORKS_ENV=production, LOOMWORKS_SESSION_MIN_ISSUED_AT (the incident epoch), and the three system_config seeds (sales_tools_ceiling_tokens=2000000, sales_tools_ceiling_window_hours=24, sales_tools_job_stale_minutes=15).
Two-role: Claude.ai scopes and writes; Claude Code executes, inspects against live code, halts before every push. Fresh chat per work type. Step-0 inspection before build briefs. Corrections preserved, not smoothed. Verification checks fail on missing input and anchor to controls that can disagree — now filed methodology with nine recorded instances across Stages 1–2, the canonical example being the Stage 1 perimeter check that verified the lock and never tried the other door, under which the bypass sat live for a day.
DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks — Stage 3 scoping handoff — v0_2 — 2026-07-19