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>
Final cutover — nothing reads workflow_steps at runtime, so migration 131 drops it.
- Removed the merger post-merge execution path entirely (runPostMergeWorkflowSteps,
hasEnabledPostMergeWorkflowSteps, executePostMerge{Prompt,Script}Step, post-merge
worktree helpers + call site). Graph owns post-merge.
- Executor recovery no longer reads getWorkflowStep().gateMode; gate-ness comes from the
recorded WorkflowStepResult.status.
- Removed store CRUD (create/update/deleteWorkflowStep), materializeWorkflowSteps, and
migrateLegacyWorkflowSteps; selectTaskWorkflow now seeds default-on optional-group node
ids (consistent with create-time). KEPT the plugin step-template palette (getWorkflowStep
plugin-only resolver / listWorkflowSteps plugin-only) — never touches the table.
Removed the dashboard migrate-legacy-steps route + editor migration UI.
- SCHEMA_VERSION 130→131; migration 131 DROP TABLE IF EXISTS workflow_steps; SCHEMA_SQL
table def removed; historical migrations 77/105/109/130 guarded with tableExists().
Proof nothing stranded: the graph executes IR nodes resolved from workflowId (never
stepIds/compiled rows) — materializeWorkflowSteps writes were vestigial. Full @fusion/core
suite (6290), reliability backstop (154), boot smoke, and a seed-at-130 drop test all pass
with the table gone.
Plan U7c.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Makes graph-native post-merge the default and cuts the merger's legacy post-merge
path over so post-merge runs exactly once (via the graph), with migration data prep.
- experimentalFeatures.graphNativePostMerge → default ON; merger
hasEnabledPostMergeWorkflowSteps/runPostMergeWorkflowSteps become inert when on
(no double-run; proven by a new no-double-run test). Merger code kept (U7c removes it).
- Migration 130 (SCHEMA_VERSION 129→130) rewrites each task's enabledWorkflowSteps
entries that are legacy built-in pre-merge workflow_steps row ids → the optional-group
node id (browser-verification/code-review); dedupes; idempotent; identity-stable;
leaves node-ids/compiled/custom entries untouched. Table KEPT (U7c drops it).
- Investigation (real DBs): NO custom/plugin post-merge steps exist; the only post-merge
step is compound-engineering's 'document' graph node — so the merger no-op strands
nothing. Custom-step re-pointing was verified unnecessary and skipped.
Safe-to-drop in U7c still blocked by live readers: merger post-merge fns, store CRUD,
migrateLegacyWorkflowSteps/readConfig materialization (executor recovery reader is
already null-safe→advisory).
Plan U7b.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Restore mobile horizontal panning from direct touches on Agent Detail tab buttons.
- Apply pan-x touch-action to Agent Detail tab buttons alongside the tab strip.
- Cover both base and mobile tab styles so the global mobile pan-y lock does not block button-origin swipes.
- Extend the mobile scroll regression test to assert tab buttons expose horizontal touch panning.
- Add a patch changeset for the published CLI package.
Files changed:
.changeset/fn-7052-agent-detail-mobile-tab-touch-action.md | 7 +++++++
packages/dashboard/app/components/AgentDetailView.css | 5 +++++
.../components/__tests__/AgentDetailView.mobile-scroll.test.tsx | 8 ++++++--
3 files changed, 18 insertions(+), 2 deletions(-)
Fusion-Task-Id: FN-7052
Fusion-Task-Lineage: 42921948-f940-46d6-8c86-c159e94603b5
Keep workflow container fallback layouts connected in the editor.
- Space fallback and auto-layout columns by each node's rendered width so wide containers do not overlap adjacent handles.
- Treat incomplete top-level saved layouts as stale and fall back to a coherent graph layout.
- Cover optional-group, foreach, and mobile graph mapping with regression tests.
Files changed:
.changeset/fn-7016-optional-group-edges.md | 7 +
.../__tests__/workflow-auto-layout.test.ts | 18 +++
.../__tests__/workflow-flow-mapping.test.ts | 154 ++++++++++++++++++++-
.../__tests__/workflow-mobile-graph.test.ts | 37 ++++-
.../app/components/workflow-auto-layout.ts | 28 +++-
.../app/components/workflow-flow-mapping.ts | 40 +++++-
6 files changed, 271 insertions(+), 13 deletions(-)
Fusion-Task-Id: FN-7016
Fusion-Task-Lineage: a009fc2d-05cb-41cc-8be1-c5522f7398ff
Adds graph-native post-merge step execution behind experimentalFeatures.graphNativePostMerge
(default OFF — byte-identical behavior until enabled). After a successful merge-attempt
(the merge seam awaits the merge Promise), the graph runs post-merge optional-group nodes
and records phase:"post-merge" results, non-blocking. The merge-region traversal hop is
inert when the flag is off, and empty for builtin:coding even flag-on (its merge exits only
reach merge-region nodes or end), so the parity oracle holds. Optional-group recording now
derives phase + log prefix from config.phase (defaults pre-merge). Adds postMergeOptionalGroupNode
factory for migration/custom workflows. Legacy merger post-merge path untouched (U7b cutover).
Plan U7a.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Collapse the Global Models pricing editor into a compact summary with a modal table for detailed edits.
- Add a View pricing table modal with escape, overlay, and close-button dismissal.
- Keep add, edit, delete, and LiteLLM fetch workflows available while showing override counts in the collapsed settings view.
- Update model pricing tests, styling, and documentation for the collapsed summary and modal editor.
Files changed:
docs/dashboard-guide.md | 2 +-
docs/settings-reference.md | 4 +-
.../settings/sections/ModelPricingSection.css | 36 +++++-
.../settings/sections/ModelPricingSection.test.tsx | 62 ++++++++-
.../settings/sections/ModelPricingSection.tsx | 144 +++++++++++++++------
5 files changed, 198 insertions(+), 50 deletions(-)
Fusion-Task-Id: FN-7049
Fusion-Task-Lineage: 9ba63354-28e7-4717-81e6-805f1f05fd97
Render browser-native previews for right-dock file selections while preserving text editing behavior.
- Add image, video, audio, and PDF preview rendering through the workspace download URL.
- Keep previewable and known binary files out of the text editor, with a read-only fallback for unsupported binaries.
- Cover compact and two-pane dock preview behavior with tests, docs, and a patch changeset.
Files changed:
.changeset/fn-7031-dock-files-binary-preview.md | 7 +
docs/dashboard-guide.md | 2 +-
.../dashboard/app/components/DockFilesView.css | 45 ++++++
.../dashboard/app/components/DockFilesView.tsx | 85 ++++++++++-
.../components/__tests__/DockFilesView.test.tsx | 170 ++++++++++++++++++++-
5 files changed, 303 insertions(+), 6 deletions(-)
Fusion-Task-Id: FN-7031
Fusion-Task-Lineage: a52bdd57-bb3e-494e-85a8-81326a1548e2
Render the Automations modal in the shared floating-window shell while preserving embedded and mobile behavior.
- Wrap the modal presentation in FloatingWindow with persisted geometry, drag handle, and resize sizing.
- Update Automations modal CSS so desktop fills the floating shell and mobile remains full-screen with resize handles hidden.
- Cover floating-window rendering, dragging, resizing, mobile CSS contract, and embedded mode in ScheduledTasksModal tests.
- Add a minor changeset for the published Fusion package.
Files changed:
.changeset/fn-7036-automation-modal-floating.md | 7 ++
.../app/components/ScheduledTasksModal.tsx | 43 +++++----
packages/dashboard/app/components/ScriptsModal.css | 78 +++++++++-------
.../__tests__/ScheduledTasksModal.test.tsx | 103 +++++++++++++++++++--
4 files changed, 172 insertions(+), 59 deletions(-)
Fusion-Task-Id: FN-7036
Fusion-Task-Lineage: 3d6926b7-ec6d-4179-ad17-573bcfef297f
From the U1-U6 code review (correctness/adversarial/reliability/maintainability):
- Delete dead code left by the runWorkflowSteps removal: parkTaskAfterWorkflowStepPause,
handleWorkflowRevisionRequest (+ createWorkflowRevisionFollowUpTask,
injectWorkflowRevisionInstructions), handleWorkflowStepFailure, the dead
partitionWorkflowRevisionFeedback export + its test, and 2 orphaned jsdocs;
reword 2 stale comments (executor.ts FN-6722, self-healing.ts jsdoc).
- Record step output/notes on graph workflow-step results: runGraphCustomNode now
emits contextPatch:{output,notes} so the Workflow tab shows real review feedback
and [pre-merge] revision logs carry detail (was always the fallback before).
- Sync the workflow-step seam contract: core (workflow-compiler SEAM_NAMES/order,
workflow-ir column map, builtin-workflow-prompts) now rejects the workflow-step
seam to match the engine's resolveSeamName, preventing a latent run-time crash on
a persisted/cloned def that core would otherwise parse.
Residual (tracked in the PR): re-introduce the FN-4343 per-step scope gate on the
graph path; the parked-failed recovery log wording; malformed-advisory->passed edge
case; recording for non-optional-group/split-branch step realizations.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
U6: delete the built-in WORKFLOW_STEP_TEMPLATES catalog + its materializer
(getBuiltInWorkflowTemplate/ensureWorkflowStepForTemplate/toBuiltInWorkflowStep);
inline the browser-verification + code-review name/prompt/toolMode/gateMode into
their optional-group IR builders (node bytes unchanged); simplify
resolveEnabledWorkflowSteps to an identity-stable pass-through (no materialization,
so the optionalGroupIdSet collision guard is no longer needed). Plugin-contributed
step templates are kept as the editor palette.
U5: remove the legacy /api/workflow-steps REST surface (GET/POST/PATCH/DELETE +
/refine + /workflow-step-templates/:id/create), the dead client fns, and the
Settings management UI; GET /api/workflow-step-templates now serves plugin
templates only. The create-time optional-step toggles remain.
Scope: the workflow_steps store CRUD + table are intentionally KEPT — still consumed
by the engine (merger/recovery) and needed by U7's migration; their removal + the
table drop land in U7.
Plan U5 + U6.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>