DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path phases/phase-57-marketing-engagement-creation/phase-57-cr-marketing-engagement-creation-v0_4.md

Phase 57 CR — Marketing Engagement Creation

CR number. CR-2026-090 Version. 0.4 Date. 2026-05-12 Status. Amendment cycle 3; supersedes v0.3. v0.1 + v0.2 + v0.3 + v0.4 all preserved alongside; v0.1 + v0.2 + v0.3 archived as superseded; v0.4 active. First four-version CR archival in Loomworks methodology history per P57-C5 (Phase 49 set the prior three-version precedent; Phase 57 cycle 3 extends to four). All four archived at engine repo docs/phase-crs/. Target tag. phase-57-marketing-engagement-creation (annotated; engine + Operator Layer). Authoritative inputs. loomworks-phase-57-scoping-note-v0_2.md; loomworks-phase-57-cr-drafting-handoff-v0_1.md; phase-57-step-0-findings-v0_1.md (engine repo docs/phase-impl-notes/, on branch phase-57-step-0 at 69adb17); current-status-manifest-v0_41.md. Amendment-cycle-1 inputs added at v0.2: phase-57-halt-surface-2026-05-12-v0_1.md (engine repo docs/phase-impl-notes/ on branch phase-57-marketing-engagement-creation at a00f4a3; also in project knowledge); loomworks-phase-57-cr-amendment-scoping-note-v0_1.md; loomworks-phase-57-cr-amendment-handoff-v0_1.md. Amendment-cycle-2 inputs added at v0.3: phase-57-halt-surface-2026-05-12-step-2b-v0_1.md (engine repo docs/phase-impl-notes/ on branch phase-57-marketing-engagement-creation; also in project knowledge); loomworks-phase-57-cr-amendment-2-scoping-note-v0_1.md; loomworks-phase-57-cr-amendment-2-handoff-v0_1.md. Amendment-cycle-3 inputs added at v0.4: phase-57-halt-surface-2026-05-12-step-2b-live-v0_1.md (engine repo docs/phase-impl-notes/ on branch phase-57-marketing-engagement-creation at engine commits 5534068 + 771aacd); phase-57-step-2c-diagnostic-findings-v0_1.md (engine repo; Sub-arc 5b findings; §10 secondary findings 7.1 + 7.2 deferred-to-Phase-58 items); loomworks-phase-57-step-2b-live-halt-session-handoff-v0_1.md; loomworks-phase-57-cr-amendment-3-scoping-note-v0_1.md; loomworks-phase-57-cr-amendment-3-handoff-v0_1.md. Precedent CRs: Phase 56 (phase-56-cr-conversational-creation-surface-voice-v0_2.md), Phase 55 (phase-55-cr-engagement-creation-assistance-v0_1.md), and for multi-cycle CR-version-bump shape: phase-49-cr-amendment-v0_2-v0_1.md (Phase 49 carries v0.1 / v0.2 / v0.3 under the same archival convention; Phase 57 cycle 3 extends the convention to v0.1 / v0.2 / v0.3 / v0.4 per P57-C5). Drafter posture. Drafted by Claude.ai per amendment-cycle-3 handoff kickoff. Eight original CR-time verifications (CRV-1 through CRV-8) embedded as Step 0 pre-flight per Phase 53/55 precedent; ran pre-halt at the original Step 0 of the build cycle. Eight CR-amendment-cycle-1-time verifications (CRV-A1 through CRV-A8) embedded as Step 2a pre-flight; CC ran them at amendment-cycle-1 start and all HELD. Six CR-amendment-cycle-2-time diagnostic verifications (CRV-B1 through CRV-B6) embedded as Step 2c pre-flight; CC ran them at amendment-cycle-2 execution start as Sub-arc 5a, filed Sub-arc 5b findings, and executed Sub-arcs 5c–5e on the OL ChatView runtime-binding fix; Sub-arc 5f lightweight post-fix confirmation passed at wire-path scope. At least five (likely 5–7) CR-amendment-cycle-3-time diagnostic verifications (CRV-C1 through CRV-C5/6) embedded as Step 2d pre-flight per the cycle-3 handoff kickoff — CC runs them at amendment-cycle-3 execution start as Sub-arc 6a, files a diagnostic findings note (Sub-arc 6b at docs/phase-impl-notes/phase-57-step-2d-diagnostic-findings-v0_1.md) that identifies root layer (within the four-layer substrate-engagement chain framed at cycle-3 halt-surface §4: present → classified → template-selected → response-shaped) + fix sites + cross-reference to Sub-arc 5b findings, then implements the fix (Sub-arcs 6c–6f). Diagnostic-first execution posture per P57-B2 extended at P57-C2 with Candidate F recursive-aperture-widening property (each amendment cycle's diagnostic envelope reveals a layer the prior cycle's envelope structurally could not probe; cycle 1 probed layer 1 surface; cycle 2 probed layer 2 wire-binding; cycle 3 probes layers 3 + 4 template-selection + response-shape). Sub-arc 6f post-fix confirmation re-scoped per Candidate G to match Step 2b live-usage scope (full classify → template-select → render exercised), explicitly broader than cycle-2's Sub-arc 5f lightweight wire-path scope. Naming-only divergences absorb in-flight; architectural divergences halt and surface a follow-on phase-57-halt-surface-<timestamp>-v0_1.md note.

Amendment record (cycle 1, recorded at v0.2; preserved verbatim). Amendment cycle 1 absorbed per phase-57-halt-surface-2026-05-12-v0_1.md and loomworks-phase-57-cr-amendment-scoping-note-v0_1.md. Sub-arc 4 (OL surface alignment with engine identity contract) added; Step 2a inserted; Step 2 renamed Step 2b. OL vitest count 150 (was 149). Gate 5 amended; Gate 5b new (subsequent gates renumbered with +1 offset). One reserved buffer slot consumed (one remained). Engine substrate unchanged. Three methodology candidates (A + B + C) carry to v0.21 / v0.42. One queued direction added (OL surface-vs-contract audit, Phase 58+). Two minor accuracy fixes within sections the handoff §7.2 labeled "Unchanged" recorded in §4 discovery-record bookkeeping (§13 OL bullet; §17 OL close expected-vitest comment); both fixes correct factual claims about post-amendment OL state.

Amendment record (cycle 2, recorded at v0.3; preserved verbatim). Amendment cycle 2 absorbed per phase-57-halt-surface-2026-05-12-step-2b-v0_1.md and loomworks-phase-57-cr-amendment-2-scoping-note-v0_1.md. Sub-arc 5 (route-to-substrate runtime binding for /operator/create-engagement) added; Step 2c inserted between Step 2a (cycle-1 Sub-arc 4, complete) and Step 2b (live usage event, paused). Diagnostic-first execution posture: CRV-B1 through CRV-B6 run as Step 2c first activity (Sub-arc 5a); diagnostic findings document (Sub-arc 5b) drives the production fix (Sub-arcs 5c–5f). Test count update deferred to CRV-B findings, with documented floor (+1 net) and ceiling (+1 OL vitest + +1 engine vitest); CR §16 table carries floor and ceiling. Gate 5 amended further; Gate 5c new (subsequent gates renumbered with +1 offset; total 18 → 19). Both reserved buffer slots now consumed (Step 6 by Sub-arc 4 at cycle 1; Step 7 by Sub-arc 5 at cycle 2) — first Phase since Phase 49 to consume both. Engine substrate Step 1 unchanged; cycle-1 Sub-arc 4 OL substrate unchanged. One new methodology candidate at scoping (Candidate F — diagnosis-as-architecture-when-runtime-binding-fails); Candidate C (substrate-friction-discipline-pattern-second-build-mode-firing) reaches three-instance evidence within an eight-phase window and clears the v0.21 promotion threshold; halt-surface §6 Candidates D and E carry forward; total methodology candidates at Phase 57 close: thirteen. One queued direction added (OL route-to-substrate runtime-binding audit, Phase 58+; possibly consolidates with the cycle-1-derived OL surface-vs-contract audit).

Amendment record (cycle 3, this version). Amendment cycle 3 absorbed per phase-57-halt-surface-2026-05-12-step-2b-live-v0_1.md (engine repo; commits 5534068 + 771aacd) and loomworks-phase-57-cr-amendment-3-scoping-note-v0_1.md. Sub-arc 6 (response-shape engagement for /operator/create-engagement) added; Step 2d inserted between Step 2c (cycle-2 Sub-arc 5, complete) and Step 2b (live usage event, still paused since cycle-3 halt). The cycle-3 halt-surface reframed substrate-engagement as a four-layer chain (present → classified → template-selected → response-shaped); cycle 2 audited layers 1–2 via CRV-B1 through CRV-B6; cycle-3 live usage failed at layer 3 (template-selection) or layer 4 (response-shape rendering) or both. Diagnostic-first execution posture extended per P57-C2 with Candidate F recursive-aperture-widening: each amendment cycle's diagnostic envelope reveals a layer the prior cycle's envelope structurally could not probe. CRV-C1 through CRV-C5/6 (envelope cardinality settled at execution time) run as Step 2d first activity (Sub-arc 6a); diagnostic findings document (Sub-arc 6b at phase-57-step-2d-diagnostic-findings-v0_1.md) drives the production fix (Sub-arcs 6c–6f). Sub-arc 6f post-fix confirmation explicitly re-scoped per Candidate G to live-usage scope (full classify → template-select → render exercised), not the wire-path scope that satisfied cycle-2's Sub-arc 5f — Candidate G's prescription becomes a discipline at cycle 3 per P57-C3. Test count update deferred to CRV-C findings, with documented floor (+1 net test pinning response-shape per P57-C4) and ceiling (+2 if shared-fix shape AND an e2e harness lands as a new file per P57-C7); CR §16 table carries floor and ceiling for OL vitest (151 → 152 floor; 151 → 153 ceiling) and engine always-run (2,280 floor; 2,280 + 1 ceiling per engine-side template-dispatch assertion). Gate 5 amended further; Gate 5d new (subsequent gates renumbered with +1 offset; total 19 → 20). Reserved-budget expansion explicitly authorized per P57-C10 as Operator-elective per substrate-friction-discipline-pattern; the explicit-authorization gate fired at cycle-3 halt per P57-B10 and was granted by Marvin's Option X selection against the cycle-3 halt-surface §6 X / Y / Z space — the authorization is calibration data on the reserved-slot pre-commitment principle, not circumvention of it. Engine substrate Step 1 unchanged; cycle-1 Sub-arc 4 unchanged; cycle-2 Sub-arc 5 unchanged. Two new methodology candidates at scoping — Candidate G sharpened to two-confirmation-surface evidence (OL vitest mocked-engine PASS + lightweight engine-log confirmation PASS while live-usage FAIL); Candidate H (reserved-slot-pre-commitment-as-calibrable-not-fixed) named for the first time. Candidate C reaches four-instance within Phase 57 (cycles 1 + 2 + 3) + five-instance across two phases (Phase 49 + Phase 57); within-phase recurrence pattern is structurally novel and likely warrants its own framing at v0.21 distinguishing cross-phase pattern firing from within-phase pattern recurrence. Candidate F extended to recursive-aperture-widening property. Total methodology candidates at Phase 57 close: fifteen per P57-C9. One new queued direction added (OL response-shape engagement audit, Phase 58+; consolidation candidate alongside cycle-1's OL surface-vs-contract audit and cycle-2's OL route-to-substrate runtime-binding audit). Per cycle-1 methodology candidate 10's CR-amendment-drafting-prose-overclaim discipline: byte-identical-stable existing-test-behavior claims for Sub-arc 6 are deferred to CRV-C execution-time review; per cycle-3 scoping note's finding 7.2 reproducing verbatim observation, inter-session drift is non-zero across the dependency-drift surface (currently test_api_assertion_retract.py::test_api_assertion_retract failing pre-existing).


§1 Purpose

Phase 57 ships the first real-Operator usage of the Phase 55/56 conversational engagement creation surface. The marketing engagement (sibling to the Loomworks engagement under DUNIN7) is created live by the Operator using pre-drafted content from loomworks-marketing-creation-flow-content-v0_3.md and the Discovery-record terminal-turn path.

The phase has two outputs:

  1. Product output. The marketing engagement exists as a real Loomworks engagement — Discovery record in Memory, candidate seed produced via Phase 53 extraction, induction loop closed, engagement visible in the /operator engagement list.
  2. Methodology output. A real-Operator transcript captured as a calibration fixture at tests/fixtures/voice-calibration/real_operator_marvin_<YYYY-MM-DD>.md. First concrete instance of the persona-vs-real-Operator-contrast pattern named at scoping v0.1 §12.

One substrate addition closes the only known gap on the creation surface: the Field 6 per-field elicitation prompt component. The substrate is otherwise complete — Seed.additional_assertions: dict[str, str] exists, Phase 53's extraction skill parses Field 6, and the skill validates the structure. The gap is elicitation-only (V2 GAP-CONFIRMED-AS-EXPECTED at Step 0).

Amendment cycle 1 (v0.2) adds Sub-arc 4 — OL surface alignment with engine identity contract — to absorb the halt-surface finding that the Operator Layer signin form's empty-email guard contradicts the engine's WebAuthn discoverable-credential identity contract and the standing DUNIN7 principle that email must not be used for identity. The fix is OL-side only; engine substrate is correct and untouched. Phase 57's product + methodology deliverables are preserved unchanged.

Amendment cycle 2 (v0.3) adds Sub-arc 5 — route-to-substrate runtime binding for /operator/create-engagement — to absorb the cycle-2 halt-surface finding that the route does not engage the Phase 55/56 scaffolded conversation flow at runtime, despite Sub-arcs 1 and 4 being correct and verified. The diagnostic exchange ("Tell me what the capital of NZ is""Wellington") confirmed intent classification is landing on general_conversation rather than create_engagement_entry/_active/_commit. The fix layer (OL converse-submission path / engine classifier or dispatcher context-scoping / shared) is determined at Step 2c diagnostic-execution time, not pre-decided in scoping. Engine substrate Step 1 and cycle-1 Sub-arc 4 OL substrate are correct and untouched. Phase 57's product + methodology deliverables are preserved unchanged.

Amendment cycle 3 (v0.4) adds Sub-arc 6 — response-shape engagement for /operator/create-engagement — to absorb the cycle-3 halt-surface finding that Step 2b live usage failed despite Sub-arc 5's wire-binding fix landing correctly (engine receives real OL POST bodies with intent_hint, per cycle-3 halt-surface §2.1 bullet 5) and Sub-arc 5f's lightweight post-fix confirmation passing at wire-path scope. The twelve-turn live transcript captured in cycle-3 halt-surface §2 reproduced the cycle-2 halt-surface §2.1 reading exactly — Companion opening turn was the general-purpose opener rather than Field 1 of the marketing-creation prompt; "capital of NZ""Wellington" reproduced verbatim; "parked on Level 13""I'll remember that" surfaced quick-capture-engagement behavior. The cycle-3 halt-surface §4 reframed substrate-engagement as a four-layer chain (present → classified → template-selected → response-shaped); cycle 2's CRV-B aperture covered layers 1–2 (wire-binding); cycle-3 live failure surfaces at layer 3 (template-selection) or layer 4 (response-shape rendering) or both. The fix layer (Candidate A stale OL bundle weakened but not closed / Candidate B engine intent_hint not honored at a subtler level than CRV-B2 verified / Candidate C template-selection downstream / additionally Candidate D-equivalent response-shape rendering at layer 4) is determined at Step 2d diagnostic-execution time per P57-C2 — extending Candidate F's diagnosis-as-architecture-when-runtime-binding-fails with the recursive-aperture-widening property. Sub-arc 6f post-fix confirmation explicitly re-scoped to live-usage scope per Candidate G per P57-C3 — the lightweight-engine-log confirmation that satisfied cycle-2's Sub-arc 5f is explicitly insufficient at cycle 3. Reserved-budget expansion explicitly authorized per P57-C10 as Operator-elective per substrate-friction-discipline-pattern (the explicit-authorization gate per P57-B10 fired and was granted at the cycle-3 scoping note's opening — the authorization is the principle working as designed at its calibration-data threshold case, not circumvention of it). Engine substrate Step 1, cycle-1 Sub-arc 4, and cycle-2 Sub-arc 5 are correct and untouched. Phase 57's product + methodology deliverables are preserved unchanged.


§2 Background

Phase 55 (phase-55-engagement-creation-assistance) shipped the conversational creation surface — intent classifier, dispatcher routing, three scaffolding prompt templates (create_engagement_active.md, create_engagement_commit.md, intent_classifier.md), field_coverage map, terminal-turn affordance.

