Skip to content

Teams-first UX: the whole shell, rebuilt (PageHeader, Files v3, Integrations, sidebar, search) - #1280

Merged
ja-818 merged 20 commits into
mainfrom
agent/task-20260807-042631-oagel/houston
Aug 9, 2026
Merged

Teams-first UX: the whole shell, rebuilt (PageHeader, Files v3, Integrations, sidebar, search)#1280
ja-818 merged 20 commits into
mainfrom
agent/task-20260807-042631-oagel/houston

Conversation

@ja-818

@ja-818 ja-818 commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Teams-first UX: the whole shell, rebuilt

This branch replaces the per-agent tab world with a teams-first shell and componentizes the page chrome that came out of it. Built and design-reviewed live with Julian over multi-day iteration; adversarially reviewed (one Codex + one Claude reviewer), fix-looped, and fully verified before this PR.

What's in here (commit narrative, top-down)

  1. feat(teams) — the client body: useTeams() seam over two backends, five-arm team-header click grammar, team-as-home lozenge, single-row highlight rule, team-scoped board with roster-first card names, team context/routines/settings surfaces, the Inbox view.
  2. feat(tokens)tab-track / tab-active semantic pair for the Safari header (light: 6% ink track + white pill; dark: 6% white + elevated gray).
  3. feat(shell) — the PageHeader family: one 48px header grammar (Safari lozenge track, generic tabs + compact switcher, width-mode tools portal with stacked fallback, shared grow-on-focus HeaderSearch); the old title block renamed PageHero.
  4. feat(integrations) — first non-team adopter: (Integrations | Custom integrations) lozenges with the rail's own mark, search + category in the header on both tabs, borderless flat Installed, quiet 14/13px section titles, container-aware two-cell catalog plane centered at its natural width.
  5. feat(files) — team Files as ONE flat list: agents are accordion rows (lazy read on first expand, single-agent auto-expand), folders unfold in place, list-only, no breadcrumbs, per-agent New targeting, cross-agent drags rejected loudly.
  6. feat(sidebar) — Linear-parity rail anatomy: one row primitive, three band instances, Ionicons Sharp glyphs, 1px rhythm, inset pill fills, 13px/510 type.
  7. feat(search) — one CatalogSearchField everywhere (busy spinner + adaptive placeholder folded in; board, Store, Files, AI hub converge; role="searchbox" as the cross-surface selector contract).
  8. test+chore / docs(kb) — spec rewrites to the new grammar, fake-host teams double, showcase, parity manifests, and the KB truth-fix batch.
  9. Merge of main — including the PRODUCT-1208 routine screen, ported into the new world: it is the drill-in from Team → Routines → row (no duplicate editor kept).

Review + verification

  • Two adversarial reviewers (correctness/security + conventions/reuse). All confirmed findings fixed with failing-test-first where reproducible: internal drag-move now honors the hovered folder; dead surfaces deleted (notifications-bell, mission-scope-picker, dormant unread pipeline, orphaned locale keys); two file-size violations split; search-unification holdouts converged.
  • Gates: biome, full workspace typecheck, app unit tests (3,361), ui package suites, locales (en/es/pt parity), web typecheck + shim parity, inventory parity.
  • Full Playwright e2e suite green (reconciled to the new grammar; real bugs found by the suite fixed in-place). Visual baselines re-recorded intentionally for darwin + linux in this PR.

KB note

knowledge-base/ carries the truth-fix batch for the new world (board is team-scoped only, sidebar anatomy, files story, four persisted ui-store keys). Flagging per the KB-approval rule: these lines describe what this PR builds.

No Linear issue — Julian-directed live design iteration in-session (related, not resolved by this PR: PRODUCT-1021).
Sibling PR: gethouston/cloud#233 (C13 wave 2 — the gateway side of team identity/context this client consumes).

🤖 Generated with Claude Code

