Skip to content

refactor(cutover 3/3): dashboard + changesets — IR-driven lifecycle cutover#2335

Merged
gsxdsm merged 5 commits into
mainfrom
feature/ir-lifecycle-cutover
Jul 19, 2026
Merged

refactor(cutover 3/3): dashboard + changesets — IR-driven lifecycle cutover#2335
gsxdsm merged 5 commits into
mainfrom
feature/ir-lifecycle-cutover

Conversation

@gsxdsm

@gsxdsm gsxdsm commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator

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.md

What changed

IR as runtime authority (R1, R2). Graph traversal crossing a node column boundary moves the card through the store's trait-hook moveTask path, attributed workflowMoveSource: "workflow-graph" and emitting task:column-transition. This replaces the executor's hardcoded moveTask(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. pending step 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: maybeExecuteWorkflowGraph is now executeWorkflowGraph returning void, graphCompletion is 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_step and its RETHINK/session-rewind machinery, workflow-cutover.ts, workflow-authoritative-driver.ts, workflow-parity-observer.ts, and the graphCompletionInterceptors map.

reviewLevel becomes a creation-time preset (R6) writing enabledWorkflowSteps, 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); planLegacyAdoption is 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 Merging column rendered in Triage), POST /tasks/:id/move answered 400 for any workflow-defined column, retry/reset/re-engage/unassign/spec-revise used hardcoded move targets, and GitHub issue open/closed mapping literal-compared done/archived. All now resolve from the task's workflow by trait, each with a legacy fallback so builtin:coding is byte-identical.

Evidence

builtin:coding keeps 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)
  • characterization oracle 59/59, tombstones 5/5, 6-column benchmark 11/11
  • tsc --noEmit clean for @fusion/core, @fusion/engine, @fusion/dashboard (both tsconfig.json and tsconfig.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 to in-progress after execute() returns. Not in the merge gate, so it does not gate CI. Honest status: I could not verify it green on pristine main — 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.ts imported html2canvas, which is not a dependency of @fusion/dashboard and is not in pnpm-lock.yaml at 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 from 88b0db0f4 (FN-8309). To restore when the feature lands its dependency properly: git checkout 88b0db0f4 -- packages/dashboard/app/utils/capture-screenshot.ts and add html2canvas to packages/dashboard/package.json in the same change.
  • pg-gate rotating contention — historically a different file set each run with zero assertion failures. It passed 126/126 on the final run here.

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-fix replan-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), and executor-column-agent-seams / executor-fast-mode-workflows are green.

Deferred follow-ups

  • Graph does not suspend at the ready-for-release seam. A parked onNodeEntry returns void and 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-replan reader migration. Post-U3 the durable write happens at the graph's own plan-replan seam, 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 in executor.ts is correct and stays. Migrating those readers to a purpose-built run-state signal is a post-cutover naming change with its own risk budget.
  • U9b seam-node refinement. The merge substates (merging/merging-pr/merging-fix) are adopted as resume-graph rather 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

    • Workflows now drive task lifecycle columns, transitions, capacity limits, review gates, and completion behavior—including custom workflows.
    • Tasks created with review levels automatically receive the corresponding workflow review steps.
    • Legacy in-progress tasks are automatically recovered during upgrades.
    • Dashboard status badges now show the active workflow step name.
    • Added safeguards for workflow changes, review ownership, database compatibility, and workflow validation.
  • Bug Fixes

    • Fixed custom-column rendering and task movement.
    • Improved merge-boundary handling and completion for workflows without merge steps.
    • Prevented cards from stalling, moving backward, or exceeding pooled WIP capacity.

@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The 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.

Changes

IR-driven lifecycle cutover

