- Reformat shard-floor justification as an FNXC:TestInfrastructure comment
(project-standards: AGENTS.md FNXC_LOG convention).
- Clarify that the shard and dashboard-lane 15min floors are not coupled and
may diverge (maintainability: avoid implying an unenforced contract).
- Add a regression-guard test pinning shard.floor=15min and asserting a 525s
derived budget clamps up to the floor, so an accidental revert to the old
5min floor fails loudly (correctness + testing + project-standards).
The Full Suite (non-blocking) workflow has been red for 30+ runs on main.
Diagnosis: the @fusion/engine [1/2], [2/2] and @fusion/core [2/2] shard
slices were SIGKILLed at their watchdog budgets (405s/405s/338s), not because
they hang but because those budgets are too tight for current wall-clock.
Local baselines (this machine, all pass, exit 0):
- engine [2/2]: 145s wall / 309 files
- core [2/2]: 283s wall / 172 files (old budget was only 338s!)
deriveBudgetMs tightens the budget to expected*3.5 whenever the committed
scripts/test-timings.json is <30d old. The snapshot (2026-06-03) undercounts
the import- and real-git-subprocess overhead of these heavy slices, so the
'fresh' snapshot produced a too-tight, false-kill budget on slower CI runners
-- the exact failure mode the floor/ceiling band exists to prevent.
Fix (plan KTD-2): raise the shard band floor 5min -> 15min so the heaviest
slices can't be tightened into a false-kill, while a true hang is still bounded
far under the job's 60min ceiling. Mirrors the dashboard-lane heavy-lane floor.
Follow-up: refresh scripts/test-timings.json from a default-branch CI run.
Affected packages with a vitest config now run `vitest run --changed <base>`
(only tests in the changed files' module graph) under the tight "changed"
watchdog, instead of each package's ENTIRE suite under a 60-min backstop.
Packages without a vitest config fall back to their full `test` script. The
curated gate suite still runs as the cross-cutting safety net.
Measured: a dashboard hub-component change drops from 822 files (5-8min) to
40 files (~98s wall incl. gate). Common/leaf changes scope to far fewer.
NOT yet <60s for hub-component changes — the fixed jsdom/setup floor still
dominates (needs the overhead-reduction follow-up), and one scoped-run test
failure needs isolation triage before this gates verification.
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>
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
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
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