Three failures in the non-blocking Full Suite:
- CommandCenter mobile-scroll / tablet-layout regression tests rendered with
productivity fixtures missing the `hoursSaved` field added in FN-6721. That
made ProductivityArea throw on `data.hoursSaved.unavailable`, an uncaught
exception that crashed the CommandCenter render (no `command-center` testid)
and polluted the shared worker, causing collateral QuickEntryBox failures.
Add `hoursSaved` to both fixtures.
- github-tracking-delete route test failed intermittently with
`ENOTEMPTY: ... rmdir '.../.fusion'` because the fire-and-forget delete
handler can write into `.fusion` while afterEach removes the temp dir. Make
rm tolerant via maxRetries/retryDelay.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Keep Command Center anchored as an inline header destination while preserving changed-test coverage selection.
- Render Command Center immediately after Agents on tablet and desktop instead of moving it into the More views overflow.
- Update header and tablet tests plus docs to lock the stable inline navigation contract.
- Treat the quarantine data file as test-irrelevant so edits do not force gate mode and drop affected-package tests.
Files changed:
.changeset/fix-quarantine-json-gate-mode.md | 5 ++
.changeset/fn-6781-command-center-header.md | 5 ++
CONCEPTS.md | 3 +
docs/dashboard-guide.md | 4 +-
...data-file-forces-gate-mode-dropping-coverage.md | 74 ++++++++++++++++++++++
.../app/__tests__/tablet-header-controls.test.tsx | 7 +-
packages/dashboard/app/components/Header.tsx | 51 +++++----------
.../app/components/__tests__/Header.test.tsx | 8 ++-
scripts/__tests__/test-changed.test.mjs | 20 ++++++
scripts/test-changed.mjs | 8 +++
10 files changed, 142 insertions(+), 43 deletions(-)
Fusion-Task-Id: FN-6781
Fusion-Task-Lineage: d328501d-7ec4-40ac-a140-6a491ea560e2
The gate test asserted the OLD behavior — a paused graph exit in the `todo`
column parked `status:"failed"` with "operator action required". FN-6782
made the todo case benign (no failed park; benign log + cleared marker), so
split the parameterized test: `todo` now asserts the benign path (never
parked failed), `done` keeps the operator-action surfacing (log only, no
park). Full engine-core gate suite passes (644/644).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
dist-freshness.test.ts reads the plugin's compiled dist/settings.js and
dist/session/orchestrator.js to guard against stale dist (FN-6596), but the
plugin had no pretest build and was missing from ensure-test-artifacts.mjs.
On a fresh CI checkout dist/ does not exist, so the guard threw "dist/ is
missing" — failing the non-blocking Full Suite on every main commit.
Register the plugin's required artifacts in ensure-test-artifacts.mjs and add
a `pretest` hook that builds them, matching the dependency-graph / hermes /
openclaw plugins. Verified locally: with dist/ absent, `pnpm --filter
@fusion-plugin-examples/compound-engineering test` now builds dist via the
pretest and all 192 plugin tests pass (incl. the two dist-freshness cases).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
coderabbit Major: reapLeakedConcurrencySlots captured executingIds once
before the loop, but each holder awaits getTask — a task could start
executing mid-sweep and have its worktree slot pulled. Refresh the
executing set immediately before clearPhantomExecutorBinding and skip if
the holder is now executing (same race the A1 recovery fix closed).
clearPhantomExecutorBinding's live-session refusal remains the last line
of defense; this avoids racing it. Added a mid-sweep race test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Substantive (A1 recoverPausedAbortFailures):
- Self-guard on globalPause/enginePaused at method entry (greptile P1) — the
public method must not requeue tasks an operator intentionally froze.
- Re-validate the FULL predicate with a FRESH executing set on the re-read
before the backward move (coderabbit Major + greptile): add fresh.userPaused
and column re-check so a task that became ineligible across awaits is skipped.
- Isolate audit emission in its own try/catch (coderabbit) so an audit throw
after a successful mutation can't log a false "recovery failed".
- Decouple the recovery predicate from the literal error text via shared
PAUSE_ABORT_PARK_ERROR_MARKER/OPERATOR_MARKER constants (greptile) — the
executor builds the parked message from the same constants.
- Use the wired clearPhantomExecutorBinding (live-session-guarded) instead of
the declared-but-never-wired releaseExecutorWorktreeOwnership, which no-op'd.
Nits:
- FNXC-prefix new comments in executor.ts, run-audit.ts, and the benign test
per repo comment policy.
- Fix a test-only type error on the clearPhantomExecutorBinding mock.
Added a test asserting the globalPause self-guard. Engine typecheck clean;
pause-abort/reaper/benign + regression suites pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
reapLeakedConcurrencySlots() reclaims in-memory worktree slots whose
holder is no longer in-progress (the FN-6756 "in todo yet still a
maxWorktrees holder" leak) without an engine restart — defense-in-depth
behind the source fix.
- executor: new listWorktreeHolders() read-only introspection over
activeWorktrees; wired through in-process-runtime to SelfHealingManager.
- reaper releases ONLY when every guard agrees: not executing, task
missing or in todo/triage, past a 60s grace, and clearPhantomExecutor
Binding itself refuses (returns false) if a live session surface is
registered — so it can never pull a worktree from a running agent.
- registered in maintenance batch 2 (respects globalPause/enginePaused
skip + FN-4962 ordering).
- widened the clearPhantomExecutorBinding option type to surface its
boolean refusal signal.
Engine typecheck clean; 19 tests pass (new reaper 7 cases + regression).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A global pause/resume cycle parked tasks that had re-queued to todo as
status:"failed" ("operator action required") and leaked their in-memory
worktree slot. The scheduler kept re-dispatching the todo task, the
genuine-pause-abort branch re-fired on the still-set pausedAborted marker,
and it re-parked instantly with no backoff — a retry storm (75x/hr) that
pinned maxWorktrees=3/3 and concurrency-starved the whole queue.
- R1+R2 (executor.ts handleGraphFailure): treat a pause-abort that left a
task in `todo` as benign (FN-6782) — don't park failed, clear the
pausedAborted marker so the next dispatch is clean, and release the
leaked activeWorktrees slot. Operator-action failure preserved for
genuinely stranded non-todo columns (FN-6478).
- A1 (self-healing.ts recoverPausedAbortFailures): new maintenance sweep
that auto-recovers any pause-abort park still on the board and requeues
it (status:null = schedulable) so the board self-heals.
- run-audit.ts: new mutation types for the recovery telemetry.
Corrected the spec's null-vs-queued assumption: the scheduler dispatch set
is column==="todo" && !paused (scheduler.ts:1288); status:"queued" is the
*blocked* marker, status:null is runnable — so recovered tasks are left null.
Deferred (documented): A2 leaked-slot reaper needs a new executor
listWorktreeHolders introspection API to reap in-memory worktree slots
safely; R1 closes the observed leak at its source.
Tests: self-healing-paused-abort-recovery.test.ts (3),
executor-paused-abort-todo-benign.test.ts (2). Engine typecheck clean;
106 existing pause/graph-failure/limbo tests still pass.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Document the test-changed shared-infra catch-all trap (gate mode replaces
affected-package coverage instead of augmenting it) under docs/solutions/,
and add an "Affected-package test selection" concept to CONCEPTS.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
scripts/lib/test-quarantine.json is runtime data (which tests are
quarantined), not executable test infra, but it tripped the shared-infra
catch-all in isSharedInfraChange. That forced mode=gate, which runs only
the fixed engine-core + cli-shape gate suite and returns before the
affected packages -- so a dev's real changes (e.g. @fusion/core,
@fusion/dashboard) got zero coverage whenever they also touched the
quarantine list. Classify the file as test-irrelevant so the diff stays
in changed mode and the affected packages run.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Rescue the WorkflowNodeEditor quarantine by making duplicate merge seam detection reliable during initial canvas load.
- Derive fragment seam conflicts from the loaded workflow IR until React Flow nodes materialize.
- Treat IR merge nodes as merge seams so duplicate merge fragments are rejected consistently.
- Cover desktop and mobile duplicate merge fragment insertion paths and remove the test from quarantine.
- Document the FN-6744 rescue evidence and deletion-ratchet update.
Files changed:
docs/testing.md | 6 +++-
.../app/components/WorkflowNodeEditor.tsx | 11 +++++--
.../__tests__/WorkflowNodeEditor.test.tsx | 34 ++++++++++++++++------
.../app/components/workflow-flow-mapping.ts | 10 +++++++
packages/dashboard/vitest.config.ts | 8 +++--
scripts/lib/test-quarantine.json | 5 ----
6 files changed, 54 insertions(+), 20 deletions(-)
Fusion-Task-Id: FN-6744
Fusion-Task-Lineage: 0f5b167a-8efc-4458-ac9d-e719320b751f
Document the new Reliability View chart coverage in the dashboard guide.
- Add the entered-vs-bounced trend chart to the In-review flow feature list.
- Add the merge-attempt distribution pie chart and empty-state behavior to the Merge attempts feature list.
Files changed:
docs/dashboard-guide.md | 2 ++
1 file changed, 2 insertions(+)
Fusion-Task-Id: FN-6738
Fusion-Task-Lineage: 37e5249c-ae5e-431a-8b93-1ee098b725e7
Document the same-day flaky-test quarantine audit and ownership plan.\n\n- Record the 2026-06-19 quarantine batch expiration date and ledger/config lockstep status.\n- Split follow-up ownership across CLI, core, and dashboard quarantine rescue/delete work.\n- Add an FNXC comment explaining why the coordinated audit should stay scoped by subsystem.\n\nFiles changed:\n docs/testing.md | 4 ++++\n 1 file changed, 4 insertions(+)
Fusion-Task-Id: FN-6740
Fusion-Task-Lineage: eba08900-18d6-4768-ac8a-c673f89537ca
Recover wedged in-progress tasks by clearing stale executor bindings only after liveness proves the owner is gone.
- Add a guarded executor escape hatch that clears only stale in-memory task bookkeeping while refusing live session surfaces.
- Teach self-healing to identify phantom executor-active bindings using age, checkout, heartbeat, run-audit, and worktree liveness signals before requeueing preserved work.
- Record reclaim events in run audit and cover preserved-worktree recovery with reliability interaction tests.
- Document the recovery path and add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-6736-phantom-executor-binding.md | 5 +
AGENTS.md | 1 +
docs/architecture.md | 1 +
.../reclaim-phantom-executor-binding.test.ts | 244 +++++++++++++++++++++
packages/engine/src/executor.ts | 35 +++
packages/engine/src/run-audit.ts | 2 +
packages/engine/src/runtimes/in-process-runtime.ts | 3 +-
packages/engine/src/self-healing.ts | 112 ++++++++++
8 files changed, 402 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6736
Fusion-Task-Lineage: c76191ba-f4c3-4832-a790-67676e258ba2
Surface selected-range session totals in the Command Center overview stat grid.
- Add a Sessions stat card backed by existing ActivityAnalytics data.
- Keep Overview populated when sessions are the only activity and default missing session values to zero.
- Cover populated, zero, omitted, and empty Overview session states in tests.
- Document the Overview sessions metric source in the dashboard guide.
Files changed:
docs/dashboard-guide.md | 2 +-
.../components/command-center/CommandCenter.tsx | 10 +++-
.../__tests__/CommandCenter.test.tsx | 53 ++++++++++++++++++++++
3 files changed, 62 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6718
Fusion-Task-Lineage: 5e41d3dc-2f69-48e0-aceb-848cb111ea3b
Improves Agent Detail tab readability on tablet and mobile without changing scrolling behavior.
- Set Agent Detail tab labels to 0.875rem in base and mobile rules.
- Document the tablet readability requirement next to the tab styling.
- Add coverage for readable tab label sizing across tablet/base and mobile CSS states.
Files changed:
.../dashboard/app/components/AgentDetailView.css | 8 ++-
.../AgentDetailView.mobile-scroll.test.tsx | 84 ++++++++++++++--------
2 files changed, 61 insertions(+), 31 deletions(-)
Fusion-Task-Id: FN-6728
Fusion-Task-Lineage: 6be99919-d0b4-4387-875b-88445b78a196
Contain Command Center token totals so large formatted values stay inside their stat surfaces.
- Add shrink and wrap containment to stat and live metric value styles.
- Cover large comma-grouped token totals across Overview, Tokens, and Team surfaces.
- Guard the emitted CSS declarations and quarantine an unrelated WorkflowNodeEditor flake observed during verification.
Files changed:
.../components/command-center/CommandCenter.css | 10 +++++
.../__tests__/CommandCenter.test.tsx | 9 ++++
.../CommandCenter.token-validity.css.test.ts | 21 ++++++++++
.../command-center/areas/__tests__/areas.test.tsx | 48 ++++++++++++++++++----
packages/dashboard/vitest.config.ts | 5 +++
scripts/lib/test-quarantine.json | 5 +++
6 files changed, 89 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-6726
Fusion-Task-Lineage: 8a26ca5c-fdbe-4e68-a9d2-ae93340fe685
Reassert the responsive Command Center placement contracts for tablet and mobile navigation.
- Document the tablet contract that keeps Command Center after Agents while Documents remains in overflow.
- Document the mobile contract that keeps Command Center after Mailbox without duplicating it in More.
- Extend the mobile nav regression test to cover mailbox badges and primary plugin overflow behavior.
Files changed:
packages/dashboard/app/components/Header.tsx | 3 +++
packages/dashboard/app/components/MobileNavBar.tsx | 3 +++
.../app/components/__tests__/MobileNavBar.test.tsx | 20 ++++++++++++++++++--
3 files changed, 24 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-6725
Fusion-Task-Lineage: 9130b2d9-4163-4fed-bdc4-96ee6e1f4855
Stabilize dashboard tests around async view commands and ReactFlow node readiness.
- Await the Insights overflow command before exercising lazy-view routing and preference persistence assertions.
- Assert Insights rendering through the test id users rely on instead of querying the DOM class directly.
- Wait for the base workflow node before measuring fragment insertion side effects.
Files changed:
packages/dashboard/app/components/__tests__/App.test.tsx | 17 +++++++++++------
packages/dashboard/app/components/__tests__/WorkflowNodeEditor.test.tsx | 6 ++++++
2 files changed, 17 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-6730
Fusion-Task-Lineage: f9c248c1-5253-449f-b30f-7696fda00e73
electron-builder's default @electron/rebuild step walked the desktop app's
whole dependency tree and tried to source-build @homebridge/node-pty-prebuilt-multiarch
(Node-ABI prebuilds only, none for Electron) via node-gyp, which fails on the
Windows runner with "Could not find any Visual Studio installation". The app
bundles no native addon needing an Electron-ABI rebuild (it uses node:sqlite;
keytar/node-pty aren't in the files list and are loaded optionally), so the
rebuild was pointless. Set npmRebuild: false to skip it on all platforms.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reorders the Command Center overview charts so the richer daily activity line appears higher in the grid.
- Render the daily activity multi-series line card before the sparkline trend card while preserving existing data gates.
- Add a regression assertion for the overview chart ordering and empty-state absence.
- Update dashboard documentation and align the mailbox modal font-size expectation with the current tokenized CSS.
Files changed:
docs/dashboard-guide.md | 2 +-
.../app/components/__tests__/MailboxModal.test.tsx | 2 +-
.../components/command-center/CommandCenter.tsx | 28 ++++++++++++----------
.../__tests__/CommandCenter.test.tsx | 9 +++++++
4 files changed, 27 insertions(+), 14 deletions(-)
Fusion-Task-Id: FN-6716
Fusion-Task-Lineage: 0424f561-65f7-475a-a213-b12994c599c7
Clarify the Command Center documentation vocabulary for spacing and border design tokens.
- Replace the outdated --space-3 reference with the named --space-md token.
- Document the canonical 4px spacing scale vocabulary for Command Center surfaces.
- Specify the tokenized subtle border form used by those card-like surfaces.
Files changed:
docs/dashboard-guide.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Fusion-Task-Id: FN-6713
Fusion-Task-Lineage: 928db804-091c-4c7e-a283-9f28d2d4be36
Tokenise the mobile mailbox tab font size while defining the shared xs dashboard token.
- Replace both mobile mailbox modal and mailbox view tab font sizes with var(--font-size-xs, 0.8rem).
- Define --font-size-xs in the dashboard typography token set.
- Document the FN-6703 styling contract with FNXC comments.
Files changed:
packages/dashboard/app/components/MailboxModal.css | 5 +++--
packages/dashboard/app/styles.css | 3 ++-
2 files changed, 5 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6703
Fusion-Task-Lineage: af2073bd-fdde-497e-896a-ce9906459c6a
Place the Command Center throughput section first across overview states.
- Render the throughput funnel before loading, error, empty, and populated overview content.
- Preserve throughput test anchors while documenting the top-of-page ordering requirement.
- Add regression coverage for throughput ordering in loading, empty, populated, and error overview branches.
Files changed:
.../app/components/command-center/CommandCenter.tsx | 11 +++++++----
.../command-center/__tests__/CommandCenter.test.tsx | 21 +++++++++++++++++++++
2 files changed, 28 insertions(+), 4 deletions(-)
Fusion-Task-Id: FN-6707
Fusion-Task-Lineage: 9b004ab4-e36b-4d83-804a-32503a7d8d72