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 7599059
Browse filesBrowse the repository at this point in the historyBrowse files
fix(pm): H9's issue-ref class requires the reference at the declaration position
`classifyRestartWhen`'s `issue-ref` step tested `/#\d+\b/` — an issue
reference the value CARRIES anywhere — so a `Restart-when:` value that
merely mentions a card mid-sentence read as a machine-fireable exit. On the
2026-09-11 census of the 104 open `pm:on-hold` cards that cleared four holds
whose value actually names a tracked repo path (a misfiled `Restart-touch:`
line), because each mentions an unrelated issue number in passing.
The step now tests the DECLARATION POSITION: the value must START with `#N`
or `owner/repo#N`, after the same leading decoration `partOfDeclarationRe`
tolerates. That is H9's own advertised spelling (`Restart-when: #N rules on
X`) read literally, so it costs no ruling and the class ORDER is untouched.
A mid-sentence mention falls through to `command` / `tracked-path` / `prose`
and fires the row its real shape earns.
The `prose` row's remedy follows: a value that mentions a card without
declaring one is now prescribed the declaration beside the generic "mark it
`manual` or name the event", because an author who wrote a number down was
not missing an event — they wrote it where nothing reads.
Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MCLBsUgfykL74aU716rzVK
t('H9 class: #8753 — a mid-sentence mention is not an exit', classifyRestartWhen(v8753, censusTracked), 'tracked-path');
20716
+
t('H9 class: #8607 — same, the gate family it names is tracked', classifyRestartWhen(v8607, censusTracked), 'tracked-path');
20717
+
t('H9 class: #8589 — same, and the mention sits after the path', classifyRestartWhen(v8589, censusTracked), 'tracked-path');
20718
+
t('H9 class: #6009 — same, on a cross-repo `cloud#N` mention', classifyRestartWhen(v6009, censusTracked), 'tracked-path');
20719
+
// The other direction: with no oracle the same four collapse into `prose` —
20720
+
// same verdict, the less specific row — which is what the wide form's
20721
+
// false-clean was hiding in BOTH oracle states.
20722
+
t('H9 class: #8753 with no oracle is prose, never fireable', classifyRestartWhen(v8753), 'prose');
20723
+
t('H9 class: #8607 with no oracle is prose, never fireable', classifyRestartWhen(v8607), 'prose');
20724
+
t('H9 class: #8589 with no oracle is prose, never fireable', classifyRestartWhen(v8589), 'prose');
20725
+
t('H9 class: #6009 with no oracle is prose, never fireable', classifyRestartWhen(v6009), 'prose');
20726
+
// ⛔ And the narrowing does NOT reach a value that DECLARES its reference —
20727
+
// the advertised spelling, read literally, in both its forms.
20728
+
t('H9 class: #13718 declares its reference first -> still `issue-ref`', classifyRestartWhen(v13718, censusTracked), 'issue-ref');
20729
+
t('H9 class: #3267 declares a cross-repo one -> still `issue-ref`', classifyRestartWhen(v3267, censusTracked), 'issue-ref');
20730
+
t('H9 class: …and the decoration a declaration may carry is the `Part of` one', classifyRestartWhen('> **#13651** rules on it'), 'issue-ref');
20731
+
t('H9 class: a bare single-segment qualifier is a path segment, not a repo', classifyRestartWhen('cloud#861 is scheduled'), 'prose');
20732
+
// The four are H9 ROWS now, each prescribing the rewrite its class names.
20733
+
t('H9: #8753 is a finding, not a legal hold', typeof h9OnHoldNoRestartWhen(hold(`Restart-when: ${v8753}`), undefined, censusTracked), 'string');
20734
+
t('H9: …and the row names the tracked path it misfiled', h9row(hold(`Restart-when: ${v8753}`), undefined, censusTracked).includes('`packages/objectql/src/registry.ts`'), true);
20735
+
t('H9: …and prescribes the `Restart-touch:` rewrite', h9row(hold(`Restart-when: ${v8753}`), undefined, censusTracked).includes('Rewrite the line as `Restart-touch: <path>`'), true);
20736
+
t('H9: #13718 stays clean — a declaration is an exit', h9OnHoldNoRestartWhen(hold(`Restart-when: ${v13718}`), undefined, censusTracked), null);
// The prose row's remedy follows the value: a MENTION gets the declaration
20739
+
// prescribed, a value with no reference at all keeps the #10102 sentence.
20740
+
const mentionProse = 'the design session rules the question below, with #5493 context on the table';
20741
+
t('H9: a prose value that MENTIONS a card is prose', classifyRestartWhen(mentionProse, censusTracked), 'prose');
20742
+
t('H9: …and its row prescribes the DECLARATION', h9row(hold(`Restart-when: ${mentionProse}`), undefined, censusTracked).includes('declare it: `Restart-when: #N rules on X`'), true);
20743
+
t('H9: …saying in as many words that a mention is not an exit', h9row(hold(`Restart-when: ${mentionProse}`), undefined, censusTracked).includes('MENTIONS an issue reference mid-sentence'), true);
20744
+
t('H9: …while still naming the event as the other branch', h9row(hold(`Restart-when: ${mentionProse}`), undefined, censusTracked).includes('mark it `manual` or name the event'), true);
20745
+
t('H9: a reference-free prose value does NOT gain the clause', h9row(h3739, undefined, h9Tracked).includes('declare it: `Restart-when: #N rules on X`'), false);
20746
+
t('H9: …and keeps the #10102 sentence verbatim', h9row(h3739, undefined, h9Tracked).includes('Mark it `manual` or name the event'), true);
20747
+
// ⛔ The class ORDER is untouched — B was never the instrument (#17605).
20748
+
t('H9 class: the fireable set is STILL exactly the three', FIREABLE_RESTART_WHEN_CLASSES.join('|'), 'closed-ref|issue-ref|command');
20749
+
20601
20750
// -- H10: stale unclaimed p0 (routing-gap backstop) -------------------------
20602
20751
const NOW = Date.parse('2026-08-16T12:00:00Z');
20603
20752
const hoursAgo = (h) => new Date(NOW - h * 3_600_000).toISOString();
0 commit comments