DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path phases/phase-57-marketing-engagement-creation/loomworks-phase-57-cr-amendment-2-scoping-note-v0_1.md

Loomworks Phase 57 CR amendment-cycle-2 scoping note

Version. 0.1 Date. 2026-05-12 Status. Active scoping for the Phase 57 CR second amendment cycle. Drafted by Claude.ai. Operator: Marvin Percival. Phase 57 build paused at Step 2b entry per phase-57-halt-surface-2026-05-12-step-2b-v0_1.md; amendment-scope absorbs the runtime route-to-substrate binding gap on /operator/create-engagement and unblocks Step 2b. Second amendment cycle on Phase 57; cycle 1 (Sub-arc 4, OL signin alignment) is correct and stays. Phase. 57 — Marketing Engagement Creation (amendment cycle 2). CR target. CR-2026-090 v0.3 (phase-57-cr-marketing-engagement-creation-v0_3.md), superseding v0.2. v0.1 + v0.2 both preserved alongside as superseded. Companion documents.


What this amendment settles, in one paragraph

Phase 57 Step 2b (live usage event) cannot succeed against the v0.2 CR because the /operator/create-engagement route does not engage the Phase 55/56 scaffolded conversation flow at runtime, despite (a) Phase 55 + 56 + 57 substrate being correct and verified, (b) the OL route rendering correctly with the right mode="create-engagement" prop driving the banner, (c) Sub-arc 4 (cycle-1) having cleanly resolved the signin email-gate, and (d) all CRV-1 through CRV-8 + CRV-A1 through CRV-A8 returning HOLDS. The Companion responds in general-purpose chat tone to messages submitted from this route — the diagnostic exchange ("Tell me what the capital of NZ is""Wellington") confirms intent classification is landing on general_conversation rather than create_engagement_entry/_active/_commit. The route-to-substrate runtime binding is broken at a layer Step 0 and the cycle-1 CRV-As structurally could not probe — runtime engagement of the substrate from the specific route the CR assumes engages it. The amendment adds one new Sub-arc (Sub-arc 5: route-to-substrate runtime binding) and one new build step (Step 2c, inserted between Step 2a and Step 2b) that runs CC's six halt-surface §4 diagnostics first, files a diagnostic findings note that identifies the root layer (OL submission path / engine classification context / shared) and the specific change site, then executes the fix. The scoping note does NOT pre-decide the fix shape — the substrate is correct, so the fix is a runtime-binding question whose answer the diagnostics produce. The cycle-1 scoping pattern (settle architectural decisions; defer file:line specificity to CRV-A at execution time) extends here to: settle the investigation envelope and architectural posture; defer fix layer + file:line specificity to CRV-B + the diagnostic findings document at execution time. The second of Phase 57's two reserved buffer slots is consumed; both slots are now consumed. Phase 57's product and methodology deliverables (marketing engagement live, real-Operator transcript, observation capture) are preserved unchanged. Engine substrate Step 1 (Field 6 prompt) and OL Sub-arc 4 (signin alignment) are correct and untouched. Methodology candidates D + E from the cycle-2 halt-surface carry forward; Candidate C reaches three-instance evidence and clears v0.21 promotion threshold; one new scoping-stage candidate (F: diagnosis-as-architecture-when-runtime-binding-fails) is named here for the first time.


How we got here — trajectory worth preserving

This is the third build-mode firing of the substrate-friction-discipline-pattern (manifest v0.39 §2; manifest v0.41 §1 reframed as structural rather than coincidental). The instances now span: Phase 49 Step 4 → Phase 49 Step 4 amendment scoping → CR v0.3 → Step 4b (the canonical instance); Phase 57 amendment cycle 1 (Sub-arc 4 OL signin alignment); Phase 57 amendment cycle 2 (this — Sub-arc 5 route-to-substrate binding). Three-instance evidence within an eight-phase window (Phases 49 / 50–56 unconsumed / 57 cycle 1 / 57 cycle 2). The reserved-slot pre-commitment design is firing exactly as intended — slots exist precisely to absorb mid-build amendment without derailing the phase, and Phase 57 now exercises both of its slots to design specification.