Phase 56 (phase-56-conversational-creation-surface-voice) voice-tuned that surface with plain-terms-discipline: three per-field elicitation prompts at prompts/intent_instructions/create_engagement/ (voice.md, constraints.md, success.md); the load_per_field_components loader at prompt_assets.py; dispatcher splice at prompt.py:817; voice principles document at docs/voice-principles-v0_1.md; persona calibration fixtures at tests/fixtures/voice-calibration/; calibration-gated tests at tests/test_phase_56_conversational_creation_surface_voice.py with helper at tests/helpers/voice_calibration.py; terminal-turn matcher token-set in router.py covering legacy + plain-terms phrasings.

Phase 57 closes the Field 6 gap (Phase 56 explicitly scoped Fields 3–5 only) and exercises the surface end-to-end on a real engagement for the first time.

Substrate baseline (from handoff §2; CC re-confirmed at Step 0).

Engine repo DUNIN7/loomworks-engine at /Users/dunin7/loomworks-engine:

Operator Layer repo DUNIN7/loomworks at /Users/dunin7/loomworks:

Marketing site repo: not in Phase 57 scope. Workshop repo: not in Phase 57 scope.

Substrate baseline at amendment-cycle-1 start (post-cycle-1-halt, pre-resume; per amendment-cycle-1 handoff §2).

Engine repo on branch phase-57-marketing-engagement-creation at a00f4a3 — CR archive commit + Field 6 substrate commit from Step 0 + Step 1; 2,280 always-run + 32 skipped (1 always-run + 2 calibration-gated added at Step 1); Alembic 0064 unchanged; working tree clean; halt-surface note filed at docs/phase-impl-notes/phase-57-halt-surface-2026-05-12-v0_1.md on the branch.

Operator Layer repo on branch phase-57-marketing-engagement-creation at 2cc0ebc (= Phase 56 commit; no OL changes yet — the amendment changes this); 149 vitest; 11 prerendered routes; lint/tsc/build clean; working tree clean.

Local stack at amendment-cycle-1 resume time: engine API up on :8000 with /healthz returning 200; CORS resolved (LOOMWORKS_ENV=development in local .env); OL dev server up on :3001; Marvin's Person row + passkey credential present in dev DB.

Halt-surface trajectory leading to amendment cycle 1 (per phase-57-halt-surface-2026-05-12-v0_1.md). Step 2 entry surfaced an architectural finding: the Operator Layer signin form at /operator/create-engagement (which redirects to /signin when unauthenticated) presents a required-email field. The Operator named a long-standing DUNIN7 principle — email must not be used for identity; email-hijack creates account-takeover via password-reset-to-email — that was not previously named in any source-of-truth document. CC's diagnostic established three findings against the live source on branch phase-57-marketing-engagement-creation: (1) the engine identity model is WebAuthn passkey — SignupBeginRequest, LoginBeginRequest, PersonRow all treat email as Optional; /auth/login/complete looks up the Person by credential_id not by email; the discoverable-credential flow is supported when email = None on /auth/login/begin; (2) the OL signin form's client-side gate at IdentifierStep.tsx:31 contradicts the engine contract by requiring email input where the engine does not — signin-flow.ts:42 POSTs {email: email.trim()} and the engine would accept {} cleanly; (3) the drift was not surfaced at Phase 41 / 48 / 50 close because the standing principle was not named in any source-of-truth document. The engine correctly embodies the standing principle; the contradiction is at the OL client-side gate only; the fix is OL-side and small.

Substrate baseline at amendment-cycle-2 start (post-cycle-2-halt, pre-resume; per amendment-cycle-2 handoff §2).

Engine repo on branch phase-57-marketing-engagement-creation at the cycle-2 halt-surface commit (parent 7a6220c = CR v0.2 archive). Five Phase-57 commits pre-cycle-2-halt-surface: CR v0.1 archive (09907d6); Step 1 substrate (a00f4a3); cycle-1 halt-surface note (39e4f00); CR v0.2 archive (7a6220c); cycle-2 halt-surface note (filed at docs/phase-impl-notes/phase-57-halt-surface-2026-05-12-step-2b-v0_1.md). Tests: 2,280 always-run + 32 skipped — unchanged from cycle-1 close baseline. Alembic head: 0064 unchanged. Working tree clean after the cycle-2 halt-surface note lands.

Operator Layer repo on branch phase-57-marketing-engagement-creation at e435b30 (cycle-1 Sub-arc 4 commit; no new OL commits at cycle-2 halt). Tests: 150 vitest passed; 11 prerendered routes; lint/tsc/build clean. Working tree clean.

Local stack at amendment-cycle-2 resume time: engine API up on :8000 with /healthz returning 200; CORS resolved (LOOMWORKS_ENV=development in local .env); OL dev server up on :3001; banner revision present at ChatView.tsx:254; banner string "Setting up a new project" confirmed correct on live surface (cycle-2 halt-surface §2.1 first real-Operator confirmation; Candidate E positive observation). Marvin's Person row + passkey credential present in dev DB; signin works (cycle-1 Sub-arc 4 landed).

No mid-build commits to revert. Phase 57 Sub-arcs 1 + 4 substrate are correct and stay. The cycle-2 amendment adds work; it does not undo cycle-1 work.

Halt-surface trajectory leading to amendment cycle 2 (per phase-57-halt-surface-2026-05-12-step-2b-v0_1.md). Step 2b entry surfaced a runtime-binding finding: the /operator/create-engagement route loads with the correct banner ("Setting up a new project" — first real-Operator confirmation of the Phase 56 plain-terms-discipline revision), but 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") confirmed intent classification is landing on general_conversation rather than create_engagement_entry/_active/_commit. 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-8 + CRV-A1 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.

Substrate-presence is not substrate-engagement (cycle-2 halt-surface §3 framing). 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); paired with the scoping-stage Candidate F (diagnosis-as-architecture-when-runtime-binding-fails) named at the cycle-2 scoping chat.

Third build-mode firing of substrate-friction-discipline-pattern. The cycle-2 trajectory is the third instance (Phase 49 Step 4 first — the canonical instance; Phase 57 amendment cycle 1, Sub-arc 4 OL signin alignment, second; Phase 57 amendment cycle 2, Sub-arc 5 route-to-substrate runtime binding, third). Three-instance evidence within an eight-phase window (Phases 49 / 50–56 unconsumed / 57 cycle 1 / 57 cycle 2) clears the v0.21 promotion threshold per manifest v0.39 §2 / v0.40 §2 two-instance promotion convention. Candidate C carries forward at three-instance evidence; the name should be amended at v0.21 to drop the "second" qualifier — the pattern is substrate-friction-discipline-pattern build-mode firing.


§3 Construction decisions (P57-D1 through P57-D10)

All ten settled at scoping v0.2 (eight items) plus handoff (two items: D7 elevation to Option A, and D10 newly added at v0.2). CC executes against them; does not re-decide.

| Item | Setting | Source | |------|---------|--------| | P57-D1 | Shape B — usage event with bounded substrate tuning (one prompt component at Step 1). | Scoping v0.2 §Shape selection | | P57-D2 | Stop at engagement-exists. Downstream marketing-engagement substrate (render specialists, marketing-shaped artifacts, marketing-engagement-specific assertion types) is Phase 58+. | Scoping v0.2 §Open construction decisions | | P57-D3 | Discovery-record terminal-turn path. Not the brief-commit path. | Scoping v0.2 §Open construction decisions | | P57-D4 | Author Field 6 prompt at Step 1. New file at prompts/intent_instructions/create_engagement/additional_assertions.md; ~11 lines; structural mirror of Phase 56's voice.md / constraints.md / success.md; +1 test. | Scoping v0.2 §Open construction decisions | | P57-D5 | Real-Operator transcript fixture at tests/fixtures/voice-calibration/real_operator_marvin_<YYYY-MM-DD>.md. Filename distinguishes from persona fixtures. Date is literal Step 2 capture date. | Scoping v0.2 §Open construction decisions | | P57-D6 | Closed. Field 6 surface fallback design no longer needed since Shape B confirmed and Step 1 lands the elicitation prompt directly. | Scoping v0.2 §Open construction decisions | | P57-D7 | Option A — delete at close. Step 0 inspection branches are deleted at phase close. Phase 57 applies retroactively: phase-56-step-0 is also deleted at Phase 57 close. Going-forward convention: every phase deletes its Step 0 inspection branch at close. (The silent cleanup of phase-55-step-0 between Phase 56 close and Phase 57 Step 0 demonstrated Option A is the natural drift; Option A formalizes it.) | Handoff §4 (elevated from v0.2 Option B provisional) | | P57-D8 | Independent engagement under DUNIN7. Marketing engagement is sibling of the Loomworks engagement, not a subsidiary. | Scoping v0.2 §Open construction decisions | | P57-D9 | Sonnet for default Companion operation. Flagged for Phase 58+ at first-rendered-output cost surface; not a Phase 57 settled decision but recorded for downstream pickup. | Scoping v0.2 §Open construction decisions | | P57-D10 | Capture-during-Step-2-only. V4 POSTURE-GAP friction phrases captured in Step 4 implementation notes; no Step 1 posture pre-tuning. Future micro-tuning phase informed by Step 2 evidence. | Handoff §4 (added at scoping v0.2 §Open construction decisions §New at v0.2) |

§3.A Amendment cycle 1 — P57-A1 through P57-A10

All ten amendment-cycle-1 construction decisions settled at the amendment-cycle-1 scoping note (loomworks-phase-57-cr-amendment-scoping-note-v0_1.md). CC executed against them at amendment-cycle-1 build time; does not re-decide.

| Item | Setting | Source | |------|---------|--------| | P57-A1 | Remove the empty-email guard; omit email from /auth/login/begin POST body when empty; update field surface text to indicate optionality. Email field stays present (narrows allowCredentials as a passkey hint when supplied); the discoverable-credential path is the normal path. | Amendment-cycle-1 scoping note §P57-A1 | | P57-A2 | One new vitest. Exercises empty-email submission → no emailEmptyError set → POST body omits email → mock returns a WebAuthn challenge → form transitions to the passkey step. Rejected alternatives: zero tests (regression-prone for a client-side gate); two tests (the with-email path is already covered by existing 149). | Amendment-cycle-1 scoping note §P57-A2 | | P57-A3 | Narrow audit limited to the signin form only. Sign-up, claim-flow, account-recovery, and other identity-adjacent OL surfaces deliberately out of amendment scope. OL surface-vs-contract audit queued as a Phase 58+ candidate. | Amendment-cycle-1 scoping note §P57-A3 | | P57-A4 | Public marketing form out of scope. The Phase 51 form takes email + jurisdiction as contact metadata for grant-request intake; the grant flows through Companion-as-Authority approval (Phase 50), not through email-keyed authentication. Principle distinguishes identity from contact. CRV-A7 verified HOLDS at amendment-execution time. | Amendment-cycle-1 scoping note §P57-A4 | | P57-A5 | CR version phase-57-cr-marketing-engagement-creation-v0_2.md. v0.1 preserved alongside as superseded; both archived at engine repo docs/phase-crs/. (Superseded at cycle 2 by P57-B5: v0.3 active, v0.1 + v0.2 archived as superseded.) | Amendment-cycle-1 scoping note §P57-A5 | | P57-A6 | New Sub-arc 4: OL surface alignment with engine identity contract. Separate sub-arc keeps the engine / OL boundary visible. Rejected alternative: Sub-arc 1e extension of Field 6 prompt authoring (would muddy the engine / OL boundary). | Amendment-cycle-1 scoping note §P57-A6 | | P57-A7 | Test count update: OL vitest 149 → 150. Engine 2,280 always-run + 32 skipped unchanged. Alembic 0064 unchanged. | Amendment-cycle-1 scoping note §P57-A7 | | P57-A8 | Two CR §12 gate updates. Gate 5 amended to include Sub-arc 4 readiness. New Gate 5b: OL signin surface accepts empty email and proceeds to the WebAuthn discoverable-credential path. Subsequent gates renumbered with +1 offset. Total gates 17 → 18. (Subsequent renumbering extended at cycle 2 by P57-B8.) | Amendment-cycle-1 scoping note §P57-A8 | | P57-A9 | Three methodology candidates carry to v0.21 / v0.42. Candidate A (engine-correct-surface-drifted); Candidate B (standing-principle-not-named-in-source-of-truth-documents-allows-contradicting-surface-to-ship); Candidate C (new at amendment scoping — substrate-friction-discipline-pattern-second-build-mode-firing, two-instance evidence at v0.2: Phase 49 Step 4 + Phase 57 Step 2). (Candidate C reaches three-instance evidence at cycle 2 per P57-B9.) | Amendment-cycle-1 scoping note §P57-A9 | | P57-A10 | One reserved buffer slot consumed. One remained available at v0.2 if Steps 2b–5 surface a second halt-and-amend cycle. First consumed reserved slot since Phase 49 Step 4; eight consecutive zero-consumption phases (50–56 + Phase 57 pre-halt) ended at this amendment. (Second slot consumed at cycle 2 per P57-B10.) | Amendment-cycle-1 scoping note §P57-A10 |

§3.B Amendment cycle 2 — P57-B1 through P57-B10

All ten amendment-cycle-2 construction decisions settled at the amendment-cycle-2 scoping note (loomworks-phase-57-cr-amendment-2-scoping-note-v0_1.md). CC executes against them at amendment-cycle-2 build time; does not re-decide. 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 | Source | |------|---------|--------| | 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); or shared. Investigation envelope is the six diagnostics; not a pre-specified fix. Rejected alternative: pre-decide "OL passes intent_hint=create_engagement_entry" before diagnostics confirm (would risk fixing the wrong layer). Rejected alternative: scope expansion to audit all OL→engine route bindings (broader than necessary; Phase 58+ candidate). | Amendment-cycle-2 scoping note §P57-B1 | | 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. Codifies new methodology candidate F (diagnosis-as-architecture-when-runtime-binding-fails). | Amendment-cycle-2 scoping note §P57-B2 | | P57-B3 | Scrollback isolation in creation mode is in scope. The visible-prior-chat-pairs flag from cycle-2 halt-surface §2.1 may be the same issue as the runtime-binding failure (classifier sees prior general_conversation turns as context). Fix presents a creation-mode-scoped (or empty) scrollback on /operator/create-engagement. Layer (OL fetch / engine scope) determined at CRV-B3 time. Rejected alternative: treat scrollback leakage as cosmetic and defer (the visible scrollback may itself be confusing the runtime binding). | Amendment-cycle-2 scoping note §P57-B3 | | P57-B4 | Test surface floor: ≥1 e2e/integration test pins the wire path. Closes the Phase 55 e2e gap halt-surface §4.6 named — no existing test exercises OL surface → engine classifier → creation-flow handlers end-to-end. Harness (OL vitest mocked / engine pytest / new e2e) per CRV-B6 findings. Rejected alternative: zero new tests (regression-prone). Rejected alternative: full Phase 55 e2e suite (out of scope; the floor is one test that pins this specific route-to-substrate binding). | Amendment-cycle-2 scoping note §P57-B4 | | 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. | Amendment-cycle-2 scoping note §P57-B5 | | 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 Sub-arcs 2/3, and the cycle-1 OL surface alignment (Sub-arc 4). Rejected alternative: extend Sub-arc 4 to absorb (signin-alignment-specific; 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). | Amendment-cycle-2 scoping note §P57-B6 | | 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). 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. | Amendment-cycle-2 scoping note §P57-B7 | | 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. | Amendment-cycle-2 scoping note §P57-B8 | | 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 per-route-companion-routing-not-asserted-at-step-0 and E — the banner-plain-terms-discipline-confirmed-on-first-real-Operator-pass positive observation). Cycle-2 scoping 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); 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. | Amendment-cycle-2 scoping note §P57-B9 | | 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. No reserved slots remain; any further mid-build amendment requires explicit Operator authorization (itself a halt-and-surface condition per §11). | Amendment-cycle-2 scoping note §P57-B10 |

§3.C Amendment cycle 3 — P57-C1 through P57-C10

All ten amendment-cycle-3 construction decisions settled at the amendment-cycle-3 scoping note (loomworks-phase-57-cr-amendment-3-scoping-note-v0_1.md). CC executes against them at amendment-cycle-3 build time; does not re-decide. The architectural shape — like cycle 2's — is that the fix layer is not pre-decided in scoping; the diagnostic produces it at CRV-C execution time. The architectural decisions settled here are the investigation envelope + execution posture + confirmation-scope discipline + acceptance criteria + reserved-budget authorization, not the implementation surface. Cycle 3 differs structurally from cycle 2 in two ways the P57-C items absorb: (a) the diagnostic envelope is one layer deeper in the four-layer substrate-engagement chain — cycle 2 probed layers 1–2 (wire-binding); cycle 3 probes layers 3 + 4 (template-selection + response-shape); per Candidate F's recursive-aperture-widening extension; (b) the post-fix confirmation scope explicitly matches live-usage scope per Candidate G's two-confirmation-surface evidence sharpening, not the wire-path scope that satisfied cycle-2's Sub-arc 5f.