Layer / File(s) Summary
Core lifecycle contracts and persistence
packages/core/src/*
Adds workflow trait policies, transition invariants, review leases, IR pinning, legacy adoption, review-level presets, schema migration 0026, and stale-binary protection.
Graph execution and lifecycle boundary
packages/engine/src/executor.ts, packages/engine/src/workflow-*.ts, packages/engine/src/hold-release.ts, packages/engine/src/scheduler.ts, packages/engine/src/merger.ts
Makes graph execution and column transitions authoritative, removes fn_review_step and legacy fallback machinery, adds lease-based Plan Review ownership, trait-derived moves, drift parking, and no-merge completion.
Custom workflow dashboard surfaces
packages/dashboard/app/*, packages/dashboard/src/*
Preserves custom column ids, derives operator moves and GitHub lifecycle actions from workflow traits, and displays running workflow step names in status badges.
Validation and migration coverage
packages/core/src/__tests__/*, packages/engine/src/__tests__/*, packages/dashboard/src/__tests__/*
Adds adoption, lease, transition, schema, benchmark, lifecycle, tombstone, and custom-column regression coverage while updating graph-owned execution tests.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 53.19% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: an IR-driven lifecycle cutover, and it is concise and specific.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/ir-lifecycle-cutover

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

isInvalidDoneTransitionError still hardcodes 'done', breaking the race-recovery path for custom-complete columns.

moveTask now targets the resolved completeColumn, but isInvalidDoneTransitionError (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's shipped), a transition-race error will fail this check, skip the isCompleteColumn(refreshed.column) recovery branch, and rethrow instead of gracefully returning { outcome: "already-done", ... }. builtin:coding is 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 win

Duplicated pooled-capacity counting loop across async/sync paths.

The resolveWipBudgetColumns + sum-occupants + evaluateCapacityRejection sequence 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 a countActiveInCapacitySlot callback) 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 value

Bounded sweep may leave >500 pre-cutover rows unadopted.

Adoption runs only at startup and caps at limit: 500 with 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 win

Extract 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 ownership mockedCreateFnAgent now fires once per graph session (e.g. Plan Review, then implementation), so a bare find(...) assignment on a session without the tool would clobber the already-captured reference with undefined. A shared helper in executor-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 inline tool = customTools.find(...) ?? tool with the shared helper call.
  • packages/engine/src/__tests__/invariant-wrong-checkout-completion.test.ts#L46-L46: replace the inline tool = customTools.find(...) ?? tool with the shared helper call.
  • packages/engine/src/__tests__/executor-task-done-blocked.test.ts#L65-L65: replace the inline tool = customTools.find(...) ?? tool with the shared helper call.
  • packages/engine/src/__tests__/executor-task-done-dissent-guard.test.ts#L37-L37: replace the inline doneTool = customTools.find(...) ?? doneTool with the shared helper call.
  • packages/engine/src/__tests__/executor-task-done-summary.test.ts#L50-L50: replace the inline capturedTool = customTools?.find(...) ?? capturedTool with 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

📥 Commits

Reviewing files that changed from the base of the PR and between ecffdbb and 255b406.

📒 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.md
  • AGENTS.md
  • docs/architecture.md
  • docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md
  • docs/plans/2026-07-19-001-u5e-executecore-lift-handoff.md
  • docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md
  • docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md
  • docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md
  • docs/plans/2026-07-19-005-u10-flip-residual-handoff.md
  • docs/plans/2026-07-19-006-u10b-post-flip-handoff.md
  • packages/cli/skill/fusion/SKILL.md
  • packages/cli/skill/fusion/references/engine-tools.md
  • packages/cli/skill/fusion/references/extension-tools.md
  • packages/core/src/__tests__/legacy-adoption.test.ts
  • packages/core/src/__tests__/postgres/schema-applier.test.ts
  • packages/core/src/__tests__/review-level-preset.test.ts
  • packages/core/src/__tests__/workflow-cutover.test.ts
  • packages/core/src/__tests__/workflow-ir-validation.test.ts
  • packages/core/src/__tests__/workflow-lifecycle-traits.test.ts
  • packages/core/src/index.gate.ts
  • packages/core/src/index.ts
  • packages/core/src/legacy-adoption.ts
  • packages/core/src/postgres/index.ts
  • packages/core/src/postgres/migrations/0000_initial.sql
  • packages/core/src/postgres/migrations/0026_workflow_ir_pin_and_legacy_adoption.sql
  • packages/core/src/postgres/postgres-health.ts
  • packages/core/src/postgres/schema-applier.ts
  • packages/core/src/postgres/schema/project.ts
  • packages/core/src/review-level-preset.ts
  • packages/core/src/store.ts
  • packages/core/src/task-store/__tests__/transition-validator.test.ts
  • packages/core/src/task-store/lifecycle-ops.ts
  • packages/core/src/task-store/moves.ts
  • packages/core/src/task-store/persistence.ts
  • packages/core/src/task-store/remaining-ops-2.ts
  • packages/core/src/task-store/remaining-ops-6.ts
  • packages/core/src/task-store/serialization.ts
  • packages/core/src/task-store/task-creation.ts
  • packages/core/src/task-store/task-row-mappers.ts
  • packages/core/src/task-store/task-update.ts
  • packages/core/src/types.ts
  • packages/core/src/types/board.ts
  • packages/core/src/types/workflow-steps.ts
  • packages/core/src/workflow-capacity.ts
  • packages/core/src/workflow-cutover.ts
  • packages/core/src/workflow-ir-resolver.ts
  • packages/core/src/workflow-ir.ts
  • packages/core/src/workflow-lifecycle-traits.ts
  • packages/core/src/workflow-step-results.ts
  • packages/core/src/workflow-transition-policy.ts
  • packages/dashboard/app/components/ListView.tsx
  • packages/dashboard/app/components/TaskCard.tsx
  • packages/dashboard/app/components/TaskForm.tsx
  • packages/dashboard/app/hooks/useTasks.ts
  • packages/dashboard/app/utils/taskProgress.ts
  • packages/dashboard/app/utils/taskStatusBadgeLabel.ts
  • packages/dashboard/src/__tests__/routes-trait-rekey.test.ts
  • packages/dashboard/src/github-tracking-state.ts
  • packages/dashboard/src/routes/register-task-workflow-routes.ts
  • packages/engine/src/__tests__/benchmark-six-column-workflow.test.ts
  • packages/engine/src/__tests__/executor-column-agent-principal.test.ts
  • packages/engine/src/__tests__/executor-contamination-base.test.ts
  • packages/engine/src/__tests__/executor-ephemeral-disabled-dispatch-gate.test.ts
  • packages/engine/src/__tests__/executor-fast-mode-workflows.test.ts
  • packages/engine/src/__tests__/executor-graph-boundary.test.ts
  • packages/engine/src/__tests__/executor-implicit-task-done-budget.test.ts
  • packages/engine/src/__tests__/executor-model-marker.test.ts
  • packages/engine/src/__tests__/executor-outer-dispatch-dependency-gate.test.ts
  • packages/engine/src/__tests__/executor-plan-only-scope-leak.test.ts
  • packages/engine/src/__tests__/executor-preheld-legacy-handoff.test.ts
  • packages/engine/src/__tests__/executor-prompt.test.ts
  • packages/engine/src/__tests__/executor-review-step-indexing.test.ts
  • packages/engine/src/__tests__/executor-review-verdicts.test.ts
  • packages/engine/src/__tests__/executor-step-numbering-zero-based.test.ts
  • packages/engine/src/__tests__/executor-step-session.test.ts
  • packages/engine/src/__tests__/executor-stuck-requeue-preserve-progress.test.ts
  • packages/engine/src/__tests__/executor-task-done-blocked.test.ts
  • packages/engine/src/__tests__/executor-task-done-case-insensitive-branch.test.ts
  • packages/engine/src/__tests__/executor-task-done-dissent-guard.test.ts
  • packages/engine/src/__tests__/executor-task-done-invariant.test.ts
  • packages/engine/src/__tests__/executor-task-done-revise-verdict-guard.test.ts
  • packages/engine/src/__tests__/executor-task-done-summary.test.ts
  • packages/engine/src/__tests__/executor-test-helpers.ts
  • packages/engine/src/__tests__/executor-worktree.test.ts
  • packages/engine/src/__tests__/fixtures/six-column-workflow-ir.ts
  • packages/engine/src/__tests__/in-review-unmet-dependency-reconcile.test.ts
  • packages/engine/src/__tests__/invariant-wrong-checkout-completion.test.ts
  • packages/engine/src/__tests__/legacy-tombstones.test.ts
  • packages/engine/src/__tests__/merger-trait-rekey.test.ts
  • packages/engine/src/__tests__/plan-review-lease.test.ts
  • packages/engine/src/__tests__/plan-review-single-owner.test.ts
  • packages/engine/src/__tests__/reliability-interactions/dual-observe-shadow-terminal-stage.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executing-task-lock.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executor-liveness-gate.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executor-no-task-done-vs-worktree-reclaim.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executor-pending-review-skip-retry.test.ts
  • packages/engine/src/__tests__/reliability-interactions/soft-delete-end-to-end.test.ts
  • packages/engine/src/__tests__/reliability-interactions/task-done-refusal-x-invariant.test.ts
  • packages/engine/src/__tests__/reliability-interactions/workflow-interpreter-dual-observe.test.ts
  • packages/engine/src/__tests__/restart.integration.test.ts
  • packages/engine/src/__tests__/review-level-tombstone.test.ts
  • packages/engine/src/__tests__/reviewer-workspace.test.ts
  • packages/engine/src/__tests__/scheduler-trait-dispatch.test.ts
  • packages/engine/src/__tests__/self-healing-trait-rekey.test.ts
  • packages/engine/src/__tests__/task-pipeline-smoke.test.ts
  • packages/engine/src/__tests__/triage-plan-review-replan-cap.test.ts
  • packages/engine/src/__tests__/triage-plan-review-unavailable-retry.test.ts
  • packages/engine/src/__tests__/triage-review-spec-external-integration.test.ts
  • packages/engine/src/__tests__/triage.test.ts
  • packages/engine/src/__tests__/workflow-authoritative-driver-async-selection.test.ts
  • packages/engine/src/__tests__/workflow-graph-column-moves.test.ts
  • packages/engine/src/__tests__/workflow-graph-optional-step-fix.test.ts
  • packages/engine/src/auto-merge-finalization.ts
  • packages/engine/src/executor.ts
  • packages/engine/src/hold-release.ts
  • packages/engine/src/index.ts
  • packages/engine/src/merger.ts
  • packages/engine/src/run-audit.ts
  • packages/engine/src/runtimes/in-process-runtime.ts
  • packages/engine/src/scheduler.ts
  • packages/engine/src/self-healing.ts
  • packages/engine/src/triage.ts
  • packages/engine/src/workflow-authoritative-driver.ts
  • packages/engine/src/workflow-column-boundary.ts
  • packages/engine/src/workflow-graph-executor.ts
  • packages/engine/src/workflow-graph-task-runner.ts
  • packages/engine/src/workflow-parity-observer.ts
  • packages/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

Comment thread docs/architecture.md
Comment thread packages/core/src/task-store/lifecycle-ops.ts
Comment thread packages/core/src/task-store/moves.ts
Comment thread packages/dashboard/app/components/ListView.tsx
Comment thread packages/dashboard/src/routes/register-task-workflow-routes.ts Outdated
Comment thread packages/dashboard/src/routes/register-task-workflow-routes.ts
Comment thread packages/engine/src/__tests__/scheduler-trait-dispatch.test.ts Outdated
Comment thread packages/engine/src/scheduler.ts
gsxdsm added a commit that referenced this pull request Jul 19, 2026
- 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>
@gsxdsm

gsxdsm commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator Author

Re: CodeRabbit review body (outside-diff + nitpicks) — addressed in 9691b70:

isInvalidDoneTransitionError still hardcodes 'done', breaking the race-recovery path for custom-complete columns.

Fixed: the classifier now accepts the resolved target column (isInvalidDoneTransitionError(error, targetColumn = "done")) and the finalization catch passes completeColumn. Default stays "done" so builtin:coding is unchanged. Regression test races a custom-workflow finalize into shipped and asserts the graceful already-done outcome.

Duplicated pooled-capacity counting loop across async/sync paths.

Fixed: extracted enforcePooledColumnCapacity parameterized by a count callback; the sync SQLite path still counts/judges/throws synchronously inside its transaction.

Bounded sweep may leave >500 pre-cutover rows unadopted.

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.

Extract the repeated "capture fn_task_done" guard into a shared helper.

Fixed: captureNamedTool(customTools, name, previous) in executor-test-helpers.ts, adopted by all five files.

Also noted while fixing (left for follow-up, not in this PR): with no workflow-selection row, prepareWorkflowMovePolicyPreflightImpl resolves the fallback via the catalog while resolveTaskWorkflowIrForMove uses the BUILTIN_CODING_WORKFLOW_IR constant — the divergence can throw 'workflow move policy preflight is stale'. Being addressed in the builtin-workflow verification pass.

🤖 Generated with Claude Code

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Fix invalid timestamp format in FNXC comment.

As per coding guidelines, FNXC comments must include a timestamp in strict yyyy-MM-dd-hh:mm format. The timestamp 2b:55 contains 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

📥 Commits

Reviewing files that changed from the base of the PR and between 3658cec and 2c4d10a.

📒 Files selected for processing (27)
  • .changeset/fix-no-selection-default-workflow-drift.md
  • docs/architecture.md
  • packages/core/src/__tests__/custom-review-lane-merge-blocker.test.ts
  • packages/core/src/__tests__/legacy-adoption.test.ts
  • packages/core/src/__tests__/no-selection-default-workflow-move.test.ts
  • packages/core/src/builtin-workflows.ts
  • packages/core/src/index.gate.ts
  • packages/core/src/index.ts
  • packages/core/src/task-store/lifecycle-ops.ts
  • packages/core/src/task-store/moves.ts
  • packages/core/src/task-store/remaining-ops-8.ts
  • packages/core/src/workflow-ir-resolver.ts
  • packages/dashboard/app/components/__tests__/TaskCard.test.tsx
  • packages/dashboard/app/utils/__tests__/taskStatusBadgeLabel.test.ts
  • packages/dashboard/app/utils/taskStatusBadgeLabel.ts
  • packages/dashboard/src/routes/register-task-workflow-routes.ts
  • packages/engine/src/__tests__/executor-task-done-blocked.test.ts
  • packages/engine/src/__tests__/executor-task-done-dissent-guard.test.ts
  • packages/engine/src/__tests__/executor-task-done-invariant.test.ts
  • packages/engine/src/__tests__/executor-task-done-summary.test.ts
  • packages/engine/src/__tests__/executor-test-helpers.ts
  • packages/engine/src/__tests__/invariant-wrong-checkout-completion.test.ts
  • packages/engine/src/__tests__/merger-trait-rekey.test.ts
  • packages/engine/src/__tests__/scheduler-trait-dispatch.test.ts
  • packages/engine/src/auto-merge-finalization.ts
  • packages/engine/src/scheduler.ts
  • packages/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

gsxdsm added a commit that referenced this pull request Jul 19, 2026
- 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>
@gsxdsm
gsxdsm force-pushed the feature/ir-lifecycle-cutover branch from 30e3cb9 to 5169271 Compare July 19, 2026 16:54
@gsxdsm
gsxdsm changed the base branch from main to cutover/stack-2-engine July 19, 2026 17:02
@gsxdsm gsxdsm changed the title refactor: IR-driven lifecycle cutover — workflow as the single source of truth refactor(cutover 3/3): dashboard + changesets — IR-driven lifecycle cutover Jul 19, 2026
@gsxdsm

gsxdsm commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator Author

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

@gsxdsm
gsxdsm force-pushed the feature/ir-lifecycle-cutover branch from 5169271 to 76ef0f6 Compare July 19, 2026 17:03

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:&lt;Area-of-product&gt; 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

📥 Commits

Reviewing files that changed from the base of the PR and between 1c3f18f and 5169271.

📒 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.md
  • AGENTS.md
  • docs/architecture.md
  • docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md
  • docs/plans/2026-07-19-001-u5e-executecore-lift-handoff.md
  • docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md
  • docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md
  • docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md
  • docs/plans/2026-07-19-005-u10-flip-residual-handoff.md
  • docs/plans/2026-07-19-006-u10b-post-flip-handoff.md
  • packages/cli/skill/fusion/SKILL.md
  • packages/cli/skill/fusion/references/engine-tools.md
  • packages/cli/skill/fusion/references/extension-tools.md
  • packages/core/src/__tests__/custom-review-lane-merge-blocker.test.ts
  • packages/core/src/__tests__/legacy-adoption.test.ts
  • packages/core/src/__tests__/no-selection-default-workflow-move.test.ts
  • packages/core/src/__tests__/postgres/schema-applier.test.ts
  • packages/core/src/__tests__/review-level-preset.test.ts
  • packages/core/src/__tests__/workflow-cutover.test.ts
  • packages/core/src/__tests__/workflow-ir-validation.test.ts
  • packages/core/src/__tests__/workflow-lifecycle-traits.test.ts
  • packages/core/src/builtin-workflows.ts
  • packages/core/src/index.gate.ts
  • packages/core/src/index.ts
  • packages/core/src/legacy-adoption.ts
  • packages/core/src/postgres/index.ts
  • packages/core/src/postgres/migrations/0000_initial.sql
  • packages/core/src/postgres/migrations/0026_workflow_ir_pin_and_legacy_adoption.sql
  • packages/core/src/postgres/postgres-health.ts
  • packages/core/src/postgres/schema-applier.ts
  • packages/core/src/postgres/schema/project.ts
  • packages/core/src/review-level-preset.ts
  • packages/core/src/store.ts
  • packages/core/src/task-store/__tests__/transition-validator.test.ts
  • packages/core/src/task-store/lifecycle-ops.ts
  • packages/core/src/task-store/moves.ts
  • packages/core/src/task-store/persistence.ts
  • packages/core/src/task-store/remaining-ops-2.ts
  • packages/core/src/task-store/remaining-ops-6.ts
  • packages/core/src/task-store/serialization.ts
  • packages/core/src/task-store/task-creation.ts
  • packages/core/src/task-store/task-row-mappers.ts
  • packages/core/src/task-store/task-update.ts
  • packages/core/src/task-store/workflow-definitions.ts
  • packages/core/src/types.ts
  • packages/core/src/types/board.ts
  • packages/core/src/types/workflow-steps.ts
  • packages/core/src/workflow-capacity.ts
  • packages/core/src/workflow-cutover.ts
  • packages/core/src/workflow-ir-resolver.ts
  • packages/core/src/workflow-ir.ts
  • packages/core/src/workflow-lifecycle-traits.ts
  • packages/core/src/workflow-step-results.ts
  • packages/core/src/workflow-transition-policy.ts
  • packages/dashboard/app/components/ListView.tsx
  • packages/dashboard/app/components/TaskCard.tsx
  • packages/dashboard/app/components/TaskForm.tsx
  • packages/dashboard/app/components/__tests__/TaskCard.test.tsx
  • packages/dashboard/app/hooks/useTasks.ts
  • packages/dashboard/app/utils/__tests__/taskStatusBadgeLabel.test.ts
  • packages/dashboard/app/utils/capture-screenshot.ts
  • packages/dashboard/app/utils/taskProgress.ts
  • packages/dashboard/app/utils/taskStatusBadgeLabel.ts
  • packages/dashboard/src/__tests__/routes-trait-rekey.test.ts
  • packages/dashboard/src/github-tracking-state.ts
  • packages/dashboard/src/routes/register-task-workflow-routes.ts
  • packages/engine/src/__tests__/benchmark-six-column-workflow.test.ts
  • packages/engine/src/__tests__/builtin-workflows-lifecycle.test.ts
  • packages/engine/src/__tests__/executor-column-agent-principal.test.ts
  • packages/engine/src/__tests__/executor-contamination-base.test.ts
  • packages/engine/src/__tests__/executor-ephemeral-disabled-dispatch-gate.test.ts
  • packages/engine/src/__tests__/executor-fast-mode-workflows.test.ts
  • packages/engine/src/__tests__/executor-graph-boundary.test.ts
  • packages/engine/src/__tests__/executor-implicit-task-done-budget.test.ts
  • packages/engine/src/__tests__/executor-model-marker.test.ts
  • packages/engine/src/__tests__/executor-outer-dispatch-dependency-gate.test.ts
  • packages/engine/src/__tests__/executor-plan-only-scope-leak.test.ts
  • packages/engine/src/__tests__/executor-preheld-legacy-handoff.test.ts
  • packages/engine/src/__tests__/executor-prompt.test.ts
  • packages/engine/src/__tests__/executor-review-step-indexing.test.ts
  • packages/engine/src/__tests__/executor-review-verdicts.test.ts
  • packages/engine/src/__tests__/executor-step-numbering-zero-based.test.ts
  • packages/engine/src/__tests__/executor-step-session.test.ts
  • packages/engine/src/__tests__/executor-stuck-requeue-preserve-progress.test.ts
  • packages/engine/src/__tests__/executor-task-done-blocked.test.ts
  • packages/engine/src/__tests__/executor-task-done-case-insensitive-branch.test.ts
  • packages/engine/src/__tests__/executor-task-done-dissent-guard.test.ts
  • packages/engine/src/__tests__/executor-task-done-invariant.test.ts
  • packages/engine/src/__tests__/executor-task-done-revise-verdict-guard.test.ts
  • packages/engine/src/__tests__/executor-task-done-summary.test.ts
  • packages/engine/src/__tests__/executor-test-helpers.ts
  • packages/engine/src/__tests__/executor-worktree.test.ts
  • packages/engine/src/__tests__/fixtures/six-column-workflow-ir.ts
  • packages/engine/src/__tests__/in-review-unmet-dependency-reconcile.test.ts
  • packages/engine/src/__tests__/invariant-wrong-checkout-completion.test.ts
  • packages/engine/src/__tests__/legacy-tombstones.test.ts
  • packages/engine/src/__tests__/merger-trait-rekey.test.ts
  • packages/engine/src/__tests__/no-merge-workflow-completion.test.ts
  • packages/engine/src/__tests__/plan-review-lease.test.ts
  • packages/engine/src/__tests__/plan-review-single-owner.test.ts
  • packages/engine/src/__tests__/reliability-interactions/dual-observe-shadow-terminal-stage.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executing-task-lock.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executor-liveness-gate.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executor-no-task-done-vs-worktree-reclaim.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executor-pending-review-skip-retry.test.ts
  • packages/engine/src/__tests__/reliability-interactions/soft-delete-end-to-end.test.ts
  • packages/engine/src/__tests__/reliability-interactions/task-done-refusal-x-invariant.test.ts
  • packages/engine/src/__tests__/reliability-interactions/workflow-interpreter-dual-observe.test.ts
  • packages/engine/src/__tests__/restart.integration.test.ts
  • packages/engine/src/__tests__/review-level-tombstone.test.ts
  • packages/engine/src/__tests__/reviewer-workspace.test.ts
  • packages/engine/src/__tests__/scheduler-trait-dispatch.test.ts
  • packages/engine/src/__tests__/self-healing-trait-rekey.test.ts
  • packages/engine/src/__tests__/task-pipeline-smoke.test.ts
  • packages/engine/src/__tests__/triage-plan-review-replan-cap.test.ts
  • packages/engine/src/__tests__/triage-plan-review-unavailable-retry.test.ts
  • packages/engine/src/__tests__/triage-review-spec-external-integration.test.ts
  • packages/engine/src/__tests__/triage.test.ts
  • packages/engine/src/__tests__/workflow-authoritative-driver-async-selection.test.ts
  • packages/engine/src/__tests__/workflow-graph-column-moves.test.ts
  • packages/engine/src/__tests__/workflow-graph-optional-step-fix.test.ts
  • packages/engine/src/auto-merge-finalization.ts
  • packages/engine/src/executor.ts
  • packages/engine/src/hold-release.ts
  • packages/engine/src/index.ts
  • packages/engine/src/merger.ts
  • packages/engine/src/run-audit.ts
  • packages/engine/src/runtimes/in-process-runtime.ts
  • packages/engine/src/scheduler.ts
  • packages/engine/src/self-healing.ts
  • packages/engine/src/triage.ts
  • packages/engine/src/workflow-authoritative-driver.ts
  • packages/engine/src/workflow-column-boundary.ts
  • packages/engine/src/workflow-graph-executor.ts
  • packages/engine/src/workflow-graph-task-runner.ts
  • packages/engine/src/workflow-node-handlers.ts
  • packages/engine/src/workflow-parity-observer.ts
  • packages/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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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:&lt;Area-of-product&gt; 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

📥 Commits

Reviewing files that changed from the base of the PR and between 1c3f18f and 5169271.

📒 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.md
  • AGENTS.md
  • docs/architecture.md
  • docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md
  • docs/plans/2026-07-19-001-u5e-executecore-lift-handoff.md
  • docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md
  • docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md
  • docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md
  • docs/plans/2026-07-19-005-u10-flip-residual-handoff.md
  • docs/plans/2026-07-19-006-u10b-post-flip-handoff.md
  • packages/cli/skill/fusion/SKILL.md
  • packages/cli/skill/fusion/references/engine-tools.md
  • packages/cli/skill/fusion/references/extension-tools.md
  • packages/core/src/__tests__/custom-review-lane-merge-blocker.test.ts
  • packages/core/src/__tests__/legacy-adoption.test.ts
  • packages/core/src/__tests__/no-selection-default-workflow-move.test.ts
  • packages/core/src/__tests__/postgres/schema-applier.test.ts
  • packages/core/src/__tests__/review-level-preset.test.ts
  • packages/core/src/__tests__/workflow-cutover.test.ts
  • packages/core/src/__tests__/workflow-ir-validation.test.ts
  • packages/core/src/__tests__/workflow-lifecycle-traits.test.ts
  • packages/core/src/builtin-workflows.ts
  • packages/core/src/index.gate.ts
  • packages/core/src/index.ts
  • packages/core/src/legacy-adoption.ts
  • packages/core/src/postgres/index.ts
  • packages/core/src/postgres/migrations/0000_initial.sql
  • packages/core/src/postgres/migrations/0026_workflow_ir_pin_and_legacy_adoption.sql
  • packages/core/src/postgres/postgres-health.ts
  • packages/core/src/postgres/schema-applier.ts
  • packages/core/src/postgres/schema/project.ts
  • packages/core/src/review-level-preset.ts
  • packages/core/src/store.ts
  • packages/core/src/task-store/__tests__/transition-validator.test.ts
  • packages/core/src/task-store/lifecycle-ops.ts
  • packages/core/src/task-store/moves.ts
  • packages/core/src/task-store/persistence.ts
  • packages/core/src/task-store/remaining-ops-2.ts
  • packages/core/src/task-store/remaining-ops-6.ts
  • packages/core/src/task-store/serialization.ts
  • packages/core/src/task-store/task-creation.ts
  • packages/core/src/task-store/task-row-mappers.ts
  • packages/core/src/task-store/task-update.ts
  • packages/core/src/task-store/workflow-definitions.ts
  • packages/core/src/types.ts
  • packages/core/src/types/board.ts
  • packages/core/src/types/workflow-steps.ts
  • packages/core/src/workflow-capacity.ts
  • packages/core/src/workflow-cutover.ts
  • packages/core/src/workflow-ir-resolver.ts
  • packages/core/src/workflow-ir.ts
  • packages/core/src/workflow-lifecycle-traits.ts
  • packages/core/src/workflow-step-results.ts
  • packages/core/src/workflow-transition-policy.ts
  • packages/dashboard/app/components/ListView.tsx
  • packages/dashboard/app/components/TaskCard.tsx
  • packages/dashboard/app/components/TaskForm.tsx
  • packages/dashboard/app/components/__tests__/TaskCard.test.tsx
  • packages/dashboard/app/hooks/useTasks.ts
  • packages/dashboard/app/utils/__tests__/taskStatusBadgeLabel.test.ts
  • packages/dashboard/app/utils/capture-screenshot.ts
  • packages/dashboard/app/utils/taskProgress.ts
  • packages/dashboard/app/utils/taskStatusBadgeLabel.ts
  • packages/dashboard/src/__tests__/routes-trait-rekey.test.ts
  • packages/dashboard/src/github-tracking-state.ts
  • packages/dashboard/src/routes/register-task-workflow-routes.ts
  • packages/engine/src/__tests__/benchmark-six-column-workflow.test.ts
  • packages/engine/src/__tests__/builtin-workflows-lifecycle.test.ts
  • packages/engine/src/__tests__/executor-column-agent-principal.test.ts
  • packages/engine/src/__tests__/executor-contamination-base.test.ts
  • packages/engine/src/__tests__/executor-ephemeral-disabled-dispatch-gate.test.ts
  • packages/engine/src/__tests__/executor-fast-mode-workflows.test.ts
  • packages/engine/src/__tests__/executor-graph-boundary.test.ts
  • packages/engine/src/__tests__/executor-implicit-task-done-budget.test.ts
  • packages/engine/src/__tests__/executor-model-marker.test.ts
  • packages/engine/src/__tests__/executor-outer-dispatch-dependency-gate.test.ts
  • packages/engine/src/__tests__/executor-plan-only-scope-leak.test.ts
  • packages/engine/src/__tests__/executor-preheld-legacy-handoff.test.ts
  • packages/engine/src/__tests__/executor-prompt.test.ts
  • packages/engine/src/__tests__/executor-review-step-indexing.test.ts
  • packages/engine/src/__tests__/executor-review-verdicts.test.ts
  • packages/engine/src/__tests__/executor-step-numbering-zero-based.test.ts
  • packages/engine/src/__tests__/executor-step-session.test.ts
  • packages/engine/src/__tests__/executor-stuck-requeue-preserve-progress.test.ts
  • packages/engine/src/__tests__/executor-task-done-blocked.test.ts
  • packages/engine/src/__tests__/executor-task-done-case-insensitive-branch.test.ts
  • packages/engine/src/__tests__/executor-task-done-dissent-guard.test.ts
  • packages/engine/src/__tests__/executor-task-done-invariant.test.ts
  • packages/engine/src/__tests__/executor-task-done-revise-verdict-guard.test.ts
  • packages/engine/src/__tests__/executor-task-done-summary.test.ts
  • packages/engine/src/__tests__/executor-test-helpers.ts
  • packages/engine/src/__tests__/executor-worktree.test.ts
  • packages/engine/src/__tests__/fixtures/six-column-workflow-ir.ts
  • packages/engine/src/__tests__/in-review-unmet-dependency-reconcile.test.ts
  • packages/engine/src/__tests__/invariant-wrong-checkout-completion.test.ts
  • packages/engine/src/__tests__/legacy-tombstones.test.ts
  • packages/engine/src/__tests__/merger-trait-rekey.test.ts
  • packages/engine/src/__tests__/no-merge-workflow-completion.test.ts
  • packages/engine/src/__tests__/plan-review-lease.test.ts
  • packages/engine/src/__tests__/plan-review-single-owner.test.ts
  • packages/engine/src/__tests__/reliability-interactions/dual-observe-shadow-terminal-stage.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executing-task-lock.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executor-liveness-gate.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executor-no-task-done-vs-worktree-reclaim.test.ts
  • packages/engine/src/__tests__/reliability-interactions/executor-pending-review-skip-retry.test.ts
  • packages/engine/src/__tests__/reliability-interactions/soft-delete-end-to-end.test.ts
  • packages/engine/src/__tests__/reliability-interactions/task-done-refusal-x-invariant.test.ts
  • packages/engine/src/__tests__/reliability-interactions/workflow-interpreter-dual-observe.test.ts
  • packages/engine/src/__tests__/restart.integration.test.ts
  • packages/engine/src/__tests__/review-level-tombstone.test.ts
  • packages/engine/src/__tests__/reviewer-workspace.test.ts
  • packages/engine/src/__tests__/scheduler-trait-dispatch.test.ts
  • packages/engine/src/__tests__/self-healing-trait-rekey.test.ts
  • packages/engine/src/__tests__/task-pipeline-smoke.test.ts
  • packages/engine/src/__tests__/triage-plan-review-replan-cap.test.ts
  • packages/engine/src/__tests__/triage-plan-review-unavailable-retry.test.ts
  • packages/engine/src/__tests__/triage-review-spec-external-integration.test.ts
  • packages/engine/src/__tests__/triage.test.ts
  • packages/engine/src/__tests__/workflow-authoritative-driver-async-selection.test.ts
  • packages/engine/src/__tests__/workflow-graph-column-moves.test.ts
  • packages/engine/src/__tests__/workflow-graph-optional-step-fix.test.ts
  • packages/engine/src/auto-merge-finalization.ts
  • packages/engine/src/executor.ts
  • packages/engine/src/hold-release.ts
  • packages/engine/src/index.ts
  • packages/engine/src/merger.ts
  • packages/engine/src/run-audit.ts
  • packages/engine/src/runtimes/in-process-runtime.ts
  • packages/engine/src/scheduler.ts
  • packages/engine/src/self-healing.ts
  • packages/engine/src/triage.ts
  • packages/engine/src/workflow-authoritative-driver.ts
  • packages/engine/src/workflow-column-boundary.ts
  • packages/engine/src/workflow-graph-executor.ts
  • packages/engine/src/workflow-graph-task-runner.ts
  • packages/engine/src/workflow-node-handlers.ts
  • packages/engine/src/workflow-parity-observer.ts
  • packages/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 **/*.md files must include FNXC: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, treat FNXC_LOG as a heading described in AGENTS.md and use the established FNXC:<Area-of-product> yyyy-MM-dd-hh:mm: format instead of a literal FNXC_LOG token.

  • docs/plans/2026-07-18-001-refactor-ir-driven-lifecycle-cutover-plan.md#L1-L1: Add the FNXC: comment block.
  • docs/plans/2026-07-19-001-u5e-executecore-lift-handoff.md#L1-L1: Add the FNXC: comment block.
  • docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md#L1-L1: Add the FNXC: comment block.
  • docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md#L1-L1: Add the FNXC: comment block.
  • docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md#L1-L1: Add the FNXC: comment block.
  • docs/plans/2026-07-19-005-u10-flip-residual-handoff.md#L1-L1: Add the FNXC: comment block.
  • packages/cli/skill/fusion/SKILL.md#L1-L1: Add the FNXC: 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-L1
  • docs/plans/2026-07-19-002-u5e-remaining-deletions-handoff.md#L1-L1
  • docs/plans/2026-07-19-003-u5f-workflow-aware-flip-handoff.md#L1-L1
  • docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md#L1-L1
  • docs/plans/2026-07-19-005-u10-flip-residual-handoff.md#L1-L1
  • packages/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:&lt;Area-of-product&gt; 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 in docs/plans/2026-07-19-004-u5g-flip-residual-handoff.md as 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 .ts files 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 Verification and ## Surface Enumeration in their specifications. This test covers the PR #2335 review 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-apps

