Files
fusion/packages
gsxdsm 5791dfeeb7 fix(dashboard): the routes and the engine disagreed about what "review" is — a converted guard that still contradicts core (#2723)
Built **on top of #2713**, which converted this file to trait-resolved
membership sets while my #2701 was open on the same file. Their design
is better than the single-id resolver I had — the arity argument in
their comment (a single id answers "where should this card GO", a SET
answers "is this card ALREADY there") is correct, and I have closed
#2701 rather than contest it.

Two things survive that #2713 did not cover.

## 1. The routes and the engine disagreed about what "review" IS

Core's `resolveLifecycleColumns().review` — the answer the **executor**,
the **merger** and **project-engine** all act on — resolves review from
`mergeOrchestration`. This file's resolver looked only at `mergeBlocker`
/ `humanReview`.

The default lineage hides it, because `in-review` carries all three:

```
in-review[merge-blocker, human-review, stall-detection, merge]
```

A board that declares only `merge` on its review lane resolved as
**review in the engine** and **not review in the routes**. The executor
treats the card as in review; comment re-engagement, the retry gate and
branch-binding recovery all refuse it.

**That is the same defect class as a literal, one level up:** the guard
is converted, it reads a real trait, and it still disagrees with the
authority. Unioning all three makes this resolver a **superset** of
core's, so the routes cannot refuse a card the engine considers in
review.

How I found it is worth stating: my renamed-board fixture declares only
`merge` on its review lane, and the ported suite failed against main. I
nearly "fixed" the fixture to add `mergeBlocker` — which would have
papered over a real cross-layer inconsistency to make my own test pass.

## 2. The 400s name the board's own columns

#2713 converted both gates but left the messages saying `in-review` /
`in-progress`. **Being told your card must be in a column that does not
exist is worse than a wrong guard** — a wrong guard is a bug report; a
wrong column name sends the operator looking for something that was
deleted.

## Tests

7 cases ported from #2701 and adapted to the membership-set shape. **3
red on revert** of the `mergeOrchestration` union.

## A pre-existing failure I am reporting, not folding in

`register-task-workflow-routes.move-bypassguards.test.ts` **fails on
`origin/main`** — 400 where it expects 200. Verified by stashing my
change and re-running, so it is not mine. Someone owns that regression;
it should not ride in on a lane-consistency PR.

## Verification

`pnpm test:gate` **10 / 71** · the ten other
`register-task-workflow-routes` suites pass · 7/7 new · `tsc -p
packages/dashboard` clean · `pnpm lint` clean · census `--strict` exit
0, no count change (this PR converts nothing new — it makes an
already-converted resolver agree with core).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 05:25:28 -07:00
..
2026-07-26 18:11:47 -07:00