ja-818 and others added 20 commits August 7, 2026 15:30
New app/src/components/agent-settings/: a master-detail settings page
per agent (Context: job description, learnings; Permissions: people
with an Everyone-on-your-team/Only-specific-people choice, allowed
apps, allowed AI models, skills). Settings > Permissions drills into
it; the Context/Admin agent tabs consume the same shared rail, nav
model, and section switch (agent-admin-nav/-sidebar/-screen deleted).
Self-lockout and roster-materialization writes are confirm-gated;
share analytics fire on an actual access-widening diff.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The sidebar becomes Your teams: named groups render as team blocks
(section rows: Mission Control, Team Settings; agents beneath), and the
ungrouped section becomes the virtual default team named after the
workspace — no stored-layout migration. Clicking an agent opens its
team's Mission Control with the agent filter pre-set. New team view
(viewMode "team"): team-scoped mission board + archive sharing the ONE
cross-agent sweep (scopePaths over the full roster), and Team Settings
drilling into the agent settings page. Board keyboard/⌘N registration
is active-view-gated so kept-alive boards can't steal handlers.
ui/layout gains section rows + defaultGroup (props-only, inventory
v55). KB: knowledge-base/teams-ui.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every team gains Routines and Files: Routines is one aggregated list
across the team's agents (owner chips, drafts included, owner-routed
writes, cache-shared fan-out over the existing per-agent query keys —
no new sweep), Files is the honest per-agent tree behind the same
agent dropdown idiom. Partial failures render a named, retryable
agent-reads strip with a Report-bug affordance, shared by the per-agent
Files tab (AgentFilesSurface: two surfaces, one wiring). ui/routines
gains ownerChip props (inventory v56).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deletes the 7-tab agent shell (Activity/Context/Skills/Integrations/
Routines/Files/Admin) and migrates every door: sidebar, mentions,
notifications, palette, shortcuts, tour, create/import reveal, and
turn-summary deep links land on team Mission Control / Routines /
Files or the Team Settings drill-in. Agent managers keep configure
access via per-team section gating; plain members deliberately see
usage surfaces only. Rescued en route: notifications bell, share-via-
team door, routines timezone, warming rows, just-created-mission
handoff. components/tabs/ renamed to components/agent/; dead agent-
mode machinery, locked-catalog chain, write-only conversations cache,
ten orphaned hooks and ~25 dead symbols removed. Tour rewritten (15
typed steps). Visual baselines re-recorded (darwin+linux).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One seam, two backends: useTeams() reads server teams when the
gateway advertises agentTeams (nine C13 client methods across
engine-client, the web adapter, and app hooks), else the local
sidebar-layout groups, byte-identical. Sidebar splits joined teams
from an Other-teams join block (Linear semantics: joining pins, it
does not gate — unjoined public teams are viewable); Team Settings
gains the team name field and a Members card (owner flags, danger-
toned remove, default team read-only). Server owns membership and
team order (optimistic sortOrder reorder); the local layout survives
as a per-user ordering overlay that never destroys stored groups and
rolls back exactly on refused moves. Expected C13 refusals surface
as informational toasts in en/es/pt. Fake host grows the C13 routes
gate-order-faithful; inventory v57.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Full staleness audit against current code, then: 4 historical docs
deleted (windows-vm.md keeps the salvage), teams/agent-manifest/
integrations/production-infra split into 13 single-topic docs,
~150 cited false claims fixed (certificate noun un-inverted, mobile/
is alive, approval interaction retired, GCIP not Supabase, Linear-510
type ramp, tour/store/portable truths), Felipe→Julian sweep, index +
dispatch regenerated to route all 37 docs. New KB rules: bullets of
what's built, Julian-approved changes only, delete stale lines first.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The client body of the teams UX: teams-model/useTeams seams, five-arm header click, home-lozenge grammar, single-row highlight, board scoping with roster-first card names, team context/routines/settings surfaces, inbox view, and the shell wiring that replaced the per-agent tab world.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two new semantic tokens (light: 6% ink track + white active pill; dark: 6% white + elevated gray) wired source JSON -> dist -> @theme.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rSearch

