You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit ce66b83
Browse filesBrowse the repository at this point in the historyBrowse files
fix(qa): check-platform-checklist judges retired by its own rule, not the active one
statusFieldProblems had one branch for `planned`; every other status,
`retired` included, fell through to the active rule (`since` a release,
`steps` non-empty). A planned item retired before it was implemented -
`since: null`, no steps, exactly what the README's Retire step leaves it
with - therefore had no legal shape.
The retired branch judges by the README's Retire step: `retiredReason` a
non-empty string, `since` null or release-shaped, `steps` unjudged (no
selector runs a retired item). The walk's own `retiredReason` check moves
into the branch rather than being duplicated, so it now rides the call
site the binding pin already holds. The planned and active rules are
unchanged. Self-test: R1-R12 in the status battery, floor 42 -> 54.
Claude-Session: https://claude.ai/code/session_01CinRQcE6T8SvMbhH8D3NhS
Co-authored-by: Claude <noreply@anthropic.com>
problems.push('a retired item must carry "retiredReason" as a non-empty string');
207
+
}
208
+
if(!(item.since===null||isRelease)){
209
+
problems.push('"since" on a retired item must be null (retired before any release introduced it) or the release that did, e.g. "v16". ⛔ Only the SHAPE is checked here: this ledger holds no release timeline, so which of the two is true is an authoring fact no gate can see');
210
+
}
211
+
returnproblems;
212
+
}
213
+
190
214
if(!isRelease)problems.push('"since" must be the release that introduced the capability, e.g. "v16" or "v16.0"');
191
215
if(!hasSteps)problems.push('"steps" must be a non-empty array of strings');
192
216
returnproblems;
@@ -340,7 +364,7 @@ function statusBindingProblems(source) {
'the item walk does not consume `statusFieldProblems(item)` — every status-keyed field rule (a planned item\'s `since`/`steps`/`personas`, and the release-and-steps rules for every other status) is then declared and never applied',
367
+
'the item walk does not consume `statusFieldProblems(item)` — every status-keyed field rule (a planned item\'s `since`/`steps`/`personas`, a retired item\'s `retiredReason`/`since`, and the release-and-steps rules for active and draft) is then declared and never applied',
@@ -1030,7 +1054,7 @@ const BATTERY_UNREFERENCED_RECIPES = 'selfTestUnreferencedRecipes: the reverse d
1030
1054
constBATTERY_META_CALL_SPELLING='selfTestMetaCallSpelling: the folded `/meta` plural, read from the live contract';
1031
1055
constBATTERY_LINE_CITATION_BINDING='selfTestLineCitationBinding: the corpus declaration, the absent fork, and the binding driven both ways';
1032
1056
constBATTERY_SYMBOL_ANCHORS='selfTestSymbolAnchors: the corpus registration, the binding to the shared resolver, the residual and the floor';
1033
-
constBATTERY_PLANNED_STATUS='selfTestPlannedStatus: the `planned` accept set, the fields it relaxes, and the coverage ratchet driven BOTH ways';
1057
+
constBATTERY_PLANNED_STATUS='selfTestPlannedStatus: the `planned` accept set, the fields it relaxes, the `retired` rule beside it, and the coverage ratchet driven BOTH ways';
// ── the coverage ratchet, both directions ────────────────────────────────
2358
2410
// A miniature ledger: one kind's worth of ids, each with a status.
2359
2411
constLEDGER=newMap([
@@ -2547,7 +2599,8 @@ if (process.argv.slice(2).includes('--self-test')) {
2547
2599
' and the `/meta` call-spelling refusal reads its vocabulary out of the live generated contract, fires on every folded spelling a `call` can instruct, and stays silent on the canonical singular, on parameter placeholders, and on the `why`/`expect`/`source`/`requires` prose that narrates the fold;'+
2548
2600
' and the line-citation limb DETECTS NOTHING ITSELF EITHER: the last forked grammar in this file went into the shared core at #18592, so what is pinned here is the BINDING — the corpus declaring `pathlessLineCitations`, a source read finding no citation regex and no detector while the same read DOES find the declaration, the binding driven ON and OFF against ONE text so the green is the declaration working rather than a text that would have matched anyway, the DARK case that a citation both grammars already agreed on keeps its verdict either way, the refusal to over-fire on this ledger\'s own HTTP statuses, config literals, URL ports, clock times and quoted JSON, and the live zero with the control that says it is a reading;'+
2549
2601
' and the symbol-anchor limb DETECTS NOTHING AND RESOLVES NOTHING ITSELF: it is a registered corpus (#18107), so the grammar, the walk and the verdict are all `scripts/symbol-anchors.mjs`\'s, pinned here by a source read that finds no local extension set, no anchor regex and no detector while the same read DOES find the registration, by the anchorable-extension vocabulary being the shared OBJECT rather than a copy of it, by the `runs/` exclusion driven three ways on the live corpus (the subtree holds files, none is swept, the areas beside it still are, and dropping the exclusion puts them back), and by the #16898 binding re-taken through the registration — a call site / import / local parameter / string-substring all reading ABSENT, the positive control that a declaration and a complete quoted token still resolve, a `.json` key resolving where a `.json` value does not, an INLINE object-literal key reading absent where one at the start of a line resolves — with the closed, grow-never residual and the per-file anchor floor held in both directions beside it;'+
2550
-
` and the \`planned\` status is driven on fixtures — the accept set widened without losing its closure, \`since: null\`/no-steps/personas relaxed for planned alone while the ${plannedStatus.liveItems} live items are judged exactly as before, and the coverage ratchet held BOTH ways: a planned item beside an active one is silent, a kind whose only items are planned is UNMAPPED, and the bearing set is pinned NOT to contain \`planned\`; and the two CALL SITES those rules ride on are pinned by a source read over comment-MASKED source driven ON and OFF, because severing either one — by deletion OR by commenting it out in place — left this very self-test green; \u26d4 that pin is a TEXT pin and G12 records the three semantic severings it cannot see.`,
2602
+
` and the \`planned\` status is driven on fixtures — the accept set widened without losing its closure, \`since: null\`/no-steps/personas relaxed for planned alone while the ${plannedStatus.liveItems} live items are judged exactly as before, and the coverage ratchet held BOTH ways: a planned item beside an active one is silent, a kind whose only items are planned is UNMAPPED, and the bearing set is pinned NOT to contain \`planned\`; and the two CALL SITES those rules ride on are pinned by a source read over comment-MASKED source driven ON and OFF, because severing either one — by deletion OR by commenting it out in place — left this very self-test green; \u26d4 that pin is a TEXT pin and G12 records the three semantic severings it cannot see;`+
2603
+
' and the `retired` status is judged by its own rule, driven both ways \u2014 a non-empty `retiredReason`, `since` null or release-shaped, steps unjudged \u2014 so a planned item retired before it was implemented is legal, an item retired after it shipped stays legal, and a retired item with no reason or a non-release `since` is refused.',
2551
2604
);
2552
2605
process.exit(0);
2553
2606
}
@@ -2780,9 +2833,9 @@ for (const { file, stem, doc } of parsed) {
2780
2833
}
2781
2834
}
2782
2835
2783
-
if(item.status==='retired'){
2784
-
if(typeofitem.retiredReason!=='string'||!item.retiredReason)where('retired items must carry "retiredReason"');
2785
-
}else{
2836
+
// A retired item owes no acceptance clause; its `retiredReason` is judged
2837
+
// by `statusFieldProblems` above, with the rest of its status's rule.
0 commit comments