Version. 0.1
Date. 2026-05-12
Status. Active scoping for the Phase 57 CR amendment. Drafted by Claude.ai. Operator: Marvin Percival. Phase 57 build paused at Step 2 entry per phase-57-halt-surface-2026-05-12-v0_1.md; amendment-scope absorbs the OL signin email gate fix and unblocks Step 2.
Phase. 57 — Marketing Engagement Creation (amendment cycle 1).
CR target. CR-2026-090 v0.2 (phase-57-cr-marketing-engagement-creation-v0_2.md), superseding v0.1.
Companion documents.
phase-57-halt-surface-2026-05-12-v0_1.md (project knowledge; the halt-surface note this amendment absorbs)phase-57-cr-marketing-engagement-creation-v0_1.md (engine repo docs/phase-crs/; the CR being amended)loomworks-phase-57-scoping-note-v0_2.md (project knowledge; authoritative scope going into Phase 57; this amendment extends, does not supersede)loomworks-phase-57-cr-drafting-handoff-v0_1.md (project knowledge; original CR drafting handoff)current-status-manifest-v0_41.md (project knowledge; substrate baseline; standing principles)
Phase 57 Step 2 (live usage event) cannot succeed against the v0.1 CR because the Operator Layer signin form's client-side empty-email guard at IdentifierStep.tsx:31 contradicts the engine's WebAuthn discoverable-credential identity contract and contradicts the standing DUNIN7 principle that email must not be used for identity. The amendment adds one new Sub-arc (Sub-arc 4: OL surface alignment) and one new build step (Step 2a) that removes the empty-email guard, omits the email field from the /auth/login/begin POST body when empty, and updates the field's surface text to indicate optionality. One vitest pins the corrected behavior. The fix is scoped strictly to the signin entry point CC's diagnostic identified — sign-up form, account-recovery surfaces, and other OL identity-adjacent surfaces are deliberately out of amendment scope and queue as a Phase 58+ candidate (OL surface-vs-contract audit). One of Phase 57's two reserved buffer slots is consumed; the other remains. Phase 57's product and methodology deliverables (marketing engagement live, real-Operator transcript, observation capture) are preserved unchanged. Engine substrate is correct and untouched. Methodology candidates A + B from the halt-surface carry forward to v0.21 consolidation and v0.42 manifest absorption.
This is the second build-mode firing of the substrate-friction-discipline-pattern (manifest v0.39 §2), and 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). The trajectory is worth preserving in full for v0.42 manifest absorption and for the eventual v0.21 methodology consolidation.
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:
SignupBeginRequest, LoginBeginRequest, PersonRow all treat email as Optional).IdentifierStep.tsx:31 contradicts the engine contract by requiring email input where the engine does not.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). 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.
The halt-surface §5 names five items as settled. The amendment scoping note does not re-litigate; it inherits and proceeds.
phase-57-marketing-engagement-creation branch at a00f4a3 stays unchanged through the amendment.what-dunin7-is-building is downstream, not Phase 57 scope. Inherited. This amendment does not draft methodology consolidation. The principle is named in the halt-surface §3 for the first-time-in-a-Loomworks-document record; the canonical naming happens at v0.21.The halt-surface §5 names ten open items. Each gets a P57-Ax decision code (A = Amendment) and a construction-level settlement.
Settled. Remove the empty-email guard entirely; omit the email field from the /auth/login/begin POST body when empty; update the field's label / placeholder / helper text to indicate the field is optional. The email field stays present (it narrows allowCredentials per halt-surface Finding 1 when supplied as a passkey hint), but the form proceeds without it.
Rejected alternative. Keep the field as required-looking with a separate "use passkey only" affordance plus helper text. Rejected because it treats the discoverable-credential path as exotic-and-needing-explanation when the engine treats it as the normal path. A separate affordance also adds UI surface that the amendment does not need; surface-text optionality indication does the same work with less code.
Construction shape.
IdentifierStep.tsx:31 — remove the if (!email.trim()) { setLocalError(SIGNIN.emailEmptyError); return; } block (or whatever the exact construct is at amendment-drafting verification time).signin-flow.ts:42 — change the POST body construction from { email: email.trim() } to omit email when empty (idiomatically, build the body conditionally; engine's Pydantic model handles the field's absence cleanly per halt-surface Finding 1).SIGNIN.emailEmptyError constant — likely deletable since no code path remains that uses it; CR-amendment-drafting verifies and either deletes the constant or leaves it as orphaned-but-harmless. Recommended: delete.
Settled. One new vitest, exercising the discoverable-credential path: empty email → form does not show emailEmptyError → POST body to /auth/login/begin omits the email field → mock returns a WebAuthn challenge → form transitions to passkey step.
Rejected alternatives. Zero (relies on existing 149 + live exercise; regression-prone for a one-line client-side gate); two (with-email + without-email; the with-email path is already covered by existing tests, so a second test inflates the surface without adding coverage).
Test placement. Existing vitest convention in the OL repo's test surface — likely under tests/components/signin/ or analogous (CR-amendment-drafting verifies the exact path against current branch state and Phase 48/56 precedents). The test file name follows the existing convention.
Settled. Narrow audit limited to the signin form only. The amendment does not extend to sign-up, claim-flow, account-recovery, or other identity-adjacent surfaces.
Rejected alternative. Broader OL-side audit of every form that touches email or identity. Rejected because:
Queued direction added. OL surface-vs-contract audit — a Phase 58+ candidate phase. Reads every OL surface that touches identity, contact, or any other engine-side data contract; verifies each surface against the engine contract; corrects any drift surfaced. The Phase 57 halt-surface methodology candidates A (engine-correct-surface-drifted) and B (standing-principle-not-named-in-source-of-truth-documents-allows-contradicting-surface-to-ship) feed the eventual phase's scoping. Filed for inclusion in loomworks-queued-directions-and-deferred-work-v0_12.md (next bump from v0.11) at Phase 57 close.
Settled. Out of scope of this amendment. The Phase 51 public 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. The principle (email-not-identity) distinguishes identity from contact; the marketing form correctly handles email as contact.
CR-amendment-drafting verification. The CR amendment drafter confirms by reading the Phase 51 marketing form's submission handler (engine side) — verifies that no auth surface keys off the submitted email. Expected verdict: HOLDS. If the verdict were CONTRADICTED, amendment scope re-opens; not anticipated.
Settled. CR amendment lands at phase-57-cr-marketing-engagement-creation-v0_2.md. v0.1 is preserved alongside as superseded. Both are archived at engine repo docs/phase-crs/.
Settled. New Sub-arc 4 — OL surface alignment with engine identity contract. The work is OL-side substrate; Sub-arcs 1, 2, and 3 are engine-side or live-usage-event scoped. A new sub-arc keeps the engine / OL boundary visible in the CR's structure and makes the amendment legible as a distinct piece of work.
Rejected alternative. Sub-arc 1e (extension of Field 6 prompt authoring). Rejected because the Field 6 work is engine-side prompt content; the signin fix is OL-side React substrate. Forcing them under the same sub-arc muddies the boundary the CR was deliberate about.
Settled. OL vitest count: 149 → 150. Engine test counts unchanged (2,280 always-run + 32 skipped — the Step 1 substrate that already landed on the branch). Alembic head: 0064 unchanged.
The CR §16 test count predictions update to reflect the new OL vitest count.
Settled. Two gate-level updates to CR §12:
/operator/create-engagement accessible; banner revision present; lint/tsc/build/test clean on OL." Amended: "Live OL stack ready at Step 2 entry: /operator/create-engagement accessible; banner revision present; Sub-arc 4 fix landed (see Gate 5b); lint/tsc/build/test clean on OL including the new sign-in vitest at OL count 150."IdentifierStep.tsx empty-email guard removed; signin-flow.ts POST body omits the email field when empty; field label / placeholder / helper text indicate optionality; SIGNIN.emailEmptyError constant deleted or orphaned-but-harmless. The new vitest at the OL count-150 boundary pins the corrected behavior."Total gate count: 17 → 18.
Settled. Both halt-surface methodology candidates carry forward unchanged.
engine-correct-surface-drifted. Single-instance evidence at the Phase 57 halt-surface. Carries to v0.42 manifest absorption (Phase 57 close) and to v0.21 methodology consolidation. Generalization: surface implementations can drift from their underlying contract; the surface-vs-contract drift surfaces at first real usage; the audit needs a trigger.standing-principle-not-named-in-source-of-truth-documents-allows-contradicting-surface-to-ship. Single-instance evidence at the Phase 57 halt-surface. Carries to v0.42 manifest absorption and to v0.21 methodology consolidation. Remediation: name the email-not-identity principle in what-dunin7-is-building at v0.21. This amendment does not perform the remediation; the remediation belongs to v0.21 consolidation work.Plus one amendment-time observation added (new):
substrate-friction-discipline-pattern-second-build-mode-firing. The pattern's second build-mode firing since the principle was promoted at v0.39 §2 (Phase 49 Step 4 was the first; Phase 57 Step 2 is the second). Two-instance evidence; the pattern is now reliable. The two instances are usefully different in shape (Phase 49 was engine-side architectural friction at impl time; Phase 57 is OL-side surface-vs-contract drift at first usage), which strengthens the pattern as a general-purpose mid-build resolution shape. Carries to v0.21 consolidation.Settled. One of Phase 57's two reserved buffer slots is consumed by Sub-arc 4 work. Phase 57 at amendment close will have:
Methodology observation. Eight consecutive phases of zero reserved-slot consumption (Phases 50 / 51 / 52 / 53 / 54 / 55 / 56 / planned Phase 57 going in) ended at Phase 57's amendment. The reserved-slot-as-halt-condition-pre-commitment reformulation (manifest v0.39 §2) fires as designed — the slot's availability is what enables a halt-without-derailment; the slot's consumption is the use-the-budget signal. Pattern is sound.
Phase 57 v0.1 CR §10 ordering plus the inserted Step 2a. The original Step 2 is renamed Step 2b for clarity; subsequent step numbers are unchanged. Reserved slot accounting adjusts.
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 halt-surface §6 state-at-halt record.IdentifierStep.tsx:31; omit email from /auth/login/begin POST body when empty at signin-flow.ts:42; update field surface text (label / placeholder / helper) to indicate optionality; delete SIGNIN.emailEmptyError if orphaned. Add one vitest exercising the corrected discoverable-credential path. Update OL lint / tsc / build / test clean state to OL vitest count 150. Checkpoint A extends to cover Step 2a completion — Operator confirms the OL fix before Step 2b proceeds./operator/create-engagement; passkey discoverable-credential flow completes; /operator/create-engagement renders; marketing engagement creation conversation proceeds. Discovery-record terminal-turn path; Phase 16 upload + Phase 53 extract + induct_seed cascade.tests/fixtures/voice-calibration/real_operator_marvin_<YYYY-MM-DD>.md; one to two calibration-gated tests.docs/phase-impl-notes/phase-57-implementation-notes-v0_1.md.phase-57-marketing-engagement-creation on both repos (annotated); apply P57-D7 Option A retroactive cleanup. Checkpoint B halt before tagging — Operator final-confirms.Eight consecutive zero-consumption phases ended at this amendment; one slot consumed; one remains.
The CR v0.1 had 17 gates per scoping v0.2's Acceptance gates §. The amendment changes Gate 5 and adds Gate 5b. Other gates are unchanged.
The amended CR §12 acceptance gates list at v0.2:
prompts/intent_instructions/create_engagement/additional_assertions.md; +1 test green. (Unchanged; satisfied pre-halt.)field_coverage map extended to include the Field 6 entry; dispatcher splice route exercised. (Unchanged; satisfied pre-halt.)prompts/create_engagement_active.md updated for Field 6 elicitation; existing tests still green. (Unchanged; satisfied pre-halt.)/operator/create-engagement accessible; banner revision present; Sub-arc 4 fix landed (see Gate 5b); lint/tsc/build/test clean on OL including the new sign-in vitest at OL count 150.IdentifierStep.tsx empty-email guard removed; signin-flow.ts POST body omits the email field when empty; field label / placeholder / helper text indicate optionality; SIGNIN.emailEmptyError constant deleted or orphaned-but-harmless; new vitest pins the corrected behavior at the OL count-150 boundary./operator/create-engagement. (Was gate 6 in v0.1; renumbered.)extract_discovery_to_seed_skill produced a candidate seed against the Discovery record. (Was 8.)induct_seed produced an induction-pass-clean Status on the marketing engagement. (Was 9.)Total gate count: 17 → 18.
To Phase 57's existing carry-forward list (no change). Per v0.1 §14 and scoping v0.2 §Carry-forward inventory: Phase 31 voice residue; §1.3 refactor candidates; Phase 56 explain-affordance investigation; etc. All carry unchanged.
New to the amendment (per §P57-A9):
engine-correct-surface-drifted.standing-principle-not-named-in-source-of-truth-documents-allows-contradicting-surface-to-ship. Remediation: name the principle in what-dunin7-is-building at v0.21.substrate-friction-discipline-pattern-second-build-mode-firing. Two-instance evidence; the pattern shape is reliable.New queued direction (per §P57-A3):
loomworks-queued-directions-and-deferred-work-v0_12.md at Phase 57 close.Carries unchanged from Phase 57 v0.1 / scoping v0.2 / manifest v0.41 §2:
Positions 1 through 4 are preserved above in How we got here. The Discovery-record posture: prior positions named alongside corrections, never silently rewritten.
Open at v0.42 manifest absorption time:
loomworks-phase-57-cr-amendment-handoff-v0_1.md.what-dunin7-is-building v0.21 absorption. Out of scope per halt-surface §5 (settled item 5).DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks Phase 57 CR amendment scoping note — v0.1 — 2026-05-12