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

Loomworks — Session Handoff 2026-05-29 — Composer Upload Port v0.1

Version. 0.1 Date. 2026-05-29 Status. Working draft. Closes the composer-upload-port work (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 that had accumulated: it filed queued-directions §15.3 (the upload assertion-grain gap plus two documentation corrections), and it 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 (below) — 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

The list from the 2026-05-28 evening handoff, closed:

  1. Configuration-drift remediation — closed (engine b793aef, 427c446). Prior session.
  2. Test-override audit — closed (engine d5d57ee). Prior session.
  3. File upload through the in-engagement composercomplete this session. Shape 2; built, tested, verified live on both surfaces. Detail below.
  4. Route-redisposition finding — resolved into queued-directions §15.1 third action (v0.21 methodology candidate). No build action.
  5. Operator real-passkey registration (dev RP-ID) — tracked, deferred (§13.3). Not sequenced. Unchanged.

Items 1, 2, 4 needed nothing. Item 5 remains parked by design. Item 3 was the session's work and is now done.

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 leaf components (UploadAttachmentButton, UploadResultCard, postUpload, filterPlatformSystemFiles) were already shared; only the orchestration needed extracting.

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. This was verified by reading architecture spec v0.4 (no "gateway"/"chokepoint"; OVA/FORAY are the governed boundary, both engine-side and seam-and-stub) and the Operator Layer call-pattern survey.

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

Build steps (each its own commit, Operator Layer loomworks)

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):

Tracked follow-ups — none blocking

Named here 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 (the record has no Markdown-to-HTML render specilist 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 (e.g. an image asking which extraction skill to run) renders the card, but its buttons have no wired action — CenterPane has no chip-to-reconverse path like ChatView's. Observed live (the .png upload). A small follow-up; the manual-content fallback (for unrecognized files) 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 has extraction skills for .md, images, and others, but not .json or .html, which fall back to manual-content. This is engine work (upload-facility-extension territory, 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 and 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 is hardcoded empty; no downstream promoter exists). 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). Two repos:
  1. Tag: composer-upload-port-v0_1, Operator-Layer-only (no engine tag — no engine change). Annotated.
  2. 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

| Repository | Head | State | |---|---|---| | Engine (loomworks-engine) | d5d57ee | Unchanged this session. | | Operator Layer (loomworks) | c2ca4db | Composer Upload Port Steps 1–4 + 401 test. Unpushed until batch push; tag composer-upload-port-v0_1 to apply. | | Record (loomworks-record) | 09876d0 | v0.21, v0.43, scoping note, CR v0.2 — first two pushed; CR v0.2 and this handoff unpushed until batch push. |


DUNIN7 · Loomworks · Session Handoff · Composer Upload Port v0.1 · 2026-05-29