Skip to content

docs(os-dev): name the harness attribution-line exemption in 〈干净收尾〉; Check Changeset reads the PR body - #25393

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-r6oa8t
Oct 23, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-r6oa8t

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #25220
Clause-②: no
Metadata-protocol: none

.claude/agents/os-dev.md only, net zero lines (404 → 404; ceiling 404 untouched). One exemption line under 〈干净收尾〉's HTML-comment ban: the harness-written attribution comment on PR body line 1 stays exactly as the harness gives it and the dev reports it; Fixes #N then sits on the first line after it; every HTML comment the dev writes itself stays banned. Paid by deleting the cdn.playwright.dev 403 line (moot under the playwright install ban directly above it). Carry-over from PR #25240's contract review: the changeset-line rule now says Check Changeset reads the two declaration lines off the PR body (scripts/check-changeset-no-major.mjs declarationFromPullRequest, readClause2Line(pr.body) / readMetadataProtocolLine(pr.body)); the changeset-body copy is AGENTS.md Post-Task Checklist ③'s publishing rule (check:adr-0087-registration reads it there). Every changed line is ≤120 bytes; no re-wrap.

维护者速读(草稿)

改了什么:os-dev.md 两处。① 〈干净收尾〉HTML 注释禁令下加一行例外:harness 自写的 PR 正文首行归属注释原样留、只报;Fixes #N 紧随其后;dev 自写的 HTML 注释仍禁。② 「两行同抄进 changeset 正文行首」一行改为写明 Check Changeset 读的是 PR 正文。为付行数,删掉 Toolchain traps 里 cdn.playwright.dev 403 那一行(上一行已禁 playwright install,该情形不再出现)。

为什么改:项目线程的 harness 要求 PR 正文第一行是一条 HTML 注释归属行,与 os-dev.md 的 HTML 注释禁令必然冲突,此前每张卡都只能记一条 deviation。② 来自 PR #25240 的合同复核:门禁实际读 PR 正文(check-changeset-no-major.mjs),原句写成读 changeset,会误导。

风险与代价(含回滚):仅规则文本,不发布、不改脚本。风险是删掉的 403 一行所载的教训丢失(被上一行规则覆盖)。回滚 = revert 本 PR 一个 commit。

席位意见:

你要做的:席位的 CONTRACT_REVIEW_TIER PASS 落在本 head 之后,一句「objectstack-ai/objectstack#N 可以落地」(N 为本 PR 号)。

Gates

Derived with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at fc7b53ff (20 commands); all 20 ran on the working tree that became da46daf, each exit code captured before any pipe; --ran reconciliation: 20 derived, 20 run, 0 NOT-MEASURED, 0 UNRUN. All exit 0, including pnpm check:pm-skill-ratchet (os-dev.md is 404 lines (ceiling 404; headroom 0)) and pnpm check:pm-skill-id-lint. check:doc-formula-expressions exit 0 (no prerequisite build needed). CI-only families (type-check lanes, wide-population and roster families) are read off this PR's check-runs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01REMuzhz6MWRjg8uohedMnM

…Check Changeset reads the PR body

One exemption line under the HTML-comment ban: the harness-written attribution
comment on PR body line 1 stays as given and is reported; `Fixes #<n>` follows
it; every HTML comment the dev writes itself stays banned. Paid by dropping the
cdn.playwright.dev 403 line (moot under the no-`playwright install` rule above
it). The changeset-line rule now says `Check Changeset` reads the two
declaration lines off the PR body (check-changeset-no-major.mjs
declarationFromPullRequest); the changeset-body copy is AGENTS.md Post-Task
Checklist ③'s publishing rule. Net zero lines; ceiling 404 untouched.

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

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: da46dafac5dd78e22357b5e029c0a801147a08fa
Local-runs: none
Scope: .claude/agents/os-dev.md + scripts/check-changeset-no-major.mjs, scripts/pm/clause2-line.mjs, AGENTS.md (Post-Task Checklist ③), .github/workflows/pr-automation.yml (Check Changeset job), docs/qa/platform-checklist/RUNNER.md, pnpm-workspace.yaml (onlyBuiltDependencies), scripts/pm/check-skill-line-ratchet.mjs (ceiling map)

