Skip to content

Commit 87fa4c8

Browse files
committed
fix(pm): H44's timestamp leg accepts an ISO instant whose hour follows a T
`H44_READING_TIMESTAMP` anchored the hour with a bare word boundary, which needs a NON-word character in front of it. The `T` of an ISO instant is a word character, so `2026-09-15T14:51Z` read false — and so did `2026-03T00:21Z`, the spelling the 2026-09-02 ruling itself gives. A reading that DID carry its 取数时刻 in the ruled minute form was reported as untimestamped: a false positive on the row's own subject. A seconds stamp passed only by accident, the boundary holding before its `mm:ssZ` tail so the match began at the minutes. The left anchor now names one further predecessor — the ISO `T`, looked BEHIND rather than consumed, so a match is still exactly the stamp. Nothing else is admitted: the boundary is kept (a clock inside a longer digit run is still not a stamp), no other letter opens one, and only the uppercase `T` the ruling spells. Strictly more paragraphs read clean, so the row can only get quieter. Self-test 4235 -> 4243 cases: the two ISO spellings that read false, a pin on where the seconds match STARTS (the fix, not the accident), three declared negatives, and the H44 marker case re-pinned to MINUTES with the seconds spelling kept beside it — the comment saying that limit existed is rewritten, because the limit is gone. Claude-Session: https://claude.ai/code/session_01HZfg2AwVX191qCizp88gQr Co-authored-by: Claude <noreply@anthropic.com>
1 parent a46cd8c commit 87fa4c8

1 file changed

Lines changed: 50 additions & 6 deletions

File tree

‎scripts/pm/check-half-states.mjs‎

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9636,8 +9636,34 @@ export function h43GovernedReviewRequestGap(pr, governed, approvers, reviewed =
96369636
/**
96379637
* The timestamp that makes a paragraph clean. See narrowing 1 in the banner —
96389638
* the seconds field is optional so a full ISO stamp counts as the rule obeyed.
9639+
*
9640+
* ⚠️ The left anchor is a word boundary OR a literal `T`, and that alternation
9641+
* is the whole of #18323. A bare `\b` needs a NON-word character before the
9642+
* hour and the `T` of an ISO instant is a word character, so
9643+
* `2026-09-15T14:51Z` read FALSE — and so did `2026-03T00:21Z`, the spelling
9644+
* the 2026-09-02 ruling itself gives. A reading that DID carry its 取数时刻 in
9645+
* the ruled minute form was therefore reported as untimestamped: a false
9646+
* positive on this row's own subject. A seconds stamp escaped only by
9647+
* ACCIDENT, its match starting at the minutes of the `mm:ssZ` tail, which is
9648+
* why the pin below reads where the match BEGINS and not merely that it exists.
9649+
*
9650+
* The `T` branch is the one predecessor the ISO form needs, it looks BEHIND
9651+
* rather than consuming — so a match is still exactly the stamp and a reader
9652+
* echoing one gets no stray designator — and it is the only thing admitted:
9653+
*
9654+
* • ⛔ The boundary is NOT dropped. `12314:51Z` is a digit run that merely
9655+
* contains a clock, never a stamp, and it still reads false — that is what
9656+
* the boundary was there for and it is kept.
9657+
* • ⛔ Nor widened to any letter: `abc14:51Z` stays false. The ISO
9658+
* designator is the only predecessor measured on this board.
9659+
* • ⛔ And only the UPPERCASE `T` the ruling spells. RFC 3339's lowercase
9660+
* `t` is legal and absent from this corpus; admitting it is one
9661+
* measurement away, not a guess.
9662+
*
9663+
* Like every narrowing in the banner this admits strictly MORE paragraphs as
9664+
* clean, so it can only make the row QUIETER — it cannot manufacture a finding.
96399665
*/
9640-
export const H44_READING_TIMESTAMP = /\b\d{2}:\d{2}(?::\d{2})?Z\b/;
9666+
export const H44_READING_TIMESTAMP = /(?:\b|(?<=T))\d{2}:\d{2}(?::\d{2})?Z\b/;
96419667

96429668
/**
96439669
* The reading grammar, as data so the self-test can drive every shape by name
@@ -28900,6 +28926,21 @@ Mutual exclusion: \`get_comments\` page 747 → \`[]\`, page 746 = my own R+117
2890028926
t('H44 grammar: the timestamp accepts the ruled HH:MMZ', H44_READING_TIMESTAMP.test('19:38Z'), true);
2890128927
t('H44 grammar: …and the seconds field, which is the same rule obeyed harder', H44_READING_TIMESTAMP.test('2026-09-03T10:37:51Z'), true);
2890228928
t('H44 grammar: …but not a bare clock with no zone', H44_READING_TIMESTAMP.test('19:38'), false);
28929+
// ⭐ The ISO instant (#18323). Both of these read FALSE before that change —
28930+
// the second is the spelling the 2026-09-02 ruling itself gives — because the
28931+
// hour sat behind a `T`, which is a word character and so no boundary.
28932+
t('H44 grammar: ⭐ …and an ISO instant whose hour follows the `T`', H44_READING_TIMESTAMP.test('2026-09-15T14:51Z'), true);
28933+
t('H44 grammar: …including the ruling\'s own spelling, which read false against its own rule', H44_READING_TIMESTAMP.test('2026-03T00:21Z'), true);
28934+
// ⛔ The seconds form always passed — by ACCIDENT, the boundary holding before
28935+
// its `mm:ssZ` tail so the match began at the MINUTES. Pinning where the match
28936+
// STARTS is what tells the fix apart from the accident it replaces.
28937+
t('H44 grammar: the seconds stamp now matches from its HOUR, not from its `mm:ssZ` tail', '2026-09-15T14:51:42Z'.match(H44_READING_TIMESTAMP)[0], '14:51:42Z');
28938+
// ⛔ THE DECLARED NEGATIVES of the new anchor: it names one predecessor and
28939+
// does not drop the boundary.
28940+
t('H44 grammar: ⛔ a clock inside a longer digit run is not a stamp', H44_READING_TIMESTAMP.test('12314:51Z'), false);
28941+
t('H44 grammar: ⛔ nor does any other letter open one — only the ISO `T`', H44_READING_TIMESTAMP.test('abc14:51Z'), false);
28942+
t('H44 grammar: ⛔ and only the UPPERCASE `T` the ruling spells', H44_READING_TIMESTAMP.test('2026-09-15t14:51Z'), false);
28943+
t('H44 grammar: an ISO instant still needs its zone, exactly as a bare clock does', H44_READING_TIMESTAMP.test('2026-09-15T14:51'), false);
2890328944
t('H44 fences: an unterminated fence swallows to the end rather than reopening', h44StripFences('a\n```\n92 open cards').trim(), 'a');
2890428945

2890528946
// ⑨ The row sentence: it names the comment, the fragment, and its posture.
@@ -28989,11 +29030,14 @@ Doubles as the fire's **write self-check** (step 0). \`201\` is not the reading.
2898929030
t('H44 marker: ⭐ what it reports on that body is the untimestamped CHARTER reading', h44kind(MARKER_R236_18312, true), 'tree');
2899029031
t('H44 marker: …echoed verbatim, so the remedy is one edit of a known artefact', h44frag(MARKER_R236_18312, true), '827cacbf');
2899129032
t('H44 marker: …under the marker\'s own name rather than the carrier\'s', h44hit(MARKER_R236_18312, true).shape, 'a round-open marker');
28992-
// ⚠️ The stamp here is spelled to SECONDS deliberately: `H44_READING_TIMESTAMP`
28993-
// requires a word boundary before the hour, which a preceding `T` does not
28994-
// give, so a minute-precision ISO stamp does not clean a paragraph. That is
28995-
// this row's own reading and ⛔ not this card's to change — it is filed.
28996-
t('H44 marker: ⛔ and it stays SILENT on the same marker once the reading carries its stamp', h44hit(MARKER_R236_18312.replace('tip `827cacbf`)', 'tip `827cacbf`, read 2026-09-15T14:51:42Z)'), true), null);
29033+
// ⭐ The stamp here is spelled to MINUTES — the ruled form — because the limit
29034+
// that forced SECONDS is gone (#18323). `H44_READING_TIMESTAMP` used to need a
29035+
// non-word character before the hour, which a preceding `T` is not, so a
29036+
// minute-precision ISO stamp did not clean a paragraph and this case bought its
29037+
// silence with a precision the ruling never asked for. The seconds spelling is
29038+
// pinned beside it, so neither reading can regress alone.
29039+
t('H44 marker: ⛔ and it stays SILENT on the same marker once the reading carries its stamp', h44hit(MARKER_R236_18312.replace('tip `827cacbf`)', 'tip `827cacbf`, read 2026-09-15T14:51Z)'), true), null);
29040+
t('H44 marker: …and the SECONDS spelling of the same reading is silent too', h44hit(MARKER_R236_18312.replace('tip `827cacbf`)', 'tip `827cacbf`, read 2026-09-15T14:51:42Z)'), true), null);
2899729041
t('H44 marker: ⛔ a comment that QUOTES a marker deeper down is not one — H65\'s headline control', h44IsRoundOpenMarker('A note about last round.\n\n**Round-open marker** · triage seat · **R+235**'), false);
2899829042
t('H44 marker: …and such a comment off a seat post stays out of scope entirely', h44hit('A note about last round.\n\n**Round-open marker** · triage seat · tip `827cacbf`'), null);
2899929043
// ⭐ ONE declaration of the spellings: H44 reads H65's grammar rather than

0 commit comments

Comments
 (0)