Skip to content

Role page: holds and holders; no launch chrome on notes - #28

Merged
cailmdaley merged 1 commit into
mainfrom
design/ws-rolepage
Oct 7, 2026
Merged

cailmdaley merged 1 commit into
mainfrom
design/ws-rolepage

Conversation

@cailmdaley

@cailmdaley cailmdaley commented Oct 7, 2026 •

Copy link
Copy Markdown
Owner

A role's page now shows which constitutions name the role and who holds it. Notes and roles no longer show the controls for launching, configuring or reviewing a constitution.

Quiet chrome on fibers off the Desk

  • The check is onDesk in fiberPageState.ts, the same one Offer no column or verdicts on a fiber outside the Desk's lifecycle #26 uses: a fiber with a shuttle block, or a cycle. Any other fiber (a role, a holder page, a plain note) now gets no control band from Workspace.controls(). That removes the settings disclosure (the "me" strip, the agent picker and Promote), History, the composer and the verdicts. Composer focus and Escape handling read the same band, so they do nothing on these pages.
  • Its card in the reader sidebar has no lifecycle glyph (the ✓ that buildCardPaper gives a fiber that isn't Shuttle-managed). The Desk's own cards are unchanged.
  • Promote can no longer be reached from the reader on a note. Promote installed a plain fiber as a paused Shuttle draft through POST /api/v1/lifecycle {action: install, disabled: true}. shuttle install on the command line still does this. The Dock still has the code path, but it can now only be reached on a cycle that has no shuttle block.
  • What stays: body, lede, wikilinks, the document strip.

Role page (a fiber whose id is exactly roles/<slug>; roles/<slug>/<holder> is not a role page)

  • Held by: the direct children roles/<slug>/<holder> from the fiber index the wikilinks already fetch. They show as quiet mono-caps links, resolved exactly, and each opens its holder page. The line stays hidden until the index arrives, and stays hidden if there are no holders.
  • Holds: the feed cards whose card.roles include the slug, ordered by Desk column: awaiting review, in flight, drafts, then pinned, resting, tempered, discarded. Each row is a dot in the column's colour (awaiting review gold, in flight in the agent's blue, tempered verdigris, hollow otherwise), then the name, a short mono column label, and a one-line outcome. Clicking a row opens the constitution through openFiber. Rows in the first three columns always show; past five rows, the rest are folded behind "N more". If the role holds nothing, there is no heading.
  • The feed includes closed constitutions, tempered and discarded alike: the daemon's kanban_walks (--has-field shuttle) take every status. So the list shows the whole history, with live work first.
  • The role fiber isn't in the feed, so Workspace.update() now re-checks the prose revision for fibers outside the feed. The revision includes the holds, so the role page follows roster changes as the feed polls.
  • New module workspace/RolePage.ts. The styles in fiber-prose.css use only reader tokens. The captions are role=heading divs rather than h2, so a constitution theme's prose-heading styles don't apply to them.

Look (harness, mocked daemon; the fixture role "surveyor" is held by opus and sonnet and named by three constitutions in three columns; "scribe" holds nothing and has no holders)

Role page with holds and holders
Role holding nothing
Plain note
Constitution (unchanged)

Phone (390 px): role page, role holding nothing, note, constitution

Gates

  • npm test: 126 files, 1535 tests pass (America/Los_Angeles). Under Europe/Paris, the only failure is the "runs under the pinned zone" guard, which is expected outside npm test. tsc --noEmit and npm run build pass.
  • New tests: RolePage.test.ts covers the exact slug, Desk order, holders limited to direct children, row and holder clicks, the fold, a role holding nothing, and holder pages and notes getting no ledger. Workspace.integration.test.ts checks that a role page has no band, settings, history, composer or verdicts, that its holds follow feed polls, and that a row opens the constitution with its band. Reader.sidebar.test.ts checks the glyph. Two existing integration tests now open a Shuttle-managed card, because they assert on the band.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XEBcfWbydFqYZm6DhLvCqT

A fiber outside the Desk's lifecycle (a note or a role) has no settings
disclosure, History, composer or verdicts on its page, and no lifecycle
glyph on its sidebar card. A role page (exactly roles/<slug>) lists,
between its lede and body, the holder pages beneath it and the feed's
constitutions whose roster names it, in Desk order, each opening in the
reader.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XEBcfWbydFqYZm6DhLvCqT
@cailmdaley
cailmdaley merged commit 84048f4 into main Oct 7, 2026
2 of 4 checks passed
@cailmdaley
cailmdaley deleted the design/ws-rolepage branch October 7, 2026 13:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant