Files
fusion/scripts
gsxdsm 968af0822c gate: the lane-wiring ratchet did not scan plugins, dashboard/app, or any .tsx (#2978)
## The new gate re-opened a blind spot the old one had already learned
about

`check-lane-wiring.mjs` (#2966) scanned four roots and only `.ts`:

```js
const ROOTS = ["packages/core/src", "packages/engine/src", "packages/dashboard/src", "packages/cli/src"];
```

`unwired-lane-parameter-guard.test.ts` scans **six**, including
`packages/dashboard/app` and `plugins`, and its FNXC note records
exactly why:

> `plugins` is scanned, and its absence was half of a real escape. […]
an unwired `completeColumnsByTaskId` sat on `main` unreported: the guard
found 0 across 1753 files, and 0 again across 2114 once plugins were
added, because the shape was invisible too. **Fixing either alone would
still have missed it.**

That is the same trap here, and it needed **two** changes. Those trees
are overwhelmingly `.tsx`, which the file filter excluded — so adding
the roots without the extension would have scanned a handful of files
and reported a reassuring near-zero.

## What the widened scan found: 10 sites, in 8 files, audited not
blind-baselined

| site | verdict |
| --- | --- |
| `dependency-graph/GraphTaskNode.tsx` (`isTaskStuck`) | **real** —
`isTaskStuck` takes an optional 4th `columnFlags`; omitted,
`isWipColumnRole` falls back to the literal, so **no card on a renamed
board is ever shown stuck** in the graph |
| `dashboard/app/Lane.tsx`, `ListView.tsx` (`sortTasksForDisplayColumn`)
| **real**, dashboard batch |
| `dashboard/app/ModelSelectorTab.tsx` ×2
(`resolveEffectiveExecutor`/`Validator`) | **real**, dashboard batch |
| `dashboard/app/TaskDetailModal.tsx`
(`isNearDuplicateCanonicalInactive`) | **real**, dashboard batch |
| `even-cards/routes/board-routes.ts` ×3 (`boardToDeck`) | **cannot be
fixed in place** — deprecated plugin depending on `@fusion/plugin-sdk`
alone, with no resolution source |
| `even-realities-glasses/routes/board-routes.ts:141` (`boardToDeck`) |
**harmless by construction** — the `{ maxCards: 1 }` summary call slices
`active` to empty, so `terminalColumns` cannot change its output;
documented in `cards.ts` |

They are baselined rather than fixed because they span three other
batches. I did **not** fix the graph one despite it being my area:
wiring it needs the plugin prop contract to carry column flags, and the
plugin's own `dashboard-interop.d.ts` declares `isTaskStuck` with only
three parameters — so it crosses the dashboard↔plugin API boundary
rather than being a local change.

## Merge-order hazard, stated precisely

A **decrease** also exits 1 (`process.exit(1)` on the `decreased`
branch), and #2976 wires `packages/cli/src/commands/task-lifecycle.ts`,
which is present in this baseline. **If #2976 lands after this PR,
main's gate goes red** until the baseline is re-recorded.

It fails loudly rather than silently, so it is a chore not a risk.
Merging #2976 first and letting me re-record here is the cleanest order
— say the word and I will push the re-record.

## Verification (measured)

- `check-lane-wiring` — green, **19 known / none added** (was 9 across 4
roots)
- `unwired-lane-parameter-guard.test.ts` — **9 passed**, the older guard
is unaffected
- `lifecycle-column-census --strict`, `check-sql-column-literals`,
`check-fnxc-future-dates` — green

Gate/tooling only; no product file is touched.


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Tests**
  * Expanded lane-wiring checks to cover dashboard and plugin code.
* Added support for scanning `.tsx` files while excluding declarations,
tests, specs, and ignored directories.
  * Updated baseline coverage counts for the additional files.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 23:05:23 -07:00
..