Quarantine test files consistently failing on the non-blocking full-suite
CI on main, per the AGENTS.md deletion-ratchet policy:
Engine-default (shard 1-2): ce-workflow-step-conventions,
executor-column-agent-principal, restart.integration,
scheduler-node-unreachable-audit, scheduler-overlap-starvation,
scheduler-ephemeral-toggle, user-configured-command-no-execsync
Engine-reliability (shard 1): lease-recovery-central-claim,
owning-node-unavailable-interactions, todo-inprogress-flapping
CLI (shard 3): extension.test.ts
Each has a matching entry in scripts/lib/test-quarantine.json with the
failing CI run link and quarantinedAt date. Tests will be deleted
after 14 days unless rescued with a root-cause fix.
Document the previously unlinked docs from the README index for easier discovery.
- Add Signals Connectors to the documentation guide section.
- Add testing baseline and audit reports to the audit reports index.
- Record the FN-7088 docs-index requirement in the existing FNXC DocsIndex note.
Files changed:
docs/README.md | 7 +++++++
1 file changed, 7 insertions(+)
Fusion-Task-Id: FN-7088
Fusion-Task-Lineage: df77fa9a-ba63-4df9-ac70-d144230eb8f3
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Derive global concurrency running totals from live task columns so active work no longer appears idle.
- Count in-progress tasks across all projects for `/api/global-concurrency`.
- Replace stale slot bookkeeping in the response while preserving configured caps and queue counts.
- Cover empty, multi-project, and over-cap running-count scenarios in route tests.
- Add a patch changeset for the published Fusion package.
Files changed:
.changeset/fn-7080-concurrency-running-count-fix.md | 7 ++
packages/dashboard/src/__tests__/project-routes.test.ts | 113 +++++++++++++++++++++
packages/dashboard/src/routes.ts | 29 +++++-
3 files changed, 148 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-7080
Fusion-Task-Lineage: a22d366f-ea93-47a5-b758-5e2d3828cff3
Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
Swap fixed 200ms "wait for pub/sub propagation" sleeps in the
multi-instance badge tests for polled waitForExpectation calls. Returns
on delivery (typically <20ms) instead of always paying 200ms, and
removes the delivery>200ms race an unconditional sleep masks.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mcpServers is intentionally shared across global and project scopes (a
global default applies to every project; a project override tailors the
set per project). Add it to the parity guard's intentional shared-keys
allow-list.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
parseCreateTableSchemasFromSql now strips `--` comments before the
non-greedy CREATE TABLE body regex, so a `);` inside a schema comment can
no longer end a table body early and silently drop columns from
ensureSchemaCompatibility()'s backfill set. Fixes legacy DBs missing
newer task columns (checkout-lease, column dwell) after upgrade.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Correct the velocity baseline to reflect an empty quarantine ledger and cover that report-only path.
- Update the published test velocity baseline quarantine totals, buckets, trend row, and #leads summary to zero.
- Add a regression test that regenerates the report from an empty live quarantine ledger without measuring lanes.
- Assert deletion-due and bucket rows stay zero and stale nonzero quarantine text is removed.
Files changed:
docs/test-velocity-baseline.md | 10 ++--
scripts/__tests__/test-velocity-baseline.test.mjs | 72 ++++++++++++++++++++++-
2 files changed, 76 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-7079
Fusion-Task-Lineage: d641adc3-f991-4d95-bcb2-7b20bbfeb0bb
Backfill resolved pi session models so token analytics can show every model bucket.\n\n- Mirror explicit model overrides onto sessions that do not expose a model snapshot.\n- Cover multi-model token grouping totals and Command Center pie/table rendering.\n- Add a patch changeset for the dashboard token breakdown fix.\n\nFiles changed:\n .changeset/tidy-token-model-buckets.md | 7 ++++++\n .../core/src/__tests__/token-analytics.test.ts | 5 ++++\n .../areas/__tests__/TokensArea.test.tsx | 5 ++++\n .../src/__tests__/pi-create-fn-agent.test.ts | 28 ++++++++++++++++++++++\n packages/engine/src/pi.ts | 10 +++++++-\n 5 files changed, 54 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-7075
Fusion-Task-Lineage: 5f026435-5c3c-4e83-aab4-c1d7a487685a
Make the Skills detail pane render metadata and markdown content more compactly.
- Add scoped font-size reductions for plain-text and markdown skill detail content.
- Preserve shared mailbox markdown typography by limiting the new sizing to SkillsView selectors.
- Add a patch changeset for the published Fusion CLI package.
Files changed:
.changeset/fn-7072-skill-metadata-font-size.md | 7 +++++++
packages/dashboard/app/components/SkillsView.css | 8 +++++++-
2 files changed, 14 insertions(+), 1 deletion(-)
Fusion-Task-Id: FN-7072
Fusion-Task-Lineage: 6270be52-d52c-4969-ae65-ec4f10167ff2
## Show enabled workflow steps in the detail progress bar (FN-7039
follow-up)
Follow-up to the now-merged graph-native workflow-steps refactor
(#1788).
**Problem:** the Task detail modal's Progress bar mapped only
`workingTask.steps` (implementation steps), so an **enabled optional
workflow step** (e.g. "Code Review") got **no segment** — even though
the cards/list already include them.
**Fix:** drive the detail bar from `getUnifiedTaskProgress` (the same
unified model the cards use), so each enabled workflow step renders its
own segment — including the enabled-but-not-yet-run (pending) state.
`getStepStatusColor` is extended to the workflow statuses
(`passed`→success, `failed`→error, `advisory_failure`→amber,
`running`→in-progress), and segments get a `--source-workflow` modifier.
Adds a regression test asserting enabled steps render segments.
**Verification:** dashboard typecheck clean;
`TaskDetailModal.models-progress-workflow` (45) + `taskProgress` (9)
tests green; lint clean.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1790">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Task progress now shows a unified step view, combining implementation
and workflow steps in the progress bar.
* The step count label now reflects total completed steps out of all
visible steps.
* **Bug Fixes**
* Progress segments now support additional workflow states, including
passed, advisory failure, and running.
* Added regression coverage to ensure workflow-derived progress segments
render with the correct status styling.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
The TaskDetailModal Progress bar mapped only workingTask.steps, so enabled optional
workflow steps (e.g. Code Review) had no segment. Drive it from getUnifiedTaskProgress
(the same model the cards use) so each enabled step gets a segment — even before it runs
(pending) — and extend getStepStatusColor to the workflow statuses (passed/failed/
advisory_failure/running). Adds a regression test asserting enabled steps render segments.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Rename the settings navigation entry so Remote Access is no longer conflated with Node Sync.
- Update the remote settings nav label to "Remote Access" while keeping the separate Node Sync section intact.
- Add coverage that rejects the old combined label and confirms both standalone entries render.
- Align the workflow settings plan and changeset with the clarified settings IA.
Files changed:
.changeset/fn-7062-remote-access-rename.md | 7 +++++++
...26-06-04-002-feat-workflow-settings-mechanism-plan.md | 2 +-
packages/dashboard/app/components/SettingsModal.tsx | 6 +++++-
.../__tests__/SettingsModal.scheduling-merge.test.tsx | 16 ++++++++++++++++
4 files changed, 29 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-7062
Fusion-Task-Lineage: d50d47eb-aa15-4bf6-8f26-edaa79c8de9e
Sanitize published CLI plugin manifests so off-workspace installs do not resolve private workspace packages.
- Add manifest sanitization for copied bundled plugins and vendored pi extensions during the CLI build.
- Cover built plugin and extension package.json files with a pack-shape regression test.
- Update plugin authoring docs and add a patch changeset for the published CLI fix.
Files changed:
.../fn-7060-fix-plugin-manifest-workspace-deps.md | 7 ++
docs/PLUGIN_AUTHORING.md | 8 ++-
.../cli/src/__tests__/plugin-pack-shape.test.ts | 55 +++++++++++++-
packages/cli/tsup.config.ts | 83 ++++++++++++++++++++--
4 files changed, 142 insertions(+), 11 deletions(-)
Fusion-Task-Id: FN-7060
Fusion-Task-Lineage: e38a4237-7197-4bc4-87bd-117dfd35a0f8
## Problem
On mobile, when the soft keyboard is up in Chat, the executor footer
(task counts / **Running** indicator) stayed visible and there was a
dead band of empty space between the composer and the keyboard.
Root cause: `computeMobileBarKeyboardFlags` gated the footer-hide +
padding-strip to **iOS only**. On Android `footerHidden` stayed `false`,
so `ExecutorStatusBar` kept rendering **and** `.project-content` kept
reserving `footer-height + nav-height` (~80px) of `padding-bottom`. The
mobile nav bar is slid off-screen (`translateY(100%)`) when the keyboard
is up, so that reserved space rendered as the empty gap.
## Fix
Drop the `&& isIOS` gate on `footerHidden` so Android matches iOS. When
the keyboard is open on mobile:
- `ExecutorStatusBar` is hidden (no task-count/Running footer), and
- `.project-content` reserves no footer/nav padding, so the composer
sits flush above the keyboard.
`footerKeyboardOpen` (the iOS `bottom: 0` footer-collapse class) stays
iOS-only — it only matters when the footer is still rendered over a
modal. Modal / Quick-Chat-overlay keyboard cases are unchanged
(`boardLayoutSuppressed`).
## Before / After
| Before | After |
| --- | --- |
| Footer shown + empty gap above keyboard | Footer hidden, composer
flush above keyboard |
_(Rendered with the real component CSS at a mobile viewport with the
keyboard-open classes applied.)_
## Notes / verification
- File-scoped tests pass: `mobileBarKeyboardFlags`,
`mobile-bottom-bars-keyboard-layout`, App keyboard-layout cases,
`footer-safe-layout`, `dashboard-footer-mobile-layout`,
`ChatView.mobile-render` (46 tests).
- FN-5707 originally gated this to iOS over a concern that stripping nav
padding mid-focus could make Android Chrome dismiss the keyboard. The
strip is keyed off `keyboardOpen`, which only flips `true` after the
visual viewport settles into its keyboard-open size — but **please
confirm on a real Android device** that the keyboard stays up when
tapping the composer. If it dismisses, the fallback is a transform-based
hide that avoids the reflow.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- stage-review-badge-begin -->
---
<a href="https://stagereview.app/Runfusion/Fusion/pull/1789">
<picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://stagereview.app/assets/gh-open-in-stage-dark.svg">
<img src="https://stagereview.app/assets/gh-open-in-stage-light.svg"
alt="Open in Stage">
</picture>
</a>
<!-- stage-review-badge-end -->
On Android the keyboard-open footer (executor status bar) stayed visible
and the off-screen mobile nav bar's reserved padding rendered as an empty
band between the composer and the keyboard. computeMobileBarKeyboardFlags
no longer iOS-gates footerHidden, so both platforms now hide the footer
and drop the reserved footer+nav padding-bottom when the soft keyboard is
up, letting the composer sit flush above the keyboard. footerKeyboardOpen
(the iOS bottom:0 collapse class) stays iOS-only.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
## FN-7039: graph-native workflow steps (complete — U1–U8)
Fixes the FN-7039 report — *optional workflow steps were marked done
without running, and didn't show in the step progress bar* — and
migrates workflow steps **entirely** onto the workflow-graph machinery,
removing the legacy parallel system end-to-end. Plan:
`docs/plans/2026-06-25-001-refactor-workflow-steps-graph-native-plan.md`.
### Root cause
`Store.optionalGroupIdSet()` returned an empty set when a task had no
explicit `workflowId` and the project had no `defaultWorkflowId`, so a
built-in group id (`browser-verification`) collided with a template id
and was materialized into a legacy `WS-xxx` row the graph executor never
matched. Graph-run steps also never recorded results, so the progress
bar stayed empty.
### What changed
- **U1** — `optionalGroupIdSet` → `builtin:coding` fallback; create-time
toggles resolve `builtin:coding`. Enabled built-in group ids no longer
downgraded.
- **U2** — the graph executor records each enabled optional-group step
into `task.workflowStepResults` (keyed by node id) + emits `[pre-merge]`
logs.
- **U3** — progress bar + Workflow tab read graph-written results;
dropped `workflowStepNameLookup`; added running / advisory-vs-blocking
render states.
- **U4** — deleted the legacy `runWorkflowSteps` execution path +
`workflow-step` seam/primitive; watchdog re-enters the graph;
store-fallback fails closed.
- **U5** — removed the `/api/workflow-steps*` REST surface + Settings →
Workflow Steps UI.
- **U6** — deleted `WORKFLOW_STEP_TEMPLATES` (inlined into the IR
builders); plugin templates remain as the editor palette.
- **U7** — **post-merge made graph-native and the legacy table
removed**:
- **U7a** post-merge steps run as graph nodes after `merge-attempt`
(flag-gated; built-in `coding` byte-identical when off).
- **U7b** `graphNativePostMerge` default-ON; merger post-merge path made
inert (no double-run, proven); migration 130 normalizes built-in enable
ids (`WS-004` → `browser-verification`). Verified against real DBs: **no
custom/plugin post-merge steps exist**; the only post-merge step
(compound-engineering's `document`) already runs as a graph node.
- **U7c** removed every remaining `workflow_steps` reader/writer (merger
post-merge code, store CRUD, `materializeWorkflowSteps`, executor
recovery read) and **dropped the table** (migration 131).
`materializeWorkflowSteps` was proven vestigial (the graph runs IR
nodes, never compiled rows).
- **U8** — docs rewritten to the graph-native model;
`settings-reference` updated.
- **Review fixes** — dead-code cleanup, step output/notes recording,
engine/core seam-contract sync.
### Verification
- `pnpm test:gate` green (engine-core 298, ci-shape 58); **`pnpm
smoke:boot` PASS** (app boots + `/api/health` 200 with the table gone);
full `@fusion/core` suite (6290) + reliability backstop (154) green;
core/engine/dashboard typecheck clean; seed-at-129 and seed-at-130
migration tests green.
- 4-persona code review
(correctness/adversarial/reliability/maintainability) on U1–U6;
`safe_auto` + on-goal fixes applied.
### Decision provenance
A six-reviewer doc review changed two foundations (see the plan revision
note): the graph writes the **existing `workflowStepResults` field** (no
new table — avoids upgrade data loss), and "drop the table" was found
unsafe until post-merge went graph-native (the user opted to do the full
post-merge rebuild + drop in this PR).
## Residual Review Findings (follow-up)
- **[P2] FN-4343 per-step scope gate not replicated on the graph path**
— the per-step `workflowStepScopeEnforcement` leak check lived only in
the deleted `runWorkflowSteps`. Merge-time `FileScopeViolationError` +
squash-overlap are unaffected; a coding-capable user-authored step could
write off-scope files that ride along to merge. Re-introduce post-node
scope enforcement on the graph path.
- **[P2] Recording for non-optional-group / split-branch step
realizations** — `recordWorkflowStepResult` fires only for
`optional-group` nodes in the main traversal; built-in gates record
correctly.
- **[P3] Misleading recovery log** — `recoverCompletedTask` logs
success-flavored "Auto-recovered…" even when the graph parked the task
`failed` (observability only).
- **[P3] Malformed-advisory verdict maps to `passed`** rather than
`advisory_failure`. Edge case.
- **[testing] Fail-closed store-capability test** — assert all
production store constructions expose `getTaskWorkflowSelection`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **Bug Fixes**
* Optional workflow steps now consistently run and appear in task
progress, including when no project default workflow is set.
* Task progress now derives workflow step names and statuses from
recorded results, showing correct **running** and non-blocking
**advisory-failure** behavior, while excluding disabled steps from
totals.
* **New Features**
* Post-merge optional steps now run **graph-native by default** and
remain non-blocking on revise outcomes.
* **Removals**
* Removed legacy workflow-step CRUD/refinement flows and the built-in
template-catalog-based model; workflow steps now rely on the
graph-native optional-group approach.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
WorkflowStepTemplate and resolvePlanningSettingsModel were only used by the deleted
/api/workflow-steps CRUD + :id/refine routes (U5); the imports survived the merge as
unused. Remove them. No behavior change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
An enabled-but-not-yet-run workflow step has no recorded result, so the progress bar
previously showed the raw graph node id (e.g. 'code-review'). Humanize the id fallback to
Title Case ('Code Review', 'Browser Verification', 'Frontend UX Design'). Once the step
runs, the graph-recorded config.name still wins; humanization is only the pre-run fallback.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- workflow-graph-executor: wrap each post-merge walk() in try/catch so a malformed
post-merge IR / traversal error is logged and skipped, never flipping an already-
merged task to failed (non-blocking post-merge contract) [T9, real bug].
- Refresh stale FNXC comments now that graphNativePostMerge is default-ON and the
legacy merger post-merge path was removed (experimental-features, workflow-graph-
executor, workflow-graph-post-merge.test) [T6/T7/T8].
- Normalize FNXC timestamps to yyyy-MM-dd-hh:mm (TaskCard.test, taskProgress.test) [T2/T3].
- Changeset: category fix → feature to match the minor bump [T0].
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a focused engine regression guard for user-configured command paths.
- Add a static Vitest registry that slices protected configured-command helpers and fails on execSync usage.
- Assert each protected command path keeps bounded async safeguards such as timeout, maxBuffer, or maxLifetimeMs.
- Document the guard and its deliberate git-plumbing exclusions in the testing guide.
Files changed:
docs/testing.md | 5 +
.../user-configured-command-no-execsync.test.ts | 288 +++++++++++++++++++++
2 files changed, 293 insertions(+)
Fusion-Task-Id: FN-7056
Fusion-Task-Lineage: b92f19cf-526e-4345-b18e-869a278e0e10
Refresh the test velocity report so it reflects the current quarantine ledger.
- Update the weekly baseline quarantine count from 0 to 3.
- Reflect the three new quarantines in age-bucket and delta tables.
- Update the #leads posting snippet with the new quarantine ledger total.
Files changed:
docs/test-velocity-baseline.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
Fusion-Task-Id: FN-7058
Fusion-Task-Lineage: c8d40858-3511-4962-9f33-01d144cb6dae
Reflect the completed cutover: quality gates are optional-group IR nodes (pre- and
post-merge), results live on task.workflowStepResults (graph-written), custom gates are
authored in the Workflow Editor, plugin templates are the palette. Removed docs for the
deleted runWorkflowSteps path, WORKFLOW_STEP_TEMPLATES catalog, /api/workflow-steps CRUD,
Settings → Workflow Steps manager, and the workflow_steps table. Documented
experimentalFeatures.graphNativePostMerge (default-ON) and the FN-4343 per-step scope-gate
follow-up. settings-reference: add graphNativePostMerge, annotate workflowStepScopeEnforcement.
Plan U8.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>