pnpm dev/local dashboard prebuild now rebuilds @fusion/core and @fusion/engine alongside the dashboard UI (was client-only), and startup warns loudly when built dist/ is older than src/. Prevents the FN-6638 class where landed engine fixes silently never run because the process loads stale dist.
Rescue the Paperclip CLI spawn coverage by making fake child events deterministic and re-enabling the suite.
- Route mintAgentApiKeyViaCli cases through the shared fake spawn helper so close and error events are emitted after listener registration.
- Document the async import/listener-order requirement that caused the quarantine.
- Remove paperclip-client.test.ts from the quarantine ledger and Vitest exclude list so the rescued tests run.
Files changed:
.../src/__tests__/paperclip-client.test.ts | 134 +++++++--------------
.../vitest.config.ts | 2 -
scripts/lib/test-quarantine.json | 5 -
3 files changed, 44 insertions(+), 97 deletions(-)
Fusion-Task-Id: FN-6636
Fusion-Task-Lineage: 79038ab3-0aa6-465e-9c6e-f6bc83fcd407
Restore the compound-engineering broad lane tests after the timeout could not be reproduced on the stabilized shared test infrastructure.
- Re-enable the compound-engineering sync and work-bridge tests by clearing their Vitest quarantine excludes.
- Remove the stale quarantine ledger entries now that the broad package lane stayed stable under verification.
Files changed:
plugins/fusion-plugin-compound-engineering/vitest.config.ts | 10 ++++------
scripts/lib/test-quarantine.json | 13 +------------
2 files changed, 5 insertions(+), 18 deletions(-)
Fusion-Task-Id: FN-6606
Fusion-Task-Lineage: f357c626-c181-44a7-a463-c53644566ca1
Add a weekly baseline workflow for tracking test feedback-loop speed and flake pressure.
- Add a stdlib-only script to record gate and pnpm test timings alongside slowest test files and quarantine counts.
- Publish generated markdown and JSON baseline artifacts for #leads reporting.
- Document the weekly refresh process and add package scripts plus coverage for the baseline helper.
Files changed:
docs/test-feedback-loop-baseline.md | 48 ++++++
docs/test-feedback-loop-baselines.json | 122 ++++++++++++++
docs/testing.md | 12 ++
package.json | 1 +
scripts/__tests__/test-feedback-baseline.test.mjs | 90 ++++++++++
scripts/test-feedback-baseline.mjs | 192 ++++++++++++++++++++++
6 files changed, 465 insertions(+)
Fusion-Task-Id: FN-6612
Fusion-Task-Lineage: 72bdc070-50e3-4e6b-a07d-3b8aeb9c2e92
Normalize spawned Vitest processes to NODE_ENV=test so React/jsdom lanes do not inherit release-shell production mode. Split the compound-engineering plugin Vitest projects so Node-only setup and teardown only run in Node lanes, and quarantine the remaining broad-lane CE timeout flakes under the deletion ratchet.
Quarantine compound-engineering timeout flakes from the broad test workflow.
- Add the compound-engineering orchestrator and skill-wiring tests to the quarantine ledger.
- Exclude the quarantined tests from the compound-engineering node Vitest project without changing timeouts or retries.
- Document the quarantine requirement next to the Vitest excludes.
Files changed:
.../fusion-plugin-compound-engineering/vitest.config.ts | 15 ++++++++++++++-
scripts/lib/test-quarantine.json | 10 ++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6587
Fusion-Task-Lineage: 5aeb0202-8330-4a93-bdab-675c81b9cb54
Rescues the QuickEntryBox suite by restoring jsdom globals instead of keeping it quarantined.
- Snapshot and restore QuickEntryBox viewport, visibility, matchMedia, and object URL descriptors after each test.
- Add a guard test that proves mutated jsdom globals return to their original descriptors.
- Remove the QuickEntryBox quarantine entries while documenting the rescue pattern.
Files changed:
docs/testing.md | 2 +
.../components/__tests__/QuickEntryBox.test.tsx | 50 ++++++++++++++++++++++
packages/dashboard/vitest.config.ts | 7 ++-
scripts/lib/test-quarantine.json | 5 ---
4 files changed, 55 insertions(+), 9 deletions(-)
Fusion-Task-Id: FN-6514
Fusion-Task-Lineage: 12f20ad8-19ee-4168-91a9-33193b1ab5f7
Android WebView returns 0 for env(safe-area-inset-top) by default, so the
CSS-only header inset had no effect on edge-to-edge devices (API 35+).
- Add @capacitor-community/safe-area@^7.0.0 (Capacitor 7 compatible); it
patches the webview so env(safe-area-inset-*) report real values. Enabled
natively (no JS init), so it works in remote/live mode too.
- capacitor.config.ts: declare SafeArea plugin (initialViewportFitCover).
- mobile-run-android.sh: idempotently enable EdgeToEdge in MainActivity after
cap add (android/ is generated/gitignored), required by the plugin.
- Add scripts/mobile-run-android.sh + pnpm mobile:run:android (auto-detects
Android SDK + JDK 21, writes local.properties, reconnects network ADB
before deploy, supports remote backend via FUSION_SERVER_URL).
- Header.css: reserve env(safe-area-inset-top) so top app chrome no longer
draws under the OS status bar on edge-to-edge native shells (Capacitor
Android API 35+, iOS notch, PWA standalone). No-op on web/desktop.
- .gitignore: ignore generated packages/mobile/{ios,android} (stale paths
pointed at packages/dashboard/).
Rescue the same-day core and CLI flaky quarantines by fixing their fixture seams instead of appeasing timeouts.
- Make the core concurrent-write lock helper release synchronously inside its child process so package load cannot delay the transient lock release.
- Close real CLI TaskStore fixtures before removing temp roots and switch mock cleanup to non-hoisted unmocking.
- Remove both test files from package quarantine excludes and clear the quarantine ledger while documenting the rescue pattern.
Files changed:
docs/testing.md | 2 ++
packages/cli/src/__tests__/extension-task-tools.test.ts | 17 +++++++++++++----
packages/cli/vitest.config.ts | 4 +++-
.../core/src/__tests__/store-concurrent-writes.test.ts | 8 +++++++-
packages/core/vitest.config.ts | 4 +++-
scripts/lib/test-quarantine.json | 13 +------------
6 files changed, 29 insertions(+), 19 deletions(-)
Fusion-Task-Id: FN-6486
Fusion-Task-Lineage: c90358c4-0549-4c68-8d17-2e2a336433b5
Quarantine the load-sensitive CLI extension task tools suite instead of widening Vitest timeouts.
- Add the extension task tools test file to the CLI Vitest quarantine exclude list.\n- Record the FN-6483 quarantine evidence in the deletion-ratchet ledger while preserving the existing core quarantine entry.\n\nFiles changed:\n packages/cli/vitest.config.ts | 5 +++++\n scripts/lib/test-quarantine.json | 5 +++++\n 2 files changed, 10 insertions(+)
Fusion-Task-Id: FN-6483
Fusion-Task-Lineage: 4a3be3b4-b2b4-4e05-afd0-564aa0d28c68
Require an out-of-repository operator signal before the release script can mutate version, publish, push, or tag.
- Add a reusable release authorization gate that allows dry-runs and blocks real releases without FUSION_RELEASE_AUTHORIZED.
- Invoke the gate in scripts/release.mjs before the first release mutation while preserving dry-run behavior.
- Cover blocked, authorized, dry-run, whitespace, TTY, and call-order behavior with script tests.
Files changed:
.../__tests__/release-authorization-gate.test.mjs | 70 ++++++++++++++++++++++
scripts/lib/release-authorization-gate.mjs | 30 ++++++++++
scripts/release.mjs | 26 +++++++-
3 files changed, 123 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6480
Fusion-Task-Lineage: 5347552c-e395-4852-b389-6bbdba0e044e
Rescue the session reconnect SSE test by shutting down route-owned background work before temp cleanup.
- Isolate the focused API harness from TaskStore EventEmitter startup workers.
- Dispose API routes and scheduled AI session cleanup before deleting the test temp root.
- Remove session-reconnect from the dashboard quarantine ledger and vitest skip list.
Files changed:
.../src/__tests__/session-reconnect.test.ts | 22 ++++++++++++++++++----
packages/dashboard/vitest.config.ts | 6 ++++--
scripts/lib/test-quarantine.json | 5 -----
3 files changed, 22 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-6447
Fusion-Task-Lineage: a3fef28c-b92b-4f47-9181-a63bb31e4f48
Remove the CLI extension integration suite's hidden Vitest timeout override while keeping its explicit build-only allowance.
- Replace the file-wide 30s Vitest test and hook timeout override with a scoped comment documenting default caps.
- Derive the extension bundle path from the CLI root in the test file.
- Use a SQLite collision trigger instead of a TaskStore prototype spy and fix the agent delete tool payload.
- Clear the timeout appeasement allowlist now that the CLI test exemption is gone.
Files changed:
.../src/__tests__/extension-integration.test.ts | 25 ++++++++++++++++------
.../lib/test-timeout-appeasement-allowlist.json | 8 +------
2 files changed, 20 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-6436
Fusion-Task-Lineage: 670f41ea-f98f-400c-aa16-6a1cbb1e9bea
Add a fast guard that rejects Vitest timeout bumps in tracked test files.
- Add a test-timeout appeasement scanner with a temporary allowlist for legacy exemptions.
- Run the scanner in pretest, pretest:full, and test:gate so merge gates catch timeout bumps.
- Cover the scanner behavior with node:test cases and document the policy/remediation path.
Files changed:
docs/testing.md | 6 ++
package.json | 6 +-
.../check-no-test-timeout-appeasement.test.mjs | 49 +++++++++
scripts/check-no-test-timeout-appeasement.mjs | 119 +++++++++++++++++++++
.../lib/test-timeout-appeasement-allowlist.json | 10 ++
5 files changed, 187 insertions(+), 3 deletions(-)
Fusion-Task-Id: FN-6434
Fusion-Task-Lineage: deb46a27-b0c9-4644-b8bb-34ce98e7acde
Move observed load-sensitive and slow tests out of the default lanes per the deletion-ratchet policy, keep the quarantine ledger in sync, and preserve corrupt databases when recovery fails during verification.
Ensure workflow-mode boards fill the mobile viewport while preserving internal column scrolling.
- Reassert the mobile flex fill chain for project content, workflow board wrappers, and workflow columns.
- Extend mobile board regression coverage across empty/populated workflow states with and without the toolbar.
- Document the workflow board collapse root cause and add a transient temp-dir isolation guard test.
Files changed:
docs/dashboard-guide.md | 1 +
.../ui-bugs/mobile-workflow-board-fill-chain.md | 61 +++++++++++++
.../__tests__/board-mobile-initial-render.test.tsx | 101 +++++++++++++++++++++
packages/dashboard/app/styles.css | 52 +++++++++++
scripts/__tests__/check-test-isolation.test.mjs | 23 +++++
scripts/check-test-isolation.mjs | 12 ++-
6 files changed, 249 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-6397
Fusion-Task-Lineage: ddee773d-6d3a-46d1-b1c7-f601a961365e
Restore the rescued dashboard routes settings test to the active suite.
- Remove routes-settings from the dashboard Vitest quarantine excludes.
- Delete its quarantine ledger entry now that the test is no longer quarantined.
Files changed:
packages/dashboard/vitest.config.ts | 1 -
scripts/lib/test-quarantine.json | 5 -----
2 files changed, 6 deletions(-)
Fusion-Task-Id: FN-6391
Fusion-Task-Lineage: 41068faa-f1e7-4f7b-a8cd-fc123611ba42
- watchdog: escalate forwarded SIGINT/SIGTERM/SIGHUP to SIGKILL after grace so
external cancellation can't hang for the full budget (coderabbit major)
- watchdog: route onProcExit through signalGroup for injection consistency (greptile)
- watchdog: add cwd option; test-changed passes rootDir so pnpm runs from repo
root regardless of invocation cwd (coderabbit major — preserved original run() cwd)
- dashboard runner: validate/clamp FUSION_RUN_VITEST_* env so a malformed value
can't NaN-disable the watchdog (coderabbit)
- tests: verify exit-listener cleanup, forwarded-signal escalation, cwd passthrough
- plan doc: per-class-ceiling fallback wording (not median); label Output Structure fence
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Adds bounded retry handling so stale Fusion test temp roots are reclaimed instead of leaking after transient removal failures.
- Share prefix-scoped pruning between isolated HOME and worker temp roots.
- Retry rm-rf on transient busy/non-empty failures and treat ENOENT as successful cleanup.
- Warn once with bounded child diagnostics after persistent prune failures.
- Cover worker and home pruning retry, failure, and ENOENT behavior in script tests.
Files changed:
scripts/__tests__/test-changed.test.mjs | 118 ++++++++++++++++++++++++++++++++
scripts/test-changed.mjs | 84 ++++++++++++++---------
2 files changed, 168 insertions(+), 34 deletions(-)
Fusion-Task-Id: FN-6371
Fusion-Task-Lineage: a81e6849-5eb0-4bc0-8030-9f8eaed4e35a
Task-detail Chat now accepts guidance even when no steerable session is active and queues it for the next run.
- Keep the task chat composer enabled whenever there is draft text and no send is in flight.
- Replace the blocking no-session hint with active-session versus queued-for-next-session copy.
- Extend TaskChatTab coverage across idle, paused, inactive CLI, and send-in-flight states.
- Quarantine the unrelated flaky dashboard settings route test observed during broad verification.
Files changed:
packages/dashboard/app/components/TaskChatTab.tsx | 21 ++--
.../app/components/__tests__/TaskChatTab.test.tsx | 135 +++++++++++++++++----
packages/dashboard/vitest.config.ts | 5 +-
scripts/lib/test-quarantine.json | 5 +
4 files changed, 133 insertions(+), 33 deletions(-)
Fusion-Task-Id: FN-6354
Fusion-Task-Lineage: b0f0d033-bb4d-4eaa-a15d-f06b82643ade