DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path session-handoffs/loomworks-session-handoff-2026-05-29-composer-upload-port-v0_1.html
LoomworksSession Handoffv0.12026-05-29

Composer Upload Port

Item 3 complete and verified live on both surfaces. Closes the 2026-05-28/29 arc.

Version   0.1
Date   2026-05-29
Status   Working draft. Closes item 3 and the 2026-05-28/29 arc.

Plain-language summary

This session opened on the 2026-05-28 evening handoff's five-item list and closes it. The headline result: item 3 — file upload through the in-engagement composer — is complete and verified on the live system, on both the new surface (CenterPane) and the old one (ChatView), across upload success and fallback paths. The work shipped as Shape 2 (a shared upload hook both surfaces consume) in five build steps plus one gap-closing test, each its own commit, with frontend behaviour preserved and proven.

Along the way the session paid down record debt: it filed queued-directions §15.3 (the upload assertion-grain gap plus two documentation corrections), and corrected the current-status manifest, which had mislabeled Phase 60 as "Upload pathway v1" when Phase 60 is actually Companion-as-Operator-system-interface. Both landed and pushed before the build began.

What is left: a short tracked follow-up list — none blocking, all named so they survive the session. The decision this handoff records is that item 3 is done; the action it carries forward is the batch push of the build commits and this handoff, and the tag composer-upload-port-v0_1.

The five-item list — final state

#ItemState
1Configuration-drift remediationClosed (engine b793aef, 427c446). Prior session.
2Test-override auditClosed (engine d5d57ee). Prior session.
3File upload through the in-engagement composerComplete this session. Shape 2; built, tested, verified live on both surfaces.
4Route-redisposition findingResolved into queued-directions §15.1 (v0.21 methodology candidate). No build action.
5Operator real-passkey registration (dev RP-ID)Tracked, deferred (§13.3). Not sequenced. Unchanged.

What shipped — item 3

Shape 2. The upload orchestration (~100 lines, formerly inlined in ChatView's handleUpload) was extracted into a shared, turn-type-agnostic hook, src/hooks/useEngagementUpload.ts. Both ChatView and CenterPane consume it.

The seam, resolved on evidence. The composer's upload goes direct to the engine (/engagements/{id}/uploads) via the existing postUpload, because the Operator Layer has no backend tier — it is a pure frontend; every call already terminates at the engine. The "gateway" alternative had no spec or code basis (architecture spec v0.4 names no gateway/chokepoint; OVA/FORAY are the governed boundary, both engine-side and seam-and-stub).

Draft persistence added (CR v0.2 amendment). Step 0 surfaced that CenterPane lost typed drafts on navigation while ChatView preserved them. The parity gap was closed in-scope: CenterPane now uses the same proven composer-draft.ts mechanism, keyed per engagement. The two surfaces are now symmetric.

Build steps (each its own commit, Operator Layer)

Final code head: c2ca4db. Test suite: 399 passing, typecheck and lint at baseline throughout.

Live verification (Step 5) — both surfaces, 2026-05-29

Run against the live engine + MinIO + browser stack (the exercise that originally surfaced the transaction bug; green tests alone are not sufficient evidence). All passed:

Record work that landed and pushed this session

Both pushed to loomworks-record origin before the build:

The CR documents are in the record but not yet pushed (see batch push): the scoping note v0.1 (822a75a) and Change Request v0.2 (09876d0), both in change-requests/.

Tracked follow-ups — none blocking

Named so they survive the session. None gate item 3's completion.

  1. v0.43 manifest HTML companion — pending. The manifest landed Markdown-only; its HTML companion was deferred (no Markdown-to-HTML render specialist in the record yet; queued-directions §3.3). The .md is canonical and correct.
  2. Composer onClarificationPick not wired. On CenterPane, an upload that returns a clarification card renders it, but its buttons have no wired action — CenterPane has no chip-to-reconverse path like ChatView's. Observed live. A small follow-up; the manual-content fallback does work.
  3. CR v0.1 placement never landed. Only CR v0.2 is in the record. Harmless (v0.2 supersedes v0.1) but noted.
  4. Engine extraction coverage for .json and .html. Surfaced clearly by live testing: the engine extracts .md, images, and others, but not .json/.html, which fall back to manual-content. Engine work (upload-facility-extension, queued-directions §4), not a frontend defect.
  5. Record-site static-asset MIME error. The record.dunin7.com/operations/discipline-mechanisms/ editor page serves editor.js/site.css as text/html, so the browser refuses them. A record-site serving issue, unrelated to this work, surfaced incidentally during testing.

Assertion-grain gap (the larger open engine item)

Recorded in full at queued-directions §15.3. Upload writes a UploadEventReceived Memory event with full provenance, but drafts no individually-affirmable Assertions (assertions_drafted hardcoded empty; no downstream promoter). Upload content is searchable and provenance-attributable but does not reach the assertion grain the rest of the Memory pipeline operates on. Independent of item 3; present on the path ChatView used before this work; a real engine work item, unsequenced.

What to do next

  1. Batch push (Operator-authorized). loomworks (code): push c2ca4db and the tag composer-upload-port-v0_1. loomworks-record: push 09876d0 (CR v0.2) plus this handoff.
  2. Tag: composer-upload-port-v0_1, Operator-Layer-only (no engine tag — no engine change). Annotated.
  3. The dev stack (engine :8000, OL :3001, MinIO :9000) is running in the background from this session's testing; leave or stop as desired.

Repository heads at close

RepositoryHeadState
Engine (loomworks-engine)d5d57eeUnchanged this session.
Operator Layer (loomworks)c2ca4dbSteps 1–4 + 401 test. Unpushed until batch push; tag composer-upload-port-v0_1 to apply.
Record (loomworks-record)09876d0v0.21, v0.43 pushed; scoping note, CR v0.2, and this handoff unpushed until batch push.
DUNIN7 · Loomworks · Session Handoff · Composer Upload Port v0.1 · 2026-05-29