docs(agents): AGENTS.md + CLAUDE.md rules only — narratives, dates and quotations out; issue ownership written by role - #15856
Conversation
…d quotations out; ownership written by role - every rule kept as one executable sentence in its section; incident retellings, provenance stories and date-stamped measurements leave (AGENTS.md 1161 -> 1058 lines, CLAUDE.md 36 -> 41) - the claim paragraph rewritten by role: the assignee is a presence bit set by the owning session, the Claim: comment is the identity, a dispatched executor inherits the assignee, verifies the newest Claim: names its branch, posts its own, never writes the field and never yields; release is an explicit act - folded one rule each: the model-free agent commit trailer pair; the provenance sentence in the rules-only form (and the id-lint header sentence beside it); an ADR lives where the code it governs lives, cloud records cited as cloud ADR-NNNN; the PR-body footer as measured (session-URL survives a PATCH, the platform appends); a reading is a count plus the repository and commit it was taken against - ratchet re-pinned down-only: AGENTS.md 1162 -> 1058 (widest table row 1081 -> 768), CLAUDE.md 86 -> 41 Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
…ents-claude-rules-only
…atch's claim is its identity - the ownership paragraph's executor clause (AGENTS.md and the CLAUDE.md excerpt): the owning session performs both acts; a PM dispatch sets the assignee (step 1) and posts the Claim: naming the dev's branch (step 2), both on the dev's behalf; the executor inherits both records, verifies the newest Claim: names its branch, posts no second claim (its own record is the report comment), never writes the assignee, never yields - line-neutral in both files (1058 / 41); every other rule unchanged Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
|
ACCEPT — contract-tier in-seat review of PR #15856, head Implemented-by: Verified in a detached compare worktree at the PR head, three-dot against Seat gate runs on this head in the compare worktree: skill-line-ratchet exit 0 at the re-pinned ceilings (1058 / 768, 41 / 0), governed-prose exit 0 (two instruction surfaces name all five governed surfaces), governed exit 3; frame-sync and required-contexts are NOT MEASURED locally (the compare worktree has no installed tree) — the evidence is the dev's runs (two frame copies, 73 files scanned; six required contexts pinned) and CI. The dev's evidence beyond that: 36 derived families all exit 0 and reconciled 36 of 36 on both heads, the five hook self-tests 0 failed (no pinned spelling touched), whole-repo lint through the lock, and CI on Open question ruled B: the seat rewrote the body's first line to Landing regime: governed surface ⇒ this PR stays a draft; reviewers Generated by Claude Code |
维护者速读(skills 席,2026-09-05T13:2xZ)改了什么:把 AGENTS.md(所有 agent 的总规则)从 1161 行压到 1058 行、CLAUDE.md 只留规则——事故复盘、裁定日期、原话引用全部删掉,每条规则一句话,20 个标题字节不变。同时按你今天的裁定重写「issue 归谁」这一段:指派字段只表示「有人占着」,认领评论才是身份;PM 派发时替 dev 写好这两样;dev 不再自己发第二条认领;离手必须显式释放;你本人的卡与 PM 派的分不出来,已接受为盲区。顺手修掉六条散落的规则错误(提交 trailer、过期出处、ADR 登记规则、PR 页脚规则、「测过语料」要带仓 + commit、指派矛盾),并了结 hotlong 的 #15287(其 PR #15290 已按你指示关闭)。 为什么改:你 9-4 裁定「出处叙事、事故复盘根本不重要,不需要写入 skills」;今天三个开发席撞上「已指派 = 别人的」与「dev 永不写指派」的矛盾,浪费飞行。 风险与代价:这是 agent 的宪法,改动面大(+288 / −377),但 ⛔ 规则 39 → 47 无一丢失、五个 hook 自测无一红、所有门禁与 CI 绿;席位预读抓出并改掉了一处与 os-dev.md 冲突的句子。落地后 hotlong 的 #15427 要在其上重新解一次冲突(两处字节相同,已通知,属小事)。可回滚:一次 revert。 席位意见:建议合并。 你要做的:批准 + 入队(或让 os-zhuang 代做)。 Generated by Claude Code |
Fixes #15670, fixes #15125, fixes #14913, fixes #14509, fixes #15241, fixes #15357
Part of #15379
#15287 remains open until its rule is readable on
main: the ownership paragraph in this PR is now its only carrier (PR #15290 was closed by the maintainer as superseded); its three criteria are rows 30a–30c of the inventory below.Family member 5 of the rules-only rewrite (maintainer ruling recorded on #15379: 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」).
AGENTS.mdandCLAUDE.mdkeep every rule as one executable sentence in its own section and its own register; every incident retelling, provenance story, ruling date, verbatim quotation and "why we learned this" leaves. The ownership paragraph is rewritten by role under the 2026-09-05 ruling on issue ownership (「待你定 1(情形 C): agent 无法区分是你还是 PM 可以接受」 / 「待你定 2(情形 H 与配额): 暂时不区分」). Six cards fold in as one rule each. Ceilings move down only.Governed surfaces (
AGENTS.md,CLAUDE.md,scripts/pm/**) — draft PR, human merge;skip-changeset(nothing publishes). No model identifier appears in the diff, this body, the commit or the comments.Census (before → after, measured on head
9a3a44190d)AGENTS.mdCLAUDE.mdLC_ALL=C awk)#NNNissue citationscheck:pm-skill-id-lintgreen)## Communication·## Build & Test·### A test that reads outside its own package …·### Running the dev server·### Frontend (Studio UI) …·## Prime Directives·## Multi-agent working discipline·## Monorepo Layout·## Protocol Domains …·## Kernel·## Documentation Guardrails·### Touchedpackages/spec? …·## Context Routing …·## Skills (skills/)·## Patterns·## Route & surface ownership·## Degradation log levels …·## Startup registry reads …·## Post-Task Checklist·## Edit Sizing)Byte-identical regions: the
RECOGNISED_PATH_SPELLINGSmirror block (check-published-list-mirrorsgreen), the Monorepo Layout / Protocol Domains / Kernel / Context Routing tables, the dev-server and spec-artifact tables, every code fence, the attribution-footer block, and the four-axes frame block appears in neither file (check:skill-frame-syncgreen, 2 declared copies).Where each folded rule landed
Claim:= identity, both written by the owning session, a dispatched executor inherits and verifies, never writes the field, never yields; release is an explicit act; findings filed unassigned; the maintainer's own work is an accepted blind spot; no per-seat identitiesAGENTS.md:393-410; one-paragraph formCLAUDE.md:7-17Claude-Session:session URL + theCo-authored-by: Claudenoreply line); no model identifier in any content artefact; the harness-written co-author trailer is the one exemptionAGENTS.md:440-444AGENTS.md:10-15; the second site, thecheck-skill-id-lint.mjsheader sentence, atscripts/pm/check-skill-id-lint.mjs:18-19(pattern, roots and verdicts untouched — self-test 14 cases pass, live 24 files clean). The card's third limb,references/rest-channel.md, is member 3's file (PR #15641) and is not touched herecloud ADR-NNNN, ⛔ never bare; a cloud decision whose mechanism half governs open code gets a local ADR with a## Provenancesection; files never move, numbers never reassignedAGENTS.md:249-254, inside Prime Directive #13 (no new heading; the provenance line lives here, not in the file)AGENTS.md:428-439examples/app-crmat its sha, never an application it is not; a moving ref is not an anchor, for a corpus exactly as for agit diff(the same line as #15647 section 2's second principle, written once)AGENTS.md:354-357, beside theBASE/moving-ref practicesRule inventory —
AGENTS.md(one row per rule paragraph; "operative content unchanged" unless the row says otherwise)pnpm lintis the only style authority; ⛔ neverprettier --write;--checkis no second opinion--file-info,--find-config-path, prettier 3.8.1)@ts-expect-error/TS7006 principlesmain, with every PR reporting green" and "a detector with no dependencies" rationale--fresh, the port/kill/script rules, the--separator rulecaselabel is not enforcement, check every call site incl. bulkgh issue createspelling (not every seat hasgh)??in a consumer, internal contract, change the spec deliberately, ADR-0087 entry, stored rows replay the full chaincfg.filter ?? cfg.filtershistory and the worked example; "do not" → ⛔environment: releasemechanism; merging that PR queues a deployment in the maintainer's nameworkflow_dispatch-barrier history, "since ADR-0125 (2026-08-20)"git stash push/pop; shared stack; hook behaviour; replacements blockrefs/remotes/*;FETCH_HEADper checkout, fails by absence; the four practices; ⛔ no hook backs the moving-ref halfgit checkout REF -- PATHstages; restore forms; ⛔ never trustgit diff HEADalonegit-history.mjsClaim:= identity record with its first-line spelling; (b) the owning session writes both: a self-picking seat takes only an unassigned card, assigns and claims first; a PM dispatch sets both on the dev's behalf; (c) a dispatched executor inherits both records — the assignee (step 1) and the dispatch'sClaim:naming its branch (step 2) — verifies the newestClaim:names its branch (mismatch ⇒ stop and report), posts NO second claim (the dispatch'sClaim:is its identity; its own record is the report comment); ⛔ never writes the assignee, ⛔ never yields; (d) re-read the comments — the comments decide: aClaim:from another session or branch means taken, ⛔ never reassign; a bare assignee with noClaim:is a dispatch's step 1, not a foreign claim; (e) release is an explicit act — clear the assignee, post aRelease:line; (f) findings filed unassigned, assign when you start; (g) the maintainer's own work carries no claim and is indistinguishable from a dispatch — accepted; no per-seat identitiesgh issue editspelling. Content changed on purpose: the by-role ruling. Agrees with pm-dispatchSKILL.md认领 (assignee 字段归 PM; aClaim:from a session other than the PM's reads as a foreign claim) andos-dev.mdrule 2 (assignee 归 PM; the PM's claim satisfies claim-first for the dev); quotes neitherClaim:naming the dev's branch (step 2), both on the dev's behalf" — the executor "posts no second claim — the dispatch'sClaim:is its identity and its own record is the report comment"Claim:from another session or branch (other than the dispatch that sent you) means taken whatever the field says … a bare assignee with noClaim:under it is a dispatch's step 1, not a foreign claim — not taken for the executor it was dispatched to, and not free for a seat picking for itself"success; the six required contexts by name; re-arm awareness; stale red;gh pr mergeunmeasured; fallbackcheck:dev-prereqs--no-verify, sharding, per-clone registration, excluded baselinescontent/docs/releases/RELEASE-OWNED (audit-scope gate green); translations regeneration rulesonInstall/onEnable/onDisablehooksextractLocale), "the failure mode the ruling rejected", "answered wrongly three times"CLAUDE.mdClaim:= identity; self-picking seat assigns + claims first; PM dispatch sets the assignee and posts theClaim:for its dev, who inherits both, checks the newestClaim:names its branch, posts no second claim, ⛔ never writes the assignee or yields; comments decide, ⛔ never reassign; bare assignee = a dispatch's first step); still points at AGENTS.md → Multi-agent working discipline, paragraph Claim the issue BEFORE you write any code.Scripts
scripts/pm/check-skill-line-ratchet.mjs: the family's re-pin convention — own rows only:AGENTS.md1162 → 1058 and 1081 → 768,CLAUDE.md86 → 41 (its 0 table pin untouched), one comment each; no other row moved, no raise. Self-test:✓ check-skill-line-ratchet self-test: 155 cases pass.scripts/pm/check-skill-id-lint.mjs: one header sentence ([finding] After ruling B (#14859),AGENTS.md:12-13and thescripts/pm/check-skill-id-lint.mjsheader still describe the pm-dispatch provenance form as "date + verbatim quote" — the two off-surface sentences PR #14911 could not touch #14913's second site) — the bounded in-place fix the card's disposition assigns to this member: same defect class, mechanical, the form pinned by the card; the gate's pattern, roots and verdicts untouched (--self-test14 cases pass; live24 file(s) clean).Verification (head
13fc873b29= my commita52aceadb1+origin/main5a21d73af5merged; exit codes captured by redirect, verdict lines quoted from the gates)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(change set from the merge base, 4 paths) → 36 commands, every one run, exit 0;--ranreconcile:✓ dispatch-gates --ran: 36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED.node scripts/pm/check-skill-line-ratchet.mjs --self-test→155 cases pass; live →✓ AGENTS.md is 1058 lines (ceiling 1058; headroom 0)·✓ AGENTS.md: widest table row is 768 bytes (pin 768; headroom 0)·✓ CLAUDE.md is 41 lines (ceiling 41; headroom 0)·✓ CLAUDE.md: widest table row is 0 bytes (pin 0; headroom 0).pnpm check:pm-governed-prose→✓ 2 instruction surface(s) name all 5 registered governed surfaces (docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md) and claim no others.pnpm check:required-contexts→✓ 6 required context name(s) pinned across 2 workflow(s); 6 instruction surface(s) scanned(all six names kept verbatim in Multi-agent §7).pnpm check:skill-frame-sync→✓ 2 copies of the decision frame are structurally isomorphic across 2 files … 73 markdown files scanned for undeclared copies.pnpm check:pm-skill-id-lint→✓ 24 file(s) clean;node scripts/check-published-list-mirrors.mjs(+--self-test, 37 cases) → exit 0;pnpm check:docs-audit-scope→✓ release-owned pages are in scope and read-only;pnpm check:agent-test-spelling→0 violations;pnpm check:nul-bytes→ exit 0;pnpm check:pm-governed-merges→ exit 0;pnpm check:watch-hint-literal,check:cli-command-ids,check:cross-package-test-inputs,check:entry-guard,check:parse-guard,check:pnpm-filter-targets,check:ratchet-remedy-authority,check:refd-timer-probe,check:bash32-floor,check:driver-memory-census,check:pm-dispatch-gatesand the direct-node families → all exit 0..claude/hooks/*.selftest.sh→ 0 failed (50 / 121 / 116 / 51 / 36 passed): no pinned spelling touched.pnpm lintthroughscripts/pm/os-verify-lock.sh(slotissue-15379-m5) →VERDICT command-exit 0 · held the lock 69s.scripts/paths, run for completeness:pm-label-desc-cap,console-injection,i18n-stale-fill,engine-double-contractexit 0;dts-closureandpublished-readme-exportsprintPREREQUISITE NOT MET(nodist/in this worktree) — NOT MEASURED, not red; they read nothing this PR changes.git merge-tree --write-tree --name-only origin/main HEADbefore the push: clean. PR docs(agents): state the app-vs-platform boundary once, so it stops being re-derived #15427 (one Context Routing row + one CEILINGS row) has not landed; its hunks touch lines this PR leaves byte-identical, so it re-resolves trivially on top of this.Generated by Claude Code