The cycle-2 trajectory is worth preserving in full for v0.42 manifest absorption and for v0.21 methodology consolidation. Positions 1–4 are reproduced from the cycle-1 scoping note (and cycle-1 v0.2 CR §4) and extended.

Position 1 — Phase 57 scoping v0.1 → v0.2 → CR-2026-090 v0_1. Phase 57 anticipated zero OL substrate changes. The CR explicitly named this at §16 (test count predictions: OL vitest 149 unchanged) and §6 (What Phase 57 does NOT deliver). Step 0 (V1–V8) verified engine-side substrate exhaustively; OL-side substrate was not Step 0's aperture because the scoping note did not anticipate OL substrate work.

Position 2 — Step 2 entry, pre-cycle-1-halt. Local stack readiness friction surfaced (CORS preflight 405). Resolved with LOOMWORKS_ENV=development added to local .env. CR §12 gate 5 appeared met at the infrastructure layer but had not been validated at the architectural layer.

Position 3 — Cycle-1 halt-surface diagnostic. Three findings against the live engine + OL source. Finding 1: engine identity model is WebAuthn passkey; email optional. Finding 2: OL signin form's client-side gate at IdentifierStep.tsx:31 contradicts engine contract. Finding 3: the drift was not surfaced at Phase 41/48/50 close because the standing DUNIN7 principle (email is not identity) was not named in any source-of-truth document. Fix scope: one-line OL change.

Position 4 — Cycle-1 amendment scoping. Sub-arc 4 (OL surface alignment with engine identity contract) added; Step 2a inserted before paused Step 2 (renamed Step 2b). One vitest. Surface text updated. Engine untouched. Audit of sibling OL identity-adjacent surfaces queued as Phase 58+ candidate. Methodology candidates A (engine-correct-surface-drifted) + B (standing-principle-not-named-in-source-of-truth-documents-allows-contradicting-surface-to-ship) + C (substrate-friction-discipline-pattern-second-build-mode-firing, two-instance evidence) named.

Position 5 — Cycle-1 amendment execution. CR v0.2 produced. CC archived v0.2; ran CRV-A1 through CRV-A8 (all HELD); implemented Sub-arc 4 components 4a/4b/4c/4d at the verified file locations; OL vitest 149 → 150; Sub-arc 4 commit at OL e435b30. Checkpoint A extended; Operator confirmed Sub-arc 4 fix. Step 2b began. Signin worked clean.

Position 6 — Cycle-2 halt-surface diagnostic (this halt). Surface evidence on the live /operator/create-engagement route post-Sub-arc-4-signin: surface loads with the correct banner ("Setting up a new project" — Phase 56 Sub-arc 3a revision, plain-terms-discipline reading cleanly on the live surface; first real-Operator confirmation of the banner copy). Diagnostic exchange returns general-purpose Companion behavior, not creation-flow scaffolding. Three prior unrelated chat pairs visible in scrollback (state-leakage flag). The friction is upstream of Field 6 — the entire scaffolded conversation flow does not engage from this route. Sub-arc 1 (Field 6 prompt) is correct + loaded; Sub-arc 4 is correct + landed; CRV-1 through CRV-A8 all HELD. The break is at the runtime binding layer between the OL surface's converse submission and the engine's classifier/dispatcher path — a layer Step 0 and CRV-A structurally could not probe (Step 0 V8 confirmed the route renders; CRV-A verified OL signin contract alignment; neither asks "does a message submitted from this specific surface drive the substrate the surface was scoped to drive?"). CC named <ChatView mode="create-engagement">'s converse-submission mode-discriminator propagation as the most likely root cause but explicitly did NOT pre-decide; enumerated six diagnostics for the cycle-2 scoping chat.

Position 7 (this amendment). Narrow runtime-binding fix scoped to the /operator/create-engagement route's submission path. Sub-arc 5 added; one new build step (Step 2c) inserted between Step 2a (cycle-1 Sub-arc 4 signin alignment) and Step 2b (live usage event) for the diagnostic-first runtime-binding fix. The fix shape (OL only / engine only / both) is determined at CRV-B time, not pre-decided here. At least one new test pins the corrected wire path. Scope explicitly does NOT include broader Phase 41/48/50/55 route-binding audit (queued as Phase 58+ candidate alongside the cycle-1 OL surface-vs-contract audit).

The seven positions are preserved. Position 1 (no OL changes anticipated) is not erased by Position 7 (a second OL change and possibly an engine change required). Position 4 (Sub-arc 4 alone resolves OL surface alignment) is not erased by Position 7 (runtime route-to-substrate binding is a separate broken layer; Sub-arc 4 was scoped to fix signin and could not have caught this). The progression Position 1 → 4 → 7 traces the substrate-friction-discipline-pattern firing twice in a single phase — exactly the case manifest v0.39 §2's reserved-slot pre-commitment was designed for.

Discovery-record observation: substrate-presence is not substrate-engagement. Step 0 verifies that substrate EXISTS in the right places with the right signatures; it does not verify that the runtime path from a specific route through to the intended substrate fires. Cycle-1 added "OL surface contract alignment" as a verification surface. Cycle-2 adds "route-to-substrate runtime binding" as a verification surface. Both are layers Step 0 structurally could not probe — Step 0's aperture is presence + structure + readiness, not engagement. The pattern crystallizes as Candidate D in the cycle-2 halt-surface (per-route-companion-routing-not-asserted-at-step-0); this is the cycle-2 scoping note's name for the pattern in trajectory framing.


Scope confirmation — per cycle-2 halt-surface §5 settled list

The cycle-2 halt-surface note §5 names three items as settled and stays-unchanged:

  1. CR v0.1 archive (engine 09907d6), Step 1 substrate (engine a00f4a3), cycle-1 halt-surface (engine 39e4f00), CR v0.2 archive (engine 7a6220c), Sub-arc 4 OL substrate (OL e435b30). All stay. Phase 57 Sub-arcs 1 + 4 substrate is correct.
  2. No engine substrate work in the halt-surface chat. No OL substrate work either. The route-to-substrate binding diagnosis runs in a fresh Claude.ai chat (this one for scoping; the next for CR drafting; then back to CC for execution).
  3. Local stack stays running. Engine on :8000; OL on :3001. Operator's election whether to leave running or shut down.

The cycle-2 scoping note confirms all three. The amendment scope is strictly the runtime route-to-substrate binding for /operator/create-engagement. Sibling OL routes (/chat, /operator/ other than create-engagement, /onboarding, etc.) are deliberately out of amendment scope. The broader question — are there other routes whose mode props don't propagate to converse-submission?* — queues as a Phase 58+ candidate (OL route-to-substrate runtime-binding audit) alongside the cycle-1 surface-vs-contract audit. The two queued audits may consolidate into one Phase 58+ phase or split into two; that decision belongs to Phase 58 scoping.


What's settled — ten P57-Bx items

All decisions closed at scoping. The CR drafter consumes them; does not relitigate. The architectural shift from cycle 1: the fix shape is not pre-decided in scoping — the diagnostics produce the fix shape at CRV-B execution time. The architectural decisions settled here are the investigation envelope + execution posture + acceptance criteria, not the implementation surface.

