Skip to content

docs(adr): console navigation — Fleets → Agent drill-down, persistent management chat, Debug drawer - #83

Open
brettchien wants to merge 5 commits into
mainfrom
docs/console-navigation-ia
Open

docs(adr): console navigation — Fleets → Agent drill-down, persistent management chat, Debug drawer#83
brettchien wants to merge 5 commits into
mainfrom
docs/console-navigation-ia

Conversation

@brettchien

Copy link
Copy Markdown
Contributor

Direction-alignment ADR capturing tonight's design discussion with Brett on Studio's console information architecture.

Why now

#82 (the empty Config tab) turned out to be a duplicate-id="config" bug — a symptom of the console mixing always-visible sections and tab-switched panes with no shared navigation model. Brett asked to reconsider the IA from first principles: people use Studio to deploy agents, manage fleets, and 1:1 chat with spawned agents.

What this ADR decides

  • Main content area becomes a drill-down — Fleets → Fleet detail (members) → Agent console — replacing the flat tab strip, using the Fleets-as-grouping-unit model already decided in fleet-grouping-and-connection-model.md.
  • The management console's chat stays persistent across all navigation (it talks to the one designated management-bound agent, not whichever fleet/agent is selected); an agent console's own chat is scoped/contextual — formalizing the split agent-consoles.md already implied.
  • Deploy (Compose) becomes an action reachable from Fleets/Fleet-detail ("+ New fleet" / "+ Add instance"), not a standing tab.
  • Activity / MCP / Config collapse into a single secondary Debug drawer — implementation-detail surfaces, not part of the deploy/manage/chat journey.
  • Global chrome (brand/build stamp, theme toggle, update check) is unaffected.

Explicit non-goal

openab-pty stays out of Studio — Brett confirmed Connect remains a separate product; this ADR only reshapes the console for OAB (OABService/OABFleet) agents.

This is a direction-alignment doc — no code changes. Implementation would land in slices against main.ts/render.ts/index.html per the existing console verification bar (tsc/vitest/vite build).

🤖 Generated with Claude Code

brettchien added a commit that referenced this pull request Aug 18, 2026
…/6) (#88)

ADR #83 §7.5: both entry points share the compose→preview→deploy engine
(compose_library_get/compose_preview/deploy_provision), reached as an
action from the Fleets (7.2) and Fleet detail (7.3) screens instead of
sitting behind a standing tab. + New fleet runs a net-new fleet-identity
step first (7.5.1); + Add instance skips straight to Compose, inheriting
the fleet it was opened from (7.5.2).

fleets.toml is only ever mutated after a confirmed successful provision
(new src/fleetToml.ts, pure text-level append — fleet_config_write has
no partial-write primitive, so both flows read-modify-write the full
file client-side, per the ADR).

The existing Compose tab (library authoring) is left in place — Part C
also calls for dropping it once deploy is action-driven, but where
template/overlay authoring moves to isn't decided in the ADR; punting
that to the slice 7 self-review rather than deleting a working surface
speculatively.
brettchien added a commit that referenced this pull request Aug 18, 2026
…e 6/6) (#89)

ADR #83 Part D / §7.6: Activity, MCP · oab-mcp, and Config (cluster /
profile / region) drop off the top-level tab strip and collapse into
one secondary Debug drawer that slides over the right edge, opened by
a `[⚙]` from either the Fleets screen (per-row, scoped to that fleet,
7.2) or the Fleet detail header (scoped to the active fleet, 7.3).
Their internals are unchanged — same panes, same tab switch inside the
drawer — only their standing in the top-level navigation moves.

Compose is the one thing left outside the drawer: it's now always
visible in its own section (nothing left to tab away from, since the
other three moved) rather than a fourth peer tab.

Fixes two duplicate-id bugs of the same class as #82, both
reintroduced by slice 1 and only surfaced now that this code is
touched again: `id="config"` collided between the Fleets-screen mount
and the bottom Config pane (`getElementById("config")` always resolved
to the Fleets screen — the debug Config tab never showed the form it
should have), and `id="cfg-save"` collided between the fleets.toml/
registry TOML editor's Save button and the Config pane's own submit
button (`config.ts`'s save-disable logic was wired to the wrong
button). The Config pane's ids are now `debug-config` / `debug-cfg-save`.
brettchien added a commit that referenced this pull request Aug 18, 2026
…bug + polish (#90)

Self-review of console-navigation-ia (ADR #83) now that all six
implementation slices are merged — read the full post-slice-6 console/
(not per-slice diffs) against the ADR §7 mockups and checked for the
#82 class of bug (duplicate ids, getElementById grabbing the wrong
element, `hidden` not actually toggling).

Found via a Playwright render check (headless Chromium, screenshots),
not just reading:

- **`#debug-drawer` was visible from first paint, `hidden` attribute
  notwithstanding.** `.debug-drawer { display: flex; ... }` and the
  `[hidden]` UA-stylesheet rule have equal specificity — the later
  author rule won the cascade, so the drawer (position: fixed,
  z-index: 50) rendered on top of the whole app before any `[⚙]` was
  ever clicked. Fixed with a `.debug-drawer[hidden] { display: none }`
  override. Every other `hidden`-toggled element in the console
  (`#deploy-wrap`, `#fleet-detail`, `#config-editor`, `#mcpio`,
  `#debug-config`) was checked the same way and doesn't have this
  problem — none of them set their own `display` on the toggled
  element itself.
- The drawer also visually covered the topbar's right-side controls
  (cluster/poll status, theme/update buttons) while open, confirmed by
  the same render check. Gave `.topbar` its own stacking context
  (`position: relative; z-index: 60`, above the drawer's 50) so it
  stays on top, per Part E ("persistent chrome... spans every
  screen").
- No duplicate ids or dangling `getElementById` references anywhere in
  `console/` (checked exhaustively — every id is unique, every
  `getElementById` call target exists).

Also two small cleanups surfaced by reading the whole file instead of
per-slice diffs: `.logs` (dead CSS — nothing has used that class since
Activity/MCP/Config moved into the Debug drawer) and two "Compose
tab"/"Config tab" code comments left over from before Compose stopped
being a tab and Config moved into the drawer.

No other mockup-fidelity or cross-slice consistency issues found —
persistent chat, `[+ New fleet]`/`[+ Add instance]`/`[⚙]` wiring, and
class-naming reuse (`cfg-btn`, `fd-btn`/`fd-gear`) all check out
against ADR §7.
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