docs(agents): rules-only rewrite of the os-dev agent definition - #15725
Conversation
Provenance narratives, ruling dates, verbatim quotations, incident post-mortems and rationale tails leave the file; every rule keeps its operative content, the section order, the frontmatter and the report contract's pinned spellings. One rule per line, at most 120 bytes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
469 to 403, one note in the map's own convention; no other row moves. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
|
ACCEPT — governed in-seat review of PR #15725, head Implemented-by: Verified in a detached compare worktree at the PR head against merge-base One process note, recorded for the rules-only programme rather than this PR: the dev ended its turn once waiting on a Monitor for CI and was resumed by the seat's stall reset ①; the report then arrived complete. The rule the rewritten file now states in its own words is the one it broke. Landing regime: governed ( Generated by Claude Code |
Part of #15379
Rules-only rewrite of
.claude/agents/os-dev.md, the dev agent's constitution, under the house style the digest set: one rule per line, at most 120 bytes measured withwc -c, plain Chinese with identifiers in backticks, the file's section order and frontmatter unchanged. Provenance narratives, ruling dates, verbatim quotations, incident post-mortems and rationale tails leave the file. Every rule keeps its operative content: what to do, what never to do, the thresholds, the commands, and the spellings the gates and the PM's parser depend on (Table 3). The file is read by devs who never open the PM corpus, so nothing is cut for being stated inSKILL.md; only text restating a rule this file itself states elsewhere is cut (Table 2).469 to 403 lines; 43,650 to 35,543 bytes. Most of the line shrink is multi-line numbered items and paragraphs re-flowed into single rule lines, which is why the rule count (334 rule lines) is close to the old file's sentence count while the line count falls.
Angle-bracket placeholders are spelled as bare placeholder words in this body only, because the body sanitizer eats short angle-bracket fragments even inside backticks. The file keeps the original spelling.
The file, section by section
model:comment — byte-identical.check:agent-model-declaredreads the frontmattermodel:value; the HTML comment stays becauseSKILL.mdnames it as the authority on the resolution order.os-dev-reportfirst line, AGENTS.md binding, lessons as self-contained rules. The ruling-date retention clause is gone (the ruling that governs this PR retires it); the quotation clause survives as the criterion it is.BASE=$(git rev-parse HEAD), the empty-branch push probe, scratchpad isolation, assignee ownership, the four-condition in-place-fix exemption, the search-then-file discipline with its channel ladder andmcp_calls, the four never-dos, contract-first, and premise verification all keep their operative clauses.VERDICT command-exitline, the heap cap, targeted runs and the bare--refusal, worktree cleanup without--force, no kill-by-name, foreground pipeline with the ten-minute cap, and the queue loop withOS_VERIFY_LOCK_SLOTand the twenty-minute escalation. One restatement of the two legal turn endings is cut (it lives in 干净收尾).--workspace-concurrencyplacement, the pnpm 10 install refusal,overridesplacement, the OSV upper bound,assertEngineDeleteDispatch, the zero-match--filterexit 0 and objectui'stype-checkspelling, the pipe pointer, and the preinstalled Chromium keep their spellings. The dependency-build trap is merged into 本地验证范围 ①.turbo ls --affectedreading, thedispatch-gates.mjsderivation (now spelled with--commandsand its--ranreconcile; Table 4), the cross-repo caveat with--repo, the proven-narrowing form for whole-repo scans with its three pieces of evidence, the union-after-final-commit rule, the exit-code-before-any-pipe rule with both measured false-green shapes, and the two NOT MEASURED classes.packages/specregen trap, the shared.git/family rule, the shallow-checkoutmerge-basetwo-leg reading, commit-before-mutating, the four restore hard lines, envelope assertions, key-versus-value reachability, fixture triage, expected-direction, and the ablation resolution-path condition withablation-dist-preflight.mjsand thetraphard line. Every command and constant stays; the incident stories and measurement counts go.unittier rule,Fixes #N/Part of #N, the closing-keyword parser rule, squash trailers, English, the session-URL footer, theskills/**two readings, the ratchet currency rule (the two ratchet rulings stated as rules, without dates or quotes), the per-reposkip-changesetrule with the additive endpoint and the compare-read-back, the report-at-draft-PR rule, and the teardown line.statusvalues are byte-identical, only thetestsplaceholder sentence is shortened (it was the second over-120-byte line).Ratchet. The
CEILINGSrow for.claude/agents/os-dev.mdinscripts/pm/check-skill-line-ratchet.mjsis re-pinned down 469 → 403 with a one-line note in the map's own convention; the row's earlier notes stay (the map's convention is that raises quote their ruling). No other row moves, nothing is raised, and the file'sMAX_TABLE_ROW_BYTESpin stays 0 — the file carries no table.Hygiene, before and after
Measured on the tree (before at⚠️ /⭐ · non-table lines over 120 bytes · table rows · issue numbers · decision-frame fingerprint phrases · model identifiers outside the frontmatter.
95d5cbb31, after atad26866c9): dates matching2026-0M-DD· corner-quote characters · ⛔ ·model:line and its comment onlyGates run
Family derived on the tree at
ad26866c9withnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; the tool read the change set from the merge base itself): 36 runnable commands. All 36 run, all 36 exit 0; every exit code captured by redirect before any pipe, and each gate's own verdict line read. Reconciled with--ran:✓ dispatch-gates --ran: 36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED.pnpm check:pm-skill-ratchet✓ check-skill-line-ratchet: declared cross-file moves: 1, total ceilings down 1 line.pnpm check:pm-skill-id-lint✓ check-skill-id-lint: 24 file(s) clean (pattern /#[0-9]{3,}/g).pnpm check:skill-frame-sync✓ check-skill-frame-sync: 2 copies of the decision frame are structurally isomorphic across 2 filespnpm check:agent-model-declared✓ check-agent-model-declared: 1 agent definition(s) under .claude/agents/ all declare a modelpnpm check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 451 file(s) · 6419 bare--token(s) · 1463 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 81 manifest(s)pnpm check:nul-bytescheck-nul-bytes: OK (scanned 7594 text file(s) -- 7594 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).pnpm check:doc-authoring✓ doc authoring guard: sibling-package prose ids hold the baseline — 831 pinned site(s) across 231 file(s), 85102 string(s) read in 1154 parsed source(s), no growth, no burn-down unrecorded.pnpm check:pm-dispatch-gates✓ dispatch-gates self-test: 1445 cases pass.pnpm check:pm-governed-merges✓ check-governed-merges --self-test: 274 assertions (the unified governed predicate + near misses, subject→PR spellings, window parsing, the #12633 landing window — the QS-7 regression pin in both dir…pnpm check:ratchet-remedy-authorityOK check-ratchet-remedy-authority: 205 scripts swept (scripts/*.{mjs,mts} + scripts/pm/*.{mjs,mts}); 14 mark the expanding remedy ⛔ MAINTAINER-ONLY, 6 turn it down outright, 185 hand out no ratchet-e…pnpm check:pnpm-filter-targets✓ check:pnpm-filter-targets: 143/183--filteroccurrence(s) across 34 file(s) resolve against 79 workspace package(s); 40 not judged (2 foreign, 18 interpolated, 20 path); 51 more in comments or ste…node scripts/check-closing-keyword-parity.mjscheck-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; sweep found 5 file(s) carrying the grammar across 7601 tracked file(s), all registered).pnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm --filter '@objectstack/lint...' buildthrough the lock (main movedpackages/lint); its own verdict line names the files judged cleanNamed in the brief beyond the derivation, all on the same head:
pnpm check:pm-governed-prose→ exit 0:check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces (docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md) and claim no others.node scripts/pm/check-half-states.mjs --self-test→ exit 0:check-half-states self-test: 2172 cases pass.(itsos-dev-reportmarker predicate is among the cases)node scripts/pm/check-governed-merges.mjs --test .claude/agents/os-dev.md scripts/pm/check-skill-line-ratchet.mjs→ exit 3, the expected verdict:governed-surface predicate: 1 of 2 path(s) hit the register/GOVERNED — a human merge is the review record for this PR/.claude/** ×1/paths not on the register: scripts/pm/check-skill-line-ratchet.mjs.pnpm check:pm-skill-ratchet→check-skill-line-ratchet self-test: 155 cases pass.then.claude/agents/os-dev.md is 403 lines (ceiling 403; headroom 0).andwidest table row is 0 bytes (pin 0; headroom 0).; the two roster gates that name the script,node scripts/check-published-list-mirrors.mjs(+--self-test, 37 cases) andnode scripts/check-skills-token-ratchet.mjs(+--self-test, 64 cases), exit 0.pnpm lintwas run, not narrowed, through the lock wrapper:bash scripts/pm/os-verify-lock.sh -c 'pnpm lint'printedVERDICT command-exit 0 · held the lock 108s (1m48s) · waited 0s. The command is the repo'seslint . --no-inline-configover the whole tree, so no narrowing claim is needed.grep -naPover both files) with zero hits.Identifier sweep. Every backticked span in the old file (253 spans, 201 unique) was checked against the new file (237 spans, 193 unique). 193 are present as spans; 8 more are present as plain text inside a wider span (
gh,--maxWorkers,| head,PIPESTATUS,pipefail,git checkout,Part of,node scripts/pm/dispatch-gates.mjs); the 8 not carried are in Table 2. Spans added: the worktree recipe as its own span,cd,VERDICT command-exit,os-verify-lock.sh --status,node scripts/pm/dispatch-gates.mjs --commands,--ran FILE,mode:subagent,mode:cloud(Table 4).All readings above were taken after the final commit, at
ad26866c9(git rev-parse --short HEAD), which is this PR's head: the two content commits plus a merge oforigin/main(e13ede817) taken before opening the PR, as the brief asks; neither of the two files changed onmainsince the branch point.Table 1 — every surviving rule line
334 rule lines.
strippednames what left that line:date,quotation,narrative,marker,rationale tail,merged,reworded(bold markup and prose compression),rewrapped to one line(content unchanged, only re-flowed),new(the two additions argued in Table 4).os-dev-report。cd进去pnpm install。git fetch origin main && git worktree add --no-track ../REPO-issue-N -b claude/issue-N-SLUG origin/mainBASE=$(git rev-parse HEAD),它是标准条款节里家族规则的锚。git push -u origin BRANCH。blocked,⛔ 不进重试循环;只有网络错误才退避重试。issue-N/子目录,临时文件全写进去。summary。blocked。summary。out_of_scope_findings;⛔ 永不在本 PR 里修它。.claude/skills/pm-dispatch/references/rest-channel.md,其 ✓ 按座位实测。search_issues,并在报告申报换道。list_issues、宽词搜):定向一击是上限。mcp_calls)。Blocked-by:;立在修复落地的仓,带回链。finding标签,⛔ 不打pm:queue。content/docs/releases/、force-push、推main、合并任何东西。.changeset/*.md。??别名、宽松解析),缺陷在上游。needs_decision。origin/main核验其前提。premise_still_valid: false、附证据、无 PR 的报告是一等交付物;证伪 issue 是好运行。bash scripts/pm/os-verify-lock.sh -c 'COMMAND'(或-- ARGV);⛔ 永不手搓flock/lockfile。check:*门禁、install、dev server 不走它,与持锁同核并跑。VERDICT command-exit行,⛔ 不读裸$?;排队是常态,不是挂死。VERDICT command-exitspelled)NODE_OPTIONS=--max-old-space-size=4096,要抬需给理由。--concurrency=2。pnpm --filter PKG exec vitest run --maxWorkers=2 FILE。--转交:--之后的一切被 vitest 静默丢弃,整包跑完、退出码 0。rm -rf PATH/node_modules && git worktree remove PATH。--force:拒绝移除说明有东西没提交,那是本容器未提交工作的唯一守卫。git status。pkill -f会带走并行 agent 的运行);记下你启动的 PID,只对它操作。exit 143)。typecheck)。OS_VERIFY_LOCK_SLOT=SLOT在第一次尝试之前就设好。blocked并点名持锁者:os-verify-lock.sh --status打印持锁者与队列。--workspace-concurrency=2只对过滤后的 run-command(run/build)成立,放在--filter之前。--concurrency。install上直接拒绝它(ERROR Unknown option: 'workspace-concurrency')。pnpm install。overrides只住在pnpm-workspace.yaml;加进package.json的那份什么都不改。delete()开头用@objectstack/objectql的assertEngineDeleteDispatch(options)。check:engine-double-contract点名的洞。pnpm --filter运行以 0 退出:什么都没跑,读上去却是通过。type-check(连字符);核对输出里确实回显了脚本名。PLAYWRIGHT_BROWSERS_PATH指向/opt/pw-browsers。executablePath: '/opt/pw-browsers/chromium';⛔ 永不跑playwright install。cdn.playwright.dev的 403 不是没有浏览器的证据:下载被拦不证明产物缺席,先找产物。check:*全枚举本地跑:CI 会把农场跑满。本地清单如下。pnpm --filter 'PKG^...' build是新 worktree 的第一条命令。pnpm test/pnpm typecheck,用--filter圈定。TURBO_SCM_BASE="$BASE" pnpm exec turbo ls --affected。packages/cli只欠unit层(见 Definition of done 的测试条)。check:engine-double-contract;新错误码 ⇒check:error-code-casing。.claude/agents/**⇒check:agent-model-declared;任何编辑 ⇒check:nul-bytes。node scripts/pm/dispatch-gates.mjs --commands不传路径,脚本自己从 merge-base 取变更集。--commandsspelled--ran FILE对账,未跑的族它会点名。--ranreconcile; see Table 4)git diff出一份清单喂它:两点origin/main..HEAD按此刻的 origin/main 求值。*.test.ts,加同包 tests 下git grep该脚本文件名的全部命中。scripts/pm/。package.json与.github/workflows/手工推导。--repo OWNER/NAME申报本次答案该属于哪个仓,不匹配即拒绝并同时点名两个仓。pnpm lint=eslint . --no-inline-config为首)是 CI 拥有的运行,永不是你欠的。--format json输出的计数;③ 配置对未触碰文件的不变性声明。git rev-parse --short HEAD。tests字段和 PR 正文两处都要引;门禁日志不带 sha,最后 commit 前的并集量的旧树。cmd > /tmp/out 2>&1; EXIT=$?; tail -40 /tmp/out。EXIT=$?跟在cmd 2>&1 | tail -40之后读到的是tail的状态。set -o pipefail与${PIPESTATUS[0]}仅当下游读到 EOF 才安全。| head -N读满即关读端,生产者吃 SIGPIPE 以 0 退出:是管道改了生产者的退出码。cmd | head之后读退出码都中招(git grep、node皆然)。$?:判定行由门禁写,$?由你的管道写。typecheck可能exclude掉**/*.test.ts;声称它覆盖你的测试前,用--listFiles数。MODULE_NOT_FOUND一类的 exit 1 不是红门禁:多半是脚本名或路径敲错,根本没进到门禁体。exit 99/ queue-timeout /PREREQUISITE NOT MET同类:用真正的pnpm check:*命令重跑。dist/*.d.ts两个方向都撒谎。pnpm --filter '...@objectstack/PKG'= 下游消费者。.d.ts,不是缓存。packages/spec:gen:schema会重写authorable-surface.base.json,这是预期产物。check:authorable-surface绿。baseRev允许滞后,一行信息不是错误。gen:schema:HEAD 还是 merge 前的 tip,锚点会静默回滚到旧分叉点。bash scripts/pm/os-regen-merge.sh。git worktree只隔离工作树与 HEAD;.git/下其余一切全 worktree 共享。refs/remotes/*)、stash 栈、config、hooks;配方不点名共享态才 worktree-safe。git status里出现他人文件。git stash;替代拼写(wip commit / patch)、机制与 hook 住每会话注入的 CLAUDE.md。origin/main是共享指针,别的 agent 一次 fetch 就推进它。git reset --soft origin/main会把你分支点之后他人已合并的文件整批 stage 成你的。"$BASE"。log -S/--follow/blame判日期或先后前,先git rev-parse --is-shallow-repository,true 就加深申报。merge-base --is-ancestor的非祖先在浅检出上是假绿:缺的对象只扣下祖先路径,不会造一条。Blocked-by已落地这些前提核验,要的恰是 exit 1。git fetch --deepen/--unshallow到控制腿转 0 再重读。--is-shallow-repository是便宜的触发器不是判据,判据是控制腿。git checkout YOUR-BRANCH -- PATH。git checkout origin/main -- PATH不留任何恢复点。HEAD,HEAD必须先装着你的实现。git checkout HEAD -- PATH删的正是实现本身,事后检查全绿。git checkout HEAD -- PATH,⛔ 永不裸git checkout -- PATH:裸恢复从索引取。HEAD绕开被污染的索引。git diff HEAD为空来证明(git status干净是同一句话的另一半),不由退出码证明。REPO_ROOT="$(git rev-parse --show-toplevel)"。"$REPO_ROOT/PATH";信任顺序:trap 只是崩溃路径上的便利,字节/哈希比对才是证明。git hash-object对解析不到的路径输出的是空。code与status(ADR-0112 信封)。expect(...).toThrow()不是拒收测试:抛裸Error的未修复 driver 照样绿。code+status之上再断言 message 首句,永不取而代之。unrecognized_keys。safeParse绿;拒键与拒值是两个不同的事实。unrecognized_keys,是纵容幻影检查。??链,非法拼写落到 schema 的具名拒收,规则绿、schema 红。exports解析。dist/,不是src/;且没有 vitest alias 把 specifier 拉回源码。scripts/check-test-source-alias.mjs的KNOWN_UNALIASED_TEST_IMPORTS。packages/qa/dogfood是一例,不是定义;读成 dogfood 专属,普通单元套件里的 ablation 会被当真。pnpm --filter PKG build。dist/,才读运行结果:node scripts/ablation-dist-preflight.mjs PKG 'MARKER'。--absent。dist/里的 marker 会让变异代码对该树之后的每次运行继续生效。sed、perl -i、str.replace、re.sub零命中也 exit 0。grep -c一次。git diff --stat非空只证明有改动:同轮其它编辑会替它变绿,等长替换字节差为零。trap 'RESTORE' EXIT INT TERM还原。pnpm test/pnpm typecheck,为报告留真实输出。packages/cli的卡本地只欠unit层,integration层声明给 CI。pnpm --filter @objectstack/cli exec vitest run --project unit;CI 的pnpm test跑两层。bin/、test/helpers/serve-process.ts)时才本地跑它。--project integration并在报告里说明,否则写已声明给 CI。packages/cli/vitest-tiers.ts落。test/vitest-tiers-partition.test.ts在某个测试文件两层皆无或皆有时变红。git push -u origin claude/issue-N-SLUG推上去,网络失败退避重试。main,正文首行Fixes #N;合并不应关卡时用Part of #N,并说明留下哪一半。Fixes一张还在决策箱的卡:合并会静默关掉它,而收件箱过滤只读 open。#N。fix/fixes/fixed/close/closes/closed与resolve/resolves/resolved;让它们远离其它卡号。#N is not addressed here、out of scope: #N或#N remains open。skills/**(对外发布的技能包)的 diff:PR 正文报两个读数,并默认拒绝小功能大扩写。blocked报缺口;⛔ 不自行扩写、不自行抬预算。blocked,⛔ 不抬 ceiling。skip-changeset标签按仓库分流,先认清目标仓有没有这个机制;判据:不从任何包发布东西。docs/adr/**·.claude/**·scripts/pm/**· 仓根工具配置 · 私有 workspace · 注释。POST .../issues/N/labels,不碰已有标签);可达性按会话探,先探后用。in_progress是诚实值;PR 开出后 ⛔ 永不 sleep、定时等待或空转轮询 CI。open_questions记一笔冲突。os-dev-report。FIELD、IDENT.MEMBER一类)。mode:subagent与mode:cloud)下 GitHub 都是报告的权威源。mode:spellingsin_progress)。blocked,点名那件只有 PM 能解的事;锁没排到、测试在跑、CI 未出结论都不是第三种。blocked报告。status: "needs_decision",把每个问题连同选项、成本与你的推荐写进open_questions。rules/dev-template.md的{decision_frame}槽位。main碎了、依赖未合并、CI 基础设施故障 ⇒ 报blocked附证据,重试到排除你的改动。status: "rework"= 你自知不完整的部分成果,在summary里说明为什么。premise_still_valid: false= 你的核验证伪了 issue 的前提(规则 6):证据写进summary。pr为 null 或只圈存活的部分,PM 重新分诊。scripts/check-nul-bytes.mjs头部,引用它,别重推;push 前跑它。grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' FILES。Table 2 — passages left out, by class and section
Everything below leaves the file rather than being re-worded. The rule each supported survives in Table 1 unless the row says the passage was itself a duplicate.
2026-0M-DDoccurrences: the platform-fact measurement date, the English-artifact ruling, the token-count ruling, the two ratchet-currency rulings, the report-at-draft-PR ruling, the PR-subscription ruling, the two footer measurement datesghabsent, MCP available); the example filename--listFilesmeasurement; the 实测 wording on the pipe and lint timingsreset --softmeasurement; the depth-50HEAD~5control-leg measurement; the--unshallowstill-true measurement; the restore-lied stories behind the four hard lines; the trap-cwd incident; the plugin-email / plugin-auth ablation counts (375 green, 4 red); the same-afternoon zero-hitsedincidents; the mid-mutation SIGTERMpr-body.mdgh-wHEAD~5git checkout REF -- PATH(the generic form)git checkout HEAD -- PATHand the bare form it forbidsexamples/**Table 3 — pinned spellings kept, with their gate or consumer
os-dev-reportas the first line of the report commentscripts/pm/check-half-states.mjs(its report-marker predicate; the self-test's H33 anchor);SKILL.md收集 anddispatch-runbook.mdname the same markerissue,status,branch,pr,premise_still_valid,summary,tests,mcp_calls,open_questions,out_of_scope_findings) and thestatusvaluesdone | rework | blocked | needs_decisionSKILL.md报告契约 andcore-rules.mdsingle-source the shape from this fileFixes #N/Part of #Nas the PR body's first linescripts/check-partof-closing-keyword.mjs,scripts/check-closing-keyword-parity.mjs(derived, green)fix/fixes/fixed/close/closes/closed,resolve/resolves/resolvedcheck-closing-keyword-parity.mjspins the parser's vocabularyskip-changesetand its criterion (publishes nothing from any package), the additivePOST .../issues/N/labelsendpoint.github/workflows/lint.yml,pr-automation.yml,scripts/check-empty-changeset.mjs;dispatch-gates.mjsphrases its pending-changeset heading "per the os-dev clause"git fetch origin main && git worktree add --no-track ../REPO-issue-N -b claude/issue-N-SLUG origin/mainandBASE=$(git rev-parse HEAD)BASEis the anchor the 标准条款 family rules namebash scripts/pm/os-verify-lock.sh -c 'COMMAND',-- ARGV,--status,OS_VERIFY_LOCK_SLOT, exit 99, theVERDICT command-exitlinescripts/pm/os-verify-lock.sh(its self-test is wired inlint.yml);check-clause2-carriers.mjsnamesVERDICT command-exit 0as the near miss its colon rule excludes;true-green.mdpoints here for the queue semanticsTURBO_SCM_BASE="$BASE" pnpm exec turbo ls --affectednode scripts/pm/dispatch-gates.mjs --commands(no paths),--ran FILE,--repo OWNER/NAMEscripts/pm/dispatch-gates.mjsUSAGE_LINE and its self-testpnpm --filter PKG exec vitest run --maxWorkers=2 FILEand the bare--refusalscripts/check-agent-test-spelling.mjsscans.claudefor launcher-rooted runs with a bare separator (derived, green)model: opusand the frontmatter commentscripts/check-agent-model-declared.mjsreads themodel:value;SKILL.mdnames the comment as the authority on the resolution ordercheck:agent-model-declared,check:engine-double-contract,check:error-code-casing,check:nul-bytes,check:authorable-surfacepackage.jsonscript namesassertEngineDeleteDispatch(options)from@objectstack/objectqlcheck:engine-double-contractBlocked-by:check-half-states.mjsreverse index; the ratchet'sanchoredexemption class names itnode scripts/ablation-dist-preflight.mjs PKG 'MARKER'and--absent;trap 'RESTORE' EXIT INT TERMscripts/ablation-dist-preflight.mjsscripts/check-test-source-alias.mjs/KNOWN_UNALIASED_TEST_IMPORTSbash scripts/pm/os-regen-merge.sh;gen:schema;authorable-surface.base.json;baseRevcheck:authorable-surfacepackages/cli/vitest-tiers.ts,test/vitest-tiers-partition.test.ts,--project unit/--project integrationrules/dev-template.md/ the decision-frame slotcheck:skill-frame-syncwatches that the frame is not copied here.claude/skills/pm-dispatch/references/rest-channel.mdSKILL.mdpoints at itmode:subagent/mode:cloudSKILL.md派发 and the claim-comment templatetextfence#+ three digitsscripts/pm/check-skill-id-lint.mjs(EXTRA_FILESnames this file)固定评估轴/条评估轴/fixed axes/X-axis framescripts/check-skill-frame-sync.mjsFINGERPRINTS over the.claudetreeMAX_TABLE_ROW_BYTESpin 0Table 4 — conflicts found, and the reading taken
95d5cbb31: dates 9, corner-quote characters 126 (63 pairs; the brief counted pairs), ⛔ 44, over-120 lines 2 (one prose, one inside the JSON fence). The re-measure is the before columnOS_ALLOW_MAIN_EDITS, theCo-Authored-Byexemption,mode:subagent | mode:cloud,VERDICT command-exitand--commands/--ranare absent from the file at95d5cbb31VERDICT command-exit(the wrapper's actual line, replacing the bare word VERDICT); the two dispatch modes are named inside the existing two-modes clause;--commandsis added to the existing derivation command and--ran FILEas one clause, which is the mechanical form of the rule the file already stated (every derived family run, the new ones named).OS_ALLOW_MAIN_EDITSand theCo-Authored-Byexemption are NOT added: each would be a new rule, and a rules-only rewrite adds none; both live where the dev already reads them (CLAUDE.md / AGENTS.md;dispatch-runbook.md)95d5cbb31the file only named the partitionscheck:agent-model-declaredto read the frontmatter commentextractModelreads only the top-levelmodel:value. The comment is kept byte-identical anyway, because ruling 1 pins it andSKILL.mdnames it as the authority on the resolution ordertestsplaceholder sentence is shortened to 111 bytes; the field set is untouchedmaincheck:pm-governed-proseis named in A4 but the derivation scores it silent for these paths (roster block)Landing regime: governed (
.claude/**), so this stays a draft withskip-changeset. No seat flips it ready, enqueues it, or arms auto-merge; the seat requestsos-zhuangandhotlong.🤖 Generated with Claude Code
https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Generated by Claude Code
Generated by Claude Code