Repository navigation
Commit 9acb9ed
refs(pm-dispatch): bank five measured platform readings, paid for by same-file compression (#12659)
* docs(pm-skill): record that a free-text negation is inert in search_pull_requests
A leading `-` on a quoted phrase is silently dropped: `-"Part of"` and
`"Part of"` return the same total_count and the same top hit, and
197 + 197 does not reconcile against the unfiltered 216 — so the two are
not a partition of anything. The qualifier half of the same query keeps
exact arithmetic (linked:issue 2903 + -linked:issue 216 = 3119), which is
what makes the failure dangerous: one call returns correct arithmetic from
the qualifiers and silent nonsense from the free text. The row carries the
discipline that follows — any stratification built on a free-text term must
run its complement and sum both against the unfiltered population.
Paid for in the same file (line ratchet 314/314, headroom 0):
- search_issues session-zeroing row 12 -> 10: dropped "不是工具/平台级"
(survives as 故障是**会话级**), the perPage pointer (own row above), the
"极易半途而废" aside (survives as the 226/100 specimen) and the
undetermined-mechanism tail (survives as ⛔ 已推翻别再追).
- 读数五坑 `gh` clause 7 -> 5: dropped the `command -v gh` exit-1 evidence
(survives as **容器里没有 `gh`**) and the pipe-exit-code cross-reference
(survives in os-dev.md's 门禁结果读法 clause).
- auto-tier classifier row 5 -> 4: label-POST specimen compressed to
判定还跨天翻面, keeping the cross-day fact and dropping the anecdote.
- quota-per-account row 7 -> 6: dropped 端点自身不计费 (survives at the
开轮先读配额 clause's "免费") and the used-10461/core-7 specimen
(survives as the independent-pools reading in the 默认读序 row).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MnijPVVDakqK2J335JoJtq
* docs(pm-skill): name the reachable positive enqueue instrument, and that auto_merge is unstable
The merge-queue rows recorded what cannot tell you a PR is enqueued
(`auto_merge` reads back off, `merge_group` is a false negative off the
queue front) and named the authoritative confirmation as a webhook — so a
seat with a blind instrument and a ⛔ rule that depends on the reading it
cannot make did the predictable thing and re-armed an already-enqueued PR.
Per the filing seat's own correction, the webhook IS reachable from a
subscribed session (measured within ~1s of the timeline event), so the row
states the division rather than a gap: the timeline is the reading you make
— queryable on demand, both directions from one call, and it separates
"never enqueued" from "enqueued then ejected" — while the webhook is
push-only corroboration that a fresh context or an unsubscribed seat cannot
recover. `auto_merge` is upgraded from absent to UNSTABLE: the same PR read
`set` and then `None` within a minute, so "not armed" is never a conclusion.
Sits beside the just-landed mergeable_state / update_pull_request /
draft-dequeue reshaping; none of those cuts is reopened.
Paid for in the same file (line ratchet 314/314, headroom 0):
- MCP read-side entity row 7 -> 5: dropped the write-side shape enumeration
(survives in the 写侧实测行为 rows it pointed at) and the MCP-or-API
attribution aside, keeping the & boundary.
- REST-availability row 12 -> 11: shift matrix trimmed to the two readings
that prove 门态逐容器变; the per-entry gh/rate_limit details survive at
the 单调用凭据判别 clause and the 读数五坑 gh clause.
- probe-branch row 8 -> 7: dropped the pre-claim-check restatement
(survives as 失效方向是活卡被永久读成已被认领) and the undiagnosed-cause
enumeration, keeping the boundary itself.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MnijPVVDakqK2J335JoJtq
* docs(pm-skill): record that the session proxy's /search 403 parses as a clean zero
Unauthenticated REST from inside a session reaches repository-scoped paths
only; anything under /search/ is refused by the proxy. The refusal body is
valid JSON, so a caller reading total_count off it gets None and formats it
as `total: None` — one character away from a real empty result set. A
duplicate check that ran three such queries produced three clean-looking
zeros, and the request never ran at all. The instrument for /search
questions is the MCP search tools; repo-scoped enumeration is unaffected.
Placed directly under the session-zeroing row so that row's "见下条" pointer
resolves, and it carries the pairing the card asked for: run the positive
control FIRST, because a zero that matches your expectations is the one you
never re-check — here the control zeroing alongside the others is the only
reason the artefact was caught.
Paid for in the same file (line ratchet 314/314, headroom 0):
- truncation-diagnosis row 12 -> 10: dropped the WebFetch restatement (the
same instruction survives in the merged ⛔ 永不单凭 MCP 读判截断 clause),
the three-seat observation anecdote, and the 0-span/10-tag control
example (the 判据 itself survives verbatim).
- sanitizer author-rule row 7 -> 6: the comment-exemption history compressed
to ⛔ 评论不豁免 (the mechanism survives in the 评论 row below it).
- sanitizer issue-body row 9 -> 7: merged the two fenced-behaviour readings
into one dated clause, dropped the negative-lookbehind aside and the
"同类标记在评论里存活" note whose rule survives as ⛔ 评论不豁免.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MnijPVVDakqK2J335JoJtq
* docs(pm-skill): record that issue_read get_labels cannot resolve a PR number
`issue_read` with method `get_labels` and a PULL REQUEST number fails with a
GraphQL resolution error — its query resolves the Issue type only, so the
REST convention that a PR is also an issue does not carry over. Measured
twice on different PRs by different dev runs in the same hour. Label
read-backs on PRs are a mandated step, so every dev walks this path and
re-derives the workaround alone; the row names the working read
(`pull_request_read get`, whose response carries the labels array) and rules
out the obvious fallback of spending a search-channel call to answer a
single-PR question. The failure is loud, which is the good direction — the
row exists to stop the re-derivation, not to prevent a wrong answer.
Placed with the other label-semantics traps (`labels` OR-vs-AND, the
whole-set replace) so the read-back rule and its instrument sit together.
Paid for in the same file (line ratchet 314/314, headroom 0):
- MCP-parameter row 10 -> 9: the OR-side evidence keeps the sharper of the
two specimens (a two-label "intersection" wider than one of its own
inputs) and drops the duplicate one.
- list_issues-assignees row 3 -> 2: dropped the trailing ⛔ restatement,
which repeats 清单只是候选名单 verbatim in imperative form.
- MCP list/search row 3 -> 2: dropped the navigational pointer to the
session-gate row printed directly above it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MnijPVVDakqK2J335JoJtq
* docs(pm-skill): record the tier-quota death shape and the per-path mandate re-derivation
Two rows, both measured 2026-08-27.
A dispatched subagent that terminates mid-edit because the account's model
tier hit its limit is a THIRD death shape, and the fact table had no name
for it: the host reports the limit, so it is neither an ordinary subagent
death nor a maintainer abort — the dispatch is dead, the premise is intact,
and re-dispatch is blocked on a resource rather than on anything about the
card. Handling is dead-claim recovery plus worktree rescue, not premise
re-verification and not an escalation. No pre-flight probe exists (quota
state is observable only once a dev dies inside it), so the mitigation is
dev-side WIP-committing, which the row says rather than implying.
The second row is what keeps the lane moving. A mandated tier must not be
downgraded because it is unavailable — that is the substitution the
downgrade fuse refuses — but "this lane is fable-mandated" is usually
recalled rather than derived, and the recalled version is too wide.
Re-deriving with dispatch-gates --tier PER FILE SURFACE splits a blocked
fold instead of stopping it (measured: SKILL.md and .claude/agents/** are
mandated; scripts/pm/** and references/** carry no path mandate, turning a
fully-blocked three-card fold into one blocked half and three runnable
ones). The path line is a floor, never a clearance — content clauses are
still judged separately.
Paid for in the same file (line ratchet 314/314, headroom 0):
- sanitizer comment row 8 -> 6: dropped the second-order anecdote (the card
recording the incident truncating at the same point), the safe-authoring
recipe (verbatim in the author-rule row above) and the "人看着像正常收尾"
restatement; the truncation shape, the fuse and the worst-case boundary
all stay.
- silent-downgrade rows 9 -> 8: the host-fork row was entirely a modifier on
the row above it, so it becomes that row's 1 parent 3519f8d commit 9acb9ed
1 file changed
Lines changed: 117 additions & 117 deletions
0 commit comments