Written 2026-10-23T07:08Z. Review of draft PR #25393 (Fixes #25220) against origin/main at 5f6c2f19 (the PR's base), diff taken from the merge-base fc7b53ff: one file, .claude/agents/os-dev.md, +2/−2, 404 → 404 lines. Spec read: card #25220 body (Ask + Acceptance), the seat-1 handover comment 6343602884 (2026-10-22T14:45Z) carrying the carry-over reword, and the seat's claim 6359244707 (2026-10-23T06:50Z). Angle-bracket placeholders in the quoted Chinese below are spelled N instead of the file's literal form, because the body sanitizer eats tag-shaped fragments; the file itself keeps its spelling.

① Derived judgments

Face: governed rules text (.claude/agents/os-dev.md is protocol semantics per dispatch-gates --tier: MANDATORY, clause ①). No published schema, no packages/spec/src/**, no Tier H path: the only path is under .claude/**, which os-dev.md L287 and AGENTS.md Prime Directive 14 put in Tier S. Governed Surface Queue Guard on the head: success.

(a) The exemption line, 〈干净收尾〉 L323 (new, 118 bytes): 「- 例外:harness 自写的 PR 正文首行归属注释原样留、只报;Fixes #N 紧随其后;dev 自写仍禁。」 — CORRECT, with one wording note in ③.

  • Shape: it mirrors the existing harness-trailer exemption at L286 「harness 自写含模型名 trailer 只报,⛔ 不仿不改史」: harness-written, keep verbatim, report it (只报), and the dev's own writing stays under the ban (dev 自写仍禁). Scope is bounded three ways — harness-written, PR body, first-line attribution comment — so nothing else in the ban at L321–322 is loosened; L18 「⛔ 不用 HTML 注释写标记」 (the report marker) and L324 (angle-bracket spellings) are untouched.
  • Consistency with L274 「Draft PR 指向 main,正文首行 Fixes #N」: L274 stays unconditional, but L323 is labelled 例外 and itself re-places Fixes #N, so a reader has a specific rule (harness block present ⇒ Fixes follows it) over a general one (otherwise line 1). The card accepted either "say it" or "point to the rule"; this line says it. Not two contradicting rules — but L274 is now a general rule with an exception stated 49 lines away; see ③ for the stale sibling in the PM-side checklist.
  • Measured against a real harness-attributed body (PR docs(pm-dispatch): card-thread backend (mode:thread), coordinator scheduling and per-card dispatch effort #25214): line 1 is the HTML comment, line 2 is the _Requested by_ line, line 3 blank, line 4 Fixes. The new line names only the first-line comment as what is kept; the second line is not an HTML comment and needs no exemption. 「紧随其后」 reads "right after it"; the measured placement is "first line after the block". Precision note, not a defect: the harness itself hands the dev the block, and the only sanctioned action on it is 原样留. ③ carries a ratchet-neutral alternative spelling.

(b) The changeset-line reword, L280 (in place, 111 bytes): old 「- 两行同抄进每个 changeset 正文行首,Check Changeset 读:有 kind 即 minor,none 即 patch。」 → new 「- 两行同抄进 changeset 正文行首;Check Changeset 读 PR 正文:kind 即 minor,none 即 patch。」 — CORRECT.

  • Check Changeset is the changeset-check job in .github/workflows/pr-automation.yml L244, running scripts/check-changeset-no-major.mjs. Its declarationFromPullRequest(pr) (L1808) reads both lines off the PR body: readClause2Line(pr.body ?? '') at L1818 and readMetadataProtocolLine(pr.body ?? '') at L1843; the only caller is L2861 over the event payload's pull_request. Neither reader is applied to a changeset file anywhere in that script, so the old sentence (the gate reads the changeset copy) was the misstatement the carry-over named, and the new one is what the code does.
  • The changeset-body copy survives as the first clause; its owner is AGENTS.md Post-Task Checklist ③ ("Two line-initial declarations, in the PR body and the changeset body … the changeset body, which also carries both declaration lines (pnpm check:adr-0087-registration reads the arm and the kind there)"). Dropping 「每个」 loses nothing: the clause still says every changeset body carries them (Chinese is numberless; AGENTS.md ③ says the same without "each").
  • 「有 kind 即 minor」 → 「kind 即 minor」: no meaning lost. In the gate's own vocabulary "kind" is the closed set added|narrowed|semantic as opposed to none (METADATA_PROTOCOL_KINDS in scripts/pm/clause2-line.mjs L515; the remedy text at check-changeset-no-major.mjs L2302: "none is patch, a kind is minor"; the banner at L2173–2174: a kind takes at least minor on a moved package, none takes patch). The (narrowing) arm also shipping minor (L1838) was not in the old line either; unchanged simplification.

(c) The payment line, Toolchain traps L128 (deleted, 111 bytes): 「- cdn.playwright.dev 的 403 不是没有浏览器的证据:下载被拦不证明产物缺席,先找产物。」 — the deletion is SOUND; no guidance a dev can act on is lost.

  • When can a dev here see a cdn.playwright.dev 403 at all? Only by downloading browsers. The two surviving lines (L126–127) say Chromium is preinstalled at PLAYWRIGHT_BROWSERS_PATH=/opt/pw-browsers, say to launch with executablePath: '/opt/pw-browsers/chromium', and ban playwright install outright. The other download route, a playwright/@playwright/test postinstall, does not run: pnpm 10.31 (packageManager) runs dependency build scripts only for pnpm-workspace.yaml onlyBuiltDependencies (better-sqlite3, esbuild, mongodb-memory-server, msw, sharp) and playwright is not among them; the workspace's own deps are playwright-core (no downloader) in service-print and dogfood, and @playwright/test only in examples/app-showcase.
  • The failure a dev actually meets is the launch error Executable doesn't exist at …/chromium_headless_shell-1243/… (RUNNER.md L210–225: the package wants build 1243, the image holds 1194), whose remedy is exactly the surviving executablePath line. The deleted line's remedy 「先找产物」 is already answered more concretely by L126 (where the artefact is). Its epistemic half (a blocked download is not evidence of absence) is reachable only after a dev has already broken the ⛔ on the line above it; a rule for the reader who ignores the adjacent ⛔ is not guidance the file owes. The generic lesson also survives on the PM side at references/platform-readings.md L270–271 (「被拦的下载不是缺席证明:出口策略 403 只说取不来,不说没有,先找产物再下结论。」 plus the reading).
  • Origin of the line: git log -S reaches only 60b42cd0b (the commit at this shallow clone's boundary, which shows the whole file as added), so its true landing commit is NOT MEASURED here; the judgment above rests on the current text and the current toolchain facts, not on its history.

Ratchet and lints: ceiling map ['.claude/agents/os-dev.md', 404] untouched; wc -l 404 on the head (404 on main); every changed line ≤120 bytes (118, 111, 111, 111); no # followed by 3+ digits in any added line (id-lint pattern); the 120-byte long-line allowance for this file stays 0. Lint · PM dispatch-gates on the head: success (the ratchet and id-lint families run there). The standing rule 「必须人工决裁」 lives in references/lanes/director.md, not in os-dev.md on either side of the diff, so it is untouched by construction.

PR form: draft, base main, body line 1 Fixes #25220 (the card is fully delivered by this PR: exemption + carry-over, so a closing keyword is right), Clause-②: no and Metadata-protocol: none on lines 2–3, no HTML comment in the body (an in-seat subagent has no harness attribution block), no other open card number near a closing keyword. Labels skip-changeset + domain:skills as the claim planned. pr_create carried the attribution; no PATCH.

② Semver level

.claude/** publishes nothing (os-dev.md L299 fast-track list; AGENTS.md ③), the diff moves no files[] content of any private: false package, so skip-changeset is the correct declaration and no changeset is owed. Clause-②: no (no accept set or public surface moves) and Metadata-protocol: none match the diff. Check Changeset on the head: success (the label fast path). No ! in the title, no (narrowing) arm ⇒ no dogfood battery owed.

③ Boundary flags

  • Independence: implementer and reviewer are both this seat's subagents (in-seat S card per the claim's Container & model line and handover 6343602884: S mechanical cards run in the seat). Implemented-by is the seat thread's designated push branch, Reviewed-by the seat session; the adversarial-brief shape was kept (diff, card, handover, claim and head check-runs only; no dispatch order, no dev self-assessment).
  • Wording note on (a), for the seat, not a fix owed before landing: 「紧随其后」 vs the measured "first line after the block". A ratchet-neutral alternative within 120 bytes, if the seat wants the block named: 「- 例外:harness 自写的 PR 正文开头归属块原样留、只报;Fixes #N 紧随块后;dev 自写仍禁。」 (115 bytes with the literal placeholder). Not a FAIL: the harness hands the dev the block and 原样留 is the only sanctioned action on it.
  • Follow-up outside this PR's file surface: L274 「正文首行 Fixes #N」 stays unconditional, and the PM-side references/review-checklist.md L7 「正文首行引用卡片」 has no exemption at all, so a seat checking a project-thread PR by that line still reads line 1 as the carrier. Carrier: the owning seat decides whether a card is worth a line there.
  • Dev-side deviations/open_questions: none flagged in the PR body; the body's own risk line (the deleted 403 lesson) is answered in ①(c).
  • Check-runs on the head, read via the API 2026-10-23T07:08Z: 50 check runs, all completed, none failed (success or skipped); the required floor Lint & Repo Gates and TypeScript Type Check both success; Governed Surface Queue Guard, Lint · PM dispatch-gates, Check Changeset, Check PR Size, the two single-claim guards and The card this PR closes must claim this branch all success. An earlier reading at 2026-10-23T07:06Z still had seven lint/type-check jobs in_progress; this record waited for them. The verdict below is on the diff; the check reading is the landing gate's second condition, stated here for the seat.

Implemented-by: claude/project-thread-r6oa8t
Reviewed-by: session_01REMuzhz6MWRjg8uohedMnM

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · domain:skills#2 · os-elon-musk · session_01REMuzhz6MWRjg8uohedMnM · 2026-10-23T12:52Z · head da46dafac5dd78e22357b5e029c0a801147a08fa · Tier S (check-governed-merges.mjs --pr 25393: .claude/agents/os-dev.md, no Tier H path, 4 changed lines ≤ 3000)

Landing authority: the maintainer's own words in this seat's thread of the Claude Code project "Objectstack" (os-elon-musk account), 2026-10-23T12:49Z: 「#25247 #25255 #25393 可以落地」, naming this PR.

  1. Shape: draft, base main, Fixes #25220 the only closing keyword, skip-changeset (.claude/** only or with scripts/pm ceiling rows; no package).
  2. Gates (check-runs pinned to this head): every check-run completed, none failed.
  3. Contract review: CONTRACT_REVIEW_TIER PASS on this head, record 6359525303.
  4. Landing order: the three PRs named together merge cleanly onto main f0fdd45bb in the order docs(pm-dispatch): fold the engine, services and cli lanes into domain:server #25247, docs(pm-dispatch): a project-coordinator reference — the cross-lane scheduling rules a Claude Code project runs by, so its instructions name only its lanes #25255, docs(os-dev): name the harness attribution-line exemption in 〈干净收尾〉; Check Changeset reads the PR body #25393 (git merge-tree, no conflict); on the combined tree SKILL.md is 318 lines, .claude/agents/os-dev.md 404, and check-skill-line-ratchet.mjs exits 0. It merges cleanly with open PR docs(pm-dispatch): a project-run seat form beside the Routine form — the seat post as a stub, the dispatch order in the card thread, event wake plus one patrol per project, 项目总监 → 总监席 #25385 too (os-dev.md stays 404).
  5. This seat flips ready and arms auto-merge now.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 23, 2026 12:54
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 23, 2026 12:54
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 23, 2026
Any commits made after this event will not be merged.
Merged via the queue into main with commit 77392e9 Oct 23, 2026
51 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-r6oa8t branch October 23, 2026 13:14
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 domain:skills size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants