skills(pm): land the ruled REST-channel prescriptions and closed-inclusive dedup (ceiling 87 → 93) - #14236
Merged
Merged
Conversation
…heck The list-cards row prescribed an endpoint but asserted nothing about the completeness of what it returns. Measured 2026-08-31/09-01 in two repos, a walk that follows `Link: rel="next"` reports itself exhausted at 102 items while the page-number walk on the identical query returns 287 / 448 and matches `open_issues_count`. The failure is silent and toward the dangerous side, and a keyword positive control is structurally blind to it: a known-hit card sitting in the first page answers correctly over a truncated corpus. Lands both refusals (do not follow the cursor; an enumeration whose total was never cross-checked is not a reading), the `&page=N` short-page termination condition, the `open_issues_count`-minus-open-PRs cross-check, the cause-unknown boundary (GitHub's cursor vs the egress proxy rewriting the header — the prescription removes the dependency, it does not explain it), and the keyword-control blind-spot note. Paid in place: the red-window restatement is retired and its pointer folded into the section heading at zero line cost, so the red-window rule now has exactly one home in platform-readings.md's quota section. The ceiling moves 87 -> 93 on the maintainer ruling quoted verbatim beside the row.
…sed cards Dedup asks whether a subject has been carded before, and that answer lives disproportionately in closed cards, so an open-scoped scan is blind by construction rather than by malfunction. Measured 2026-08-31 in both directions on one day: an open-scoped dedup missed a same-subject card that had been ruled and closed six hours earlier and a duplicate was filed and dispatched; a dedup that included closed cards hit a same-shape closed card and no duplicate was opened. The obligation lands in the prescription text itself -- zero new quota and no new mechanism -- so open-scoped dedup becomes an exception that has to be declared rather than the default. The state and label listing reads keep `state=open` untouched: that convention governs state reads, where a closed card is archive, and dedup is not a state read.
…st-channel-prescriptions
This was referenced Sep 1, 2026
os-zhuang
approved these changes
Sep 2, 2026
os-zhuang
marked this pull request as ready for review
September 2, 2026 01:20
os-zhuang
enabled auto-merge
September 2, 2026 01:20
This was referenced Sep 2, 2026
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 #13900
Fixes #13965
Two maintainer-ruled cards, one governed-face PR (director batch 22, 2026-09-01, maintainer 「同意」), because the raised ceiling is meant to be spent once: 「提额预算一次用足」. Each card keeps its own closure criterion and its own commit.
What landed
Commit
af0a8e5— the #13900 half. On.claude/skills/pm-dispatch/references/rest-channel.md's list-cards row, the two prescriptions in the faithful form the previous dev flight measured: both refusals (⛔ do not follow the issues-listLink: rel="next"; ⛔ an enumeration whose total was never cross-checked is not a reading), the&page=N-until-a-short-page termination condition, theopen_issues_countcross-check with the open-PR subtraction, the cause-unknown boundary, and the note that a keyword positive control is structurally blind to this class. Paid in place per ruling C: the red-window restatement is retired, and the pointer the ruling permits is folded into the 不可迁移 heading at zero line cost, so the red-window rule now has exactly one home. Ceiling row raised 87 → 93 inscripts/pm/check-skill-line-ratchet.mjs, with both rulings quoted verbatim beside it.Commit
b7c2e84— the #13965 half. The dedup prescription itself now states that dedup must include closed cards, with the recency rationale (a card is at its most duplicable right after it closes) and both measured directions from 2026-08-31. Open-scoped dedup becomes an exception that has to be declared rather than the default. The state and label listing reads keepstate=openuntouched — 批 13 is not reopened, and the prescription says why: that convention governs state reads, and dedup is not a state read.The rulings this PR executes — verbatim, untranslated
Ruling on #13900 (comment 5494348033, 2026-09-01T13:02:13Z), the legitimacy of the ceiling raise:
Ruling on #13965 (comment 5494345834, 2026-09-01T13:02:02Z):
Both excluded options stayed excluded: D (the 23-byte fragment) is not in this diff, and the cause-unknown sentence is present — the landed text says the prescription removes the dependency on the header, and makes no claim about whether the truncation is GitHub's own cursor or the egress proxy rewriting
Link. Nothing here reads 「已修」 as 「已解释」.Line budget — measured with the gate's own
wrapLine, pinned at the landed countrest-channel.mdbeforeNet growth +6, exactly the authorized budget, spent once across both cards. The ceiling is pinned at 93 = the landed count, headroom 0, same convention as every neighbouring row — not at the authorization's upper bound. Every added line was produced by the gate's own
wrapLine, so the file is at its canonical packing and no line exceeds the 120-byte budget. No re-wrap funding was used or attempted (筹行 is banned, and the file measures zero reclaimable lines in any case); the ruled raise plus the ruled retirement is the whole funding. The heading pointer cost zero lines: it fits inside the existing heading at 116 bytes.Nothing else in the ceilings map moved — the diff touches exactly the
rest-channel.mdrow and its comment.Gates
Union derived by
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsafter the final commit, at headce400df— 20 families, 18 matched by path and 2 by change KIND (this diff edits a gate script). Every exit code captured by redirect before any pipe.Green (exit 0):
check:pm-skill-ratchet·check:pm-skill-id-lint·check:agent-test-spelling·check:bash32-floor·check:cli-command-ids·check:cross-package-test-inputs·check:doc-authoring·pnpm --filter @objectstack/lint run check:doc-formula-expressions·check:entry-guard·check:parse-guard·check:pm-governed-merges·check:pnpm-filter-targets·check:skill-frame-sync·check:watch-hint-literal·check:pm-dispatch-gates·scripts/check-ci-filter-parity.mjs·scripts/check-cross-package-test-inputs.mjs·scripts/check-shard-attestation.mjs·scripts/pm/bare-root-worklist.mjs --self-test· pluscheck:nul-bytes(not derived; any edit owes it) and the repo-widepnpm lint, both exit 0 at this head.NOT MEASURED:
node scripts/check-test-completeness.mjsexits 3 with no argument — it needs a savedturbo run testlog, which the local family invocation has none of. Its own words: "Nothing was measured … ⛔ It is NOT a finding." It runs in CI.The ratchet's own verdict line at this head, quoted rather than inferred from an exit code:
origin/mainwas merged into the branch before this run (it had moved two commits, neither touching either file), so the union above was derived and run on the tree that is atce400df, not on a stale one.Governed face
.claude/**— draft PR, human merge byGOVERNED_APPROVERS, no auto-merge, not queued.skip-changesetapplies: the diff is.claude/**plusscripts/pm/**and publishes nothing from any package. The publishedskills/directory is untouched, so the published-skill line and token readings are not owed here.Generated by Claude Code