Repository navigation
skills(pm-dispatch, os-dev, AGENTS.md): finding admission threshold — only a reproducible defect, a contract violation, or a metadata-authoring trap becomes a card; everything else rides the PR's acceptance notes (maintainer-directed, both repos) #16351
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationpriority:p1High: required for production / M2High: required for production / M2
on Sep 6, 2026 Claim: PM loop round 8 (continued) — flight I, the maintainer-directed finding admission threshold (this card's governing text is the maintainer's instruction quoted in the body), PARTIAL: the
SKILL.md+references/core-rules.md+AGENTS.mdhalf. The.claude/agents/os-dev.mdhalf is NOT taken in this flight — that file is held by flight B (#14768) and the os-dev.md sentence rides the flight that follows B on it, folded with #16262; the PR carriesRefs #16351(neverFixes), and at its landing this seat releases the card for the remaining half. #16352 (priority in 取卡全序) is NOT folded in: its line sits in the 候选与批次 block that PR #16271 (devx) is rewriting, so it waits for that PR and PR #16339 to land.
Session:session_019RfFHiRCSs3JXLK4cwcfox
Branch:claude/issue-16351-finding-admission-threshold
Worktree:objectstack-issue-16351
Domain:domain:skills
File surface:.claude/skills/pm-dispatch/SKILL.md(811/811, pin 342 — thefindinglabel row, the 分类 line, the 发现分诊轮 block, the two report-reading lines; line-neutral by folds in the same sections),references/core-rules.md(150/150, two digest lines),AGENTS.md(1058/1058, Prime Directive 10's first sentence). ⛔ No other file; ⛔ not the 候选与批次 block, not the six lines flight A changed (81 · 534 · 538 · 543 · 637 · 647).
Container & model: S,mode:subagent, contract tier —dispatch-gates.mjs --tier: SKILL.md hits clause ① (MANDATORY); launched at the contract tier, the measured quota exemption (fable unavailable ⇒ opus, never lower; recorded here) applies only if the launch is refused.
Clause-②: no
Serial: SKILL.md and core-rules.md are held by two open drafts at the governed terminal — PR #16339 (flight A,d88c29c76a) and PR #16271 (devx,4d3194ba74), which conflict with each other on the 候选与批次 block; this flight edits neither's lines and must provegit merge-tree --write-treeclean against BOTH heads before opening its PR (the shape #16003 used against PR #15946). GOVERNED ⇒ draft PR, in-seat review at contract tier,os-zhuang+hotlong, human merge,skip-changeset; at ACCEPT the seat addsneeds-user-decision+ the 维护者速读.
Generated by Claude Code
Claim: PM loop round 8 (continued) — flight M, the SECOND half of this card: the
.claude/agents/os-dev.mdsentence (the dev's out-of-scope rule — three classes file a card; the rest isnoted, not filedin the report and listed under the PR's## 验收备注), folded with #16262 on the same file. The first half (SKILL.md · core-rules.md · AGENTS.md) is flight I onclaude/issue-16351-finding-admission-threshold, in flight,Refs #16351. This flight's PR carriesFixes #16351.
Session:session_019RfFHiRCSs3JXLK4cwcfox
Branch:claude/issue-16262-os-dev-lock-discipline-and-finding-threshold
Worktree:objectstack-issue-16262
Domain:domain:skills
File surface:.claude/agents/os-dev.mdonly.
Container & model: S,mode:subagent, contract tier (MANDATORY on this path).
Clause-②: no
Serial: see #16262's claim — merge-tree proof against flight B's headf5c08e9589.
Generated by Claude Code
os-dev-report
{ "issue": 16351, "status": "done", "branch": "claude/issue-16351-finding-admission-threshold", "pr": "https://github.com/objectstack-ai/objectstack/pull/16368", "premise_still_valid": true, "summary": "HALF DELIVERED: the SKILL.md + references/core-rules.md + AGENTS.md half of the finding admission threshold. A card is filed for exactly three classes — (a) a reproducible defect (repro or failing probe named), (b) a violation of a declared contract (contract text cited), (c) a trap that leads an AI authoring metadata to write what the runtime refuses or silently drops; everything else goes under a `## 验收备注` section of the PR body and into `out_of_scope_findings` as `noted, not filed`, the seat reads it at ACCEPT and files only what is in fact class (a)-(c), and a filed finding outside the three classes is closed not planned in one stroke by the grading seat; the `finding` label keeps its 待首次定级 meaning and a three-class card without evidence is refused. Sites (base b9a14dd64f): SKILL.md `finding` row 116, 分类 354 (1 → 2 lines, paid by the 387–388 发版板 fold: 「细则见」→「见」), 发现分诊轮 377–379 (3 → 3), 报告契约 778–779 (2 → 2); core-rules.md 89 and 150; AGENTS.md Prime Directive 10 lines 211–213 (corollary from mid-213 to 216 byte-identical). Line-neutral 811/811 (table pin 342/342), 150/150, 1058/1058; every changed line ≤120 bytes; rules-only register. HALF LEFT: `.claude/agents/os-dev.md` (held by flight B, rides the flight that follows it) — the PR carries `Refs #16351`, the card stays open. Merge-tree vs d88c29c76a (PR #16339) and 4d3194ba74 (PR #16271): both exit 0, 0 CONFLICT lines; neither head's lines touched (the four-axis frame, 候选与批次, and lines 81/534/538/543/637/647 untouched). Base moved from the brief's 3e270d4e29 to b9a14dd64f; the only drift on the three files was AGENTS.md line 758 (examples row), not PD 10. Draft PR #16368, `skip-changeset` via the additive labels endpoint with a comparison read-back (size/s + skip-changeset, nothing stripped); PR body read back byte-identical apart from the platform's appended session footer. The claim comment 5560108723 names this branch and session; no second claim posted; no assignee or label touched on the card.", "tests": "All at ea4cd7c0e4 (the pushed head), every exit captured to a file before any pipe, verdict lines quoted from the gates. Gate derivation: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` on the three paths → 18 commands; the no-path derivation off the merge base is identical; `--ran` → `✓ dispatch-gates --ran: 18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED.` `pnpm check:pm-skill-ratchet` exit 0: `✓ check-skill-line-ratchet self-test: 155 cases pass.` · `SKILL.md is 811 lines (ceiling 811; headroom 0)` · `SKILL.md: widest table row is 342 bytes (pin 342; headroom 0)` · `core-rules.md is 150 lines (ceiling 150; headroom 0)` · `AGENTS.md is 1058 lines (ceiling 1058; headroom 0)`; before at base b9a14dd64f (wc -l): 811/150/1058, widest row 342. Exit 0 each: check:pm-skill-id-lint, check:skill-frame-sync, check:pm-governed-prose, check:pm-governed-merges, check:pm-half-states (`✓ check-half-states self-test: 2535 cases pass.`), check:nul-bytes, check-closing-keyword-parity (+ --self-test), check-comment-mask-corpus, check-governed-queue-guard --self-test, check:agent-test-spelling, check:watch-hint-literal, check:refd-timer-probe, check:required-contexts, check:doc-authoring, check:docs-audit-scope, check:driver-memory-census. `pnpm --filter @objectstack/lint run check:doc-formula-expressions`: first run exit 3 PREREQUISITE NOT MET (unbuilt @objectstack/formula) = NOT MEASURED; after `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` under the lock (exit 0) the re-run is exit 0 (`9 @example(s) judged clean across 1297 packages/spec/src files`). H-row sweep: 14 removed/rewritten sentences grepped fixed-string over scripts/ and .claude/hooks/ → 0 hits each; positive control `认领 >~24h` → 2 hits. `check-governed-merges.mjs --test` on the three paths → exit 3 (GOVERNED). Whole-repo `pnpm lint` (eslint . --no-inline-config) via `bash scripts/pm/os-verify-lock.sh` slot issue-16351, one acquisition (waited 0s, held 106s shared-box) → `lint exit=0`. Diff scan: 0 model identifiers, 0 control bytes. Merge-tree: `git merge-tree --write-tree ea4cd7c0e4 d88c29c76a` exit 0 / 0 CONFLICT; `… 4d3194ba74` exit 0 / 0 CONFLICT. CI on ea4cd7c0e4 (foreground poll of the head's check runs): all 29 check runs on the head completed by 15:57Z — 17 success, 12 skipped, 0 failure/cancelled/timed_out; Lint & Repo Gates (the 155-step gate farm) success; Check Changeset success under skip-changeset", "mcp_calls": "0 — no MCP GitHub calls this run; the card was read through the public payload channel and confirmed through REST (repo-scoped read probe HTTP 200, core 15000/15000), and the PR, label and report comment were written through REST", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: references/dispatch-runbook.md line 31 「范围外发现照旧单开」 (sweep-batch context) now reads as 'filed per the admission threshold rather than folded into the sweep PR' — a wording drift not yet exercised, outside this flight's declared file surface; not a card under this very rule", "noted, not filed: .claude/agents/os-dev.md 范围 rule still states the old admission (every observation becomes a card) — the other half of this card, held by flight B; not a finding" ] }
Generated by Claude Code
os-dev-report
{ "issue": 16351, "status": "done", "branch": "claude/issue-16262-os-dev-lock-discipline-and-finding-threshold", "pr": "https://github.com/objectstack-ai/objectstack/pull/16375", "premise_still_valid": true, "summary": "Both halves landed in ONE file, .claude/agents/os-dev.md, line-neutral at 403/403 with every added line paid by a fold inside the same numbered rule block (max line width 120 bytes, rules-only register, no model names). #16262: rule 1 L76 now states the waiting discipline as protocol (one foreground call takes the full budget and blocks until the lock or 99; never poll-and-retry; OS_VERIFY_LOCK_SLOT always set) and rule 7 L95-L96 read a 99 as NOT MEASURED, spend the interval on lock-free work, and make the re-acquisition a same-slot RESUME (never a tail re-entry) — the brief's gloss 'no re-entering the queue on a 99' is carried as that distinction, since the ruling's own fourth part is the resumed place. #16351 (its LAST half): rule 3 L41-L45 carry the admission threshold — only (a) a reproducible defect, (b) a declared-contract violation, (c) a metadata-authoring trap file a card; everything else goes under the PR's ## 验收备注 and into the report as 'noted, not filed'; the dedup/channel/归挂 lines stay; old L57 (observation-class finding label) and L58 are folded, L52+L53 merged deleting a restated rationale; the report-shape example gains the second spelling in place. Premise verified on origin/main f377394ae2: the two target sentences sat at L41/L57, rule 1 at L74-L79, rule 7 at L93-L102, flight B's head f5c08e9589 not yet on main; merge-tree against f5c08e9589 exit 0 with 0 CONFLICT lines (quoted in the PR body). Draft PR #16375 carries both Fixes lines, the 改前→改后 table, ## 验收备注 and the 维护者速读 draft; skip-changeset applied via the additive REST labels endpoint with a comparison read-back (before: size/s; after: size/s + skip-changeset; nothing stripped). Deviations from the brief, per the file's own rule that it outranks the prompt: dispatch-gates was derived WITHOUT a path (the file forbids feeding it a list) and reconciled with --ran; PR creation and both report comments went through REST (proxied session identity os-steve), so mcp_calls is 0. Assignee os-steve was already set by the PM on both cards; newest Claim on each names this branch; no second claim posted, no label or assignee touched.", "tests": "Union run at the final commit 9a1f16843c (no later commit). Derived: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no path; change set 1 path from merge base f377394ae); reconciled: dispatch-gates --ran → '16 derived, 16 run, 0 NOT-MEASURED, 0 UNRUN' exit 0. Every exit captured by redirect before any pipe. pnpm check:pm-skill-ratchet exit 0 — '✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 403 lines (ceiling 403; headroom 0).' (self-test + live, zero advisories). pnpm check:pm-skill-id-lint exit 0 — '26 file(s) clean'. pnpm check:skill-frame-sync exit 0 — '2 copies of the decision frame are structurally isomorphic across 2 files'. pnpm check:pm-governed-prose exit 0 — 'name all 5 registered governed surfaces'. pnpm check:pm-governed-merges exit 0 (274 assertions). node scripts/pm/check-governed-merges.mjs --test .claude/agents/os-dev.md → exit 3 'GOVERNED — a human merge is the review record'. node scripts/pm/check-half-states.mjs --self-test exit 0 — '2553 cases pass'; the 14 removed/rewritten sentences grepped over scripts/ .claude/hooks .github → 0 hits each; positive controls fire (decision_frame 2 hits in scripts, assertEngineDeleteDispatch 72). pnpm check:agent-model-declared / check:agent-test-spelling / check:doc-authoring / check:nul-bytes ('scanned 8030 text file(s) … no raw ASCII control bytes') all exit 0. All five .claude/hooks/*.selftest.sh exit 0 (52/130/120/53/38 passed, 0 failed). Whole-tree families: check-closing-keyword-parity (+ --self-test), check-comment-mask-corpus, check-governed-queue-guard --self-test, check:driver-memory-census, check:refd-timer-probe, check:watch-hint-literal — all exit 0. pnpm --filter @objectstack/lint run check:doc-formula-expressions: first run exit 3 = PREREQUISITE NOT MET (formula + lint unbuilt; not a measurement), after 'turbo run build --filter=@objectstack/formula --filter=@objectstack/lint' through the lock (VERDICT command-exit 0) → exit 0 '22 record-scoped formula example(s) across 430 files / 1371 TS blocks judged clean'. Whole-repo pnpm lint through bash scripts/pm/os-verify-lock.sh, slot issue-16262, ONE call with the full 540s budget, lock free at arrival: 'VERDICT command-exit 0 · held the lock 111s (1m51s) · waited 0s' (shared-box seconds). Merge-tree: git merge-tree --write-tree HEAD f5c08e9589 exit 0, 0 CONFLICT lines (tree cd052574e2…); vs origin/main f377394ae2 exit 0. Line width: LC_ALL=C awk max 120 (L79 at exactly 120; the file already had four 120-byte lines). Control bytes: grep -naP → none. CI on 9a1f16843c, polled in the foreground until completion: 29/29 check runs completed, 0 non-green (Lint & Repo Gates success, 156/156 steps; TypeScript Type Check, Test Core, Dogfood Regression Gate, Check Changeset, Governed Surface Queue Guard, both single-claim guards all success). No ablation applies (prose-only diff).", "mcp_calls": "0 — every GitHub read and write went through the proxied REST channel (session identity os-steve, core 15000/15000): the two cards and their comments, PR create (201), additive labels POST (200) + read-back, check-run polling, and the two report comments.", "open_questions": [ { "question": "Label on a DEV-filed out-of-scope card now that the observation-class finding instruction is gone: the landed text says 只有三类立卡且不打标签 (filed cards carry no label; the triage seat grades — the old L58 disposition kept), while #16351 §5 ('the finding label keeps its meaning for what is filed, 待首次定级') and flight I's SKILL.md finding row (立卡三类内待首次定级) can be read as the dev applying finding to every filed class (a)-(c) card so the 发现分诊轮 grades it.", "options": [ "A — as landed: dev applies no label; the bare-card triage grades (a fast path to pm:queue for a real defect); finding is applied by seats only", "B — dev applies finding (never pm:queue) to every filed out-of-scope card; the 发现分诊轮 is the single grading path; one word on L41 (且打 finding instead of 且不打标签)" ], "recommendation": "A, because on the four axes it is the smaller change: the real business need is inflow reduction, which the threshold delivers regardless of label; long-term the type/label field stays the triage seat's single product (core-rules: 类型字段由分诊席唯一生产) rather than a dev-written state; for AI-authoring safety a dev that must not judge severity should not pick the routing label either; and startup focus says do not add a second dev-side label rule on top of the threshold. B is one word on L41 if the seat prefers the 发现分诊轮 as the single path — a one-line follow-up, no re-dispatch needed." } ], "out_of_scope_findings": [ "noted, not filed: os-dev.md rule 3 line 「大宗读走零配额档:公开仓单卡网页内嵌 JSON payload 载原始 body + 全评论」 over-claims against platform-readings (「只有 body 精确」; timeline renders the first 15 items); the next line already delegates the boundary — a doc nit", "noted, not filed: the dispatch brief's parenthetical 'no re-entering the queue on a 99' vs the ruling's 'always set OS_VERIFY_LOCK_SLOT so a timed-out place is resumed' — read as tail re-entry forbidden, same-slot resume sanctioned; the landed text says exactly that (再取以同名续位,⛔ 不从队尾重排)", "noted, not filed: os-verify-lock.sh reported 'held the lock 2s' for a turbo build whose log ran 2,228 lines — a shared .turbo cache replay; consistent, not a finding", "noted, not filed: rule 7's pre-existing example list read 测试 as lock-free work; restored to 写测试 in this PR (running tests takes the lock) — recorded in the PR table, no card" ] }
Generated by Claude Code
Maintainer-directed (skills seat, 2026-09-06T15:0xZ). Governing text — the maintainer's instruction in the seat's chat, verbatim: 「这个问题我觉得也需要,两个仓库都需要:finding 准入门槛(源头减流,一张 skills 卡):只有「可复现缺陷、契约违背、会让 AI 写错元数据」三类才立卡;纯观察、风格、文档 nit 写进 PR 验收评论即可。改 os-dev.md 与 SKILL.md 的立卡规则,受管面走草案 PR。预期入流减半。」
The measurement behind it (objectui, 2026-09-06T14:15Z, read by the seat)
findingdomain:uipm:queuefinding79,priority:p356findingcards created 09-05 / 09-06Throughput is not the problem — inflow is, and the inflow is manufactured by the fleet itself: every dev flight files one to three out-of-scope findings, nearly all graded p3, and the queue only grows. The rule that produces this is written in five places and none of them carries an admission threshold.
Where the rule lives today (objectstack
main; objectui carries NO.claude/agents/and no finding rule of its own — its seats and devs read these same files, so one landing covers both repos).claude/agents/os-dev.md— 范围 rule: 「顺路撞见的无关缺陷立成新的无 assignee issue」 and 「观察类发现(死代码、未演练漂移、外观抛光)打finding标签,⛔ 不打pm:queue」— every observation becomes a card..claude/skills/pm-dispatch/SKILL.md— thefindinglabel row (「观察类记录,恒 = 待首次定级」), the 分类 line (「finding= 观察类(死代码、未演练漂移、抛光;真实但今天没有用户撞上),待首次定级」), the 发现分诊轮 block (「每 fire 定完全部未定级 finding」), and the report-reading lines (「out_of_scope_findings应已由 dev 立成无 assignee 的卡」/「范围外发现的标签按种分:观察类打finding」).references/core-rules.md— the digest line 「观察类记录打finding待首次定级」 and 「范围外发现须已立卡」.AGENTS.mdPrime Directive 10 — 「File issues for out-of-scope findings — don't silently expand scope or leave them buried」.The rule to land
## 验收备注(acceptance notes) section of its PR body and in the report'sout_of_scope_findingsasnoted, not filed: …; the seat reads them at ACCEPT. A noted item that is in fact class (a)–(c) is filed by the seat at ACCEPT, not by the dev.not_planned, the reason on the card; the 发现分诊轮 stops carrying observation-class cards.AGENTS.mdPrime Directive 10 keeps its intent (never bury a defect, never expand scope) and states the threshold in one sentence; the corollary (declared ≠ enforced) is untouched.findinglabel keeps its meaning for what is filed (待首次定级); the card-body requirement for class (a)–(c) is the evidence named above, so a triage seat can refuse a finding that carries none.Acceptance
references/core-rules.md's digest line matches SKILL.md in the same PR (the one-rule-two-places rule).SKILL.md811,os-dev.md403,core-rules.md150,AGENTS.md1058 — folds inside the same sections); rules-only register.check-skill-line-ratchet,check-skill-id-lint,check-skill-frame-sync,check-governed-prose,check-half-states --self-test(no H-row pins a sentence touched),check-governed-merges --testexit 3, whole-repo lint — every exit captured before any pipe..claude/**,AGENTS.md): draft PR, seat review at contract tier,os-zhuang+hotlong,needs-user-decision+ 维护者速读, human merge.findingcards per day at or below half of the 09-05/09-06 rate.Serial plan (recorded at filing)
SKILL.md+core-rules.mdare held by flight A (PR #16339, at CI) and by the devx seat's PR #16271;os-dev.mdis held by flight B (no PR yet). The SKILL.md / core-rules / AGENTS.md parts dispatch as one flight the moment a slot frees, with a merge-tree proof against both open PR heads (the shape #16003 used against PR #15946); theos-dev.mdpart rides the flight that follows flight B on that file, folded with #16262. The selection-order card filed in the same stroke folds into the SKILL.md half (same file, same register, no conflicting ruling).Refs #16262.
Generated by Claude Code