Skip to content

Reconcile parallel agent sessions → main - #3

Open
aa-hh wants to merge 11 commits into
mainfrom
integration/20260622
Open

Reconcile parallel agent sessions → main#3
aa-hh wants to merge 11 commits into
mainfrom
integration/20260622

Conversation

@aa-hh

@aa-hh aa-hh commented Jun 21, 2026

Copy link
Copy Markdown
Owner

Integrates the work from several concurrent agent sessions into one branch.

What's included

  • Chrome 53 CSS guardrailscripts/check-chrome53-css.cjs + test/chrome53-css-guardrail.test.js (runs in npm test), browserslist: ["chrome 53"]. Bans Chrome 53-unsupported CSS unless a line carries /* chrome53-ok: reason */.
  • Worktree reconcilerscripts/reconcile-worktrees.sh + docs/reconcile-runbook.md for future multi-agent integration.
  • tvpush.sh — configurable TV target (.tvtarget), simulator launch, full setup flow.
  • Detail screen — episode-panel Chrome 53 flex fix (vertical overlap on the B8); ⋯ Options menu rework.
  • Settings screen rebuild — grouped TV cards + inline log-sink field, button container fixes, registry reconcile (from feat/settings-redesign).
  • Nav-drawer/sidebar reconcile, Jellyfin server picker, player chrome focus, perf/security/ui AGENTS docs.

Conflict resolution notes

  • settingsScreen.js: took the rebuild, re-applied main's multi-backend signout fix (clears provider/activeServer → provider-picker).
  • app.css: took HEAD's newer provider-card/jellyfin-login/server-picker; added back settings-redesign's new settings vocabulary (.gt-inline-field, .gt-settings-*, .gt-switch); dropped its stale .provider-tile duplicates.
  • component-registry.md: took HEAD (a newer superset; settings-redesign's reconcile was already superseded).

Validation

  • ✅ Build passes
  • ✅ Chrome 53 CSS guardrail green
  • ⚠️ Tests: 603/604 pass. The one failure — hub-poster-prefetch (expects width=180, code emits 210) — is pre-existing on main, unrelated to this work, and needs the owner's call on the intended poster size.

🤖 Generated with Claude Code

Alec Henderson and others added 11 commits June 20, 2026 00:04
…log-sink field

Settings was a flat scroll of hand-rolled rows with native <select>s and weak
D-pad focus. Rebuilt on a reusable TV component vocabulary, single-scroll grouped
cards (keeps the global sidebar), M3 blue tokens.

- controls.js: createSettingsCard + info/picker/switch/action row factories
- settingsScreen: grouped cards (Account, Plex Home, Watchlists, Playback,
  Network, Developer) + Sign out footer; modal pickers (3+ options) and switches
  (binary) replace native <select>; on-screen Back removed (remote-only)
- Log sink URL: TV-safe inline edit-toggle field (Set/Save/Edit + Test). Traps the
  on-screen keyboard's delete/cursor keys so they don't move app focus; input
  shortened so the CTA stays D-pad-reachable; CTA neutral (inverts on focus, not
  permanently blue)
- playback/network sub-renderers converted to the new rows
- component-registry: resolved specs recorded

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…IN-pad CSS test

The log-sink field was only reachable via Right from the row above — a short input
with a right-aligned CTA sits off the vertical travel column, and the geometric nav
(cross-axis penalty ×8) skipped it for the centred Sign-out below.

- Read state is now a full-width focusable row (label + value), offset 0, so Down
  always lands on it. Selecting it reveals an inline editor (input + Save/Cancel/Test)
  and hides the read row; focus is contained between input and the buttons while the
  keyboard is up (LEFT/RIGHT cycle buttons, UP re-opens keyboard, Back/Esc cancels).
- Test now pings the value currently in the editor.
- Drop flex-wrap:wrap from .gt-settings-editor__actions: the PIN-pad test uses a
  whole-file greedy regex (/\.pin-pad-grid[\s\S]*flex-wrap:\s*wrap/) that any later
  flex-wrap:wrap trips. Buttons fit on one row anyway.
- Registry updated to the full-width-row pattern.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… from Figma

The Save/Cancel/Test buttons changed text colour on focus but not their fill: the
`.gt-settings-editor__actions .btn { background }` override (added so a filled
button reads on the elevated card) out-specified the shared `.btn:focus`, so the
focus inversion never applied to the background.

- Re-assert the light-pill inversion on `.gt-settings-editor__actions .btn:focus`
  (background --focus-fill + colour --focus-on-fill), matching the TV Design Kit
  (focused filled button = light pill + dark label, confirmed via Figma screenshot).
- flex:0 0 auto so the full .btn padding is never squeezed.
- Record a Button entry in the component registry from the kit (node 168:1226 +
  ImageButton states): pill shape, padding, label/large type, focus inversion, and
  the elevated-card gotcha + the broken .btn-outline:focus caveat.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Android TV button-container guideline requires "solid color containers for filled
buttons". Our .btn rest bg was --gt-surface-2 (#1E1F20), identical to surface-
container / settings cards, so buttons had no visible container on those surfaces
(only the editor buttons had a subtle per-card bg hack).

- Add --button-container: #303030 (TV Compose inverse-on-surface — the kit's
  default filled-button fill, node 168:1189) and point .btn at it globally. Reads
  on every surface (page, cards); focus still inverts to the light pill.
- Drop the per-card bg override + focus re-assert on .gt-settings-editor__actions
  .btn (now redundant); keep flex:0 0 auto so padding is never squeezed.
- Registry: record the container rules + solid fill; remove the elevated-card hack note.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Previous rounds fixed the button container colour/focus but never touched padding,
which is what the feedback was actually about. The container had 12/28px padding
but min-height:52px swallowed the vertical, so buttons read as tight pills with no
internal breathing room.

- .btn padding 12/28 → --space-5/--space-6 (20/24px). Scaled from the kit
  container proportion (py12/px16 vs a 14px label) to our 10-ft 22px label, so the
  solid container has real internal padding. Verified in a CSS harness: button
  height 52px → 71px, bg #303030, focus still inverts to the light pill.
- Registry: record the resolved padding + height.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…to the solid .btn container

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…e rich source of truth

Merges the recovered original (83b6a73: protocol + node-id index + ~13 components
with statuses) with the settings redesign (Inline Edit-Toggle, Settings screen,
updated Button), the Jellyfin backend (Provider picker / Login / User picker), and
the Home rail motion spec. Normalizes statuses to the ✅/🚧/📝/📐 vocabulary and
records open reconciliations (Button fill, .btn-outline:focus).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Combined uncommitted work from several concurrent agent sessions that ran in
the main worktree:
- Chrome 53 CSS guardrail (scripts/check-chrome53-css.cjs + test) + browserslist
- Worktree reconciler (scripts/reconcile-worktrees.sh + docs/reconcile-runbook.md)
- tvpush.sh: configurable TV target (.tvtarget) + simulator launch
- detail screen: episode-panel Chrome 53 flex fix, ⋯ Options menu rework
- nav-drawer/sidebar reconcile, jellyfin server picker, player chrome focus
- perf/security/ui AGENTS.md docs

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts:
#	docs/design-system/component-registry.md
#	src/styles/app.css
#	src/ui/screens/settingsScreen.js
A self-referential node_modules symlink was committed on feat/settings-redesign
and came in via the merge — it makes every package resolve as 'too many levels
of symbolic links'. Untrack it and tighten .gitignore (node_modules/ → node_modules
so a symlink-file can't be tracked either). package-lock refreshed by reinstall.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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