Skip to content

pm(skills): rest-channel.md names the relay's release.yml refresh stroke - #23476

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23410-rest-channel-release-refresh-stroke
Oct 14, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23410-rest-channel-release-refresh-stroke

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #23410

Clause-②: no

The seats' REST reference .claude/skills/pm-dispatch/references/rest-channel.md now spells the relay's release refresh stroke in its write-side table, directly under the table's one sentence on starting a run (which names no workflow and no inputs). The stroke is the maintainer's ruling on #23177 (ruling B, item 5, 「同意」, comment 6139629628): after each release-path fix merges to main, the acting seat dispatches Release with refresh_version_pr through the relay at once rather than waiting for the 6-hourly refresh. The relay side landed as PR #23209 (parent card #23193); this card was filed under #23396's ruling A. File surface: that one file, write-side section only. Line count unchanged at 82/82: the two added lines are paid by deleting two lines of the same section that restate text held elsewhere.

The spelling is read from the landed relay, not from the card: scripts/pm/fleet-write/ops.mjs line 246 at 9063727487 (blob 6d91b90d98), 'release.yml': Object.freeze({ refresh_version_pr: true }), with WORKFLOW_DISPATCH_REF = 'main' and the op row's alone: true.

The rows, before and after

Before (main at 9063727487, lines 48 to 53):

- ✓ `origin/main` 合进 PR head:中继 op `pr_update_branch`(`pull` + 40 位 `expected_head_sha`),真合并提交。
- ⛔ 裸 `PUT .../pulls/{n}/update-branch` 落个人账号;短 SHA 派发前即拒;base 未动 422 = op 报 no-op。
- ✓ 落地经中继 `node scripts/pm/fleet-write/dispatch.mjs --repo O/N --actions-file F`;`--via dispatch` 同载。
- ✓ 启动 run 走 op `workflow_dispatch`:解锁物是白名单 run 才启;入表只经 workflow 自己的 PR。
- ⛔ 裸 `PATCH /pulls/{n}` 带 `{"draft": false}` 回 200 零改;状态码不作数,`GET /pulls/{n}` 才作数。
- 线程自己建:`POST .../pulls/{n}/comments` 带 `commit_id`·`path`·`line`,回读看 `review_threads`。

After (head 42a0fd1006, lines 48 to 53):

- ✓ `origin/main` 合进 PR head:中继 op `pr_update_branch`(`pull` + 40 位 `expected_head_sha`),真合并提交。
- ✓ 落地经中继 `node scripts/pm/fleet-write/dispatch.mjs --repo O/N --actions-file F`;`--via dispatch` 同载。
- ✓ 启动 run 走 op `workflow_dispatch`:解锁物是白名单 run 才启;入表只经 workflow 自己的 PR。
- F = `[{"op":"workflow_dispatch","workflow":"release.yml","ref":"main","inputs":{"refresh_version_pr":true}}]`。
- 该 F 刷版本 PR:单 op 成文件,发版路径修复入 `main` 即发;他 input、值、ref 或缺键按名拒。
- 线程自己建:`POST .../pulls/{n}/comments` 带 `commit_id`·`path`·`line`,回读看 `review_threads`。

The first added line is the actions file a seat pastes, in the house style of the table's existing F = ... row (line 55 before, line 55 after). The second carries the rest: the stroke refreshes the Version Packages PR, the file holds that one op, it is sent at once when a release-path fix merges to main, and any other input, value, ref or a missing key is refused by name.

Line budget

line bytes what it is
deleted 49 (before) 117 the bare update-branch warning
deleted 52 (before) 115 the bare draft PATCH warning
added 51 (after) 114 the release refresh actions file
added 52 (after) 117 what it does, when it is sent, what is refused

File: 82 → 82 lines (ratchet CEILINGS row 82, headroom 0, row untouched); 7305 → 7304 bytes; every line at or under the 120-byte cap. Two deletions were found, so the card's "two lines paid by two deletions" form is used.