| Item | Setting | Source | |------|---------|--------| | P57-C1 | Sub-arc 6 framing — response-shape engagement for /operator/create-engagement. Scope absorbs whatever the cycle-3 halt-surface §3 candidates (A/B/C) plus §4 four-layer framing (layers 3 + 4: template-selected + response-shaped) surface as the root layer at CRV-C diagnostic time. Candidate A (stale OL bundle) is weakened by halt-surface §2.1 bullet 5 (engine receives real POST bodies with intent_hint) but not closed — an HMR-only-stale-bundle scenario where the engine receives requests but the OL client-side code path is stale at a different layer remains open. Candidate B (engine intent_hint not honored at a deeper layer than Sub-arc 5b's CRV-B2 verified) is structurally possible — CRV-B2 verified that intent_hint propagates into the classifier; it did not verify that the classifier's intent_hint-honoring path drives template-selection and response-shape rendering. Candidate C (template-selection downstream of classification) is named by halt-surface §3 as the most likely root layer cycle-2's CRV-Bs structurally did not enumerate. Layer 4 (response-shape rendering) is an additional possibility within the four-layer framing (Candidate D-equivalent: classification correct, template-selection correct, but the final rendered response shape is general_conversation-formatted because of a downstream rendering-layer dispatch). Rejected alternative: pre-decide "Candidate C is the root layer" (halt-surface §3 weighs C as most-likely but does not settle; pre-deciding risks the wrong-layer fix, exactly the failure Sub-arc 5f exposed at cycle 2). Rejected alternative: scope expansion to audit all OL→engine response-shape paths (broader than necessary; Phase 58+ consolidation candidate). | Amendment-cycle-3 scoping note §P57-C1 | | P57-C2 | Diagnostic-first execution posture for Step 2d, per Candidate F precedent extended with recursive-aperture-widening. CC runs CRV-C1 through CRV-C5/6 (envelope cardinality settled at execution time; likely 5–7 items per the four-layer framing plus secondary checks) as Step 2d's first activity, before any production code change. The CRV-C findings produce a brief diagnostic-findings document committed to docs/phase-impl-notes/phase-57-step-2d-diagnostic-findings-v0_1.md on the engine repo's phase-57-marketing-engagement-creation branch. Content shape mirrors cycle-2's Sub-arc 5b findings: per-CRV verdict (HOLDS / CONTRADICTS / NEEDS-FOLLOW-UP); root-layer identification across the four-layer chain (layer 3 / layer 4 / both / a re-opened layer 2); specific file:line change sites; test surface specification; explicit cross-reference to Sub-arc 5b findings — were any of CRV-B1–B6's verdicts narrower-scoped than cycle-3 evidence now demands? The diagnostic envelope explicitly probes Candidates A / B / C (halt-surface §3) plus layer 4 (response-shape rendering). The cycle-2 cross-check is a CRV-C item because halt-surface §2.1 bullet 5 confirms engine receipt — meaning CRV-B2's intent_hint propagation verdict held at scope, but the deeper question (does intent_hint-honored classification drive the full template-select-and-render path?) was outside CRV-B2's aperture. This codifies the extended Candidate F: when each amendment cycle's diagnostic envelope reveals a layer the prior cycle's envelope structurally could not probe, the pattern is recursive — each cycle's diagnostic aperture is one layer wider than the prior, until the chain terminates. Cycle 3 is the third-aperture-widening. Rejected alternative: implement fix as guess at most-likely root cause (Candidate C per halt-surface §3) and hope CRV-C confirms (violates halt-and-surface-preferred-over-draft-and-hope discipline; exactly the path Sub-arc 5f's narrow confirmation exposed at cycle 2). | Amendment-cycle-3 scoping note §P57-C2 | | P57-C3 | Sub-arc 6f live-usage-scoped post-fix confirmation, explicit per Candidate G. Cycle-2's Sub-arc 5f confirmation passed at wire-path scope; Sub-arc 5e OL vitest also passed at wire-path scope (mocked engine); live usage at Step 2b failed because both confirmation surfaces were narrower than the usage surface. Cycle-3 evidence sharpens Candidate G to two-confirmation-surface evidence (OL vitest mocked-engine PASS + lightweight engine-log confirmation PASS while live-usage FAIL). The cycle-3 Sub-arc 6f confirmation MUST exercise the full classify → template-select → render chain — i.e., its scope MUST match Step 2b live-usage scope. Implementation framework (settled here): Sub-arc 6f's acceptance requires either (a) an automated end-to-end test that asserts response shape (not just wire path) — i.e., asserts that a submitted creation-flow opener produces a response classified, template-selected, AND rendered through the creation-flow path, not the general_conversation path; or (b) a CC-driven live-usage probe that reads response shape from the running local stack; or (c) a combination of the two. Implementation specifics (not settled here, deferred to CRV-C6): which of (a)/(b)/(c) — or all three — is the canonical Sub-arc 6f surface, and what specific assertions pin the response-shape contract. Rejected alternative: maintain cycle-2's lightweight-confirmation pattern at wire-path scope (would violate Candidate G's prescription explicitly — the cycle-3 work's methodology purpose includes instantiating Candidate G against a sharper confirmation surface). Rejected alternative: defer Sub-arc 6f scope to CC at execution time without scoping settlement (would leave Candidate G as a description without an instance test; the cycle-3 scoping note is the surface where the prescription becomes a discipline). | Amendment-cycle-3 scoping note §P57-C3 | | P57-C4 | Test surface floor: at least one new test pins the corrected response-shape engagement at layer-3-or-4 scope. Per P57-C3's framework requirement, the test must assert response shape (the shape of what the Companion returns — creation-flow scaffolding vs general_conversation), not just wire-path correctness. Floor: +1 net test. Ceiling: +2 if CRV-C6 surfaces shared-fix shape requiring both OL-side response-shape assertion AND engine-side template-dispatch assertion. Whether the test lives in OL vitest (with a less-mocked engine or a richer fixture), engine pytest (with response-shape assertion at the dispatcher exit), or a new e2e harness (running both stacks against each other) is determined at CRV-C6 time. Rejected alternative: zero new tests (regression-prone — the gap that allowed cycles 1/2/3 successively would re-allow the next). Rejected alternative: pre-commit to a specific harness (the four-layer framing is new enough that the right harness depends on which layer CRV-C identifies as root). | Amendment-cycle-3 scoping note §P57-C4 | | P57-C5 | CR version phase-57-cr-marketing-engagement-creation-v0_4.md. v0.1 + v0.2 + v0.3 + v0.4 all preserved alongside; all four archived at engine repo docs/phase-crs/. v0.4 is active; v0.3 marked superseded; v0.1 + v0.2 already marked superseded. First four-version CR archival in Loomworks methodology history. Phase 49 carried three versions; Phase 57 cycle 3 sets the four-version precedent. | Amendment-cycle-3 scoping note §P57-C5 | | P57-C6 | New Sub-arc 6: response-shape engagement for /operator/create-engagement. Separate sub-arc keeps the response-shape problem class visible alongside engine substrate (Sub-arc 1), the original engine + OL substrate Sub-arcs 2/3, OL signin alignment (Sub-arc 4), and route-to-substrate wire-binding (Sub-arc 5). Rejected alternative: extend Sub-arc 5 (Sub-arc 5 is wire-binding-specific at layer 2; the response-shape problem is at layer 3 or 4 — structurally distinct in the four-layer chain). Rejected alternative: pre-split Sub-arc 6 into Sub-arc 6-OL + Sub-arc 6-engine before CRV-C confirms layer (would pre-decide what CRV-C is meant to find). | Amendment-cycle-3 scoping note §P57-C6 | | P57-C7 | Test count update — deferred to CRV-C findings, with documented floor and ceiling. Floor: +1 net test (per P57-C4 floor). Ceiling: +2 if shared-fix shape AND an e2e harness lands as a new file. Alembic 0064 unchanged across all candidate fix shapes (no migration consumed at layers 3/4). The CR §16 v0.4 test count table reads: OL vitest 151 → 152 (most likely if OL-side response-shape assertion) or 151 → 153 (if shared-fix shape AND a second OL-side assertion or new e2e harness file); engine always-run 2,280 → 2,281 (if engine-side template-dispatch assertion lands; the cycle-3 baseline carries 2,279 pass + 1 fail + 32 skip reflecting cycle-3-scoping-time finding 7.2 dependency-drift fail in test_api_assertion_retract.py::test_api_assertion_retract — the 2,280 always-run count is unchanged from cycle-2 close; only one test's pass/fail status has shifted); calibration-gated 32 unchanged across candidates; potential e2e harness count 0 → 1 if CRV-C6 surfaces e2e as the right surface. The acceptance gate accepts the +1 net floor and +2 ceiling; implementation notes record as-shipped at Phase 57 close. | Amendment-cycle-3 scoping note §P57-C7 | | P57-C8 | Three CR §12 gate updates. Gate 5 amended further to include Sub-arc 6 readiness. New Gate 5d: response-shape engagement verified at live-usage scope per Candidate G — submitting a creation-flow opener from /operator/create-engagement produces a Companion response classified through create_engagement_entry (per CRV-C1) AND template-selected through the creation-flow template path (per CRV-C-layer-3) AND rendered as creation-flow scaffolding (per CRV-C-layer-4). Subsequent gates renumber with +1 offset. Total gates: 19 (post-cycle-2) → 20. | Amendment-cycle-3 scoping note §P57-C8 | | P57-C9 | Methodology candidate carry-forward — fifteen total at cycle-3 scoping (up from fourteen at halt). Carried from handoff §7: fourteen candidates including Candidate G at single-instance halt-surface evidence. Cycle-3 scoping crystallizes (a) Candidate G's two-confirmation-surface sharpening — the OL vitest mocked-engine PASS + lightweight engine-log PASS while live-usage FAIL is structurally sharper than single-instance, suggesting v0.21 framing may want to distinguish confirmation-surface cardinality (how many narrower-than-usage surfaces a fix passes through before hitting usage) as the calibration knob, not just confirmation-vs-usage as a binary; and (b) Candidate Hreserved-slot-pre-commitment-as-calibrable-not-fixed, named here for the first time (see §4 New methodology candidates at amendment cycle 3 below). Candidate C reaches four-instance within Phase 57 (cycles 1/2/3) + five-instance across two phases (Phase 49 + Phase 57). Clears v0.21 promotion threshold with strong margin; the within-phase recurrence pattern is structurally novel and likely warrants its own framing at v0.21 distinguishing cross-phase pattern firing from within-phase pattern recurrence. Candidate F extended at cycle 3 to recursive-aperture-widening property. | Amendment-cycle-3 scoping note §P57-C9 | | P57-C10 | Explicit reserved-budget expansion authorization — Operator-elective per substrate-friction-discipline-pattern, named as calibration data point on the reserved-slot pre-commitment principle. Per P57-B10, any third amendment cycle requires explicit Operator authorization; that authorization gate fired at the cycle-3 halt and is granted by the existence of the cycle-3 scoping note (Marvin's "X" decision at scoping-chat open against the Option X / Y / Z space surfaced in the cycle-3 halt-surface §6). The authorization is not a circumvention of the reserved-slot principle — it is the principle working as designed. The v0.39 §2 promotion of reserved-slot-as-halt-condition-pre-commitment framed slot count as "calibrated to actual mid-build amendment frequency at the worst case observed"; the worst case observed at v0.39 promotion time was Phase 49's one-cycle amendment. Phase 57's three-cycle profile is calibration data: either (i) the calibration window was too short (one phase) and worst-case-actual is higher than worst-case-observed-in-priors, or (ii) Phase 57's substrate-engagement-layer-cardinality is structurally different from prior phases' single-class friction and the slot count should be per-substrate-class rather than per-phase. The cycle-3 scoping note names this as v0.21 framing input; the v0.42 manifest absorption records the calibration data point; the decision about whether two-slot pre-commitment generalizes or needs revision belongs to the v0.21 consolidation pass, not to Phase 57. No further reserved slots remain, and no further explicit authorizations anticipated — any fourth amendment cycle during Steps 2b–5 would re-fire the explicit-authorization gate and would itself be a halt-and-surface condition (§11). Rejected alternative: treat the authorization gate as a hard cap (would substitute a literal-slot-count for what the principle actually says about calibration; would prematurely close Phase 57 with the deliverable un-shipped and the methodology test of Candidate G uninstantiated). Rejected alternative: at scoping, select Option Y (close Phase 57 with known defect; absorb into Phase 58 — was a viable architectural choice but the cycle-3 halt-surface §6 case for Option X was stronger on methodology-integrity grounds, since cycle 3 instantiates Candidate G and exercises the calibration-data threshold case for the reserved-slot principle that Option Y would defer). | Amendment-cycle-3 scoping note §P57-C10 |


§4 Trajectory worth preserving

Discovery-record posture: positions named alongside corrections; alternatives that didn't fire preserved.

Position 1 — Pre-scoping. Phase 32 (the marketing engagement) was the first-line recommendation in both Phase 55 close handoff §9 and Phase 56 close handoff §9. Two consecutive close-handoff recommendations.

Position 2 (v0.1) — Recommendation Candidate I, Shape B. Phase 32 framed as a usage event with bounded substrate tuning. The Field 6 elicitation gap surfaced as the probable Step 0 finding that would drive the "bounded tuning" envelope. Calibration capture identified as the methodology byproduct.

Reshape candidates anticipated at v0.1 → v0.2 (none fired). Operator-reframe to Shape A (pure usage); Operator-reframe to Shape C (bundled prep with §1.3 refactor candidates or Phase 31 plain-terms residue); Step 0 reshape on V2 (Field 6 gap discovered as non-gap); Step 0 reshape on V3 (multi-value handling broken); Operator-reframe to Candidate II or III. None of these reshapes fired at v0.2 absorption.

Position 3 (v0.2) — Confirmatory narrowing; Shape B settled. Step 0 returned State 2 / no halt-condition firings: V0 HOLDS-WITH-DRIFT (two items absorbed as methodology candidates); V1 HOLDS (surface inventory matches manifest v0.41 §1); V2 GAP-CONFIRMED-AS-EXPECTED (Field 6 elicitation absent as predicted); V3 MULTI-VALUE-ACCEPTED (the surface elicits multi-value fields cleanly); V4 POSTURE-GAP minor (the pre-drafted-content posture surfaces minor friction worth capturing but not pre-tuning); V5 HOLDS (Discovery-record terminal-turn path clean); V6 HOLDS (marketing v0.3 content maps cleanly to Fields 1–6); V7 HOLDS (Phase 31 plain-terms residue isolated; doesn't bite Phase 32); V8 HOLDS (OL surface renders). The substrate-evidence-can-re-rationalize-selection pattern did not fire — v0.1 framing was on-target. The trajectory shape is confirmatory narrowing, not reshape. Worth recording as the baseline against which reshape trajectories stand out.

Position 4 (v0.2) — Two methodology candidates surfaced incidentally to V0.

Position 5 (handoff) — P57-D7 elevated to Option A. The silent cleanup of phase-55-step-0 showed Option A is the natural drift. Option A formalizes the convention going forward and applies retroactively to phase-56-step-0 at Phase 57 close.

Carry to v0.42 manifest absorption and v0.21 methodology consolidation:

Amendment cycle 1 — How we got here

The trajectory leading to v0.2 is worth preserving in full for v0.42 manifest absorption and v0.21 methodology consolidation. This is the second build-mode firing of the substrate-friction-discipline-pattern (manifest v0.39 §2); the first such firing since Phase 49 (Step 4 → phase-49-step-4-amendment-scoping-v0_1.md → CR v0.3 → Step 4b — the canonical instance).

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-halt). Local stack readiness friction surfaced (CORS preflight 405 on OL :3001 → engine :8000). Resolved with LOOMWORKS_ENV=development added to local .env. CR §12 gate 5 (live OL stack ready) appeared met. Step 2 ready to begin. Note recorded in the halt-surface: gate 5 was met at the infrastructure layer but had not been validated at the architectural layer; the architectural validation happened only when the Operator looked at the signin surface and named the standing principle.

Position 3 (halt-surface diagnostic). Three findings against the live engine + OL source on the phase-57-marketing-engagement-creation branch:

The principle is correctly embodied in the engine; the contradiction is at the OL client-side gate only. The fix is one-line in scope.

Position 4 (this amendment at v0.2). Narrow OL surface alignment scoped strictly to the signin form entry point. Sub-arc 4 added; one new build step (Step 2a) inserted before the paused Step 2 (renamed Step 2b for clarity). One vitest. Surface text updated. Engine untouched. Audit of sibling OL identity-adjacent surfaces (sign-up, claim, account recovery) queues as a Phase 58+ candidate rather than expanding amendment scope.

The four positions are preserved. Position 1 (no OL changes anticipated) is not erased by Position 4 (one OL change required). Position 1 was correct given the information accessible to Phase 57 scoping at the time; Position 4 corrects with the principle now named and the contradiction identified.

New methodology candidates at amendment cycle 1