One 48px header grammar for every page: lozenge track + white active pill, generic tabs/switcher, width-mode tools portal with stacked fallback, the shared grow-on-focus search wrapper; the old title block renamed PageHero.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(Integrations | Custom integrations) lozenges with the rail's own mark, search + category riding the header on both tabs, borderless flat Installed, quiet 14/13px section titles, container-aware capped grid centered at its natural width.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
No navigation inside Files: agent accordion rows (lazy read on first expand, single-agent auto-expand), folders unfold in place, list-only, tools in the team header with per-agent New targeting, cross-agent drags walled off.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
One row primitive, three band instances, Ionicons Sharp glyph set, 1px rhythm through blocks, inset pill fills, 13px/510 type, empty blocks show only their add row.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Integrations field is the truth: busy spinner and adaptive placeholder folded in, searchbox role as the cross-surface selector contract; board, Store, Files, AI hub all converge; Store pills rescale to match.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Playwright spec files rewritten to the new grammar (not yet reconciled-by-run), fake-host agent-teams routes, showcase specimens, parity manifests, and the review fix-wave residue.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Board is team-scoped only, inbox replaces the bell, sidebar anatomy and files story updated; four persisted ui-store keys, not five.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…42631-oagel/houston

# Conflicts:
#	CLAUDE.md
#	app/src/components/agent/routine-model-selector.tsx
#	app/src/components/agent/routine-runs-dialog.tsx
#	app/src/components/agent/routine-screen-header.tsx
#	app/src/components/agent/routine-screen-sections.tsx
#	app/src/components/agent/routine-screen.tsx
#	app/src/components/agent/routines-tab-model.ts
#	app/src/components/agent/routines-tab-pane.tsx
#	app/src/components/board/agent-board-items.ts
#	app/src/components/board/use-agent-board-data.ts
#	app/src/components/tabs/archived-tab.tsx
#	app/src/components/tabs/routines-tab.tsx
#	app/src/components/turn-file-summary.tsx
#	design/inventory/CHANGELOG.md
#	knowledge-base/agent-manifest.md
#	knowledge-base/auth.md
#	knowledge-base/integrations.md
#	knowledge-base/production-infra.md
#	packages/design-tokens/tokens/semantic/color.dark.json
#	packages/design-tokens/tokens/semantic/color.light.json
#	packages/web/e2e/chat-markdown-preview.spec.ts
#	packages/web/e2e/visual/__screenshots__/chat-markdown.visual.spec.ts/chat-markdown-dark-darwin.png
#	packages/web/e2e/visual/__screenshots__/chat-markdown.visual.spec.ts/chat-markdown-dark-linux.png
#	packages/web/e2e/visual/__screenshots__/chat-markdown.visual.spec.ts/chat-markdown-light-darwin.png
#	packages/web/e2e/visual/__screenshots__/chat-markdown.visual.spec.ts/chat-markdown-light-linux.png
#	ui/core/src/globals.css
- sidebar-layout writes now compose in the same tick: the optimistic cache
  write moved out of the async onMutate, whose microtask delay let
  back-to-back ops (create team -> stamp identity) both read the pre-write
  cache and silently persist an empty layout, destroying the new team
- the agent row menu fences React portal-event bubbling so a click on a
  portaled item can no longer drill into the agent underneath, unmounting
  the menu and the move-confirm dialog it just opened
- creating a team lands you in it (the Linear grammar), both backends
- the Files New menu no longer restores focus to its trigger on close: the
  restoration blurred the freshly-mounted inline folder input, whose
  blur-cancel killed the creation before it was ever visible
- Files list rows regained their row/columnheader semantics (a11y)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Desktop viewport (1440x900) makes the full lozenge grammar the tested
surface with dedicated narrow-viewport switcher coverage; helpers became
self-sufficient (return to a team from any top-level view, or-chains
first()-guarded against legitimate multi-surface states); specs rewritten
to the shipped grammar (accordion rail, empty-board agent picker, split
panel titles, membership-scoped visibility worlds); identity forced OFF
for the functional server so ambient Firebase config can never flip the
suite into a login wall.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…+ linux

Force re-record (--update-snapshots=all) after the teams-first overhaul:
PageHeader family + Safari lozenge track, Files v3 accordions, Integrations
header adoption, search unification. Absorbs the deferred row-primitive
drift; bless-log updated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
On a slow CI box the width observer can flip the strip from tabs to the
compact switcher between the helper's isVisible check and its click; the
tab unmounts and the click spins to timeout. The section just moved —
fall through to the switcher path instead of dying.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@ja-818
ja-818 merged commit 78ff09a into main Aug 9, 2026
12 checks passed
@ja-818
ja-818 deleted the agent/task-20260807-042631-oagel/houston branch August 9, 2026 18:30
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