What each deleted line restates, and where the text still lives:

  • Line 49 before, 「⛔ 裸 PUT .../pulls/{n}/update-branch 落个人账号;短 SHA 派发前即拒;base 未动 422 = op 报 no-op。」. Each clause has another home. (1) "A bare PUT lands on the personal account": the relay's docblock, scripts/pm/fleet-write/ops.mjs lines 41 to 47 ("as bare REST under a seat's session token, the seat's personal account, the identity exchange every other relay write already refuses"). AGENTS.md line 428 bans every bare write (⛔ never a bare curl / fetch / gh api -X POST|PATCH|PUT|DELETE write), and this file's line 10 names the relay as the write channel. (2) "A short SHA is refused before dispatch": line 48 of this file (40 位 expected_head_sha), and ops.mjs lines 51 to 53 ("a short or malformed sha is refused by the validator before the dispatch"). (3) "A 422 with the base unmoved is reported by the op as a no-op": scripts/pm/fleet-write/execute.mjs lines 86 to 91 ("behind_by 0 means there was nothing to merge and the action LANDED as a no-op, the row saying so"), and the relay prints that row itself. Line 48, the pr_update_branch op, is unchanged.
  • Line 52 before, 「⛔ 裸 PATCH /pulls/{n} 带 {"draft": false} 回 200 零改;状态码不作数,GET /pulls/{n} 才作数。」. This is the queue-section reading of references/platform-readings.md, line 51, with the same claim, the same endpoint and the same read-back: 「⛔ 裸 PATCH /pulls/{n} 传 draft: false 回 200 而无操作(2026-09-11);读回才作数:GET /pulls/{n}。」. The ready and draft flips go through the relay ops on line 55 of this file, and the bare write is banned by AGENTS.md line 428. After this PR the reading has one copy, in the readings file that dates it.

The seat's two candidates were lines 57 and 49. Line 57 is not a pure restatement, so it stays. Its last clause, 「MCP 恒用户」 ("an MCP write is always the user"), appears nowhere else: grep over .claude/skills/pm-dispatch/, .claude/agents/os-dev.md and AGENTS.md finds it on line 57 only. Its other clauses are restated: the token-class readings in platform-readings.md lines 125 to 128, and the endpoint on line 73 of this file. Line 49 was used. Line 52, the second restatement, was found in the same section. Lines 48, 55, 56 and 57 are untouched.

Measured: the line's payload against the landed relay

Every case below went through node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file FILE --dry-run on head 42a0fd1006. Dry runs send nothing.

actions file exit validator says
the added line's F, verbatim 0 DRY RUN, packs workflow_dispatch / release.yml / main / {"refresh_version_pr":true}
inputs with force: true added 2 actions[0].inputs.force is not an input the relay sends to release.yml
refresh_version_pr: false 2 actions[0].inputs.refresh_version_pr must be true when workflow is "release.yml", got false
no inputs key 2 actions[0].inputs is required when workflow is "release.yml"
refresh_version_pr: "true" (string) 2 actions[0].inputs.refresh_version_pr must be a JSON boolean, got "true"
ref: "next" 2 actions[0].ref must be one of "main", got "next"
the refresh plus a comment op 2 a stroke carries exactly ONE workflow_dispatch and nothing else

Every refusal printed payload REFUSED ... ⛔ zero writes and nothing was sent. node scripts/pm/fleet-write/validate.mjs --self-test: exit 0, 152 cases across 11 batteries (the release battery is at validate.mjs line 1097).

Gates

