Repository navigation
feat(room): waitMark, a host's mark for the room's waits (R10) - #48
Merged
Merged
Conversation
…view's waits one hold, the import card in the mark, a conversation's wait a hold in its column
A host that loads in its own mark can hand the room that mark, and the room's waits then read as the host's. VibeField
loads in its living mark with one line under it (track HG: HG-W1…W5 and HG-L1, its DESIGN.md §8 "History"). With no
mark every wait is as rosetta's app shows it, and the reference host passes none.
- `RoomWaitMark` (`host-inputs.ts`, exported with `RoomWaitPlace`):
- `mark(place, { resting })` draws the mark for `"view"`, `"column"` or `"card"`, at rest while the work it stands
for is paused;
- `carried` says the host's own hold already stands where the room's first one comes.
- The view's waits are one hold (`HistoryRoom.tsx`, `components/ui/Hold.tsx`, `styles/hold.css`):
- reaching the index: `connectingTitle` over `connectionError ?? unavailable`, the face's own words;
- then the cold start before the first project (`coldStartHold`): the step's title, with the ellipsis of work
under way, over its amount. The first step's title stands alone. A paused import and paused updates stand at
rest.
- An index that has stopped answering keeps its face: a failure is no wait.
- The hold's timing (`lib/use-standing-hold.ts`; `afterWait` is its pure part):
- late 120ms; once shown it stands 800ms, then fades over 280ms (120ms under reduced motion);
- what comes next waits for it;
- a new line crossfades in place, 140ms out and 240ms in; words that come back while their line leaves come in
again at once.
- The import card in the mark (`IngestStatus.tsx`, `styles/ingest.css`):
- the mark where IMPORTING HISTORY stood, the step beside it;
- the title over its count (`readableText` where the step counts conversations, else its amount);
- a fraction the step knows as a colourless 2px hairline, none for one it does not;
- the detail, the amount, the recency line, the connection, the timer, the controls and the agents under Agent
details.
- The unmarked card is unchanged. Its live regions, footer and agent list are now shared parts (`StatusLive`,
`StatusFooter`, `AgentList`), drawn by both cards.
- A conversation's wait (`TranscriptLoading.tsx`) is a hold in its column, with Read available messages under its
words. A failed load keeps its own face and Try again.
- `Meter.tsx`: beside a mark, an amount nobody knows draws nothing. A fraction still fills, and a veil keeps its
words.
- `PAUSED_UPDATES` (`lib/ingest-activity.ts`) holds the paused words, which the card and the hold both read.
- `README.md` documents the input.
- Tests: `clients/app/test/room-wait-mark.test.mjs`, 9 tests (server renders and `afterWait`).
- Run here, each file alone: room-wait-mark 9/9, dom-contract 15/15, import-state 21/21, ingest-progress 11/11,
room-meters 5/5, room-not-answering 3/3, room-package 4/4, room-search-key 4/4.
- The protocol's and the room's builds (`tools/npm/build.mjs`) ran too; the room's is its typecheck, with
declarations.
- Not run here, so CI's: the rest of `npm test`, the app's build, the docs check, `check:packages` and the
Electron fixtures (room-host, cold-import).
- No server render drives the crossfade's effect, and no fixture covers it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A host input,
waitMark(R10,RoomWaitMark), that lets a host hand the room its own mark for the room'swaits. With one, the room draws its waits in that mark. With none, every wait stays as rosetta's app shows it today.
The reference host passes none, so the app reads byte for byte as before.
mark(place, { resting })draws the mark for one place,"view","column"or"card". The mark is at restwhile the work it stands for is paused.
carriedsays the host's own hold already stands where the room's first one comes. The room's first holdthen stands at once, so the mark is never faded out and shown again.
What changes when a mark is given:
(
HistoryRoom.tsx,components/ui/Hold.tsx):connectingTitle, or the step's own title with the ellipsis of work under way("Finding your history…", "Discovering conversations…");
first step's title stands alone, because its amount ("Looking for conversations…") counts nothing.
lib/use-standing-hold.ts):IngestStatus.tsx):stands through search too;
draw.
TranscriptLoading.tsx), its sketch and sweep gone. "Readavailable messages" stays under its words. A load that failed keeps its own face and Try again.
Meter.tsx). A meter that knows no amount draws nothing, a veil keeps itswords, and a meter that knows still fills.
PAUSED_UPDATESholds the card's paused words in one place (lib/ingest-activity.ts). The card and the hold bothread them, so they cannot drift.
Why
VibeField's History mounts this room. Its loads elsewhere (the Setup Assistant's) are one look: the field's living
mark and one line under it. Today History's waits are each in their own look:
--vf-selectbar;The card's bar is selection blue, against the room's own word for its meter ("The room's colourless meter",
Meter.tsx).This keeps the room's waits the room's own: their steps, their words, their place ("Progress describes its named
step and never covers available content"). It takes only the mark a host places in them, as the room already takes
connectingTitleand the consent slot. VibeField's ruling: track HG, HG-W1…W5 and HG-L1, DESIGN.md §8 "History".Asks (the owner's to rule)
mark(place, { resting }), rather than three node props. The room asks for themark where it waits, and the host draws it at the size the place needs (VibeField: 99 wide in a hold, 40 on the
card).
room's faces are untouched. Is that coupling right, or should the hold be its own option?
Tests
clients/app/test/room-wait-mark.test.mjs, 9 tests, server renders and the timing's pure function:details, at rest while paused;
Run on the author's Mac, one file at a time, on Node 26.5.0 and npm 12.0.1 after
npm ci --ignore-scripts:tools/npm/build.mjs). The room's build is its typecheck, withdeclarations.
room-not-answering 3/3, room-package 4/4 and room-search-key 4/4. These are every app test that imports a module
this changes, or walks the room's sources.
Proved by rosetta CI at this PR, not run here:
npm testand the app's build;check:packages;No server render drives the crossfade's effect, and no fixture covers it.
Out of scope
TranscriptReader) own opening face: VibeField's Peek keeps it as it is.🤖 Generated with Claude Code
Open in [code]smith · Need help on this PR? Tag
@codesmith-botwith what you need.