Repository navigation
Commit df0e1a0
feat(qa): retest-owed reader, touched:SHA selector and the standing regression cadence (#27647)
domain:devx#1 · os-elon-musk · session_01LKHDniRQSWjRJyDtacwpEd
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} -->
_Requested by **Elon** · [project
thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9D27iKcauY7daF8J3vRY9Ucx)_
Fixes #27383
## What changes
1. **`scripts/qa/retest-owed.mjs` (new, read-only).** Lists the closed
issues that carry a `QA-source: #RECORD · area.item · clause` line and
closed after the subject commit time of the newest `qa-run` record that
judged that item. Each row names the item, its fix card(s), the record
that last judged it, and whether a later record re-judged it. `--json`,
`--as-of ISO` (replays the past), `--repo`, and an offline `--self-test`
(57 assertions in 9 batteries, with the battery roster and floor copied
from qa-rollup). It writes nothing to GitHub.
- A record judges an item only when its title selector is that item with
a judged count, or a body line names the item with a pass/partial/fail
word and no not-run word. Records that only *name* an item are shown as
`unconfirmed: #N names it`, so a missed judgment errs toward "owed",
never toward "re-judged".
- `smoke:npm-VERSION · CELL` locators are re-judged by the next
`smoke:npm-*` record.
- Nothing is dropped: malformed `QA-source:` lines, unrecognized
locators and cross-repo records are listed under **Not read** with the
reason. Cards closed `not_planned`/`duplicate` are listed under **Closed
without a fix**.
- Time is three-valued. A record whose subject sha cannot be resolved
makes the row **Unknown**, not owed and not re-judged.
- Endpoints are repo-scoped only (closed issues since the oldest record,
`GET /repos/…/commits/SHA` for subject times). The listing follows the
`next` cursor carried onto the `/repos` path, because the
`/repositories/ID` form of that link answers 403 from a cloud session
and `page=100` answers 422.
2. **`touched:SHA` selector in `scripts/checklist-select.mjs`.** Selects
the runnable items whose `source[]` paths or `automated.ref` files
changed in `SHA..HEAD`, from `git diff --no-renames --name-only SHA
HEAD`.
- The `#symbol` anchor and trailing prose are cut, and `dir/{a,b}.ts`
brace lists are expanded.
- A cited path matches a changed path that holds it as a whole run of
`/` segments. That covers the same path, a path under a cited directory
(prefix match), or a longer path ending in it. A bare basename matches
only for a source-file extension.
- The CLI refuses a malformed or unfetched sha with exit 2 and the fetch
remedy, and names citations whose file no longer exists.
- It is listed in the header's selector table and in the skill's §0
table. The self-test battery floor goes from 31 to 45 cases (14 new,
each load-bearing).
3. **`.claude/skills/checklist-test/SKILL.md`**, with the cadence stated
as the maintainer chose it:
- a new §6 "standing regression", covering the weekly run on `main` HEAD
(one `qa-run` record per selector: retest-owed list, `touched:` the
previous weekly subject, `priority:P0`, `surface:api`, with Supersede
keeping at most one open per selector), the post-publish
`smoke:npm-VERSION` in the shape of the previous smoke record, where its
fix cards are re-judged, and the retest-owed reader;
- §5 gains a fourth retest trigger and keeps "hand-feel reruns are not
triggers";
- verification retest is now "not the fifth trigger";
- the creation of the scheduled tasks stays with the dispatching PM
session, not repo code.
4. **`scripts/pm/check-skill-line-ratchet.mjs`**: the checklist-test
ceiling moves **259 → 277**, on top of #27642's 246 → 259 (ruling
6500750765, +13). Step one is **259 → 276** under **#27377 comment
6501246005** (the maintainer's four options and 「这些都应该写到 checklist
skills 中」, verbatim), **+17** measured: 20 ruled lines (the §0
`touched:` row, trigger 4, the §5 npm smoke locator exception, §6) less
3 repaid by rejoining §5 wraps broken mid-word. Step two is **276 →
277** under ruling **6500750765**, **+1**: retest trigger 2's
security-hardening clause. No line is over 120 bytes. (Seat refresh of
this paragraph, per contract review 6508135176 should-fix 2.)
RUNNER.md is unchanged; nothing in it needed to move.
## Why
QA-extracted fix cards land between release candidates. Nothing listed
which checklist items those landings left un-re-judged, so §5 trigger 2
depended on memory. `touched:` gives the weekly run an incremental pool.
The maintainer ruled the cadence on #27377 and asked for it to be
written into the checklist skill.
## Verification
**Anchor proof on #25807** (live, 214 API reads, 0 writes; corpus: 160
`qa-run` records, 136 with a canonical title; 17,967 issues scanned
since 2026-08-11; 171 cards with a `QA-source:` line; 32 of 32 subject
shas resolved):
- `--as-of 2026-10-29T00:00:00Z` (before wave 3) gives 20 owed rows. All
22 fix cards the card names are accounted for:
- **16 owed**: #25934, #26452, #26453, #26459, #26461, #26462, #26463,
#26465, #26474, #26477, #26478, #26479, #26480 (12 item rows;
`ux-conventions.write-feedback` carries two cards) and #26630, #26631,
#26632 (`smoke:npm-18.2.0` cells D3, C3, F5).
- **5 under Not read**: #26640, #26641, #26642, #26644, #26646, because
their line is `QA-source: #26639 · observation N`, two fields where the
contract has three.
- **#26707 absent**: its body has no `QA-source:` line (it uses
`Batch-of:`).
- The other 5 owed rows the card did not name: #23946, #23950, #24576,
#24782, #24784. I spot-checked three of them, and later records hid or
recorded the item not-run:
`access-security.no-active-org-session-semantics` is hidden as blocked
in #25227 and #26481, `identity-auth.email-verification-loop` is not-run
in #24538, and `platform-core.shell-nav-personalization` is not-run in
#24557. They are owed.
- Without `--as-of` (2026-10-29 15:41Z), there are 15 owed rows. The
wave-3 records re-judged all 12 item rows above. The three
`smoke:npm-18.2.0` rows stay owed until the next npm smoke. Seven new
rows are wave-3 fix cards closed today: #27395, #27445, #27448, #27488,
#27490, #27495, #27510.
**Local gates**, each exit code captured before any pipe; the change set
was derived by `dispatch-gates.mjs`:
- `node scripts/checklist-select.mjs --self-test`: 45 cases pass
- `node scripts/qa/retest-owed.mjs --self-test`: 57 assertions in 9
batteries
- `node scripts/check-platform-checklist.mjs` and `pnpm
check:platform-checklist`: OK, 352 items
- `pnpm check:pm-skill-ratchet`: 0
- `pnpm check:pm-skill-id-lint`: 0
- `pnpm check:pm-dispatch-gates`: fast tier, 1937 cases
- `pnpm check:entry-guard`: 0
- `pnpm check:parse-guard`: 0
- `pnpm check:agent-test-spelling`: 0
- `pnpm check:bash32-floor`: 0
- `pnpm check:ci-filter-parity`: 0
- `pnpm check:cli-command-ids`: 0
- `pnpm check:cross-package-test-inputs`: 0
- `pnpm check:doc-authoring`: 0
- `check:doc-formula-expressions`: 0, after building formula and lint
- `pnpm check:pm-governed-merges`: 0
- `pnpm check:pnpm-filter-targets`: 0
- `pnpm check:pnpm-flag-spellings`: 0
- `pnpm check:ratchet-remedy-authority`: 0
- `pnpm check:scripts-symbol-anchors`: 0, after the second commit
- `pnpm check:skill-frame-sync`: 0
- `pnpm check:nul-bytes`: 0
- `check-declaration-mirrors` (and its self-test): 0
- `check-self-test-wired` (and its self-test): 0
- `check-self-test-workflow-commands` (and its self-test): 0
- `check-whole-set-label-write` (and its self-test): 0
- `plan-test-core-shards --self-test`: 0
- `check-harness-current --self-test`: 0
- `check-skills-token-ratchet`: 0
- `check-published-list-mirrors`: 0
- `check-commit-card-trailers`: 0
- eslint on the three scripts: 0
The other families run in CI.
Clause-②: no
Metadata-protocol: none
_Keep one value on each of the two lines above, each line starting with
its key.
[Human
Minimum](https://github.com/objectstack-ai/objectstack/blob/main/CONTRIBUTING.md#human-minimum)
item 5 says what they mean._
## Human Minimum
Each item is one rule from
[CONTRIBUTING.md › Human
Minimum](https://github.com/objectstack-ai/objectstack/blob/main/CONTRIBUTING.md#human-minimum),
which links the AGENTS.md text that states it.
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(No schema touched.)
- [x] 2. Every name I added uses the casing for its kind.
- [x] 3. No formatter ran; `pnpm lint` passes. (eslint on the touched
scripts.)
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. A change that publishes carries a changeset, and both
declaration lines are filled in here and in the changeset. (Nothing
publishes: `skip-changeset`.)
- [x] 6. `packages/spec` touched: its generated artifacts are
regenerated and committed. (Not touched.)
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English.
- [x] The *Before Submitting* list in CONTRIBUTING.md is done.
## Acceptance notes
- **qa-rollup pagination.** `scripts/qa/qa-rollup.mjs` follows GitHub's
`next` link verbatim. From a cloud session that link
(`/repositories/ID/…`) answers 403 on page 2. The new reader carries the
cursor onto the `/repos` path instead. Not fixed here, because it is out
of scope. Carrier: the Devx seat has taken it as its own card.
- **Self-test wiring.** `retest-owed --self-test` is not run by CI,
which is the same posture as `qa-rollup --self-test`. Wiring it in means
a one-word addition to the `check:platform-checklist` alias, left for
the seat to decide, since this card excludes CI changes.
- **Record bodies vary.** The body rule does not see judgments written
as aggregate prose ("every item not listed below passed") or with short
ids. Those rows come out owed, with an `unconfirmed: #N names it`
pointer, so the error is on the side of re-running.
---
_Generated by [Claude
Code](https://claude.ai/code/session_016WV4d1oYpq8eEjYF141fC3)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 869fa76 commit df0e1a0
5 files changed
Lines changed: 1176 additions & 17 deletions
File tree
- .claude/skills/checklist-test
- scripts
- pm
- qa
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
48 | 48 | | |
49 | 49 | | |
50 | 50 | | |
| 51 | + | |
51 | 52 | | |
52 | 53 | | |
53 | 54 | | |
| |||
169 | 170 | | |
170 | 171 | | |
171 | 172 | | |
172 | | - | |
173 | | - | |
| 173 | + | |
174 | 174 | | |
175 | 175 | | |
176 | 176 | | |
| |||
215 | 215 | | |
216 | 216 | | |
217 | 217 | | |
218 | | - | |
219 | | - | |
| 218 | + | |
| 219 | + | |
220 | 220 | | |
221 | 221 | | |
222 | 222 | | |
223 | 223 | | |
224 | 224 | | |
225 | | - | |
226 | | - | |
| 225 | + | |
227 | 226 | | |
228 | | - | |
| 227 | + | |
229 | 228 | | |
230 | 229 | | |
231 | 230 | | |
232 | | - | |
| 231 | + | |
| 232 | + | |
233 | 233 | | |
| 234 | + | |
234 | 235 | | |
235 | 236 | | |
236 | 237 | | |
237 | | - | |
| 238 | + | |
238 | 239 | | |
239 | 240 | | |
240 | 241 | | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
241 | 259 | | |
242 | 260 | | |
243 | 261 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
118 | 118 | | |
119 | 119 | | |
120 | 120 | | |
121 | | - | |
| 121 | + | |
122 | 122 | | |
123 | 123 | | |
124 | 124 | | |
| |||
0 commit comments