Version. 0.2
Date. 2026-06-02
Author. Claude (amendment), under Operator (Marvin Percival) direction.
Repository. DUNIN7/loomworks (Operator Layer frontend).
Amends. composer-placement-and-message-order-change-request-v0_1.md (2026-05-19), which remains in force in full except for the single decision amended below. v0.1 is preserved unchanged.
v0.2 amends exactly one decision from v0.1 — the activity-ribbon placement in §C.2 — to make the specification agree with the shipped code. Everything else in v0.1 (composer-at-top reshape §C.2 body, message-order setting §A/§B, auto-expand §C.3, tests §C.5, methodology §G, etc.) stands unchanged.
The change has shipped; v0.1's text no longer described the code. This amendment closes that gap and records the trajectory (header placement chosen first, then moved) per the corrections-not-smoothed discipline.
Seed check (gating). The current Loomworks seed — highest is candidate-seeds/loomworks/loomworks-candidate-seed-v0_9.md — is silent on activity-ribbon / activity-observability placement. Per the seed's own governance rule ("the seed names the commitments; the specification names the detail; when the seed is silent on a topic the specification covers, the specification governs"), ribbon placement is a specification/CR-level concern. This is therefore a CR amendment, not a seed-level change.
> ~~The composer renders at the top of the center area, just below the conversation header (title + metadata line + activity ribbon).~~ (v0.1 §C.2, line 163 — the parenthetical placing the ribbon in the header) > > ~~The activity ribbon stays in the conversation header in both modes — its position is independent of the composer/conversation order.~~ (v0.1 §C.2, line 177)
This header placement was the position v0.1 specified, and it was the placement a prior build deliberately realigned to (engine §F was mis-cited earlier; the authoritative stub spec is the in-engagement-surface-fill-in CR). It is superseded by the decision below.
The activity ribbon is anchored to the TOP OF THE TRANSCRIPT region, not the conversation header. Specifically:
activity-summary: shaping.running > 0 || rendering.running > 0); idle leaves nothing in the DOM (zero footprint).position:relative wrapper around the scrolling conversation), floating over the low-information date-divider area. Its placement is independent of the composer/conversation order (composer is always at the top of the flow per the rest of §C.2).position/top/left/right/min-height) is set via inline style, not the Tailwind absolute utility, so the no-shift property does not depend on Tailwind emitting that class.top:100%). In the active state this dropped the ribbon onto the composer, visually covering the message input and Send button — the input the Operator is about to use. (pointer-events:none kept the controls clickable, but they were visually obscured.) Confirmed in the rendered browser.tests/components/operator/InEngagementSkeleton.test.tsx — structural: ribbon lives in the transcript region (center-pane-transcript-region), not the header; absent when idle; out-of-flow via inline style.tests/e2e/activity-ribbon-no-shift.spec.ts — Playwright (real CSS/geometry): asserts position:absolute, zero transcript shift on toggle, composer-clear, and that the 2-line clamp bounds the bar height under a very long message.DUNIN7/loomworks)66e2573 — header-anchored overlay (the realignment to v0.1's header placement; the placement this amendment supersedes).d5a6f37 — re-anchor to the transcript-top region + 2-line clamp (the v0.2 decision).f1d8fd1 — merge of the re-anchor into main.
(Prior related: d815555 engine-§F comment citation fix; 01c3b77 idle gate.)
This amendment records spec/code agreement for the activity-ribbon placement only. v0.1 governs all other decisions. Filed in loomworks-record/change-requests/. NB: v0.1 currently resides only in ~/Downloads and should be landed alongside this file so the superseded and current decisions live together in the record.