Skip to content

fix(workbench): isolate adapters and clarify thread notifications - #90

Merged
filipgutica merged 10 commits into
mainfrom
fix/workbench-boundaries
Oct 1, 2026
Merged

filipgutica merged 10 commits into
mainfrom
fix/workbench-boundaries

Conversation

@filipgutica

@filipgutica filipgutica commented Oct 1, 2026 •

Copy link
Copy Markdown
Owner

Summary

Keep Workbench policy behind fork-owned adapters to reduce future upstream conflicts. Thread notifications now distinguish an agent reply from an unanswered question, clear when the Thread is visited, and use warning styling only for failed checks.

Changes

  • Assemble Workbench RPC services in the Workbench server adapter, leaving one typed host bundle at the WebSocket boundary.

  • Keep sidebar selection and ticket context presentation in Workbench web modules while retaining Settings and native Threads behavior.

  • Centralize Workbench desktop scheme, data path, and updater policy in its desktop distribution modules.

  • Give providers one schema-validated structured generation call. The Workbench host owns the ticket prompt, sanitization, and empty-result error.

  • Seed the same synthetic attention records and PR states in disposable local demos and private previews. Local runs keep cloned demo repositories and connected Jira, and use the saved local provider selection.

  • Show Agent replied for completed turns and Waiting for your answer for structured unanswered questions. Visiting an eligible assigned Thread acknowledges its notification on Workbench and native routes, while native pending requests remain unresolved.

  • Use a neutral bell with an accent dot for ordinary notifications and yellow for failed checks. Workspace and Ticket disclosure controls remain usable with the notification filter enabled.

Verification

  1. Stage-specific server, web, desktop, provider, and Workbench tests passed. The final generation suite passed 146 tests across 12 files; the schema type-side regression test passed.

  2. Server, web, desktop, and Workbench package typechecks passed; the Workbench package boundary check found no application import or workspace cycle. Targeted lint, formatting, and diff checks passed.

  3. Native and Workbench desktop builds and bounded startup smoke passed. In the disposable Codex browser demo, Workbench opened from native Threads, a Ticket opened its native Thread, Ticket context appeared once in the composer, Settings kept its sidebar with workbench=true, and returning to Threads restored the native sidebar.

  4. Review apps/server/src/workbench/ticketSummaryText.ts and the provider generateStructured delegates. Ticket-specific text stays with Workbench, while providers retain their existing execution restrictions, errors, model selection, and cleanup.

  5. bash scripts/workbench-demo/run.sh completed a disposable local run from the prepared guide home. The restarted server had 12 synthetic attention Tickets alongside the baseline; the local board showed five actionable Tickets out of 20. Focused demo and PATH tests passed (10 tests across three files), as did scripts and server typechecks. The run stopped and removed its disposable home.

  6. This branch includes sync candidate c8942f8e and upstream 67b175a4. After the base merge, 12 focused tests across four files, server and scripts typechecks, and the Workbench package boundary check passed. The preview against the pinned synced upstream 67b175a4 reports no remaining commits or conflicts.

  7. The final notification change passed 72 tests across eight focused UI files, web and Workbench typechecks, the package boundary gate, the required Workbench complexity/duplication gate, formatting, and targeted lint (existing warnings only). Independent behavioral, test, and isolation review found no actionable issues.

  8. In the disposable local client, verify an agent reply clears after visiting its Thread; a structured unanswered question clears its notification while retaining Awaiting Input; and Workspace/Ticket rows collapse under the notification filter. These flows passed with live Codex generation.

Screenshots

The same seeded Beacon workspace was captured at 1280 × 720 in disposable demos from the sync branch and the isolation branch. These views show the board, Ticket detail, and linked native Thread. Generated summary wording varies between runs. The later upstream merge changed only release scripts and was verified with focused tests.

View Before (sync branch) After (isolation branch)
Beacon board Workbench board before isolation Workbench board after isolation
Ticket detail Ticket detail before isolation Ticket detail after isolation
Native Thread with attached Ticket context Ticket Thread before isolation Ticket Thread after isolation