greptile-apps Bot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This 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.

  • Custom column ingest fixed: normalizeColumnnormalizeColumnId in useTasks.ts means custom-workflow cards no longer coerce to \"triage\" on every SSE event; operator routes (/move, retry, reset, respecify, unassign) now resolve destinations from the task's workflow by trait with \"todo\"/\"in-progress\"/\"triage\" as legacy fallbacks.
  • GitHub trait classifier wired into decideIssueAction: the function now accepts an optional classify callback so trait-identified terminal columns can close/reopen GitHub issues — but the production call site in handleTaskMoved still passes no classifier (uses the legacy default), and handleMerged still hardcodes column: \"done\", leaving both gaps from the previous review open.
  • Dead code removed: capture-screenshot.ts (which imported html2canvas, a package not present in pnpm-lock.yaml) is deleted, resolving the CI typecheck failure inherited from FN-8309.

Confidence Score: 3/5

The 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

Filename Overview
packages/dashboard/app/hooks/useTasks.ts Fixes custom-column ingest by switching normalizeColumn to normalizeColumnId, but handleMerged (line 696) still hardcodes column: 'done', misplacing cards from custom-terminal-column workflows until the next refresh.
packages/dashboard/src/github-tracking-state.ts Adds ColumnLifecycleClass, legacyColumnLifecycleClass, and the optional classify parameter to decideIssueAction, but handleTaskMoved (line 168) still calls decideIssueAction without a classifier, so custom terminal columns never trigger GitHub issue closure.
packages/dashboard/src/routes/register-task-workflow-routes.ts Re-keys all hardcoded move targets (retry, reset, re-engage, unassign, spec-revise, PR-feedback) to trait-derived columns via three new helper functions; POST /move now validates against the task's workflow columns with correct fallback to the legacy enum.
packages/dashboard/app/utils/taskStatusBadgeLabel.ts Active-merge statuses now win unconditionally over workflow-step labels; merging-fix keeps its distinct label; new workflowStepLabel parameter surfaces IR-declared step names instead of raw engine tokens.
packages/dashboard/src/tests/routes-trait-rekey.test.ts New pure-function test suite covering normalizeColumnId pass-through, trait-based lifecycle move-target resolution, GitHub state decisions for renamed terminal columns, and 6-column benchmark editor-buildability with positive and negative parseWorkflowIr cases.
packages/dashboard/app/utils/capture-screenshot.ts Deleted: file had zero importers and imported html2canvas which was never in pnpm-lock.yaml, causing the required Typecheck check to fail on every PR since FN-8309.