These ran on head 42a0fd1006. Exit codes were captured before any pipe.

Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 17 commands, all exit 0.

  • node scripts/check-closing-keyword-parity.mjs 0 · --self-test 0
  • node scripts/check-comment-mask-corpus.mjs 0
  • node scripts/pm/check-harness-current.mjs --self-test 0
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions 0. The first run exited 3 (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint unbuilt). The gate measured nothing on that run. It passed after pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint, built under the shared verify lock (VERDICT command-exit 0).
  • pnpm check:agent-test-spelling 0 · check:cross-package-test-inputs 0 · check:doc-authoring 0 · check:driver-memory-census 0 · check:gitlink-declared 0 · check:nul-bytes 0 · check:pm-governed-merges 0 · check:pm-skill-id-lint 0 · check:pm-skill-ratchet 0 · check:refd-timer-probe 0 · check:skill-frame-sync 0 · check:watch-hint-literal 0
  • --ran reconciliation: exit 0, "17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED".

Gates named by the acceptance criteria, and the file's readers:

  • pnpm -s check:pm-skill-ratchet 0: "rest-channel.md is 82 lines (ceiling 82; headroom 0)"
  • node scripts/pm/check-skill-line-ratchet.mjs --self-test 0
  • pnpm check:pm-skill-id-lint 0: "87 file(s) clean"
  • pnpm check:pm-governed-prose 0
  • pnpm check:pm-settings-deny-roster 0 (its roster is under .claude)
  • node scripts/check-skills-token-ratchet.mjs 0 · node scripts/check-nul-bytes.mjs 0
  • The scripts whose prose names rest-channel, each --self-test: board-snapshot.mjs 0 · check-settings-deny-roster.mjs 0 · label-write.mjs 0 · check-prior-rulings.mjs 0 · check-harness-current.mjs 0 · close-cards.mjs 0. None of them anchors on lines 49 or 52: their mentions cite the read-side page walk or write a fixture.

No package is touched, so there is no build closure or package test. .claude/** ships in no package, so skip-changeset applies. CI's own families are read from this PR's check-runs. Governed surface: .claude/**, Tier S. The PR stays draft until the seat's contract-tier review of record.

Acceptance notes

  • No ✓ on the added lines. Line 8 of this file reserves ✓ for a route a seat has called successfully. On 2026-10-14 at 12:02Z, release.yml had 18 workflow_dispatch runs (GET .../actions/workflows/release.yml/runs?event=workflow_dispatch), and none was started by objectstack-fleet[bot]. The newest, run 38543943281 at 09:39:24Z, was started by a user account before PR tooling(pm): the fleet relay may start release.yml with refresh_version_pr true alone, so a seat refreshes the Version PR through the relay #23209 merged at 10:06:34Z. The relay's own readings of the wire spelling are recorded in the ops.mjs header: runs 38351525685 and 38357219168, both started by a user account. A ✓ fits once a seat's relay stroke has run.
  • The full refusal list stays with validate.mjs. The second added line names the refused classes in a few words. The validator's release battery (line 1097) pins each refusal and its exact message.
  • Noted, not filed (an observation about prose drift, no filing class; carrier: none): the docblock of scripts/pm/check-settings-deny-roster.mjs, lines 60 to 62, says this file's PUT .../pulls/{n}/ccr/auto_merge route "already serves every real enqueue". The table no longer carries that route. Auto-merge goes through the relay op automerge_enable (line 55), and platform-readings.md records the ccr route as retired.

维护者速读(草稿)

改了什么:席位查的 REST 通道对照表(rest-channel.md)写侧加了两行。第一行是经中继刷新 Version Packages PR 时可直接粘贴的载荷:release.yml、ref 为 main、inputs 只有 refresh_version_pr: true,文件里只放这一个 op。第二行写明发版路径的修复合入 main 后立即发送,其它 input、值、ref 或缺键都会被中继按名拒绝。另删了两行在别处已有完整原文的复述,文件仍是 82 行。

为什么改:维护者已裁定(#23177 裁决 B 第 5 条「同意」):修复合入后由当值席位立即经中继刷新版本 PR,不等六小时一次的定时刷新。中继能力已随 #23209 上线,但席位查的参考表没写这一笔,席位只能去脚本里自己推导,或像 #23193 实测的两次那样继续用个人账号刷新。

风险与代价(含回滚):只改给 agent 读的文档,不发布任何包,不动脚本。载荷写错时中继照样拒绝,不会产生任何写入。删掉的两行,原文仍在 platform-readings.md 和中继脚本的注释里。回滚就是 revert 这一个提交。

席位意见:

你要做的:无需操作。本 PR 只触及 .claude/**(Tier S),席位达档复核 PASS 后由席位落地。


Generated by Claude Code

…ml refresh stroke

The write-side table's one sentence on starting a run named no workflow and
no inputs. It now spells the actions file the relay accepts for the Version
Packages PR refresh (workflow_dispatch on release.yml, ref main, inputs
exactly refresh_version_pr true, alone in its file) and when a seat sends it
(at once after a release-path fix merges to main).

Paid in place, line count unchanged (82/82): two restatements leave the
table. The bare update-branch line is carried by the relay's own docblocks
(ops.mjs pr_update_branch header, execute.mjs base-sync header) and by the
bare-write ban; the bare draft PATCH line is platform-readings.md's queue
section reading, restated.

Claude-Session: https://claude.ai/code/session_013zGKMG1cRedVzWtqGGGZW9
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Oct 14, 2026
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 14, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 42a0fd100645199ef1027c0c3c4ee037a9ae1d0a
Local-runs: none

Reviewed in seat by the dispatching skills seat (served tier read from get_session last_served_model this fire, equal to the constant's value), on the PR diff (one file, +2/−2, one commit on 9063727487; check-governed-merges --pr 23476: .claude/** ×1 governed, Tier S), card #23410 (filing gate ④ under #23396's ruling A; the parent #23193's ruling A 6160857949 and landing 6165920038; triage's grade 6166786508, p1 under the release-first rule), the dev's report 6167956014, the file as it stands on the head (82 lines, read raw at 42a0fd1006), the landed relay (scripts/pm/fleet-write/ops.mjs WORKFLOW_DISPATCH_INPUTS and its docblock, execute.mjs, validate.mjs) and platform-readings.md on main, and the head's check-runs. The governed face is the seats' REST reference; the judgment is whether the write-side table now spells the relay's release-refresh stroke as the relay accepts it, and whether the two lines it pays with were restatements. Written 2026-10-14T12:10Z. This PR is Fixes #23410.

① Derived judgments

② Semver level

None owed: .claude/** ships in no package; skip-changeset on the PR is correct.

③ Boundary flags

  • Dev flag — two lines paid by two deletions rather than one line: the claim allowed it when two deletions are found; the pasteable F alone is 114 B, so the timing and boundary cannot share its line. Accepted.
  • Dev flag — the first seven --dry-run probes carried an inline OS_FLEET_SESSION=… assignment (dry runs, nothing sent); the three real writes let the relay derive the session from the container. Accepted (a dry-run spelling, no write).
  • Dev flag — overlap checked by fetching main into a private ref (refs/os-issue-23410/main-now, deleted at cleanup) rather than merging. Accepted.
  • Dev flag — commit trailers in AGENTS.md's model-free pair, the PR footer in its session-URL form (the harness reminder yields to AGENTS.md per os-dev.md). Accepted.
  • Observation (dev; carrier: none, noted on the PR, not filed): scripts/pm/check-settings-deny-roster.mjs L60–62's docblock still says this file's PUT …/ccr/auto_merge route "already serves every real enqueue" while the table no longer carries that route (auto-merge is L55's relay op; platform-readings.md records the ccr route as retired). Prose drift in a script comment; the seat agrees it has no filing class today and keeps it with this shift's other script-prose observations (the "ACCEPT on the card" remedy prose).
  • open_questions: none.

Implemented-by: claude/issue-23410-rest-channel-release-refresh-stroke
Reviewed-by: session_013zGKMG1cRedVzWtqGGGZW9

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · PR #23476 at 42a0fd1006 (Fixes #23410) — Tier S, landing by the seat; the card closes at the merge

Skills seat 1 (session_013zGKMG1cRedVzWtqGGGZW9, huangyiirene), written 2026-10-14T12:11Z. Report 6167956014 read; everything below is verified on GitHub and the tree, not on the report.

  1. 形态: draft PR against main; line 1 Fixes #23410 is the body's only closing keyword ([Decision] 门禁过严拖慢发版:一轮 CI 暴露全部红、成本型棘轮加容差带、门禁瘦身审计 #23177, tooling(pm): the fleet relay's workflow_dispatch can start release.yml with refresh_version_pr: true only, so a seat refreshes the Version PR through the relay (#23177 ruling B, item 5) #23193, tooling(pm): the fleet relay may start release.yml with refresh_version_pr true alone, so a seat refreshes the Version PR through the relay #23209, [Decision] 收班流程修法:清单补「释放认领 / 决策挂 needs-user-decision / 欠账必带卡号」,哪几步做成脚本检查 #23396 are named with no closing verb); Clause-②: no at line start; one file, +2/−2, one commit on 9063727487; skip-changeset (nothing published); check-governed-merges --pr 23476 → .claude/** governed, Tier S; assignee huangyiirene.
  2. 前提实测: the stroke is on main since 7cfc3400c1 (PR tooling(pm): the fleet relay may start release.yml with refresh_version_pr true alone, so a seat refreshes the Version PR through the relay #23209; ops.mjs L246 'release.yml': Object.freeze({ refresh_version_pr: true }), ref main, alone: true); the maintainer's ruling ([Decision] 门禁过严拖慢发版:一轮 CI 暴露全部红、成本型棘轮加容差带、门禁瘦身审计 #23177 B item 5, 6139629628) and triage's p1 grade (6166786508) are on the record; rest-channel.md read raw at the head: 82 lines, L51 114 B and L52 117 B, no line over 120; the two deleted lines' homes re-read on main (platform-readings.md:51, ops.mjs L41–53, execute.mjs L86–91, AGENTS.md:428, this file's L48), no script anchors on them. Judged line by line in the ## Contract review PASS record above for this head.
  3. 门禁 check-runs: 38 runs on 42a0fd1006, read 2026-10-14T12:10Z — by newest run per name 23 success, 11 skipped, none failing or in progress; Lint & Repo Gates (the ratchet reading 82/82), Lint · PM dispatch-gates, TypeScript Type Check and Governed Surface Queue Guard success; every skipped name is on the expected-skips roster (scripts/pm/check-expected-skips.mjs, read from source on main), Test Core among them for a .claude/**-only diff. The dev's local subset (17 derived families, exit 0, --ran 17/17; the acceptance-named gates and the file's six reader self-tests exit 0; seven relay --dry-run probes) is its own evidence; the farm's is these check-runs.
  4. 接受的偏差: two lines paid by two deletions (the claim's second form; the pasteable F is 114 B alone); no ✓ on the new lines under L8 (no relay-started release.yml run yet); overlap with the moved main (cb9841aa25) checked on a private ref, no merge owed; seven --dry-run probes with an inline OS_FLEET_SESSION spelling (nothing sent); AGENTS.md's model-free trailers on the commit.
  5. 范围外去向: check-settings-deny-roster.mjs L60–62's docblock names a retired ccr/auto_merge route as the enqueue path — prose drift in a script comment, no filing class, carrier: none (noted on the PR; kept with this shift's script-prose observations). The seat's L57 candidate was measured and correctly kept. No open question from the dev.
  6. 落地条款: Tier S — PASS record on this head, every check green, roster-expected skips ⇒ the seat flips pr_ready, reads mergeable_state until it settles, then arms automerge_enable as a second relay stroke; MERGED is confirmed from the queue ref and origin/main; Fixes #23410 closes the card at the merge, then pm:dispatched leaves it with a probe-table landing comment and the card gets its ACCEPT → pointer to this record. From that merge the write-side table tells every seat how to refresh the Version Packages PR through the relay; the first seat to do so earns the lines their ✓.

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/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants