Version. 0.2
Date. 2026-08-25
Author. Claude Code on DUNIN7-M4. Operator: Marvin Percival.
Status. Status compilation. Read-only against the record, the six repos, and the dev database. Nothing modified outside this document. No builds run, no code executed except read-only database queries.
Supersedes. loomworks-state-of-the-build-report-v0_1 (2026-07-28), which stands as sibling and is not edited.
Target. Measured against first-run-complete as the seed defines it (candidate seed v0.14, Success conditions): "DUNIN7's own engagements run inside Loomworks with their memory, their manifestations, their operators, and the methodology's disciplines active. These engagements enter Loomworks via a separate one-off induction solution that derives their seeds from prior material." Not against general health.
Method. Repos measured after git fetch --prune. Database facts queried live against playground_dev. Where the record and the repos disagree, the repos win and the disagreement is named. Two claims in this report were wrong on first pass and are marked where corrected.
The substrate is in good order and the four rooms work. First-run-complete is blocked on none of that — it is blocked on the fact that the three engagements it names have never been used.
Four weeks ago the picture was five fronts in different conditions, with a red suite, ten unpushed commits, and no critical path. Most of that is now resolved: the suite is green, the unpushed work is pushed, graph Stage 2 landed, and 66 change requests have shipped.
All four rooms are Operator-reachable today — Memory, Manifestation, Shaping and Rendering each have a real surface on the Operator Layer's main, with real acts, not placeholders. That is a genuine advance over v0.1 and the largest single change in the picture.
The induction solution is not missing. It exists, it was executed, and it produced three live engagements — but not the three the seed names. Its scope was narrowed on 2026-04-24 from Enrollium/ExpenseDesk/FarmGuard to PartsPilot/FieldPilot/Agricultural Engagement. That narrowing is recorded in exactly one document and has never been folded back into the queued direction that nominally tracks it.
And the three engagements it produced are empty. E0002 PartsPilot, E0003 FieldPilot, E0004 Agricultural Engagement each hold exactly two memory events, both dated 2026-04-24: the engagement commit and one relationship. Zero assertions. Zero manifestations. Zero shapes. Zero renders. Nothing in four months. This is the finding that matters most in this report: the machinery for first-run-complete is largely built, and the engagements it was built for have never been worked in.
One live risk. The Operator Layer serves a build made from main on 2026-08-14, but the checked-out working tree is on feat/foray-sales-generator, 65 commits behind main, and that branch's room dispatcher has only two of the four rooms. A rebuild in place would silently remove Manifestation and Shaping from the running product. Nothing warns about this.
On the CR ratio: the expectation was that most recent work is substrate. Over the whole four weeks that is false — 43 of 66 serve first-run-complete. Over the last ten days it is true, and over the last five days it is total: CR-2026-226 through 235 are all agent-governance substrate.
Measured 2026-08-25 after git fetch --prune on each. Same table shape as v0.1 §0.
| Repo | Branch | HEAD | Last commit | Sync | Dirty |
|---|---|---|---|---|---|
| loomworks-engine | main | 2f41aa7 | 2026-08-24 | in sync | clean |
| loomworks (Operator Layer) | feat/foray-sales-generator | 7f4838d | 2026-08-23 | in sync (pushed) | clean |
| loomworks main | — | 6344d04 | 2026-08-14 | in sync | — |
| loomworks-ui (Workshop) | main | 9521694 | 2026-06-24 | in sync; intentionally frozen | clean |
| stele | main | 689de41 | 2026-07-18 | in sync | clean |
| loomworks-marketing | cr-2026-152-sales-perspective-spike | 1735b6f | 2026-07-17 | in sync; 13 ahead of main (119232e) | clean |
| loomworks-record | main | 35f3452 | 2026-08-24 | in sync | clean |
Every repo is clean and in sync. No repo has uncommitted work. That is a change from v0.1, which carried a modified uv.lock and ten unpushed commits.
v0.1's most urgent item is closed. feat/foray-sales-generator was ten commits existing on one machine only. It is now pushed and tracking, at 7f4838d. The durability risk it named is gone.
Six local branches carry commits that are on no remote and not merged to origin/main:
| Repo | Branch | Tip | Commits not on origin/main | Last |
|---|---|---|---|---|
| loomworks | feat-in-engagement-dual-pane | 9141447 | 7 | 2026-06-26 |
| loomworks-engine | cr-2026-153-tools-menu-engine | b0dc30b | 3 | 2026-07-18 |
| loomworks | feat-create-stage-polish | 92226bf | 3 | 2026-06-29 |
| loomworks | cr-2026-153-tools-menu-operator | 70abd83 | 1 | 2026-07-17 |
| loomworks | fix-activity-ribbon-no-shift | deec59b | 1 | 2026-06-02 |
| loomworks-engine | source-identification-step-0 | c61fc07 | 1 | 2026-05-29 |
16 commits across six branches, single-copy. Materially smaller and older than v0.1's ten-commit finding, and none of it is recent work. b0dc30b is the one with a standing decision attached (v0.1 §4.3, still open — see §F). The other 47 local branches across the fleet are fully merged and safe to sweep.
main at 2f41aa7, 2026-08-25.test_stele_router_mount failure that every CR was waiving closed at 0b50d02 / 7bdbf8b (CR-2026-166 step 1, 2026-08-04), tagged stele-mount-test-fix-v0_1. The degrading gate v0.1 warned about is gone.0115 (was 0101), single head.main since 2026-07-28.All four rooms are reachable through an Operator-facing surface. This is the largest change since v0.1 and it is better than the record suggests.
| # | Step | Engine API | Operator surface | Companion (conversational) |
|---|---|---|---|---|
| 1 | Contribute knowledge into Memory | POST /engagements/{id}/assertions, .../commit | MemoryRoom.tsx — capture, Confirm (commit), Dismiss (discard), voice provenance, attachments | add_knowledge, commit_notes |
| 2 | Derive a Manifestation | POST .../manifestations/preview, .../derive | ManifestationRoom.tsx — previewRederive → RederiveConsent → commitRederive | none |
| 3 | Produce a Shape | POST .../shape-events, .../confirm | ShapingRoom.tsx — confirmShape; confirmation fires the engine post-append hook that enqueues production | produce_specification |
| 4 | Produce a Render | POST .../renders | RenderingRoom.tsx — lists produced outputs, open/download, retire-with-rationale | produce_artifact, initiate_render |
Rooms 1–3 carry the act itself on the surface. Room 4 is the exception: RenderingRoom is a read-and-retire surface with no "produce" button. A render is produced by confirming a Shape (the cascade in room 3), by asking the Companion, or through the API. That is a coherent design — production follows confirmation — but it means "produce a Render" is not a thing the Operator does directly in the Rendering room.
Manifestation has no Companion path. The Tier-1 delegation capabilities are exactly four — produce_specification, produce_artifact, initiate_render, commit_notes — and none derives a Manifestation. There is no derive_manifestation dispatcher anywhere in agents/ or orchestration/. Manifestation is surface-or-API only. Given the seed names manifestations explicitly in the first-run-complete condition, that asymmetry is worth knowing, though it blocks nothing.
Room 4 was executed live on 2026-08-24 under explicit authorization (operator test set, Test 8): two render jobs on engagement 11a11db7 ("Goosey the Moose") reached completed, spending real credits at system tier. Rooms 1–3 are traced through code and confirmed by the presence of real objects in the dev database, not executed — writing to Memory was outside this measurement's read-only scope.
Contributing to Memory does not require a passkey tap. commit_assertion gates on get_committing_resolved_actor — human actor plus commit authority — and does not call the step-up presence gate. A minted session with totp_verified=True reaches it. (Confirmed by the render path, which passes the same dependency.)
**Committing an engagement does.** commit_engagement and commit_engagement_divergent call _assert_commit_step_up → assert_commit_presence, which requires a fresh presence proof per the committer's organization policy: fail-closed for org-less, and an always-tap org requires a commit-time WebAuthn attestation.
What remains, exactly: the browser passkey-commit acceptance across the three engagement-creation doors — the same item v0.1 carried at its §7 #16. Everything downstream of an existing engagement (assertions, manifestations, shapes, renders) is reachable headlessly. Creating a new engagement through the ceremony is not, and I cannot complete it: it needs the Operator's own authenticator, physically. That is the only step in the four-room path that a headless session cannot perform.
Live in playground_dev: 255 assertions, 13 manifestations, 35 shape events, 24 render events across 58 active engagements. The richest is 11a11db7 "Goosey the Moose" — 13 object types, 177 objects, 19 render events (15 produced, 4 retired), 19 completed render jobs. The four-room chain demonstrably works end to end on a real engagement.
My initial reading of the room dispatcher found only two rooms wired, with honest empty states for Manifestation and Shaping. That reading was wrong — it came from the checked-out working tree, which sits on a branch 65 commits behind main. On main, all four rooms are wired. The stale reading is the same error shape this arc has hit repeatedly: reading a file is not reading the current file. It is recorded here rather than quietly fixed because the branch divergence that caused it is itself a live finding (§F).
It exists. It was executed. It produced three live engagements. And they are empty.
The seed says the induction solution derives seeds for Enrollium, ExpenseDesk and FarmGuard from prior material, and is not part of Loomworks. The expectation behind this question was that nothing exists. That is not what the evidence shows.
Two governing documents, both 2026-04-24:
candidate-seeds/induction/loomworks-induction-seed-drafting-handoff-v0_1.md — self-identifying: "This is the induction solution named in the Loomworks candidate seed v0.3 — a separate one-off solution deriving seeds from prior material. The induction solution is not part of Loomworks and is not a Loomworks phase."~/Downloads/seed-induction-package/seed-induction-cc-brief-v0_1.md — the runnable execution brief: pre-flight against the Phase 12 baseline, locate the SeedInductionAgent, verify a real LLM backend, run R-A13–R-A16 for three seeds in order, halt for Operator report after each.The scope was narrowed on the same date, recorded in the handoff:
> "Section 'Success conditions' names Enrollium, ExpenseDesk, and FarmGuard as engagements entering Loomworks; the scope has since narrowed to three agricultural-programme engagements (PartsPilot, FieldPilot, the Agricultural Engagement) going first." > "The Operator confirmed three engagements. Enrollium and ExpenseDesk wait."
FarmGuard was decomposed rather than seeded, also recorded there: FORAY (protocol) → PartsPilot (buying side) → FieldPilot (service side) → Agricultural Engagement (domain) → FarmGuard (branded farmer-facing instance). FarmGuard is the top of the stack, not an engagement. There will not be a FarmGuard seed; there are seeds for three layers beneath it.
It is not code. No script, no module, no package, no branch, in any repo. It was a document-driven process executed by Claude Code against the engine's own SeedInductionAgent. The one-off wrapper fed the in-product feature; it is not that feature.
| Product | Seed | Engagement | State |
|---|---|---|---|
| Enrollium | none anywhere | none | Explicitly parked: "Enrollium and ExpenseDesk wait." ~/enrollium/ contains zero occurrences of "loomworks" |
| ExpenseDesk | none anywhere | none | Same. ~/expense-desk/ contains zero occurrences of "loomworks" |
| FarmGuard | none, by ruling | none | Decomposed into the three layers below; source material is ~/Downloads/farmguard-discovery-record-v0_2.md. No farmguard repo or directory exists |
| PartsPilot | partspilot-candidate-seed-v0_1.md + JSON | E0002, active | Inducted 2026-04-24 |
| FieldPilot | fieldpilot-candidate-seed-v0_1.md + JSON | E0003, active | Inducted 2026-04-24 |
| Agricultural Engagement | agricultural-engagement-candidate-seed-v0_1.md + JSON | E0004, active | Inducted 2026-04-24 |
Queried live:
| Engagement | Memory events | Assertions | Manifestations | Shapes | Renders | |---|---|---|---|---|---| | E0002 PartsPilot | 2 | 0 | 0 | 0 | 0 | | E0003 FieldPilot | 2 | 0 | 0 | 0 | 0 | | E0004 Agricultural Engagement | 2 | 0 | 0 | 0 | 0 | | E0005 Loomworks | 308 | 73 | 10 | 2 | 4 |
The two events on each are engagement_committed and relationship_added, both dated 2026-04-24 — the induction itself. Nothing has happened in any of the three in four months.
So the seed's first-run-complete condition — DUNIN7's own engagements running with their memory, their manifestations, their operators and the disciplines active — is not close, and not for the reason the plans assume. The rooms work. The induction ran. The engagements exist. They have never been worked in. The gap is not capability; it is use.
The one DUNIN7 engagement that does satisfy the condition is Loomworks itself (E0005): 308 events, 73 assertions, 10 manifestations, 2 shapes, 4 renders. Loomworks is describing and building itself through its own production stream — the seed's second success axis — while the three inducted products sit inert.
The seed package is uncommitted. Three candidate seeds and six JSON files that produced live engagements E0002–E0004 exist only in ~/Downloads/seed-induction-package/. candidate-seeds/induction/ holds the handoff document and nothing else. There is no repo copy to mirror from.
The queued direction describes a world that moved on. queued-directions/…-v0_32.md §2.1 "Phase 30: induction of existing engagements" has been carried verbatim through 25 versions and still reads: "Deferred until Marvin asks to revisit… what remains is execution." The scope narrowing, the build, the run and the three landed engagements are recorded only in the April handoff and a June cleanup note, never folded back. Also unoccupied: INITIAL-COMMIT-NOTES-v0_1.html names landing zones candidate-seeds/enrollium/, candidate-seeds/expensedesk/, candidate-seeds/farmguard/ — none of the three directories exists.
66 change requests, CR-2026-154 through CR-2026-235, across 215 engine commits. One line each, marked [F] first-run-complete-serving or [S] substrate hardening.
| CR | Subject | |
|---|---|---|
| 154 | Graph hygiene, Stage 1 — redirect edge, vocabulary single-source, alternatives, supersession-aware answering | F |
| 155 | Graph Stage 2 — forward walk / dependents endpoint + GIN index | F |
| 157 | OVA Slice 1 — non-member contribution pathway | F |
| 158 | Memory registry completeness | F |
| 159 | B-29 the provenance seam (option A) | F |
| 161 | B-25 the record writes that aren't true | F |
| 162 | B-28 the discovery source mode | F |
| 165 | B-41 the stand-up sequence | F |
| 166 | The clean-report cluster, D-1 (fixed the router-mount failure) | F |
| 167 | CI gates — engine CI, Fernet key, sibling checkout | S |
| 169 | B-85 pinned-temperature seam survives API refusal | F |
| 170 | B-8 slice one — the Companion can see all four rooms | F |
| 171 | Small-work sweep | F |
| 173 | B-48 quality gates | S |
| 174 | Ruff gate closure (4 real bugs found via verification discipline) | S |
| 175 | Shape list display number | F |
| 176 | B-54 null display-number code fix | F |
| 177 | Manifestation preview metering | F |
| 178 | B-30 regression trap | S |
| 179 | B-12 recall window | F |
| 181 | B-14 spreadsheets and decks | F |
| 183 | B-61 citability | F |
| 184 | B-37 failed production visible | F |
| 185 | B-52 persist answer sources | F |
| 186 | B-55 type names | S |
| 190 | B-54 fixtures | S |
| 191 | B-70 log reconstruction | F |
| 192 | B-54 not-null | S |
| 194 | B-60 provenance to Memory | F |
| 195 | Legacy-turn designation exclusion recorded | S |
| 196 | B-67 organized-view citation | F |
| 197 | B-8 Companion drafts | F |
| 198 | B-84 polling determinism | S |
| 199 | Truthful replies | F |
| 200 | B-81 grant pathway | F |
| 201 | B-87 all claim replies | F |
| 202 | B-77 prompt cache | S |
| 203 | Raw-message grant extraction | F |
| 204 | Chat provenance marker | F |
| 205 | Persist operation outcome | F |
| 206 | Creation terminal control | F |
| 207 | Candidate ceremony home | F |
| 209 | Title both faces | F |
| 212 | Findings visible and answerable | F |
| 213 | Turn kinds single source | S |
| 215 | Discard policy fence | F |
| 216 | Orphaned findings sweep | F |
| 217 | Finding-count lineage filter | F |
| 218 | Forget ordinal answer | F |
| 219 | Recall limit pin | F |
| 220 | Held-assent truthfulness | F |
| 221 | Seed supersession | F |
| 222 | Stage-2 agent spec | S |
| 223 | Seed-extract hardening | F |
| 224 | B-105 schema move | S |
| 225 | Engagement semantic recall (pgvector foundation) | F |
| 226 | W7 — the system actor kind and sanctioned writers | S |
| 227 | W1 — agent identities seeded and resolved, agent sessions | S |
| 228 | Every path is gated; an agent action carries its run | S |
| 229 | W2 — grantability at the front, one check two lanes | S |
| 230 | W4 — presence: heartbeat and the silent session | S |
| 231 | The session bound at the act; grant-lifecycle record | S |
| 232 | Unsessioned agent actions: sentinel and baseline | S |
| 233 | FORAY R-2 forward-gap closure | S |
| 234 | The human-authority check resolves the actor | S |
| 235 | Retire the rendering roster role in place | S |
| Window | Total | First-run-complete | Substrate | Substrate share | |---|---|---|---|---| | Whole period (2026-07-28 → 08-25) | 66 | 43 | 23 | 35% | | Last 10 days (from CR-216) | 20 | 8 | 12 | 60% | | Last 5 days (CR-226 → 235) | 10 | 0 | 10 | 100% |
The expectation that most of it is substrate is false for the period and true for the present. Two-thirds of the four weeks' output served the product line — the Companion seeing all four rooms, findings visible and answerable, provenance to Memory, truthful replies, semantic recall, graph Stage 2. The turn to substrate is recent and sharp: every CR since 2026-08-20 is agent-governance hardening, an unbroken run of ten. That run is coherent work with a clear arc (H0 agent governance, then FORAY forward-gap, then the authority gate), but it has not advanced first-run-complete at all, and it is where capacity currently sits.
The build queue is still at v0.4 (2026-06-28). No newer version has been filed; the document has not been updated in eight weeks.
| # | Item | v0.1 said | Measured now |
|---|---|---|---|
| 1 | List-loading retrofit | Partially delivered, unstarted retrofit | PARTIAL, small motion. usePagedList gained a room-state contract (6eb1b7f, 2026-08-01); ShapingRoom was built to the pattern from the start (2026-08-03). Still wholesale: ManifestationRoom (single fetch, no LoadMoreControl) and the home's "Your engagements" / "Shared" zones — usePagedList has exactly two call sites on main, both in Home.tsx |
| 3 | Folder upload | "Not started; frontend sends bare file.name" | LANDED — and v0.1's premise was wrong. src/lib/uploads.ts:45 uses file.webkitRelativePath \|\| file.name; webkitdirectory on both upload buttons; src/lib/folder-upload.ts filters platform junk. Merged 3526385, 2026-07-02 — 26 days before v0.1 said it was unstarted |
| 5 | Command/settings discoverability | Not started | UNTOUCHED. Zero frontend hits for a settings catalog on main; the engine's list_settings() is pre-existing CR-2026-099 substrate from 2026-06-10; scoping note unchanged since Jun 28. No CR |
| 6 | Conversation search | Not started | UNTOUCHED. Zero hits in either repo; no search endpoint over the message stream; scoping note unchanged since Jun 28. No CR |
So: one of the four was already done and miscounted, one has moved a little, two have not moved at all in eight weeks. The queue still reads as active work and is still not marked paused.
| Stage | v0.1 said | Measured now |
|---|---|---|
| Stage 2 — forward walk | Not started | LANDED, 2026-07-28 16:00 — merge 7ba761e, tag graph-stage-2-v0_1, build e27e1bc (+1425 lines). GET /engagements/{id}/assertions/{id}/dependents, dependents_count on revise and retract, GIN index in migration 0102, 16 tests. It landed roughly four hours after v0.1 was written — both "unstarted" and "landed" are defensible depending on the hour |
| Stage 3 — as-of-a-date reads | Not started | UNSTARTED. No code, no CR, no branch. The only movement is design: investigations/loomworks-temporal-retrieval-investigation-v0_1.md (2026-08-16), filed into queued directions §18.6 and held |
Two qualifications on Stage 2. Its surface half was never built — dependents has zero hits in the Operator Layer, so the strategy's "surface dependents to the Operator on supersede/retract" is unbuilt. And the endpoint ships unpaginated, filed as an accepted divergence at queued-directions §21.1, "open and deliberately unsequenced".
v0.1 concluded there is no critical path — only capacity and decisions. That is still true, with one exception that is new and genuinely blocking-shaped.
The Operator Layer's checked-out branch would regress the running product if rebuilt.
com.dunin7.loomworks-operator-layer runs next start on port 3002 with WorkingDirectory=/Users/dunin7/loomworks, serving a .next build dated 2026-08-14 20:08 — which matches main (6344d04, 2026-08-14).feat/foray-sales-generator, 65 commits behind main and 12 ahead.RoomView.tsx has zero references to ManifestationRoom and renders honest empty states for compose and shape.
Any next build in that directory — a routine act, a deploy script, a restart procedure that rebuilds — replaces a four-room product with a two-room one, silently. Nothing checks branch identity before building, and the empty states are honest-looking rather than broken, so the regression would not announce itself.
This is a real blocker in the strict sense the question asks for: it blocks safe rebuild/deploy of the Operator Layer until the branch situation is resolved. It is not a decision; it is a hazard.
Only three, and all three are inherited:
b0dc30b disposition → engine branch sweep. Unchanged from v0.1 §4.3. The investigation specifies the tests; the branch still carries 3 single-copy commits.Everything else that looks stuck is waiting on a decision, not on work:
docs/api/api-reference.md last touched 2026-06-28. scripts/check_api_docs_fresh.py exists and is still referenced by zero test files, so drift remains silent. v0.1 flagged this at 106 commits; it has tripled.current-status-manifest-v0_78 (2026-08-01) plus amendment v0.2 (2026-08-06). Better than v0.1's month, and it has advanced v0.72 → v0.78, but the last five days' agent-governance arc (CRs 226–235) is not in it.Resolved: the unpushed Operator Layer work (pushed); the red suite (fixed 2026-08-04); graph Stage 2 (landed the same day v0.1 was written); folder upload (had already landed 2026-07-02); all four rooms Operator-reachable (v0.1 did not measure this).
Unchanged: Companion queue items 5 and 6; graph Stage 3; b0dc30b; the marketing branch; the API-reference drift, now worse.
New: the Operator Layer branch/build divergence (§F); the induction solution's true state and the three empty engagements (§C); a ten-CR unbroken run of substrate work (§D).
git read on 2026-08-25 after fetch --prune.playground_dev: object counts, engagement contents, event counts and dates. No writes.main at 2f41aa7 this session. Operator Layer, Workshop, Stele and marketing suites were not run and no figures for them are carried here — v0.1's were already a month old and would now be two.DUNIN7 — Done In Seven LLC — Miami, Florida Loomworks — State of the Build — Report — v0.2 — 2026-08-25