| Item | Setting | |------|---------| | P57-B1 | Sub-arc 5 framing — route-to-substrate runtime binding for /operator/create-engagement. Scope absorbs whatever the cycle-2 halt-surface §4 diagnostics surface as the root layer: OL converse-submission path (most likely per halt-surface §4.5 — <ChatView mode> prop drives banner but may not drive submission discriminator); engine classifier/dispatcher context-scoping (if §4.3 surfaces state leakage from conversation_turns not being scoped to creation mode); engine intent threshold/labeling (if §4.2 surfaces classifier returning general_conversation at high confidence). Rejected alternative: pre-decide "OL passes intent_hint=create_engagement_entry" before diagnostics confirm (would risk fixing the wrong layer; halt-surface §4 explicitly enumerates six diagnostics for cycle-2 scoping to resolve, not one fix to pre-specify). Rejected alternative: scope expansion to audit all OL→engine route bindings (broader than necessary; Phase 58+ candidate). | | P57-B2 | Diagnostic-first execution posture for Step 2c. CC runs CRV-B1 through CRV-B6 (per cycle-2 halt-surface §4) as Step 2c's first activity, before any production code change. The CRV-B findings produce a brief diagnostic-findings document committed to docs/phase-impl-notes/phase-57-step-2c-diagnostic-findings-v0_1.md on the engine repo's phase-57-marketing-engagement-creation branch. Content: per-CRV verdict; root-layer identification (OL/engine/shared); specific file:line change sites; test surface specification. Only after the diagnostic findings note lands does CC execute the production fix. This codifies a new methodology candidate (F): diagnosis-as-architecture-when-runtime-binding-fails — when substrate is correct but runtime engagement fails, scoping cannot pre-specify the fix; the diagnostic IS the architectural work for the cycle. Rejected alternative: implement fix as guess at most-likely root cause (<ChatView mode> prop propagation) and hope CRV-B confirms (violates halt-and-surface-preferred-over-draft-and-hope discipline; substrate-friction-discipline-pattern explicitly preserves Operator architectural authority via the scoping cycle). | | P57-B3 | Scrollback isolation in creation mode is in scope. Cycle-2 halt-surface §2.1 names three prior unrelated chat pairs visible in /operator/create-engagement scrollback at session start — a state-leakage flag indicating either (a) the route shares conversation_turns history with /chat, or (b) the OL surface fetches from a generic chat thread on mount. The fix MUST present a creation-mode-scoped (or empty) scrollback on this route. Whether the fix is OL-side (don't fetch the generic thread on this route) or engine-side (scope conversation_turns query by intent label / by route) is determined at CRV-B3 time. Rejected alternative: treat scrollback leakage as cosmetic and defer (the visible scrollback may itself be confusing the runtime binding — if the engine sees ten prior general_conversation-labeled turns in context, the classifier is more likely to continue classifying as general_conversation; the scrollback issue and the binding issue may be the same issue). | | P57-B4 | Test surface floor: at least one e2e/integration test pins the wire path. Cycle-2 halt-surface §4.6 names the gap: no existing test exercises OL surface → engine classifier → creation-flow handlers end-to-end. The cycle-2 fix closes this gap. Floor: one test pins the corrected route-to-substrate binding so future drift fails CI before reaching live usage. Whether the test lives in OL vitest (with mocked engine), engine pytest (with the OL request shape simulated), or a new e2e harness depends on CRV-B6 findings. Rejected alternative: zero new tests (regression-prone — the gap that allowed the cycle-2 halt would re-allow it). Rejected alternative: full Phase 55 e2e suite (out of scope; the floor is one test that pins this specific route-to-substrate binding). | | P57-B5 | CR version phase-57-cr-marketing-engagement-creation-v0_3.md. v0.1, v0.2, and v0.3 all preserved alongside; all three archived at engine repo docs/phase-crs/. v0.3 is active; v0.2 marked superseded; v0.1 already marked superseded. Multi-version archival precedent: Phase 49 has v0.1, v0.2, v0.3 archived under the same convention. | | P57-B6 | New Sub-arc 5: route-to-substrate runtime binding for /operator/create-engagement. Separate sub-arc keeps the runtime-binding problem class visible alongside engine substrate (Sub-arc 1), the original engine + OL substrate Sub-arcs 2/3, and the cycle-1 OL surface alignment (Sub-arc 4). Rejected alternative: extend Sub-arc 4 to absorb (Sub-arc 4 is signin-alignment-specific; the runtime-binding problem class is structurally different — they happen to both surface as OL-side findings but address different layers). Rejected alternative: split Sub-arc 5 into two sub-arcs (OL submission + engine classification) before CRV-B confirms the layer (would pre-decide what CRV-B is meant to find). | | P57-B7 | Test count update — deferred to CRV-B findings, with a documented floor and ceiling. Floor: +1 net test (per P57-B4). Ceiling: +1 OL vitest AND +1 engine vitest if CRV-B6 surfaces shared-fix shape. Alembic 0064 unchanged across all candidate fix shapes (no migration consumed). The CR §16 v0.3 test count table reads: OL vitest 150 → 151 (most likely; OL-side fix) OR 150 (if pure-engine fix); engine always-run 2,280 → 2,281 (if engine-side or shared fix) OR 2,280 (if pure-OL fix); calibration-gated 32 unchanged across candidates. The acceptance gate accepts the +1 net floor; the implementation notes record the as-shipped counts at Phase 57 close. | | P57-B8 | Three CR §12 gate updates. Gate 5 amended further to include Sub-arc 5 readiness. New Gate 5c: route-to-substrate runtime binding verified — submitting a message from /operator/create-engagement engages create_engagement_entry (or _active on follow-on turns) per classifier log; per-field loader splices the correct creation-flow prompt component; Companion response shape is consistent with creation-flow scaffolding, not general_conversation. Subsequent gates renumber with +1 offset. Total gates: 18 (post-cycle-1) → 19. | | P57-B9 | Methodology candidates carry forward — thirteen total at Phase 57 close. Cycle-2 halt-surface §6 enumerated twelve (1–6 pre-build/Step-0; 7–9 cycle-1 candidates A/B/C; 10 the cycle-1 CR-amendment-drafting-prose observation; 11/12 new at cycle-2 halt-surface as Candidates D/E). The cycle-2 scoping note adds Candidate F: diagnosis-as-architecture-when-runtime-binding-fails, single-instance evidence shipped at P57-B2's diagnostic-first execution posture; generalizes the substrate-friction-discipline-pattern at a finer-grained scoping-vs-execution boundary. Candidate C reaches three-instance evidence (Phase 49 Step 4 + Phase 57 cycle 1 + Phase 57 cycle 2 — three consecutive instances within an eight-phase window per halt-surface §6 note); clears the v0.21 promotion threshold per manifest v0.39 §2 / v0.40 §2 two-instance promotion convention; the name should be amended at v0.21 to drop the "second" qualifier — the pattern is substrate-friction-discipline-pattern build-mode firing. Step 4 implementation notes carry thirteen candidates rather than the twelve halt-surface §6 projected. | | P57-B10 | Second reserved buffer slot consumed. Both Phase 57 reserved slots are now consumed (Step 6 at cycle 1, Sub-arc 4; Step 7 at cycle 2, Sub-arc 5). First phase since Phase 49 to consume both reserved slots in a single phase. The reserved-slot pre-commitment design fires exactly as intended at its threshold case — a phase that requires two halt-and-amend cycles still completes within its reserved budget without derailing or expanding scope. Manifest v0.39 §2 reserved-slot-as-halt-condition-pre-commitment framing carries forward, strengthened by this evidence: the pattern is not just the slots exist to absorb amendment but the slots' count is calibrated to actual mid-build amendment frequency at the worst case observed. New methodology observation candidate folded into Candidate C's three-instance evidence record. |


Sub-arc 5 decomposition

The cycle-2 scoping note settles the investigation envelope; CRV-B findings settle the specific component decomposition at execution time. The provisional decomposition below is what the CR v0.3 §5 / §10 Step 2c sections describe; CRV-B-driven adjustments absorb at execution time per the CR's halt-thresholds.

5a. Diagnostic phase (CRV-B1 through CRV-B6 from cycle-2 halt-surface §4). CC adds temporary logging at the six diagnostic surface points (prompt.py:817 dispatcher; classify_intent exit in src/loomworks/orchestration/classifier.py; field_coverage initialization in the converse flow handler; load_intent_instruction in prompt_assets.py; ChatView.tsx converse-submission path; existing test coverage probe). Submits diagnostic messages from /operator/create-engagement. Captures findings. Removes temporary logging. No production code changes in this phase.

5b. Diagnostic findings document. CC files docs/phase-impl-notes/phase-57-step-2c-diagnostic-findings-v0_1.md on engine repo's phase-57-marketing-engagement-creation branch. Single-file commit. Content: per-CRV verdict (HOLDS / CONTRADICTS / NEEDS-FOLLOW-UP); root-layer identification (OL / engine / shared); specific file:line change sites; test surface specification. This is the architectural artifact for cycle 2 — the analog of cycle-1's CR v0.2 Sub-arc 4 component decomposition, but produced at execution time from live evidence rather than at scoping time from halt-surface diagnostic.

5c. Runtime-binding fix. CC implements the production change(s) per the diagnostic findings document. Layer(s) and file(s) per the findings. Commit message references the diagnostic findings note.

5d. Scrollback isolation fix. Per P57-B3 — may collapse into 5c if the same layer fix resolves both (e.g. if the engine scoping fix that fixes classifier context also fixes scrollback fetch); may stand separate if the fixes attach at different layers.

5e. Test surface. Per P57-B4 floor — at least one test pins the corrected wire path. Lives in OL vitest, engine pytest, or new e2e harness per CRV-B6. Naming convention follows the destination harness's existing conventions.

5f. Local stack restart + lightweight post-fix confirmation. CC restarts OL dev server (and engine if engine changes lands); submits a creation-flow opener from /operator/create-engagement; confirms via console log / classifier log / observed response shape that the route now engages create_engagement_entry. This is not the live usage event (that's Step 2b); it's the lightweight confirmation Step 2c's acceptance gate requires.

Total Sub-arc 5 components: 5a–5f (six). The decomposition is provisional pending CRV-B; components may collapse (e.g. 5c + 5d into one commit if findings indicate same layer) or expand (e.g. 5c into 5c-engine + 5c-OL if shared-fix shape) at execution time.


Build steps integration

CR v0.2 §10 lists six active steps + two reserved slots (Step 6 consumed at cycle 1; Step 7 reserved). CR v0.3 §10 keeps Steps 0/1 (pre-halt, done), Step 2a (cycle-1 Sub-arc 4, done), Step 2b (live usage event, paused), Steps 3/4/5 (calibration / observation / close, unchanged from v0.2). The cycle-2 amendment inserts:


Halt conditions for the amendment cycle

CR v0.3 §11 extends v0.2 §11. Cycle-2-specific halt thresholds at Step 2c:

Naming-only divergences (a temporary-logging file path differs from halt-surface §4's literal cite; a constant name shifts; a request-body parameter name in the OL converse-submission path is what's actually present rather than the speculative "mode discriminator" name) absorb in-flight per friction-discipline. Architectural divergences halt and surface.


New methodology observations crystallizing at cycle-2 scoping

Beyond the twelve candidates the cycle-2 halt-surface §6 enumerated, the scoping work crystallizes one new candidate:

Candidate F — diagnosis-as-architecture-when-runtime-binding-fails. Single-instance evidence at cycle-2 scoping. Names the pattern that cycle-2 differs structurally from cycle 1: cycle 1's halt-surface produced three findings that pre-specified the fix; the cycle-1 scoping note settled the fix shape (P57-A1: remove the gate; omit email; update text); CRV-A1 through CRV-A8 verified the fix's specific surface (file:line, constant names, test conventions). Cycle 2's halt-surface produced ONE finding (the runtime binding is broken) plus six diagnostic items; the cycle-2 scoping note settles the investigation envelope + execution posture (P57-B1 + P57-B2) but cannot settle the fix shape — the diagnostics produce it. The candidate names this as a distinct sub-pattern within substrate-friction-discipline-pattern's three-instance evidence: when substrate is present and correct but runtime engagement fails, scoping's role is to authorize the diagnostic work and constrain its envelope; the diagnostic IS the architectural work. Cycle-1 and cycle-2 are both substrate-friction-discipline-pattern firings, but at different granularities: cycle 1's friction was surface-vs-contract (analyzable at halt-surface filing time); cycle 2's friction is runtime-binding (analyzable only via live diagnostics at execution time).

The candidate carries to v0.21 methodology consolidation as a sharpening of substrate-friction-discipline-pattern. Possible v0.21 framing: the pattern's three documented instances now span surface-vs-substrate-contract (Phase 49 / Phase 57 cycle 1) and runtime-binding (Phase 57 cycle 2) sub-patterns; the pattern's resolution shape (note-first → fresh-chat scoping → Operator-elective amendment) adapts based on whether scoping can pre-settle the fix or whether the fix requires diagnostic-first execution.

(Halt-surface §6 Candidate D — per-route-companion-routing-not-asserted-at-step-0 — is the remediation candidate that flows from Candidate F's pattern. Candidate D names what Step 0 inspection briefs should add to catch this class of finding earlier; Candidate F names the build-discipline pattern that handles it once it surfaces. The two are paired.)


What this scoping note does NOT do


DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks Phase 57 CR amendment-cycle-2 scoping note — v0.1 — 2026-05-12