Reviews (7): Last reviewed commit: "Address PR review feedback (#2335)" | Re-trigger Greptile

Comment thread packages/dashboard/app/utils/taskStatusBadgeLabel.ts Outdated
Comment thread packages/dashboard/src/routes/register-task-workflow-routes.ts Outdated
@gsxdsm

gsxdsm commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator Author

CI note: pr-checks.yml triggers only on PRs targeting main, so required checks (Lint/Typecheck/Build/Gate) will run automatically when this PR is retargeted to main after its parent merges. Until then: the parent PR #2341 is fully green, every stack layer was locally typechecked against the exact combination its CI will see, and the identical combined tree already passed all checks on the pre-split #2335 run. Greptile/CodeRabbit review can proceed now.

🤖 Generated with Claude Code

gsxdsm added a commit that referenced this pull request Jul 19, 2026
…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>
@gsxdsm
gsxdsm force-pushed the cutover/stack-2-engine branch from 309b6e6 to 04dd02e Compare July 19, 2026 17:26
gsxdsm added a commit that referenced this pull request Jul 19, 2026
- 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>
@gsxdsm
gsxdsm force-pushed the feature/ir-lifecycle-cutover branch from 76ef0f6 to 7030b9d Compare July 19, 2026 17:27
@gsxdsm

gsxdsm commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator Author

Re: CodeRabbit re-review bodies — addressed in 7030b9d (top) / 612bc71 (stack-1):

Fix invalid timestamp format in FNXC comment.

Fixed: 2026-07-19-2b:5502:55, plus the same typo class (2b:4002:40) in register-task-workflow-routes.ts.

Include all relevant files in the status write census.

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.

Add missing FNXC: comments to Markdown files.

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.

Include missing bug spec headers.

Not addressing: ## Symptom Verification and ## Surface Enumeration are required sections of a Fusion task's PROMPT.md spec (the contract consumed by planning/review gates and the GitHub auto-close gate), not headers inside test files. The pagination regression test in question encodes its symptom and surfaces as test cases directly, which is the enforceable form.

🤖 Generated with Claude Code

gsxdsm added a commit that referenced this pull request Jul 19, 2026
- 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>
@gsxdsm
gsxdsm force-pushed the feature/ir-lifecycle-cutover branch from 7030b9d to 32f2508 Compare July 19, 2026 17:35
gsxdsm added a commit that referenced this pull request Jul 19, 2026
- 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>
@gsxdsm
gsxdsm force-pushed the feature/ir-lifecycle-cutover branch from 32f2508 to acfbd48 Compare July 19, 2026 17:59
gsxdsm added a commit that referenced this pull request Jul 19, 2026
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>
gsxdsm added a commit that referenced this pull request Jul 19, 2026
…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>
@gsxdsm
gsxdsm force-pushed the cutover/stack-2-engine branch from 01184e2 to bc9ff20 Compare July 19, 2026 18:08
gsxdsm added a commit that referenced this pull request Jul 19, 2026
- 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>
@gsxdsm
gsxdsm force-pushed the feature/ir-lifecycle-cutover branch from acfbd48 to 0f41c6e Compare July 19, 2026 18:09
gsxdsm added a commit that referenced this pull request Jul 19, 2026
…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>
@gsxdsm
gsxdsm force-pushed the cutover/stack-2-engine branch from bc9ff20 to 6a1056c Compare July 19, 2026 18:26
gsxdsm added a commit that referenced this pull request Jul 19, 2026
- 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>
@gsxdsm
gsxdsm force-pushed the feature/ir-lifecycle-cutover branch from 0f41c6e to 2e5cc97 Compare July 19, 2026 18:26
gsxdsm added a commit that referenced this pull request Jul 19, 2026
…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>
@gsxdsm
gsxdsm force-pushed the cutover/stack-2-engine branch from 6a1056c to dff2fa5 Compare July 19, 2026 18:33
gsxdsm added a commit that referenced this pull request Jul 19, 2026
- 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>
@gsxdsm
gsxdsm force-pushed the feature/ir-lifecycle-cutover branch from 2e5cc97 to cc17734 Compare July 19, 2026 18:34
gsxdsm added a commit that referenced this pull request Jul 19, 2026
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>
gsxdsm and others added 3 commits July 19, 2026 11:55
…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>
@gsxdsm
gsxdsm force-pushed the cutover/stack-2-engine branch from f1537ad to c43e493 Compare July 19, 2026 18:55
gsxdsm and others added 2 commits July 19, 2026 11:55
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>
@gsxdsm
gsxdsm force-pushed the feature/ir-lifecycle-cutover branch from cc17734 to e327bd4 Compare July 19, 2026 18:56
gsxdsm added a commit that referenced this pull request Jul 19, 2026
…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>
Base automatically changed from cutover/stack-2-engine to main July 19, 2026 19:08
@gsxdsm
gsxdsm merged commit b2a7425 into main Jul 19, 2026
2 checks passed
@gsxdsm
gsxdsm deleted the feature/ir-lifecycle-cutover branch July 19, 2026 19:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant