fix(ci): unblock check:lane-wiring for the task-recommendations read

check:lane-wiring runs in CI's Lint gate and has been failing on main since FN-9037 landed
`listTaskRecommendations`, so it blocks every PR in the repo, not just the one that hit it.

Recorded rather than rewired, because this is the false-positive shape the escape hatch exists
for. The guard catches a callee silently falling back to a LEGACY COLUMN LITERAL when a caller
omits the lane; `listTaskRecommendationsImpl` falls back to
`resolveProjectColumnsForRoles(store, ["complete"])`, which reads the board's own lanes. Real
callers already pass a resolved set — the dashboard route resolves `completeColumns` before
calling — so the fallback only serves the pass-through wrapper. Resolving again in the wrapper
would duplicate that query on every call for no behavioural difference.

The reason lives at the call site as well as in the baseline, since a bare count in a JSON file
is exactly the kind of entry that later reads as unexplained debt.

Baseline diff verified to be a single added entry (store.ts: 1) — nothing else raised or lowered.

Verified: check:lane-wiring exits 0, core typecheck clean, eslint clean, FNXC date check clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
gsxdsm
2026-08-13 23:46:57 -07:00
parent 9d31396f7a
commit 9c83812351
2 changed files with 15 additions and 0 deletions

View File

@@ -1601,6 +1601,20 @@ export class TaskStore extends EventEmitter<TaskStoreEvents> {
async clearWorkflowRunStepInstancesAsync(taskId: string, keepRunId?: string): Promise<void> {
return clearWorkflowRunStepInstancesAsyncImpl(this, taskId, keepRunId);
}
/*
FNXC:WorkflowLifecycleColumns 2026-08-14-04:30:
Deliberately forwards `options` without resolving a lane here, and is recorded in
scripts/lib/lane-wiring-baseline.json for that reason.
The guard exists to catch a callee silently falling back to a LEGACY COLUMN LITERAL when a caller
omits the lane. This callee does not: `listTaskRecommendationsImpl` falls back to
`resolveProjectColumnsForRoles(store, ["complete"])`, which reads the board's own lanes. Resolving
again in this wrapper would duplicate that query on every call and give the pass-through no
behavioural difference from the fallback.
Real callers already supply it — the dashboard route resolves `completeColumns` and passes it — so
the fallback serves the pass-through wrapper, not production paths.
*/
async listTaskRecommendations(options?: { completeColumns?: ReadonlySet<string>; limit?: number; offset?: number }): Promise<import("./types.js").TaskRecommendationListPage> {
return listTaskRecommendationsImpl(this, options);
}

View File

@@ -1,6 +1,7 @@
{
"counts": {
"packages/core/src/merge/task-merge.ts": 1,
"packages/core/src/store.ts": 1,
"packages/core/src/task-store/branch-and-pr-entities.ts": 1,
"packages/core/src/task-store/moves.ts": 1,
"packages/core/src/task-store/task-update.ts": 1,