Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .claude/skills/pm-dispatch/references/rest-channel.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,6 +17,14 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通

- ✓ 按标签/状态列卡:`GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N` —— `labels=` 是**真
AND**(MCP `list_issues` 的 labels 数组是 OR;语义相反那条住 `platform-readings.md`)。
- ⛔ 完整性自证,**不跟 `Link: rel="next"`**:2026-08-31/09-01 两仓实测,游标自称枯竭停在 102,页号走
法得 287/448、与 `open_issues_count` 符 ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的
`open_issues_count`(含 PR,减开放 PR)核总数;⛔ 未核总数的枚举不是读数。⚠️ 成因未知(GitHub
游标 vs 出口代理改写 `Link`):处方**不依赖该头**,⛔ 不把「已修」写成「已解释」。⚠️
关键词阳性对照**结构上**看不见本类(必中卡落在首页照样绿),只有计数核对逮得住。
- ⛔ **查重必须含 closed**:卡刚关闭时最易被重开(2026-08-31 双向实测:开域查重漏掉 6 小时前
刚关闭的同题卡 ⇒ 重复派发;含闭卡那次命中已关闭同形卡 ⇒ 免开重复)。开域查重
是**要申报的例外**,不是默认;状态 / 标签列卡读仍 `state=open` —— 那是状态读,不是查重。
- ✓ 卡 / PR 元数据:`GET .../issues/{n}` · `GET .../pulls/{n}`(assignees、labels、body 齐全 —— MCP
`list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由)。
- ✓ 整条评论线:`GET .../issues/{n}/comments?per_page=100`。
Expand All@@ -40,7 +48,7 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls`(带 `draft=true`;GraphQL 池为 0
的同一分钟里实测开得出 draft PR ⇒ 交付不必等重置)。

## 不可迁移 —— 只有这几件,围着它们排计划
## 不可迁移 —— 只有这几件,围着它们排计划(红窗守候规则住 `platform-readings.md` 配额段)

1. **draft → ready 翻转**:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集(实测拒绝)。
判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,**无 `draft`**
Expand All@@ -55,8 +63,6 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
GraphQL-only。拿不到时当轮改走「在目的仓重建」配方 —— 纯 REST、配额免疫,配方住
`platform-readings.md`。

`until remaining > 阈值` 的守候只留给这几件,⛔ 其余一切不为配额空等。

## 第三桶 —— git 零配额等价物(先问 git,再问 REST)

分支存在性、合并队列分支、按内容判落地、squash 验证:四条 `ls-remote` / `git log` 拼写与各自
Expand Down
24 changes: 23 additions & 1 deletion scripts/pm/check-skill-line-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -311,7 +311,29 @@ export const CEILINGS = new Map([
// file is the lookup table it points at, so the policy flip did not have to
// grow the hot file. Set at landed line count (headroom 0, same convention
// as the entries above).
['.claude/skills/pm-dispatch/references/rest-channel.md', 87],
// Raised 87 → 93 by a maintainer ruling (2026-09-01, 总监批 #22) that names
// this ceiling and orders its own encoding — the ratchet's own legitimate
// exit, and the raising PR quotes the ruling comment. Verbatim and
// untranslated (one quotation, wrapped only to fit this comment):
// 「**B 获授权**:`rest-channel.md` 天花板 87 → **≤93 行**,提额 PR 引用本裁决
// 评论(棘轮自己的合法出口);两条处方按 dev 已测的忠实版落(两个拒绝 +
// `&page=N` 短页终止条件 + `open_issues_count` 减开放 PR 交叉核对 + 成因未知
// 边界 + 关键词对照结构性盲区注记)」
// and, same batch, the content-ownership call that says what is paid in place:
// 「**C 同批**:退役 L58 对红窗常设规则的复述 —— 内容归属裁定:**红窗规则由
// `platform-readings.md` 配额段独家持有**,`rest-channel.md` 只留指路」
// Paid in place: that restatement and its adjacent blank are retired (−2), and
// the pointer the ruling permits is folded into the 不可迁移 heading at zero
// line cost — so the red-window rule now has exactly one home. Spent: +8, the
// two enumeration-completeness prescriptions (both refusals, the `&page=N`
// short-page termination, the `open_issues_count`-minus-open-PRs cross-check,
// the cause-unknown boundary, and the note that a keyword positive control is
// structurally blind to this class) plus the closed-inclusive dedup obligation
// the same batch ruled onto this file (「提额预算一次用足」). Could not be paid
// by re-wrap: the file measures zero reclaimable lines under this gate's own
// wrapLine, and re-wrap funding is refused per the 2026-08-17 rule in any
// case. Landed count, headroom 0, same convention.
['.claude/skills/pm-dispatch/references/rest-channel.md', 93],
['.claude/skills/pm-dispatch/references/review-checklist.md', 84],
['.claude/skills/pm-dispatch/references/landing-operations.md', 80],
// Release-aftercare duties — what a lane PM still owes AFTER a tagged release
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .claude/skills/pm-dispatch/references/rest-channel.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,6 +17,14 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通

- ✓ 按标签/状态列卡:`GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N` —— `labels=` 是**真
AND**(MCP `list_issues` 的 labels 数组是 OR;语义相反那条住 `platform-readings.md`)。
- ⛔ 完整性自证,**不跟 `Link: rel="next"`**:2026-08-31/09-01 两仓实测,游标自称枯竭停在 102,页号走
法得 287/448、与 `open_issues_count` 符 ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的
`open_issues_count`(含 PR,减开放 PR)核总数;⛔ 未核总数的枚举不是读数。⚠️ 成因未知(GitHub
游标 vs 出口代理改写 `Link`):处方**不依赖该头**,⛔ 不把「已修」写成「已解释」。⚠️
关键词阳性对照**结构上**看不见本类(必中卡落在首页照样绿),只有计数核对逮得住。
- ⛔ **查重必须含 closed**:卡刚关闭时最易被重开(2026-08-31 双向实测:开域查重漏掉 6 小时前
刚关闭的同题卡 ⇒ 重复派发;含闭卡那次命中已关闭同形卡 ⇒ 免开重复)。开域查重
是**要申报的例外**,不是默认;状态 / 标签列卡读仍 `state=open` —— 那是状态读,不是查重。
- ✓ 卡 / PR 元数据:`GET .../issues/{n}` · `GET .../pulls/{n}`(assignees、labels、body 齐全 —— MCP
`list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由)。
- ✓ 整条评论线:`GET .../issues/{n}/comments?per_page=100`。
Expand All@@ -40,7 +48,7 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls`(带 `draft=true`;GraphQL 池为 0
的同一分钟里实测开得出 draft PR ⇒ 交付不必等重置)。

## 不可迁移 —— 只有这几件,围着它们排计划
## 不可迁移 —— 只有这几件,围着它们排计划(红窗守候规则住 `platform-readings.md` 配额段)

1. **draft → ready 翻转**:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集(实测拒绝)。
判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,**无 `draft`**
Expand All@@ -55,8 +63,6 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
GraphQL-only。拿不到时当轮改走「在目的仓重建」配方 —— 纯 REST、配额免疫,配方住
`platform-readings.md`。

`until remaining > 阈值` 的守候只留给这几件,⛔ 其余一切不为配额空等。

## 第三桶 —— git 零配额等价物(先问 git,再问 REST)

分支存在性、合并队列分支、按内容判落地、squash 验证:四条 `ls-remote` / `git log` 拼写与各自
Expand Down
24 changes: 23 additions & 1 deletion scripts/pm/check-skill-line-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -311,7 +311,29 @@ export const CEILINGS = new Map([
// file is the lookup table it points at, so the policy flip did not have to
// grow the hot file. Set at landed line count (headroom 0, same convention
// as the entries above).
['.claude/skills/pm-dispatch/references/rest-channel.md', 87],
// Raised 87 → 93 by a maintainer ruling (2026-09-01, 总监批 #22) that names
// this ceiling and orders its own encoding — the ratchet's own legitimate
// exit, and the raising PR quotes the ruling comment. Verbatim and
// untranslated (one quotation, wrapped only to fit this comment):
// 「**B 获授权**:`rest-channel.md` 天花板 87 → **≤93 行**,提额 PR 引用本裁决
// 评论(棘轮自己的合法出口);两条处方按 dev 已测的忠实版落(两个拒绝 +
// `&page=N` 短页终止条件 + `open_issues_count` 减开放 PR 交叉核对 + 成因未知
// 边界 + 关键词对照结构性盲区注记)」
// and, same batch, the content-ownership call that says what is paid in place:
// 「**C 同批**:退役 L58 对红窗常设规则的复述 —— 内容归属裁定:**红窗规则由
// `platform-readings.md` 配额段独家持有**,`rest-channel.md` 只留指路」
// Paid in place: that restatement and its adjacent blank are retired (−2), and
// the pointer the ruling permits is folded into the 不可迁移 heading at zero
// line cost — so the red-window rule now has exactly one home. Spent: +8, the
// two enumeration-completeness prescriptions (both refusals, the `&page=N`
// short-page termination, the `open_issues_count`-minus-open-PRs cross-check,
// the cause-unknown boundary, and the note that a keyword positive control is
// structurally blind to this class) plus the closed-inclusive dedup obligation
// the same batch ruled onto this file (「提额预算一次用足」). Could not be paid
// by re-wrap: the file measures zero reclaimable lines under this gate's own
// wrapLine, and re-wrap funding is refused per the 2026-08-17 rule in any
// case. Landed count, headroom 0, same convention.
['.claude/skills/pm-dispatch/references/rest-channel.md', 93],
['.claude/skills/pm-dispatch/references/review-checklist.md', 84],
['.claude/skills/pm-dispatch/references/landing-operations.md', 80],
// Release-aftercare duties — what a lane PM still owes AFTER a tagged release
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .claude/skills/pm-dispatch/references/rest-channel.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,6 +17,14 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通

- ✓ 按标签/状态列卡:`GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N` —— `labels=` 是**真
AND**(MCP `list_issues` 的 labels 数组是 OR;语义相反那条住 `platform-readings.md`)。
- ⛔ 完整性自证,**不跟 `Link: rel="next"`**:2026-08-31/09-01 两仓实测,游标自称枯竭停在 102,页号走
法得 287/448、与 `open_issues_count` 符 ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的
`open_issues_count`(含 PR,减开放 PR)核总数;⛔ 未核总数的枚举不是读数。⚠️ 成因未知(GitHub
游标 vs 出口代理改写 `Link`):处方**不依赖该头**,⛔ 不把「已修」写成「已解释」。⚠️
关键词阳性对照**结构上**看不见本类(必中卡落在首页照样绿),只有计数核对逮得住。
- ⛔ **查重必须含 closed**:卡刚关闭时最易被重开(2026-08-31 双向实测:开域查重漏掉 6 小时前
刚关闭的同题卡 ⇒ 重复派发;含闭卡那次命中已关闭同形卡 ⇒ 免开重复)。开域查重
是**要申报的例外**,不是默认;状态 / 标签列卡读仍 `state=open` —— 那是状态读,不是查重。
- ✓ 卡 / PR 元数据:`GET .../issues/{n}` · `GET .../pulls/{n}`(assignees、labels、body 齐全 —— MCP
`list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由)。
- ✓ 整条评论线:`GET .../issues/{n}/comments?per_page=100`。
Expand All@@ -40,7 +48,7 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls`(带 `draft=true`;GraphQL 池为 0
的同一分钟里实测开得出 draft PR ⇒ 交付不必等重置)。

## 不可迁移 —— 只有这几件,围着它们排计划
## 不可迁移 —— 只有这几件,围着它们排计划(红窗守候规则住 `platform-readings.md` 配额段)

1. **draft → ready 翻转**:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集(实测拒绝)。
判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,**无 `draft`**
Expand All@@ -55,8 +63,6 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
GraphQL-only。拿不到时当轮改走「在目的仓重建」配方 —— 纯 REST、配额免疫,配方住
`platform-readings.md`。

`until remaining > 阈值` 的守候只留给这几件,⛔ 其余一切不为配额空等。

## 第三桶 —— git 零配额等价物(先问 git,再问 REST)

分支存在性、合并队列分支、按内容判落地、squash 验证:四条 `ls-remote` / `git log` 拼写与各自
Expand Down
24 changes: 23 additions & 1 deletion scripts/pm/check-skill-line-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -311,7 +311,29 @@ export const CEILINGS = new Map([
// file is the lookup table it points at, so the policy flip did not have to
// grow the hot file. Set at landed line count (headroom 0, same convention
// as the entries above).
['.claude/skills/pm-dispatch/references/rest-channel.md', 87],
// Raised 87 → 93 by a maintainer ruling (2026-09-01, 总监批 #22) that names
// this ceiling and orders its own encoding — the ratchet's own legitimate
// exit, and the raising PR quotes the ruling comment. Verbatim and
// untranslated (one quotation, wrapped only to fit this comment):
// 「**B 获授权**:`rest-channel.md` 天花板 87 → **≤93 行**,提额 PR 引用本裁决
// 评论(棘轮自己的合法出口);两条处方按 dev 已测的忠实版落(两个拒绝 +
// `&page=N` 短页终止条件 + `open_issues_count` 减开放 PR 交叉核对 + 成因未知
// 边界 + 关键词对照结构性盲区注记)」
// and, same batch, the content-ownership call that says what is paid in place:
// 「**C 同批**:退役 L58 对红窗常设规则的复述 —— 内容归属裁定:**红窗规则由
// `platform-readings.md` 配额段独家持有**,`rest-channel.md` 只留指路」
// Paid in place: that restatement and its adjacent blank are retired (−2), and
// the pointer the ruling permits is folded into the 不可迁移 heading at zero
// line cost — so the red-window rule now has exactly one home. Spent: +8, the
// two enumeration-completeness prescriptions (both refusals, the `&page=N`
// short-page termination, the `open_issues_count`-minus-open-PRs cross-check,
// the cause-unknown boundary, and the note that a keyword positive control is
// structurally blind to this class) plus the closed-inclusive dedup obligation
// the same batch ruled onto this file (「提额预算一次用足」). Could not be paid
// by re-wrap: the file measures zero reclaimable lines under this gate's own
// wrapLine, and re-wrap funding is refused per the 2026-08-17 rule in any
// case. Landed count, headroom 0, same convention.
['.claude/skills/pm-dispatch/references/rest-channel.md', 93],
['.claude/skills/pm-dispatch/references/review-checklist.md', 84],
['.claude/skills/pm-dispatch/references/landing-operations.md', 80],
// Release-aftercare duties — what a lane PM still owes AFTER a tagged release
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .claude/skills/pm-dispatch/references/rest-channel.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,6 +17,14 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通

- ✓ 按标签/状态列卡:`GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N` —— `labels=` 是**真
AND**(MCP `list_issues` 的 labels 数组是 OR;语义相反那条住 `platform-readings.md`)。
- ⛔ 完整性自证,**不跟 `Link: rel="next"`**:2026-08-31/09-01 两仓实测,游标自称枯竭停在 102,页号走
法得 287/448、与 `open_issues_count` 符 ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的
`open_issues_count`(含 PR,减开放 PR)核总数;⛔ 未核总数的枚举不是读数。⚠️ 成因未知(GitHub
游标 vs 出口代理改写 `Link`):处方**不依赖该头**,⛔ 不把「已修」写成「已解释」。⚠️
关键词阳性对照**结构上**看不见本类(必中卡落在首页照样绿),只有计数核对逮得住。
- ⛔ **查重必须含 closed**:卡刚关闭时最易被重开(2026-08-31 双向实测:开域查重漏掉 6 小时前
刚关闭的同题卡 ⇒ 重复派发;含闭卡那次命中已关闭同形卡 ⇒ 免开重复)。开域查重
是**要申报的例外**,不是默认;状态 / 标签列卡读仍 `state=open` —— 那是状态读,不是查重。
- ✓ 卡 / PR 元数据:`GET .../issues/{n}` · `GET .../pulls/{n}`(assignees、labels、body 齐全 —— MCP
`list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由)。
- ✓ 整条评论线:`GET .../issues/{n}/comments?per_page=100`。
Expand All@@ -40,7 +48,7 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls`(带 `draft=true`;GraphQL 池为 0
的同一分钟里实测开得出 draft PR ⇒ 交付不必等重置)。

## 不可迁移 —— 只有这几件,围着它们排计划
## 不可迁移 —— 只有这几件,围着它们排计划(红窗守候规则住 `platform-readings.md` 配额段)

1. **draft → ready 翻转**:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集(实测拒绝)。
判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,**无 `draft`**
Expand All@@ -55,8 +63,6 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
GraphQL-only。拿不到时当轮改走「在目的仓重建」配方 —— 纯 REST、配额免疫,配方住
`platform-readings.md`。

`until remaining > 阈值` 的守候只留给这几件,⛔ 其余一切不为配额空等。

## 第三桶 —— git 零配额等价物(先问 git,再问 REST)

分支存在性、合并队列分支、按内容判落地、squash 验证:四条 `ls-remote` / `git log` 拼写与各自
Expand Down
24 changes: 23 additions & 1 deletion scripts/pm/check-skill-line-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -311,7 +311,29 @@ export const CEILINGS = new Map([
// file is the lookup table it points at, so the policy flip did not have to
// grow the hot file. Set at landed line count (headroom 0, same convention
// as the entries above).
['.claude/skills/pm-dispatch/references/rest-channel.md', 87],
// Raised 87 → 93 by a maintainer ruling (2026-09-01, 总监批 #22) that names
// this ceiling and orders its own encoding — the ratchet's own legitimate
// exit, and the raising PR quotes the ruling comment. Verbatim and
// untranslated (one quotation, wrapped only to fit this comment):
// 「**B 获授权**:`rest-channel.md` 天花板 87 → **≤93 行**,提额 PR 引用本裁决
// 评论(棘轮自己的合法出口);两条处方按 dev 已测的忠实版落(两个拒绝 +
// `&page=N` 短页终止条件 + `open_issues_count` 减开放 PR 交叉核对 + 成因未知
// 边界 + 关键词对照结构性盲区注记)」
// and, same batch, the content-ownership call that says what is paid in place:
// 「**C 同批**:退役 L58 对红窗常设规则的复述 —— 内容归属裁定:**红窗规则由
// `platform-readings.md` 配额段独家持有**,`rest-channel.md` 只留指路」
// Paid in place: that restatement and its adjacent blank are retired (−2), and
// the pointer the ruling permits is folded into the 不可迁移 heading at zero
// line cost — so the red-window rule now has exactly one home. Spent: +8, the
// two enumeration-completeness prescriptions (both refusals, the `&page=N`
// short-page termination, the `open_issues_count`-minus-open-PRs cross-check,
// the cause-unknown boundary, and the note that a keyword positive control is
// structurally blind to this class) plus the closed-inclusive dedup obligation
// the same batch ruled onto this file (「提额预算一次用足」). Could not be paid
// by re-wrap: the file measures zero reclaimable lines under this gate's own
// wrapLine, and re-wrap funding is refused per the 2026-08-17 rule in any
// case. Landed count, headroom 0, same convention.
['.claude/skills/pm-dispatch/references/rest-channel.md', 93],
['.claude/skills/pm-dispatch/references/review-checklist.md', 84],
['.claude/skills/pm-dispatch/references/landing-operations.md', 80],
// Release-aftercare duties — what a lane PM still owes AFTER a tagged release
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .claude/skills/pm-dispatch/references/rest-channel.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,6 +17,14 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通

- ✓ 按标签/状态列卡:`GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N` —— `labels=` 是**真
AND**(MCP `list_issues` 的 labels 数组是 OR;语义相反那条住 `platform-readings.md`)。
- ⛔ 完整性自证,**不跟 `Link: rel="next"`**:2026-08-31/09-01 两仓实测,游标自称枯竭停在 102,页号走
法得 287/448、与 `open_issues_count` 符 ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的
`open_issues_count`(含 PR,减开放 PR)核总数;⛔ 未核总数的枚举不是读数。⚠️ 成因未知(GitHub
游标 vs 出口代理改写 `Link`):处方**不依赖该头**,⛔ 不把「已修」写成「已解释」。⚠️
关键词阳性对照**结构上**看不见本类(必中卡落在首页照样绿),只有计数核对逮得住。
- ⛔ **查重必须含 closed**:卡刚关闭时最易被重开(2026-08-31 双向实测:开域查重漏掉 6 小时前
刚关闭的同题卡 ⇒ 重复派发;含闭卡那次命中已关闭同形卡 ⇒ 免开重复)。开域查重
是**要申报的例外**,不是默认;状态 / 标签列卡读仍 `state=open` —— 那是状态读,不是查重。
- ✓ 卡 / PR 元数据:`GET .../issues/{n}` · `GET .../pulls/{n}`(assignees、labels、body 齐全 —— MCP
`list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由)。
- ✓ 整条评论线:`GET .../issues/{n}/comments?per_page=100`。
Expand All@@ -40,7 +48,7 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls`(带 `draft=true`;GraphQL 池为 0
的同一分钟里实测开得出 draft PR ⇒ 交付不必等重置)。

## 不可迁移 —— 只有这几件,围着它们排计划
## 不可迁移 —— 只有这几件,围着它们排计划(红窗守候规则住 `platform-readings.md` 配额段)

1. **draft → ready 翻转**:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集(实测拒绝)。
判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,**无 `draft`**
Expand All@@ -55,8 +63,6 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
GraphQL-only。拿不到时当轮改走「在目的仓重建」配方 —— 纯 REST、配额免疫,配方住
`platform-readings.md`。

`until remaining > 阈值` 的守候只留给这几件,⛔ 其余一切不为配额空等。

## 第三桶 —— git 零配额等价物(先问 git,再问 REST)

分支存在性、合并队列分支、按内容判落地、squash 验证:四条 `ls-remote` / `git log` 拼写与各自
Expand Down
24 changes: 23 additions & 1 deletion scripts/pm/check-skill-line-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -311,7 +311,29 @@ export const CEILINGS = new Map([
// file is the lookup table it points at, so the policy flip did not have to
// grow the hot file. Set at landed line count (headroom 0, same convention
// as the entries above).
['.claude/skills/pm-dispatch/references/rest-channel.md', 87],
// Raised 87 → 93 by a maintainer ruling (2026-09-01, 总监批 #22) that names
// this ceiling and orders its own encoding — the ratchet's own legitimate
// exit, and the raising PR quotes the ruling comment. Verbatim and
// untranslated (one quotation, wrapped only to fit this comment):
// 「**B 获授权**:`rest-channel.md` 天花板 87 → **≤93 行**,提额 PR 引用本裁决
// 评论(棘轮自己的合法出口);两条处方按 dev 已测的忠实版落(两个拒绝 +
// `&page=N` 短页终止条件 + `open_issues_count` 减开放 PR 交叉核对 + 成因未知
// 边界 + 关键词对照结构性盲区注记)」
// and, same batch, the content-ownership call that says what is paid in place:
// 「**C 同批**:退役 L58 对红窗常设规则的复述 —— 内容归属裁定:**红窗规则由
// `platform-readings.md` 配额段独家持有**,`rest-channel.md` 只留指路」
// Paid in place: that restatement and its adjacent blank are retired (−2), and
// the pointer the ruling permits is folded into the 不可迁移 heading at zero
// line cost — so the red-window rule now has exactly one home. Spent: +8, the
// two enumeration-completeness prescriptions (both refusals, the `&page=N`
// short-page termination, the `open_issues_count`-minus-open-PRs cross-check,
// the cause-unknown boundary, and the note that a keyword positive control is
// structurally blind to this class) plus the closed-inclusive dedup obligation
// the same batch ruled onto this file (「提额预算一次用足」). Could not be paid
// by re-wrap: the file measures zero reclaimable lines under this gate's own
// wrapLine, and re-wrap funding is refused per the 2026-08-17 rule in any
// case. Landed count, headroom 0, same convention.
['.claude/skills/pm-dispatch/references/rest-channel.md', 93],
['.claude/skills/pm-dispatch/references/review-checklist.md', 84],
['.claude/skills/pm-dispatch/references/landing-operations.md', 80],
// Release-aftercare duties — what a lane PM still owes AFTER a tagged release
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .claude/skills/pm-dispatch/references/rest-channel.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,6 +17,14 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通

- ✓ 按标签/状态列卡:`GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N` —— `labels=` 是**真
AND**(MCP `list_issues` 的 labels 数组是 OR;语义相反那条住 `platform-readings.md`)。
- ⛔ 完整性自证,**不跟 `Link: rel="next"`**:2026-08-31/09-01 两仓实测,游标自称枯竭停在 102,页号走
法得 287/448、与 `open_issues_count` 符 ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的
`open_issues_count`(含 PR,减开放 PR)核总数;⛔ 未核总数的枚举不是读数。⚠️ 成因未知(GitHub
游标 vs 出口代理改写 `Link`):处方**不依赖该头**,⛔ 不把「已修」写成「已解释」。⚠️
关键词阳性对照**结构上**看不见本类(必中卡落在首页照样绿),只有计数核对逮得住。
- ⛔ **查重必须含 closed**:卡刚关闭时最易被重开(2026-08-31 双向实测:开域查重漏掉 6 小时前
刚关闭的同题卡 ⇒ 重复派发;含闭卡那次命中已关闭同形卡 ⇒ 免开重复)。开域查重
是**要申报的例外**,不是默认;状态 / 标签列卡读仍 `state=open` —— 那是状态读,不是查重。
- ✓ 卡 / PR 元数据:`GET .../issues/{n}` · `GET .../pulls/{n}`(assignees、labels、body 齐全 —— MCP
`list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由)。
- ✓ 整条评论线:`GET .../issues/{n}/comments?per_page=100`。
Expand All@@ -40,7 +48,7 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls`(带 `draft=true`;GraphQL 池为 0
的同一分钟里实测开得出 draft PR ⇒ 交付不必等重置)。

## 不可迁移 —— 只有这几件,围着它们排计划
## 不可迁移 —— 只有这几件,围着它们排计划(红窗守候规则住 `platform-readings.md` 配额段)

1. **draft → ready 翻转**:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集(实测拒绝)。
判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,**无 `draft`**
Expand All@@ -55,8 +63,6 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
GraphQL-only。拿不到时当轮改走「在目的仓重建」配方 —— 纯 REST、配额免疫,配方住
`platform-readings.md`。

`until remaining > 阈值` 的守候只留给这几件,⛔ 其余一切不为配额空等。

## 第三桶 —— git 零配额等价物(先问 git,再问 REST)

分支存在性、合并队列分支、按内容判落地、squash 验证:四条 `ls-remote` / `git log` 拼写与各自
Expand Down
24 changes: 23 additions & 1 deletion scripts/pm/check-skill-line-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -311,7 +311,29 @@ export const CEILINGS = new Map([
// file is the lookup table it points at, so the policy flip did not have to
// grow the hot file. Set at landed line count (headroom 0, same convention
// as the entries above).
['.claude/skills/pm-dispatch/references/rest-channel.md', 87],
// Raised 87 → 93 by a maintainer ruling (2026-09-01, 总监批 #22) that names
// this ceiling and orders its own encoding — the ratchet's own legitimate
// exit, and the raising PR quotes the ruling comment. Verbatim and
// untranslated (one quotation, wrapped only to fit this comment):
// 「**B 获授权**:`rest-channel.md` 天花板 87 → **≤93 行**,提额 PR 引用本裁决
// 评论(棘轮自己的合法出口);两条处方按 dev 已测的忠实版落(两个拒绝 +
// `&page=N` 短页终止条件 + `open_issues_count` 减开放 PR 交叉核对 + 成因未知
// 边界 + 关键词对照结构性盲区注记)」
// and, same batch, the content-ownership call that says what is paid in place:
// 「**C 同批**:退役 L58 对红窗常设规则的复述 —— 内容归属裁定:**红窗规则由
// `platform-readings.md` 配额段独家持有**,`rest-channel.md` 只留指路」
// Paid in place: that restatement and its adjacent blank are retired (−2), and
// the pointer the ruling permits is folded into the 不可迁移 heading at zero
// line cost — so the red-window rule now has exactly one home. Spent: +8, the
// two enumeration-completeness prescriptions (both refusals, the `&page=N`
// short-page termination, the `open_issues_count`-minus-open-PRs cross-check,
// the cause-unknown boundary, and the note that a keyword positive control is
// structurally blind to this class) plus the closed-inclusive dedup obligation
// the same batch ruled onto this file (「提额预算一次用足」). Could not be paid
// by re-wrap: the file measures zero reclaimable lines under this gate's own
// wrapLine, and re-wrap funding is refused per the 2026-08-17 rule in any
// case. Landed count, headroom 0, same convention.
['.claude/skills/pm-dispatch/references/rest-channel.md', 93],
['.claude/skills/pm-dispatch/references/review-checklist.md', 84],
['.claude/skills/pm-dispatch/references/landing-operations.md', 80],
// Release-aftercare duties — what a lane PM still owes AFTER a tagged release
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .claude/skills/pm-dispatch/references/rest-channel.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,6 +17,14 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通

- ✓ 按标签/状态列卡:`GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N` —— `labels=` 是**真
AND**(MCP `list_issues` 的 labels 数组是 OR;语义相反那条住 `platform-readings.md`)。
- ⛔ 完整性自证,**不跟 `Link: rel="next"`**:2026-08-31/09-01 两仓实测,游标自称枯竭停在 102,页号走
法得 287/448、与 `open_issues_count` 符 ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的
`open_issues_count`(含 PR,减开放 PR)核总数;⛔ 未核总数的枚举不是读数。⚠️ 成因未知(GitHub
游标 vs 出口代理改写 `Link`):处方**不依赖该头**,⛔ 不把「已修」写成「已解释」。⚠️
关键词阳性对照**结构上**看不见本类(必中卡落在首页照样绿),只有计数核对逮得住。
- ⛔ **查重必须含 closed**:卡刚关闭时最易被重开(2026-08-31 双向实测:开域查重漏掉 6 小时前
刚关闭的同题卡 ⇒ 重复派发;含闭卡那次命中已关闭同形卡 ⇒ 免开重复)。开域查重
是**要申报的例外**,不是默认;状态 / 标签列卡读仍 `state=open` —— 那是状态读,不是查重。
- ✓ 卡 / PR 元数据:`GET .../issues/{n}` · `GET .../pulls/{n}`(assignees、labels、body 齐全 —— MCP
`list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由)。
- ✓ 整条评论线:`GET .../issues/{n}/comments?per_page=100`。
Expand All@@ -40,7 +48,7 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls`(带 `draft=true`;GraphQL 池为 0
的同一分钟里实测开得出 draft PR ⇒ 交付不必等重置)。

## 不可迁移 —— 只有这几件,围着它们排计划
## 不可迁移 —— 只有这几件,围着它们排计划(红窗守候规则住 `platform-readings.md` 配额段)

1. **draft → ready 翻转**:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集(实测拒绝)。
判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,**无 `draft`**
Expand All@@ -55,8 +63,6 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
GraphQL-only。拿不到时当轮改走「在目的仓重建」配方 —— 纯 REST、配额免疫,配方住
`platform-readings.md`。

`until remaining > 阈值` 的守候只留给这几件,⛔ 其余一切不为配额空等。

## 第三桶 —— git 零配额等价物(先问 git,再问 REST)

分支存在性、合并队列分支、按内容判落地、squash 验证:四条 `ls-remote` / `git log` 拼写与各自
Expand Down
24 changes: 23 additions & 1 deletion scripts/pm/check-skill-line-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -311,7 +311,29 @@ export const CEILINGS = new Map([
// file is the lookup table it points at, so the policy flip did not have to
// grow the hot file. Set at landed line count (headroom 0, same convention
// as the entries above).
['.claude/skills/pm-dispatch/references/rest-channel.md', 87],
// Raised 87 → 93 by a maintainer ruling (2026-09-01, 总监批 #22) that names
// this ceiling and orders its own encoding — the ratchet's own legitimate
// exit, and the raising PR quotes the ruling comment. Verbatim and
// untranslated (one quotation, wrapped only to fit this comment):
// 「**B 获授权**:`rest-channel.md` 天花板 87 → **≤93 行**,提额 PR 引用本裁决
// 评论(棘轮自己的合法出口);两条处方按 dev 已测的忠实版落(两个拒绝 +
// `&page=N` 短页终止条件 + `open_issues_count` 减开放 PR 交叉核对 + 成因未知
// 边界 + 关键词对照结构性盲区注记)」
// and, same batch, the content-ownership call that says what is paid in place:
// 「**C 同批**:退役 L58 对红窗常设规则的复述 —— 内容归属裁定:**红窗规则由
// `platform-readings.md` 配额段独家持有**,`rest-channel.md` 只留指路」
// Paid in place: that restatement and its adjacent blank are retired (−2), and
// the pointer the ruling permits is folded into the 不可迁移 heading at zero
// line cost — so the red-window rule now has exactly one home. Spent: +8, the
// two enumeration-completeness prescriptions (both refusals, the `&page=N`
// short-page termination, the `open_issues_count`-minus-open-PRs cross-check,
// the cause-unknown boundary, and the note that a keyword positive control is
// structurally blind to this class) plus the closed-inclusive dedup obligation
// the same batch ruled onto this file (「提额预算一次用足」). Could not be paid
// by re-wrap: the file measures zero reclaimable lines under this gate's own
// wrapLine, and re-wrap funding is refused per the 2026-08-17 rule in any
// case. Landed count, headroom 0, same convention.
['.claude/skills/pm-dispatch/references/rest-channel.md', 93],
['.claude/skills/pm-dispatch/references/review-checklist.md', 84],
['.claude/skills/pm-dispatch/references/landing-operations.md', 80],
// Release-aftercare duties — what a lane PM still owes AFTER a tagged release
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .claude/skills/pm-dispatch/references/rest-channel.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -17,6 +17,14 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通

- ✓ 按标签/状态列卡:`GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N` —— `labels=` 是**真
AND**(MCP `list_issues` 的 labels 数组是 OR;语义相反那条住 `platform-readings.md`)。
- ⛔ 完整性自证,**不跟 `Link: rel="next"`**:2026-08-31/09-01 两仓实测,游标自称枯竭停在 102,页号走
法得 287/448、与 `open_issues_count` 符 ⇒ 改走 `&page=N` 到短页为止,再用 `GET /repos/{o}/{r}` 的
`open_issues_count`(含 PR,减开放 PR)核总数;⛔ 未核总数的枚举不是读数。⚠️ 成因未知(GitHub
游标 vs 出口代理改写 `Link`):处方**不依赖该头**,⛔ 不把「已修」写成「已解释」。⚠️
关键词阳性对照**结构上**看不见本类(必中卡落在首页照样绿),只有计数核对逮得住。
- ⛔ **查重必须含 closed**:卡刚关闭时最易被重开(2026-08-31 双向实测:开域查重漏掉 6 小时前
刚关闭的同题卡 ⇒ 重复派发;含闭卡那次命中已关闭同形卡 ⇒ 免开重复)。开域查重
是**要申报的例外**,不是默认;状态 / 标签列卡读仍 `state=open` —— 那是状态读,不是查重。
- ✓ 卡 / PR 元数据:`GET .../issues/{n}` · `GET .../pulls/{n}`(assignees、labels、body 齐全 —— MCP
`list_issues` 永不返回 assignees,这条差别本身就是走 REST 的理由)。
- ✓ 整条评论线:`GET .../issues/{n}/comments?per_page=100`。
Expand All@@ -40,7 +48,7 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
- ✓ 请求复审 `POST .../pulls/{n}/requested_reviewers` · 开 PR `POST .../pulls`(带 `draft=true`;GraphQL 池为 0
的同一分钟里实测开得出 draft PR ⇒ 交付不必等重置)。

## 不可迁移 —— 只有这几件,围着它们排计划
## 不可迁移 —— 只有这几件,围着它们排计划(红窗守候规则住 `platform-readings.md` 配额段)

1. **draft → ready 翻转**:GraphQL-only mutation;出口代理只放钉住的 PR-review GraphQL 集(实测拒绝)。
判据 = REST update-a-pull-request 只收 `title`/`body`/`state`/`base`/`maintainer_can_modify`,**无 `draft`**
Expand All@@ -55,8 +63,6 @@ payload → REST → MCP/GraphQL** 的策略住那里,本表是逐操作的通
GraphQL-only。拿不到时当轮改走「在目的仓重建」配方 —— 纯 REST、配额免疫,配方住
`platform-readings.md`。

`until remaining > 阈值` 的守候只留给这几件,⛔ 其余一切不为配额空等。

## 第三桶 —— git 零配额等价物(先问 git,再问 REST)

分支存在性、合并队列分支、按内容判落地、squash 验证:四条 `ls-remote` / `git log` 拼写与各自
Expand Down
24 changes: 23 additions & 1 deletion scripts/pm/check-skill-line-ratchet.mjs
Original file line numberDiff line numberDiff line change
Expand Up@@ -311,7 +311,29 @@ export const CEILINGS = new Map([
// file is the lookup table it points at, so the policy flip did not have to
// grow the hot file. Set at landed line count (headroom 0, same convention
// as the entries above).
['.claude/skills/pm-dispatch/references/rest-channel.md', 87],
// Raised 87 → 93 by a maintainer ruling (2026-09-01, 总监批 #22) that names
// this ceiling and orders its own encoding — the ratchet's own legitimate
// exit, and the raising PR quotes the ruling comment. Verbatim and
// untranslated (one quotation, wrapped only to fit this comment):
// 「**B 获授权**:`rest-channel.md` 天花板 87 → **≤93 行**,提额 PR 引用本裁决
// 评论(棘轮自己的合法出口);两条处方按 dev 已测的忠实版落(两个拒绝 +
// `&page=N` 短页终止条件 + `open_issues_count` 减开放 PR 交叉核对 + 成因未知
// 边界 + 关键词对照结构性盲区注记)」
// and, same batch, the content-ownership call that says what is paid in place:
// 「**C 同批**:退役 L58 对红窗常设规则的复述 —— 内容归属裁定:**红窗规则由
// `platform-readings.md` 配额段独家持有**,`rest-channel.md` 只留指路」
// Paid in place: that restatement and its adjacent blank are retired (−2), and
// the pointer the ruling permits is folded into the 不可迁移 heading at zero
// line cost — so the red-window rule now has exactly one home. Spent: +8, the
// two enumeration-completeness prescriptions (both refusals, the `&page=N`
// short-page termination, the `open_issues_count`-minus-open-PRs cross-check,
// the cause-unknown boundary, and the note that a keyword positive control is
// structurally blind to this class) plus the closed-inclusive dedup obligation
// the same batch ruled onto this file (「提额预算一次用足」). Could not be paid
// by re-wrap: the file measures zero reclaimable lines under this gate's own
// wrapLine, and re-wrap funding is refused per the 2026-08-17 rule in any
// case. Landed count, headroom 0, same convention.
['.claude/skills/pm-dispatch/references/rest-channel.md', 93],
['.claude/skills/pm-dispatch/references/review-checklist.md', 84],
['.claude/skills/pm-dispatch/references/landing-operations.md', 80],
// Release-aftercare duties — what a lane PM still owes AFTER a tagged release
Expand Down
Loading