Skip to content

What does registering a right-panel tab actually cost? #112

Description

@radroid

Question

Adding the panel means editing apps/web/src/components/RightPanelTabs.tsx, which upstream owns and
actively develops. That is a new row on docs/t3x/SEAMS.md, and the ledger tripwire says to
re-isolate before adding rows.

Measure it, do not estimate it:

  • Churn on RightPanelTabs.tsx over the 60 days before the merge-base, using the @<epoch> form
    from the ledger's Regenerating section (the relative-suffix form silently returns 0).
  • How many distinct places must change to register one tab? There are at least two case switches
    (around lines 413 and 482) plus the tab definition list around 175-225.
  • Is there any extension point that avoids the edit, or is the switch the only way in?
  • What would the row's risk figure be — fork lines changed × churn?

Then answer the actual decision: is a tab worth the row, or does the overlay precedent in
apps/web/src/coil/AutoResumeOverlay.tsx (fork-owned, near-zero seam) buy enough? Note the
counter-argument already on record: a map is something you keep open while working, which is a tab,
and dodging one ledger row is a poor reason to build the wrong thing.

Activity

  1. radroid commented on Sep 12, 2026

    @radroid
    OwnerAuthor

    Answered — measured during the loops design, docs/coil/loops-v2/UPSTREAM-DELTA.md (§ "RightPanelTabs.tsx moved") and FINDINGS.md.

    Registering a right-panel tab costs 2 seam rows: apps/web/src/components/rightPanelStore.ts (churn 7 in the 60 days before the merge-base) and apps/web/src/components/RightPanelTabs.tsx (churn 14). Upstream's own AgentsPanel.tsx is the precedent: a full-size tab is one store-slice entry plus one tab entry, and the panel body itself is a new file upstream never sees. Upstream has since restyled RightPanelTabs.tsx (a Button render prop, +13, styling only) without changing the registration shape, so the cost held across a sync.

    Contrast: the loops console cost zero rows because it mounted through the fork-owned <ThreadCoilOverlay> aggregator in _chat.$environmentId.$threadId.tsx, which is now free for every future per-thread fork surface. So the decision rule for #110 is: a per-thread surface goes through ThreadCoilOverlay at zero rows; only a surface that must live in the right panel's tab strip pays the two rows.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    wayfinder:researchWayfinder ticket (AFK): read docs/code to surface a fact

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions