qwen-code/packages/cli
Shaojin Wen 10c5b3ece1
feat(review): warn when a subsystem's Criticals keep regrowing across rounds (#10010)
* feat(review): warn when a subsystem's Criticals keep regrowing across rounds (#9905)

* fix(review): scope the marker's closure field to the account that minted it (#10010)

* fix(review): sentinel mint, chain order, and advice contract repairs (#10010)

Three repairs to the divergence sentinel, each reproduced before the fix
and each pinned by a test that goes red without it.

The mint forged a closure on a claim re-filed through the deferral
channel. The typed channel carries no id field, so the build stamps the
re-file fresh, and its rendered title projects to the `file:line`
locator under `claimLocator` while an inline-drafted predecessor's title
projects to the claim text — the standing locator join never meets, and
the exact-id read minted a closure on a claim the very body re-posted
open. A round later, the fabricated entry armed the sentinel over a
lineage whose first link never happened. The mint now also joins the
previous list against the typed deferral entries on (file, claim); a
truly vanished same-file Critical beside the re-file still mints.

`successorChains` was never sorted before both consumers slice it at
`MAX_RENDERED_CLUSTERS`, so which diverging subsystems the note named
was the map's insertion order, not a measured property — four diverging
files with the multi-Critical one inserted last named the three
single-Critical files and relegated it to the ellipsis. Sorted like the
cluster: new work first, closure volume second, code-unit path tie-break.

The chain advice said "consider removing or redesigning that mechanism"
— a code-architecture prescription the render's own contract forbids and
its invariant test enforces, which the new branch bypassed only because
the invariant's fixture carried no chain. Reworded into the process
register, and the invariant test now renders a chain-carrying fixture
through the same negative regexes.

Also witnesses the mint's Critical-only rule with a mixed-severity work
list — every prior fixture was Critical-only, so deleting the conjunct
kept the suite green — and extends the chain render's wording pins to
the new advice.

* fix(review): bind sentinel mint and chain to claim identity and fail-closed (#10010)

The closure mint and the successor chain read absence and ids in shapes
that fabricate history: a cap-stage mismatch in the claim-identity join
closed still-standing blockers whose locator outruns the title cap; the
mint skipped the anchor's fail-closed predicate, minting over unread
territory; the chain's fresh side counted re-minted re-posts as new
Criticals; floor-stripped re-voices of previous Criticals were blind to
the absence join; long-path subsystems never joined their capped
closures; stand-in-named closures joined ambiguously; and the posted
divergence sentence misstated the measured window.

* fix(review): strip carried ids before windowing the closure-mint joins (#10010)

The two closure-mint joins cap the entry title BEFORE `claimLocator`
strips the carried id, while the previous list's locators project from
id-less, write-capped titles. A re-voiced or re-filed claim whose
leading span exceeds `LEDGER_MAX_TITLE` minus the id prefix projects
from a window already shortened by the prefix, never meets the previous
locator, and the mint records a false closure in the very body whose
deferral line still carries the claim — and with a same-file closure in
the previous round, the successor chain fires over the fabricated
lineage. Both joins now strip the id before the window, capping before
locating the way the serializer does; reproduced at lead length 78,
where the dash straddles the cap boundary and the new tests go red
without the strip.

Also lands the queued witness coverage on the sentinel's plumbing: the
shed-order test's fixture ids now pass admission, so the closure-shed
cascade rung actually runs and is witnessed; the parse-side closure cap
is fed a raw marker instead of a serialize round-trip that already
capped; the round-cap escape hatch gains its acceptance-side witness
(admitted at the cap, refused below it); the side-file closure cap's
keeping-the-NEWEST direction is pinned by the rendered ids; and the
generation filter's round-membership conjunct gains its two stale-r
near-misses. Each witness fails its mutation probe: guard deleted,
test red.

* fix(review): fail the closure mint closed on id-less re-post channels (#10010)

The closure mint's claim-identity defense was an unbounded text-matching
surface: one hand-rolled projection per re-posting channel, and four
review rounds each patched an entrance the previous patch grew (a
moved-path re-file keyed on (file, claim) slips the standing join, a
dash-less claim line never meets the whole-body collapse the reroute
join projects, a Suggestion-severity entry re-voicing a previous
Critical is invisible behind the severity filter — probe-verified in
R4-1). The space of re-post shapes cannot be enumerated and closed one
entrance at a time.

The class fix joins on EXPLICIT IDENTITY: a deferral or reroute entry
whose title bears the original finding id keeps that claim standing —
severity, path, and wording irrelevant to the readback. An entry that
bears none proves nothing about which vanished claim it carries, so the
round fails closed and mints no closure at all — the same honesty leg
the mint already applies to a partial previous list. The build-side
claim-locator join stays for the posting channel's id-less re-voices;
both per-channel projection joins are deleted (source net-negative).

* fix(review): prove re-post ids and list adoption before minting closures (#10010)

* fix(review): withhold the merge ending on the mint's honesty states (#10010)

---------

Co-authored-by: qwen-code-ci-bot <qwen-code-ci-bot@users.noreply.github.com>
Co-authored-by: qwen-code-dev-bot <qwen-code-dev-bot@users.noreply.github.com>
2026-08-27 11:55:53 +00:00
..
src feat(review): warn when a subsystem's Criticals keep regrowing across rounds (#10010) 2026-08-27 11:55:53 +00:00
.gitignore feat(core): add opt-in built-in web_search backed by the DashScope Responses API (#7215) 2026-07-21 10:59:36 +00:00
index.ts fix(cli): add bootstrap fast paths (#6188) 2026-07-02 22:28:11 +00:00
package.json chore(release): v0.22.2 (#10166) 2026-08-26 13:39:29 +00:00
test-setup.ts feat(review): run the reviewed repository's own commands behind a container (#9556) (#9723) 2026-08-25 01:58:18 +00:00
tsconfig.json feat(channels): add DingTalk Workspace channel (#9394) 2026-08-25 06:40:47 +00:00
vitest.config.ts fix: repair the Windows and macOS test lane failures (#9728) 2026-08-25 11:49:27 +00:00