From 9c83812351e24bd3a302dbc9d3c1ceee9dc24e64 Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Thu, 13 Aug 2026 23:46:57 -0700 Subject: [PATCH] fix(ci): unblock check:lane-wiring for the task-recommendations read MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- packages/core/src/store.ts | 14 ++++++++++++++ scripts/lib/lane-wiring-baseline.json | 1 + 2 files changed, 15 insertions(+) diff --git a/packages/core/src/store.ts b/packages/core/src/store.ts index 2d94722028..524cbb788e 100644 --- a/packages/core/src/store.ts +++ b/packages/core/src/store.ts @@ -1601,6 +1601,20 @@ export class TaskStore extends EventEmitter { async clearWorkflowRunStepInstancesAsync(taskId: string, keepRunId?: string): Promise { 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; limit?: number; offset?: number }): Promise { return listTaskRecommendationsImpl(this, options); } diff --git a/scripts/lib/lane-wiring-baseline.json b/scripts/lib/lane-wiring-baseline.json index d89b48834b..b348922c04 100644 --- a/scripts/lib/lane-wiring-baseline.json +++ b/scripts/lib/lane-wiring-baseline.json @@ -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,