Skip to content

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass - #13948

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule
Sep 1, 2026
Merged

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass#13948
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13730
Fixes#13792

Governed surface (.claude/**) — draft only. Do not flip ready, do not arm auto-merge, do not queue. Human merge, per Prime Directive #14.

What lands

Six lines in .claude/skills/pm-dispatch/references/dispatch-runbook.md, inside its ## 落卡与裁决记录细则 section, directly after the ruling-record atomic-four supplement they constrain. The rule:

A write that takes a card out ofneeds-user-decision must carry a comment id — a director-ledger entry or the card's own ruling comment — and that id must have been FETCHED in the same pass. A timestamp plus a recollection is not a citation, and the presence of an id is not retrievability. Reader side is symmetric: a decision re-read that hits a box exit with no retrievable id treats the card as unruled — same-write flip back, no dispatch — and the conclusion stays on verifiability, asserting no cause.

Two carriers are legal because the ruling of 2026-08-31 on the ruling-durability question made the director seat's per-session ledger table the record of a ruling's existence, with the card comment as elaboration. The rule text names both, so it does not fork from that ruling.

Why the criterion is "fetched", not "an id is present"

Both failure shapes were measured on this card's own evidence run, and a presence-only criterion passes both:

  • A real id that is gone. Thirteen cards from the 2026-08-29 adjudication batch carry citations of their own ruling comment, written by a different account while the comment was still readable — several quoting it verbatim. Every one of those ids returns HTTP 404 today, in both repositories.
  • An id that never existed. One seat wrote a ruling permalink into a clause-② line and then corrected itself: "That id is invented".

Fetching the id in the same pass is the one check that separates a ruling on record from a recollection, and it is machine-checkable in principle — deliberately not 「请仔细核对」, which is measured dead.

The second member (#13792) is delivered as a comment, not as a diff

The bound reconciliation deliverable — an 在案 / 不在案 list for the director ledger's 第 3 场 claim of 58 per-card ruling comments — is posted on #13792 as comment #13792 (comment). Summary of that reading, which is also the evidence base for the rule text above:

readingresult
the claimed batch, identified58 decision-box exits, 2026-08-29T01:31:17Z–02:17:58Z, one actor, objectstack 35 + objectui 23, clustering into exactly 12 bursts of 5 = 批 #1#12, containing all seven cards the ledger names
状态转换58 / 58 在案 (label-event pairs, which survive comment deletion)
逐卡录裁评论0 / 58 retrievable today
of those13 曾在案、现不可取回 (cited by later comments, 404 now) · 45 with no citation at all
positive control, same query, later sessions08-30: 19/30 and 14/15 · 08-31: 44/48 and 13/15 — so the zero is a reading, not a broken query

⛔ The ledger issue itself is not edited by this PR: the checkable list exists first, and the correction is the director seat's act on that evidence. ⛔ No cause is asserted for the missing comments.

Placement — and the option deliberately left open

references/state-machine.md is arguably the better home by readership (its own 出处 line says it is consulted at the moment of a transition, and a box exit is a transition). It is not used here, and the reason is measured rather than aesthetic: that file stands at 44 lines against a ceiling of 44, and so do decision-analysis.md (46/46) and lanes/director.md (77/77). Inserting the rule there turns check:pm-skill-ratchet red, and raising a ceiling requires a maintainer ruling quoted in the raising PR — a decision on the human floor, which this seat does not make.

Non-blocking, for the maintainer's discretion later: moving this rule to references/state-machine.md would cost a +N ceiling raise on that file. Nothing here depends on it; the runbook's ruling-record section is a correct home, and it is where the mechanical flag for "thread contains a ruling record but the card still carries needs-user-decision" already lives.

dispatch-runbook.md absorbs the six lines inside its existing budget: 271 lines against a ceiling of 278 (headroom 7 remains). No ratchet raise, no gate edit, no changeset (a .claude/**-only diff publishes nothing).

Verification

Gate union derived on this branch's own head — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, no stale-tree warning — and every family run at head 6ddc73e:

EXIT=0 :: pnpm check:agent-test-spelling
EXIT=0 :: pnpm check:doc-authoring
EXIT=0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions
EXIT=0 :: pnpm check:pm-governed-merges
EXIT=0 :: pnpm check:pm-skill-id-lint
EXIT=0 :: pnpm check:pm-skill-ratchet
EXIT=0 :: pnpm check:skill-frame-sync

check:pm-skill-ratchet's own verdict line for the touched file: "references/dispatch-runbook.md is 271 lines (ceiling 278; headroom 7)". Two of those gates first reported PREREQUISITE NOT MET rather than a failure (@objectstack/formula and @objectstack/lint unbuilt in a fresh worktree); both were built and re-run, and the greens above are the post-build readings. Every new line measures at most 120 bytes, wrapped by the ratchet's own exported wrapLine.

Out of scope, recorded not expanded

Generated by Claude Code


Generated by Claude Code

… id it fetched in the same pass
The restore-citation rule lands in the ruling-record section of the dispatch
runbook, beside the atomic-four supplement it constrains: a write that takes a
card out of `needs-user-decision` must carry a comment id — a director-ledger
entry or the card's own ruling comment — and that id must have been FETCHED in
the same pass. Presence of an id is not retrievability: measured this round,
thirteen ruling ids quoted verbatim by later comments return 404 today, and one
seat self-corrected a ruling permalink it had invented. Reader side is
symmetric: a decision re-read that hits a box exit with no retrievable id
treats the card as unruled — same-write flip back, no dispatch — and the
conclusion stays on verifiability, asserting no cause.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 31, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 23:59
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 9e4a2d0Sep 1, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13730-restore-citation-rule branch September 1, 2026 00:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass by claude[bot] · Pull Request #13948 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass - #13948

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule
Sep 1, 2026
Merged

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass#13948
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13730
Fixes#13792

Governed surface (.claude/**) — draft only. Do not flip ready, do not arm auto-merge, do not queue. Human merge, per Prime Directive #14.

What lands

Six lines in .claude/skills/pm-dispatch/references/dispatch-runbook.md, inside its ## 落卡与裁决记录细则 section, directly after the ruling-record atomic-four supplement they constrain. The rule:

A write that takes a card out ofneeds-user-decision must carry a comment id — a director-ledger entry or the card's own ruling comment — and that id must have been FETCHED in the same pass. A timestamp plus a recollection is not a citation, and the presence of an id is not retrievability. Reader side is symmetric: a decision re-read that hits a box exit with no retrievable id treats the card as unruled — same-write flip back, no dispatch — and the conclusion stays on verifiability, asserting no cause.

Two carriers are legal because the ruling of 2026-08-31 on the ruling-durability question made the director seat's per-session ledger table the record of a ruling's existence, with the card comment as elaboration. The rule text names both, so it does not fork from that ruling.

Why the criterion is "fetched", not "an id is present"

Both failure shapes were measured on this card's own evidence run, and a presence-only criterion passes both:

  • A real id that is gone. Thirteen cards from the 2026-08-29 adjudication batch carry citations of their own ruling comment, written by a different account while the comment was still readable — several quoting it verbatim. Every one of those ids returns HTTP 404 today, in both repositories.
  • An id that never existed. One seat wrote a ruling permalink into a clause-② line and then corrected itself: "That id is invented".

Fetching the id in the same pass is the one check that separates a ruling on record from a recollection, and it is machine-checkable in principle — deliberately not 「请仔细核对」, which is measured dead.

The second member (#13792) is delivered as a comment, not as a diff

The bound reconciliation deliverable — an 在案 / 不在案 list for the director ledger's 第 3 场 claim of 58 per-card ruling comments — is posted on #13792 as comment #13792 (comment). Summary of that reading, which is also the evidence base for the rule text above:

readingresult
the claimed batch, identified58 decision-box exits, 2026-08-29T01:31:17Z–02:17:58Z, one actor, objectstack 35 + objectui 23, clustering into exactly 12 bursts of 5 = 批 #1#12, containing all seven cards the ledger names
状态转换58 / 58 在案 (label-event pairs, which survive comment deletion)
逐卡录裁评论0 / 58 retrievable today
of those13 曾在案、现不可取回 (cited by later comments, 404 now) · 45 with no citation at all
positive control, same query, later sessions08-30: 19/30 and 14/15 · 08-31: 44/48 and 13/15 — so the zero is a reading, not a broken query

⛔ The ledger issue itself is not edited by this PR: the checkable list exists first, and the correction is the director seat's act on that evidence. ⛔ No cause is asserted for the missing comments.

Placement — and the option deliberately left open

references/state-machine.md is arguably the better home by readership (its own 出处 line says it is consulted at the moment of a transition, and a box exit is a transition). It is not used here, and the reason is measured rather than aesthetic: that file stands at 44 lines against a ceiling of 44, and so do decision-analysis.md (46/46) and lanes/director.md (77/77). Inserting the rule there turns check:pm-skill-ratchet red, and raising a ceiling requires a maintainer ruling quoted in the raising PR — a decision on the human floor, which this seat does not make.

Non-blocking, for the maintainer's discretion later: moving this rule to references/state-machine.md would cost a +N ceiling raise on that file. Nothing here depends on it; the runbook's ruling-record section is a correct home, and it is where the mechanical flag for "thread contains a ruling record but the card still carries needs-user-decision" already lives.

dispatch-runbook.md absorbs the six lines inside its existing budget: 271 lines against a ceiling of 278 (headroom 7 remains). No ratchet raise, no gate edit, no changeset (a .claude/**-only diff publishes nothing).

Verification

Gate union derived on this branch's own head — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, no stale-tree warning — and every family run at head 6ddc73e:

EXIT=0 :: pnpm check:agent-test-spelling
EXIT=0 :: pnpm check:doc-authoring
EXIT=0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions
EXIT=0 :: pnpm check:pm-governed-merges
EXIT=0 :: pnpm check:pm-skill-id-lint
EXIT=0 :: pnpm check:pm-skill-ratchet
EXIT=0 :: pnpm check:skill-frame-sync

check:pm-skill-ratchet's own verdict line for the touched file: "references/dispatch-runbook.md is 271 lines (ceiling 278; headroom 7)". Two of those gates first reported PREREQUISITE NOT MET rather than a failure (@objectstack/formula and @objectstack/lint unbuilt in a fresh worktree); both were built and re-run, and the greens above are the post-build readings. Every new line measures at most 120 bytes, wrapped by the ratchet's own exported wrapLine.

Out of scope, recorded not expanded

Generated by Claude Code


Generated by Claude Code

… id it fetched in the same pass
The restore-citation rule lands in the ruling-record section of the dispatch
runbook, beside the atomic-four supplement it constrains: a write that takes a
card out of `needs-user-decision` must carry a comment id — a director-ledger
entry or the card's own ruling comment — and that id must have been FETCHED in
the same pass. Presence of an id is not retrievability: measured this round,
thirteen ruling ids quoted verbatim by later comments return 404 today, and one
seat self-corrected a ruling permalink it had invented. Reader side is
symmetric: a decision re-read that hits a box exit with no retrievable id
treats the card as unruled — same-write flip back, no dispatch — and the
conclusion stays on verifiability, asserting no cause.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 31, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 23:59
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 9e4a2d0Sep 1, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13730-restore-citation-rule branch September 1, 2026 00:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass by claude[bot] · Pull Request #13948 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass - #13948

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule
Sep 1, 2026
Merged

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass#13948
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13730
Fixes#13792

Governed surface (.claude/**) — draft only. Do not flip ready, do not arm auto-merge, do not queue. Human merge, per Prime Directive #14.

What lands

Six lines in .claude/skills/pm-dispatch/references/dispatch-runbook.md, inside its ## 落卡与裁决记录细则 section, directly after the ruling-record atomic-four supplement they constrain. The rule:

A write that takes a card out ofneeds-user-decision must carry a comment id — a director-ledger entry or the card's own ruling comment — and that id must have been FETCHED in the same pass. A timestamp plus a recollection is not a citation, and the presence of an id is not retrievability. Reader side is symmetric: a decision re-read that hits a box exit with no retrievable id treats the card as unruled — same-write flip back, no dispatch — and the conclusion stays on verifiability, asserting no cause.

Two carriers are legal because the ruling of 2026-08-31 on the ruling-durability question made the director seat's per-session ledger table the record of a ruling's existence, with the card comment as elaboration. The rule text names both, so it does not fork from that ruling.

Why the criterion is "fetched", not "an id is present"

Both failure shapes were measured on this card's own evidence run, and a presence-only criterion passes both:

  • A real id that is gone. Thirteen cards from the 2026-08-29 adjudication batch carry citations of their own ruling comment, written by a different account while the comment was still readable — several quoting it verbatim. Every one of those ids returns HTTP 404 today, in both repositories.
  • An id that never existed. One seat wrote a ruling permalink into a clause-② line and then corrected itself: "That id is invented".

Fetching the id in the same pass is the one check that separates a ruling on record from a recollection, and it is machine-checkable in principle — deliberately not 「请仔细核对」, which is measured dead.

The second member (#13792) is delivered as a comment, not as a diff

The bound reconciliation deliverable — an 在案 / 不在案 list for the director ledger's 第 3 场 claim of 58 per-card ruling comments — is posted on #13792 as comment #13792 (comment). Summary of that reading, which is also the evidence base for the rule text above:

readingresult
the claimed batch, identified58 decision-box exits, 2026-08-29T01:31:17Z–02:17:58Z, one actor, objectstack 35 + objectui 23, clustering into exactly 12 bursts of 5 = 批 #1#12, containing all seven cards the ledger names
状态转换58 / 58 在案 (label-event pairs, which survive comment deletion)
逐卡录裁评论0 / 58 retrievable today
of those13 曾在案、现不可取回 (cited by later comments, 404 now) · 45 with no citation at all
positive control, same query, later sessions08-30: 19/30 and 14/15 · 08-31: 44/48 and 13/15 — so the zero is a reading, not a broken query

⛔ The ledger issue itself is not edited by this PR: the checkable list exists first, and the correction is the director seat's act on that evidence. ⛔ No cause is asserted for the missing comments.

Placement — and the option deliberately left open

references/state-machine.md is arguably the better home by readership (its own 出处 line says it is consulted at the moment of a transition, and a box exit is a transition). It is not used here, and the reason is measured rather than aesthetic: that file stands at 44 lines against a ceiling of 44, and so do decision-analysis.md (46/46) and lanes/director.md (77/77). Inserting the rule there turns check:pm-skill-ratchet red, and raising a ceiling requires a maintainer ruling quoted in the raising PR — a decision on the human floor, which this seat does not make.

Non-blocking, for the maintainer's discretion later: moving this rule to references/state-machine.md would cost a +N ceiling raise on that file. Nothing here depends on it; the runbook's ruling-record section is a correct home, and it is where the mechanical flag for "thread contains a ruling record but the card still carries needs-user-decision" already lives.

dispatch-runbook.md absorbs the six lines inside its existing budget: 271 lines against a ceiling of 278 (headroom 7 remains). No ratchet raise, no gate edit, no changeset (a .claude/**-only diff publishes nothing).

Verification

Gate union derived on this branch's own head — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, no stale-tree warning — and every family run at head 6ddc73e:

EXIT=0 :: pnpm check:agent-test-spelling
EXIT=0 :: pnpm check:doc-authoring
EXIT=0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions
EXIT=0 :: pnpm check:pm-governed-merges
EXIT=0 :: pnpm check:pm-skill-id-lint
EXIT=0 :: pnpm check:pm-skill-ratchet
EXIT=0 :: pnpm check:skill-frame-sync

check:pm-skill-ratchet's own verdict line for the touched file: "references/dispatch-runbook.md is 271 lines (ceiling 278; headroom 7)". Two of those gates first reported PREREQUISITE NOT MET rather than a failure (@objectstack/formula and @objectstack/lint unbuilt in a fresh worktree); both were built and re-run, and the greens above are the post-build readings. Every new line measures at most 120 bytes, wrapped by the ratchet's own exported wrapLine.

Out of scope, recorded not expanded

Generated by Claude Code


Generated by Claude Code

… id it fetched in the same pass
The restore-citation rule lands in the ruling-record section of the dispatch
runbook, beside the atomic-four supplement it constrains: a write that takes a
card out of `needs-user-decision` must carry a comment id — a director-ledger
entry or the card's own ruling comment — and that id must have been FETCHED in
the same pass. Presence of an id is not retrievability: measured this round,
thirteen ruling ids quoted verbatim by later comments return 404 today, and one
seat self-corrected a ruling permalink it had invented. Reader side is
symmetric: a decision re-read that hits a box exit with no retrievable id
treats the card as unruled — same-write flip back, no dispatch — and the
conclusion stays on verifiability, asserting no cause.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 31, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 23:59
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 9e4a2d0Sep 1, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13730-restore-citation-rule branch September 1, 2026 00:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass by claude[bot] · Pull Request #13948 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass - #13948

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule
Sep 1, 2026
Merged

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass#13948
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13730
Fixes#13792

Governed surface (.claude/**) — draft only. Do not flip ready, do not arm auto-merge, do not queue. Human merge, per Prime Directive #14.

What lands

Six lines in .claude/skills/pm-dispatch/references/dispatch-runbook.md, inside its ## 落卡与裁决记录细则 section, directly after the ruling-record atomic-four supplement they constrain. The rule:

A write that takes a card out ofneeds-user-decision must carry a comment id — a director-ledger entry or the card's own ruling comment — and that id must have been FETCHED in the same pass. A timestamp plus a recollection is not a citation, and the presence of an id is not retrievability. Reader side is symmetric: a decision re-read that hits a box exit with no retrievable id treats the card as unruled — same-write flip back, no dispatch — and the conclusion stays on verifiability, asserting no cause.

Two carriers are legal because the ruling of 2026-08-31 on the ruling-durability question made the director seat's per-session ledger table the record of a ruling's existence, with the card comment as elaboration. The rule text names both, so it does not fork from that ruling.

Why the criterion is "fetched", not "an id is present"

Both failure shapes were measured on this card's own evidence run, and a presence-only criterion passes both:

  • A real id that is gone. Thirteen cards from the 2026-08-29 adjudication batch carry citations of their own ruling comment, written by a different account while the comment was still readable — several quoting it verbatim. Every one of those ids returns HTTP 404 today, in both repositories.
  • An id that never existed. One seat wrote a ruling permalink into a clause-② line and then corrected itself: "That id is invented".

Fetching the id in the same pass is the one check that separates a ruling on record from a recollection, and it is machine-checkable in principle — deliberately not 「请仔细核对」, which is measured dead.

The second member (#13792) is delivered as a comment, not as a diff

The bound reconciliation deliverable — an 在案 / 不在案 list for the director ledger's 第 3 场 claim of 58 per-card ruling comments — is posted on #13792 as comment #13792 (comment). Summary of that reading, which is also the evidence base for the rule text above:

readingresult
the claimed batch, identified58 decision-box exits, 2026-08-29T01:31:17Z–02:17:58Z, one actor, objectstack 35 + objectui 23, clustering into exactly 12 bursts of 5 = 批 #1#12, containing all seven cards the ledger names
状态转换58 / 58 在案 (label-event pairs, which survive comment deletion)
逐卡录裁评论0 / 58 retrievable today
of those13 曾在案、现不可取回 (cited by later comments, 404 now) · 45 with no citation at all
positive control, same query, later sessions08-30: 19/30 and 14/15 · 08-31: 44/48 and 13/15 — so the zero is a reading, not a broken query

⛔ The ledger issue itself is not edited by this PR: the checkable list exists first, and the correction is the director seat's act on that evidence. ⛔ No cause is asserted for the missing comments.

Placement — and the option deliberately left open

references/state-machine.md is arguably the better home by readership (its own 出处 line says it is consulted at the moment of a transition, and a box exit is a transition). It is not used here, and the reason is measured rather than aesthetic: that file stands at 44 lines against a ceiling of 44, and so do decision-analysis.md (46/46) and lanes/director.md (77/77). Inserting the rule there turns check:pm-skill-ratchet red, and raising a ceiling requires a maintainer ruling quoted in the raising PR — a decision on the human floor, which this seat does not make.

Non-blocking, for the maintainer's discretion later: moving this rule to references/state-machine.md would cost a +N ceiling raise on that file. Nothing here depends on it; the runbook's ruling-record section is a correct home, and it is where the mechanical flag for "thread contains a ruling record but the card still carries needs-user-decision" already lives.

dispatch-runbook.md absorbs the six lines inside its existing budget: 271 lines against a ceiling of 278 (headroom 7 remains). No ratchet raise, no gate edit, no changeset (a .claude/**-only diff publishes nothing).

Verification

Gate union derived on this branch's own head — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, no stale-tree warning — and every family run at head 6ddc73e:

EXIT=0 :: pnpm check:agent-test-spelling
EXIT=0 :: pnpm check:doc-authoring
EXIT=0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions
EXIT=0 :: pnpm check:pm-governed-merges
EXIT=0 :: pnpm check:pm-skill-id-lint
EXIT=0 :: pnpm check:pm-skill-ratchet
EXIT=0 :: pnpm check:skill-frame-sync

check:pm-skill-ratchet's own verdict line for the touched file: "references/dispatch-runbook.md is 271 lines (ceiling 278; headroom 7)". Two of those gates first reported PREREQUISITE NOT MET rather than a failure (@objectstack/formula and @objectstack/lint unbuilt in a fresh worktree); both were built and re-run, and the greens above are the post-build readings. Every new line measures at most 120 bytes, wrapped by the ratchet's own exported wrapLine.

Out of scope, recorded not expanded

Generated by Claude Code


Generated by Claude Code

… id it fetched in the same pass
The restore-citation rule lands in the ruling-record section of the dispatch
runbook, beside the atomic-four supplement it constrains: a write that takes a
card out of `needs-user-decision` must carry a comment id — a director-ledger
entry or the card's own ruling comment — and that id must have been FETCHED in
the same pass. Presence of an id is not retrievability: measured this round,
thirteen ruling ids quoted verbatim by later comments return 404 today, and one
seat self-corrected a ruling permalink it had invented. Reader side is
symmetric: a decision re-read that hits a box exit with no retrievable id
treats the card as unruled — same-write flip back, no dispatch — and the
conclusion stays on verifiability, asserting no cause.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 31, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 23:59
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 9e4a2d0Sep 1, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13730-restore-citation-rule branch September 1, 2026 00:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass by claude[bot] · Pull Request #13948 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass - #13948

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule
Sep 1, 2026
Merged

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass#13948
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13730
Fixes#13792

Governed surface (.claude/**) — draft only. Do not flip ready, do not arm auto-merge, do not queue. Human merge, per Prime Directive #14.

What lands

Six lines in .claude/skills/pm-dispatch/references/dispatch-runbook.md, inside its ## 落卡与裁决记录细则 section, directly after the ruling-record atomic-four supplement they constrain. The rule:

A write that takes a card out ofneeds-user-decision must carry a comment id — a director-ledger entry or the card's own ruling comment — and that id must have been FETCHED in the same pass. A timestamp plus a recollection is not a citation, and the presence of an id is not retrievability. Reader side is symmetric: a decision re-read that hits a box exit with no retrievable id treats the card as unruled — same-write flip back, no dispatch — and the conclusion stays on verifiability, asserting no cause.

Two carriers are legal because the ruling of 2026-08-31 on the ruling-durability question made the director seat's per-session ledger table the record of a ruling's existence, with the card comment as elaboration. The rule text names both, so it does not fork from that ruling.

Why the criterion is "fetched", not "an id is present"

Both failure shapes were measured on this card's own evidence run, and a presence-only criterion passes both:

  • A real id that is gone. Thirteen cards from the 2026-08-29 adjudication batch carry citations of their own ruling comment, written by a different account while the comment was still readable — several quoting it verbatim. Every one of those ids returns HTTP 404 today, in both repositories.
  • An id that never existed. One seat wrote a ruling permalink into a clause-② line and then corrected itself: "That id is invented".

Fetching the id in the same pass is the one check that separates a ruling on record from a recollection, and it is machine-checkable in principle — deliberately not 「请仔细核对」, which is measured dead.

The second member (#13792) is delivered as a comment, not as a diff

The bound reconciliation deliverable — an 在案 / 不在案 list for the director ledger's 第 3 场 claim of 58 per-card ruling comments — is posted on #13792 as comment #13792 (comment). Summary of that reading, which is also the evidence base for the rule text above:

readingresult
the claimed batch, identified58 decision-box exits, 2026-08-29T01:31:17Z–02:17:58Z, one actor, objectstack 35 + objectui 23, clustering into exactly 12 bursts of 5 = 批 #1#12, containing all seven cards the ledger names
状态转换58 / 58 在案 (label-event pairs, which survive comment deletion)
逐卡录裁评论0 / 58 retrievable today
of those13 曾在案、现不可取回 (cited by later comments, 404 now) · 45 with no citation at all
positive control, same query, later sessions08-30: 19/30 and 14/15 · 08-31: 44/48 and 13/15 — so the zero is a reading, not a broken query

⛔ The ledger issue itself is not edited by this PR: the checkable list exists first, and the correction is the director seat's act on that evidence. ⛔ No cause is asserted for the missing comments.

Placement — and the option deliberately left open

references/state-machine.md is arguably the better home by readership (its own 出处 line says it is consulted at the moment of a transition, and a box exit is a transition). It is not used here, and the reason is measured rather than aesthetic: that file stands at 44 lines against a ceiling of 44, and so do decision-analysis.md (46/46) and lanes/director.md (77/77). Inserting the rule there turns check:pm-skill-ratchet red, and raising a ceiling requires a maintainer ruling quoted in the raising PR — a decision on the human floor, which this seat does not make.

Non-blocking, for the maintainer's discretion later: moving this rule to references/state-machine.md would cost a +N ceiling raise on that file. Nothing here depends on it; the runbook's ruling-record section is a correct home, and it is where the mechanical flag for "thread contains a ruling record but the card still carries needs-user-decision" already lives.

dispatch-runbook.md absorbs the six lines inside its existing budget: 271 lines against a ceiling of 278 (headroom 7 remains). No ratchet raise, no gate edit, no changeset (a .claude/**-only diff publishes nothing).

Verification

Gate union derived on this branch's own head — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, no stale-tree warning — and every family run at head 6ddc73e:

EXIT=0 :: pnpm check:agent-test-spelling
EXIT=0 :: pnpm check:doc-authoring
EXIT=0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions
EXIT=0 :: pnpm check:pm-governed-merges
EXIT=0 :: pnpm check:pm-skill-id-lint
EXIT=0 :: pnpm check:pm-skill-ratchet
EXIT=0 :: pnpm check:skill-frame-sync

check:pm-skill-ratchet's own verdict line for the touched file: "references/dispatch-runbook.md is 271 lines (ceiling 278; headroom 7)". Two of those gates first reported PREREQUISITE NOT MET rather than a failure (@objectstack/formula and @objectstack/lint unbuilt in a fresh worktree); both were built and re-run, and the greens above are the post-build readings. Every new line measures at most 120 bytes, wrapped by the ratchet's own exported wrapLine.

Out of scope, recorded not expanded

Generated by Claude Code


Generated by Claude Code

… id it fetched in the same pass
The restore-citation rule lands in the ruling-record section of the dispatch
runbook, beside the atomic-four supplement it constrains: a write that takes a
card out of `needs-user-decision` must carry a comment id — a director-ledger
entry or the card's own ruling comment — and that id must have been FETCHED in
the same pass. Presence of an id is not retrievability: measured this round,
thirteen ruling ids quoted verbatim by later comments return 404 today, and one
seat self-corrected a ruling permalink it had invented. Reader side is
symmetric: a decision re-read that hits a box exit with no retrievable id
treats the card as unruled — same-write flip back, no dispatch — and the
conclusion stays on verifiability, asserting no cause.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 31, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 23:59
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 9e4a2d0Sep 1, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13730-restore-citation-rule branch September 1, 2026 00:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass by claude[bot] · Pull Request #13948 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass - #13948

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule
Sep 1, 2026
Merged

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass#13948
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13730
Fixes#13792

Governed surface (.claude/**) — draft only. Do not flip ready, do not arm auto-merge, do not queue. Human merge, per Prime Directive #14.

What lands

Six lines in .claude/skills/pm-dispatch/references/dispatch-runbook.md, inside its ## 落卡与裁决记录细则 section, directly after the ruling-record atomic-four supplement they constrain. The rule:

A write that takes a card out ofneeds-user-decision must carry a comment id — a director-ledger entry or the card's own ruling comment — and that id must have been FETCHED in the same pass. A timestamp plus a recollection is not a citation, and the presence of an id is not retrievability. Reader side is symmetric: a decision re-read that hits a box exit with no retrievable id treats the card as unruled — same-write flip back, no dispatch — and the conclusion stays on verifiability, asserting no cause.

Two carriers are legal because the ruling of 2026-08-31 on the ruling-durability question made the director seat's per-session ledger table the record of a ruling's existence, with the card comment as elaboration. The rule text names both, so it does not fork from that ruling.

Why the criterion is "fetched", not "an id is present"

Both failure shapes were measured on this card's own evidence run, and a presence-only criterion passes both:

  • A real id that is gone. Thirteen cards from the 2026-08-29 adjudication batch carry citations of their own ruling comment, written by a different account while the comment was still readable — several quoting it verbatim. Every one of those ids returns HTTP 404 today, in both repositories.
  • An id that never existed. One seat wrote a ruling permalink into a clause-② line and then corrected itself: "That id is invented".

Fetching the id in the same pass is the one check that separates a ruling on record from a recollection, and it is machine-checkable in principle — deliberately not 「请仔细核对」, which is measured dead.

The second member (#13792) is delivered as a comment, not as a diff

The bound reconciliation deliverable — an 在案 / 不在案 list for the director ledger's 第 3 场 claim of 58 per-card ruling comments — is posted on #13792 as comment #13792 (comment). Summary of that reading, which is also the evidence base for the rule text above:

readingresult
the claimed batch, identified58 decision-box exits, 2026-08-29T01:31:17Z–02:17:58Z, one actor, objectstack 35 + objectui 23, clustering into exactly 12 bursts of 5 = 批 #1#12, containing all seven cards the ledger names
状态转换58 / 58 在案 (label-event pairs, which survive comment deletion)
逐卡录裁评论0 / 58 retrievable today
of those13 曾在案、现不可取回 (cited by later comments, 404 now) · 45 with no citation at all
positive control, same query, later sessions08-30: 19/30 and 14/15 · 08-31: 44/48 and 13/15 — so the zero is a reading, not a broken query

⛔ The ledger issue itself is not edited by this PR: the checkable list exists first, and the correction is the director seat's act on that evidence. ⛔ No cause is asserted for the missing comments.

Placement — and the option deliberately left open

references/state-machine.md is arguably the better home by readership (its own 出处 line says it is consulted at the moment of a transition, and a box exit is a transition). It is not used here, and the reason is measured rather than aesthetic: that file stands at 44 lines against a ceiling of 44, and so do decision-analysis.md (46/46) and lanes/director.md (77/77). Inserting the rule there turns check:pm-skill-ratchet red, and raising a ceiling requires a maintainer ruling quoted in the raising PR — a decision on the human floor, which this seat does not make.

Non-blocking, for the maintainer's discretion later: moving this rule to references/state-machine.md would cost a +N ceiling raise on that file. Nothing here depends on it; the runbook's ruling-record section is a correct home, and it is where the mechanical flag for "thread contains a ruling record but the card still carries needs-user-decision" already lives.

dispatch-runbook.md absorbs the six lines inside its existing budget: 271 lines against a ceiling of 278 (headroom 7 remains). No ratchet raise, no gate edit, no changeset (a .claude/**-only diff publishes nothing).

Verification

Gate union derived on this branch's own head — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, no stale-tree warning — and every family run at head 6ddc73e:

EXIT=0 :: pnpm check:agent-test-spelling
EXIT=0 :: pnpm check:doc-authoring
EXIT=0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions
EXIT=0 :: pnpm check:pm-governed-merges
EXIT=0 :: pnpm check:pm-skill-id-lint
EXIT=0 :: pnpm check:pm-skill-ratchet
EXIT=0 :: pnpm check:skill-frame-sync

check:pm-skill-ratchet's own verdict line for the touched file: "references/dispatch-runbook.md is 271 lines (ceiling 278; headroom 7)". Two of those gates first reported PREREQUISITE NOT MET rather than a failure (@objectstack/formula and @objectstack/lint unbuilt in a fresh worktree); both were built and re-run, and the greens above are the post-build readings. Every new line measures at most 120 bytes, wrapped by the ratchet's own exported wrapLine.

Out of scope, recorded not expanded

Generated by Claude Code


Generated by Claude Code

… id it fetched in the same pass
The restore-citation rule lands in the ruling-record section of the dispatch
runbook, beside the atomic-four supplement it constrains: a write that takes a
card out of `needs-user-decision` must carry a comment id — a director-ledger
entry or the card's own ruling comment — and that id must have been FETCHED in
the same pass. Presence of an id is not retrievability: measured this round,
thirteen ruling ids quoted verbatim by later comments return 404 today, and one
seat self-corrected a ruling permalink it had invented. Reader side is
symmetric: a decision re-read that hits a box exit with no retrievable id
treats the card as unruled — same-write flip back, no dispatch — and the
conclusion stays on verifiability, asserting no cause.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 31, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 23:59
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 9e4a2d0Sep 1, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13730-restore-citation-rule branch September 1, 2026 00:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass by claude[bot] · Pull Request #13948 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass - #13948

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule
Sep 1, 2026
Merged

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass#13948
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13730
Fixes#13792

Governed surface (.claude/**) — draft only. Do not flip ready, do not arm auto-merge, do not queue. Human merge, per Prime Directive #14.

What lands

Six lines in .claude/skills/pm-dispatch/references/dispatch-runbook.md, inside its ## 落卡与裁决记录细则 section, directly after the ruling-record atomic-four supplement they constrain. The rule:

A write that takes a card out ofneeds-user-decision must carry a comment id — a director-ledger entry or the card's own ruling comment — and that id must have been FETCHED in the same pass. A timestamp plus a recollection is not a citation, and the presence of an id is not retrievability. Reader side is symmetric: a decision re-read that hits a box exit with no retrievable id treats the card as unruled — same-write flip back, no dispatch — and the conclusion stays on verifiability, asserting no cause.

Two carriers are legal because the ruling of 2026-08-31 on the ruling-durability question made the director seat's per-session ledger table the record of a ruling's existence, with the card comment as elaboration. The rule text names both, so it does not fork from that ruling.

Why the criterion is "fetched", not "an id is present"

Both failure shapes were measured on this card's own evidence run, and a presence-only criterion passes both:

  • A real id that is gone. Thirteen cards from the 2026-08-29 adjudication batch carry citations of their own ruling comment, written by a different account while the comment was still readable — several quoting it verbatim. Every one of those ids returns HTTP 404 today, in both repositories.
  • An id that never existed. One seat wrote a ruling permalink into a clause-② line and then corrected itself: "That id is invented".

Fetching the id in the same pass is the one check that separates a ruling on record from a recollection, and it is machine-checkable in principle — deliberately not 「请仔细核对」, which is measured dead.

The second member (#13792) is delivered as a comment, not as a diff

The bound reconciliation deliverable — an 在案 / 不在案 list for the director ledger's 第 3 场 claim of 58 per-card ruling comments — is posted on #13792 as comment #13792 (comment). Summary of that reading, which is also the evidence base for the rule text above:

readingresult
the claimed batch, identified58 decision-box exits, 2026-08-29T01:31:17Z–02:17:58Z, one actor, objectstack 35 + objectui 23, clustering into exactly 12 bursts of 5 = 批 #1#12, containing all seven cards the ledger names
状态转换58 / 58 在案 (label-event pairs, which survive comment deletion)
逐卡录裁评论0 / 58 retrievable today
of those13 曾在案、现不可取回 (cited by later comments, 404 now) · 45 with no citation at all
positive control, same query, later sessions08-30: 19/30 and 14/15 · 08-31: 44/48 and 13/15 — so the zero is a reading, not a broken query

⛔ The ledger issue itself is not edited by this PR: the checkable list exists first, and the correction is the director seat's act on that evidence. ⛔ No cause is asserted for the missing comments.

Placement — and the option deliberately left open

references/state-machine.md is arguably the better home by readership (its own 出处 line says it is consulted at the moment of a transition, and a box exit is a transition). It is not used here, and the reason is measured rather than aesthetic: that file stands at 44 lines against a ceiling of 44, and so do decision-analysis.md (46/46) and lanes/director.md (77/77). Inserting the rule there turns check:pm-skill-ratchet red, and raising a ceiling requires a maintainer ruling quoted in the raising PR — a decision on the human floor, which this seat does not make.

Non-blocking, for the maintainer's discretion later: moving this rule to references/state-machine.md would cost a +N ceiling raise on that file. Nothing here depends on it; the runbook's ruling-record section is a correct home, and it is where the mechanical flag for "thread contains a ruling record but the card still carries needs-user-decision" already lives.

dispatch-runbook.md absorbs the six lines inside its existing budget: 271 lines against a ceiling of 278 (headroom 7 remains). No ratchet raise, no gate edit, no changeset (a .claude/**-only diff publishes nothing).

Verification

Gate union derived on this branch's own head — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, no stale-tree warning — and every family run at head 6ddc73e:

EXIT=0 :: pnpm check:agent-test-spelling
EXIT=0 :: pnpm check:doc-authoring
EXIT=0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions
EXIT=0 :: pnpm check:pm-governed-merges
EXIT=0 :: pnpm check:pm-skill-id-lint
EXIT=0 :: pnpm check:pm-skill-ratchet
EXIT=0 :: pnpm check:skill-frame-sync

check:pm-skill-ratchet's own verdict line for the touched file: "references/dispatch-runbook.md is 271 lines (ceiling 278; headroom 7)". Two of those gates first reported PREREQUISITE NOT MET rather than a failure (@objectstack/formula and @objectstack/lint unbuilt in a fresh worktree); both were built and re-run, and the greens above are the post-build readings. Every new line measures at most 120 bytes, wrapped by the ratchet's own exported wrapLine.

Out of scope, recorded not expanded

Generated by Claude Code


Generated by Claude Code

… id it fetched in the same pass
The restore-citation rule lands in the ruling-record section of the dispatch
runbook, beside the atomic-four supplement it constrains: a write that takes a
card out of `needs-user-decision` must carry a comment id — a director-ledger
entry or the card's own ruling comment — and that id must have been FETCHED in
the same pass. Presence of an id is not retrievability: measured this round,
thirteen ruling ids quoted verbatim by later comments return 404 today, and one
seat self-corrected a ruling permalink it had invented. Reader side is
symmetric: a decision re-read that hits a box exit with no retrievable id
treats the card as unruled — same-write flip back, no dispatch — and the
conclusion stays on verifiability, asserting no cause.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 31, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 23:59
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 9e4a2d0Sep 1, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13730-restore-citation-rule branch September 1, 2026 00:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass by claude[bot] · Pull Request #13948 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass - #13948

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule
Sep 1, 2026
Merged

docs(pm-skill): a decision-box restore must cite a retrievable ruling id it fetched in the same pass#13948
os-zhuang merged 1 commit into
mainfrom
claude/issue-13730-restore-citation-rule

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13730
Fixes#13792

Governed surface (.claude/**) — draft only. Do not flip ready, do not arm auto-merge, do not queue. Human merge, per Prime Directive #14.

What lands

Six lines in .claude/skills/pm-dispatch/references/dispatch-runbook.md, inside its ## 落卡与裁决记录细则 section, directly after the ruling-record atomic-four supplement they constrain. The rule:

A write that takes a card out ofneeds-user-decision must carry a comment id — a director-ledger entry or the card's own ruling comment — and that id must have been FETCHED in the same pass. A timestamp plus a recollection is not a citation, and the presence of an id is not retrievability. Reader side is symmetric: a decision re-read that hits a box exit with no retrievable id treats the card as unruled — same-write flip back, no dispatch — and the conclusion stays on verifiability, asserting no cause.

Two carriers are legal because the ruling of 2026-08-31 on the ruling-durability question made the director seat's per-session ledger table the record of a ruling's existence, with the card comment as elaboration. The rule text names both, so it does not fork from that ruling.

Why the criterion is "fetched", not "an id is present"

Both failure shapes were measured on this card's own evidence run, and a presence-only criterion passes both:

  • A real id that is gone. Thirteen cards from the 2026-08-29 adjudication batch carry citations of their own ruling comment, written by a different account while the comment was still readable — several quoting it verbatim. Every one of those ids returns HTTP 404 today, in both repositories.
  • An id that never existed. One seat wrote a ruling permalink into a clause-② line and then corrected itself: "That id is invented".

Fetching the id in the same pass is the one check that separates a ruling on record from a recollection, and it is machine-checkable in principle — deliberately not 「请仔细核对」, which is measured dead.

The second member (#13792) is delivered as a comment, not as a diff

The bound reconciliation deliverable — an 在案 / 不在案 list for the director ledger's 第 3 场 claim of 58 per-card ruling comments — is posted on #13792 as comment #13792 (comment). Summary of that reading, which is also the evidence base for the rule text above:

readingresult
the claimed batch, identified58 decision-box exits, 2026-08-29T01:31:17Z–02:17:58Z, one actor, objectstack 35 + objectui 23, clustering into exactly 12 bursts of 5 = 批 #1#12, containing all seven cards the ledger names
状态转换58 / 58 在案 (label-event pairs, which survive comment deletion)
逐卡录裁评论0 / 58 retrievable today
of those13 曾在案、现不可取回 (cited by later comments, 404 now) · 45 with no citation at all
positive control, same query, later sessions08-30: 19/30 and 14/15 · 08-31: 44/48 and 13/15 — so the zero is a reading, not a broken query

⛔ The ledger issue itself is not edited by this PR: the checkable list exists first, and the correction is the director seat's act on that evidence. ⛔ No cause is asserted for the missing comments.

Placement — and the option deliberately left open

references/state-machine.md is arguably the better home by readership (its own 出处 line says it is consulted at the moment of a transition, and a box exit is a transition). It is not used here, and the reason is measured rather than aesthetic: that file stands at 44 lines against a ceiling of 44, and so do decision-analysis.md (46/46) and lanes/director.md (77/77). Inserting the rule there turns check:pm-skill-ratchet red, and raising a ceiling requires a maintainer ruling quoted in the raising PR — a decision on the human floor, which this seat does not make.

Non-blocking, for the maintainer's discretion later: moving this rule to references/state-machine.md would cost a +N ceiling raise on that file. Nothing here depends on it; the runbook's ruling-record section is a correct home, and it is where the mechanical flag for "thread contains a ruling record but the card still carries needs-user-decision" already lives.

dispatch-runbook.md absorbs the six lines inside its existing budget: 271 lines against a ceiling of 278 (headroom 7 remains). No ratchet raise, no gate edit, no changeset (a .claude/**-only diff publishes nothing).

Verification

Gate union derived on this branch's own head — node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, no stale-tree warning — and every family run at head 6ddc73e:

EXIT=0 :: pnpm check:agent-test-spelling
EXIT=0 :: pnpm check:doc-authoring
EXIT=0 :: pnpm --filter @objectstack/lint run check:doc-formula-expressions
EXIT=0 :: pnpm check:pm-governed-merges
EXIT=0 :: pnpm check:pm-skill-id-lint
EXIT=0 :: pnpm check:pm-skill-ratchet
EXIT=0 :: pnpm check:skill-frame-sync

check:pm-skill-ratchet's own verdict line for the touched file: "references/dispatch-runbook.md is 271 lines (ceiling 278; headroom 7)". Two of those gates first reported PREREQUISITE NOT MET rather than a failure (@objectstack/formula and @objectstack/lint unbuilt in a fresh worktree); both were built and re-run, and the greens above are the post-build readings. Every new line measures at most 120 bytes, wrapped by the ratchet's own exported wrapLine.

Out of scope, recorded not expanded

Generated by Claude Code


Generated by Claude Code

… id it fetched in the same pass
The restore-citation rule lands in the ruling-record section of the dispatch
runbook, beside the atomic-four supplement it constrains: a write that takes a
card out of `needs-user-decision` must carry a comment id — a director-ledger
entry or the card's own ruling comment — and that id must have been FETCHED in
the same pass. Presence of an id is not retrievability: measured this round,
thirteen ruling ids quoted verbatim by later comments return 404 today, and one
seat self-corrected a ruling permalink it had invented. Reader side is
symmetric: a decision re-read that hits a box exit with no retrievable id
treats the card as unruled — same-write flip back, no dispatch — and the
conclusion stays on verifiability, asserting no cause.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Msg17tAHJ3jVTYFgHydCm2
@claudeclaudeBot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 31, 2026
@github-actionsgithub-actionsBot added size/xs documentation Improvements or additions to documentation labels Aug 31, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 23:59
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 9e4a2d0Sep 1, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13730-restore-citation-rule branch September 1, 2026 00:16
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/xsskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@os-zhuang@claude