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 b05ffb6
Browse filesBrowse the repository at this point in the historyBrowse files
fix(pm): pin the handover sentence by shape, not by a governed read of SKILL.md
A self-test that reads SKILL.md makes check:pm-clause2-carriers a derived
family of that file (check:pm-dispatch-gates' governed-read census reds on
the unclassified read). The byte identity with SKILL.md is the twin rule's,
checked at review; the self-test keeps the shape pin.
Claude-Session: https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi
Co-authored-by: Claude <noreply@anthropic.com>
@@ -9525,7 +9527,7 @@ export async function selfTest() {
9525
9527
t('⛔ the ONE red kept: a cross-login `Claim:` with NO `Release:` at all for the earlier claim is still C9', claimHandovers([X62_HOLDER_S, X62(7200000032, X62_AFTER2, 'seat-taker', ['Claim: jump', 'Branch: `claude/issue-4343-first`', 'Clause-②: no'])])?.judged === true);
9526
9528
t('⛔ a handover that names only ONE of two live claims leaves the other standing — every live claim on the thread is named, or the row stays', claimHandovers([X62_HOLDER_S, X62_THIRD_S, X62_HO])?.judged === true && says(X62_ROW([X62_HOLDER_S, X62_THIRD_S, X62_HO]), '7200000033'));
9527
9529
t('…the remedy is SKILL.md\'s handover sentence, verbatim — the four items, the 出处三件 source line, 让先到者 for a yield', says(X62_ROW([X62_HOLDER, X62_TAKER_AFTER]), CLAIM_HANDOVER_SENTENCE_LINES.join(' ')) && says(X62_ROW([X62_HOLDER, X62_TAKER_AFTER]), HANDOVER_PROVENANCE_SOURCE) && says(X62_ROW([X62_HOLDER, X62_TAKER_AFTER]), '让先到者'));
9528
-
t('⭐ …and those lines ARE SKILL.md\'s, byte for byte, one bullet each, beside the 出处三件 line — the two texts are ONE sentence', (() => { const skill = readFileSync(new URL('../../.claude/skills/pm-dispatch/SKILL.md', import.meta.url), 'utf8').split('\n'); return CLAIM_HANDOVER_SENTENCE_LINES.every((l) => skill.includes(`- ${l}`)) && skill.includes(`- ${HANDOVER_PROVENANCE_SOURCE}`); })());
9530
+
t('…and each of those lines is one SKILL.md bullet by shape — within the 120-byte line budget, no bullet, no issue id — so the twin can be pasted back byte for byte (the byte identity itself is the twin rule\'s, checked at review: a governed read from this self-test would make this gate a derived family of SKILL.md)', CLAIM_HANDOVER_SENTENCE_LINES.every((l) => Buffer.byteLength(`- ${l}`, 'utf8') <= 120 && !/^[-*] /.test(l) && !/#[0-9]{3,}/.test(l)) && Buffer.byteLength(`- ${HANDOVER_PROVENANCE_SOURCE}`, 'utf8') <= 120);
9529
9531
9530
9532
// (e) same-author and mixed threads — C8 and C9 are disjoint states.
0 commit comments