Repository navigation
Commit 794177d
fix(qa): check-platform-checklist judges
Fixes #22987
Clause-②: no — a repository gate script; no published schema, accept set
or public surface is touched
Unblocks #22869: PR #22982 (the retire of
`records-forms.picklist-org-append`) lands after this PR. #22869 remains
open until PR #22982 lands.
## The rule added
`scripts/check-platform-checklist.mjs#statusFieldProblems` had one
branch, for `planned`. Every other status, `retired` included, fell
through to the active rule (`since` a release, `steps` non-empty). So a
planned item retired before it was implemented had no legal shape:
`since: null` and no steps is exactly what the README's Retire step
(`docs/qa/platform-checklist/README.md`, Lifecycle) leaves it with.
The new `retired` branch follows that Retire step, and it returns early
the way the `planned` branch does, so the active rule now covers
`active` and `draft` only:
- `retiredReason` must be a non-empty string. Refusal: `a retired item
must carry "retiredReason" as a non-empty string`.
- `since` must be `null` or release-shaped (`RELEASE_RE` reused). The
refusal names both legal spellings and says only the SHAPE is checked,
because this ledger holds no release timeline.
- `steps` is not judged. Absent, empty, or the steps the item ran with
while active all pass. No selector runs a retired item:
`scripts/checklist-select.mjs` builds its runnable pool from `status ===
'active'` and its planned pool from `'planned'`.
- `supersededBy` is not read here. The existing referential pass after
the walk still checks that it lands on a real id.
The planned and active rules are unchanged; F1–F16 are untouched and
green. No new required field.
**Change from the card's premise:** the item walk already refused a
retired item that had no `retiredReason`, using its own message outside
`statusFieldProblems`. Adding the rule to the branch while keeping that
check would report the problem twice, and the self-test can only drive
the pure function. So the check moved into the branch, and the walk now
only skips the acceptance requirement for retired items. As a side
effect, the rule now sits behind the `statusFieldProblems(item)` call
site that G1/G3 already pin.
**Battery:** R1–R12 go into the existing status battery
(`selfTestPlannedStatus`), and its floor rises from 42 to 54. I did not
add a new battery function, because a new compound-named self-test
function needs a row in `COMPOUND_ANCHOR_LEDGER` in
`scripts/pm/dispatch-gates.data.mjs`, which this card keeps frozen.
## Readings (this repo; base `712361b7a`, final head `1901eba70`)
`pnpm check:platform-checklist`, verdict line of the tree step:
- base `712361b7a`, ledger as on main, unfixed checker:
`check-platform-checklist: 8 problem(s)`
- unfixed checker (`712361b7a`) with PR #22982's `records-forms.json` +
`coverage.json` applied, uncommitted: `check-platform-checklist: 10
problem(s)`. The two extra lines are both on
`records-forms.picklist-org-append`: the active rule's `"since" must be
the release that introduced the capability…` and `"steps" must be a
non-empty array of strings`.
- fixed checker (`1901eba70`), ledger as on main:
`check-platform-checklist: 8 problem(s)`. Diffed line for line, these
are the same 8 lines as base.
- fixed checker (`1901eba70`) with PR #22982's two ledger files applied,
uncommitted: `check-platform-checklist: 8 problem(s)`. Same 8 lines as
base; no line names `picklist-org-append`.
The 8 are the open main-red symbol-anchor set (#22924:
`access-security`, `attachments-storage`, `search`), and this PR does
not touch it. I applied PR #22982's files with `git restore --source`
from a worktree-private ref at `57ef232b7`; main has not touched
`docs/qa/platform-checklist/` since that PR's merge-base `117817ec2`, so
the files carry exactly that PR's delta. I restored them with `git
checkout HEAD --`. Restore proof, both times: `git diff HEAD` is empty,
`git status --porcelain` is empty, and `git hash-object` equals the HEAD
blob for both files (`707de16a36d7…`, `542fd62c23ce…`). No ledger file
is committed here.
Self-test:
- `712361b7a`: `✓ check-platform-checklist --self-test: 221 assertions —
…`
- `1901eba70`: `✓ check-platform-checklist --self-test: 233 assertions —
…`. `✓ checklist-select self-test: 31 cases pass.` runs ahead of it.
**Ablation** (on the committed fix at `ce66b832d`, through
`scripts/ablation-replace.mjs`): anchor `if (item.status === 'retired')
{` replaced by `if (false && item.status === 'retired') {`. On disk the
anchor went x1 to x0 and the marker x0 to x1; blob `6064a9e249a9` became
`2469abeb42c0`, then was restored to `6064a9e249a9`, equal to HEAD, with
`git diff HEAD` empty. Reading:
```
✗ check-platform-checklist --self-test — 10 failure(s)
```
R1 and R3–R11 go red. R2 and R12 stay green because the active rule
accepts both. The G-rows (the call-site text pin that the header above
`statusBindingProblems` describes) also stay green under this mutation.
G12 already discloses this: a dead branch is a semantic severing that a
text pin cannot see. What holds the branch is the new fixture rows, and
the floor comment says so.
## Gates (final head `1901eba70`)
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack`, run from the worktree with no paths,
derives 30 commands. All 30 were run at `1901eba70`, each with its exit
code recorded. Reconciliation:
```
✓ dispatch-gates --ran: 30 derived famil(ies) accounted for — 30 run, 0 NOT-MEASURED (a DERIVED zero — all 30 recorded an exit code and none of them is 3).
```
29 exit 0. `pnpm check:platform-checklist` exits 1, and that is the base
8 above. Selected verdict lines:
- `pnpm check:pm-dispatch-gates`: `✓ dispatch-gates self-test (fast
tier): 1828 cases pass; 6 slow section(s) deferred.` (exit 0)
- `pnpm check:nul-bytes`: `check-nul-bytes: OK (scanned 10999 text
file(s) -- 10999 tracked, 0 untracked-not-ignored; skipped 9 binary; no
raw ASCII control bytes).`
- `pnpm check:entry-guard`: `✓ check:entry-guard: 285 scripts/ file(s) —
every entry guard goes through invoked-as.mjs; …`
- `node scripts/check-comment-mask-corpus.mjs`: `✓ comment-mask corpus
sweep [scripts/js-comment-mask.mjs]: 8836 files, 0 disagree, 0
unparseable, …`
The script's own tests, beyond the derived families: no
`scripts/**/*.test.*` or `scripts/__tests__/**` file names it (the
pathspec matches 2 files, with 0 hits). The watchdog does not import
this script; it only names the path as a string. I ran it anyway: `OK
check-platform-checklist-watchdog self-test: 42 assertions across 8
floored batteries, …`.
Lint (narrowed to the one touched file; CI runs the full `pnpm lint`):
`eslint --no-inline-config --format json
scripts/check-platform-checklist.mjs` checks 1 file with 0 errors and 0
warnings. `--print-config` shows the effective config applies 2 rules
(`no-restricted-imports`,
`comment-swallow/no-code-inside-block-comment`), with parserOptions
`ecmaVersion: latest, sourceType: module` and no
`parserOptions.project`. Type-aware linting is not enabled anywhere in
`eslint.config.mjs`, so this diff cannot change any untouched file's
verdict.
Changeset: none; this PR carries `skip-changeset`. The root package is
private, and no package manifest ships `scripts/`.
## Acceptance notes
- The active rule's refusal `"steps" must be a non-empty array of
strings` names a string check that does not exist: only array-ness and
length are checked. That is the kind of advertising this function's
docblock forbids. Left alone because the card keeps the active rule
frozen. This is a read-only inference, not filed.
- The dispatch assumed that the header-described mutation battery would
go red when the new branch is dropped. Measured, it does not (text pin,
G12). The new R-rows go red instead; see the ablation above.
- The card read `origin/main` at `246edf5b3`; this branch is cut from
`712361b7a`. The base reading of 8 problems is the same on both.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01CinRQcE6T8SvMbhH8D3NhS)_
---------
Co-authored-by: Claude <noreply@anthropic.com>retired by its own rule, not the active one (#22995)1 parent 67baccc commit 794177d
1 file changed
Lines changed: 75 additions & 18 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
149 | 149 | | |
150 | 150 | | |
151 | 151 | | |
152 | | - | |
| 152 | + | |
| 153 | + | |
153 | 154 | | |
154 | | - | |
155 | | - | |
156 | | - | |
157 | | - | |
158 | | - | |
159 | | - | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
160 | 171 | | |
161 | 172 | | |
162 | 173 | | |
163 | 174 | | |
164 | 175 | | |
165 | | - | |
166 | | - | |
167 | | - | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
168 | 180 | | |
169 | | - | |
| 181 | + | |
170 | 182 | | |
171 | 183 | | |
172 | 184 | | |
| |||
187 | 199 | | |
188 | 200 | | |
189 | 201 | | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
190 | 214 | | |
191 | 215 | | |
192 | 216 | | |
| |||
340 | 364 | | |
341 | 365 | | |
342 | 366 | | |
343 | | - | |
| 367 | + | |
344 | 368 | | |
345 | 369 | | |
346 | 370 | | |
| |||
1030 | 1054 | | |
1031 | 1055 | | |
1032 | 1056 | | |
1033 | | - | |
| 1057 | + | |
1034 | 1058 | | |
1035 | 1059 | | |
1036 | 1060 | | |
| |||
1073 | 1097 | | |
1074 | 1098 | | |
1075 | 1099 | | |
1076 | | - | |
| 1100 | + | |
| 1101 | + | |
| 1102 | + | |
| 1103 | + | |
| 1104 | + | |
| 1105 | + | |
| 1106 | + | |
| 1107 | + | |
| 1108 | + | |
1077 | 1109 | | |
1078 | 1110 | | |
1079 | 1111 | | |
| |||
2354 | 2386 | | |
2355 | 2387 | | |
2356 | 2388 | | |
| 2389 | + | |
| 2390 | + | |
| 2391 | + | |
| 2392 | + | |
| 2393 | + | |
| 2394 | + | |
| 2395 | + | |
| 2396 | + | |
| 2397 | + | |
| 2398 | + | |
| 2399 | + | |
| 2400 | + | |
| 2401 | + | |
| 2402 | + | |
| 2403 | + | |
| 2404 | + | |
| 2405 | + | |
| 2406 | + | |
| 2407 | + | |
| 2408 | + | |
| 2409 | + | |
| 2410 | + | |
| 2411 | + | |
| 2412 | + | |
2357 | 2413 | | |
2358 | 2414 | | |
2359 | 2415 | | |
| |||
2547 | 2603 | | |
2548 | 2604 | | |
2549 | 2605 | | |
2550 | | - | |
| 2606 | + | |
| 2607 | + | |
2551 | 2608 | | |
2552 | 2609 | | |
2553 | 2610 | | |
| |||
2780 | 2837 | | |
2781 | 2838 | | |
2782 | 2839 | | |
2783 | | - | |
2784 | | - | |
2785 | | - | |
| 2840 | + | |
| 2841 | + | |
| 2842 | + | |
2786 | 2843 | | |
2787 | 2844 | | |
2788 | 2845 | | |
| |||
0 commit comments