Skip to content

feat(#464): disambiguate colliding tab origins - #539

Merged
BorisTyshkevich merged 3 commits into
mainfrom
feat/tab-origin-disambiguation-464
Jul 29, 2026
Merged

feat(#464): disambiguate colliding tab origins#539
BorisTyshkevich merged 3 commits into
mainfrom
feat/tab-origin-disambiguation-464

Conversation

@BorisTyshkevich

@BorisTyshkevich BorisTyshkevich commented Jul 29, 2026

Copy link
Copy Markdown
Collaborator

What & why

Closes #464.

Same-named Workbench tabs now expose their source without widening every tab:

  • collision groups receive compact, minimally unique Dashboard, Library, or
    Draft badges;
  • Dashboard source stays derived from the canonical Separate Library queries from dashboard-owned query copies #427 ownership graph, while
    Dashboard-variable tabs use their existing document binding;
  • each selectable tab implements the ARIA tab keyboard model with roving focus,
    focus handoff after activation/close, and a full <source> / <document>
    tooltip;
  • accessible names expose unsaved, externally changed, and externally deleted
    states, while source abbreviations remain intact for Unicode graphemes;
  • Dashboard renames repaint open-tab context immediately;
  • dirty, conflict, deleted, and close indicators retain their established
    order and behavior.

The issue body and ADR-0003 now reflect the #471 decision that savedId already
provides stable query-tab identity; this PR deliberately adds no redundant
QueryTabOrigin state.

Validation

  • npm test — pass; 100% statements/lines, 99.94% functions, 96.84% branches
  • npm run build — pass; single dist/sql.html
  • focused Playwright tab/variable suites — 82 passed, 2 skipped across Chromium, Firefox,
    and WebKit
  • full Playwright run — 518 passed; five unrelated WebKit keyboard-focus
    failures reproduce on untouched base commit 3259b54
  • driven Chromium — collision badges, focus ring, accessible tree, tooltips,
    close behavior, and badge disappearance verified

Checklist

  • npm test passes (the per-file coverage gate is non-negotiable)
  • Tests added/updated in the same change as the code
  • npm run build succeeds (single-file dist/sql.html)
  • Layers kept honest: pure logic in src/core/, network in src/net/ (injected fetch), DOM in src/ui/
  • No new runtime dependency (or it's a deliberate, justified addition — see CONTRIBUTING)
  • README / CHANGELOG.md ([Unreleased]) updated if behavior or the deployed surface changed
  • Reconciled affected tracked work (roadmap Roadmap to 1.0.0 #68, the issue body, ADR/CHANGELOG) if this change reshaped it

Co-Authored-By: OpenAI Codex <noreply@openai.com>

Claude-Session: unavailable (OpenAI Codex)
@BorisTyshkevich BorisTyshkevich mentioned this pull request Jul 29, 2026
93 tasks
Co-Authored-By: OpenAI Codex <noreply@openai.com>

Claude-Session: unavailable (OpenAI Codex)
@BorisTyshkevich
BorisTyshkevich merged commit 63cfabe into main Jul 29, 2026
2 checks passed
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.

Disambiguate duplicate query names in editor tabs by stable origin

1 participant