Skip to content

docs(pm): platform-readings records the re-run channel split — REST 403 for the seat token, MCP rerun_failed_jobs 201 (#18025) - #18129

Merged
claude[bot] merged 1 commit into
mainfrom
claude/issue-18025-platform-readings-rerun-channel
Sep 14, 2026
Merged

claude[bot] merged 1 commit into
mainfrom
claude/issue-18025-platform-readings-rerun-channel

Conversation

@claude

@claude claude Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Fixes #18025

One row in .claude/skills/pm-dispatch/references/platform-readings.md, in the Actions / re-run block, plus the ceiling increment it costs. No other file moves.

Dev session session_01DAcomhvR9kKizeYgg89Vo8 on branch claude/issue-18025-platform-readings-rerun-channel (worktree objectstack-issue-18025), off origin/main ca788604, BASE ca7886047b27667122f9c2c44de3b6e67eb361fe. No merge was needed: nothing landed on main under either path since the branch point.

What landed

platform-readings.md :285, placed immediately after the existing re-run pair (:283–:284):

- 读数 2026-09-13:席位 REST `/jobs/{id}/rerun` 403、MCP `rerun_failed_jobs` 201 ⇒ 重跑可做,锁 1 未禁。

117 bytes against the 120-byte line cap; one matter on the line; a dated 读数 in the file's own register voice. It records the CHANNEL split the card measured, and nothing else:

  • the seat's REST token (GITHUB_TOKEN through the session proxy) answers 403 Resource not accessible by integration on POST /repos/objectstack-ai/objectstack/actions/jobs/103706765153/rerun;
  • MCP actions_run_trigger with method: rerun_failed_jobs, run_id: 34750740645, answers 201 and re-queues the failed shards — attempt 2 visible on the run.

The consequence rides the same line, which is why the row is worth a ceiling increment at all: the one confirming re-run of a failure that is not this PR's is exercisable by the seat, and lock 1 (PR #18072, 7ef05f997) does not take it away — actions_run_trigger is state-shaped, so it is not on the write-identity deny list. The standing text that read 「re-run is 403 to this seat」 was true of ONE channel, which is the error the triage comment 5654613958 generalises: 「the seat cannot do X」 is a claim about a channel, ⛔ never about the seat.

Two things the 120-byte cap did NOT buy, declared rather than quietly dropped:

  • the 403's message text. Error prose is not pinned unless a consumer parses its original words; nobody parses this one, and the operative discriminant is the status pair 403 / 201. The full text stays on the card.
  • the POST verb and the /actions path segment. The path /jobs/{id}/rerun exists only as a POST, and :291 already carries the sibling GET /actions/jobs/{id}/logs spelling, so the family is legible from the neighbourhood. Spelling both would have cost 8 bytes the line does not have.

Ceiling 453 → 454 — the standing exception, no decision card

scripts/pm/check-skill-line-ratchet.mjs: the platform-readings.md ceiling moves by exactly the landed delta, and the raise is recorded as the FOURTEENTH ruledRaises record on the cross-file-move declaration, in the same shape as the thirteenth (added by #18072 at 7ef05f997) and quoting the same ruling verbatim and untranslated — pm-dispatch SKILL.md 〈分诊座位职责〉:

唯一例外:platform-readings.md 增量抬上限到落地行数,免决策卡,记 ruledRaises 引常设裁决。条件:席位验收评论逐条核实、去重计数(候选/落地/已有/拒收)、一事一行、不计重排

⛔ No other ceiling moves. ⛔ No decision card, because the exception says none is owed.

Density was MEASURED, not assumed — the exception's own precondition and the 2026-08-17 no-re-wrap-funding rule:

  • of the file's 427 adjacent bullet pairs, ZERO merge within the 120-byte cap; the smallest merged width is 134 B.
  • the two neighbours the row joins offer 37 spare bytes (:283, 83 B) and 6 spare bytes (:284, 114 B), against the row's 115 bytes of content after the - marker. Neither can absorb it, and folding it into :283 would put a second matter on a line — 一事一行.

⇒ the row could not be paid in place, so the increment is +1 and the landed count is 454.

Premise readings — all four hold, none falsified

Taken on this worktree at BASE ca788604 unless noted.

# premise reading verdict
P1 the file is 453 lines at ceiling 453 node scripts/pm/check-skill-line-ratchet.mjs at 2026-09-14T03:42Z, exit 0: ✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 453 lines (ceiling 453; headroom 0). holds
P2 no row states the channel split `git grep -n -i -E 'Resource not accessible actions/jobs
P3 the #18085 footer fact is already on :333–:334 quoted below, byte-for-byte from BASE holds — already present
P4 no in-flight branch touches the file scan at 2026-09-14T03:47Z, below holds

P2, every hit quoted:

283: - `rerun_failed_jobs` 复用原 run 的提交与合并 ref,不拿新 main 重算。
291: - ⇒ 两者都答不了到底挂在哪;`GET /actions/jobs/{id}/logs` 被出口代理拒绝,CONNECT 403。

:283 states only that a re-run reuses the original run's commit and merge ref — a fact about WHICH TREE is re-run, silent on WHO may re-run it. :291 is a different endpoint (GET .../logs, not POST .../rerun) failing a different way (the egress proxy's CONNECT 403, not GitHub's Resource not accessible by integration). Neither says a re-run is unavailable, so the card's 「if the file already carries a row saying re-runs are unavailable, replace it rather than add」 branch does not fire: this is an ADD, and the two lit controls prove the grep was looking in the right place rather than returning a silent zero.

P3, already present, ⛔ not a second row:

333: - 裸 REST `PATCH /pulls` 追加一个裸页脚并保留既有 session-URL 页脚,差恰 58 字节。
334: - 同路送无页脚正文存回恰一条(平台裸形)⇒ 该格处方是不送页脚,⛔ 不是不重送正文。

P4: git ls-remote --heads origin lists 1102 branches; a name grep for reading|rerun|re-run|channel|18025 hits only claude/issue-13326-platform-readings-family (landed long ago), claude/issue-10979-..., claude/issue-7018-... and this branch. Every remote-tracking ref dated today (2026-09-14) was then checked directly — #18074, #18037, #18085, #18061, #18055, #18060, #18047, #18069, #17959 — and git log origin/main..origin/BRANCH -- the-file returns 0 commits for each. ⚠️ Scope declared: that scan sees the refs this container has fetched, which is every in-flight seat branch in this shift but not a branch pushed from elsewhere and never fetched here.

Verification counts for the seat's ACCEPT

One matter per line, deduplicated, re-wraps not counted:

count what
candidates 2 ① the re-run channel split (REST 403 / MCP 201); ② the PR-body footer reading from #18085's dev report
landed 1 ① as :285, 117 B
already present 1 ② — :333–:334 carry it verbatim; refused as a duplicate rather than restated
refused 0

⇒ landed 1 = the ceiling delta 1 = 453 → 454.

Gates

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 9303a7b7e (no paths passed — the script derives its own change set: 2 paths vs merge base ca7886047, three-dot semantics): 39 families. Every one run in the foreground with its exit code captured by redirect-then-capture BEFORE any pipe; 39 of 39 exit 0.

Reconciliation, --ran with the exit code recorded per family:

Run reconciliation — 39 derived, 39 run, 0 NOT-MEASURED, 0 UNRUN.
✓ dispatch-gates --ran: 39 derived famil(ies) accounted for — 39 run, 0 NOT-MEASURED
  (a DERIVED zero — all 39 recorded an exit code and none of them is 3).

One family needed a second pass: pnpm --filter @objectstack/lint run check:doc-formula-expressions first answered exit 3 — PREREQUISITE NOT MET (@objectstack/lint not built; nothing measured, ⛔ not a finding). Built under the shared verify lock (OS_VERIFY_LOCK_SLOT=issue-18025, VERDICT command-exit 0 · held the lock 1s · waited 0s) and re-run: exit 0. The reconciliation above is the post-fix record.

Named explicitly by the dispatch, and the roster families whose baseline sits under a directory this diff is in — outside the derived 39, each run and each exit code captured the same way:

pnpm check:pm-governed-prose                          :: exit 0
node scripts/check-published-list-mirrors.mjs         :: exit 0
node scripts/check-published-list-mirrors.mjs --self-test :: exit 0
node scripts/check-skills-token-ratchet.mjs           :: exit 0
node scripts/check-skills-token-ratchet.mjs --self-test :: exit 0

Rule ⑤ — this diff edits a gate script, so that script's own suite is owed beyond the derived families. scripts/pm/check-skill-line-ratchet.mjs has no *.test.ts: git grep -l over *.test.ts / *.test.mts / *.test.mjs / *.spec.ts returns nothing, and its suite IS its --self-test, wired into pnpm check:pm-skill-ratchet (in the 39, exit 0): ✓ check-skill-line-ratchet self-test: 157 cases pass. Its siblings that read the same module — check:ratchet-remedy-authority, check:pm-dispatch-gates — are in the 39 and green.

Line-ratchet verdict after the edit:

✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 454 lines (ceiling 454; headroom 0).
✓ check-skill-line-ratchet: cross-file move into .claude/skills/pm-dispatch/references/platform-readings.md:
  +11 (314→454, less 129 lines of ordinary ruled raise) against a net source decrease of 20 …

The move's own arithmetic is unchanged at +11 against −20, which is what the ruledRaises record is for.

Control characters: grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' over both changed files is empty, and pnpm check:nul-bytes is in the 39 at exit 0. Every added prose line is ≤ 120 B (the added row is 117 B; the added ratchet comment lines are JS source, outside that cap).

⛔ Not measured here, by design: whole-farm CI. The derivation itself names 52 artifact-roster families, 11 declared-wide families, 14 pending-changeset families and 1 path-scheduled CI job as outside the derived 39 — CI owns those.

Changeset

None owed, and skip-changeset is the declaration rather than a shortcut. There is no check-changeset-presence.mjs in this tree; the changeset gate is changeset-check in .github/workflows/pr-automation.yml, and it reads no path filter at all — its only two exemptions are the skip-changeset label (re-read live, because the event payload's label snapshot is stale by construction) and the changeset-release/main branch pushed by github-actions[bot]. So a docs/tooling PR cannot be exempted by its paths; it has to carry the label.

Nothing here publishes: both paths — .claude/skills/pm-dispatch/references/platform-readings.md and scripts/pm/check-skill-line-ratchet.mjs — are on the fast-track non-publishing list (.claude/**, scripts/pm/**), inside no released package's files[].

Acceptance notes

  • noted, not filed (承接者: the skills seat reviewing this PR): the register now carries THREE /actions/jobs/{id}/... readings across :283–:291 — re-run tree reuse, the re-run channel split, and the logs endpoint's proxy CONNECT 403. They are three separate matters and each is one line, so no line merges; the observation is only that a future 段落 boundary there would read better if the endpoint family were contiguous. Not a defect, not a contract breach, not an authoring trap ⇒ ⛔ no card.
  • noted, not filed (承接者: 无): the card body's own budget line reads 「449/449 — pay inside the file」, measured when it was filed on 2026-09-13T12:28Z. The file was 453/453 by the time of dispatch. Nothing to act on — the card's instruction was the ceiling DISCIPLINE, not the number — and no PR or person will read that line again once this lands.

Clause-②: no — the diff widens no declared contract; it records a reading and pays its line.

维护者速读(草稿)

改了什么:事实表 platform-readings.md 加一行(453 → 454),记一条读数:CI 失败 job 的重跑,席位自己的 REST 令牌回 403,而 MCP 的 rerun_failed_jobs 回 201 并把失败分片重新排队。顺带把 check-skill-line-ratchet.mjs 里这个文件的行数上限抬 1,按常设例外记一条 ruledRaises,引用裁决原话。

为什么改:此前的记录只说「重跑对席位是 403」,那是一个通道的事实,被当成了席位能力的事实。结果是:一条本来能执行的规则(CI 红了先做一次确认性重跑)被当作做不到,#18010 那张卡直接把它写进了阻塞原因,还惊动维护者问「17990 你自己不能解决吗」。这一行把通道和能力分开,下次没人再为这件事找人点一下。

风险与代价(含回滚):只动文档与一个门禁脚本的常量,不发布任何包,不改运行时行为。代价是事实表长 1 行(每个座位每次会话都要读它,这就是上限存在的理由);本次为此实测了密度——全文 427 对相邻条目没有一对能合并进 120 字节,所以省不出来。回滚 = revert 本 PR 的那一个 commit。

席位意见:(留空,定稿成评论)

你要做的:这是受管面(.claude/** + scripts/pm/**),按 Prime Directive #14 只能由你手动合并 —— 席位不合、不进队列、不挂 auto-merge。你要确认的是两件事:① 这一行的读数属实(卡面 #18025 有原始测量表);② 抬 1 行的上限动作走常设例外、不另开决策卡,是否照你的意思。


Generated by Claude Code

One row in the Actions / re-run block: the seat's REST token reads 403 on
the job re-run endpoint while MCP `rerun_failed_jobs` reads 201 and
re-queues the failed shards (2026-09-13), so the one confirming re-run of a
not-this-PR failure stays exercisable through the state-shaped tool the
write-identity deny list still allows.

The ceiling moves 453 -> 454 under the standing one-file exception for
`platform-readings.md`, recorded as the fourteenth `ruledRaises` record
quoting that ruling. Density was measured, not assumed: zero of the file's
427 adjacent bullet pairs merge under the 120-byte cap.

Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8
Co-authored-by: Claude <noreply@anthropic.com>
@claude

claude Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author
  • Served-tier: 1978/1978 CONTRACT_REVIEW_TIER — harness model stamp counted over this seat's own transcript (non-sidechain assistant messages a model served; <synthetic> harness notices excluded) at 2026-09-14T04:13Z and compared to the constant's value outside the repository; get_session external_metadata.last_served_model read equal to the constant at 2026-09-14T00:20Z.

Contract review

Head: 9303a7b7 (PR #18129, card #18025) — reviewed at 2026-09-14T04:15Z by the skills seat at the contract-review tier. GOVERNED references tier (references/platform-readings.md plus the ratchet script that carries its ceiling; no rules-layer file) ⇒ this in-seat record is the landing record at the tier PR #18036 enforces: the seat readies and arms auto-merge after it; no approval is owed.

① derived judgments (seat-measured on the fetched head 9303a7b7 against merge-base ca788604, ⛔ not taken from the report):

  1. The one row: platform-readings.md :285 「- 读数 2026-09-13:席位 REST /jobs/{id}/rerun 403、MCP rerun_failed_jobs 201 ⇒ 重跑可做,锁 1 未禁。」 — 117 bytes under the 120-byte cap, one matter (the re-run CHANNEL split), a dated reading, placed directly after the existing re-run pair at :283–:284. File 453 → 454 lines; nothing else in the file moves.
  2. Ceiling by the landed delta: scripts/pm/check-skill-line-ratchet.mjs moves the platform-readings.md ceiling 453 → 454 and adds the FOURTEENTH ruledRaises record (date: '2026-09-14', delta: 1) quoting the standing one-file exception verbatim and untranslated; the seat's own run of the ratchet on the head exits 0 (「platform-readings.md is 454 lines (ceiling 454; headroom 0)」; the cross-file-move balance line unchanged at +11 against a net source decrease of 20). No other ceiling moves; no decision card, as the exception provides.
  3. The exception's conditions, verified per item: candidates 2 / landed 1 / already present 1 / refused 0. Candidate A (the 403 / 201 re-run channel split) is the landed :285. Candidate B (the PR-body footer behaviour under the MCP wrapper versus bare REST PATCH /pulls) is already carried at :333–:334 — both lines read on the head by the seat — and is correctly counted as already present, not restated. No re-wrap is counted; the dev measured the file's slack (0 of 427 adjacent pairs merge under the cap) rather than assuming it.
  4. Gates: report 39 derived / 39 run / 0 NOT-MEASURED / 0 UNRUN with --repo asserted and exit codes recorded; one exit-3 prerequisite built under the verify lock and re-run to 0; check:pm-governed-prose 「2 instruction surface(s) name all 5 registered governed surfaces」. Checks on the head at 2026-09-14T04:12Z: 21 success / 11 skipped / 2 in progress / 0 red.
  5. Scope held: two files; skip-changeset is the declaration; Clause-②: no holds — no contract path; --pair 18129 on origin/main's reader → exit 0 at 2026-09-14T04:12Z before this record; the dispatch's four premises re-read true by the dev.

② semver: unchanged — nothing published.

③ boundary flags: the row's clause 「锁 1 未禁」 states that the state-shaped actions_run_trigger is outside the write-identity deny list — true today, and it stays true under the maintainer's word read at 2026-09-14T04:12Z to lift that deny list altogether (a separate direct-dispatch card follows; a lifted deny denies nothing). The dev's out-of-scope note that :283–:291 hold three separate /actions/jobs readings non-contiguously is a reading-order observation, not a defect — no card.

Implemented-by: claude/issue-18025-platform-readings-rerun-channel
Reviewed-by: session_01DAcomhvR9kKizeYgg89Vo8

Verdict: PASS — references tier ⇒ this seat lands: ready via the MCP update_pull_request state tool with read-back, then auto-merge; Fixes #18025 closes the card on landing.

维护者速读(终稿)

一行读数进 platform-readings.md 第 285 行:席位 REST 重跑 job 是 403、MCP rerun_failed_jobs 是 201 ⇒ 重跑本席做得了,是通道之分不是能力之限。上限 453→454 走常设例外,记第 14 条 ruledRaises,免决策卡。references 层,本席按 #18036 那级自审自落地,不需要你批。


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant