**Claim announced before the work** (on #2689, alongside `register-task-workflow-routes.ts`): `packages/engine/src/project-engine.ts`. **12 → 5.** Repo backlog → **685**. ## The failure mode here has no error signature Every merge guard in this file spelled the lane `in-review`. On a renamed board nothing throws, nothing logs a warning — **auto-merge simply declines every card**: | guard | what a renamed board gets | |---|---| | `requestInterpreterMerge` | returns `noOp: true` — *"parked cleanly in review, awaiting human merge"* — for a card that was in review and fully eligible | | the merge-queue snapshot | returns an **empty list** for a queue full of review cards, so the coordinator sees nothing to admit | | the `taskMoved` auto-merge handoff | never fires, so nothing reaches auto-merge in the first place | | the pause-interruption tracker | drops every card from its paused-review set on the next update, so a merge paused mid-flight is never interrupted | The operator sees cards resting in review with auto-merge **on**, and every log line says the system did the right thing. There is no string to search for — which is the argument for the census being a parse rather than a grep over error messages. ## Implementation notes - **Core's `resolveTaskLifecycleColumns` directly** — the canonical helper, so no new abstraction and no fourth local resolver in a file that had none. - **The merge-queue snapshot resolves per task through a shared `irCache`**, because a merge queue can hold cards from *different* workflows. Per-workflow, not per-card: one IR read each. - **The handoff and its post-grace recheck share one snapshot.** They are halves of one decision — "did this card just enter the merge lane, and is it still there?" — and that is exactly the split that produced the defects in `executor.ts`. ## Revert proof **1 of 3 cases reddens** with the literal restored. The suite invokes the real `requestInterpreterMerge` via `.call()` on a minimal `this` (`runtime.getTaskStore`, `allowInReviewMergeProcessing`, `onMerge`) instead of standing up a whole `ProjectEngine` runtime. The body under test is the shipped one, and *reaching* `onMerge` is the assertion. I would rather explain that seam than either skip the proof or spend the test budget booting a runtime. The default-board case is labelled in the file as no-change evidence, not counted as coverage. ## The remaining 5, flagged not guessed All five are `column === "done"` **merge-confirmation reads** — "did the merge land?". That is a different question from any lane role, and it shares its answer with the dependency guards I flagged in `executor.ts` (`12325`) and `register-task-workflow-routes.ts` (`3995`). Three files, one open question: **what does "landed / satisfied" mean on a board whose terminal column is not named `done`, and is it the complete column or the terminal union?** Deciding it once and applying it to all three is right; swapping it three times independently is how the resolver choice ends up inconsistent — which already happened once inside `executor.ts`, where the correct resolver inverts between two guards a few lines apart. ## Verification `pnpm test:gate` **158 / 10 / 487 / 71** · **56/56** across the six auto-merge / project-engine suites · 3/3 in the new suite · `tsc -p packages/engine` clean · `pnpm lint` clean · census `--strict` exit 0. No changeset: `@fusion/engine` is private, and the behaviour change is confined to renamed boards. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
214 lines
11 KiB
JSON
214 lines
11 KiB
JSON
{
|
|
"generatedFrom": "node scripts/lifecycle-column-census.mjs --strict --update-baseline",
|
|
"totals": {
|
|
"column": 685,
|
|
"role": 5,
|
|
"status": 186,
|
|
"deliberate": 20
|
|
},
|
|
"byColumnId": {
|
|
"done": 182,
|
|
"in-progress": 134,
|
|
"in-review": 193,
|
|
"archived": 138,
|
|
"todo": 38
|
|
},
|
|
"byFile": {
|
|
"packages/engine/src/self-healing.ts": 110,
|
|
"packages/engine/src/executor.ts": 57,
|
|
"packages/dashboard/app/components/TaskCard.tsx": 42,
|
|
"packages/dashboard/app/components/TaskDetailModal.tsx": 30,
|
|
"packages/engine/src/scheduler.ts": 26,
|
|
"packages/core/src/store.ts": 12,
|
|
"packages/engine/src/mission-execution-loop.ts": 10,
|
|
"packages/core/src/task-store/async-comments-attachments.ts": 9,
|
|
"packages/dashboard/app/components/TaskContextMenu.tsx": 9,
|
|
"packages/dashboard/src/github-tracking-comments.ts": 9,
|
|
"packages/dashboard/src/github-tracking-reconciler.ts": 9,
|
|
"packages/engine/src/notification/notification-service.ts": 9,
|
|
"packages/cli/src/commands/dashboard.ts": 8,
|
|
"packages/cli/src/commands/task.ts": 8,
|
|
"packages/core/src/default-workflow-hooks.ts": 7,
|
|
"packages/core/src/task-store/update-task-deps.ts": 7,
|
|
"packages/dashboard/app/components/Column.tsx": 7,
|
|
"packages/core/src/live-agent-count.ts": 6,
|
|
"packages/core/src/task-merge.ts": 6,
|
|
"packages/core/src/task-store/branch-group-ops.ts": 6,
|
|
"packages/core/src/task-store/task-artifacts-ops.ts": 6,
|
|
"packages/dashboard/app/components/ListView.tsx": 6,
|
|
"packages/dashboard/src/reliability-metrics.ts": 6,
|
|
"packages/engine/src/runtimes/in-process-runtime.ts": 6,
|
|
"packages/cli/src/extension.ts": 5,
|
|
"packages/core/src/task-store/merge-queue-ops-2.ts": 5,
|
|
"packages/dashboard/app/hooks/useTaskDiffStats.ts": 5,
|
|
"packages/dashboard/src/routes/register-task-workflow-routes.ts": 5,
|
|
"packages/engine/src/agent-tools.ts": 5,
|
|
"packages/engine/src/merger.ts": 5,
|
|
"packages/engine/src/project-engine.ts": 5,
|
|
"packages/engine/src/restart-recovery-coordinator.ts": 5,
|
|
"packages/core/src/agent-store.ts": 4,
|
|
"packages/core/src/blocker-fanout.ts": 4,
|
|
"packages/core/src/task-age-staleness.ts": 4,
|
|
"packages/core/src/task-store/task-store-helpers.ts": 4,
|
|
"packages/dashboard/app/components/TaskReviewTab.tsx": 4,
|
|
"packages/dashboard/app/components/taskSorting.ts": 4,
|
|
"packages/dashboard/src/gitlab-tracking-comments.ts": 4,
|
|
"packages/dashboard/src/routes/register-git-github.ts": 4,
|
|
"packages/engine/src/agent-heartbeat.ts": 4,
|
|
"packages/engine/src/replan-target.ts": 4,
|
|
"packages/engine/src/triage.ts": 4,
|
|
"packages/engine/src/usage-limit-detector.ts": 4,
|
|
"packages/core/src/async-mission-store-queries.ts": 3,
|
|
"packages/core/src/async-mission-store.ts": 3,
|
|
"packages/core/src/task-priority.ts": 3,
|
|
"packages/core/src/task-store/async-merge-coordination.ts": 3,
|
|
"packages/core/src/task-store/task-update.ts": 3,
|
|
"packages/dashboard/app/components/DockTaskList.tsx": 3,
|
|
"packages/dashboard/app/components/TaskChangesTab.tsx": 3,
|
|
"packages/dashboard/app/components/TaskChatTab.tsx": 3,
|
|
"packages/dashboard/app/utils/taskActivity.ts": 3,
|
|
"packages/dashboard/app/utils/worktreeGrouping.ts": 3,
|
|
"packages/dashboard/src/chat.ts": 3,
|
|
"packages/dashboard/src/routes/register-chat-routes.ts": 3,
|
|
"packages/engine/src/gridlock-detector.ts": 3,
|
|
"packages/engine/src/planner-overseer.ts": 3,
|
|
"packages/engine/src/worktree-pool.ts": 3,
|
|
"packages/cli/src/commands/dashboard-tui/app.tsx": 2,
|
|
"packages/core/src/assigned-task-ranking.ts": 2,
|
|
"packages/core/src/duplicate-intake.ts": 2,
|
|
"packages/core/src/near-duplicate-canonical.ts": 2,
|
|
"packages/core/src/node-override-guard.ts": 2,
|
|
"packages/core/src/task-move-disposer.ts": 2,
|
|
"packages/core/src/task-store/archive-lifecycle-2.ts": 2,
|
|
"packages/core/src/task-store/audit-ops.ts": 2,
|
|
"packages/core/src/task-store/comments-ops.ts": 2,
|
|
"packages/core/src/task-store/moves.ts": 2,
|
|
"packages/core/src/task-store/project-store-ops.ts": 2,
|
|
"packages/core/src/task-store/reads.ts": 2,
|
|
"packages/core/src/task-store/symbol-locks.ts": 2,
|
|
"packages/core/src/task-store/task-id-integrity.ts": 2,
|
|
"packages/core/src/team-analytics.ts": 2,
|
|
"packages/core/src/workflow-analytics.ts": 2,
|
|
"packages/dashboard/app/components/Board.tsx": 2,
|
|
"packages/dashboard/app/components/DocumentsView.tsx": 2,
|
|
"packages/dashboard/app/components/effective-model-resolution.ts": 2,
|
|
"packages/dashboard/app/components/WorkflowResultsTab.tsx": 2,
|
|
"packages/dashboard/app/utils/prFeedback.ts": 2,
|
|
"packages/dashboard/app/utils/taskRevert.ts": 2,
|
|
"packages/dashboard/app/utils/taskTiming.ts": 2,
|
|
"packages/dashboard/src/github-tracking-state.ts": 2,
|
|
"packages/dashboard/src/routes/register-project-routes.ts": 2,
|
|
"packages/dashboard/src/routes/register-session-diff-routes.ts": 2,
|
|
"packages/dashboard/src/routes/register-system-maintenance-routes.ts": 2,
|
|
"packages/dashboard/src/server.ts": 2,
|
|
"packages/engine/src/agent-reflection.ts": 2,
|
|
"packages/engine/src/auto-merge-finalization.ts": 2,
|
|
"packages/engine/src/cli-agent/state-machine.ts": 2,
|
|
"packages/engine/src/merger-scope-auto-widen.ts": 2,
|
|
"plugins/fusion-plugin-even-cards/src/cards/board-cards.ts": 2,
|
|
"plugins/fusion-plugin-reports/src/store/report-store.ts": 2,
|
|
"packages/cli/src/commands/pr.ts": 1,
|
|
"packages/core/src/eval-automation.ts": 1,
|
|
"packages/core/src/eval-signal-collector.ts": 1,
|
|
"packages/core/src/in-review-stall.ts": 1,
|
|
"packages/core/src/mission-store.ts": 1,
|
|
"packages/core/src/plugin-store.ts": 1,
|
|
"packages/core/src/stalled-review-detector.ts": 1,
|
|
"packages/core/src/task-store/branch-and-pr-entities.ts": 1,
|
|
"packages/core/src/task-store/lifecycle-ops.ts": 1,
|
|
"packages/core/src/task-store/merge-queue-ops.ts": 1,
|
|
"packages/core/src/task-timing.ts": 1,
|
|
"packages/dashboard/app/components/ChangesDiffModal.tsx": 1,
|
|
"packages/dashboard/app/components/command-center/liveSnapshotMetrics.ts": 1,
|
|
"packages/dashboard/app/components/DevServerView.tsx": 1,
|
|
"packages/dashboard/app/components/MergeDetails.tsx": 1,
|
|
"packages/dashboard/app/components/PrPanel.tsx": 1,
|
|
"packages/dashboard/app/components/ResearchTaskActionModal.tsx": 1,
|
|
"packages/dashboard/app/components/RoutingTab.tsx": 1,
|
|
"packages/dashboard/app/components/TaskPlannerChatTab.tsx": 1,
|
|
"packages/dashboard/app/hooks/useExecutorStats.ts": 1,
|
|
"packages/dashboard/app/hooks/useTasks.ts": 1,
|
|
"packages/dashboard/app/utils/inReviewStallCopy.ts": 1,
|
|
"packages/dashboard/app/utils/quickAddStart.ts": 1,
|
|
"packages/dashboard/app/utils/stalePausedReviewCopy.ts": 1,
|
|
"packages/dashboard/app/utils/taskStuck.ts": 1,
|
|
"packages/dashboard/src/github-issue-comment.ts": 1,
|
|
"packages/dashboard/src/gitlab-issue-comment.ts": 1,
|
|
"packages/dashboard/src/gitlab-source-issue-reconciler.ts": 1,
|
|
"packages/dashboard/src/knowledge-index-refresh.ts": 1,
|
|
"packages/dashboard/src/planning-board-tools.ts": 1,
|
|
"packages/dashboard/src/research-routes.ts": 1,
|
|
"packages/dashboard/src/routes/register-agent-core-routes.ts": 1,
|
|
"packages/dashboard/src/task-planner-chat-context.ts": 1,
|
|
"packages/dashboard/src/task-planner-chat-metrics.ts": 1,
|
|
"packages/dashboard/src/test/mockCoreEngine.ts": 1,
|
|
"packages/engine/src/auto-recovery-handlers/branch-worktree.ts": 1,
|
|
"packages/engine/src/backlog-pressure-reporter.ts": 1,
|
|
"packages/engine/src/cli-agent/task-session.ts": 1,
|
|
"packages/engine/src/ephemeral-worker-manager.ts": 1,
|
|
"packages/engine/src/merger-integration-worktree.ts": 1,
|
|
"packages/engine/src/merger-orphan-rehome.ts": 1,
|
|
"packages/engine/src/plugin-runner.ts": 1,
|
|
"packages/engine/src/pr-comment-handler.ts": 1,
|
|
"plugins/fusion-plugin-even-realities-glasses/src/notifications/diff.ts": 1,
|
|
"plugins/fusion-plugin-reports/src/store/report-types.ts": 1
|
|
},
|
|
"deliberateByFile": {
|
|
"packages/dashboard/app/components/TaskCard.tsx\u0000triage": 2,
|
|
"packages/dashboard/app/components/TaskDetailModal.tsx\u0000triage": 2,
|
|
"packages/dashboard/app/components/command-center/MissionControlPanel.tsx\u0000done": 1,
|
|
"packages/dashboard/app/components/command-center/MissionControlPanel.tsx\u0000in-review": 1,
|
|
"packages/dashboard/app/components/command-center/MissionControlPanel.tsx\u0000todo": 1,
|
|
"packages/dashboard/app/components/RoutineEditor.tsx\u0000triage": 1,
|
|
"packages/dashboard/app/components/ScheduleForm.tsx\u0000triage": 1,
|
|
"packages/dashboard/app/components/ScheduleStepsEditor.tsx\u0000triage": 1,
|
|
"packages/dashboard/app/components/TaskCard.tsx\u0000todo": 1,
|
|
"packages/dashboard/app/components/TaskContextMenu.tsx\u0000triage": 1,
|
|
"packages/dashboard/app/components/TaskDetailModal.tsx\u0000todo": 1,
|
|
"packages/dashboard/app/utils/columnRoles.ts\u0000todo": 1,
|
|
"packages/dashboard/src/routes/register-task-workflow-routes.ts\u0000todo": 1,
|
|
"packages/dashboard/src/routes/register-task-workflow-routes.ts\u0000triage": 1,
|
|
"packages/engine/src/hold-release.ts\u0000archived": 1,
|
|
"packages/engine/src/hold-release.ts\u0000done": 1,
|
|
"packages/engine/src/hold-release.ts\u0000in-review": 1,
|
|
"packages/engine/src/triage.ts\u0000triage": 1
|
|
},
|
|
"properties": {
|
|
"query": 83,
|
|
"definition": 43
|
|
},
|
|
"queryByColumnId": {
|
|
"todo": 10,
|
|
"archived": 7,
|
|
"done": 10,
|
|
"in-progress": 19,
|
|
"in-review": 35,
|
|
"triage": 2
|
|
},
|
|
"queryByFile": {
|
|
"packages/engine/src/self-healing.ts": 48,
|
|
"packages/engine/src/project-engine.ts": 7,
|
|
"packages/engine/src/backlog-pressure-reporter.ts": 3,
|
|
"packages/core/src/task-store/async-persistence.ts": 2,
|
|
"packages/core/src/task-store/merge-queue-ops.ts": 2,
|
|
"packages/core/src/task-store/moves.ts": 2,
|
|
"packages/engine/src/executor.ts": 2,
|
|
"packages/engine/src/stale-task-reporter.ts": 2,
|
|
"packages/cli/src/extension.ts": 1,
|
|
"packages/core/src/async-mission-store.ts": 1,
|
|
"packages/core/src/eval-automation.ts": 1,
|
|
"packages/core/src/store.ts": 1,
|
|
"packages/core/src/task-store/archive-lifecycle-2.ts": 1,
|
|
"packages/core/src/task-store/async-archive-lineage.ts": 1,
|
|
"packages/core/src/task-store/async-self-healing.ts": 1,
|
|
"packages/core/src/task-store/task-artifacts-ops.ts": 1,
|
|
"packages/core/src/task-store/task-store-helpers.ts": 1,
|
|
"packages/dashboard/src/routes/register-gitlab.ts": 1,
|
|
"packages/engine/src/agent-tools.ts": 1,
|
|
"packages/engine/src/auto-merge-finalization.ts": 1,
|
|
"packages/engine/src/restart-recovery-coordinator.ts": 1,
|
|
"packages/engine/src/scheduler.ts": 1,
|
|
"packages/engine/src/workflow-node-handlers.ts": 1
|
|
}
|
|
}
|