refactor(cutover 3/3): dashboard + changesets — IR-driven lifecycle cutover#2335
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughThe PR makes workflow IR the lifecycle authority, moves review execution into graph nodes, removes legacy executor and parity paths, adds IR-based transition and recovery behavior, persists workflow pins and legacy adoption state, and updates dashboard surfaces and acceptance tests for custom workflows. ChangesIR-driven lifecycle cutover
Estimated code review effort: 5 (Critical) | ~120 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 8
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/engine/src/auto-merge-finalization.ts (1)
290-332: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win
isInvalidDoneTransitionErrorstill hardcodes'done', breaking the race-recovery path for custom-complete columns.
moveTasknow targets the resolvedcompleteColumn, butisInvalidDoneTransitionError(defined above, unchanged) only matches a literal"→ 'done'"substring in the error message. For a custom workflow whose complete column isn't"done"(e.g. the benchmark'sshipped), a transition-race error will fail this check, skip theisCompleteColumn(refreshed.column)recovery branch, and rethrow instead of gracefully returning{ outcome: "already-done", ... }.builtin:codingis unaffected (its complete column is literally"done"), but custom workflows lose the described "resolution failure never strands a proven-merged task" guarantee specifically on this race.🐛 Proposed fix: thread the resolved column into the error classifier
-export function isInvalidDoneTransitionError(error: unknown): boolean { +export function isInvalidDoneTransitionError(error: unknown, targetColumn = "done"): boolean { const message = error instanceof Error ? error.message : String(error); - return message.includes("Invalid transition:") && message.includes("→ 'done'"); + return message.includes("Invalid transition:") && message.includes(`→ '${targetColumn}'`); }} catch (error) { - if (isInvalidDoneTransitionError(error)) { + if (isInvalidDoneTransitionError(error, completeColumn)) {🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/auto-merge-finalization.ts` around lines 290 - 332, Update isInvalidDoneTransitionError and its call site in the finalization try/catch to accept and evaluate the resolved completeColumn instead of hardcoding "done". Ensure transition-race errors targeting custom complete columns such as "shipped" enter the existing refreshed-task recovery branch and return "already-done" when isCompleteColumn(refreshed.column) is true, while preserving current behavior for builtin workflows.
🧹 Nitpick comments (3)
packages/core/src/task-store/moves.ts (1)
789-812: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winDuplicated pooled-capacity counting loop across async/sync paths.
The
resolveWipBudgetColumns+ sum-occupants +evaluateCapacityRejectionsequence is repeated verbatim between the backend transaction path and the sync SQLite path, differing only in the counting primitive. Extracting a small shared helper (parameterized by acountActiveInCapacitySlotcallback) would remove this duplication and the risk of the two paths silently diverging on a future change.♻️ Sketch
+async function resolvePooledCapacityRejection( + workflowIr: WorkflowIr, + toColumn: string, + capacity: { limit: number; countPending: boolean }, + id: string, + countFn: (column: string) => number | Promise<number>, +): Promise<TransitionRejection | null> { + const budgetColumns = resolveWipBudgetColumns(workflowIr, toColumn); + let occupants = 0; + for (const budgetColumn of budgetColumns) { + occupants += await countFn(budgetColumn); + } + return evaluateCapacityRejection(toColumn, { limit: capacity.limit, occupants }); +}Also applies to: 937-957
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/task-store/moves.ts` around lines 789 - 812, Extract the duplicated pooled-capacity logic around resolveWipBudgetColumns, occupant summation, and evaluateCapacityRejection into a shared helper used by both the async transaction path and the sync SQLite path. Parameterize the helper with a countActiveInCapacitySlot callback so each path retains its existing counting primitive, while sharing budget-column resolution, exclusion, and rejection behavior.packages/engine/src/self-healing.ts (1)
6440-6440: 🩺 Stability & Availability | 🔵 Trivial | 💤 Low valueBounded sweep may leave >500 pre-cutover rows unadopted.
Adoption runs only at startup and caps at
limit: 500with no pagination, so on a large pre-cutover board any rows beyond 500 stay in legacy status until the next engine restart. If a single upgrade could carry more than 500 legacy rows, consider looping until the census is drained (or re-running adoption across a few maintenance cycles) so no row is stranded.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/self-healing.ts` at line 6440, The startup adoption flow around listTasks must not stop after the first 500 legacy rows. Add pagination or repeated fetches using the existing task-adoption logic until the pre-cutover census is exhausted, while preserving the current filtering that excludes archived tasks.packages/engine/src/__tests__/executor-task-done-invariant.test.ts (1)
90-90: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winExtract the repeated "capture fn_task_done without losing it to a later session" guard into a shared helper.
Each fix (
X = customTools.find(t => t.name === "fn_task_done") ?? X) is correct on its own, but the exact same one-liner was independently re-derived in five files to solve the same problem: under graph ownershipmockedCreateFnAgentnow fires once per graph session (e.g. Plan Review, then implementation), so a barefind(...)assignment on a session without the tool would clobber the already-captured reference withundefined. A shared helper inexecutor-test-helpers.ts(e.g.captureNamedTool(customTools, "fn_task_done", previous)) would remove the duplication and guard the next file added to this surface from re-introducing the bug without the fallback.
packages/engine/src/__tests__/executor-task-done-invariant.test.ts#L90-L90: replace the inlinetool = customTools.find(...) ?? toolwith the shared helper call.packages/engine/src/__tests__/invariant-wrong-checkout-completion.test.ts#L46-L46: replace the inlinetool = customTools.find(...) ?? toolwith the shared helper call.packages/engine/src/__tests__/executor-task-done-blocked.test.ts#L65-L65: replace the inlinetool = customTools.find(...) ?? toolwith the shared helper call.packages/engine/src/__tests__/executor-task-done-dissent-guard.test.ts#L37-L37: replace the inlinedoneTool = customTools.find(...) ?? doneToolwith the shared helper call.packages/engine/src/__tests__/executor-task-done-summary.test.ts#L50-L50: replace the inlinecapturedTool = customTools?.find(...) ?? capturedToolwith the shared helper call.♻️ Proposed shared helper
// packages/engine/src/__tests__/executor-test-helpers.ts export function captureNamedTool<T extends { name: string }>( customTools: T[] | undefined, name: string, previous: T | undefined, ): T | undefined { return customTools?.find((t) => t.name === name) ?? previous; }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/engine/src/__tests__/executor-task-done-invariant.test.ts` at line 90, Extract the repeated named-tool capture logic into captureNamedTool in executor-test-helpers.ts, preserving the existing tool when customTools is undefined or lacks the requested name. Update packages/engine/src/__tests__/executor-task-done-invariant.test.ts:90-90, packages/engine/src/__tests__/invariant-wrong-checkout-completion.test.ts:46-46, and packages/engine/src/__tests__/executor-task-done-blocked.test.ts:65-65 to use the helper for tool; update packages/engine/src/__tests__/executor-task-done-dissent-guard.test.ts:37-37 for doneTool and packages/engine/src/__tests__/executor-task-done-summary.test.ts:50-50 for capturedTool.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/architecture.md`:
- Around line 1258-1259: Update the nearby “Execution detail” bullets and Fast
Mode note in the architecture documentation to remove references to the deleted
in-session review path, including reviewStep() and review_step tool injection.
Describe review as owned by the workflow graph, consistent with
runWorkflowSteps() removal and task.workflowStepResults recording, while
preserving the documented fast-mode behavior.
In `@packages/core/src/task-store/lifecycle-ops.ts`:
- Around line 271-329: Update adoptLegacyTaskRowsOnOpen to paginate listTasks
results until all active, non-archived tasks are processed, rather than scanning
only the first 500. Advance each request using the store’s supported pagination
mechanism, preserve the existing adoption and per-task error handling, and stop
when a page is empty or shorter than the page size.
In `@packages/core/src/task-store/moves.ts`:
- Around line 413-445: Update the merge-blocker resolution in the
transition-invariant block around resolveTransitionColumnFacts and
getTaskMergeBlocker so it recognizes the workflow’s configured review lane
rather than relying on the hardcoded "in-review" column. Preserve bypassGuards
behavior and allow valid non-bypassed transitions into complete columns such as
merging → done.
In `@packages/dashboard/app/components/ListView.tsx`:
- Line 2746: Update both ListView call sites that compute the task status label,
including the grouped and table paths, to check for the “merging-fix” status
before passing getRunningWorkflowStepLabel(task). Preserve “Merging fixes…” for
those tasks by bypassing the workflow-step label, while leaving existing
behavior unchanged for other statuses and mirror TaskCard’s pre-check.
In `@packages/dashboard/src/routes/register-task-workflow-routes.ts`:
- Around line 2548-2549: Update the retry log messages in the unusable-worktree
session-start recovery and execution-failure-in-review branches to resolve the
destination with resolveReboundColumnForTask before logging, then interpolate
that resolved column instead of hardcoding “→ todo”; preserve the existing retry
flow and log suffixes.
- Around line 4361-4383: Update the spec-revision handler’s in-place-reset
early-return condition to compare task.column with the workflow-resolved intake
target from resolveIntakeColumnForTask, rather than only the literal "triage".
Preserve the existing reset behavior for both legacy triage tasks and
custom-workflow tasks already at their resolved intake column, while leaving
transition handling unchanged for other columns.
In `@packages/engine/src/__tests__/scheduler-trait-dispatch.test.ts`:
- Around line 167-172: Remove the unused `inB.column = "done"` mutation from the
second scenario, since `store2` is constructed from separate `task(...)` objects
and the mutation does not affect `runHoldReleaseSweep`. Keep `store2`’s
composition and the existing `released` assertion unchanged.
In `@packages/engine/src/scheduler.ts`:
- Around line 2269-2295: Parallelize the independent WIP checks in the task
sweep instead of awaiting isWipColumnTask sequentially inside the for loop. Use
Promise.all over tasks, then derive wipTaskIds from the successful boolean
results while preserving task ordering and the existing fallback behavior in
isWipColumnTask.
---
Outside diff comments:
In `@packages/engine/src/auto-merge-finalization.ts`:
- Around line 290-332: Update isInvalidDoneTransitionError and its call site in
the finalization try/catch to accept and evaluate the resolved completeColumn
instead of hardcoding "done". Ensure transition-race errors targeting custom
complete columns such as "shipped" enter the existing refreshed-task recovery
branch and return "already-done" when isCompleteColumn(refreshed.column) is
true, while preserving current behavior for builtin workflows.
---
Nitpick comments:
In `@packages/core/src/task-store/moves.ts`:
- Around line 789-812: Extract the duplicated pooled-capacity logic around
resolveWipBudgetColumns, occupant summation, and evaluateCapacityRejection into
a shared helper used by both the async transaction path and the sync SQLite
path. Parameterize the helper with a countActiveInCapacitySlot callback so each
path retains its existing counting primitive, while sharing budget-column
resolution, exclusion, and rejection behavior.
In `@packages/engine/src/__tests__/executor-task-done-invariant.test.ts`:
- Line 90: Extract the repeated named-tool capture logic into captureNamedTool
in executor-test-helpers.ts, preserving the existing tool when customTools is
undefined or lacks the requested name. Update
packages/engine/src/__tests__/executor-task-done-invariant.test.ts:90-90,
packages/engine/src/__tests__/invariant-wrong-checkout-completion.test.ts:46-46,
and packages/engine/src/__tests__/executor-task-done-blocked.test.ts:65-65 to
use the helper for tool; update
packages/engine/src/__tests__/executor-task-done-dissent-guard.test.ts:37-37 for
doneTool and
packages/engine/src/__tests__/executor-task-done-summary.test.ts:50-50 for
capturedTool.
In `@packages/engine/src/self-healing.ts`:
- Line 6440: The startup adoption flow around listTasks must not stop after the
first 500 legacy rows. Add pagination or repeated fetches using the existing
task-adoption logic until the pre-cutover census is exhausted, while preserving
the current filtering that excludes archived tasks.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: b17f4192-71d9-4edd-ade5-6cc995b5b3b0
📒 Files selected for processing (132)
.changeset/cutover-delete-fn-review-step.md.changeset/dashboard-custom-columns.md.changeset/ir-driven-lifecycle-cutover.md.changeset/legacy-adoption-and-ir-pin.md.changeset/six-column-merge-boundary.mdAGENTS.mddocs/architecture.mddocs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.mddocs/plans/2026-07-19-001-u5e-executecore-lift-handoff.mddocs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.mddocs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.mddocs/plans/2026-07-19-004-u5g-flip-residual-handoff.mddocs/plans/2026-07-19-005-u10-flip-residual-handoff.mddocs/plans/2026-07-19-006-u10b-post-flip-handoff.mdpackages/cli/skill/fusion/SKILL.mdpackages/cli/skill/fusion/references/engine-tools.mdpackages/cli/skill/fusion/references/extension-tools.mdpackages/core/src/__tests__/legacy-adoption.test.tspackages/core/src/__tests__/postgres/schema-applier.test.tspackages/core/src/__tests__/review-level-preset.test.tspackages/core/src/__tests__/workflow-cutover.test.tspackages/core/src/__tests__/workflow-ir-validation.test.tspackages/core/src/__tests__/workflow-lifecycle-traits.test.tspackages/core/src/index.gate.tspackages/core/src/index.tspackages/core/src/legacy-adoption.tspackages/core/src/postgres/index.tspackages/core/src/postgres/migrations/0000_initial.sqlpackages/core/src/postgres/migrations/0026_workflow_ir_pin_and_legacy_adoption.sqlpackages/core/src/postgres/postgres-health.tspackages/core/src/postgres/schema-applier.tspackages/core/src/postgres/schema/project.tspackages/core/src/review-level-preset.tspackages/core/src/store.tspackages/core/src/task-store/__tests__/transition-validator.test.tspackages/core/src/task-store/lifecycle-ops.tspackages/core/src/task-store/moves.tspackages/core/src/task-store/persistence.tspackages/core/src/task-store/remaining-ops-2.tspackages/core/src/task-store/remaining-ops-6.tspackages/core/src/task-store/serialization.tspackages/core/src/task-store/task-creation.tspackages/core/src/task-store/task-row-mappers.tspackages/core/src/task-store/task-update.tspackages/core/src/types.tspackages/core/src/types/board.tspackages/core/src/types/workflow-steps.tspackages/core/src/workflow-capacity.tspackages/core/src/workflow-cutover.tspackages/core/src/workflow-ir-resolver.tspackages/core/src/workflow-ir.tspackages/core/src/workflow-lifecycle-traits.tspackages/core/src/workflow-step-results.tspackages/core/src/workflow-transition-policy.tspackages/dashboard/app/components/ListView.tsxpackages/dashboard/app/components/TaskCard.tsxpackages/dashboard/app/components/TaskForm.tsxpackages/dashboard/app/hooks/useTasks.tspackages/dashboard/app/utils/taskProgress.tspackages/dashboard/app/utils/taskStatusBadgeLabel.tspackages/dashboard/src/__tests__/routes-trait-rekey.test.tspackages/dashboard/src/github-tracking-state.tspackages/dashboard/src/routes/register-task-workflow-routes.tspackages/engine/src/__tests__/benchmark-six-column-workflow.test.tspackages/engine/src/__tests__/executor-column-agent-principal.test.tspackages/engine/src/__tests__/executor-contamination-base.test.tspackages/engine/src/__tests__/executor-ephemeral-disabled-dispatch-gate.test.tspackages/engine/src/__tests__/executor-fast-mode-workflows.test.tspackages/engine/src/__tests__/executor-graph-boundary.test.tspackages/engine/src/__tests__/executor-implicit-task-done-budget.test.tspackages/engine/src/__tests__/executor-model-marker.test.tspackages/engine/src/__tests__/executor-outer-dispatch-dependency-gate.test.tspackages/engine/src/__tests__/executor-plan-only-scope-leak.test.tspackages/engine/src/__tests__/executor-preheld-legacy-handoff.test.tspackages/engine/src/__tests__/executor-prompt.test.tspackages/engine/src/__tests__/executor-review-step-indexing.test.tspackages/engine/src/__tests__/executor-review-verdicts.test.tspackages/engine/src/__tests__/executor-step-numbering-zero-based.test.tspackages/engine/src/__tests__/executor-step-session.test.tspackages/engine/src/__tests__/executor-stuck-requeue-preserve-progress.test.tspackages/engine/src/__tests__/executor-task-done-blocked.test.tspackages/engine/src/__tests__/executor-task-done-case-insensitive-branch.test.tspackages/engine/src/__tests__/executor-task-done-dissent-guard.test.tspackages/engine/src/__tests__/executor-task-done-invariant.test.tspackages/engine/src/__tests__/executor-task-done-revise-verdict-guard.test.tspackages/engine/src/__tests__/executor-task-done-summary.test.tspackages/engine/src/__tests__/executor-test-helpers.tspackages/engine/src/__tests__/executor-worktree.test.tspackages/engine/src/__tests__/fixtures/six-column-workflow-ir.tspackages/engine/src/__tests__/in-review-unmet-dependency-reconcile.test.tspackages/engine/src/__tests__/invariant-wrong-checkout-completion.test.tspackages/engine/src/__tests__/legacy-tombstones.test.tspackages/engine/src/__tests__/merger-trait-rekey.test.tspackages/engine/src/__tests__/plan-review-lease.test.tspackages/engine/src/__tests__/plan-review-single-owner.test.tspackages/engine/src/__tests__/reliability-interactions/dual-observe-shadow-terminal-stage.test.tspackages/engine/src/__tests__/reliability-interactions/executing-task-lock.test.tspackages/engine/src/__tests__/reliability-interactions/executor-liveness-gate.test.tspackages/engine/src/__tests__/reliability-interactions/executor-no-task-done-vs-worktree-reclaim.test.tspackages/engine/src/__tests__/reliability-interactions/executor-pending-review-skip-retry.test.tspackages/engine/src/__tests__/reliability-interactions/soft-delete-end-to-end.test.tspackages/engine/src/__tests__/reliability-interactions/task-done-refusal-x-invariant.test.tspackages/engine/src/__tests__/reliability-interactions/workflow-interpreter-dual-observe.test.tspackages/engine/src/__tests__/restart.integration.test.tspackages/engine/src/__tests__/review-level-tombstone.test.tspackages/engine/src/__tests__/reviewer-workspace.test.tspackages/engine/src/__tests__/scheduler-trait-dispatch.test.tspackages/engine/src/__tests__/self-healing-trait-rekey.test.tspackages/engine/src/__tests__/task-pipeline-smoke.test.tspackages/engine/src/__tests__/triage-plan-review-replan-cap.test.tspackages/engine/src/__tests__/triage-plan-review-unavailable-retry.test.tspackages/engine/src/__tests__/triage-review-spec-external-integration.test.tspackages/engine/src/__tests__/triage.test.tspackages/engine/src/__tests__/workflow-authoritative-driver-async-selection.test.tspackages/engine/src/__tests__/workflow-graph-column-moves.test.tspackages/engine/src/__tests__/workflow-graph-optional-step-fix.test.tspackages/engine/src/auto-merge-finalization.tspackages/engine/src/executor.tspackages/engine/src/hold-release.tspackages/engine/src/index.tspackages/engine/src/merger.tspackages/engine/src/run-audit.tspackages/engine/src/runtimes/in-process-runtime.tspackages/engine/src/scheduler.tspackages/engine/src/self-healing.tspackages/engine/src/triage.tspackages/engine/src/workflow-authoritative-driver.tspackages/engine/src/workflow-column-boundary.tspackages/engine/src/workflow-graph-executor.tspackages/engine/src/workflow-graph-task-runner.tspackages/engine/src/workflow-parity-observer.tspackages/pi-claude-cli/index.ts
💤 Files with no reviewable changes (15)
- packages/engine/src/tests/reliability-interactions/dual-observe-shadow-terminal-stage.test.ts
- packages/engine/src/tests/workflow-authoritative-driver-async-selection.test.ts
- packages/engine/src/tests/reliability-interactions/workflow-interpreter-dual-observe.test.ts
- packages/core/src/workflow-cutover.ts
- packages/core/src/tests/workflow-cutover.test.ts
- packages/engine/src/tests/executor-preheld-legacy-handoff.test.ts
- packages/engine/src/tests/triage-plan-review-replan-cap.test.ts
- packages/cli/skill/fusion/references/engine-tools.md
- packages/engine/src/tests/triage-plan-review-unavailable-retry.test.ts
- packages/engine/src/workflow-parity-observer.ts
- packages/engine/src/workflow-authoritative-driver.ts
- packages/engine/src/tests/executor-review-step-indexing.test.ts
- packages/engine/src/tests/triage.test.ts
- packages/engine/src/index.ts
- packages/engine/src/runtimes/in-process-runtime.ts
- merge-blocker clearance keys on the mergeBlocker trait, not literal in-review (fixes merging->done for custom workflows; PG regression test across 3 surfaces) - legacy adoption sweep paginates to drain the full census in both consumers (1101-row regression test) - finalization race classifier accepts the resolved complete column (custom-column regression test) - scheduler WIP seed batches selection lookups + resolves each distinct IR once (perf) - spec-revision works from custom intake columns; retry logs report the trait-derived target - merging-fix badge guard enforced in the shared label helper for all callers - pooled-capacity loop deduped via shared helper; fn_task_done capture guard extracted (captureNamedTool, 5 files) - trait-dispatch scenario 3 mutation made load-bearing with real moveTask assertions - architecture.md review bullets rewritten to graph-owned reality - TaskCard expectation updated to U12's intentional step-name badge Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Re: CodeRabbit review body (outside-diff + nitpicks) — addressed in 9691b70:
Fixed: the classifier now accepts the resolved target column (
Fixed: extracted
Fixed together with the inline pagination thread: both adoption consumers (store-open + self-healing startup) drain the census with a bounded 500-per-page loop; 1101-row regression test.
Fixed: Also noted while fixing (left for follow-up, not in this PR): with no workflow-selection row, 🤖 Generated with Claude Code |
There was a problem hiding this comment.
Actionable comments posted: 1
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
packages/dashboard/app/utils/taskStatusBadgeLabel.ts (1)
25-33: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winFix invalid timestamp format in FNXC comment.
As per coding guidelines, FNXC comments must include a timestamp in strict
yyyy-MM-dd-hh:mmformat. The timestamp2b:55contains a typo and is invalid.📝 Proposed fix to correct the timestamp
/* - FNXC:TaskStatusBadge 2026-07-19-2b:55 (U12 / R2 / R11): + FNXC:TaskStatusBadge 2026-07-19-20:55 (U12 / R2 / R11): Workflow-step state wins over the raw status vocabulary. A card whose Plan Review is running🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/dashboard/app/utils/taskStatusBadgeLabel.ts` around lines 25 - 33, Correct the FNXC metadata timestamp in the comment above the workflowStepLabel parameter to use the strict yyyy-MM-dd-hh:mm format, replacing the invalid “2b:55” segment while preserving the existing date, identifiers, and explanatory text.Source: Coding guidelines
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/core/src/__tests__/no-selection-default-workflow-move.test.ts`:
- Around line 32-40: Add the required “## Symptom Verification” and “## Surface
Enumeration” markdown headings in the test description, placing the existing
surface-enumeration details under the latter and adding a symptom-verification
section that covers the regression’s observable failure and relevant data
states.
---
Outside diff comments:
In `@packages/dashboard/app/utils/taskStatusBadgeLabel.ts`:
- Around line 25-33: Correct the FNXC metadata timestamp in the comment above
the workflowStepLabel parameter to use the strict yyyy-MM-dd-hh:mm format,
replacing the invalid “2b:55” segment while preserving the existing date,
identifiers, and explanatory text.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: edb04e0b-4d46-44d1-8b83-e4487b15f827
📒 Files selected for processing (27)
.changeset/fix-no-selection-default-workflow-drift.mddocs/architecture.mdpackages/core/src/__tests__/custom-review-lane-merge-blocker.test.tspackages/core/src/__tests__/legacy-adoption.test.tspackages/core/src/__tests__/no-selection-default-workflow-move.test.tspackages/core/src/builtin-workflows.tspackages/core/src/index.gate.tspackages/core/src/index.tspackages/core/src/task-store/lifecycle-ops.tspackages/core/src/task-store/moves.tspackages/core/src/task-store/remaining-ops-8.tspackages/core/src/workflow-ir-resolver.tspackages/dashboard/app/components/__tests__/TaskCard.test.tsxpackages/dashboard/app/utils/__tests__/taskStatusBadgeLabel.test.tspackages/dashboard/app/utils/taskStatusBadgeLabel.tspackages/dashboard/src/routes/register-task-workflow-routes.tspackages/engine/src/__tests__/executor-task-done-blocked.test.tspackages/engine/src/__tests__/executor-task-done-dissent-guard.test.tspackages/engine/src/__tests__/executor-task-done-invariant.test.tspackages/engine/src/__tests__/executor-task-done-summary.test.tspackages/engine/src/__tests__/executor-test-helpers.tspackages/engine/src/__tests__/invariant-wrong-checkout-completion.test.tspackages/engine/src/__tests__/merger-trait-rekey.test.tspackages/engine/src/__tests__/scheduler-trait-dispatch.test.tspackages/engine/src/auto-merge-finalization.tspackages/engine/src/scheduler.tspackages/engine/src/self-healing.ts
🚧 Files skipped from review as they are similar to previous changes (17)
- packages/engine/src/tests/executor-task-done-blocked.test.ts
- packages/engine/src/tests/executor-task-done-summary.test.ts
- packages/core/src/task-store/lifecycle-ops.ts
- packages/engine/src/tests/executor-task-done-invariant.test.ts
- packages/engine/src/tests/merger-trait-rekey.test.ts
- packages/engine/src/tests/invariant-wrong-checkout-completion.test.ts
- packages/engine/src/tests/scheduler-trait-dispatch.test.ts
- packages/engine/src/auto-merge-finalization.ts
- packages/engine/src/scheduler.ts
- packages/core/src/workflow-ir-resolver.ts
- packages/engine/src/self-healing.ts
- packages/core/src/task-store/moves.ts
- docs/architecture.md
- packages/core/src/index.ts
- packages/core/src/index.gate.ts
- packages/engine/src/tests/executor-test-helpers.ts
- packages/dashboard/src/routes/register-task-workflow-routes.ts
- merge-blocker clearance keys on the mergeBlocker trait, not literal in-review (fixes merging->done for custom workflows; PG regression test across 3 surfaces) - legacy adoption sweep paginates to drain the full census in both consumers (1101-row regression test) - finalization race classifier accepts the resolved complete column (custom-column regression test) - scheduler WIP seed batches selection lookups + resolves each distinct IR once (perf) - spec-revision works from custom intake columns; retry logs report the trait-derived target - merging-fix badge guard enforced in the shared label helper for all callers - pooled-capacity loop deduped via shared helper; fn_task_done capture guard extracted (captureNamedTool, 5 files) - trait-dispatch scenario 3 mutation made load-bearing with real moveTask assertions - architecture.md review bullets rewritten to graph-owned reality - TaskCard expectation updated to U12's intentional step-name badge Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
30e3cb9 to
5169271
Compare
|
This PR is now part 3 of 3 of a stacked split (done so each PR fits automated-review file limits — greptile skipped the original 133-file diff):
The branch was also rebased onto latest main (two conflicts in executor-test-helpers.ts resolved as the union — main's #2332 and the cutover's U5f landed the same verification-request stubs independently). All guardrails re-verified green post-rebase: engine-core gate 294/294, benchmark + builtin lifecycle suites 115/115, all typechecks clean — and each stack layer independently typechecks (core+old-engine, core+engine+old-dashboard). Merge order: #2341 → #2342 (retarget to main after 1 merges) → this (retarget to main after 2 merges). Squash-merge each per repo default. 🤖 Generated with Claude Code |
5169271 to
76ef0f6
Compare
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md`:
- Line 1: Add an FNXC comment block at the beginning of each affected Markdown
file—docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md:1-1,
docs/plans/2026-07-19-001-u5e-executecore-lift-handoff.md:1-1,
docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md:1-1,
docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md:1-1,
docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md:1-1,
docs/plans/2026-07-19-005-u10-flip-residual-handoff.md:1-1, and
packages/cli/skill/fusion/SKILL.md:1-1. Use the established
FNXC:<Area-of-product> yyyy-MM-dd-hh:mm: format to document important
user-facing requirements, behavioral changes, and technical decisions; treat
FNXC_LOG as a heading concept from AGENTS.md, not as a literal token.
In `@packages/core/src/__tests__/legacy-adoption.test.ts`:
- Around line 261-268: Update the bug specification comment for the pagination
drain regression near the legacy adoption tests to include both required
headers, “## Symptom Verification” and “## Surface Enumeration,” while
preserving the existing PR `#2335` context and test behavior.
- Around line 59-66: Expand the file collection in the legacy-adoption census
test around the `files` array so it covers every relevant `.ts` file under core
and engine, preferably via a recursive directory scan; otherwise add all
documented writers such as `scheduler.ts`, `comments-ops.ts`, and dashboard
routes. Keep the existing status-write census assertions unchanged while
ensuring no task.status write literals are excluded.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 02e57e4d-0221-44be-b09c-e42a997bf528
📒 Files selected for processing (145)
.changeset/cutover-delete-fn-review-step.md.changeset/dashboard-custom-columns.md.changeset/fix-builtin-workflow-lifecycle.md.changeset/fix-no-merge-workflow-completion.md.changeset/fix-no-selection-default-workflow-drift.md.changeset/ir-driven-lifecycle-cutover.md.changeset/legacy-adoption-and-ir-pin.md.changeset/six-column-merge-boundary.mdAGENTS.mddocs/architecture.mddocs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.mddocs/plans/2026-07-19-001-u5e-executecore-lift-handoff.mddocs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.mddocs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.mddocs/plans/2026-07-19-004-u5g-flip-residual-handoff.mddocs/plans/2026-07-19-005-u10-flip-residual-handoff.mddocs/plans/2026-07-19-006-u10b-post-flip-handoff.mdpackages/cli/skill/fusion/SKILL.mdpackages/cli/skill/fusion/references/engine-tools.mdpackages/cli/skill/fusion/references/extension-tools.mdpackages/core/src/__tests__/custom-review-lane-merge-blocker.test.tspackages/core/src/__tests__/legacy-adoption.test.tspackages/core/src/__tests__/no-selection-default-workflow-move.test.tspackages/core/src/__tests__/postgres/schema-applier.test.tspackages/core/src/__tests__/review-level-preset.test.tspackages/core/src/__tests__/workflow-cutover.test.tspackages/core/src/__tests__/workflow-ir-validation.test.tspackages/core/src/__tests__/workflow-lifecycle-traits.test.tspackages/core/src/builtin-workflows.tspackages/core/src/index.gate.tspackages/core/src/index.tspackages/core/src/legacy-adoption.tspackages/core/src/postgres/index.tspackages/core/src/postgres/migrations/0000_initial.sqlpackages/core/src/postgres/migrations/0026_workflow_ir_pin_and_legacy_adoption.sqlpackages/core/src/postgres/postgres-health.tspackages/core/src/postgres/schema-applier.tspackages/core/src/postgres/schema/project.tspackages/core/src/review-level-preset.tspackages/core/src/store.tspackages/core/src/task-store/__tests__/transition-validator.test.tspackages/core/src/task-store/lifecycle-ops.tspackages/core/src/task-store/moves.tspackages/core/src/task-store/persistence.tspackages/core/src/task-store/remaining-ops-2.tspackages/core/src/task-store/remaining-ops-6.tspackages/core/src/task-store/serialization.tspackages/core/src/task-store/task-creation.tspackages/core/src/task-store/task-row-mappers.tspackages/core/src/task-store/task-update.tspackages/core/src/task-store/workflow-definitions.tspackages/core/src/types.tspackages/core/src/types/board.tspackages/core/src/types/workflow-steps.tspackages/core/src/workflow-capacity.tspackages/core/src/workflow-cutover.tspackages/core/src/workflow-ir-resolver.tspackages/core/src/workflow-ir.tspackages/core/src/workflow-lifecycle-traits.tspackages/core/src/workflow-step-results.tspackages/core/src/workflow-transition-policy.tspackages/dashboard/app/components/ListView.tsxpackages/dashboard/app/components/TaskCard.tsxpackages/dashboard/app/components/TaskForm.tsxpackages/dashboard/app/components/__tests__/TaskCard.test.tsxpackages/dashboard/app/hooks/useTasks.tspackages/dashboard/app/utils/__tests__/taskStatusBadgeLabel.test.tspackages/dashboard/app/utils/capture-screenshot.tspackages/dashboard/app/utils/taskProgress.tspackages/dashboard/app/utils/taskStatusBadgeLabel.tspackages/dashboard/src/__tests__/routes-trait-rekey.test.tspackages/dashboard/src/github-tracking-state.tspackages/dashboard/src/routes/register-task-workflow-routes.tspackages/engine/src/__tests__/benchmark-six-column-workflow.test.tspackages/engine/src/__tests__/builtin-workflows-lifecycle.test.tspackages/engine/src/__tests__/executor-column-agent-principal.test.tspackages/engine/src/__tests__/executor-contamination-base.test.tspackages/engine/src/__tests__/executor-ephemeral-disabled-dispatch-gate.test.tspackages/engine/src/__tests__/executor-fast-mode-workflows.test.tspackages/engine/src/__tests__/executor-graph-boundary.test.tspackages/engine/src/__tests__/executor-implicit-task-done-budget.test.tspackages/engine/src/__tests__/executor-model-marker.test.tspackages/engine/src/__tests__/executor-outer-dispatch-dependency-gate.test.tspackages/engine/src/__tests__/executor-plan-only-scope-leak.test.tspackages/engine/src/__tests__/executor-preheld-legacy-handoff.test.tspackages/engine/src/__tests__/executor-prompt.test.tspackages/engine/src/__tests__/executor-review-step-indexing.test.tspackages/engine/src/__tests__/executor-review-verdicts.test.tspackages/engine/src/__tests__/executor-step-numbering-zero-based.test.tspackages/engine/src/__tests__/executor-step-session.test.tspackages/engine/src/__tests__/executor-stuck-requeue-preserve-progress.test.tspackages/engine/src/__tests__/executor-task-done-blocked.test.tspackages/engine/src/__tests__/executor-task-done-case-insensitive-branch.test.tspackages/engine/src/__tests__/executor-task-done-dissent-guard.test.tspackages/engine/src/__tests__/executor-task-done-invariant.test.tspackages/engine/src/__tests__/executor-task-done-revise-verdict-guard.test.tspackages/engine/src/__tests__/executor-task-done-summary.test.tspackages/engine/src/__tests__/executor-test-helpers.tspackages/engine/src/__tests__/executor-worktree.test.tspackages/engine/src/__tests__/fixtures/six-column-workflow-ir.tspackages/engine/src/__tests__/in-review-unmet-dependency-reconcile.test.tspackages/engine/src/__tests__/invariant-wrong-checkout-completion.test.tspackages/engine/src/__tests__/legacy-tombstones.test.tspackages/engine/src/__tests__/merger-trait-rekey.test.tspackages/engine/src/__tests__/no-merge-workflow-completion.test.tspackages/engine/src/__tests__/plan-review-lease.test.tspackages/engine/src/__tests__/plan-review-single-owner.test.tspackages/engine/src/__tests__/reliability-interactions/dual-observe-shadow-terminal-stage.test.tspackages/engine/src/__tests__/reliability-interactions/executing-task-lock.test.tspackages/engine/src/__tests__/reliability-interactions/executor-liveness-gate.test.tspackages/engine/src/__tests__/reliability-interactions/executor-no-task-done-vs-worktree-reclaim.test.tspackages/engine/src/__tests__/reliability-interactions/executor-pending-review-skip-retry.test.tspackages/engine/src/__tests__/reliability-interactions/soft-delete-end-to-end.test.tspackages/engine/src/__tests__/reliability-interactions/task-done-refusal-x-invariant.test.tspackages/engine/src/__tests__/reliability-interactions/workflow-interpreter-dual-observe.test.tspackages/engine/src/__tests__/restart.integration.test.tspackages/engine/src/__tests__/review-level-tombstone.test.tspackages/engine/src/__tests__/reviewer-workspace.test.tspackages/engine/src/__tests__/scheduler-trait-dispatch.test.tspackages/engine/src/__tests__/self-healing-trait-rekey.test.tspackages/engine/src/__tests__/task-pipeline-smoke.test.tspackages/engine/src/__tests__/triage-plan-review-replan-cap.test.tspackages/engine/src/__tests__/triage-plan-review-unavailable-retry.test.tspackages/engine/src/__tests__/triage-review-spec-external-integration.test.tspackages/engine/src/__tests__/triage.test.tspackages/engine/src/__tests__/workflow-authoritative-driver-async-selection.test.tspackages/engine/src/__tests__/workflow-graph-column-moves.test.tspackages/engine/src/__tests__/workflow-graph-optional-step-fix.test.tspackages/engine/src/auto-merge-finalization.tspackages/engine/src/executor.tspackages/engine/src/hold-release.tspackages/engine/src/index.tspackages/engine/src/merger.tspackages/engine/src/run-audit.tspackages/engine/src/runtimes/in-process-runtime.tspackages/engine/src/scheduler.tspackages/engine/src/self-healing.tspackages/engine/src/triage.tspackages/engine/src/workflow-authoritative-driver.tspackages/engine/src/workflow-column-boundary.tspackages/engine/src/workflow-graph-executor.tspackages/engine/src/workflow-graph-task-runner.tspackages/engine/src/workflow-node-handlers.tspackages/engine/src/workflow-parity-observer.tspackages/pi-claude-cli/index.ts
💤 Files with no reviewable changes (16)
- packages/engine/src/tests/reliability-interactions/dual-observe-shadow-terminal-stage.test.ts
- packages/cli/skill/fusion/references/engine-tools.md
- packages/engine/src/tests/executor-review-step-indexing.test.ts
- packages/engine/src/tests/reliability-interactions/workflow-interpreter-dual-observe.test.ts
- packages/engine/src/tests/triage-plan-review-replan-cap.test.ts
- packages/engine/src/index.ts
- packages/dashboard/app/utils/capture-screenshot.ts
- packages/engine/src/tests/triage-plan-review-unavailable-retry.test.ts
- packages/core/src/tests/workflow-cutover.test.ts
- packages/engine/src/tests/workflow-authoritative-driver-async-selection.test.ts
- packages/core/src/workflow-cutover.ts
- packages/engine/src/workflow-parity-observer.ts
- packages/engine/src/runtimes/in-process-runtime.ts
- packages/engine/src/tests/executor-preheld-legacy-handoff.test.ts
- packages/engine/src/workflow-authoritative-driver.ts
- packages/engine/src/tests/triage.test.ts
🚧 Files skipped from review as they are similar to previous changes (111)
- packages/engine/src/tests/executor-model-marker.test.ts
- packages/core/src/postgres/index.ts
- .changeset/fix-builtin-workflow-lifecycle.md
- .changeset/fix-no-selection-default-workflow-drift.md
- packages/core/src/tests/no-selection-default-workflow-move.test.ts
- packages/core/src/tests/review-level-preset.test.ts
- packages/engine/src/tests/reliability-interactions/soft-delete-end-to-end.test.ts
- packages/core/src/types/board.ts
- packages/core/src/postgres/migrations/0026_workflow_ir_pin_and_legacy_adoption.sql
- .changeset/six-column-merge-boundary.md
- packages/engine/src/tests/legacy-tombstones.test.ts
- packages/core/src/task-store/task-update.ts
- packages/core/src/task-store/task-row-mappers.ts
- packages/engine/src/tests/executor-implicit-task-done-budget.test.ts
- packages/core/src/store.ts
- packages/pi-claude-cli/index.ts
- .changeset/legacy-adoption-and-ir-pin.md
- packages/engine/src/tests/executor-task-done-dissent-guard.test.ts
- packages/cli/skill/fusion/references/extension-tools.md
- packages/engine/src/tests/executor-column-agent-principal.test.ts
- packages/dashboard/app/components/tests/TaskCard.test.tsx
- packages/core/src/postgres/migrations/0000_initial.sql
- packages/engine/src/tests/reliability-interactions/executing-task-lock.test.ts
- packages/core/src/task-store/remaining-ops-2.ts
- packages/engine/src/tests/executor-task-done-case-insensitive-branch.test.ts
- packages/dashboard/app/components/TaskCard.tsx
- packages/core/src/task-store/tests/transition-validator.test.ts
- packages/dashboard/app/utils/taskStatusBadgeLabel.ts
- packages/dashboard/app/utils/tests/taskStatusBadgeLabel.test.ts
- .changeset/ir-driven-lifecycle-cutover.md
- packages/core/src/tests/custom-review-lane-merge-blocker.test.ts
- packages/engine/src/tests/plan-review-single-owner.test.ts
- packages/dashboard/src/tests/routes-trait-rekey.test.ts
- packages/core/src/task-store/remaining-ops-6.ts
- packages/engine/src/tests/workflow-graph-optional-step-fix.test.ts
- packages/engine/src/tests/executor-task-done-revise-verdict-guard.test.ts
- packages/engine/src/tests/executor-contamination-base.test.ts
- packages/core/src/postgres/postgres-health.ts
- packages/engine/src/tests/reliability-interactions/executor-liveness-gate.test.ts
- packages/engine/src/tests/executor-task-done-blocked.test.ts
- packages/engine/src/run-audit.ts
- packages/engine/src/tests/executor-outer-dispatch-dependency-gate.test.ts
- packages/core/src/types.ts
- packages/engine/src/tests/task-pipeline-smoke.test.ts
- packages/core/src/tests/workflow-ir-validation.test.ts
- packages/core/src/types/workflow-steps.ts
- packages/core/src/workflow-capacity.ts
- packages/engine/src/tests/review-level-tombstone.test.ts
- packages/dashboard/app/utils/taskProgress.ts
- packages/engine/src/tests/executor-task-done-summary.test.ts
- packages/core/src/workflow-lifecycle-traits.ts
- packages/engine/src/tests/reliability-interactions/executor-no-task-done-vs-worktree-reclaim.test.ts
- packages/engine/src/tests/triage-review-spec-external-integration.test.ts
- packages/engine/src/tests/scheduler-trait-dispatch.test.ts
- packages/dashboard/app/hooks/useTasks.ts
- packages/core/src/postgres/schema/project.ts
- .changeset/cutover-delete-fn-review-step.md
- packages/engine/src/workflow-column-boundary.ts
- packages/engine/src/workflow-graph-task-runner.ts
- packages/dashboard/app/components/ListView.tsx
- packages/engine/src/workflow-node-handlers.ts
- packages/engine/src/tests/reliability-interactions/task-done-refusal-x-invariant.test.ts
- packages/engine/src/tests/executor-task-done-invariant.test.ts
- .changeset/dashboard-custom-columns.md
- packages/engine/src/tests/executor-graph-boundary.test.ts
- packages/engine/src/tests/invariant-wrong-checkout-completion.test.ts
- AGENTS.md
- packages/core/src/review-level-preset.ts
- packages/engine/src/tests/fixtures/six-column-workflow-ir.ts
- packages/engine/src/auto-merge-finalization.ts
- packages/core/src/workflow-transition-policy.ts
- packages/core/src/tests/workflow-lifecycle-traits.test.ts
- packages/engine/src/hold-release.ts
- packages/engine/src/tests/benchmark-six-column-workflow.test.ts
- packages/core/src/task-store/lifecycle-ops.ts
- packages/engine/src/tests/self-healing-trait-rekey.test.ts
- packages/engine/src/scheduler.ts
- packages/core/src/task-store/persistence.ts
- packages/core/src/builtin-workflows.ts
- packages/core/src/workflow-ir-resolver.ts
- packages/engine/src/tests/reliability-interactions/executor-pending-review-skip-retry.test.ts
- packages/engine/src/tests/merger-trait-rekey.test.ts
- packages/core/src/tests/postgres/schema-applier.test.ts
- packages/core/src/task-store/moves.ts
- packages/engine/src/tests/plan-review-lease.test.ts
- packages/core/src/workflow-ir.ts
- packages/core/src/index.gate.ts
- packages/dashboard/src/github-tracking-state.ts
- packages/core/src/postgres/schema-applier.ts
- packages/core/src/index.ts
- packages/engine/src/tests/executor-ephemeral-disabled-dispatch-gate.test.ts
- packages/engine/src/tests/executor-test-helpers.ts
- packages/core/src/workflow-step-results.ts
- packages/engine/src/tests/workflow-graph-column-moves.test.ts
- docs/architecture.md
- packages/engine/src/tests/executor-worktree.test.ts
- packages/engine/src/self-healing.ts
- packages/engine/src/tests/reviewer-workspace.test.ts
- packages/engine/src/tests/restart.integration.test.ts
- packages/engine/src/tests/executor-fast-mode-workflows.test.ts
- packages/engine/src/tests/executor-stuck-requeue-preserve-progress.test.ts
- packages/engine/src/tests/executor-step-session.test.ts
- packages/core/src/legacy-adoption.ts
- packages/engine/src/tests/executor-prompt.test.ts
- packages/engine/src/workflow-graph-executor.ts
- packages/engine/src/tests/executor-review-verdicts.test.ts
- packages/engine/src/tests/builtin-workflows-lifecycle.test.ts
- packages/dashboard/src/routes/register-task-workflow-routes.ts
- packages/engine/src/triage.ts
- packages/engine/src/executor.ts
- packages/core/src/task-store/task-creation.ts
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md`:
- Line 1: Add an FNXC comment block at the beginning of each affected Markdown
file—docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md:1-1,
docs/plans/2026-07-19-001-u5e-executecore-lift-handoff.md:1-1,
docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md:1-1,
docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md:1-1,
docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md:1-1,
docs/plans/2026-07-19-005-u10-flip-residual-handoff.md:1-1, and
packages/cli/skill/fusion/SKILL.md:1-1. Use the established
FNXC:<Area-of-product> yyyy-MM-dd-hh:mm: format to document important
user-facing requirements, behavioral changes, and technical decisions; treat
FNXC_LOG as a heading concept from AGENTS.md, not as a literal token.
In `@packages/core/src/__tests__/legacy-adoption.test.ts`:
- Around line 261-268: Update the bug specification comment for the pagination
drain regression near the legacy adoption tests to include both required
headers, “## Symptom Verification” and “## Surface Enumeration,” while
preserving the existing PR `#2335` context and test behavior.
- Around line 59-66: Expand the file collection in the legacy-adoption census
test around the `files` array so it covers every relevant `.ts` file under core
and engine, preferably via a recursive directory scan; otherwise add all
documented writers such as `scheduler.ts`, `comments-ops.ts`, and dashboard
routes. Keep the existing status-write census assertions unchanged while
ensuring no task.status write literals are excluded.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 02e57e4d-0221-44be-b09c-e42a997bf528
📒 Files selected for processing (145)
.changeset/cutover-delete-fn-review-step.md.changeset/dashboard-custom-columns.md.changeset/fix-builtin-workflow-lifecycle.md.changeset/fix-no-merge-workflow-completion.md.changeset/fix-no-selection-default-workflow-drift.md.changeset/ir-driven-lifecycle-cutover.md.changeset/legacy-adoption-and-ir-pin.md.changeset/six-column-merge-boundary.mdAGENTS.mddocs/architecture.mddocs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.mddocs/plans/2026-07-19-001-u5e-executecore-lift-handoff.mddocs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.mddocs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.mddocs/plans/2026-07-19-004-u5g-flip-residual-handoff.mddocs/plans/2026-07-19-005-u10-flip-residual-handoff.mddocs/plans/2026-07-19-006-u10b-post-flip-handoff.mdpackages/cli/skill/fusion/SKILL.mdpackages/cli/skill/fusion/references/engine-tools.mdpackages/cli/skill/fusion/references/extension-tools.mdpackages/core/src/__tests__/custom-review-lane-merge-blocker.test.tspackages/core/src/__tests__/legacy-adoption.test.tspackages/core/src/__tests__/no-selection-default-workflow-move.test.tspackages/core/src/__tests__/postgres/schema-applier.test.tspackages/core/src/__tests__/review-level-preset.test.tspackages/core/src/__tests__/workflow-cutover.test.tspackages/core/src/__tests__/workflow-ir-validation.test.tspackages/core/src/__tests__/workflow-lifecycle-traits.test.tspackages/core/src/builtin-workflows.tspackages/core/src/index.gate.tspackages/core/src/index.tspackages/core/src/legacy-adoption.tspackages/core/src/postgres/index.tspackages/core/src/postgres/migrations/0000_initial.sqlpackages/core/src/postgres/migrations/0026_workflow_ir_pin_and_legacy_adoption.sqlpackages/core/src/postgres/postgres-health.tspackages/core/src/postgres/schema-applier.tspackages/core/src/postgres/schema/project.tspackages/core/src/review-level-preset.tspackages/core/src/store.tspackages/core/src/task-store/__tests__/transition-validator.test.tspackages/core/src/task-store/lifecycle-ops.tspackages/core/src/task-store/moves.tspackages/core/src/task-store/persistence.tspackages/core/src/task-store/remaining-ops-2.tspackages/core/src/task-store/remaining-ops-6.tspackages/core/src/task-store/serialization.tspackages/core/src/task-store/task-creation.tspackages/core/src/task-store/task-row-mappers.tspackages/core/src/task-store/task-update.tspackages/core/src/task-store/workflow-definitions.tspackages/core/src/types.tspackages/core/src/types/board.tspackages/core/src/types/workflow-steps.tspackages/core/src/workflow-capacity.tspackages/core/src/workflow-cutover.tspackages/core/src/workflow-ir-resolver.tspackages/core/src/workflow-ir.tspackages/core/src/workflow-lifecycle-traits.tspackages/core/src/workflow-step-results.tspackages/core/src/workflow-transition-policy.tspackages/dashboard/app/components/ListView.tsxpackages/dashboard/app/components/TaskCard.tsxpackages/dashboard/app/components/TaskForm.tsxpackages/dashboard/app/components/__tests__/TaskCard.test.tsxpackages/dashboard/app/hooks/useTasks.tspackages/dashboard/app/utils/__tests__/taskStatusBadgeLabel.test.tspackages/dashboard/app/utils/capture-screenshot.tspackages/dashboard/app/utils/taskProgress.tspackages/dashboard/app/utils/taskStatusBadgeLabel.tspackages/dashboard/src/__tests__/routes-trait-rekey.test.tspackages/dashboard/src/github-tracking-state.tspackages/dashboard/src/routes/register-task-workflow-routes.tspackages/engine/src/__tests__/benchmark-six-column-workflow.test.tspackages/engine/src/__tests__/builtin-workflows-lifecycle.test.tspackages/engine/src/__tests__/executor-column-agent-principal.test.tspackages/engine/src/__tests__/executor-contamination-base.test.tspackages/engine/src/__tests__/executor-ephemeral-disabled-dispatch-gate.test.tspackages/engine/src/__tests__/executor-fast-mode-workflows.test.tspackages/engine/src/__tests__/executor-graph-boundary.test.tspackages/engine/src/__tests__/executor-implicit-task-done-budget.test.tspackages/engine/src/__tests__/executor-model-marker.test.tspackages/engine/src/__tests__/executor-outer-dispatch-dependency-gate.test.tspackages/engine/src/__tests__/executor-plan-only-scope-leak.test.tspackages/engine/src/__tests__/executor-preheld-legacy-handoff.test.tspackages/engine/src/__tests__/executor-prompt.test.tspackages/engine/src/__tests__/executor-review-step-indexing.test.tspackages/engine/src/__tests__/executor-review-verdicts.test.tspackages/engine/src/__tests__/executor-step-numbering-zero-based.test.tspackages/engine/src/__tests__/executor-step-session.test.tspackages/engine/src/__tests__/executor-stuck-requeue-preserve-progress.test.tspackages/engine/src/__tests__/executor-task-done-blocked.test.tspackages/engine/src/__tests__/executor-task-done-case-insensitive-branch.test.tspackages/engine/src/__tests__/executor-task-done-dissent-guard.test.tspackages/engine/src/__tests__/executor-task-done-invariant.test.tspackages/engine/src/__tests__/executor-task-done-revise-verdict-guard.test.tspackages/engine/src/__tests__/executor-task-done-summary.test.tspackages/engine/src/__tests__/executor-test-helpers.tspackages/engine/src/__tests__/executor-worktree.test.tspackages/engine/src/__tests__/fixtures/six-column-workflow-ir.tspackages/engine/src/__tests__/in-review-unmet-dependency-reconcile.test.tspackages/engine/src/__tests__/invariant-wrong-checkout-completion.test.tspackages/engine/src/__tests__/legacy-tombstones.test.tspackages/engine/src/__tests__/merger-trait-rekey.test.tspackages/engine/src/__tests__/no-merge-workflow-completion.test.tspackages/engine/src/__tests__/plan-review-lease.test.tspackages/engine/src/__tests__/plan-review-single-owner.test.tspackages/engine/src/__tests__/reliability-interactions/dual-observe-shadow-terminal-stage.test.tspackages/engine/src/__tests__/reliability-interactions/executing-task-lock.test.tspackages/engine/src/__tests__/reliability-interactions/executor-liveness-gate.test.tspackages/engine/src/__tests__/reliability-interactions/executor-no-task-done-vs-worktree-reclaim.test.tspackages/engine/src/__tests__/reliability-interactions/executor-pending-review-skip-retry.test.tspackages/engine/src/__tests__/reliability-interactions/soft-delete-end-to-end.test.tspackages/engine/src/__tests__/reliability-interactions/task-done-refusal-x-invariant.test.tspackages/engine/src/__tests__/reliability-interactions/workflow-interpreter-dual-observe.test.tspackages/engine/src/__tests__/restart.integration.test.tspackages/engine/src/__tests__/review-level-tombstone.test.tspackages/engine/src/__tests__/reviewer-workspace.test.tspackages/engine/src/__tests__/scheduler-trait-dispatch.test.tspackages/engine/src/__tests__/self-healing-trait-rekey.test.tspackages/engine/src/__tests__/task-pipeline-smoke.test.tspackages/engine/src/__tests__/triage-plan-review-replan-cap.test.tspackages/engine/src/__tests__/triage-plan-review-unavailable-retry.test.tspackages/engine/src/__tests__/triage-review-spec-external-integration.test.tspackages/engine/src/__tests__/triage.test.tspackages/engine/src/__tests__/workflow-authoritative-driver-async-selection.test.tspackages/engine/src/__tests__/workflow-graph-column-moves.test.tspackages/engine/src/__tests__/workflow-graph-optional-step-fix.test.tspackages/engine/src/auto-merge-finalization.tspackages/engine/src/executor.tspackages/engine/src/hold-release.tspackages/engine/src/index.tspackages/engine/src/merger.tspackages/engine/src/run-audit.tspackages/engine/src/runtimes/in-process-runtime.tspackages/engine/src/scheduler.tspackages/engine/src/self-healing.tspackages/engine/src/triage.tspackages/engine/src/workflow-authoritative-driver.tspackages/engine/src/workflow-column-boundary.tspackages/engine/src/workflow-graph-executor.tspackages/engine/src/workflow-graph-task-runner.tspackages/engine/src/workflow-node-handlers.tspackages/engine/src/workflow-parity-observer.tspackages/pi-claude-cli/index.ts
💤 Files with no reviewable changes (16)
- packages/engine/src/tests/reliability-interactions/dual-observe-shadow-terminal-stage.test.ts
- packages/cli/skill/fusion/references/engine-tools.md
- packages/engine/src/tests/executor-review-step-indexing.test.ts
- packages/engine/src/tests/reliability-interactions/workflow-interpreter-dual-observe.test.ts
- packages/engine/src/tests/triage-plan-review-replan-cap.test.ts
- packages/engine/src/index.ts
- packages/dashboard/app/utils/capture-screenshot.ts
- packages/engine/src/tests/triage-plan-review-unavailable-retry.test.ts
- packages/core/src/tests/workflow-cutover.test.ts
- packages/engine/src/tests/workflow-authoritative-driver-async-selection.test.ts
- packages/core/src/workflow-cutover.ts
- packages/engine/src/workflow-parity-observer.ts
- packages/engine/src/runtimes/in-process-runtime.ts
- packages/engine/src/tests/executor-preheld-legacy-handoff.test.ts
- packages/engine/src/workflow-authoritative-driver.ts
- packages/engine/src/tests/triage.test.ts
🚧 Files skipped from review as they are similar to previous changes (111)
- packages/engine/src/tests/executor-model-marker.test.ts
- packages/core/src/postgres/index.ts
- .changeset/fix-builtin-workflow-lifecycle.md
- .changeset/fix-no-selection-default-workflow-drift.md
- packages/core/src/tests/no-selection-default-workflow-move.test.ts
- packages/core/src/tests/review-level-preset.test.ts
- packages/engine/src/tests/reliability-interactions/soft-delete-end-to-end.test.ts
- packages/core/src/types/board.ts
- packages/core/src/postgres/migrations/0026_workflow_ir_pin_and_legacy_adoption.sql
- .changeset/six-column-merge-boundary.md
- packages/engine/src/tests/legacy-tombstones.test.ts
- packages/core/src/task-store/task-update.ts
- packages/core/src/task-store/task-row-mappers.ts
- packages/engine/src/tests/executor-implicit-task-done-budget.test.ts
- packages/core/src/store.ts
- packages/pi-claude-cli/index.ts
- .changeset/legacy-adoption-and-ir-pin.md
- packages/engine/src/tests/executor-task-done-dissent-guard.test.ts
- packages/cli/skill/fusion/references/extension-tools.md
- packages/engine/src/tests/executor-column-agent-principal.test.ts
- packages/dashboard/app/components/tests/TaskCard.test.tsx
- packages/core/src/postgres/migrations/0000_initial.sql
- packages/engine/src/tests/reliability-interactions/executing-task-lock.test.ts
- packages/core/src/task-store/remaining-ops-2.ts
- packages/engine/src/tests/executor-task-done-case-insensitive-branch.test.ts
- packages/dashboard/app/components/TaskCard.tsx
- packages/core/src/task-store/tests/transition-validator.test.ts
- packages/dashboard/app/utils/taskStatusBadgeLabel.ts
- packages/dashboard/app/utils/tests/taskStatusBadgeLabel.test.ts
- .changeset/ir-driven-lifecycle-cutover.md
- packages/core/src/tests/custom-review-lane-merge-blocker.test.ts
- packages/engine/src/tests/plan-review-single-owner.test.ts
- packages/dashboard/src/tests/routes-trait-rekey.test.ts
- packages/core/src/task-store/remaining-ops-6.ts
- packages/engine/src/tests/workflow-graph-optional-step-fix.test.ts
- packages/engine/src/tests/executor-task-done-revise-verdict-guard.test.ts
- packages/engine/src/tests/executor-contamination-base.test.ts
- packages/core/src/postgres/postgres-health.ts
- packages/engine/src/tests/reliability-interactions/executor-liveness-gate.test.ts
- packages/engine/src/tests/executor-task-done-blocked.test.ts
- packages/engine/src/run-audit.ts
- packages/engine/src/tests/executor-outer-dispatch-dependency-gate.test.ts
- packages/core/src/types.ts
- packages/engine/src/tests/task-pipeline-smoke.test.ts
- packages/core/src/tests/workflow-ir-validation.test.ts
- packages/core/src/types/workflow-steps.ts
- packages/core/src/workflow-capacity.ts
- packages/engine/src/tests/review-level-tombstone.test.ts
- packages/dashboard/app/utils/taskProgress.ts
- packages/engine/src/tests/executor-task-done-summary.test.ts
- packages/core/src/workflow-lifecycle-traits.ts
- packages/engine/src/tests/reliability-interactions/executor-no-task-done-vs-worktree-reclaim.test.ts
- packages/engine/src/tests/triage-review-spec-external-integration.test.ts
- packages/engine/src/tests/scheduler-trait-dispatch.test.ts
- packages/dashboard/app/hooks/useTasks.ts
- packages/core/src/postgres/schema/project.ts
- .changeset/cutover-delete-fn-review-step.md
- packages/engine/src/workflow-column-boundary.ts
- packages/engine/src/workflow-graph-task-runner.ts
- packages/dashboard/app/components/ListView.tsx
- packages/engine/src/workflow-node-handlers.ts
- packages/engine/src/tests/reliability-interactions/task-done-refusal-x-invariant.test.ts
- packages/engine/src/tests/executor-task-done-invariant.test.ts
- .changeset/dashboard-custom-columns.md
- packages/engine/src/tests/executor-graph-boundary.test.ts
- packages/engine/src/tests/invariant-wrong-checkout-completion.test.ts
- AGENTS.md
- packages/core/src/review-level-preset.ts
- packages/engine/src/tests/fixtures/six-column-workflow-ir.ts
- packages/engine/src/auto-merge-finalization.ts
- packages/core/src/workflow-transition-policy.ts
- packages/core/src/tests/workflow-lifecycle-traits.test.ts
- packages/engine/src/hold-release.ts
- packages/engine/src/tests/benchmark-six-column-workflow.test.ts
- packages/core/src/task-store/lifecycle-ops.ts
- packages/engine/src/tests/self-healing-trait-rekey.test.ts
- packages/engine/src/scheduler.ts
- packages/core/src/task-store/persistence.ts
- packages/core/src/builtin-workflows.ts
- packages/core/src/workflow-ir-resolver.ts
- packages/engine/src/tests/reliability-interactions/executor-pending-review-skip-retry.test.ts
- packages/engine/src/tests/merger-trait-rekey.test.ts
- packages/core/src/tests/postgres/schema-applier.test.ts
- packages/core/src/task-store/moves.ts
- packages/engine/src/tests/plan-review-lease.test.ts
- packages/core/src/workflow-ir.ts
- packages/core/src/index.gate.ts
- packages/dashboard/src/github-tracking-state.ts
- packages/core/src/postgres/schema-applier.ts
- packages/core/src/index.ts
- packages/engine/src/tests/executor-ephemeral-disabled-dispatch-gate.test.ts
- packages/engine/src/tests/executor-test-helpers.ts
- packages/core/src/workflow-step-results.ts
- packages/engine/src/tests/workflow-graph-column-moves.test.ts
- docs/architecture.md
- packages/engine/src/tests/executor-worktree.test.ts
- packages/engine/src/self-healing.ts
- packages/engine/src/tests/reviewer-workspace.test.ts
- packages/engine/src/tests/restart.integration.test.ts
- packages/engine/src/tests/executor-fast-mode-workflows.test.ts
- packages/engine/src/tests/executor-stuck-requeue-preserve-progress.test.ts
- packages/engine/src/tests/executor-step-session.test.ts
- packages/core/src/legacy-adoption.ts
- packages/engine/src/tests/executor-prompt.test.ts
- packages/engine/src/workflow-graph-executor.ts
- packages/engine/src/tests/executor-review-verdicts.test.ts
- packages/engine/src/tests/builtin-workflows-lifecycle.test.ts
- packages/dashboard/src/routes/register-task-workflow-routes.ts
- packages/engine/src/triage.ts
- packages/engine/src/executor.ts
- packages/core/src/task-store/task-creation.ts
🛑 Comments failed to post (3)
docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md (1)
1-1: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add missing
FNXC:comments to Markdown files.As per coding guidelines, all
**/*.mdfiles must includeFNXC:Area-of-product yyyy-MM-dd-hh:mm:comments describing important user-facing requirements, behavioral changes, and technical decisions. These files are missing the required annotations. Based on learnings, treatFNXC_LOGas a heading described in AGENTS.md and use the establishedFNXC:<Area-of-product> yyyy-MM-dd-hh:mm:format instead of a literalFNXC_LOGtoken.
docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md#L1-L1: Add theFNXC:comment block.docs/plans/2026-07-19-001-u5e-executecore-lift-handoff.md#L1-L1: Add theFNXC:comment block.docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md#L1-L1: Add theFNXC:comment block.docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md#L1-L1: Add theFNXC:comment block.docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md#L1-L1: Add theFNXC:comment block.docs/plans/2026-07-19-005-u10-flip-residual-handoff.md#L1-L1: Add theFNXC:comment block.packages/cli/skill/fusion/SKILL.md#L1-L1: Add theFNXC:comment block.📍 Affects 7 files
docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md#L1-L1(this comment)docs/plans/2026-07-19-001-u5e-executecore-lift-handoff.md#L1-L1docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md#L1-L1docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md#L1-L1docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md#L1-L1docs/plans/2026-07-19-005-u10-flip-residual-handoff.md#L1-L1packages/cli/skill/fusion/SKILL.md#L1-L1🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md` at line 1, Add an FNXC comment block at the beginning of each affected Markdown file—docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md:1-1, docs/plans/2026-07-19-001-u5e-executecore-lift-handoff.md:1-1, docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md:1-1, docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md:1-1, docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md:1-1, docs/plans/2026-07-19-005-u10-flip-residual-handoff.md:1-1, and packages/cli/skill/fusion/SKILL.md:1-1. Use the established FNXC:<Area-of-product> yyyy-MM-dd-hh:mm: format to document important user-facing requirements, behavioral changes, and technical decisions; treat FNXC_LOG as a heading concept from AGENTS.md, not as a literal token.Sources: Coding guidelines, Learnings
packages/core/src/__tests__/legacy-adoption.test.ts (2)
59-66: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Include all relevant files in the status write census.
The census test claims to ensure that "every task.status write literal in core + engine has an adoption row," but it hardcodes a limited subset of files. It completely misses files like
scheduler.ts,comments-ops.ts, and dashboard routes, which are explicitly documented indocs/plans/2026-07-19-004-u5g-flip-residual-handoff.mdas containing active legacy status writes (e.g.,needs-replan).To ensure the completeness check is valid and blind spots do not lead to frozen rows during adoption, you should either dynamically scan all
.tsfiles recursively or add the known missing files.🛠 Proposed fix using array append (or consider a recursive directory scan)
const files = [ join(coreSrc, "task-store", "moves.ts"), join(coreSrc, "task-store", "task-creation.ts"), + join(coreSrc, "task-store", "comments-ops.ts"), join(engineSrc, "executor.ts"), join(engineSrc, "triage.ts"), join(engineSrc, "self-healing.ts"), join(engineSrc, "merger.ts"), + join(engineSrc, "scheduler.ts"), ].map((f) => readFileSync(f, "utf-8"));📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.const files = [ join(coreSrc, "task-store", "moves.ts"), join(coreSrc, "task-store", "task-creation.ts"), join(coreSrc, "task-store", "comments-ops.ts"), join(engineSrc, "executor.ts"), join(engineSrc, "triage.ts"), join(engineSrc, "self-healing.ts"), join(engineSrc, "merger.ts"), join(engineSrc, "scheduler.ts"), ].map((f) => readFileSync(f, "utf-8"));🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/__tests__/legacy-adoption.test.ts` around lines 59 - 66, Expand the file collection in the legacy-adoption census test around the `files` array so it covers every relevant `.ts` file under core and engine, preferably via a recursive directory scan; otherwise add all documented writers such as `scheduler.ts`, `comments-ops.ts`, and dashboard routes. Keep the existing status-write census assertions unchanged while ensuring no task.status write literals are excluded.
261-268: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Include missing bug spec headers.
As per coding guidelines, bug regression tests must contain
## Symptom Verificationand## Surface Enumerationin their specifications. This test covers the PR#2335review feedback regarding the pagination drain bug but is missing these headers.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@packages/core/src/__tests__/legacy-adoption.test.ts` around lines 261 - 268, Update the bug specification comment for the pagination drain regression near the legacy adoption tests to include both required headers, “## Symptom Verification” and “## Surface Enumeration,” while preserving the existing PR `#2335` context and test behavior.Source: Coding guidelines
Greptile SummaryThis is the third and final part of the IR-driven lifecycle cutover, making the workflow IR the single source of truth for task column placement, review gates, and operator lifecycle actions. The dashboard side of the cutover opens column ids (custom workflow columns now render and move correctly), re-keys every hardcoded column target in operator routes to trait-based resolution, adds trait-aware GitHub issue state decisions, and introduces a 6-column benchmark fixture with editor-buildability proof.
Confidence Score: 3/5The operator-route re-keying and badge logic are solid, but two gaps from the prior review remain: handleMerged overwrites the server-authoritative column with 'done' on every task:merged SSE event, and handleTaskMoved omits the classify argument so custom terminal columns never trigger GitHub issue closure. The route-level and badge-level changes are well-tested and carry the right fallback behavior. Two still-open gaps are in live code paths: a card on a custom workflow flash-renders in the wrong column on every merge event, and GitHub issue state silently fails to update for any custom terminal column. Both were flagged in the previous review round and neither was addressed in this commit. packages/dashboard/app/hooks/useTasks.ts (handleMerged column override) and packages/dashboard/src/github-tracking-state.ts (handleTaskMoved missing classify arg) need attention before custom-workflow GitHub tracking and merge-completion column rendering are correct end-to-end. Important Files Changed
Reviews (7): Last reviewed commit: "Address PR review feedback (#2335)" | Re-trigger Greptile |
|
CI note: 🤖 Generated with Claude Code |
…on deleted Graph-driven column moves, single-mover scheduler/hold-release, trait re-keyed self-healing + merger, graph-exclusive Plan Review, executeCore body-lift with zero legacy re-entry, fn_review_step + interceptor machinery deleted with tombstone ratchet, builtin workflow runtime fixes (hold handler, column inheritance, no-merge completion mover), 6-column benchmark acceptance suite, harness modernization. Also retires core's interpreter-cutover parity scaffolding (workflow-cutover.ts), whose last consumer — the authoritative driver — dies here. Stack: 2/3 (base cutover/stack-1-core); dashboard + changesets top out in #2335. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
309b6e6 to
04dd02e
Compare
- badge guard widened to the full active-merge-pipeline status set (regression case added) - spec-revision canTransition dead branch simplified; custom-column intent made explicit - FNXC timestamp typos corrected (2b:55 -> 02:55, 2b:40 -> 02:40) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
76ef0f6 to
7030b9d
Compare
|
Re: CodeRabbit re-review bodies — addressed in 7030b9d (top) / 612bc71 (stack-1):
Fixed:
Fixed on the stack-1 layer (#2341, where the census lives): recursive scan of core+engine+dashboard src with precision-hardened patterns and a vacuity floor. scheduler.ts, comments-ops.ts, and dashboard routes are all covered; every scanned status literal has an adoption row.
Not addressing: the FNXC comment rule (AGENTS.md → 'FNXC_LOG comments') governs code comments — jsdocs and inline annotations that encode requirements next to the code they justify. Plan and handoff documents under docs/plans/ are process artifacts, not product code; they carry their provenance in-body and in frontmatter. Applying code-comment format rules to markdown docs would be noise, not signal.
Not addressing: 🤖 Generated with Claude Code |
- badge guard widened to the full active-merge-pipeline status set (regression case added) - spec-revision canTransition dead branch simplified; custom-column intent made explicit - FNXC timestamp typos corrected (2b:55 -> 02:55, 2b:40 -> 02:40) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
7030b9d to
32f2508
Compare
- badge guard widened to the full active-merge-pipeline status set (regression case added) - spec-revision canTransition dead branch simplified; custom-column intent made explicit - FNXC timestamp typos corrected (2b:55 -> 02:55, 2b:40 -> 02:40) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
32f2508 to
acfbd48
Compare
Transition policy + shared validator, IR validation hardening, CAS review leases, capacity budgets, lifecycle traits, IR pin/drift, review-level preset, legacy adoption + migration 0026, builtin workflow fixes (core side), and the cutover plan + handoff docs. Stack: 1/3 (base main); engine cutover is 2/3; dashboard + changesets top out in #2335. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…on deleted Graph-driven column moves, single-mover scheduler/hold-release, trait re-keyed self-healing + merger, graph-exclusive Plan Review, executeCore body-lift with zero legacy re-entry, fn_review_step + interceptor machinery deleted with tombstone ratchet, builtin workflow runtime fixes (hold handler, column inheritance, no-merge completion mover), 6-column benchmark acceptance suite, harness modernization. Also retires core's interpreter-cutover parity scaffolding (workflow-cutover.ts), whose last consumer — the authoritative driver — dies here. Stack: 2/3 (base cutover/stack-1-core); dashboard + changesets top out in #2335. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
01184e2 to
bc9ff20
Compare
- badge guard widened to the full active-merge-pipeline status set (regression case added) - spec-revision canTransition dead branch simplified; custom-column intent made explicit - FNXC timestamp typos corrected (2b:55 -> 02:55, 2b:40 -> 02:40) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
acfbd48 to
0f41c6e
Compare
…on deleted Graph-driven column moves, single-mover scheduler/hold-release, trait re-keyed self-healing + merger, graph-exclusive Plan Review, executeCore body-lift with zero legacy re-entry, fn_review_step + interceptor machinery deleted with tombstone ratchet, builtin workflow runtime fixes (hold handler, column inheritance, no-merge completion mover), 6-column benchmark acceptance suite, harness modernization. Also retires core's interpreter-cutover parity scaffolding (workflow-cutover.ts), whose last consumer — the authoritative driver — dies here. Stack: 2/3 (base cutover/stack-1-core); dashboard + changesets top out in #2335. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bc9ff20 to
6a1056c
Compare
- badge guard widened to the full active-merge-pipeline status set (regression case added) - spec-revision canTransition dead branch simplified; custom-column intent made explicit - FNXC timestamp typos corrected (2b:55 -> 02:55, 2b:40 -> 02:40) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0f41c6e to
2e5cc97
Compare
…on deleted Graph-driven column moves, single-mover scheduler/hold-release, trait re-keyed self-healing + merger, graph-exclusive Plan Review, executeCore body-lift with zero legacy re-entry, fn_review_step + interceptor machinery deleted with tombstone ratchet, builtin workflow runtime fixes (hold handler, column inheritance, no-merge completion mover), 6-column benchmark acceptance suite, harness modernization. Also retires core's interpreter-cutover parity scaffolding (workflow-cutover.ts), whose last consumer — the authoritative driver — dies here. Stack: 2/3 (base cutover/stack-1-core); dashboard + changesets top out in #2335. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
6a1056c to
dff2fa5
Compare
- badge guard widened to the full active-merge-pipeline status set (regression case added) - spec-revision canTransition dead branch simplified; custom-column intent made explicit - FNXC timestamp typos corrected (2b:55 -> 02:55, 2b:40 -> 02:40) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2e5cc97 to
cc17734
Compare
Part **1 of 3** of the IR-driven lifecycle cutover (split from #2335 to fit review-tool file limits; plan: docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md, included here). **Scope (48 files, packages/core + docs/plans):** shared transition policy + validator (KTD-5), IR validation hardening incl. the benchmark capability floor, CAS review leases (KTD-4), pooled WIP capacity budgets (KTD-9), lifecycle-trait helpers, durable IR pin/drift detection (KTD-3), review-level creation-time preset, legacy adoption module + census + migration 0026 + stale-binary guard (KTD-8), core-side builtin workflow fixes (single default-IR authority, no-merge complete-column support). Note: `workflow-cutover.ts` (interpreter parity scaffolding) stays alive in this PR — its last consumer dies in part 2/3, which retires it. **Merge order:** this PR → #TBD-2 (engine) → #2335 (dashboard/top). 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added workflow-trait-driven task lifecycle transitions, including WIP capacity pooling and workflow-aware recovery (IR pinning + drift detection). * Added legacy adoption/backfill for pre-cutover task states, with unmappable rows safely parked. * Added create-time `reviewLevel` presets to automatically configure enabled workflow steps. * **Bug Fixes** * Fixed workflow moves when no workflow selection exists. * Improved merge-blocker validation to be keyed to the workflow’s actual review-lane identity, preventing invalid moves and misclassified terminal states. * **Tests** * Added end-to-end and unit/integration coverage for workflow validation, legacy adoption, migrations/schema guards, leases, review presets, and transition rules. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…on deleted Graph-driven column moves, single-mover scheduler/hold-release, trait re-keyed self-healing + merger, graph-exclusive Plan Review, executeCore body-lift with zero legacy re-entry, fn_review_step + interceptor machinery deleted with tombstone ratchet, builtin workflow runtime fixes (hold handler, column inheritance, no-merge completion mover), 6-column benchmark acceptance suite, harness modernization. Also retires core's interpreter-cutover parity scaffolding (workflow-cutover.ts), whose last consumer — the authoritative driver — dies here. Stack: 2/3 (base cutover/stack-1-core); dashboard + changesets top out in #2335. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- wire the KTD-3 IR pin seam for real: createStoreIrPinPersistence binds change-only pin writes on node entry + pin reads at run start; drift (deleted node/column, hash mismatch) now parks with task:reconcile-workflow-drift in production; pre-U9b stores degrade to the prior inert posture (5 new tests) - move resolveMergerLifecycleColumn below merger.ts imports Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
detectDrift now clears the stale workflowIrPin* fields at park time (clearPin on createStoreIrPinPersistence, fail-soft), so a requeued run re-resolves the CURRENT IR and proceeds — adopting the edited workflow is the desired outcome. And handleGraphFailure recognizes WORKFLOW_DRIFT_PARK_CONTEXT_KEY: accurate drift-park reason instead of failedNode:'unknown', progress preserved, no double audit. Regression tests assert the loop invariant (exactly one drift audit across a full park->requeue->resume cycle). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
f1537ad to
c43e493
Compare
Operator surfaces render and act on any workflow's columns: IR-validated move API, trait-derived retry/reset/spec-revise targets, workflow-resolved ingest (no coercion to triage), step-name badges, GitHub state mapping on complete/archived traits, merging-fix badge invariant in the shared helper, routes-trait-rekey suite incl. R11 editor buildability. Plus all cutover changesets and removal of the dead capture-screenshot.ts (main-inherited FN-8309 break; restore pointer 88b0db0). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- badge guard widened to the full active-merge-pipeline status set (regression case added) - spec-revision canTransition dead branch simplified; custom-column intent made explicit - FNXC timestamp typos corrected (2b:55 -> 02:55, 2b:40 -> 02:40) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cc17734 to
e327bd4
Compare
…on deleted (#2342) Part **2 of 3** of the IR-driven lifecycle cutover (stacked on #2341; top is #2335). **Scope (80 files, packages/engine + cli/pi skill docs + AGENTS/architecture):** graph-driven column moves via the column-boundary controller (R1), single-mover scheduler/hold-release trait cutover (KTD-2/KTD-9), trait re-keyed self-healing + merger with the R7b confirmed-merge-must-finalize guarantee, graph-exclusive Plan Review with leased dedup (R4/R5), the executeCore body-lift — zero legacy re-entry — with fn_review_step + interceptor machinery deleted and tombstone-ratcheted (R9), builtin workflow runtime fixes (missing hold handler, unseamed-node column inheritance, no-merge completion mover), the 6-column benchmark acceptance suite (11 tests) + 12-builtin lifecycle sweep (94 assertions), and the executor test-harness modernization. Also retires core's interpreter-cutover scaffolding whose last consumer (the authoritative driver) dies here. **Merge order:** #2341 → this → #2335. After #2341 merges, retarget this to main. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Completes the IR-driven lifecycle cutover: the workflow IR becomes the single source of truth for task lifecycle. Node column assignments move cards at runtime, every lifecycle predicate re-keys on column traits instead of literal column ids, and the graph exclusively owns review gates.
Plan (the spec for this work):
docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.mdWhat changed
IR as runtime authority (R1, R2). Graph traversal crossing a node column boundary moves the card through the store's trait-hook
moveTaskpath, attributedworkflowMoveSource: "workflow-graph"and emittingtask:column-transition. This replaces the executor's hardcodedmoveTask(id, "in-review")merge boundary and its handoff-invariant allowlist. Scheduler, hold/release, self-healing, merger and finalization now key on column traits (intake/hold/wip/merge-blocker/human-review/merge/complete/archived/timing/abort-on-exit/reset-on-entry/stall-detection), with rebound targets resolved per KTD-10.Single ownership of review gates (R4, R5). Triage's out-of-graph Plan Review gate is deleted; the graph is the sole author.
pendingstep results are CAS-claimed leases with owner and staleness floor (KTD-4), so a crash/restart re-entry can no longer dispatch a second reviewer and silently discard the losing verdict.Graph ownership is unconditional (R9). The legacy execute fallback is gone:
maybeExecuteWorkflowGraphis nowexecuteWorkflowGraphreturningvoid,graphCompletionis a required parameter, and a store that cannot resolve a workflow fails closed rather than silently running nothing. Also deleted, with a tombstone ratchet:fn_review_stepand its RETHINK/session-rewind machinery,workflow-cutover.ts,workflow-authoritative-driver.ts,workflow-parity-observer.ts, and thegraphCompletionInterceptorsmap.reviewLevelbecomes a creation-time preset (R6) writingenabledWorkflowSteps, with zero runtime reads.Upgrade path (R10). Migration 0026 adds the durable per-node-entry IR pin (KTD-3) and the one-time adoption stamp (KTD-8);
planLegacyAdoptionis the single shared decision run by both the startup sweep and the store-open reconcile, so pre-cutover rows are adopted instead of freezing. A stale-binary guard refuses to open a database migrated by a newer binary.Operator surfaces (R2, R11). Four places still closed the column set: the dashboard coerced every ingested task's column through the legacy six-id enum (a card in a custom
Mergingcolumn rendered in Triage),POST /tasks/:id/moveanswered 400 for any workflow-defined column, retry/reset/re-engage/unassign/spec-revise used hardcoded move targets, and GitHub issue open/closed mapping literal-compareddone/archived. All now resolve from the task's workflow by trait, each with a legacy fallback sobuiltin:codingis byte-identical.Evidence
builtin:codingkeeps its column ids and observable behavior byte-compatible (R8, KTD-7), pinned by a characterization oracle. A new 6-column benchmark acceptance suite drives a user-authored workflow —Ideas → Todo → In-progress → In-review → Merging → Done— asserting the ordered transition trail, single-mover at the hold→wip seam (KTD-2), column-role purity (R12), bounded review cycles from workflow config, and park-in-place on failure (R3). The same fixture is proven editor-buildable through the real save-validation path, plus negative cases.Verified locally on this branch, post-rebase:
pnpm test:gate— green (engine-core 294/294, pg-gate 126/126, ci-workflow 63/63)tsc --noEmitclean for@fusion/core,@fusion/engine,@fusion/dashboard(bothtsconfig.jsonandtsconfig.app.json)Known reds
executor-task-done-invariant→ "moves a cleanly completed task to in-review via the merge-node boundary" — red on this branch. A real-Postgres test whose graph re-entry rebounds the card toin-progressafterexecute()returns. Not in the merge gate, so it does not gate CI. Honest status: I could not verify it green on pristinemain— running main's tests in this worktree reuses built artifacts and produced obviously polluted results, so I am not claiming "pre-existing". It needs its own look.html2canvas/ FN-8309 — fixed here by deleting dead code.packages/dashboard/app/utils/capture-screenshot.tsimportedhtml2canvas, which is not a dependency of@fusion/dashboardand is not inpnpm-lock.yamlat all, so it had never compiled in CI. The file had zero importers. Main never caught it because PR Checks runs only on pull requests (main's last PR Checks run was in June) while main's own pushes run just the non-blocking Full Suite — so the required Typecheck check was failing on every PR against main, including this one. Inherited from88b0db0f4(FN-8309). To restore when the feature lands its dependency properly:git checkout 88b0db0f4 -- packages/dashboard/app/utils/capture-screenshot.tsand addhtml2canvastopackages/dashboard/package.jsonin the same change.Two entries that were on the provisional ledger turned out not to be pre-existing and are fixed in this PR: the
workflow-graph-optional-step-fixreplan-cap pair were stale assertions against U3's own contract change (cap-exhausted now parks awaiting-approval and reports handled, rather than silently leaving the task in place), andexecutor-column-agent-seams/executor-fast-mode-workflowsare green.Deferred follow-ups
onNodeEntryreturnsvoidand the node executes anyway, so within one walk the card can run In-progress work while still displayed in Todo. The benchmark models the scheduler explicitly for this reason and says so at the seam. Making the graph actually suspend is U4-scope follow-up.needs-replanreader migration. Post-U3 the durable write happens at the graph's ownplan-replanseam, so the workflow is the writer and the 14 readers form one coherent graph-owned loop — it is the graph's durable replan signal wearing a legacy name, not un-migrated legacy. The adoption census guard requiring that literal inexecutor.tsis correct and stays. Migrating those readers to a purpose-built run-state signal is a post-cutover naming change with its own risk budget.merging/merging-pr/merging-fix) are adopted asresume-graphrather than mapped to an exact re-entry node; naming a precise node would require resolving the task's IR, which the adoption module deliberately cannot do.🤖 Generated with Claude Code
Summary by CodeRabbit
New Features
Bug Fixes