Version. 0.1 Date. 2026-05-08 Audience. Claude Code (CC), executing on DUNIN7-M4. Purpose. Eight pre-CR-drafting verifications against the live codebase. CC produces a findings document; does not propose remediation, edit the scoping note, draft a CR, or implement.
The Phase 50 scoping note v0.1 (loomworks-phase-50-scoping-note-v0_1.md) settled three primary build items: Companion-as-Authority decision logic for grants (item 2), public credit-request form endpoint (item 3, engine half), Operator override path for conversion-credit asset_id (item 8). The scoping note's §8 listed eight pre-flight items where the draft sketches assume substrate shapes that have not been verified against the live codebase.
This brief is the verification ask. CC reads the scoping note and this brief, runs each of the eight verifications, and produces a findings document. The findings either confirm the scoping note's draft sketches (CR drafting can begin), reveal naming-only divergences (drafting absorbs them inline), or surface architectural friction (scoping note bumps to v0.2 to absorb).
CC does not propose remediation. CC does not edit the scoping note. CC does not draft a CR. CC does not start implementation. CC reports.
loomworks-phase-50-scoping-note-v0_1.md (scope, decisions, draft sketches that this brief verifies)current-status-manifest-v0_35.md (Phase 49 close state — substrate baseline)Optional reads if a verification needs context:
phase-49-implementation-notes-v0_2.md (engine repo docs/phase-impl-notes/) — Phase 49 build-recordphase-49-cr-companion-intelligence-v0_3.md (engine repo docs/phase-crs/) — Phase 49 CR (active)phase-48-implementation-notes-v0_1.md (engine repo docs/phase-impl-notes/) — Phase 48 build-record (relevant for verification 6, conversion observer)DUNIN7/loomworks-engine, tag phase-49-companion-intelligence at engine f27aba3 (annotated tag object cf24958). 2,023 tests passed, 26 skipped, Alembic head 0064. Working tree clean on main.DUNIN7/loomworks, tag phase-49-companion-intelligence at frontend 6a3653b (annotated tag object 9c8c116). 128 vitest passed, 28 test files, 11 prerendered routes (one of which is /settings), eslint/tsc/build clean.DUNIN7/loomworks-ui, unchanged from Phase 48 baseline. Not in Phase 50 scope.If the live baseline diverges (test count off by more than ±2 routine noise, Alembic head different, working tree dirty, tag missing), CC stops at the start and reports before running any verifications.
Each verification has four parts: ask (what to verify), look at (where to read), evidence expected (what the finding should cite), verdict criteria (when each verdict applies).
Ask. Confirm register_action_dispatcher signature and ApprovalCard extension pattern. The scoping note assumes Phase 49's bimodal dispatch (delegation_required: bool = True, on_decline: Callable | None = None) is the surface item 2's dispatcher registers against, and that the Phase 49 item 9 ProposalApprovalCard is the closest-fit reuse pattern for item 2's GrantDecisionApprovalCard.
Look at.
phase_45/dispatch.py (function register_action_dispatcher, process_approval, process_decline); the Phase 49 reconciliation dispatcher registration call site (the file that registers delegation_required=False for reconciliation).ProposalApprovalCard component file and the base ApprovalCard it extends (or the discriminator pattern, if it works that way).Evidence expected.
register_action_dispatcher, process_approval, process_decline.on_decline (what arguments it receives, what it returns).ApprovalCard extension/composition shape (subclass, discriminator union, render-prop pattern, etc.).ProposalApprovalCard (or its actual name if different).Verdict criteria.
GrantDecisionApprovalCard will be a sibling to ProposalApprovalCard with the same scaffolding.ProposalApprovalCard is not a clean extension point, requires refactor before GrantDecisionApprovalCard slots in). Names what scoping note §4.1 needs to revise.ProposalApprovalCard is not a viable reuse template. CR drafting needs scoping note v0.2.
Ask. Confirm read_credit_management_assertions (or whatever it's actually named in loomworks/credit/cross_engagement_memory.py) parameterizes the category filter cleanly enough to support a second category (conversion_credit_policy for item 8), or whether item 8 needs a sibling function. The scoping note assumes the filter path correction from Phase 49 (payload->'metadata'->>'category') is in place and that the function takes a category parameter.
Look at.
loomworks/credit/cross_engagement_memory.py — module structure, function signatures, current category filter constants.Evidence expected.
cross_engagement_memory.py.Verdict criteria.
conversion_credit_policy is unnecessary; item 8's read fits cleanly.model_profile but generalization for a second category requires either a small refactor (extract category to a parameter) or a sibling function. CR §4.3 read-seam wiring expands by one small step.
Ask. Confirm whether the engine has rate-limit middleware, CORS configuration, and a clean public-endpoint validation pattern. Item 3's POST /authority/grant-request is a public unauthenticated endpoint; the scoping note §4.2 sketches all three pieces but does not assert their presence.
Look at.
POST /claim/grant (Phase 47, possibly Phase 48), POST /signup (Phase 47/48).pyproject.toml.Evidence expected.
Verdict criteria.
Ask. Confirm the existing ActorRef kinds and how Phase 16 contributions create Memory events with non-Operator authoring. The scoping note §4.2 recommends Companion-as-receiver for the form submission's Memory event (ActorRef(kind="companion")); alternatives are system-actor (sentinel) or external-actor (new ActorRef kind).
Look at.
ActorRef model definition (kind enum / literal). Phase 41 introduced kind="companion"; Phase 49 used person-actor and Companion-actor in bimodal dispatch.ActorRef for system-emitted events (DST/DRT events from Phase 49 ensure_reconciliation_specialists_declared are one example).Evidence expected.
ActorRef.kind values currently supported in the model.kind="companion" requires a companion_id or comparable association — if so, whether the Credit Management Engagement's Companion has an identity that the dispatcher can use.Verdict criteria.
kind="companion" and the appropriate Companion id pass validation. Item 3's design carries.
Ask. Determine whether the new grant_request_received event kind needs Phase 38 declare-and-register treatment (specification-grammar extension via lifespan hook, like Phase 49's ensure_reconciliation_specialists_declared) or whether it's a routine Memory event that doesn't require DST/DRT declaration. The distinction matters: declare-and-register fires bootstrap-idempotent appender code; routine event creation does not.
Look at.
Evidence expected.
grant_request_received is a new entry or an existing one.ensure_reconciliation_specialists_declared shape — what it does, what it idempotently appends.Verdict criteria.
grant_request_received is a routine Memory event in the Phase 16 sense; no DST/DRT declaration needed; item 3's CR slots in cleanly.grant_request_received requires declare-and-register; item 3's CR adds a ensure_grant_request_event_declared lifespan hook. (Aligns with Phase 49 Finding 2 — engagement specification grammar evolves through Memory contributions, post-bootstrap.)
Ask. Confirm _on_api_key_saved_for_conversion (Phase 48 CR §12.3) — module location, signature, integration with register_on_api_key_saved. Item 8 extends it; the extension shape in scoping note §4.3 should not surprise the existing structure.
Look at.
loomworks/credit/conversion.py or similar, but verify); the register_on_api_key_saved hook registration._on_api_key_saved_for_conversion — current logic, how it reads the referee's most recent claimed grant, how it calls seam.write_referral_credit_flow.Evidence expected.
_on_api_key_saved_for_conversion.register_on_api_key_saved registration call site.credit.foray_action_flows with metadata->>'reason' = 'conversion_detected').Verdict criteria.
asset_id_source and override_assertion_id) requires schema considerations the scoping note didn't anticipate. Reports the specifics.
Ask. Confirm where Phase 49's three credit_voice templates live (prompts/credit_voice/tier_drop.md, prompts/credit_voice/near_exhaustion.md, prompts/credit_voice/exhaustion_choice.md) and how they are loaded into voice composition. Item 2's prompts/credit_voice/grant_proposal.md lands in the same location with the same loading pattern.
Look at.
prompts/credit_voice/ directory (or whatever path Phase 49 actually used).loomworks/credit/companion_intelligence/voice_composition.py per scoping note §1 — Phase 49's listed touched modules).Evidence expected.
grant_proposal.md mirrors this).Verdict criteria.
grant_proposal.md slots in.Ask. If Verification 3 reveals no rate-limit middleware or no CORS config mechanism, this verification supports the scoping decision: does Phase 50 add the simplest viable form, or does the gap warrant scoping note v0.2 / Phase 51 deferral? Provides the evidence base for that call.
Look at.
pyproject.toml (e.g., slowapi, fastapi-limiter) or absent.Evidence expected.
Verdict criteria.
CC produces phase-50-step-0-findings-v0_1.md at /Users/dunin7/loomworks-engine/docs/phase-impl-notes/. One section per verification. Each section: verdict (HOLDS / PARTIALLY HOLDS / BREAKS / INCONCLUSIVE / NOT NEEDED for verification 8), evidence (file paths, line numbers, function signatures, exact strings as found), implication for scoping note (carry / naming-only divergence / architectural amendment).
CC then tells Marvin which of three states the findings put Phase 50 in:
CC does not propose remediation in the findings document. CC does not edit the scoping note. CC does not start CR drafting. CC does not start implementation. CC reports.
Place this brief at /Users/dunin7/loomworks-engine/docs/phase-impl-notes/phase-50-step-0-inspection-brief-v0_1.md (or wherever you prefer; adjust the first line of the kickoff accordingly). Then open a new CC session on DUNIN7-M4 and paste:
Read /Users/dunin7/loomworks-engine/docs/phase-impl-notes/phase-50-step-0-inspection-brief-v0_1.md
Run all eight verifications against the live codebase at /Users/dunin7/loomworks-engine. For verifications that cross into the Operator Layer frontend repo, also read /Users/dunin7/loomworks. Phase 49 tag for reference: phase-49-companion-intelligence at engine f27aba3 / frontend 6a3653b.
Reading order before running: loomworks-phase-50-scoping-note-v0_1.md (in project knowledge); current-status-manifest-v0_35.md (in project knowledge); this brief.
Produce findings at /Users/dunin7/loomworks-engine/docs/phase-impl-notes/phase-50-step-0-findings-v0_1.md.
One section per verification. Each section: verdict (HOLDS / PARTIALLY HOLDS / BREAKS / INCONCLUSIVE; verification 8 also accepts NOT NEEDED), evidence (file paths, line numbers, function signatures, exact strings as found), implication for scoping note (carry / naming-only divergence / architectural amendment).
Do not propose remediation. Do not edit the scoping note. Do not start CR drafting or implementation.
Report back with the findings document.
The receiving CC session reads the brief, runs the verifications, produces the findings document, and reports.
loomworks-phase-50-scoping-note-v0_1.md — parent scoping note. CC reads this first (the brief presupposes its draft sketches).current-status-manifest-v0_35.md — current substrate state.phase-49-implementation-notes-v0_2.md (engine repo docs/phase-impl-notes/) — Phase 49 build-record.phase-49-cr-companion-intelligence-v0_3.md (engine repo docs/phase-crs/) — Phase 49 CR (active).phase-48-implementation-notes-v0_1.md (engine repo docs/phase-impl-notes/) — Phase 48 build-record (relevant for Verification 6).DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks Phase 50 Step 0 Inspection Brief — v0.1 — 2026-05-08