Two from the halt-surface; one new at amendment-cycle-1 scoping. All carry to v0.42 manifest absorption and v0.21 methodology consolidation.

Discovery-record bookkeeping at v0.2

Two minor departures from the amendment-cycle-1 handoff §7.2 instruction recorded here for discovery-record posture, both narrow accuracy fixes within sections the handoff labeled "Unchanged."

Both fixes are within the handoff's "Unchanged" interpretation when read as the structure and the commands are unchanged; both fixes correct factual claims that strict prose preservation would render inaccurate. Recording the departures here per the discovery-record posture rather than silently re-writing.

Amendment cycle 2 — How we got here

The trajectory leading to v0.3 is worth preserving in full for v0.42 manifest absorption and v0.21 methodology consolidation. 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). Three-instance evidence within an eight-phase window: 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). 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.

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. 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; cycle-2 halt-surface §6 Candidate E positive observation). Diagnostic exchange returned 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 (CRV-B1 through CRV-B6) for the cycle-2 scoping chat.

Position 7 (this amendment at v0.3). 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 / shared) is determined at CRV-B execution 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.

New methodology candidates at amendment cycle 2

Three candidates added at cycle 2 (two from the cycle-2 halt-surface §6; one new at cycle-2 scoping) plus the cycle-1 Candidate C reaching three-instance evidence. All carry to v0.42 manifest absorption and v0.21 methodology consolidation. Phase 57 close carries thirteen methodology candidates in total per P57-B9.

In addition, the v0.2 amendment-cycle-1 CR drafting produced a methodology observation that carries to v0.21 / v0.42 (cycle-2 halt-surface §6 Candidate 10): the CR-amendment-drafting-prose-overclaim observation — strict-preservation prose can produce factual inaccuracies when the underlying state has changed; "Unchanged" instructions need a finer-grained reading at sections affected by the amendment. Cycle 2 applies the discipline preemptively (see §8 backwards-compat language and §16 test count language — both avoid claiming byte-identical existing behavior where Sub-arc 5 wire-path semantics may alter what existing tests assert).

Discovery-record bookkeeping at v0.3

The cycle-2 handoff §7.2 instructs preserving v0.2's section order and numbering; insert sub-sections rather than reorganizing. Per cycle-1 methodology candidate 10 (CR-amendment-drafting-prose-overclaim discipline), several sections the handoff lists as appendable (not edited in place) need narrow factual updates where Sub-arc 5 alters claims that would otherwise carry from v0.2 verbatim:

These updates apply cycle-1 methodology candidate 10's discipline: amendment-cycle CR-drafting prose should default to "+N net tests; existing test scope reviewed at execution time" rather than claiming byte-identical existing test behavior when the amendment may alter wire-path semantics. Recording the discipline application here per discovery-record posture.

Amendment cycle 3 — How we got here

The trajectory leading to v0.4 is worth preserving in full for v0.42 manifest absorption and v0.21 methodology consolidation. This is the fourth build-mode firing of the substrate-friction-discipline-pattern (manifest v0.39 §2; manifest v0.41 §1 reframed as structural rather than coincidental) and the third within a single phase. Five-instance evidence across two phases and a nine-phase window: Phase 49 Step 4 → Phase 49 Step 4 amendment scoping → CR v0.3 → Step 4b (canonical cross-phase instance); Phase 57 amendment cycle 1 (Sub-arc 4 OL signin alignment); Phase 57 amendment cycle 2 (Sub-arc 5 route-to-substrate binding); Phase 57 amendment cycle 3 (this — Sub-arc 6 response-shape engagement). The three-within-one-phase profile is structurally novel — prior instances of the pattern fired once per phase. The reserved-slot pre-commitment design fires at and beyond its calibration threshold: both reserved slots consumed at cycles 1 and 2; cycle 3 expands reserved budget explicitly per P57-C10 with the gate honored, not circumvented.

The cycle-3 trajectory is worth preserving in full. Positions 1–7 are carried forward from the cycle-2 trajectory and extended.

Position 8 — Cycle-3 halt-surface diagnostic (this halt). Step 2b live usage at /operator/create-engagement post-Sub-arc-5: surface loads cleanly (Sub-arc 5 fix landed — banner present at ChatView.tsx:254, scrollback empty per Sub-arc 5c history-fetch skip working). Sub-arc 5f's lightweight post-fix confirmation PASSED at wire-path scope (engine token counts on Companion turns — [4,532 in · 80 out · 4,612 total] and [4,542 in · 71 out · 4,613 total] per cycle-3 halt-surface §2 — prove engine receipt of real OL POST bodies including the Sub-arc 5c intent_hint). Live usage FAILED: the twelve-turn transcript in cycle-3 halt-surface §2 reproduces cycle-2 halt-surface §2.1 verbatim shape — Companion opening turn is general-purpose opener; "capital of NZ""Wellington" reproduced exactly; "parked on Level 13""I'll remember that" surfaced quick-capture-engagement behavior (positive evidence for Phase 58+ but wrong engagement class for Phase 57's target). Three candidate root layers enumerated at halt-surface §3 (A: stale OL bundle, weakened by §2.1 bullet 5 but not closed; B: engine intent_hint not honored at a subtler level than Sub-arc 5b verified; C: template-selection downstream of classification — a fourth root layer cycle-2's CRV-Bs structurally didn't enumerate, itself a halt-class trigger per v0.3 §11). Halt-surface §4 architectural reframing: substrate-engagement is a four-layer chain (present → classified → template-selected → response-shaped); cycle 2 audited layers 1–2; live failure surfaces at layer 3 or 4. Candidate G named at halt-surface §5 (post-fix-confirmation-can-pass-while-live-usage-fails-when-confirmation-scope-is-narrower-than-usage-surface); single-instance evidence at halt time. §6 enumerated three Operator-elective paths (Option X amendment cycle 3 / Option Y close with known defect / Option Z halt-stay).

Position 9 — Cycle-3 scoping (this amendment at v0.4). Sub-arc 6 added; one new build step (Step 2d) inserted between Step 2c (cycle-2 Sub-arc 5, complete) and Step 2b (live usage event, still paused). Investigation envelope absorbs the layer-3-or-4 question; diagnostic-first execution per Candidate F precedent extended with recursive-aperture-widening property; Sub-arc 6f post-fix confirmation re-scoped per Candidate G to live-usage scope. Reserved budget explicit-authorization gate fires and is granted per P57-C10. Candidate H named (reserved-slot-pre-commitment-as-calibrable-not-fixed) — the principle's "calibrated to worst-case observed" framing at v0.39 §2 needs calibration-window cardinality. Marvin's Option X selection at scoping-chat open against the halt-surface §6 X / Y / Z space is the explicit-authorization event; Option Y (close with known defect) and Option Z (halt-stay) are recorded as the rejected alternatives at P57-C10. The fix shape (layer 3 only / layer 4 only / both / re-opened layer 2) is determined at CRV-C execution time, not pre-decided here per P57-C2. At least one new test pins the corrected response-shape engagement at layer-3-or-4 scope per P57-C4. Scope explicitly does NOT include broader Phase 41/42/55/56 substrate audit (queued as Phase 58+ candidate alongside cycle-1's OL surface-vs-contract audit and cycle-2's OL route-to-substrate runtime-binding audit).

The nine positions are preserved. Position 1 (no OL changes anticipated) is not erased by Positions 7/9 (three OL changes required across cycles 1/2/3). Position 7 (Sub-arc 5 alone resolves runtime-binding) is not erased by Position 9 (response-shape engagement is a distinct downstream layer; Sub-arc 5 was scoped to fix wire-binding at layer 2 and could not have caught the layer-3-or-4 failure). The progression Position 1 → 4 → 7 → 9 traces substrate-friction-discipline-pattern firing three times within a single phase, each time at a deeper layer of the substrate-engagement chain.

Discovery-record observation extending cycle-2's substrate-presence-is-not-substrate-engagement. Cycle-2 named substrate-presence (Step 0 aperture) as distinct from substrate-engagement (route-to-substrate runtime binding). Cycle-3 surfaces that substrate-engagement is itself decomposable: presence → classified → template-selected → response-shaped, per cycle-3 halt-surface §4. Cycle 2's framing (substrate-presence-vs-substrate-engagement) was correct about the existence of an engagement boundary but treated engagement as a single boundary; cycle 3 names it as a four-layer chain. Each layer is a verification surface; cycle 2's CRV-Bs probed layers 1–2; cycle-3's CRV-Cs probe layers 3–4. The four-layer framing carries to v0.21 as a sharpening of Candidate D (per-route-companion-routing-not-asserted-at-step-0) — Step 0's aperture extension question is now per-layer rather than per-route.

New methodology candidates at amendment cycle 3

Two new candidates added at cycle 3 (Candidate G sharpened from single-instance halt-evidence to two-confirmation-surface evidence; Candidate H named for the first time at cycle-3 scoping) plus Candidate F extended to recursive-aperture-widening property plus Candidate C reaching four-instance-within-Phase-57 + five-instance-across-Loomworks evidence. All carry to v0.42 manifest absorption and v0.21 methodology consolidation. Phase 57 close carries fifteen methodology candidates in total per P57-C9.

(Halt-surface candidates A/B/C/D/E/F/G plus carry-forwards from cycle-2 plus pre-build candidates 1–6 plus Candidate 10 plus Candidate H now total fifteen candidates per P57-C9. v0.42 manifest absorption will record both the count and the cardinality-class observation about within-phase recurrence; v0.21 will consolidate.)

Discovery-record bookkeeping at v0.4

The cycle-3 amendment-handoff instructs preserving v0.3's section order and numbering; insert sub-sections rather than reorganizing. Per cycle-1 methodology candidate 10 (CR-amendment-drafting-prose-overclaim discipline), several sections need narrow factual updates where Sub-arc 6 alters claims that would otherwise carry from v0.3 verbatim:

These updates apply cycle-1 methodology candidate 10's discipline at cycle 3. The cycle-3 application is itself a methodology-candidate-10 instance — the cycle-3 handoff's "preserve cycle-2 section order; insert v0.4-specific subsections" instruction would, if applied literally, miss that Sub-arc 6 alters the test-count and close-protocol claims cycle 2 made. Recording the discipline application here per discovery-record posture.


§5 Substrate surfaces shipped

Sub-arc 1 — Field 6 elicitation prompt authoring

1a. Field 6 per-field elicitation prompt component.

1b. field_coverage map extension.

1c. Active-template scaffolding update.

1d. Test exercising new prompt component loading.

1e. (Not anticipated.) Loader extension. Only required if CRV-4 reveals the loader is hardcoded to specific keys. Default expectation per V1: loader handles arbitrary keys; no loader change needed.

Sub-arc 2 — Usage event (live conversation)

Not substrate work; Operator-paced. Documented here for CR completeness.

Sub-arc 3 — Calibration capture + observation capture

3a. Real-Operator transcript fixture.

3b. Calibration-gated tests.

3c. Implementation notes document.

Sub-arc 4 — OL surface alignment with engine identity contract (added at amendment cycle 1)

Three substantive components plus one new vitest. All OL-side. Engine substrate is correct and untouched. The work resolves the cycle-1 halt-surface finding: the OL signin form's client-side empty-email guard contradicts the engine's WebAuthn discoverable-credential identity contract and the standing DUNIN7 principle that email must not be used for identity.

CR-amendment-cycle-1-time verifications CRV-A1 through CRV-A8 (specified in §10 Step 2a pre-flight) supplied exact paths, line numbers, constant locations, and existing test conventions at amendment-cycle-1 execution time. All CRV-A held; Sub-arc 4 components 4a/4b/4c/4d landed at OL commit e435b30.

4a. Signin form empty-email guard removal.

``` if (!email.trim()) { setLocalError(SIGNIN.emailEmptyError); return; } ``` Replaced with: proceed to submission unconditionally (no email-required gate at the client). The engine accepts the empty-email POST cleanly per cycle-1 halt-surface Finding 1 and runs the WebAuthn discoverable-credential path.

4b. POST body construction.

```ts const body = email.trim() ? { email: email.trim() } : {}; ``` Exact TypeScript idiom selected at amendment-cycle-1-execution time within the existing file's style. Engine accepts {} cleanly per cycle-1 halt-surface Finding 1 — LoginBeginRequest.email: str | None = None, so an absent field and a null field are equivalent under Pydantic.

4c. Field surface text — optionality indication.

4d. Vitest pinning the corrected discoverable-credential path.

Sub-arc 5 — Route-to-substrate runtime binding for /operator/create-engagement (new at amendment cycle 2)

Diagnostic-first execution per P57-B2. The cycle-2 halt-surface produced ONE finding (the runtime binding is broken between /operator/create-engagement and the Phase 55/56 creation-flow substrate) plus SIX diagnostic items (CRV-B1 through CRV-B6); the cycle-2 scoping note settles the investigation envelope and execution posture, NOT the fix layer or fix shape. CR-amendment-cycle-2-time verifications CRV-B1 through CRV-B6 (specified in §10 Step 2c pre-flight) run at amendment-cycle-2 execution time and produce a diagnostic findings document that drives the production fix. The architectural artifact for cycle 2 is the diagnostic findings document at Sub-arc 5b, NOT this CR section — this section describes the diagnostic-first posture and the provisional 5a–5f decomposition; post-CRV-B specifics are execution-time work recorded in the diagnostic findings document and implementation notes.

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 §11 halt-thresholds. 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).

5a. Diagnostic phase (CRV-B1 through CRV-B6 from cycle-2 halt-surface §4).

5b. Diagnostic findings document.

5c. Runtime-binding fix.

5d. Scrollback isolation fix.

5e. Test surface — at least one test pinning the corrected wire path.

5f. Local stack restart + lightweight post-fix confirmation.

Sub-arc 6 — Response-shape engagement for /operator/create-engagement (new at amendment cycle 3)

