DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path phases/stele-extraction-phase-4/loomworks-stele-phase-4-to-5-handoff-v0_1.md

Loomworks — Stele Extraction Phase 4→5 Session Handoff — v0.1

Version. 0.1 Date. 2026-06-15 Author. Marvin Percival (DUNIN7 Operator) with Claude.ai (scoping/CR) on DUNIN7-M4. Status. Session handoff. Phase 4 (CR-2026-107) is complete, merged, and published. This document orients the next session (new Claude.ai chat; likely new CC session) on the current build state and the Phase 5 starting point. It does not re-tell Phase 4 — that lives in the completion record (see "Read first"). Markdown primary (technical consumer / next-session orientation).


Plain-language summary

Phase 4 split the sign-up flow into mint (Stele) + onboard (host), with an orphaned-principal state that heals on sign-in. It is fully landed: merged to engine main, the CR stack and completion record are published, the branch is deleted. Nothing is in flight. The next phase is Phase 5 — credential lifecycle. This handoff says where everything sits right now and what to read before starting Phase 5.

Read first (orientation pair + the Phase 4 record)

Before doing anything in the next session, read these, in order, from loomworks-record (record.dunin7.com, behind Cloudflare Access — if a file can't be reached directly, ask CC to fetch it):

  1. The highest-versioned current-status-manifest-vN_M in current-status/ — the recent state. (At this writing the highest filed is v0.57, but do not assume — read the highest actually present; the manifest may have been bumped to fold in Phase 4.)
  2. The highest-versioned loomworks-candidate-seed-vN_M in candidate-seeds/loomworks/ — the foundation document (canonical at this writing: v0.12).
  3. The Stele Phase 4 completion recordphases/stele-extraction-phase-4/loomworks-stele-phase-4-completion-record-v0_1.md (loomworks-record ae3775f). This is the full Phase 4 story: what moved, the four-version CR trajectory, the two build-caught corrections, the two-half database-truth proof, the two logged limitations, the Phase 5 handoff section. The handoff you are reading now is the thin pointer; the completion record is the substance.
  4. CR-2026-107 v0.4change-requests/cr-2026-107-stele-extraction-phase-4-v0_4.md (loomworks-record 1d8aef8) — the governing CR, if the next session needs the executable detail behind the record.
  5. The Stele body-of-work brief and the integration design (their canonical locations as named in prior handoffs) — for the Phase 5 row and the mint/credential contracts.

Current build state (verified, as of 2026-06-15)

| Ref | Hash | State | |---|---|---| | engine origin/main | 9be25fd | Phase 4 merged; alembic 0084 | | engine local main | 9be25fd | == origin (in sync) | | loomworks-record origin/main | 1d8aef8 | CR v0.3, completion record, CR v0.4 (all pushed) | | playground_dev alembic | 0084 | matches main code | | playground_test alembic | 0084 | matches main code | | Phase 4 branch | — | deleted (local + remote); main carries the full series |

Suite at Phase 4 close: 2921 passed / 46 skipped / 0 failed. Runs from main consistently (code 0084, dev DB 0084).

Nothing is in flight. No open branch, no uncommitted work, no pending CC halt. The next session starts clean from main at 9be25fd.

What Phase 4 put in place (one-paragraph recap — full detail in the completion record)

Sign-up is now two-phase: mint_principal (Stele, stele/registry.py) creates the identity (person row, encrypted TOTP secret, passkey credential, recovery codes) and commits; onboard (host, persons/onboard.py) does commons/org membership, personal engagement, system saved filters, and the credit-grant claim, and commits separately. A new onboarding_complete boolean on the person row (migration 0084, inverted backfill) marks the state between them. If onboard fails after the mint commits, the principal is an orphan; _heal_if_orphaned (in both login routes, post-gate, pre-cookie) runs onboard to completion on the next sign-in. create_person remains a separate bare credential-less test/utility primitive. The host-seam principle holds: Stele owns the identity primitives, the host owns the policy around them.

Phase 5 — the starting point

Phase 5 = credential lifecycle. The brief's Phase 5 row: second-passkey enrollment, passkey-revoke, TOTP-rotate, recovery-code surfacing — the credential-management operations that belong to Stele's identity surface but were deferred while the mint/resolve/split spine was built.

Scoping note before drafting: an account-recovery amendment already landed separately on the Companion functional spec (§10.3: second-passkey enrollment, recovery-code surfacing with soft-invalidation, a unified /me/security/ router, the OneTimeSecretsDisplay component). Phase 5 must be scoped against what that amendment already did and did not cover — do not re-build what's already there. The first Phase 5 task is to establish, from the real code, what /me/security/ currently provides versus what the Phase 5 row still needs. (Mechanism 3, founder authority, was deferred and bound to A3 in CR-2026-098 — a separate thread, not Phase 5's concern unless it surfaces.)

Standing disciplines to carry into Phase 5 (the Stele-extraction method, hardened across Phases 0–4)

Two logged limitations carried forward (not Phase 5's obligation unless it chooses them)

Both on the failed-signup-with-claim path, same root (pending record discarded at mint-commit): (1) failed-signup UX gap — a user whose onboard fails has no session and no pending record, and heal only fires on sign-in, so a brand-new user may not know to sign in; (2) orphaned claim — a failed signup with a credit claim heals without the auto-claim (the grant survives unclaimed in the credit system). Candidates for a later heal/recovery-UX pass. Detailed in the completion record §6 and the queued-directions document.

A correction to the repo working-model (recorded so it isn't repeated)

Through all of Phase 4, engine origin/main sat at d3acd84 (the Phase 3 endpoint) — the bcb59f5 "Archive CR v0.2" commit lived only on local main and the branch, never independently pushed, until the Phase 4 merge fast-forwarded origin/main to 9be25fd. Do not assume local main == origin/main between phases; intermediate main commits may be local-only until a merge pushes them. Check the real ref.

Pending Operator items (none on the execution path)


DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks — Stele Extraction Phase 4→5 Session Handoff — v0.1 — 2026-06-15