agents(os-dev), pm(references): carry the E3 standard and its three ruled boundaries - #16487
Conversation
…uled boundaries The maintainer's E3 standard (a defect on a published surface is fixed in the round; non-published residue is carded and the PR lands) had no carrier in the agent corpus. Four rules-only lines, each fold-paid under an unchanged pin: - .claude/agents/os-dev.md: the dev's in-round obligation, beside the in-place repair block; paid by dropping the rationale tail under "GitHub is the authoritative report source". - references/review-checklist.md: the files[]-derived definition of "published" (spec ships src/**/*.zod.ts), the .js.map sourcesContent boundary, and the noticed-but-untouched boundary, beside the in-place repair and "private: false => published" review items; paid by dropping two rationale tails whose facts os-dev.md keeps, and folding one rule into its neighbour. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Verdict: ACCEPT (governed — to the approvers)Implemented-by: os-dev flight E3 (fable), branch What was checked
Rulings
LandingGoverned surface: reviewers Generated by Claude Code |
维护者速读(skills 席,2026-09-07T04:3xZ)事情:您 09-05 裁的 E3 标准「已发布必修,其余立卡」此前不在任何规则文本里(全语料零命中)。本 PR 把它写进去:os-dev.md 加一行 dev 本轮义务;复审清单加三行——「已发布 = 各包 为什么:同一条裁决,两个诚实的席位曾量出相反结果( 风险:低——纯规则文本,门禁全绿;dev 侧尚未带「已发布」的定义行(一次折叠只够一行),定义行排在下一场 os-dev.md 飞行(#16388)一起进。 要您做什么:合并或退回一个决定。审批人 os-zhuang / hotlong 已被请求复审。 席位意见:建议合并。 Generated by Claude Code |
Fixes #15905
The maintainer's E3 standard (2026-09-05, verbatim: 「已发布必修,其余立卡」 — a defect on a published surface is repaired in the round; non-published residue is carded and the PR lands) and the three boundaries the director seat recorded on the card (comment 5564373328, decision batch #64, maintainer reply verbatim 「同意」) had no carrier in the agent corpus. This PR writes them once, rules-only, in the house style: one rule per line, at most 120 bytes, plain language, no provenance, no issue numbers or comment ids in the corpus. Four lines in total, each paid by a fold under an unchanged ratchet pin. Governed surface (
.claude/**): draft, human merge.Step 1 — carrier measurement (no carrier)
At
origin/main=00d54940eb,grep -rnover.claude/skills/pm-dispatch/**,.claude/agents/os-dev.md,AGENTS.md,CLAUDE.md:已发布必修其余立卡E3published surfacedist/**/*.d.tssourcesContentfiles[]已发布core-rules.md(150/150) is additionally excluded by its own line 3, 「本文不新增规则」 — it is a digest of SKILL.md and cannot be the first home of a rule. So the definition and the two boundaries go toreferences/review-checklist.md(77/77), beside its in-place-repair and 「private: false即已发布」 review items; the obligation goes toos-dev.md(403/403), closing its rule-3 in-place-repair block.The four lines — file, neighbour, fold
本轮改动令其变假或触碰的已发布缺陷必修;其余立卡并记明已发布面,PR 照常落地。(115 B).claude/agents/os-dev.md(rule 3, after 「优先扩展一个守卫关掉整个类;任一条不成立 ⇒ 回默认」)已发布 = 各包 \files[]` 实际发运的内容;spec 发运 `src/**/*.zod.ts`,假 TSDoc/`.describe()` 即缺陷。` (119 B)references/review-checklist.md, 范围与 changesetprivate: false即已发布 ⇒ …changeset」Fixes/Part ofrule above it; the fact is kept verbatim in os-dev.md's 「⛔ 永不Fixes一张还在决策箱的卡」 line\.js.map` 的 `sourcesContent` 不算已发布:构建关闭其内嵌源码,关闭前也不计。` (98 B)toThrow()或rejects.toThrow()的用例在未修实现本就抛裸 Error 的那族上恒绿。」 — rationale between the 「抽查…断言code与status」 and 「缺code/status断言判 REWORK」 rules, both of which stay; the lesson is kept in os-dev.md's 「单独的expect(...).toThrow()不是拒收测试」 line本轮令其变假或触碰的已发布缺陷必修;只注意到、未触碰的立卡不修,记明已发布面。(115 B)Line 4 carries both halves of boundary 3 on the PM side so the checklist is self-contained: the positive obligation the reviewer checks (made-false-or-touched ⇒ repaired in-round) and the ruled limit (merely noticed, untouched ⇒ carded, published-surface fact on the card). Line 1 is the dev-side twin of that obligation, the same way the 就地修 four conditions already live on both sides. The wording 「构建关闭其内嵌源码,关闭前也不计」 is deliberately tense-neutral: the
sourcesContent: falsebuild change is a separate devx card (#16469 remains open) and the boundary does not depend on its landing.Not written: nothing in
SKILL.md(flight Z's file), nothing incore-rules.md, no ceiling raise, no new section.Serial proof against flight Y (os-dev.md is held by PR #16460, head
ddb4213508)Branch from
origin/main00d54940eb; Y's regions (lines 126–134, 207–230 of os-dev.md) untouched. From HEADa17f1a4064:Gates — all at HEAD
a17f1a4064, every exit captured before any pipeConsistency (brief step 3):
pnpm check:skill-frame-sync→ exit 0 — 「✓ check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 files … 75 markdown files scanned for undeclared copies」node scripts/pm/check-clause2-carriers.mjs --self-test→ exit 0 — 「✓ check-clause2-carriers self-test: 190 cases pass」pnpm check:pm-skill-id-lint→ exit 0 — 「✓ check-skill-id-lint: 26 file(s) clean (pattern /#[0-9]{3,}/g)」pnpm check:pm-skill-ratchet→ exit 0 — 「✓ check-skill-line-ratchet self-test: 157 cases pass」; live: 「.claude/agents/os-dev.md is 403 lines (ceiling 403; headroom 0)」, 「references/review-checklist.md is 77 lines (ceiling 77; headroom 0)」; max line bytes 120 / 119node scripts/pm/check-governed-merges.mjs --test .claude/agents/os-dev.md .claude/skills/pm-dispatch/references/review-checklist.md→ exit 3 — 「⛔ GOVERNED — a human merge is the review record for this PR … .claude/** ×2」Derived (brief step 4):
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; stderr: 「gate list derived from the tree of 'objectstack-ai/objectstack' at commit a17f1a4 … change set derived from git — 2 path(s) vs merge base 00d5494」) → 17 commands, all run, all exit 0: closing-keyword-parity (+ self-test, 24 assertions), comment-mask-corpus (6251 files, 0 disagree), governed-queue-guard self-test (144), agent-model-declared, agent-test-spelling (0 violations), doc-authoring, driver-memory-census, nul-bytes (8085 files, no raw control bytes), pm-governed-merges (274 assertions), pm-skill-id-lint, pm-skill-ratchet, refd-timer-probe, required-contexts, skill-frame-sync, watch-hint-literal, andpnpm --filter @objectstack/lint run check:doc-formula-expressions— first run exit 3, the gate's own PREREQUISITE NOT MET (@objectstack/formula/@objectstack/lintunbuilt; NOT MEASURED, not red); afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the lock (「4 successful, 4 total」) re-measured exit 0 — 「✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 430 files / 1371 TS blocks judged clean」. Reconciliation:dispatch-gates.mjs --ran→ exit 0 — 「Run reconciliation — 17 derived, 17 run, 0 NOT-MEASURED, 0 UNRUN」.Whole-repo lint through the shared lock, slot
issue-15905, one acquisition with the full budget:bash scripts/pm/os-verify-lock.sh -c 'NODE_OPTIONS=--max-old-space-size=4096 pnpm lint'→ 「os-verify-lock: VERDICT command-exit 0 · held the lock 97s (1m37s) · waited 47s」 (shared-box seconds).Control-byte self-scan of both touched files:
grep -naPfor raw control bytes → no hits. No model identifier anywhere in the diff, the commit or this body.验收备注
files[]-derived definition of 「已发布」 only through the PM-side checklist — os-dev.md carries the obligation line alone, as ruled for this card (403/403, one fold). A second dev-side line would need a second fold and is the seat's call, not this flight's.Co-Authored-Bytrailer; a🤖 Generated withPR footer) differs from AGENTS.md's model-free trailer pair and session-URL footer; this PR uses the AGENTS.md forms..claude/**publishes nothing;skip-changesetapplied via the additive labels endpoint with a comparison read-back.维护者速读(草稿)
files[]实际发运的内容」、.js.map的sourcesContent不算、本轮只注意到未触碰的立卡不修。Generated by Claude Code