Diagnostic-first execution per P57-C2 with Candidate F recursive-aperture-widening extension. The cycle-3 halt-surface produced ONE finding (Step 2b live usage fails at the response-shape engagement layer despite Sub-arc 5's wire-binding fix landing correctly and Sub-arc 5f confirming wire-path engagement) plus FIVE OR SIX diagnostic items (CRV-C1 through CRV-C5/6; envelope cardinality settled at execution time per the four-layer framing plus secondary checks); the cycle-3 scoping note settles the investigation envelope, execution posture, and confirmation-scope discipline, NOT the fix layer or fix shape. CR-amendment-cycle-3-time verifications CRV-C1 through CRV-C5/6 (specified in §10 Step 2d pre-flight) run at amendment-cycle-3 execution time and produce a diagnostic findings document that drives the production fix and explicitly cross-references Sub-arc 5b findings at matching layers. The architectural artifact for cycle 3 is the Sub-arc 6b diagnostic findings document, NOT this CR section — this section describes the diagnostic-first posture and the provisional 6a–6f decomposition; post-CRV-C specifics are execution-time work recorded in the diagnostic findings document and implementation notes.

The provisional decomposition below mirrors cycle-2 Sub-arc 5's shape; CRV-C-driven adjustments absorb at execution time per the §11 halt-thresholds. Components may collapse (e.g. 6c + 6d into one commit if findings indicate same layer) or expand (e.g. 6c into 6c-engine + 6c-OL if shared-fix shape; or 6c into 6c-layer-3 + 6c-layer-4 if both layers carry fixes).

6a. Diagnostic phase (CRV-C1 through CRV-C5/6 from cycle-3 halt-surface §3 + §4).

6b. Diagnostic findings document.

6c. Response-shape engagement fix.

6d. Secondary fixes.

6e. Test surface — response-shape pinning.

6f. Local stack restart + live-usage-scoped post-fix confirmation, per Candidate G.

Unchanged substrate surfaces (engine)

Cited verbatim for clarity; the CR does not modify these in Sub-arc 1 nor in cycle-1 Sub-arc 4. Cycle-2 Sub-arc 5 MAY touch these surfaces — diagnostic findings determine which. The cycle-2 CR does NOT claim these surfaces are byte-identical-stable across Sub-arc 5 per cycle-1 methodology candidate 10's CR-amendment-drafting-prose-overclaim discipline.

Unchanged substrate surfaces (OL)

Cited verbatim for clarity. Cycle-2 Sub-arc 5 MAY touch these surfaces — diagnostic findings determine which. Per cycle-1 methodology candidate 10's discipline, byte-identical-stable claims are deferred to execution-time review.

Engine substrate is unchanged at amendment cycle 1. Sub-arc 4 is OL-only. No engine endpoint, no engine schema, no Memory event, no _ANCHOR_PRIORITY entry, no Alembic migration. SignupBeginRequest, LoginBeginRequest, PersonRow, begin_signup, and the /auth/login/complete lookup-by-credential_id path all stay as cycle-1 halt-surface Finding 1 documented them.

Engine substrate at amendment cycle 2: may or may not change. Sub-arc 5 may touch engine surfaces (classifier semantics, classifier context, dispatcher branching, converse flow handler scoping) per CRV-B findings. Alembic head stays at 0064 across all candidate fix shapes (§11 halt condition: any migration consumed by Sub-arc 5 would re-open scoping). No Memory event, no _ANCHOR_PRIORITY entry, no endpoint added by Sub-arc 5.


§6 What Phase 57 does NOT deliver

Per scoping v0.2 §What Phase 57 does NOT deliver:

Added at amendment cycle 1:

Added at amendment cycle 2:


§7 Test strategy

Tests must pass at Checkpoint A (substrate gate, extended at amendment cycle 1 to cover Step 2a OL substrate; extended further at amendment cycle 2 as Checkpoint A2 to cover Step 2c Sub-arc 5 fix and lightweight-confirmation observation; extended further at amendment cycle 3 as Checkpoint A3 to cover Step 2d Sub-arc 6 fix and live-usage-scoped Sub-arc 6f confirmation per Candidate G) and Checkpoint B (final gate). The calibration-gated tests are confirmed to pass locally with LOOMWORKS_RUN_CALIBRATION=1 and confirmed to skip without it before close.


§8 Backwards-compatibility

Amendment cycle 1 backwards-compat summary. Existing 149 OL vitest stay green; the new vitest pins the corrected behavior; engine substrate is untouched so all engine backwards-compat carries. The OL signin form remains functionally compatible with previously-registered passkey credentials — narrowing allowCredentials via a supplied email continues to work, and the new empty-email path activates the engine's existing discoverable-credential branch. No data migration, no client-side state migration, no API contract change.

Amendment cycle 2 backwards-compat (qualified pending CRV-B findings). Per cycle-1 methodology candidate 10's CR-amendment-drafting-prose-overclaim discipline, byte-identical-stable existing-test-behavior claims for Sub-arc 5 are deferred to execution-time review. The cycle-2 fix may touch the OL converse-submission path (most likely root cause per cycle-2 halt-surface §4.5), the engine classifier semantics or classifier context-scoping, the dispatcher branching, or the converse flow handler scoping — depending on what CRV-B1 through CRV-B6 surface as the root layer. Each of these surfaces interacts with existing test coverage in different ways:

The diagnostic findings document (Sub-arc 5b) names the specific existing-test interactions surfaced; the implementation notes record the as-shipped existing-test adjustments and rationale. The CR does NOT pre-commit to byte-identical existing behavior at v0.3 because such a claim could be falsified at CRV-B execution time and the cycle-1 methodology candidate 10 discipline applies.

Amendment cycle 3 backwards-compat (qualified pending CRV-C findings). Per cycle-1 methodology candidate 10's CR-amendment-drafting-prose-overclaim discipline (cycle-2 sharpening that it fires at handoff drafting too), byte-identical-stable existing-test-behavior claims for Sub-arc 6 are deferred to execution-time review. The cycle-3 fix may touch the engine template-selection layer (prompt.py:817 dispatcher; _load_intent_instruction at prompt_assets.py), the engine response-shape rendering layer (assemble_prompt return / converse-handler response construction), the OL ChatView.tsx at a deeper layer than Sub-arc 5c (if Candidate A surfaces as HMR-or-bundle-stale at the response-shape rendering site), or a re-opened layer 2 (if CRV-C5 surfaces a Sub-arc 5b finding's narrower-than-needed scope) — depending on what CRV-C1 through CRV-C5/6 surface as the root layer across the four-layer chain. Each of these surfaces interacts with existing test coverage in different ways:

The Sub-arc 6b findings document names the specific existing-test interactions surfaced (with explicit cross-reference to Sub-arc 5b findings at matching layers per P57-C2); the implementation notes record the as-shipped existing-test adjustments and rationale. The CR does NOT pre-commit to byte-identical existing behavior at v0.4 because such a claim could be falsified at CRV-C execution time and the cycle-1 methodology candidate 10 discipline applies (with cycle-2 sharpening).


§9 FORAY hooks

No new surfaces. No new MemoryObject subclass; no new _ANCHOR_PRIORITY entry; no new endpoint. Existing FORAY surfaces (Phase 16 upload anchors; Phase 53 discovery_to_seed_extracted anchor at priority "standard"; standard induct_seed anchor) carry the Discovery-record path unchanged.

Amendment cycle 1 touches no Memory event, no _ANCHOR_PRIORITY entry, no engine endpoint, no FORAY hook. The signin path is the WebAuthn flow at the auth boundary; it does not write Memory events of its own. FORAY surfaces are unchanged at v0.2.

Amendment cycle 2 touches no FORAY hook. Sub-arc 5 is a runtime-binding fix between OL converse submission and engine classification — neither layer writes new Memory events of its own, and the existing converse Memory event surfaces (Phase 42 reconciler coverage; Phase 55 creation-flow Memory anchors) are unchanged. FORAY surfaces are unchanged at v0.3.

Amendment cycle 3 touches no FORAY hook. Sub-arc 6 is a response-shape engagement fix at the engine template-selection or response-shape rendering layer (or possibly an OL deeper-layer fix per CRV-C findings) — none of these write new Memory events of their own, and the existing converse Memory event surfaces remain unchanged. FORAY surfaces are unchanged at v0.4.


§10 Build steps

Seven active steps + one new step (Step 2d) inserted at amendment cycle 3 + two reserved buffer slots (both consumed at cycles 1/2) + explicit reserved-budget expansion authorization at cycle 3 per P57-C10. Reserved-slot-as-halt-condition-pre-commitment per manifest v0.39 §2; both Phase 57 slots were consumed at cycles 1/2 (Step 6 by Sub-arc 4 at cycle 1; Step 7 by Sub-arc 5 at cycle 2); cycle 3 expands reserved budget via the explicit Operator-elective authorization gate firing per P57-B10 and being granted per P57-C10. First phase to fire the explicit-authorization gate. Methodology candidate C captures the within-phase recurrence at four-instance evidence within Phase 57 (cycles 1/2/3); the v0.21 promotion threshold is cleared with strong margin; the within-phase recurrence pattern is structurally novel per P57-C9. Methodology candidate H captures the principle-is-calibrable observation as cycle-3 calibration data.

Auto-mode posture: Step 0 + Step 1 auto-proceed. Checkpoint A halts before Step 2 and extends at amendment cycle 1 to cover Step 2a (Sub-arc 4) completion; at amendment cycle 2 Checkpoint A extends further to Checkpoint A2 to cover Step 2c (Sub-arc 5) lightweight-confirmation observation; at amendment cycle 3 Checkpoint A extends further to Checkpoint A3 to cover Step 2d (Sub-arc 6) live-usage-scoped-confirmation observation per Candidate G — Operator confirms substrate (Field 6) AND Sub-arc 4 fix AND Sub-arc 5 fix (route-to-substrate binding at wire-path scope) AND Sub-arc 6 fix (response-shape engagement at live-usage scope) before Step 2b live usage proceeds. The Operator-confirmation surface at Checkpoint A3 is the Sub-arc 5b findings document + Sub-arc 6b findings document + the live-usage-scoped Sub-arc 6f confirmation observation per Candidate G. Steps 2b–4 are Operator-paced (Step 2b is the live conversation; Steps 3/4 are CC capture). Checkpoint B (final) halts before tagging.

Step 0 — Pre-flight + CR archival + build branch

Status at amendment cycle 2. DONE pre-cycle-1-halt. CR archival path updates from v0_2 to v0_3 at amendment-cycle-2 execution time (CC re-archives the amended CR; preserves v0_1 + v0_2 alongside as superseded).

What. Standard pre-flight. CC archives this CR to engine repo at docs/phase-crs/phase-57-cr-marketing-engagement-creation-v0_3.md (preserves phase-57-cr-marketing-engagement-creation-v0_1.md and phase-57-cr-marketing-engagement-creation-v0_2.md alongside as superseded). Confirms baseline tags, test counts, Alembic head. Creates branch phase-57-marketing-engagement-creation from main on engine and OL repos. (Branch already exists pre-amendment-cycle-2-resume; CC re-archives the CR on the existing branch.)

Pre-flight reads. CR-time deltas — exact strings, file paths, signatures, naming conventions that scoping-time Step 0 didn't enumerate and that the CR drafter could not verify from Claude.ai. CC ran these against the live engine repo at the original Step 0 of the build cycle; all CRV-1 through CRV-8 verdicts captured. Naming-only divergences absorbed in-flight; no architectural divergences fired.

CR archival. Copy this CR file to engine repo docs/phase-crs/phase-57-cr-marketing-engagement-creation-v0_3.md (preserving v0_1 + v0_2 alongside as superseded).

Branch creation. git checkout -b phase-57-marketing-engagement-creation on engine and OL (already in place at amendment-cycle-2 resume).

Mode posture. Auto-proceed.

Acceptance gate. All eight CRV verdicts captured. Branch present on both repos. CR archived (v0_3 alongside v0_1 + v0_2). Baseline tag + test counts + Alembic head confirmed against cycle-2 handoff §2.

Halt threshold. Any CRV produces an architectural divergence (not naming-only) → halt-surface note + Operator-elective amendment cycle in a fresh Claude.ai chat. (None fired at original Step 0.) Baseline divergence (test count off by more than ±2 routine noise; Alembic head different; working tree dirty; tag missing) → halt before any further work.

Time. ~10 min for CR re-archival at cycle-2 resume.

Step 1 — Field 6 prompt authoring (sub-arc 1)

Status at amendment cycle 2. DONE pre-cycle-1-halt. Engine substrate at a00f4a3 on the build branch; +1 always-run test added (2,280 always-run total); +1 calibration-gated and +1 additional gated test (32 skipped total) per the cycle-1 halt-surface §6 state-at-halt record. Unchanged at cycle 2.

What. Authored additional_assertions.md per 1a. Extended field_coverage map per 1b. Updated active-template per 1c. Added +1 test per 1d.

Build (executed pre-cycle-1-halt).

Tests. +1 always-run.

Mode posture. Auto-proceed. (Done.)

Acceptance gate. New prompt file present at the specified path with ~11 lines following Phase 56 structural shape. field_coverage map carries the new entry. Active-template Companion-judgement site references Field 6. New test green. Existing 2,279 tests still green. Lint clean. Satisfied at engine a00f4a3.

Time. ~30 min. (Done.)

Step 2a — OL signin alignment (sub-arc 4 — added at amendment cycle 1)

Status at amendment cycle 2. DONE at amendment cycle 1. OL Sub-arc 4 substrate at OL e435b30 on the build branch; +1 OL vitest added (150 OL vitest total). All CRV-A1 through CRV-A8 held; Sub-arc 4 components 4a/4b/4c/4d landed at the verified file locations. Unchanged at cycle 2.

What (executed at amendment cycle 1). Removed the empty-email guard at the OL signin form (per Sub-arc 4a); omitted the email field from the /auth/login/begin POST body when empty (per Sub-arc 4b); updated field surface text (label / placeholder / helper) to indicate optionality (per Sub-arc 4c); added one vitest pinning the corrected discoverable-credential path (per Sub-arc 4d). Deleted the now-orphan SIGNIN.emailEmptyError constant per CRV-A2 disposition (or left orphaned-but-harmless — as-shipped disposition in implementation notes).

Pre-flight reads (executed at amendment cycle 1). CR-amendment-cycle-1-time verifications CRV-A1 through CRV-A8 per cycle-1 handoff §8. CC ran these against the live OL repo on branch phase-57-marketing-engagement-creation at 2cc0ebc. All HELD.

Build (executed at amendment cycle 1).

Tests. +1 OL vitest. OL vitest count 149 → 150.

Mode posture. Auto-proceed. (Done.)

Acceptance gate. All four Sub-arc 4 components landed at the verified file locations. The new vitest passes; existing 149 OL vitest still pass; lint/tsc/build clean on OL. OL vitest count 150 (was 149). Implementation notes capture the as-shipped surface-text strings and the SIGNIN.emailEmptyError constant disposition. Satisfied at OL e435b30.

Time. ~30 min. (Done.)

Step 2c — Route-to-substrate runtime binding (sub-arc 5 — new at amendment cycle 2)

What. Run CRV-B1 through CRV-B6 as Sub-arc 5a; file the diagnostic findings document as Sub-arc 5b; implement the runtime-binding fix as Sub-arc 5c (and possibly Sub-arc 5d collapsed); add at least one test pinning the corrected wire path as Sub-arc 5e; restart the local stack and lightweight-confirm as Sub-arc 5f.

Pre-flight reads. CR-amendment-cycle-2-time diagnostic verifications CRV-B1 through CRV-B6 per cycle-2 handoff §8. CC runs these against live engine + OL on branch heads (phase-57-marketing-engagement-creation at the cycle-2 halt-surface engine commit; OL at e435b30). Naming-only divergences (line numbers shifted; file paths slightly different from cycle-2 halt-surface §4's literal cites; constant names slightly different) absorb in-flight. Architectural divergences (a fourth root layer the §4 diagnostics didn't anticipate; all six CRV-Bs return HOLDS meaning substrate IS engaged but response shape is wrong for another reason; fix requires migration or Phase 42/55 semantic change) halt and surface a follow-on phase-57-halt-surface-2026-05-12-step-2c-v0_1.md (or whatever the calendar date at halt time is) note in engine repo docs/phase-impl-notes/.

The six CRV-B diagnostics, verbatim from cycle-2 halt-surface §4:

After CRV-B1 through CRV-B6, CC writes the diagnostic findings document at docs/phase-impl-notes/phase-57-step-2c-diagnostic-findings-v0_1.md. The findings drive Sub-arc 5c (fix), Sub-arc 5d (scrollback fix, possibly collapsed), and Sub-arc 5e (test surface). The CR does NOT pre-decide the fix layer or fix shape — the diagnostic findings document is the architectural artifact (P57-B2).

Build.

Tests. Floor: +1 net test. Ceiling: +1 OL vitest + +1 engine test. As-shipped counts at Phase 57 close per the diagnostic findings document.

Mode posture. Auto-proceed for diagnostics + findings filing + fix + lightweight post-fix confirmation. Checkpoint A2 extends Checkpoint A — Operator confirms Sub-arc 5 fix (route-to-substrate binding works at lightweight-confirmation level) via the diagnostic findings document + Sub-arc 5f observation before Step 2b proceeds.

Acceptance gate. All six CRV-B verdicts captured in the diagnostic findings document at docs/phase-impl-notes/phase-57-step-2c-diagnostic-findings-v0_1.md. Sub-arc 5c fix landed at the layer the findings document identifies. Sub-arc 5d scrollback fix landed (possibly collapsed into 5c). Sub-arc 5e test surface added (≥+1 net test). Sub-arc 5f lightweight post-fix confirmation observation captured: submitting a creation-flow opener from /operator/create-engagement engages create_engagement_entry 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. Implementation notes capture as-shipped fix surfaces, test counts, and any existing-test adjustments. Lint/tsc/build clean on OL; engine tests green.

Halt threshold (Step 2c). Per §11. Highlights: any CRV-B verification produces an architectural divergence beyond the enumerated diagnostic space; Sub-arc 4 or Step 1 substrate state has drifted since cycle-1 close (engine HEAD or OL HEAD differs from the cycle-1-close commit); CRV-B findings produce a fix shape requiring migration (Alembic head would advance beyond 0064); CRV-B findings produce a fix shape touching Phase 41/42/55 substrate beyond cosmetic/parameter-shape edits; lightweight post-fix confirmation (Sub-arc 5f) fails; test count divergence beyond ±1 from CRV-B prediction; any reserved buffer expansion required.

Time. Sub-arc 5a (diagnostics): ~20–40 min depending on findings depth. Sub-arc 5b (findings doc): ~15 min. Sub-arc 5c (fix): ~15–45 min depending on layer scope. Sub-arc 5d (scrollback): may collapse with 5c. Sub-arc 5e (test): ~15–30 min depending on harness. Sub-arc 5f (confirmation): ~5–10 min. Total: ~70–150 min depending on findings.

Step 2d — Response-shape engagement fix (sub-arc 6 — new at amendment cycle 3)

What. Run CRV-C1 through CRV-C5/6 as Sub-arc 6a; file the diagnostic findings document with cross-reference to Sub-arc 5b as Sub-arc 6b; implement the response-shape engagement fix as Sub-arc 6c (and possibly Sub-arc 6d for layer-adjacent ripples); add at least one test pinning the corrected response shape as Sub-arc 6e per P57-C4 floor; restart the local stack and live-usage-scope-confirm as Sub-arc 6f per P57-C3 + Candidate G.