The private PR previews and local disposable demo seed the same synthetic attention cases. In the comparison before the notification changes, Needs attention showed the same five confirmed-action Tickets out of 20, the sidebar bell filter showed five actionable Tickets, and Ready for review isolated one Ticket. Both previews reported three of five linked PRs inspected; unavailable or incomplete inspection alone did not create an attention item. The PR feedback popover retained three signals and both exact unresolved discussion links.

Attention view Before (sync branch) After (isolation branch)
Board and sidebar filters Needs attention filters before isolation Needs attention filters after isolation
PR feedback actions Attention actions before isolation Attention actions after isolation

Thread notifications

Before After
Yellow notification bell before Neutral notification bell with accent dot
Agent reply Acknowledged unanswered question
Agent replied notification Awaiting Input remains after the notification is acknowledged

Ticket disclosure works with the notification filter enabled

Limits

  • The live Jira/GitHub suite passed on retry. Its first attempt observed one restored Jira fixture Ticket appearing between board-mode snapshots. The unchanged sprint test restores the issue but does not verify its re-import before later tests; fixture convergence is a plausible cause, not a confirmed diagnosis.
  • Local Codex Thread generation and summaries worked. Hosted OpenCode Thread generation worked, but automatic structured summaries failed; the synthetic attention outcomes do not prove generation.
  • Full demo parity remains incomplete: preview Orbit API contents/remotes and Orbit Web revision differ from local, and preview does not prepare the same four Ticket workspaces. Jira connectivity and provider selection are intentional differences.
  • The disposable GitHub adapter refuses writes and never forwards commands to real GitHub.
  • Fresh upstream 5cc99e1c is ten commits beyond the pinned sync. Base and final head have the same overlap paths and existing CI-workflow conflict against it; this PR adds no conflict path and does not include those newer upstream commits.

Model/harness: GPT-6 / Codex desktop.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XL labels Oct 1, 2026
@filipgutica
filipgutica force-pushed the fix/workbench-boundaries branch from 4fc0fff to 79e1444 Compare October 1, 2026 02:15
@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

Workbench demo

Open the private 20-minute demo. Sign in to Vercel, then choose Open demo. Reopening this link in the same browser resumes its running demo; Start new demo creates a fresh one. Jira starts disconnected.

Application, runtime startup, fixtures, and native smoke: PR f9df7bcef772fe5de42666657e69953a6a93d915. Dockerfile, build configuration, bundle export, publisher, and protected launcher: main c108a3077e35f70756c196f8a031d963f422e908.

Expired? Return to this link and launch again. Use synthetic content with the free OpenCode model.

@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.5 KiB 13.5 KiB −11 B (−0.1%) 15.1 KiB ✅
Codex Thread snapshot wire 7.1 KiB 7.1 KiB −5 B (−0.1%) 7.3 KiB ✅
Codex Live turn WebSocket wire 6.4 KiB 6.4 KiB −6 B (−0.1%) 7.8 KiB ✅
Codex Live turn WebSocket decoded 56.2 KiB 56.2 KiB 0 B (0.0%) 66.4 KiB ✅
Codex Live turn messages 9 9 0 (0.0%) 21 ✅
Claude Total thread wire 13.5 KiB 13.5 KiB −5 B (−0.0%) 15.1 KiB ✅
Claude Thread snapshot wire 7.1 KiB 7.1 KiB +4 B (+0.1%) 7.3 KiB ✅
Claude Live turn WebSocket wire 6.4 KiB 6.4 KiB −9 B (−0.1%) 7.8 KiB ✅
Claude Live turn WebSocket decoded 57.0 KiB 57.0 KiB 0 B (0.0%) 66.4 KiB ✅
Claude Live turn messages 9 9 0 (0.0%) 21 ✅

Baseline: c108a30 · PR result: f9df7bc · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 113.9 KiB
  • Claude decoded thread snapshot: 114.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@github-actions github-actions Bot added size:XXL and removed size:XL labels Oct 1, 2026
@filipgutica filipgutica changed the title refactor(workbench): keep fork policy in Workbench adapters fix(workbench): isolate adapters and clarify thread notifications Oct 1, 2026
@filipgutica
filipgutica changed the base branch from fix/upstream-sync-20260930 to main October 1, 2026 16:18
@filipgutica
filipgutica marked this pull request as ready for review October 1, 2026 16:18
@filipgutica
filipgutica merged commit c91a293 into main Oct 1, 2026
31 of 33 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant