Skip to content

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling - #13603

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half
Aug 31, 2026
Merged

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling#13603
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13304

Retires duty ⑦'s reader half from .claude/skills/pm-dispatch/references/dispatch-runbook.md, executing the maintainer ruling.

The ruling

Maintainer ruling 2026-08-31 (chat), verbatim:

「13580 B(荐」

Option B as put to the maintainer, verbatim from the ruling comment on the card:

B (recommended) — retire duty ⑦'s reader half outright: the 读者半边 and 正对照 bullets of the runbook's ⑦ section. The instrument is measured structurally blind on 104 of 121 keys; text explaining when to trust a blind instrument helps no PM decision. Construct removal, net-negative lines. The surface half (canonical diff, measured good) stays.

The ruling also settles what does not land here, verbatim:

The 同类 family's transferable sentence (grading comment above) does NOT get a replacement carrier in the runbook — under this ruling, fewer methodology sentences is the point.

Accordingly this diff adds zero replacement prose. PR #13580 (the earlier +7-line applicability-domain repair on this card) was stood down unmerged and is superseded by this one; none of its text is imported here.

The diff

One file, .claude/skills/pm-dispatch/references/dispatch-runbook.md. 271 → 265 lines (1 insertion, 7 deletions).

Deleted — the two bullets carrying the reader-count method:

  • the 读者半边 bullet (3 lines): the per-key git grep recipe plus its three hit-adjudication rules.
  • the 正对照恒先跑 bullet (3 lines): the sys_share_link.email_allowlist calibration control.

Kept, untouched — the section heading and the surface half bullet (canonical member-level diff, measured good), including its pinned baseline ref.

The one coherence repair

The heading suffix 「与校准」 ("and calibration") named the calibration bullet that this PR deletes, so leaving it would have made the heading actively false. It is dropped in place, word-level, no re-wrap:

## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准## security-object 无判决枚举(座位贴常设 ⑦)的方法

Measured: that line goes 73 → 64 bytes — it shrinks, so it is byte-bounded in the sense the in-passage word-tightening rounds on this file established (#13427, #13403, #13505 are cited here as precedent for the shape of an in-passage tightening, not as a standing permission — the authority for this edit is the ruling above).

A second rename was considered and rejected on measurement. Renaming the surviving bullet 「表面半边」 ("surface half") — whose name still references a two-half structure that no longer exists — to 「成员级 diff」 would take its line from 116 → 118 bytes, i.e. it grows. Under the byte-bound it is therefore not taken: the words stay as-is and the residual naming incoherence is left for the corpus-audit card's Phase 3 to fold in.

Verification

Acceptance table, evaluated at BOTH refs via git show REF:path

Base d47583841 (merge base) vs head 0a424c942:

checkat baseat headexpectedverdict
negative anchor: 读者半边101 → 0PASS
negative anchor: 正对照恒先跑101 → 0PASS
negative anchor: sys_share_link.email_allowlist101 → 0PASS
negative anchor: heading suffix 与校准101 → 0PASS
POSITIVE control: 表面半边 survives111 → 1PASS
POSITIVE control: section heading survives111 → 1PASS
POSITIVE control: pinned baseline ref b000ab59 survives111 → 1PASS
line count271265271 → 265PASS

The positive-control rows are load-bearing, not decoration: a zero on those would mean the instrument broke rather than that the text is gone. All three read 1 at head, so the negative-anchor zeros above them are measurements and not instrument failure.

Repo-wide sweep:git grep -n 读者半边 and git grep -n 正对照恒先跑 over the whole tree return no hits after this change — the runbook was the only carrier, so no other file needs a follow-up and none was edited.

Why no ablation applies

The ratchet is a ceiling (an upper bound on line count), and this diff only removes lines. A deletion cannot breach an upper bound, so there is no red to predict and no mutation that would produce one — an ablation here would have no failing leg to demonstrate. The reverse verification that is meaningful for a pure deletion is the two-ref acceptance table above, which is why that is what was run.

Gates

Family derived from the ACTUAL diff with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (7 families; the script derived the change set itself from the merge base). All 7 run and green at head 0a424c942. Each gate's own verdict line:

  • check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 413 file(s) · 5084 bare -- token(s) · 1284 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 80 manifest(s)
  • check:doc-authoring✓ doc authoring guard: 393 files clean — no bare metadata literals. and ✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.
  • check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged clean by @objectstack/formula.
  • check:pm-governed-merges✓ check-governed-merges --self-test: 228 assertions
  • check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).
  • check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 265 lines (ceiling 278; headroom 13).
  • check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files

Two of the seven first reported PREREQUISITE NOT MET in the fresh worktree and were treated as NOT MEASURED rather than as failures, per each gate's own text: check:doc-authoring named pnpm install, and check:doc-formula-expressions named pnpm install then two builds (@objectstack/formula, then @objectstack/lint). Each prerequisite was satisfied and the gate re-run; the green lines quoted above are from those re-runs. Every exit code was captured directly (cmd > log 2>&1; EXIT=$?), never through a pipe.

The ratchet pin is deliberately not followed down (278 → 265) in this PR: scripts/pm/check-skill-line-ratchet.mjs is serial behind another in-flight chain, and the pin follow-down is deferred to the corpus audit's Phase 3 per the ruling. The ceiling is an upper bound, so 265 ≤ 278 passes it untouched — as the quoted verdict line shows, with headroom 13.

Posture

  • Governed surface (.claude/**): this PR stays draft. No ready flip, no auto-merge, no review submitted — landing is the maintainer's call.
  • skip-changeset: applied. The diff publishes nothing from any package — it is confined to .claude/**.
  • Control-character self-scan over the edited file: clean, zero hits.

Generated by Claude Code


Generated by Claude Code

Maintainer ruling 2026-08-31, verbatim: 「13580 B(荐」 — option B adopted.
Deletes the two bullets of the runbook's duty-7 section that carry the
reader-count method: the 读者半边 bullet (the git-grep-per-key method) and
the 正对照恒先跑 bullet (the sys_share_link.email_allowlist calibration).
The instrument they describe was measured structurally blind on 104 of 121
keys, so prose explaining when to trust a blind instrument helps no PM
decision. Construct removal, net-negative lines.
The section heading and the surface half (canonical member-level diff,
measured good) stay. No replacement prose is added.
One coherence repair rides along, byte-bounded and in place: the heading
suffix drops 「与校准」 now that the calibration bullet is gone (73 -> 64
bytes, shrinks). The surviving bullet's name is left untouched because
renaming it would grow its line by 2 bytes.
271 -> 265 lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 05:11
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 05:12
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit f4d5308Aug 31, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13304-retire-reader-half branch August 31, 2026 05:27
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-dispatch): retire duty-7's reader half per maintainer ruling by claude[bot] · Pull Request #13603 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling - #13603

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half
Aug 31, 2026
Merged

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling#13603
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13304

Retires duty ⑦'s reader half from .claude/skills/pm-dispatch/references/dispatch-runbook.md, executing the maintainer ruling.

The ruling

Maintainer ruling 2026-08-31 (chat), verbatim:

「13580 B(荐」

Option B as put to the maintainer, verbatim from the ruling comment on the card:

B (recommended) — retire duty ⑦'s reader half outright: the 读者半边 and 正对照 bullets of the runbook's ⑦ section. The instrument is measured structurally blind on 104 of 121 keys; text explaining when to trust a blind instrument helps no PM decision. Construct removal, net-negative lines. The surface half (canonical diff, measured good) stays.

The ruling also settles what does not land here, verbatim:

The 同类 family's transferable sentence (grading comment above) does NOT get a replacement carrier in the runbook — under this ruling, fewer methodology sentences is the point.

Accordingly this diff adds zero replacement prose. PR #13580 (the earlier +7-line applicability-domain repair on this card) was stood down unmerged and is superseded by this one; none of its text is imported here.

The diff

One file, .claude/skills/pm-dispatch/references/dispatch-runbook.md. 271 → 265 lines (1 insertion, 7 deletions).

Deleted — the two bullets carrying the reader-count method:

  • the 读者半边 bullet (3 lines): the per-key git grep recipe plus its three hit-adjudication rules.
  • the 正对照恒先跑 bullet (3 lines): the sys_share_link.email_allowlist calibration control.

Kept, untouched — the section heading and the surface half bullet (canonical member-level diff, measured good), including its pinned baseline ref.

The one coherence repair

The heading suffix 「与校准」 ("and calibration") named the calibration bullet that this PR deletes, so leaving it would have made the heading actively false. It is dropped in place, word-level, no re-wrap:

## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准## security-object 无判决枚举(座位贴常设 ⑦)的方法

Measured: that line goes 73 → 64 bytes — it shrinks, so it is byte-bounded in the sense the in-passage word-tightening rounds on this file established (#13427, #13403, #13505 are cited here as precedent for the shape of an in-passage tightening, not as a standing permission — the authority for this edit is the ruling above).

A second rename was considered and rejected on measurement. Renaming the surviving bullet 「表面半边」 ("surface half") — whose name still references a two-half structure that no longer exists — to 「成员级 diff」 would take its line from 116 → 118 bytes, i.e. it grows. Under the byte-bound it is therefore not taken: the words stay as-is and the residual naming incoherence is left for the corpus-audit card's Phase 3 to fold in.

Verification

Acceptance table, evaluated at BOTH refs via git show REF:path

Base d47583841 (merge base) vs head 0a424c942:

checkat baseat headexpectedverdict
negative anchor: 读者半边101 → 0PASS
negative anchor: 正对照恒先跑101 → 0PASS
negative anchor: sys_share_link.email_allowlist101 → 0PASS
negative anchor: heading suffix 与校准101 → 0PASS
POSITIVE control: 表面半边 survives111 → 1PASS
POSITIVE control: section heading survives111 → 1PASS
POSITIVE control: pinned baseline ref b000ab59 survives111 → 1PASS
line count271265271 → 265PASS

The positive-control rows are load-bearing, not decoration: a zero on those would mean the instrument broke rather than that the text is gone. All three read 1 at head, so the negative-anchor zeros above them are measurements and not instrument failure.

Repo-wide sweep:git grep -n 读者半边 and git grep -n 正对照恒先跑 over the whole tree return no hits after this change — the runbook was the only carrier, so no other file needs a follow-up and none was edited.

Why no ablation applies

The ratchet is a ceiling (an upper bound on line count), and this diff only removes lines. A deletion cannot breach an upper bound, so there is no red to predict and no mutation that would produce one — an ablation here would have no failing leg to demonstrate. The reverse verification that is meaningful for a pure deletion is the two-ref acceptance table above, which is why that is what was run.

Gates

Family derived from the ACTUAL diff with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (7 families; the script derived the change set itself from the merge base). All 7 run and green at head 0a424c942. Each gate's own verdict line:

  • check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 413 file(s) · 5084 bare -- token(s) · 1284 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 80 manifest(s)
  • check:doc-authoring✓ doc authoring guard: 393 files clean — no bare metadata literals. and ✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.
  • check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged clean by @objectstack/formula.
  • check:pm-governed-merges✓ check-governed-merges --self-test: 228 assertions
  • check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).
  • check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 265 lines (ceiling 278; headroom 13).
  • check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files

Two of the seven first reported PREREQUISITE NOT MET in the fresh worktree and were treated as NOT MEASURED rather than as failures, per each gate's own text: check:doc-authoring named pnpm install, and check:doc-formula-expressions named pnpm install then two builds (@objectstack/formula, then @objectstack/lint). Each prerequisite was satisfied and the gate re-run; the green lines quoted above are from those re-runs. Every exit code was captured directly (cmd > log 2>&1; EXIT=$?), never through a pipe.

The ratchet pin is deliberately not followed down (278 → 265) in this PR: scripts/pm/check-skill-line-ratchet.mjs is serial behind another in-flight chain, and the pin follow-down is deferred to the corpus audit's Phase 3 per the ruling. The ceiling is an upper bound, so 265 ≤ 278 passes it untouched — as the quoted verdict line shows, with headroom 13.

Posture

  • Governed surface (.claude/**): this PR stays draft. No ready flip, no auto-merge, no review submitted — landing is the maintainer's call.
  • skip-changeset: applied. The diff publishes nothing from any package — it is confined to .claude/**.
  • Control-character self-scan over the edited file: clean, zero hits.

Generated by Claude Code


Generated by Claude Code

Maintainer ruling 2026-08-31, verbatim: 「13580 B(荐」 — option B adopted.
Deletes the two bullets of the runbook's duty-7 section that carry the
reader-count method: the 读者半边 bullet (the git-grep-per-key method) and
the 正对照恒先跑 bullet (the sys_share_link.email_allowlist calibration).
The instrument they describe was measured structurally blind on 104 of 121
keys, so prose explaining when to trust a blind instrument helps no PM
decision. Construct removal, net-negative lines.
The section heading and the surface half (canonical member-level diff,
measured good) stay. No replacement prose is added.
One coherence repair rides along, byte-bounded and in place: the heading
suffix drops 「与校准」 now that the calibration bullet is gone (73 -> 64
bytes, shrinks). The surviving bullet's name is left untouched because
renaming it would grow its line by 2 bytes.
271 -> 265 lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 05:11
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 05:12
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit f4d5308Aug 31, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13304-retire-reader-half branch August 31, 2026 05:27
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-dispatch): retire duty-7's reader half per maintainer ruling by claude[bot] · Pull Request #13603 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling - #13603

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half
Aug 31, 2026
Merged

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling#13603
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13304

Retires duty ⑦'s reader half from .claude/skills/pm-dispatch/references/dispatch-runbook.md, executing the maintainer ruling.

The ruling

Maintainer ruling 2026-08-31 (chat), verbatim:

「13580 B(荐」

Option B as put to the maintainer, verbatim from the ruling comment on the card:

B (recommended) — retire duty ⑦'s reader half outright: the 读者半边 and 正对照 bullets of the runbook's ⑦ section. The instrument is measured structurally blind on 104 of 121 keys; text explaining when to trust a blind instrument helps no PM decision. Construct removal, net-negative lines. The surface half (canonical diff, measured good) stays.

The ruling also settles what does not land here, verbatim:

The 同类 family's transferable sentence (grading comment above) does NOT get a replacement carrier in the runbook — under this ruling, fewer methodology sentences is the point.

Accordingly this diff adds zero replacement prose. PR #13580 (the earlier +7-line applicability-domain repair on this card) was stood down unmerged and is superseded by this one; none of its text is imported here.

The diff

One file, .claude/skills/pm-dispatch/references/dispatch-runbook.md. 271 → 265 lines (1 insertion, 7 deletions).

Deleted — the two bullets carrying the reader-count method:

  • the 读者半边 bullet (3 lines): the per-key git grep recipe plus its three hit-adjudication rules.
  • the 正对照恒先跑 bullet (3 lines): the sys_share_link.email_allowlist calibration control.

Kept, untouched — the section heading and the surface half bullet (canonical member-level diff, measured good), including its pinned baseline ref.

The one coherence repair

The heading suffix 「与校准」 ("and calibration") named the calibration bullet that this PR deletes, so leaving it would have made the heading actively false. It is dropped in place, word-level, no re-wrap:

## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准## security-object 无判决枚举(座位贴常设 ⑦)的方法

Measured: that line goes 73 → 64 bytes — it shrinks, so it is byte-bounded in the sense the in-passage word-tightening rounds on this file established (#13427, #13403, #13505 are cited here as precedent for the shape of an in-passage tightening, not as a standing permission — the authority for this edit is the ruling above).

A second rename was considered and rejected on measurement. Renaming the surviving bullet 「表面半边」 ("surface half") — whose name still references a two-half structure that no longer exists — to 「成员级 diff」 would take its line from 116 → 118 bytes, i.e. it grows. Under the byte-bound it is therefore not taken: the words stay as-is and the residual naming incoherence is left for the corpus-audit card's Phase 3 to fold in.

Verification

Acceptance table, evaluated at BOTH refs via git show REF:path

Base d47583841 (merge base) vs head 0a424c942:

checkat baseat headexpectedverdict
negative anchor: 读者半边101 → 0PASS
negative anchor: 正对照恒先跑101 → 0PASS
negative anchor: sys_share_link.email_allowlist101 → 0PASS
negative anchor: heading suffix 与校准101 → 0PASS
POSITIVE control: 表面半边 survives111 → 1PASS
POSITIVE control: section heading survives111 → 1PASS
POSITIVE control: pinned baseline ref b000ab59 survives111 → 1PASS
line count271265271 → 265PASS

The positive-control rows are load-bearing, not decoration: a zero on those would mean the instrument broke rather than that the text is gone. All three read 1 at head, so the negative-anchor zeros above them are measurements and not instrument failure.

Repo-wide sweep:git grep -n 读者半边 and git grep -n 正对照恒先跑 over the whole tree return no hits after this change — the runbook was the only carrier, so no other file needs a follow-up and none was edited.

Why no ablation applies

The ratchet is a ceiling (an upper bound on line count), and this diff only removes lines. A deletion cannot breach an upper bound, so there is no red to predict and no mutation that would produce one — an ablation here would have no failing leg to demonstrate. The reverse verification that is meaningful for a pure deletion is the two-ref acceptance table above, which is why that is what was run.

Gates

Family derived from the ACTUAL diff with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (7 families; the script derived the change set itself from the merge base). All 7 run and green at head 0a424c942. Each gate's own verdict line:

  • check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 413 file(s) · 5084 bare -- token(s) · 1284 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 80 manifest(s)
  • check:doc-authoring✓ doc authoring guard: 393 files clean — no bare metadata literals. and ✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.
  • check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged clean by @objectstack/formula.
  • check:pm-governed-merges✓ check-governed-merges --self-test: 228 assertions
  • check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).
  • check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 265 lines (ceiling 278; headroom 13).
  • check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files

Two of the seven first reported PREREQUISITE NOT MET in the fresh worktree and were treated as NOT MEASURED rather than as failures, per each gate's own text: check:doc-authoring named pnpm install, and check:doc-formula-expressions named pnpm install then two builds (@objectstack/formula, then @objectstack/lint). Each prerequisite was satisfied and the gate re-run; the green lines quoted above are from those re-runs. Every exit code was captured directly (cmd > log 2>&1; EXIT=$?), never through a pipe.

The ratchet pin is deliberately not followed down (278 → 265) in this PR: scripts/pm/check-skill-line-ratchet.mjs is serial behind another in-flight chain, and the pin follow-down is deferred to the corpus audit's Phase 3 per the ruling. The ceiling is an upper bound, so 265 ≤ 278 passes it untouched — as the quoted verdict line shows, with headroom 13.

Posture

  • Governed surface (.claude/**): this PR stays draft. No ready flip, no auto-merge, no review submitted — landing is the maintainer's call.
  • skip-changeset: applied. The diff publishes nothing from any package — it is confined to .claude/**.
  • Control-character self-scan over the edited file: clean, zero hits.

Generated by Claude Code


Generated by Claude Code

Maintainer ruling 2026-08-31, verbatim: 「13580 B(荐」 — option B adopted.
Deletes the two bullets of the runbook's duty-7 section that carry the
reader-count method: the 读者半边 bullet (the git-grep-per-key method) and
the 正对照恒先跑 bullet (the sys_share_link.email_allowlist calibration).
The instrument they describe was measured structurally blind on 104 of 121
keys, so prose explaining when to trust a blind instrument helps no PM
decision. Construct removal, net-negative lines.
The section heading and the surface half (canonical member-level diff,
measured good) stay. No replacement prose is added.
One coherence repair rides along, byte-bounded and in place: the heading
suffix drops 「与校准」 now that the calibration bullet is gone (73 -> 64
bytes, shrinks). The surviving bullet's name is left untouched because
renaming it would grow its line by 2 bytes.
271 -> 265 lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 05:11
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 05:12
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit f4d5308Aug 31, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13304-retire-reader-half branch August 31, 2026 05:27
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-dispatch): retire duty-7's reader half per maintainer ruling by claude[bot] · Pull Request #13603 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling - #13603

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half
Aug 31, 2026
Merged

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling#13603
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13304

Retires duty ⑦'s reader half from .claude/skills/pm-dispatch/references/dispatch-runbook.md, executing the maintainer ruling.

The ruling

Maintainer ruling 2026-08-31 (chat), verbatim:

「13580 B(荐」

Option B as put to the maintainer, verbatim from the ruling comment on the card:

B (recommended) — retire duty ⑦'s reader half outright: the 读者半边 and 正对照 bullets of the runbook's ⑦ section. The instrument is measured structurally blind on 104 of 121 keys; text explaining when to trust a blind instrument helps no PM decision. Construct removal, net-negative lines. The surface half (canonical diff, measured good) stays.

The ruling also settles what does not land here, verbatim:

The 同类 family's transferable sentence (grading comment above) does NOT get a replacement carrier in the runbook — under this ruling, fewer methodology sentences is the point.

Accordingly this diff adds zero replacement prose. PR #13580 (the earlier +7-line applicability-domain repair on this card) was stood down unmerged and is superseded by this one; none of its text is imported here.

The diff

One file, .claude/skills/pm-dispatch/references/dispatch-runbook.md. 271 → 265 lines (1 insertion, 7 deletions).

Deleted — the two bullets carrying the reader-count method:

  • the 读者半边 bullet (3 lines): the per-key git grep recipe plus its three hit-adjudication rules.
  • the 正对照恒先跑 bullet (3 lines): the sys_share_link.email_allowlist calibration control.

Kept, untouched — the section heading and the surface half bullet (canonical member-level diff, measured good), including its pinned baseline ref.

The one coherence repair

The heading suffix 「与校准」 ("and calibration") named the calibration bullet that this PR deletes, so leaving it would have made the heading actively false. It is dropped in place, word-level, no re-wrap:

## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准## security-object 无判决枚举(座位贴常设 ⑦)的方法

Measured: that line goes 73 → 64 bytes — it shrinks, so it is byte-bounded in the sense the in-passage word-tightening rounds on this file established (#13427, #13403, #13505 are cited here as precedent for the shape of an in-passage tightening, not as a standing permission — the authority for this edit is the ruling above).

A second rename was considered and rejected on measurement. Renaming the surviving bullet 「表面半边」 ("surface half") — whose name still references a two-half structure that no longer exists — to 「成员级 diff」 would take its line from 116 → 118 bytes, i.e. it grows. Under the byte-bound it is therefore not taken: the words stay as-is and the residual naming incoherence is left for the corpus-audit card's Phase 3 to fold in.

Verification

Acceptance table, evaluated at BOTH refs via git show REF:path

Base d47583841 (merge base) vs head 0a424c942:

checkat baseat headexpectedverdict
negative anchor: 读者半边101 → 0PASS
negative anchor: 正对照恒先跑101 → 0PASS
negative anchor: sys_share_link.email_allowlist101 → 0PASS
negative anchor: heading suffix 与校准101 → 0PASS
POSITIVE control: 表面半边 survives111 → 1PASS
POSITIVE control: section heading survives111 → 1PASS
POSITIVE control: pinned baseline ref b000ab59 survives111 → 1PASS
line count271265271 → 265PASS

The positive-control rows are load-bearing, not decoration: a zero on those would mean the instrument broke rather than that the text is gone. All three read 1 at head, so the negative-anchor zeros above them are measurements and not instrument failure.

Repo-wide sweep:git grep -n 读者半边 and git grep -n 正对照恒先跑 over the whole tree return no hits after this change — the runbook was the only carrier, so no other file needs a follow-up and none was edited.

Why no ablation applies

The ratchet is a ceiling (an upper bound on line count), and this diff only removes lines. A deletion cannot breach an upper bound, so there is no red to predict and no mutation that would produce one — an ablation here would have no failing leg to demonstrate. The reverse verification that is meaningful for a pure deletion is the two-ref acceptance table above, which is why that is what was run.

Gates

Family derived from the ACTUAL diff with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (7 families; the script derived the change set itself from the merge base). All 7 run and green at head 0a424c942. Each gate's own verdict line:

  • check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 413 file(s) · 5084 bare -- token(s) · 1284 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 80 manifest(s)
  • check:doc-authoring✓ doc authoring guard: 393 files clean — no bare metadata literals. and ✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.
  • check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged clean by @objectstack/formula.
  • check:pm-governed-merges✓ check-governed-merges --self-test: 228 assertions
  • check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).
  • check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 265 lines (ceiling 278; headroom 13).
  • check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files

Two of the seven first reported PREREQUISITE NOT MET in the fresh worktree and were treated as NOT MEASURED rather than as failures, per each gate's own text: check:doc-authoring named pnpm install, and check:doc-formula-expressions named pnpm install then two builds (@objectstack/formula, then @objectstack/lint). Each prerequisite was satisfied and the gate re-run; the green lines quoted above are from those re-runs. Every exit code was captured directly (cmd > log 2>&1; EXIT=$?), never through a pipe.

The ratchet pin is deliberately not followed down (278 → 265) in this PR: scripts/pm/check-skill-line-ratchet.mjs is serial behind another in-flight chain, and the pin follow-down is deferred to the corpus audit's Phase 3 per the ruling. The ceiling is an upper bound, so 265 ≤ 278 passes it untouched — as the quoted verdict line shows, with headroom 13.

Posture

  • Governed surface (.claude/**): this PR stays draft. No ready flip, no auto-merge, no review submitted — landing is the maintainer's call.
  • skip-changeset: applied. The diff publishes nothing from any package — it is confined to .claude/**.
  • Control-character self-scan over the edited file: clean, zero hits.

Generated by Claude Code


Generated by Claude Code

Maintainer ruling 2026-08-31, verbatim: 「13580 B(荐」 — option B adopted.
Deletes the two bullets of the runbook's duty-7 section that carry the
reader-count method: the 读者半边 bullet (the git-grep-per-key method) and
the 正对照恒先跑 bullet (the sys_share_link.email_allowlist calibration).
The instrument they describe was measured structurally blind on 104 of 121
keys, so prose explaining when to trust a blind instrument helps no PM
decision. Construct removal, net-negative lines.
The section heading and the surface half (canonical member-level diff,
measured good) stay. No replacement prose is added.
One coherence repair rides along, byte-bounded and in place: the heading
suffix drops 「与校准」 now that the calibration bullet is gone (73 -> 64
bytes, shrinks). The surviving bullet's name is left untouched because
renaming it would grow its line by 2 bytes.
271 -> 265 lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 05:11
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 05:12
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit f4d5308Aug 31, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13304-retire-reader-half branch August 31, 2026 05:27
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-dispatch): retire duty-7's reader half per maintainer ruling by claude[bot] · Pull Request #13603 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling - #13603

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half
Aug 31, 2026
Merged

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling#13603
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13304

Retires duty ⑦'s reader half from .claude/skills/pm-dispatch/references/dispatch-runbook.md, executing the maintainer ruling.

The ruling

Maintainer ruling 2026-08-31 (chat), verbatim:

「13580 B(荐」

Option B as put to the maintainer, verbatim from the ruling comment on the card:

B (recommended) — retire duty ⑦'s reader half outright: the 读者半边 and 正对照 bullets of the runbook's ⑦ section. The instrument is measured structurally blind on 104 of 121 keys; text explaining when to trust a blind instrument helps no PM decision. Construct removal, net-negative lines. The surface half (canonical diff, measured good) stays.

The ruling also settles what does not land here, verbatim:

The 同类 family's transferable sentence (grading comment above) does NOT get a replacement carrier in the runbook — under this ruling, fewer methodology sentences is the point.

Accordingly this diff adds zero replacement prose. PR #13580 (the earlier +7-line applicability-domain repair on this card) was stood down unmerged and is superseded by this one; none of its text is imported here.

The diff

One file, .claude/skills/pm-dispatch/references/dispatch-runbook.md. 271 → 265 lines (1 insertion, 7 deletions).

Deleted — the two bullets carrying the reader-count method:

  • the 读者半边 bullet (3 lines): the per-key git grep recipe plus its three hit-adjudication rules.
  • the 正对照恒先跑 bullet (3 lines): the sys_share_link.email_allowlist calibration control.

Kept, untouched — the section heading and the surface half bullet (canonical member-level diff, measured good), including its pinned baseline ref.

The one coherence repair

The heading suffix 「与校准」 ("and calibration") named the calibration bullet that this PR deletes, so leaving it would have made the heading actively false. It is dropped in place, word-level, no re-wrap:

## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准## security-object 无判决枚举(座位贴常设 ⑦)的方法

Measured: that line goes 73 → 64 bytes — it shrinks, so it is byte-bounded in the sense the in-passage word-tightening rounds on this file established (#13427, #13403, #13505 are cited here as precedent for the shape of an in-passage tightening, not as a standing permission — the authority for this edit is the ruling above).

A second rename was considered and rejected on measurement. Renaming the surviving bullet 「表面半边」 ("surface half") — whose name still references a two-half structure that no longer exists — to 「成员级 diff」 would take its line from 116 → 118 bytes, i.e. it grows. Under the byte-bound it is therefore not taken: the words stay as-is and the residual naming incoherence is left for the corpus-audit card's Phase 3 to fold in.

Verification

Acceptance table, evaluated at BOTH refs via git show REF:path

Base d47583841 (merge base) vs head 0a424c942:

checkat baseat headexpectedverdict
negative anchor: 读者半边101 → 0PASS
negative anchor: 正对照恒先跑101 → 0PASS
negative anchor: sys_share_link.email_allowlist101 → 0PASS
negative anchor: heading suffix 与校准101 → 0PASS
POSITIVE control: 表面半边 survives111 → 1PASS
POSITIVE control: section heading survives111 → 1PASS
POSITIVE control: pinned baseline ref b000ab59 survives111 → 1PASS
line count271265271 → 265PASS

The positive-control rows are load-bearing, not decoration: a zero on those would mean the instrument broke rather than that the text is gone. All three read 1 at head, so the negative-anchor zeros above them are measurements and not instrument failure.

Repo-wide sweep:git grep -n 读者半边 and git grep -n 正对照恒先跑 over the whole tree return no hits after this change — the runbook was the only carrier, so no other file needs a follow-up and none was edited.

Why no ablation applies

The ratchet is a ceiling (an upper bound on line count), and this diff only removes lines. A deletion cannot breach an upper bound, so there is no red to predict and no mutation that would produce one — an ablation here would have no failing leg to demonstrate. The reverse verification that is meaningful for a pure deletion is the two-ref acceptance table above, which is why that is what was run.

Gates

Family derived from the ACTUAL diff with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (7 families; the script derived the change set itself from the merge base). All 7 run and green at head 0a424c942. Each gate's own verdict line:

  • check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 413 file(s) · 5084 bare -- token(s) · 1284 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 80 manifest(s)
  • check:doc-authoring✓ doc authoring guard: 393 files clean — no bare metadata literals. and ✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.
  • check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged clean by @objectstack/formula.
  • check:pm-governed-merges✓ check-governed-merges --self-test: 228 assertions
  • check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).
  • check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 265 lines (ceiling 278; headroom 13).
  • check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files

Two of the seven first reported PREREQUISITE NOT MET in the fresh worktree and were treated as NOT MEASURED rather than as failures, per each gate's own text: check:doc-authoring named pnpm install, and check:doc-formula-expressions named pnpm install then two builds (@objectstack/formula, then @objectstack/lint). Each prerequisite was satisfied and the gate re-run; the green lines quoted above are from those re-runs. Every exit code was captured directly (cmd > log 2>&1; EXIT=$?), never through a pipe.

The ratchet pin is deliberately not followed down (278 → 265) in this PR: scripts/pm/check-skill-line-ratchet.mjs is serial behind another in-flight chain, and the pin follow-down is deferred to the corpus audit's Phase 3 per the ruling. The ceiling is an upper bound, so 265 ≤ 278 passes it untouched — as the quoted verdict line shows, with headroom 13.

Posture

  • Governed surface (.claude/**): this PR stays draft. No ready flip, no auto-merge, no review submitted — landing is the maintainer's call.
  • skip-changeset: applied. The diff publishes nothing from any package — it is confined to .claude/**.
  • Control-character self-scan over the edited file: clean, zero hits.

Generated by Claude Code


Generated by Claude Code

Maintainer ruling 2026-08-31, verbatim: 「13580 B(荐」 — option B adopted.
Deletes the two bullets of the runbook's duty-7 section that carry the
reader-count method: the 读者半边 bullet (the git-grep-per-key method) and
the 正对照恒先跑 bullet (the sys_share_link.email_allowlist calibration).
The instrument they describe was measured structurally blind on 104 of 121
keys, so prose explaining when to trust a blind instrument helps no PM
decision. Construct removal, net-negative lines.
The section heading and the surface half (canonical member-level diff,
measured good) stay. No replacement prose is added.
One coherence repair rides along, byte-bounded and in place: the heading
suffix drops 「与校准」 now that the calibration bullet is gone (73 -> 64
bytes, shrinks). The surviving bullet's name is left untouched because
renaming it would grow its line by 2 bytes.
271 -> 265 lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 05:11
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 05:12
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit f4d5308Aug 31, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13304-retire-reader-half branch August 31, 2026 05:27
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-dispatch): retire duty-7's reader half per maintainer ruling by claude[bot] · Pull Request #13603 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling - #13603

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half
Aug 31, 2026
Merged

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling#13603
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13304

Retires duty ⑦'s reader half from .claude/skills/pm-dispatch/references/dispatch-runbook.md, executing the maintainer ruling.

The ruling

Maintainer ruling 2026-08-31 (chat), verbatim:

「13580 B(荐」

Option B as put to the maintainer, verbatim from the ruling comment on the card:

B (recommended) — retire duty ⑦'s reader half outright: the 读者半边 and 正对照 bullets of the runbook's ⑦ section. The instrument is measured structurally blind on 104 of 121 keys; text explaining when to trust a blind instrument helps no PM decision. Construct removal, net-negative lines. The surface half (canonical diff, measured good) stays.

The ruling also settles what does not land here, verbatim:

The 同类 family's transferable sentence (grading comment above) does NOT get a replacement carrier in the runbook — under this ruling, fewer methodology sentences is the point.

Accordingly this diff adds zero replacement prose. PR #13580 (the earlier +7-line applicability-domain repair on this card) was stood down unmerged and is superseded by this one; none of its text is imported here.

The diff

One file, .claude/skills/pm-dispatch/references/dispatch-runbook.md. 271 → 265 lines (1 insertion, 7 deletions).

Deleted — the two bullets carrying the reader-count method:

  • the 读者半边 bullet (3 lines): the per-key git grep recipe plus its three hit-adjudication rules.
  • the 正对照恒先跑 bullet (3 lines): the sys_share_link.email_allowlist calibration control.

Kept, untouched — the section heading and the surface half bullet (canonical member-level diff, measured good), including its pinned baseline ref.

The one coherence repair

The heading suffix 「与校准」 ("and calibration") named the calibration bullet that this PR deletes, so leaving it would have made the heading actively false. It is dropped in place, word-level, no re-wrap:

## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准## security-object 无判决枚举(座位贴常设 ⑦)的方法

Measured: that line goes 73 → 64 bytes — it shrinks, so it is byte-bounded in the sense the in-passage word-tightening rounds on this file established (#13427, #13403, #13505 are cited here as precedent for the shape of an in-passage tightening, not as a standing permission — the authority for this edit is the ruling above).

A second rename was considered and rejected on measurement. Renaming the surviving bullet 「表面半边」 ("surface half") — whose name still references a two-half structure that no longer exists — to 「成员级 diff」 would take its line from 116 → 118 bytes, i.e. it grows. Under the byte-bound it is therefore not taken: the words stay as-is and the residual naming incoherence is left for the corpus-audit card's Phase 3 to fold in.

Verification

Acceptance table, evaluated at BOTH refs via git show REF:path

Base d47583841 (merge base) vs head 0a424c942:

checkat baseat headexpectedverdict
negative anchor: 读者半边101 → 0PASS
negative anchor: 正对照恒先跑101 → 0PASS
negative anchor: sys_share_link.email_allowlist101 → 0PASS
negative anchor: heading suffix 与校准101 → 0PASS
POSITIVE control: 表面半边 survives111 → 1PASS
POSITIVE control: section heading survives111 → 1PASS
POSITIVE control: pinned baseline ref b000ab59 survives111 → 1PASS
line count271265271 → 265PASS

The positive-control rows are load-bearing, not decoration: a zero on those would mean the instrument broke rather than that the text is gone. All three read 1 at head, so the negative-anchor zeros above them are measurements and not instrument failure.

Repo-wide sweep:git grep -n 读者半边 and git grep -n 正对照恒先跑 over the whole tree return no hits after this change — the runbook was the only carrier, so no other file needs a follow-up and none was edited.

Why no ablation applies

The ratchet is a ceiling (an upper bound on line count), and this diff only removes lines. A deletion cannot breach an upper bound, so there is no red to predict and no mutation that would produce one — an ablation here would have no failing leg to demonstrate. The reverse verification that is meaningful for a pure deletion is the two-ref acceptance table above, which is why that is what was run.

Gates

Family derived from the ACTUAL diff with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (7 families; the script derived the change set itself from the merge base). All 7 run and green at head 0a424c942. Each gate's own verdict line:

  • check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 413 file(s) · 5084 bare -- token(s) · 1284 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 80 manifest(s)
  • check:doc-authoring✓ doc authoring guard: 393 files clean — no bare metadata literals. and ✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.
  • check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged clean by @objectstack/formula.
  • check:pm-governed-merges✓ check-governed-merges --self-test: 228 assertions
  • check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).
  • check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 265 lines (ceiling 278; headroom 13).
  • check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files

Two of the seven first reported PREREQUISITE NOT MET in the fresh worktree and were treated as NOT MEASURED rather than as failures, per each gate's own text: check:doc-authoring named pnpm install, and check:doc-formula-expressions named pnpm install then two builds (@objectstack/formula, then @objectstack/lint). Each prerequisite was satisfied and the gate re-run; the green lines quoted above are from those re-runs. Every exit code was captured directly (cmd > log 2>&1; EXIT=$?), never through a pipe.

The ratchet pin is deliberately not followed down (278 → 265) in this PR: scripts/pm/check-skill-line-ratchet.mjs is serial behind another in-flight chain, and the pin follow-down is deferred to the corpus audit's Phase 3 per the ruling. The ceiling is an upper bound, so 265 ≤ 278 passes it untouched — as the quoted verdict line shows, with headroom 13.

Posture

  • Governed surface (.claude/**): this PR stays draft. No ready flip, no auto-merge, no review submitted — landing is the maintainer's call.
  • skip-changeset: applied. The diff publishes nothing from any package — it is confined to .claude/**.
  • Control-character self-scan over the edited file: clean, zero hits.

Generated by Claude Code


Generated by Claude Code

Maintainer ruling 2026-08-31, verbatim: 「13580 B(荐」 — option B adopted.
Deletes the two bullets of the runbook's duty-7 section that carry the
reader-count method: the 读者半边 bullet (the git-grep-per-key method) and
the 正对照恒先跑 bullet (the sys_share_link.email_allowlist calibration).
The instrument they describe was measured structurally blind on 104 of 121
keys, so prose explaining when to trust a blind instrument helps no PM
decision. Construct removal, net-negative lines.
The section heading and the surface half (canonical member-level diff,
measured good) stay. No replacement prose is added.
One coherence repair rides along, byte-bounded and in place: the heading
suffix drops 「与校准」 now that the calibration bullet is gone (73 -> 64
bytes, shrinks). The surviving bullet's name is left untouched because
renaming it would grow its line by 2 bytes.
271 -> 265 lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 05:11
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 05:12
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit f4d5308Aug 31, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13304-retire-reader-half branch August 31, 2026 05:27
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-dispatch): retire duty-7's reader half per maintainer ruling by claude[bot] · Pull Request #13603 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling - #13603

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half
Aug 31, 2026
Merged

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling#13603
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13304

Retires duty ⑦'s reader half from .claude/skills/pm-dispatch/references/dispatch-runbook.md, executing the maintainer ruling.

The ruling

Maintainer ruling 2026-08-31 (chat), verbatim:

「13580 B(荐」

Option B as put to the maintainer, verbatim from the ruling comment on the card:

B (recommended) — retire duty ⑦'s reader half outright: the 读者半边 and 正对照 bullets of the runbook's ⑦ section. The instrument is measured structurally blind on 104 of 121 keys; text explaining when to trust a blind instrument helps no PM decision. Construct removal, net-negative lines. The surface half (canonical diff, measured good) stays.

The ruling also settles what does not land here, verbatim:

The 同类 family's transferable sentence (grading comment above) does NOT get a replacement carrier in the runbook — under this ruling, fewer methodology sentences is the point.

Accordingly this diff adds zero replacement prose. PR #13580 (the earlier +7-line applicability-domain repair on this card) was stood down unmerged and is superseded by this one; none of its text is imported here.

The diff

One file, .claude/skills/pm-dispatch/references/dispatch-runbook.md. 271 → 265 lines (1 insertion, 7 deletions).

Deleted — the two bullets carrying the reader-count method:

  • the 读者半边 bullet (3 lines): the per-key git grep recipe plus its three hit-adjudication rules.
  • the 正对照恒先跑 bullet (3 lines): the sys_share_link.email_allowlist calibration control.

Kept, untouched — the section heading and the surface half bullet (canonical member-level diff, measured good), including its pinned baseline ref.

The one coherence repair

The heading suffix 「与校准」 ("and calibration") named the calibration bullet that this PR deletes, so leaving it would have made the heading actively false. It is dropped in place, word-level, no re-wrap:

## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准## security-object 无判决枚举(座位贴常设 ⑦)的方法

Measured: that line goes 73 → 64 bytes — it shrinks, so it is byte-bounded in the sense the in-passage word-tightening rounds on this file established (#13427, #13403, #13505 are cited here as precedent for the shape of an in-passage tightening, not as a standing permission — the authority for this edit is the ruling above).

A second rename was considered and rejected on measurement. Renaming the surviving bullet 「表面半边」 ("surface half") — whose name still references a two-half structure that no longer exists — to 「成员级 diff」 would take its line from 116 → 118 bytes, i.e. it grows. Under the byte-bound it is therefore not taken: the words stay as-is and the residual naming incoherence is left for the corpus-audit card's Phase 3 to fold in.

Verification

Acceptance table, evaluated at BOTH refs via git show REF:path

Base d47583841 (merge base) vs head 0a424c942:

checkat baseat headexpectedverdict
negative anchor: 读者半边101 → 0PASS
negative anchor: 正对照恒先跑101 → 0PASS
negative anchor: sys_share_link.email_allowlist101 → 0PASS
negative anchor: heading suffix 与校准101 → 0PASS
POSITIVE control: 表面半边 survives111 → 1PASS
POSITIVE control: section heading survives111 → 1PASS
POSITIVE control: pinned baseline ref b000ab59 survives111 → 1PASS
line count271265271 → 265PASS

The positive-control rows are load-bearing, not decoration: a zero on those would mean the instrument broke rather than that the text is gone. All three read 1 at head, so the negative-anchor zeros above them are measurements and not instrument failure.

Repo-wide sweep:git grep -n 读者半边 and git grep -n 正对照恒先跑 over the whole tree return no hits after this change — the runbook was the only carrier, so no other file needs a follow-up and none was edited.

Why no ablation applies

The ratchet is a ceiling (an upper bound on line count), and this diff only removes lines. A deletion cannot breach an upper bound, so there is no red to predict and no mutation that would produce one — an ablation here would have no failing leg to demonstrate. The reverse verification that is meaningful for a pure deletion is the two-ref acceptance table above, which is why that is what was run.

Gates

Family derived from the ACTUAL diff with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (7 families; the script derived the change set itself from the merge base). All 7 run and green at head 0a424c942. Each gate's own verdict line:

  • check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 413 file(s) · 5084 bare -- token(s) · 1284 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 80 manifest(s)
  • check:doc-authoring✓ doc authoring guard: 393 files clean — no bare metadata literals. and ✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.
  • check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged clean by @objectstack/formula.
  • check:pm-governed-merges✓ check-governed-merges --self-test: 228 assertions
  • check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).
  • check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 265 lines (ceiling 278; headroom 13).
  • check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files

Two of the seven first reported PREREQUISITE NOT MET in the fresh worktree and were treated as NOT MEASURED rather than as failures, per each gate's own text: check:doc-authoring named pnpm install, and check:doc-formula-expressions named pnpm install then two builds (@objectstack/formula, then @objectstack/lint). Each prerequisite was satisfied and the gate re-run; the green lines quoted above are from those re-runs. Every exit code was captured directly (cmd > log 2>&1; EXIT=$?), never through a pipe.

The ratchet pin is deliberately not followed down (278 → 265) in this PR: scripts/pm/check-skill-line-ratchet.mjs is serial behind another in-flight chain, and the pin follow-down is deferred to the corpus audit's Phase 3 per the ruling. The ceiling is an upper bound, so 265 ≤ 278 passes it untouched — as the quoted verdict line shows, with headroom 13.

Posture

  • Governed surface (.claude/**): this PR stays draft. No ready flip, no auto-merge, no review submitted — landing is the maintainer's call.
  • skip-changeset: applied. The diff publishes nothing from any package — it is confined to .claude/**.
  • Control-character self-scan over the edited file: clean, zero hits.

Generated by Claude Code


Generated by Claude Code

Maintainer ruling 2026-08-31, verbatim: 「13580 B(荐」 — option B adopted.
Deletes the two bullets of the runbook's duty-7 section that carry the
reader-count method: the 读者半边 bullet (the git-grep-per-key method) and
the 正对照恒先跑 bullet (the sys_share_link.email_allowlist calibration).
The instrument they describe was measured structurally blind on 104 of 121
keys, so prose explaining when to trust a blind instrument helps no PM
decision. Construct removal, net-negative lines.
The section heading and the surface half (canonical member-level diff,
measured good) stay. No replacement prose is added.
One coherence repair rides along, byte-bounded and in place: the heading
suffix drops 「与校准」 now that the calibration bullet is gone (73 -> 64
bytes, shrinks). The surviving bullet's name is left untouched because
renaming it would grow its line by 2 bytes.
271 -> 265 lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 05:11
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 05:12
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit f4d5308Aug 31, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13304-retire-reader-half branch August 31, 2026 05:27
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-dispatch): retire duty-7's reader half per maintainer ruling by claude[bot] · Pull Request #13603 · objectstack-ai/objectstack · GitHub
Skip to content

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling - #13603

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half
Aug 31, 2026
Merged

docs(pm-dispatch): retire duty-7's reader half per maintainer ruling#13603
os-zhuang merged 1 commit into
mainfrom
claude/issue-13304-retire-reader-half

Conversation

@claude

@claudeclaudeBot commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

Fixes#13304

Retires duty ⑦'s reader half from .claude/skills/pm-dispatch/references/dispatch-runbook.md, executing the maintainer ruling.

The ruling

Maintainer ruling 2026-08-31 (chat), verbatim:

「13580 B(荐」

Option B as put to the maintainer, verbatim from the ruling comment on the card:

B (recommended) — retire duty ⑦'s reader half outright: the 读者半边 and 正对照 bullets of the runbook's ⑦ section. The instrument is measured structurally blind on 104 of 121 keys; text explaining when to trust a blind instrument helps no PM decision. Construct removal, net-negative lines. The surface half (canonical diff, measured good) stays.

The ruling also settles what does not land here, verbatim:

The 同类 family's transferable sentence (grading comment above) does NOT get a replacement carrier in the runbook — under this ruling, fewer methodology sentences is the point.

Accordingly this diff adds zero replacement prose. PR #13580 (the earlier +7-line applicability-domain repair on this card) was stood down unmerged and is superseded by this one; none of its text is imported here.

The diff

One file, .claude/skills/pm-dispatch/references/dispatch-runbook.md. 271 → 265 lines (1 insertion, 7 deletions).

Deleted — the two bullets carrying the reader-count method:

  • the 读者半边 bullet (3 lines): the per-key git grep recipe plus its three hit-adjudication rules.
  • the 正对照恒先跑 bullet (3 lines): the sys_share_link.email_allowlist calibration control.

Kept, untouched — the section heading and the surface half bullet (canonical member-level diff, measured good), including its pinned baseline ref.

The one coherence repair

The heading suffix 「与校准」 ("and calibration") named the calibration bullet that this PR deletes, so leaving it would have made the heading actively false. It is dropped in place, word-level, no re-wrap:

## security-object 无判决枚举(座位贴常设 ⑦)的方法与校准## security-object 无判决枚举(座位贴常设 ⑦)的方法

Measured: that line goes 73 → 64 bytes — it shrinks, so it is byte-bounded in the sense the in-passage word-tightening rounds on this file established (#13427, #13403, #13505 are cited here as precedent for the shape of an in-passage tightening, not as a standing permission — the authority for this edit is the ruling above).

A second rename was considered and rejected on measurement. Renaming the surviving bullet 「表面半边」 ("surface half") — whose name still references a two-half structure that no longer exists — to 「成员级 diff」 would take its line from 116 → 118 bytes, i.e. it grows. Under the byte-bound it is therefore not taken: the words stay as-is and the residual naming incoherence is left for the corpus-audit card's Phase 3 to fold in.

Verification

Acceptance table, evaluated at BOTH refs via git show REF:path

Base d47583841 (merge base) vs head 0a424c942:

checkat baseat headexpectedverdict
negative anchor: 读者半边101 → 0PASS
negative anchor: 正对照恒先跑101 → 0PASS
negative anchor: sys_share_link.email_allowlist101 → 0PASS
negative anchor: heading suffix 与校准101 → 0PASS
POSITIVE control: 表面半边 survives111 → 1PASS
POSITIVE control: section heading survives111 → 1PASS
POSITIVE control: pinned baseline ref b000ab59 survives111 → 1PASS
line count271265271 → 265PASS

The positive-control rows are load-bearing, not decoration: a zero on those would mean the instrument broke rather than that the text is gone. All three read 1 at head, so the negative-anchor zeros above them are measurements and not instrument failure.

Repo-wide sweep:git grep -n 读者半边 and git grep -n 正对照恒先跑 over the whole tree return no hits after this change — the runbook was the only carrier, so no other file needs a follow-up and none was edited.

Why no ablation applies

The ratchet is a ceiling (an upper bound on line count), and this diff only removes lines. A deletion cannot breach an upper bound, so there is no red to predict and no mutation that would produce one — an ablation here would have no failing leg to demonstrate. The reverse verification that is meaningful for a pure deletion is the two-ref acceptance table above, which is why that is what was run.

Gates

Family derived from the ACTUAL diff with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (7 families; the script derived the change set itself from the merge base). All 7 run and green at head 0a424c942. Each gate's own verdict line:

  • check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 413 file(s) · 5084 bare -- token(s) · 1284 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 80 manifest(s)
  • check:doc-authoring✓ doc authoring guard: 393 files clean — no bare metadata literals. and ✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.
  • check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 426 files / 1451 TS blocks judged clean by @objectstack/formula.
  • check:pm-governed-merges✓ check-governed-merges --self-test: 228 assertions
  • check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).
  • check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 265 lines (ceiling 278; headroom 13).
  • check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files

Two of the seven first reported PREREQUISITE NOT MET in the fresh worktree and were treated as NOT MEASURED rather than as failures, per each gate's own text: check:doc-authoring named pnpm install, and check:doc-formula-expressions named pnpm install then two builds (@objectstack/formula, then @objectstack/lint). Each prerequisite was satisfied and the gate re-run; the green lines quoted above are from those re-runs. Every exit code was captured directly (cmd > log 2>&1; EXIT=$?), never through a pipe.

The ratchet pin is deliberately not followed down (278 → 265) in this PR: scripts/pm/check-skill-line-ratchet.mjs is serial behind another in-flight chain, and the pin follow-down is deferred to the corpus audit's Phase 3 per the ruling. The ceiling is an upper bound, so 265 ≤ 278 passes it untouched — as the quoted verdict line shows, with headroom 13.

Posture

  • Governed surface (.claude/**): this PR stays draft. No ready flip, no auto-merge, no review submitted — landing is the maintainer's call.
  • skip-changeset: applied. The diff publishes nothing from any package — it is confined to .claude/**.
  • Control-character self-scan over the edited file: clean, zero hits.

Generated by Claude Code


Generated by Claude Code

Maintainer ruling 2026-08-31, verbatim: 「13580 B(荐」 — option B adopted.
Deletes the two bullets of the runbook's duty-7 section that carry the
reader-count method: the 读者半边 bullet (the git-grep-per-key method) and
the 正对照恒先跑 bullet (the sys_share_link.email_allowlist calibration).
The instrument they describe was measured structurally blind on 104 of 121
keys, so prose explaining when to trust a blind instrument helps no PM
decision. Construct removal, net-negative lines.
The section heading and the surface half (canonical member-level diff,
measured good) stay. No replacement prose is added.
One coherence repair rides along, byte-bounded and in place: the heading
suffix drops 「与校准」 now that the calibration bullet is gone (73 -> 64
bytes, shrinks). The surviving bullet's name is left untouched because
renaming it would grow its line by 2 bytes.
271 -> 265 lines.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EXxTW8mvPBhoHxmyPZ63de
@os-zhuang
os-zhuang marked this pull request as ready for review August 31, 2026 05:11
@os-zhuang
os-zhuang enabled auto-merge August 31, 2026 05:12
@os-zhuang
os-zhuang added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit f4d5308Aug 31, 2026
29 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-13304-retire-reader-half branch August 31, 2026 05:27
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