chore(pm): the queue guard reads its record recognisers from record-recognisers.mjs; check-clause2-carriers.mjs is deleted - #19803
Conversation
…, moved out of check-clause2-carriers Step 4 of ruling record 5770886272 (letter B). The readers the queue guard's Tier S leg imports — locateReviewOfRecord, deliveredCardNumber, servedTierStands, isModelIdentifierToken, REVIEW_OF_RECORD_THREADS / REVIEW_OF_RECORD_LOCATION, CONTRACT_REVIEW_TIER_NAME, unexplainedPathsBetween — and the record template with its --template CLI, moved verbatim with their docblocks into their own module. The self-test cases that pin these readers move with them; the ones that read the retired rows do not. Nothing imports this file yet; the guard is re-pointed in the next commit. Claude-Session: https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc Co-authored-by: Claude <noreply@anthropic.com>
…ointers at record-recognisers.mjs - check-governed-queue-guard.mjs: RECOGNISER_SOURCES.tier is now './record-recognisers.mjs' (still a LAZY import; the no-top-level-await pin and the renamed-source pin follow), and its docblocks name the new file. - lint.yml + package.json: the step that ran check-clause2-carriers' self-test is retargeted, not added beside — `pnpm check:pm-record-recognisers`. - references/contract-review.md: the two `--template` pointers name `node scripts/pm/record-recognisers.mjs --template`, each wrapped once to stay under the 120-byte line cap (24 -> 26 of 60 lines). - Present-tense prose that named the old file as a live importer, location or message is re-pointed: clause2-line, check-expected-skips, check-closing-target-claim, check-adr-0087-registration, check-half-states (one runtime sentence included), check-widening-tells (its usage refusal). Claude-Session: https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc Co-authored-by: Claude <noreply@anthropic.com>
…g record 5770886272 Nothing imports it any more: the queue guard's lazy import reads record-recognisers.mjs, and the lint step runs that file's self-test. Gone with it, not re-homed: the retired `--pair` scan and its readers (derivePairs, the C1-C9 rows, pairRows, the read-path ladder, the input record), the claim readers no live importer used, the local copy of the retired label constant, and the self-test battery of those parts. Claude-Session: https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc Co-authored-by: Claude <noreply@anthropic.com>
…ep4-record-recognisers-module
…ep4-record-recognisers-module
Contract reviewServed-tier: ① Derived judgmentsRendered in-seat by the skills seat 1 session at the served tier the maintainer named (ruling record 5771798588; 「契约复审继续用 fable 不变」 5788482806 of this date). The contract is ruling B on #19061 (5770886272, 三层归一), step ④ as named on the step-③ Release 5789425558 and the claim 5789522248: the record recognisers and
② Semver levelNone — no release. ③ Boundary flags
Implemented-by: VERDICT: PASS |
|
Standing down on the queue refusal — this PR lands only by 人工直合, not through the merge queue. What was measured (REST + the job log, read this act):
The one door this PR has — as the guard's own remedy text states it and as #19344 (maintainer item 6) narrowed it: the Merge button's bypass-rules option (「Merge without waiting for requirements to be met」), offered only while ruleset Seat position: the 四件套 is complete (ACCEPT 5790743219 on #19061, |
Fixes #19061
维护者速读(草稿)
Governed Surface Queue Guard)放行.claude/**时读## Contract review记录所用的识别器,以及席位照抄的--template记录模板,从 10,220 行的scripts/pm/check-clause2-carriers.mjs原样搬进新文件scripts/pm/record-recognisers.mjs(连同钉住它们的自测用例),然后删除旧文件。守卫改为懒加载新文件;lint.yml里原先跑旧文件自测的那一步改指新文件(不是新增门禁);contract-review.md两处--template指针改写为新命令。--pair扫描、C1–C9 行、认领读取器)早已退役、无人调用。席位意见
建议批准并合并;这是裁决 B(三层归一)的最后一步,做的全是减法。 一万行的
check-clause2-carriers.mjs删掉,队列守卫懒加载的那几个记录识别器和--template原样搬进 1,324 行的record-recognisers.mjs(含它们自己的 110 个自测例);守卫指向新文件,懒加载没动(dev 用消融证明一改成即时加载就死锁,所以懒加载必须留);--template输出 40 行里后 39 行逐字节相同,只有第一行改名。lint 工作流那一步是改指向不是新增,步数不变;contract-review.md两处指针跟着改,行数 24 → 26,天花板 60。席位在新 worktree 上重跑:识别器自测 110、守卫自测 279、半态自测 4897、十个门禁全 0。之所以要你点合并:改动行数 11,684 超过 5,000 的人工合并线(删除也计数),不是档位问题。合并即Fixes #19061,四步全部落地。复核记录:PR 评论 5790479344(PASS,在席按服务档渲染);ACCEPT 在卡 #19061。CI 读数:36 latest-per-name check runs — 30 success, 6 skipped, 0 in progress, 0 other。## Contract reviewPASS 记录、所有检查全绿之后,请您手动点合并 —— 超 5,000 行的 PR 按规则只能人工合并,队列守卫的 size 腿会拒绝入队。Clause-②: no
What this does
Ruling record 5770886272 (letter B), its last step, named on Release 5789425558. Four commits, one per class, so a reviewer can bisect:
a4a16863e— the module.scripts/pm/record-recognisers.mjsholds exactly whatcheck-governed-queue-guard.mjsreads from the old file — throughloadRecordRecognisers(locateReviewOfRecord,deliveredCardNumber,servedTierStands,isModelIdentifierToken,REVIEW_OF_RECORD_THREADS,REVIEW_OF_RECORD_LOCATION) and in its self-test throughRECOGNISER_SOURCES.tier(CONTRACT_REVIEW_TIER_NAME,unexplainedPathsBetween) — plus what those are built from (readServedTier, the stamp control, the regeneration carry,REVIEWED_BY_LINE,DELIVERY_EVIDENCE_PRECEDENCE) and the record template (contractReviewTemplateLines,contractReviewRecordLines,RECORD_TEMPLATE_PLACEHOLDERS, the two fences) with a--templateCLI. The code blocks are verbatim slices of the old file's blob at2cf9db7c4; ten docblock sentences that named a deleted function as live are corrected, each listed under Deviations. The self-test cases that pin these readers moved with them (110 cases, six batteries, roster floor and verdict handshake); the cases that read the retired rows did not.baa17b116— the re-points. The guard'sRECOGNISER_SOURCES.tieris./record-recognisers.mjs(still a LAZY import from a function body), its renamed-source pin and docblocks follow. Thelint.ymlstep that ran the old self-test is retargeted topnpm check:pm-record-recognisers— ⛔ not a gate added beside it.references/contract-review.md:13 / :19 now point atnode scripts/pm/record-recognisers.mjs --template. Present-tense prose that named the old file as a live importer, location or message is re-pointed (list below).81b3469d6— the deletion.scripts/pm/check-clause2-carriers.mjs(10,220 lines) is removed, and with it, not re-homed: the--pairscan and its readers (derivePairs, C1–C9,pairRows, the read-path ladder, the input record), the claim readers no live importer used, the local copy of the retired label constant, and the self-test battery of those parts.origin/main(the last at98d83361d); neither touches a file this PR edits.Measured premises
2cf9db7c4the guard'sRECOGNISER_SOURCES.tierread./check-clause2-carriers.mjs.git grepfor a statement-shapedimport/fromof the file: zero hits. With the file deleted in the worktree before any re-point, 27scripts/pm/*.mjs --self-testruns (every one butdispatch-gates.mjs, whose battery takes about 12 minutes, andcheck-dispatch-gates.mjs) pluscheck-governed-merges.mjs --testandfirst-party-closure.mjswere compared with the same runs with the file present: the ONLY exit that moved was the guard's self-test, 0 → 1 (ERR_MODULE_NOT_FOUND). Both omitted batteries passed on the final tree (Tests). The one other consumer was CI's own invocation (lint.yml:1267through thecheck:pm-clause2-carriersalias), retargeted here.record-recognisers.mjsplanted in the guard exits 13 withDetected unsettled top-level await at .../check-half-states.mjs:9765; restored byte-identical (bloba2fd67afc6bb== HEAD,git diff HEADempty). But a freshnode -eimport of the new module DOES load the guard: it importscheck-half-states.mjsfor the record readers anddeliveryEvidence, and that file's module-scope top-level await imports the guard — exactly as the old file did. Avoiding it would mean restatingcheck-half-states.mjs' readers, which the module's own rule forbids; this is why the guard's import stays lazy.check:first-party-closuredoes not exist:scripts/first-party-closure.mjsis a library with no CLI; its consumers' self-tests ran (check-adr-0087-registration441 assertions,check:objectui-changeset).origin/mainmoved2cf9db7c4→98d83361dduring this work and touched none of these files.--template, before and after40 lines both times; lines 2–40 byte-identical. Line 1 names the tool that prints it —
record-recognisers --templateinstead of the deletedcheck-clause2-carriers --template.Tests — at HEAD
5c24980efnode scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(no paths) derived 85 commands at5c24980ef, byte-identical to the list derived atbfe5b9917before the last merge; all 85 were run on5c24980ef, each exit captured before any pipe, and--rananswers✓ dispatch-gates --ran: 85 derived famil(ies) accounted for — 82 run, 3 NOT-MEASURED (3 DERIVED from a recorded exit 3).dist/output, with no workspace package built here (74 of 78 build tasks are cache misses):check:dual-build-cjs-loads,check:lean-entry-closureandcheck:type-check-debtexit 3PREREQUISITE NOT MET;check:dts-closureandcheck:sourcemap-no-sources-contentexit 0 but swept only the 4 packages built forcheck:doc-formula-expressions(formula, lint and their closure), a partial population and not a measurement of the whole. This diff changes no workspace package's source, manifest or build — only the private root package'sscriptsmap — so none of their verdicts can move; CI builds the closure and runs them.pnpm check:pm-record-recognisers→✓ record-recognisers self-test: 110 cases pass. Ablations throughscripts/ablation-replace.mjs, each landed on disk and restored to the HEAD blob:servedStampsHoldmade to accept any control → 3 of 110 red;DELIVERY_EVIDENCE_PRECEDENCEreordered → 2 of 110 red.node scripts/pm/check-governed-queue-guard.mjs --self-test→✓ check-governed-queue-guard self-test: 279 cases pass(279 before the change too).pnpm check:pm-dispatch-gates→✓ dispatch-gates self-test: 1905 cases pass.·pnpm check:pm-half-states→ 4897 cases ·pnpm check:pm-widening-tells→ 525 ·pnpm check:pm-expected-skips→ 99 ·pnpm check:closing-target-claim→ 105 ·check-changeset-no-major --self-test→ 339 ·check-adr-0087-registration --self-test→ 441 ·check-self-test-wired→every one of the 229 script(s) CI runs that ship a --self-test has that self-test run by CI·pnpm check:pm-skill-ratchet→contract-review.md is 26 lines (ceiling 60; headroom 34), every line at most 120 bytes (measured widest 118) ·pnpm check:skill-frame-sync,pnpm check:doc-authoring,pnpm check:declared-population-live,pnpm check:nul-bytes,check:doc-formula-expressions(after building formula and lint under the verify lock) → exit 0.eslint.config.mjs'sfiles: ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}']object minusNEVER_LINTED, which coversscripts/**;eslint --no-inline-config --format jsonover the 8 changed.mjsfiles reports 8 files, 0 errors, 0 warnings; the config enables no type-aware linting (--print-configshowsparserOptionsofecmaVersionandsourceTypeonly), so the diff cannot move the verdict of any file it does not touch.node scripts/pm/check-governed-merges.mjs --testover the three-dot path list → GOVERNED, Tier S (contract-review.mdis the one register hit).Deviations
--self-test, and the lint step is RETARGETED, not removed. The moved docblocks cite pins ("the self-test drives THIS function's output", "a MIRROR, so the self-test MEASURES it", "the cross-tool pin in this file's self-test"); moving the docblocks without those pins would have left them false, and the kept readers would have lost their unit cases. What moved is only cases that exercise a function this file owns.--templateline 1 names the new tool (above) — the dispatch asked for the old output exactly; a banner naming a deleted file is the one line changed.references/contract-review.mdgrows 24 → 26 lines: each re-pointed line is wrapped once, because the new spelling would push both past the 120-byte line cap (they were 119 and 104 bytes). No other line's text changed.scripts/first-party-closure.mjs:21 is unchanged: it is past-tense narration of the [finding] An accept-set narrowing owes a**BREAKING**banner incorebut not inplatform-objects— and the ADR-0087 classifier reads the banner #16421 measurement, not a closure list — the closure is computed from import edges, so the deletion needs no edit there.CLAUSE2_CORRECTION_KEY_LINEaside, the repo-shape example "below", the template round-trip reader, thederivePairs/ H31 askers, thereviewOfRecord"below", and the template banner.REVIEWED_BY_LINEis nowkeyLineRegex('Reviewed-by')(the same regex the deletedAUTHORSHIP_KEY_LINESbuilt; pinned equal by source in the self-test).scripts/pm/clause2-line.mjs(its docblock described this very step as pending) and one runtime usage line inscripts/pm/check-widening-tells.mjs(--reporefusal named the deleted file as the convention's reader; it now namescheck-half-states.mjs). Incheck-half-states.mjsone runtime sentence drops its clause about the deleted reader.Acceptance notes
scripts/pm/check-widening-tells.mjs' docblock still narrates its only caller, the deleted--pair(the C5 row, an exit register "pinned in THAT file's self-test", the caller section). Left as history rather than rewritten; the tool now has no caller besides its own self-test. carrier: 承接者:无.check-skill-line-ratchet.mjs:437 / :483 (raise ledger),dispatch-gates.mjs:6799 (an import-edge measurement),check-changeset-no-major.mjs:1452 (a phrase attribution),check-half-states.mjs:1404 / :2740 / :24659, the twodocs/audits/census snapshots.CLAUSE2_VALUES/CLAUSE2_ARMSinclause2-line.mjs,bindingClosesCardincheck-half-states.mjs. Not touched.node scripts/pm/measurement-claim-triage.mjs --self-testexits 1 onorigin/main(UNTRIAGED scripts/check-dts-references.mjs:74); it is not wired into CI.Generated by Claude Code
Generated by Claude Code