Pre-flight reads. CR-amendment-cycle-3-time diagnostic verifications CRV-C1 through CRV-C5/6 per cycle-3 amendment handoff. CC runs these against live engine + OL on branch heads (phase-57-marketing-engagement-creation at engine HEAD 771aacd; OL at e56ede0). Cycle-3-scoping-time test re-baseline: engine 2,279 pass + 1 fail + 32 skip (the one failing test is tests/test_api_assertion_retract.py::test_api_assertion_retract, halt-surface §10 finding 7.2 dependency-drift carryforward; accepted out-of-scope at Sub-arc 5f close and at cycle 3 unless CRV-C surfaces a connection); OL 151 vitest pass per Sub-arc 5e landed at OL e56ede0. CC re-runs at Step 2d open and confirms no divergence; any divergence beyond finding 7.2's known footprint halts and surfaces (cycle-3 baseline is invalid). Naming-only divergences (line numbers shifted; file paths slightly different from cycle-3 halt-surface §3's literal cites; constant names slightly different) absorb in-flight. Architectural divergences (a fifth root layer the §4 four-layer framing didn't anticipate; all CRV-Cs return HOLDS at the layer they probe but response shape is still general_conversation for a reason outside the four-layer framing — would imply the framing itself is incomplete; fix requires migration or Phase 41/42/55/56 semantic change) halt and surface a follow-on halt-surface note in engine repo docs/phase-impl-notes/.

The CRV-C diagnostic envelope — five core items with a sixth (CRV-C6) settling the test-harness decision; envelope cardinality may grow at execution time per CRV-C-driven adjustments:

After CRV-C1 through CRV-C5/6, CC writes the diagnostic findings document at docs/phase-impl-notes/phase-57-step-2d-diagnostic-findings-v0_1.md. The findings drive Sub-arc 6c (fix), Sub-arc 6d (layer-adjacent secondary fix; possibly collapsed into 6c), Sub-arc 6e (test surface per P57-C4 floor / P57-C7 ceiling), and Sub-arc 6f (live-usage-scoped confirmation per Candidate G). The CR does NOT pre-decide the fix layer or fix shape — the Sub-arc 6b findings document is the architectural artifact (P57-C2 extends P57-B2 with recursive-aperture-widening).

Build.

Tests. Floor: +1 net test (per P57-C4 floor + P57-C7 floor). Ceiling: +2 net tests if shared-fix shape AND e2e harness lands per P57-C7 ceiling. As-shipped counts at Phase 57 close per the Sub-arc 6b findings document. Cycle-3 baseline carries finding 7.2's pre-existing fail; the cycle-3 test count predictions in §16 reflect the 2,279 pass + 1 fail framing unless CRV-C surfaces a connection to the dependency-drift surface.

Mode posture. Auto-proceed for diagnostics + findings filing + fix + live-usage-scoped post-fix confirmation. Checkpoint A3 extends Checkpoint A2 — Operator confirms Sub-arc 6 fix (response-shape engagement works at live-usage scope per Candidate G) via the Sub-arc 6b findings document + Sub-arc 6f live-usage-scoped observation before Step 2b proceeds.

Acceptance gate. All CRV-C verdicts captured in the Sub-arc 6b findings document at docs/phase-impl-notes/phase-57-step-2d-diagnostic-findings-v0_1.md, with explicit cross-reference to Sub-arc 5b findings at matching layers. Sub-arc 6c fix landed at the layer the Sub-arc 6b findings document identifies. Sub-arc 6d secondary fixes landed (possibly collapsed into 6c). Sub-arc 6e test surface added (≥+1 net test per P57-C4 floor) pinning corrected response shape per P57-C3 framework. Sub-arc 6f live-usage-scoped post-fix confirmation observation captured: submitting a creation-flow opener from /operator/create-engagement produces a Companion response classified through create_engagement_entry AND template-selected through the creation-flow template path AND rendered as creation-flow scaffolding, NOT general_conversation. Implementation notes capture as-shipped fix surfaces, test counts, existing-test adjustments, and the Sub-arc 6f confirmation observation. Lint/tsc/build clean on OL; engine tests carry baseline finding 7.2 status unless CRV-C resolves it.

Halt threshold (Step 2d). Per §11. Highlights: any CRV-C verification produces an architectural divergence beyond the enumerated diagnostic space (a fifth root layer the §4 four-layer framing didn't anticipate; all CRV-Cs return HOLDS at the layer they probe but response shape is still general_conversation for a reason outside the framing — would imply the framing itself is incomplete; would be a v0.21 candidate-shape revision); Sub-arc 4 or Sub-arc 5 or Step 1 substrate state has drifted since cycle-2 close (engine HEAD differs from 38d0008 cycle-2 baseline; OL HEAD differs from e56ede0); CRV-C findings produce a fix shape requiring migration (Alembic head would advance beyond 0064); CRV-C findings produce a fix shape touching Phase 41/42/55/56 substrate beyond cosmetic/parameter-shape edits (would re-open Phase 42/55/56 scope; broader than cycle-3 envelope); live-usage-scoped Sub-arc 6f post-fix confirmation fails — a fourth amendment cycle would breach P57-C10's explicit-authorization scope and would itself be a halt-and-surface condition; test count divergence beyond ±1 from CRV-C prediction.

Time. Sub-arc 6a (diagnostics across four layers): ~30–60 min depending on findings depth — wider aperture than Sub-arc 5a. Sub-arc 6b (findings doc with cross-reference): ~20 min. Sub-arc 6c (fix): ~20–60 min depending on layer scope. Sub-arc 6d (secondary fixes): may collapse with 6c. Sub-arc 6e (test): ~20–45 min depending on harness (e2e harness landing as new file is longer). Sub-arc 6f (live-usage-scoped confirmation): ~10–20 min (wider scope than Sub-arc 5f). Total: ~100–205 min depending on findings.

Step 2b — Live usage event (sub-arc 2; was Step 2 in v0.1; renamed at cycle 1; paused since cycle-1 close)

Status at amendment cycle 3. Paused at cycle-3 halt; resumes after Step 2d clears Checkpoint A3. Unchanged in shape from v0.3.

What. Operator runs the marketing engagement creation. CC ensures local stack ready, observes the conversation, captures the live conversation log for fixture creation at Step 3.

Build (Operator-paced).

Tests. 0 new (the live event is the exercise).

Mode posture. Operator-paced.

Acceptance gate. Marketing engagement live in the local engine database. Engagement appears in /operator engagement list. Discovery record visible in Memory. Candidate seed produced. Induction pass clean. Marketing v0.3 content (Fields 1–6 with eight Field-6 entries) fully reflected in the inducted seed.

Halt threshold.

Step 3 — Calibration capture (sub-arc 3a/3b)

Status at amendment cycle 2. Unchanged from v0.2. Operator-paced; CC captures.

What. CC captures the Step 2b conversation as a real-Operator fixture per Sub-arc 3a. Authors ~1–2 calibration-gated tests per Sub-arc 3b.

Build. Per §5 Sub-arc 3a and 3b. New fixture at tests/fixtures/voice-calibration/real_operator_marvin_<date>.md. New gated tests in tests/test_phase_57_marketing_engagement_creation.py.

Tests. +1–2 calibration-gated.

Mode posture. Auto-proceed.

Acceptance gate. Fixture file present with correct filename convention. Gated tests pass with LOOMWORKS_RUN_CALIBRATION=1; skip without it.

Halt threshold. Real-Operator transcript capture reveals a format incompatibility with Phase 56's persona fixture format (CRV-5 failure).

Time. ~30 min.

Step 4 — Observation capture (sub-arc 3c)

Status at amendment cycle 2. Unchanged from v0.2 in shape. The implementation notes document now carries two amendment cycles (cycles 1 + 2), the three build-mode firings of substrate-friction-discipline-pattern across Phase 57 (cycle 1 + cycle 2 within the phase; plus the three-instance evidence reaching back to Phase 49 Step 4), and any Step 2c refinement observations alongside the original Sub-arc 3c content. Methodology candidate count is thirteen per P57-B9.

What. CC files the Phase 57 implementation notes document at docs/phase-impl-notes/phase-57-implementation-notes-v0_1.md per Sub-arc 3c.

Build. Per §5 Sub-arc 3c. The document carries: original Sub-arc 3c content (conversation trajectory; comprehension-gap observations; V4 POSTURE-GAP friction phrases; persona-vs-real-Operator delta notes; any Step 1 substrate refinement made; as-shipped wording of the Field 6 prompt); amendment cycle 1 content (second build-mode firing of substrate-friction-discipline-pattern; Sub-arc 4 components as-shipped; any Step 2a refinements; the standing DUNIN7 principle named in §3 of cycle-1 halt-surface note); amendment cycle 2 content (third build-mode firing of substrate-friction-discipline-pattern within Phase 57; reaching three-instance evidence across phases; Sub-arc 5 components as-shipped at the layer CRV-B identified; the diagnostic findings document path and key findings; any Step 2c refinements made; the thirteen methodology candidates carried forward per P57-B9; the <ChatView mode="create-engagement"> mode-discriminator propagation as-shipped behavior; the scrollback isolation fix layer and behavior; Candidate F single-instance evidence framing; Candidate C three-instance evidence reaching v0.21 promotion threshold; Candidate D paired remediation framing; Candidate E positive observation context).

Tests. 0 new.

Mode posture. Auto-proceed.

Acceptance gate. Implementation notes document filed at the specified path carrying all three layers of content (original + cycle 1 + cycle 2). Test counts, methodology candidates, and Sub-arc 5 as-shipped surfaces reproducible from the notes.

Halt threshold. None new at cycle 2; Step 4 is documentation work.

Time. ~30–45 min (extended at cycle 2 to absorb two amendment cycles' worth of content).

Step 5 — Close

Status at amendment cycle 2. Unchanged from v0.2 in shape. Refined close protocol with explicit refspecs (per manifest v0.41 §2 named principle); tag phase-57-marketing-engagement-creation on both engine and OL repos (annotated); P57-D7 Option A retroactive cleanup applied (delete phase-56-step-0 + phase-57-step-0 locally).

What. Push main on both repos via explicit refspecs; delete build branches locally + remotely; tag both repos annotated; push tags via explicit refspecs; verify tags landed on origin.

Build. Per §17 refined close protocol script. Checkpoint B halts before tag-push for Operator final confirmation.

Tests. 0 new.

Mode posture. Auto-proceed up to Checkpoint B; halts; resumes post-confirmation.

Acceptance gate. Both repos at clean main with all Phase 57 commits merged forward. Both repos tagged annotated phase-57-marketing-engagement-creation. Tags pushed via explicit refspecs and verified via git ls-remote origin 'refs/tags/...'. P57-D7 retroactive cleanup applied: phase-56-step-0 and phase-57-step-0 deleted locally.

Halt threshold.

Time. ~15 min.

Step 6 — Reserved buffer (consumed at amendment cycle 1)

(reserved — consumed by Sub-arc 4 work / Step 2a per P57-A10)

Phase 57's two reserved buffer slots: Step 6 consumed at amendment cycle 1 by the Sub-arc 4 budget. First consumed reserved slot since Phase 49 Step 4 (the canonical instance of substrate-friction-discipline-pattern); eight consecutive zero-consumption phases (50/51/52/53/54/55/56 + Phase 57 pre-cycle-1-halt) ended at cycle 1. Per manifest v0.41 §1's observation that the no-mid-build-amendment pattern is "structural rather than coincidental," cycle-1 consumption logged as the design intent firing correctly — slots exist to absorb mid-build amendment without derailing the phase. Methodology candidate C (now at three-instance evidence at cycle 2) captures the cadence.

Step 7 — Reserved buffer (consumed at amendment cycle 2)

(reserved — consumed by Sub-arc 5 work / Step 2c per P57-B10)

Phase 57's second reserved buffer slot is now consumed by the Sub-arc 5 budget. Both slots consumed; first phase since Phase 49 to consume both reserved slots in a single phase. Per P57-B10: 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. Reserved-not-skipped principle preserved at full strength: the slots' value was both their presence (pre-commitment) AND their consumption (design firing at threshold case). No reserved slots remain; any further mid-build amendment during Steps 2b–5 requires explicit Operator authorization, itself a §11 halt-and-surface condition.


§11 Halt conditions

Per friction-discipline-pattern-family mid-build boundary. CC halts and writes a phase-57-halt-surface-<timestamp>-v0_1.md note in engine repo docs/phase-impl-notes/ on any of:

Mid-build amendment scoping runs in a separate Claude.ai chat per the standard pattern (substrate-friction-discipline-pattern from manifest v0.39 §2 — note-first; Operator-elective amendment cycle). Amendment cycle 1 (cycle-1 halt-surface → cycle-1 amendment scoping → CR v0.2 → Sub-arc 4) closed at OL e435b30. Amendment cycle 2 (cycle-2 halt-surface → cycle-2 amendment scoping → CR v0.3 → Sub-arc 5) closed at OL e56ede0 (Sub-arc 5e); engine HEAD at cycle-2 close 38d0008 (engine source byte-identical to cycle-2 baseline; docs-only commits since). Amendment cycle 3 (cycle-3 halt-surface → cycle-3 amendment scoping → CR v0.4 → Sub-arc 6) is the active instance at v0.4. Both reserved slots consumed; cycle 3 expands reserved budget via P57-C10 explicit authorization. Any fourth amendment cycle would require a second explicit Operator authorization (itself a halt-and-surface condition).

Naming-only divergences across all three amendment cycles absorb in-flight per friction-discipline (a temporary-logging file path differs from cycle-3 halt-surface §3's literal cite; a constant name shifts; the response-shape-rendering surface site identified by CRV-C4 is at a different file:line than the speculative assemble_prompt reference). Architectural divergences halt and surface.


§12 Acceptance gates

Twenty items per scoping v0.2 §Acceptance gates plus amendment-cycle-1 amendments per P57-A8 (Gate 5 amended; new Gate 5b inserted; subsequent gates renumbered with +1 offset from old 6→7 onwards) plus amendment-cycle-2 amendments per P57-B8 (Gate 5 amended further; new Gate 5c inserted; subsequent gates renumbered with +1 offset from previous post-cycle-1 numbering) plus amendment-cycle-3 amendments per P57-C8 (Gate 5 amended further; new Gate 5d inserted; subsequent gates renumbered with +1 offset from previous post-cycle-2 numbering).

| # | Gate | Where verified | |---|------|---------------| | 1 | Step 0 findings absorbed; v0.2 produced at cycle 1; v0.3 produced at cycle 2; v0.4 produced at cycle 3; CR drafting handoff filed (already met by this CR's existence); all three amendment scoping notes absorbed (already met by this CR's existence at v0.4). | Pre-existing | | 2 | Field 6 per-field elicitation prompt component landed at prompts/intent_instructions/create_engagement/additional_assertions.md (or final filename per CRV resolution); +1 test green. (Satisfied pre-cycle-1-halt at engine a00f4a3.) | Step 1 | | 3 | field_coverage map extended to include the Field 6 entry; dispatcher splice route exercised. (Satisfied pre-cycle-1-halt.) | Step 1 | | 4 | Active-template scaffolding at prompts/create_engagement_active.md updated for Field 6 elicitation; existing tests still green. (Satisfied pre-cycle-1-halt.) | Step 1 | | 5 | (Amended at amendment cycle 1; amended further at cycle 2; amended further at cycle 3.) Live OL stack ready at Step 2 entry: /operator/create-engagement accessible; banner revision present; Sub-arc 4 fix landed (see Gate 5b); Sub-arc 5 fix landed (see Gate 5c); Sub-arc 6 fix landed (see Gate 5d); lint/tsc/build/test clean on OL including the new sign-in vitest at OL count 150 from cycle 1, the Sub-arc 5e vitest at OL count 151 from cycle 2, and any new Sub-arc 6e test (count per P57-C7 floor +1 / ceiling +2 — OL vitest 152 floor / 153 ceiling). | Checkpoint A3 (extended further) | | 5b | (New at amendment cycle 1.) OL signin surface accepts empty email and proceeds to the WebAuthn discoverable-credential path. IdentifierStep.tsx empty-email guard removed; signin-flow.ts POST body omits the email field when empty; field label / placeholder / helper text indicate optionality (plain-terms-discipline, no methodology vocabulary in user-facing copy); SIGNIN.emailEmptyError constant deleted or orphaned-but-harmless per CRV-A2 resolution; new vitest pins the corrected behavior at the OL count-150 boundary. (Satisfied at amendment cycle 1; OL e435b30.) | Step 2a | | 5c | (New at amendment cycle 2.) Route-to-substrate runtime binding verified at lightweight-confirmation level. Submitting a creation-flow opener from /operator/create-engagement engages create_engagement_entry (or _active on follow-on turns) per classifier log (CRV-B2 verifies); per-field loader splices the correct creation-flow prompt component per load_intent_instruction log (CRV-B4 verifies); dispatcher splice at prompt.py:817 fires the create_engagement_active branch per dispatcher log (CRV-B1 verifies); Companion response shape is consistent with creation-flow scaffolding, not general_conversation. Scrollback on /operator/create-engagement is creation-mode-scoped (or empty) per P57-B3 (CRV-B3 verifies). The diagnostic findings document at docs/phase-impl-notes/phase-57-step-2c-diagnostic-findings-v0_1.md is present on the build branch and identifies the root layer + fix sites + test surface specification. New test(s) per P57-B7 floor/ceiling pin the corrected wire path. Plain-terms-discipline applied to any user-visible surface text Sub-arc 5d introduces. (Satisfied at amendment cycle 2 at wire-path scope; OL 04de7f7 + e56ede0; engine baseline 38d0008. The lightweight-confirmation scope was narrower than live-usage scope — cycle-3 halt-surface §5 + Candidate G; Gate 5d sharpens the confirmation scope.) | Step 2c | | 5d | (New at amendment cycle 3.) Response-shape engagement verified at live-usage scope per Candidate G. Submitting a creation-flow opener from /operator/create-engagement produces a Companion response that is (i) classified through create_engagement_entry per CRV-C1 + CRV-C2 verifies; (ii) template-selected through the creation-flow template path per CRV-C3 verifies (dispatcher routes to the creation-flow branch AND _load_intent_instruction loads create_engagement_active.md / _entry.md); (iii) rendered as creation-flow scaffolding (Field 1 elicitation; creation-flow opener shape) per CRV-C4 verifies, NOT general_conversation-formatted. The Sub-arc 6b diagnostic findings document at docs/phase-impl-notes/phase-57-step-2d-diagnostic-findings-v0_1.md is present on the build branch and identifies the root layer + fix sites + test surface specification + explicit cross-reference to Sub-arc 5b findings. New test(s) per P57-C7 floor/ceiling pin the corrected response shape (not just wire path) at the layer Sub-arc 6b identifies — OL vitest at less-mocked-engine scope / engine pytest with response-shape assertion / new e2e harness per CRV-C6. Plain-terms-discipline applied to any user-visible surface text Sub-arc 6d introduces. Sub-arc 6f confirmation scope MUST match Step 2b live-usage scope — the lightweight engine-log confirmation that satisfied Sub-arc 5f is explicitly insufficient. | Step 2d | | 9 | Marketing engagement created live in the local engine database via /operator/create-engagement. Engagement appears in /operator engagement list. (Was Gate 6 in v0.1; Gate 7 in v0.2; Gate 8 in v0.3; renumbered +1 at cycle 3.) | Step 2b | | 10 | Discovery record produced and uploaded via Phase 16 pipeline; visible in Memory. (Was Gate 7 in v0.1; Gate 8 in v0.2; Gate 9 in v0.3.) | Step 2b | | 11 | Phase 53 extract_discovery_to_seed_skill produced a candidate seed against the Discovery record. (Was Gate 8 in v0.1; Gate 9 in v0.2; Gate 10 in v0.3.) | Step 2b | | 12 | induct_seed produced an induction-pass-clean Status on the marketing engagement. (Was Gate 9 in v0.1; Gate 10 in v0.2; Gate 11 in v0.3.) | Step 2b | | 13 | Marketing v0.3 content (Fields 1–6 with eight Field-6 entries) fully reflected in the inducted seed. (Was Gate 10 in v0.1; Gate 11 in v0.2; Gate 12 in v0.3.) | Step 2b | | 14 | Real-Operator transcript captured as tests/fixtures/voice-calibration/real_operator_marvin_<date>.md. Distinguished from persona fixtures by filename. (Was Gate 11 in v0.1; Gate 12 in v0.2; Gate 13 in v0.3.) | Step 3 | | 15 | ~1–2 calibration-gated tests added exercising the new fixture; gates green with LOOMWORKS_RUN_CALIBRATION=1; skip in CI by default. (Was Gate 12 in v0.1; Gate 13 in v0.2; Gate 14 in v0.3.) | Step 3 | | 16 | Phase 57 implementation notes document filed at docs/phase-impl-notes/phase-57-implementation-notes-v0_1.md carrying trajectory, comprehension-gap observations, V4 POSTURE-GAP friction phrases, persona-vs-real-Operator deltas, amendment-cycle-1 observations (Sub-arc 4 as-shipped surface; methodology candidates A + B + C; standing-principle first-time-in-Loomworks-document record), amendment-cycle-2 observations (Sub-arc 5 as-shipped surface at the layer CRV-B identified; the Sub-arc 5b diagnostic findings document path; methodology candidates D + E + F; Candidate C three-instance evidence reaching v0.21 promotion threshold; the <ChatView mode="create-engagement"> mode-discriminator propagation as-shipped behavior; scrollback isolation fix layer + behavior), and amendment-cycle-3 observations (Sub-arc 6 as-shipped surface at the layer CRV-C identified across the four-layer chain; the Sub-arc 6b diagnostic findings document path with cross-reference to Sub-arc 5b; methodology candidates G + H + Candidate F extension + Candidate C four-instance-within-Phase-57 + Candidate C five-instance-across-Loomworks; fifteen total methodology candidates carried forward per P57-C9; the four-layer substrate-engagement chain framing crystallized at cycle 3; the P57-C10 explicit-authorization narrative as calibration data on the reserved-slot pre-commitment principle; the Sub-arc 6f live-usage-scoped confirmation observation per Candidate G; baseline finding 7.2 carryforward disposition). (Was Gate 13 in v0.1; Gate 14 in v0.2; Gate 15 in v0.3.) | Step 4 | | 17 | Engine test count within v0.4 floor/ceiling (2,280 always-run with 2,279–2,280 passing depending on finding 7.2 resolution + 31–32 skipped; +0 to +1 net from Sub-arc 6e per P57-C7); OL vitest count 152 or 153 (per P57-C7 floor/ceiling — 152 floor: +1 OL Sub-arc 6e; 153 ceiling: +2 if shared-fix shape AND e2e harness OR two OL-side assertions); potential e2e harness count 0 → 1 if CRV-C6 surfaces e2e as the right surface; lint/tsc/build clean on OL; Alembic head unchanged at 0064. (Was Gate 14 in v0.1; Gate 15 in v0.2; Gate 16 in v0.3; OL count window widened further at amendment cycle 3.) | Checkpoint B | | 18 | P57-D7 Option A retroactive cleanup applied: phase-56-step-0 deleted locally; phase-57-step-0 deleted locally (after findings merged forward). (Was Gate 15 in v0.1; Gate 16 in v0.2; Gate 17 in v0.3.) | Step 5 | | 19 | Refined close protocol firing on both repos via explicit refspecs (refs/heads/..., refs/tags/...). (Was Gate 16 in v0.1; Gate 17 in v0.2; Gate 18 in v0.3.) | Step 5 | | 20 | Tags phase-57-marketing-engagement-creation landed on both engine and OL repos; pushed; verified via git ls-remote origin 'refs/tags/...'. (Was Gate 17 in v0.1; Gate 18 in v0.2; Gate 19 in v0.3.) | Step 5 / Checkpoint B |

Total: 20 items (was 17 at v0.1; 18 at v0.2; 19 at v0.3). Gate 5d inserted between Gate 5c and old Gate 8 (now Gate 9 at v0.4) per the cycle-3 amendment-handoff explicit instruction. Subsequent gates renumber with +1 offset from old 8 onwards.


§13 Post-CR state

After Phase 57 close:

  1. First usage-event phase pattern.
  2. Real-Operator-evidence-and-persona-projection-contrast pattern.
  3. Surface-as-product event pattern.
  4. Pre-drafted-content posture vs blank-page Operator posture.
  5. Post-tag-docs-on-main pattern.
  6. Silent Option-A application (Step 0 branch lifecycle refinement).
  7. Candidate Aengine-correct-surface-drifted (new at amendment cycle 1; single-instance).
  8. Candidate Bstanding-principle-not-named-in-source-of-truth-documents-allows-contradicting-surface-to-ship (new at amendment cycle 1; single-instance; remediation: name email-not-identity in what-dunin7-is-building at v0.21).
  9. Candidate Csubstrate-friction-discipline-pattern-build-mode-firing (was substrate-friction-discipline-pattern-second-build-mode-firing at cycle 1; four-instance evidence within Phase 57 + five-instance across two phases reached at cycle 3 — Phase 49 Step 4 + Phase 57 cycle 1 + Phase 57 cycle 2 + Phase 57 cycle 3 within Phase 57; the within-phase recurrence is structurally novel; clears the v0.21 promotion threshold with strong margin per P57-C9; name to be amended at v0.21 to drop the "second" qualifier; v0.21 may want to distinguish cross-phase pattern firing from within-phase pattern recurrence).
  10. Candidate 10cr-amendment-drafting-prose-overclaim-when-handoff-says-unchanged (new at amendment cycle 1; carried from cycle-1 CR amendment drafting; sharpened at cycle 2 to fire at handoff drafting too; applied at v0.4 to the cycle-3 handoff's "preserve cycle-2 section order; insert v0.4-specific subsections" instruction).
  11. Candidate Dper-route-companion-routing-not-asserted-at-step-0 (new at cycle-2 halt-surface §6; remediation candidate naming what Step 0 inspection briefs should add to catch route-to-substrate runtime-binding gaps earlier; paired with Candidate F; sharpened at cycle 3 to per-layer rather than per-route per the four-layer chain framing per §4 cycle-3 discovery-record observation).
  12. Candidate E — positive-observation candidate (new at cycle-2 halt-surface §6; the banner string "Setting up a new project" at ChatView.tsx:254 confirmed correct on live surface — first real-Operator-confirmed instance of plain-terms-discipline holding on a user-facing surface).
  13. Candidate Fdiagnosis-as-architecture-when-runtime-binding-fails (new at amendment cycle 2 scoping; extended at cycle 3 with recursive-aperture-widening property — each amendment cycle's diagnostic envelope reveals a layer the prior cycle's envelope structurally could not probe; cycle 1 probed layer 1 surface; cycle 2 probed layer 2 wire-binding; cycle 3 probes layers 3 + 4 template-selection + response-shape).
  14. Candidate Gpost-fix-confirmation-can-pass-while-live-usage-fails-when-confirmation-scope-is-narrower-than-usage-surface (new at cycle-3 halt-surface §5; sharpened at cycle-3 scoping to two-confirmation-surface evidence — OL vitest mocked-engine PASS + lightweight engine-log confirmation PASS while live-usage FAIL; v0.21 framing input: confirmation-surface cardinality as a calibration knob distinct from confirmation-vs-usage as binary; instantiated as discipline at cycle-3 Sub-arc 6f per P57-C3).
  15. Candidate Hreserved-slot-pre-commitment-as-calibrable-not-fixed (new at cycle-3 scoping; single-instance calibration data; the v0.39 §2 "calibrated to worst-case observed" framing needs calibration-window cardinality; Phase 57's three-cycle profile is either evidence of too-short-a-window or evidence the calibration unit should be per-substrate-class rather than per-phase; v0.21 framing input).

§14 Carry-forward

Per scoping v0.2 §Carry-forward inventory:

Out-of-scope (carry beyond Phase 57):

Newly enabled by Phase 57:

Added at amendment cycle 1 (preserved verbatim from v0.2):

Added at amendment cycle 2:

Added at amendment cycle 3:


§15 Kickoff prompt — paste-ready for CC (resuming at amendment cycle 3)


Resume Phase 57 build at amendment cycle 3 per CR-2026-090 v0.4
(phase-57-cr-marketing-engagement-creation-v0_4.md). v0.1 + v0.2 + v0.3
are all superseded; all four archived at engine repo docs/phase-crs/
(first four-version CR archival in Loomworks methodology history per
P57-C5).

Baseline confirmation at amendment-cycle-3 start (post-halt, pre-resume):
- Engine repo /Users/dunin7/loomworks-engine on branch
  phase-57-marketing-engagement-creation at HEAD 771aacd. Engine source
  byte-identical to cycle-2 baseline 38d0008 (all commits since cycle-2
  baseline are docs-only: CR v0.3 archive; cycle-3 halt-surface filing
  at 5534068; halt-surface §2 transcript amendment at 771aacd).
  Tests: 2,279 pass + 1 fail + 32 skip — the one failing test is
  tests/test_api_assertion_retract.py::test_api_assertion_retract,
  the pre-existing dependency-drift carryforward filed as cycle-3
  halt-surface §10 finding 7.2 (starlette 1.0 / fastapi 0.135.3 vs
  app.py:461 validation-error handler); accepted out-of-scope unless
  CRV-C surfaces a connection. Alembic head 0064 unchanged. Working
  tree clean.
  Cycle-1 halt-surface note present at
  docs/phase-impl-notes/phase-57-halt-surface-2026-05-12-v0_1.md.
  Cycle-2 halt-surface note present at
  docs/phase-impl-notes/phase-57-halt-surface-2026-05-12-step-2b-v0_1.md.
  Cycle-3 halt-surface note present at
  docs/phase-impl-notes/phase-57-halt-surface-2026-05-12-step-2b-live-v0_1.md.
  Sub-arc 5b diagnostic findings present at
  docs/phase-impl-notes/phase-57-step-2c-diagnostic-findings-v0_1.md
  (§10 secondary findings 7.1 + 7.2 deferred-to-Phase-58 items).
  Step 0 findings present at
  docs/phase-impl-notes/phase-57-step-0-findings-v0_1.md.
  Step 1 substrate present at
  prompts/intent_instructions/create_engagement/additional_assertions.md.
  phase-57-step-0 branch at 69adb17 (unmerged; for P57-D7 retroactive
  cleanup at Step 5). phase-56-step-0 branch exists locally (never
  pushed; scheduled for P57-D7 Option A retroactive cleanup at Step 5).
- Operator Layer repo /Users/dunin7/loomworks on branch
  phase-57-marketing-engagement-creation at HEAD e56ede0. Two OL
  commits across cycle 2 (04de7f7 Sub-arc 5c ChatView runtime-binding
  fix; e56ede0 Sub-arc 5e +1 vitest pinning POST body shape). Working
  tree clean.
  151 vitest passed; 11 prerendered routes; lint/tsc/build clean.
- Local stack ready (engine API up on :8000, /healthz 200, CORS resolved
  via LOOMWORKS_ENV=development in local .env; OL dev server up on :3001;
  /operator/create-engagement loads cleanly with Sub-arc 5 fix landed;
  banner string "Setting up a new project" confirmed correct on live
  surface at ChatView.tsx:254; scrollback empty per Sub-arc 5c
  history-fetch skip working; Marvin's Person row + passkey credential
  present in dev DB; signin works per cycle-1 Sub-arc 4 landed;
  wire-binding works per cycle-2 Sub-arc 5 landed but response-shape
  engagement fails — the cycle-3 halt this amendment absorbs).

Per CR §10 Step 0: re-archive this CR (v0.4) to engine repo
docs/phase-crs/phase-57-cr-marketing-engagement-creation-v0_4.md
(preserving v0_1 + v0_2 + v0_3 alongside as superseded; all four
present — first four-version CR archival per P57-C5). CRV-1 through
CRV-8 ran pre-halt at Step 0 of the original build cycle; their
verdicts hold. CRV-A1 through CRV-A8 ran at amendment-cycle-1 Step
2a; all HELD; verdicts hold. CRV-B1 through CRV-B6 ran at amendment-
cycle-2 Step 2c; findings document at Sub-arc 5b on engine branch.
CRV-B verdicts hold at their cycle-2 scope; CRV-C5 cross-references
them at deeper-aperture scope per P57-C2.

Per CR §10 Step 2d (new at amendment cycle 3): begin with Sub-arc 6a
diagnostic phase. Run CRV-C1 through CRV-C5/6 against live engine + OL
on branch heads. CRV-Cs are diagnostic-first per P57-C2 with Candidate
F recursive-aperture-widening — each cycle's diagnostic envelope is
one layer wider than the prior cycle's. Cycle 2 audited layers 1-2
(present + classified per the four-layer chain framed at cycle-3
halt-surface §4); cycle 3 audits layers 3 + 4 (template-selected +
response-shaped) with explicit cross-reference to Sub-arc 5b at
matching layers.

CRV-C envelope (5 core items + CRV-C6 settles test-harness decision;
envelope may grow at execution time):
- CRV-C1. Probe OL ChatView.tsx submission path entry on browser-
  observed live traffic. Verify intent_hint POST body content at
  live-bundle scope (Candidate A residual probe; deeper than
  Sub-arc 5e's mocked-engine vitest scope).
- CRV-C2. Probe engine classify_intent exit on live traffic.
  Capture IntentLabel returned; verify intent_hint is honored on
  the classifier's full path; cross-reference CRV-B2 at deeper
  aperture (Candidate B residual probe).
- CRV-C3. Probe engine template-selection layer at the dispatcher
  splice site (prompt.py:817 per Step 0 V1 + the dispatcher's
  if-intent-equals-create_engagement_active branch) and at
  _load_intent_instruction exit at prompt_assets.py. Capture whether
  template-selection routes to the creation-flow path (Candidate C —
  the layer cycle 2 didn't probe).
- CRV-C4. Probe engine response-shape rendering layer at assemble_prompt
  return / converse-handler response construction. Capture whether
  rendered response shape matches creation-flow template's output
  contract or general_conversation (Candidate D-equivalent at layer 4).
- CRV-C5. Cross-reference Sub-arc 5b findings at matching layers.
  Were any CRV-B verdicts narrower-scoped than cycle-3 evidence demands?
  Record any re-openings in Sub-arc 6b findings.
- CRV-C6. Test-harness decision per P57-C3 + P57-C4 + P57-C7.
  Settle (a) automated e2e / (b) CC-driven probe / (c) combination for
  Sub-arc 6f; settle which harness carries +1 net floor (and +2 ceiling
  if shared-fix shape AND e2e harness lands as a new file).

Add temporary logging at each probe point; submit creation-flow openers
from /operator/create-engagement (e.g. "I want to create a new
engagement"); capture findings; remove temporary logging before commit.
No production code changes during Sub-arc 6a.

Per CR §10 Step 2d (Sub-arc 6b): produce the diagnostic findings
document at docs/phase-impl-notes/phase-57-step-2d-diagnostic-findings-v0_1.md.
Per-CRV verdict; root-layer identification across the four-layer chain
(layer 3 / layer 4 / both / a re-opened layer 2); specific file:line
change sites; test surface specification per CRV-C6; **explicit cross-
reference to Sub-arc 5b findings** at matching layers per P57-C2.
Single-file commit. Halt and surface to Operator at Checkpoint A3
before Sub-arc 6c production change(s).

Per CR §10 Step 2d (Sub-arcs 6c-6f): execute the production fix per
the Sub-arc 6b findings document. Components may collapse or expand
per CRV-C-driven adjustments; the §10 / §5 provisional decomposition
(6c response-shape engagement fix; 6d layer-adjacent secondary fixes
including any 5b re-openings or layer-3-to-layer-4 ripples; 6e test
surface floor/ceiling per P57-C7 pinning response *shape* per P57-C3
framework; 6f live-usage-scoped post-fix confirmation per Candidate G
per P57-C3) is the planning shape, not the binding spec. Plain-terms-
discipline on any user-visible surface text Sub-arc 6d introduces.

Sub-arc 6f confirmation MUST match Step 2b live-usage scope per
P57-C3 — the lightweight engine-log confirmation that satisfied
cycle-2 Sub-arc 5f is explicitly insufficient at cycle 3. Implementation
per CRV-C6 (automated e2e and/or CC-driven probe and/or both).

Halt and re-diagnose if Sub-arc 6f live-usage confirmation fails —
a fourth amendment cycle would breach P57-C10's explicit-authorization
scope and is itself a §11 halt condition.

Per CR §10: seven active build steps + Step 2d new at cycle 3.
Step 0 + Step 1 done pre-halt; Step 2a done at cycle 1 with CRV-A
all-HELD; Step 2c done at cycle 2 with Sub-arcs 5a-5e landed
(OL 04de7f7 + e56ede0; engine source byte-identical to 38d0008);
Step 2d is the resumption point at amendment cycle 3; Step 2b follows
the response-shape engagement fix; Steps 3-5 unchanged from v0.3.
Both reserved buffer slots consumed at cycles 1/2; cycle 3 expands
reserved budget per P57-C10 explicit authorization (Operator-elective
per substrate-friction-discipline-pattern; the gate honored, not
circumvented).

Per CR §10: auto-mode posture — Sub-arc 6a auto-proceeds (read-only
diagnostic); Sub-arc 6b auto-proceeds (single-file commit, findings
document); Checkpoint A3 extends Checkpoint A2 further to cover
Sub-arc 6b (Operator confirms diagnostic findings + Sub-arc 6f
live-usage-scoped confirmation before Step 2b proceeds); Sub-arcs
6c-6f auto-proceed in sequence after Checkpoint A3 confirmation;
Step 2b is Operator-paced (live conversation); Steps 3/4 are CC
capture; Checkpoint B (final) halts before tagging.

Per CR §3 + §3.A + §3.B + §3.C: ten construction decisions P57-D1
through P57-D10 plus ten amendment-cycle-1 decisions P57-A1 through
P57-A10 plus ten amendment-cycle-2 decisions P57-B1 through P57-B10
plus ten amendment-cycle-3 decisions P57-C1 through P57-C10 are
settled. CC executes against them; does not re-decide. The Sub-arc
6b diagnostic findings document is the architectural artifact for
the fix shape per P57-C2 — scoping does NOT pre-specify; CC produces
findings (with cross-reference to Sub-arc 5b at matching layers per
P57-C2), surfaces them, Operator confirms, fix lands.

Per CR §11: halt-and-surface is preferred to draft-and-hope. Halt
thresholds at amendment cycle 3: any CRV-C architectural divergence
beyond the enumerated diagnostic space (a fifth root layer the
four-layer framing didn't anticipate; all CRV-Cs return HOLDS at
the layer they probe but response shape is still general_conversation
for a reason outside the framing); Sub-arc 4 or Sub-arc 5 or Step 1
substrate state has drifted since cycle-2 close (engine HEAD differs
from 38d0008; OL HEAD differs from e56ede0); CRV-C findings produce
a fix shape requiring migration (Alembic head would advance beyond
0064; out of scope); CRV-C findings produce a fix shape that touches
Phase 41/42/55/56 substrate beyond cosmetic/parameter-shape edits
(would re-open Phase 42/55/56 scope; broader than cycle-3 envelope);
Sub-arc 6f live-usage-scoped post-fix confirmation fails (a fourth
amendment cycle would breach P57-C10's explicit-authorization scope
and is itself a halt-and-surface condition); test count divergence
beyond +/-1 from CRV-C prediction; any second reserved-budget
expansion required (P57-C10 covered cycle 3 only; fourth cycle
requires a second explicit authorization, itself a halt-and-surface
condition).

Per CR §17: refined close protocol with explicit refspecs (manifest
v0.41 §2). P57-D7 Option A retroactive cleanup applied at Step 5
(delete phase-56-step-0 + phase-57-step-0 locally after findings
merged forward). OL close protocol expects 152 or 153 vitest passing
per P57-C7 floor/ceiling.

Tag name: phase-57-marketing-engagement-creation. Annotated. Lands
on both engine and OL repos at Checkpoint B (final).

Begin at Step 2d Sub-arc 6a (CRV-C1 through CRV-C5/6 diagnostic phase).
After diagnostic capture, file Sub-arc 6b findings document with
explicit cross-reference to Sub-arc 5b at matching layers. Halt at
extended Checkpoint A3 for Operator confirmation of findings before
Sub-arc 6c production change.

§16 Test count predictions

| Surface | Pre-Phase-57 | Phase-57 delta (v0.1) | Phase-57 delta (v0.2 amendment) | Phase-57 delta (v0.3 amendment) | Phase-57 delta (v0.4 amendment) | Post-Phase-57 | |---------|-------------|----------------------|--------------------------------|--------------------------------|--------------------------------|--------------| | Engine always-run (total count) | 2,279 | +1 | 0 | 0 (Sub-arc 5e landed in OL vitest at cycle 2, not engine) | floor 0 / ceiling +1 (per P57-C7; +1 if CRV-C surfaces engine-side template-dispatch assertion) | 2,280 or 2,281 | | Engine always-run (currently passing) | 2,279 | +1 | 0 | 0 (cycle-3 baseline: 2,279 pass + 1 fail per finding 7.2 dependency drift — test_api_assertion_retract.py::test_api_assertion_retract; pre-existing fail accepted out-of-scope at Sub-arc 5f close and at cycle 3 unless CRV-C resolves) | floor 0 / ceiling +1 (matches always-run-total ceiling; finding 7.2 disposition carries unless CRV-C surfaces a connection) | 2,279 or 2,280 currently passing | | Engine skipped (calibration-gated) | 30 (= 26 pre-P56 + 4 P56-gated) | +1 to +2 | 0 | 0 | 0 | 31–32 | | OL vitest | 149 | 0 | +1 (Sub-arc 4d) | +1 (Sub-arc 5e at cycle 2, OL e56ede0) | floor +1 / ceiling +2 per P57-C7 (+1 if Sub-arc 6e response-shape assertion lands OL-side; +2 if shared-fix shape AND second OL-side assertion OR e2e harness landed as a new file pinning the OL contribution) | 152 or 153 | | Potential e2e harness | 0 | 0 | 0 | 0 | floor 0 / ceiling +1 (per P57-C7 ceiling; +1 new file if CRV-C6 surfaces e2e as canonical Sub-arc 6f surface) | 0 or 1 | | Alembic migration head | 0064 | 0 | 0 | 0 (per P57-B7) | 0 (per P57-C7; no migration consumed across any candidate fix shape at layers 3/4) | 0064 | | Prerendered OL routes | 11 | 0 | 0 | 0 | 0 | 11 |

Per cycle-1 methodology candidate 10 (CR-amendment-drafting-prose-overclaim discipline; cycle-2 sharpening that it fires at handoff drafting too), v0.4 does NOT pre-claim "existing 2,279 substrate tests stay green" or "existing 151 OL vitest stay green" if Sub-arc 6 may alter response-shape semantics existing tests assert. Sub-arc 6e (test surface floor/ceiling per P57-C7) may add one or two new tests AND may require adjustments to existing tests whose semantics shift; CRV-C6 surfaces both at execution time, and the Sub-arc 6b findings document specifies the test surface posture. As-shipped existing-test deltas are recorded in implementation notes at Step 4 per Gate 16. Calibration-gated tests pass with LOOMWORKS_RUN_CALIBRATION=1; skip in CI by default per P56-D7 precedent. Amendment cycle 1 added +1 OL vitest exercising the empty-email discoverable-credential path. Amendment cycle 2 added +1 OL vitest pinning the corrected POST-body wire path (Sub-arc 5e at OL e56ede0). Amendment cycle 3 adds floor +1 net test / ceiling +2 net tests pinning the corrected response shape (per P57-C3 framework — response shape, not just wire path) per P57-C4 / P57-C7. Cycle-3 baseline carries finding 7.2's pre-existing fail (test_api_assertion_retract.py::test_api_assertion_retract); the ±1 halt-threshold tolerance per §11 Step 2d is measured against the 2,279-pass projection unless CRV-C surfaces a connection to the dependency-drift surface.

Total Phase-57 net test delta (v0.4 floor): +1 engine always-run + +1 OL vitest (Sub-arc 4d at cycle 1) + +1 OL vitest (Sub-arc 5e at cycle 2) + +1 engine skipped + +1 OL vitest (Sub-arc 6e at cycle 3 floor) = +5 floor. Total Phase-57 net test delta (v0.4 ceiling): +1 engine always-run + +1 OL vitest (Sub-arc 4d) + +1 OL vitest (Sub-arc 5e) + +2 engine skipped + +1 engine always-run (Sub-arc 6e engine-side ceiling) + +2 OL vitest (Sub-arc 6e ceiling — two OL assertions) OR +1 OL vitest + +1 e2e harness file (Sub-arc 6e + e2e ceiling) = +8 ceiling (distributed shape per CRV-C6 findings; +2 ceiling for Sub-arc 6e per P57-C7 is absorbed across surfaces).


§17 Refined close protocol script

Aligned with Phase 56 CR-2026-080 v0.2 §3.1 close-protocol refinement and manifest v0.41 §2 named principle (explicit refspecs). Executed at Step 5 by CC; Checkpoint B halts before tag-push for Operator final confirmation. Unchanged at amendment cycle 1 — the close-protocol commands are step-5 work; they do not depend on Sub-arc 4 specifics. Unchanged at amendment cycle 2 per the cycle-2 handoff §7.2 — close-protocol commands do not depend on Sub-arc 5 specifics either; only the OL vitest expected-count comment widens to accept 150 or 151 per P57-B7 floor/ceiling. Unchanged in structure at amendment cycle 3 — close-protocol commands do not depend on Sub-arc 6 specifics; only (a) the OL vitest expected-count comment widens further to accept 152 or 153 per P57-C7 floor/ceiling; (b) the engine pytest expected-count comment notes the cycle-3 baseline carries finding 7.2's pre-existing fail unless CRV-C resolves; (c) a new pre-tag verification for the Sub-arc 6b diagnostic findings document mirrors the cycle-2 Sub-arc 5b verification.

Engine repo close


cd /Users/dunin7/loomworks-engine

# 1. Confirm Step 0 findings present on main before Step 0 branch deletion
test -f docs/phase-impl-notes/phase-57-step-0-findings-v0_1.md \
  && echo "Step 0 findings present on main" \
  || { echo "ERROR: Step 0 findings missing"; exit 1; }

# 1b. Confirm cycle-2 diagnostic findings present on main (new at cycle 2)
test -f docs/phase-impl-notes/phase-57-step-2c-diagnostic-findings-v0_1.md \
  && echo "Sub-arc 5b diagnostic findings present on main" \
  || { echo "ERROR: Sub-arc 5b diagnostic findings missing"; exit 1; }

# 1c. Confirm cycle-3 diagnostic findings present on main (new at cycle 3)
test -f docs/phase-impl-notes/phase-57-step-2d-diagnostic-findings-v0_1.md \
  && echo "Sub-arc 6b diagnostic findings present on main" \
  || { echo "ERROR: Sub-arc 6b diagnostic findings missing"; exit 1; }

# 2. Confirm build branch is up-to-date with main (assuming build commits
#    were made directly on main, or were merged forward)
git status
git log --oneline -5

# 3. Confirm tests green at close
.venv/bin/pytest -q
# Expected at cycle-3 close: 2,279 or 2,280 passed (per P57-C7 floor/ceiling
# — 2,279 = finding 7.2 carryforward + no engine Sub-arc 6e; 2,280 = finding
# 7.2 carryforward + engine-side Sub-arc 6e OR finding 7.2 resolved by Sub-arc
# 6 fix as ripple), 1 failed (finding 7.2 — `test_api_assertion_retract`,
# dependency drift carryforward; expected unless CRV-C resolved) OR 0 failed
# (if Sub-arc 6 fix resolved finding 7.2 as a layer-adjacent ripple per
# Sub-arc 6d), 31-32 skipped.

# 4. Confirm working tree clean
git status --porcelain
# Expected: empty

# 5. Push main to origin via explicit refspec
git push origin refs/heads/main

# 6. Delete local build branch (if it exists as a separate branch)
git branch | grep phase-57-marketing-engagement-creation \
  && git branch -d phase-57-marketing-engagement-creation \
  || echo "Build branch already merged or not separate"

# 7. Delete remote build branch via explicit refspec (only if pushed during build)
git ls-remote origin 'refs/heads/phase-57-marketing-engagement-creation' \
  && git push origin :refs/heads/phase-57-marketing-engagement-creation \
  || echo "Build branch not on origin; skip remote delete"

# 8. Prune remote-tracking refs
git remote prune origin

# 9. P57-D7 Option A retroactive cleanup
git branch -D phase-56-step-0
git branch -D phase-57-step-0

# 10. [CHECKPOINT B HALT — Operator final-confirms before tags land]

# 11. Create annotated tag
git tag -a phase-57-marketing-engagement-creation \
  -m "Phase 57 close: marketing engagement creation"

# 12. Push tag via explicit refspec
git push origin refs/tags/phase-57-marketing-engagement-creation

# 13. Verify tag landed on origin
git ls-remote origin 'refs/tags/phase-57-marketing-engagement-creation'

Operator Layer repo close


cd /Users/dunin7/loomworks

# 1. Confirm working tree clean (Sub-arc 4 + Sub-arc 5 + Sub-arc 6 changes
#    already committed)
git status --porcelain
# Expected: empty

# 2. Confirm tests green
npm test -- --run
# Expected at cycle-3 close: 152 or 153 vitest passed (per P57-C7
# floor/ceiling; 152 = engine-side Sub-arc 6 fix with +1 OL Sub-arc 6e;
# 153 = OL-side or shared-fix Sub-arc 6 with two OL-side assertions OR
# +1 OL Sub-arc 6e + e2e harness landed as a new file).
npm run lint
npm run tsc
npm run build
# Expected: all clean

# 3. Push main to origin via explicit refspec
git push origin refs/heads/main

# 4. [CHECKPOINT B HALT — Operator final-confirms before tags land]

# 5. Create annotated tag at the post-Sub-arc-6 OL commit
git tag -a phase-57-marketing-engagement-creation \
  -m "Phase 57 close: marketing engagement creation"

# 6. Push tag via explicit refspec
git push origin refs/tags/phase-57-marketing-engagement-creation

# 7. Verify tag landed on origin
git ls-remote origin 'refs/tags/phase-57-marketing-engagement-creation'

Explicit-refspec convention reminders (per manifest v0.41 §2)

The convention prevents the error: src refspec ... matches more than one failure mode that Phase 56 encountered and resolved in-session.


DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks Phase 57 CR — Marketing Engagement Creation — v0.4 — 2026-05-12