fix(pm): read the documented blockquote claim shape, and print runnable gate invocations - #7551
Merged
Merged
Conversation
…le gate invocations check-half-states.mjs (#7488): the H2 predicate tested /^\s*Claim(?:ed)?\s*[:...]/mi, and \s does not match ">", so a claim written in the shape SKILL.md step 4 tells every seat to write ("> Claim: ...") never matched and its card was reported as a half-state. The predicate now accepts an optional leading blockquote marker. The strictness either side of it is unchanged and pinned: the line must still BEGIN with the word, so ordinary prose containing "claim" is not a claim comment. dispatch-gates.mjs (#7440): the print site emitted the bare script name, dropping the --filter package the parser already captured. A dev searching the root package.json for a package-scoped gate finds nothing and concludes the gate does not exist — two independent devs did exactly that within one hour (PR #7416, #7417) with check:doc-formula-expressions, which lives in @objectstack/lint. The matched-gate lines now print the runnable invocation; root-scoped checks print "pnpm check:x" unchanged.
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
This was referenced Aug 11, 2026
huangyiirene
marked this pull request as ready for review
August 11, 2026 05:38
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #7488
Fixes #7440
Two scoped
scripts/pm/tooling fixes, packed on one branch. File surface isscripts/pm/check-half-states.mjs+scripts/pm/dispatch-gates.mjsand nothing else. ⛔ No.claude/skills/**edit: the PM ruled direction 1 on #7488 (relax the predicate, the skill's documented blockquote shape stays authoritative), and SKILL.md is owned by #7498's dev this wave.Both premises were re-verified on
origin/main@1530870before implementing, and both held at the dispatched line numbers:check-half-states.mjs:87carried/^\s*Claim(?:ed)?\s*[::]/mi,dispatch-gates.mjs:66already captured the--filterpackage, and:178printed the bare check name.Per-card checklist
Each line is one hunk;
git diff --statis 2 files / +48 / −4 and maps 1:1 to the seven items below.#7488 — the H2 predicate cannot read the documented claim shape
check-half-states.mjs:87— theh2AssigneeNoClaimCommentregex/^\s*Claim(?:ed)?\s*[::]/mi—\sdoes not match>, so a line beginning> Claim:never matches/^\s*>?\s*Claim(?:ed)?\s*[::]/mi— an optional blockquote marker, nothing else widenedcheck-half-states.mjs:38— the H2 invariant docblock"Claim:"line, silent on the blockquote>because step 4's own template is a blockquote, and that the strictness either side of it is deliberatecheck-half-states.mjs:222— self-test#7440 — package-scoped gates printed as bare
check:*dispatch-gates.mjs:107— new exportedrunnableInvocation({ check, filter, direct })filterwas dropped at the print sitepnpm --filter PKG run check:xwhen a filter was parsed,pnpm check:xwhen not,node scripts/check-x.mjsfor a direct-node invocationdispatch-gates.mjs:199— the matched-gate print site- ${check} [lint.yml] matched via …- ${runnableInvocation(entry)} [lint.yml] matched via …— formatting only, no new discovery logicdispatch-gates.mjs:35— the "what the output means" docblockdispatch-gates.mjs:237— self-testrunnableInvocationfrom those same three fixtures (the--filter @objectstack/specsample line at the old:204, the root-scoped one, and the direct-node one), so the sample workflow and the print site cannot drift apartItem 4's direct-node arm is the one shape the card did not name. It is at the same print site and the same defect class:
scripts/check-nul-bytes.mjsis a path, not a pnpm script, sopnpm scripts/check-nul-bytes.mjswould be a new wrong answer. It printsnode scripts/check-nul-bytes.mjs.#7488 (a) — the fleet measurement, done before finalizing
The card asks for a count of already-posted claim comments in each form before the direction is settled. Sample: all 18 open
pm:dispatchedcards (the exact population the H2 sweep reads) plus the 4 recently-closed cards the card's own table names — 22 cards, every comment thread read through the GitHub API on 2026-08-11.> Claim:(the SKILL.md step-4 template)Claim:**Claim**/**CLAIM**/**DEV CLAIM**, em-dash, no colon); #6599, #6350, #4953, #4001 (Chinese 认领)The measurement supports direction 1 and does not argue for direction 2, so there is no fork to report: 2 already-posted claims are in the blockquote form and would be orphaned by dropping the
>from the template, while relaxing the predicate orphans nothing. #7378's blockquote claim was posted at 03:26Z on 2026-08-11 — after #7488 was filed at 01:22Z — which is the card's "it will grow" prediction arriving within four hours of the filing.#7488 (c) — before/after against live data
The live sweep cannot run from this container: the agent proxy answers HTTP 403 "GitHub access is not enabled for this session" on every
api.github.com/repos/**path, with and without the container'sGITHUB_TOKEN. That is the same limitation #7276's PM seat measured, the same one PR #7379 declared for this script, and the subject of neighbour card #7412; GitHub is reachable here only through MCP tools, which the script does not speak. So the sweep's fetch half was replaced by fixtures carrying the real comment lines read from the API, and its predicate half — the thing this PR changes — was imported from the module and run unmodified, before and after.Reading the two required assertions off that output:
MetadataFacadeanswers threeregister→getround-trip cases differently from every other shippedIMetadataService#7378, the blockquote claim posted after filing. Those two are the only cards that move./meta/_draftsserves DRAFT object schemas unmasked — the one ADR-0106 outlet left uncovered #6599, finding:ListRunsRequestSchema.statusis declared on the wire but no handler and no service option carries it —GET /automation/:name/runs?status=failedsilently lists every run #7359, finding:os testwith a**glob OOMs —resolveGlobreaddir-recurses the whole tree includingnode_modules#7363,publicPickeris enforced by the REST lookup route but declared nowhere inpackages/spec— no saved form can ever enable it #7467 appear in both lists.#4001 carries 43 comments, too large to transcribe; it was measured by grepping the full API payload instead — 0 comments match the before regex, 0 match
> Claim:, 0 match the after regex.#7440 — before/after against live data
Run on a
content/docs/path, which is the exact line the card quotes:The one package-scoped gate gained its
--filterprefix; the three root-scoped ones printpnpm check:*unchanged, as the card specifies. Confirmed againstpackage.json:check:doc-formula-expressionsis absent from the root manifest, the other three are present — which is exactly why the bare name read as nonexistent.Both halves then run verbatim, which is the point of the change:
That second output is #7440's incident reproduced end to end — and pnpm's own suggestion is
check:doc-authoring, which is precisely the gate #7245's dev substituted (PR #7417's report: "check:doc-formula-expressions: DOES NOT EXIST in package.json — nearest existing doc-corpus gate check:doc-authoring was run instead"). The tool was sending two independent readers down a path pnpm itself pointed at.Gates
No path-named gate family covers
scripts/pm/**. Derived at work time with the fixed tool itself, on this PR's own file surface:node scripts/check-nul-bytes.mjsOK (scanned 7000 text file(s) -- 7000 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes)grep -naP, beyond the gate's surface)npx eslint --max-warnings=0 scripts/pm/--debugconfirms both files are linted, not ignorednode scripts/pm/check-half-states.mjs --self-test✓ 20 cases pass(was 16)node scripts/pm/dispatch-gates.mjs --self-test✓ 17 cases pass(was 14)pnpm --filter '@objectstack/lint^...' buildThese are report-only tools with no test file of their own; their runs are their tests, which is why the two live before/after sweeps above are the primary verification rather than a supplement.
Changeset
None, deliberately. Both files are internal PM/dev tooling under
scripts/pm/, not shipped in any published package and not reachable by any consumer — nothing releases.skip-changesetis the right label; it is applied on this PR.Out of scope, filed not fixed
#7553 — the same measurement shows H2 is blind to two further claim spellings in live use: bold
**Claim**/**CLAIM**/**DEV CLAIM**with an em-dash and no colon (5 cards), and Chinese 认领 (4 cards). Nine of the 22 measured cards remain false positives after this PR. ⛔ Not touched here: #7488 explicitly bars widening the regex beyond the optional blockquote marker, and unlike the blockquote form neither spelling is what SKILL.md tells seats to write — so the real question is whether the protocol converges the fleet on one shape or the predicate learns all four, which is a PM ruling and not a dev-level tooling call. Both directions are written out on #7553.Generated by Claude Code