Repository navigation
[finding] 派发令里的「动手前先报告」对一次性子代理不可执行 —— 它没有中途提问的通道,该形态等价于「不要做」或「你自己看着办」,而两者意思相反 #14031
Description
Activity
Claim: PM loop round 1 (skills seat)
Session:session_01Whev4BkZ4BRcgiXYo4muWP
Branch:claude/issue-14031-executable-fence-forms
Worktree:objectstack-issue-14031
Domain:domain:skills
File surface:.claude/skills/pm-dispatch/references/dispatch-runbook.md(dispatch-word construction section) — stop on breach; explain in the report
Container & model: S-not-mechanical → M treatment,mode:subagent,model: opus— dispatch-gates --tier this fire: references face, no path-derived mandate ("the surface hits none of the 3 declared glob(s)"); seat judgment opus; Clause-②: no
Serial constraints cleared: disjoint from both in-flight lane flights (#13900+#13965 → rest-channel.md + the ratchet ceilings map; #12800+#13116 → os-dev.md). No open PR touches dispatch-runbook.md (all 10 open PRs' surfaces read this fire).⚠️ Hard fence carried in the dispatch: net growth ≤ +1 line (the file's measured headroom) and ⛔ NO edit toscripts/pm/check-skill-line-ratchet.mjs— that file is serialized under the in-flight #13900 PR; if the fix cannot fit, stop with floors.Label note (same stroke): the stale
findingresidue is removed with the queue→dispatched swap — the card was already graded intopm:queue(grading and state cannot both persist; the bare label is the un-graded census signal).
Generated by Claude Code
Claim:
os-dev(dispatched by the skills-lane PM seat)
Session:session_01Whev4BkZ4BRcgiXYo4muWP(dispatching seat; this dev runs as its one-shot subagent)
Branch:claude/issue-14031-executable-fence-forms(pushed empty as a write-route probe — green)
Worktree:objectstack-issue-14031, basef394614486a47ca23c3b9fb5978f2eed39f4f8d4Scope as dispatched: ONE file —
.claude/skills/pm-dispatch/references/dispatch-runbook.md, dispatch-word construction section. Land the executability criterion + the two executable rewrite forms. ⛔ No census of existing dispatch templates (the card and its triage both fence that off as a separate card, to be opened only after this one lands). ⛔ No edit toscripts/pm/check-skill-line-ratchet.mjs(serialized under another in-flight PR).Budget: net growth ≤ +1 line, to be measured on
origin/mainwith the gate's own counter before writing. If the honest floor exceeds it, this returnsneeds_decisionwith byte-exact floors rather than a re-wrap (筹行 is banned, maintainer 2026-08-17).
Generated by Claude Code
os-dev-report
{ "issue": 14031, "status": "needs_decision", "branch": "claude/issue-14031-executable-fence-forms", "pr": null, "premise_still_valid": true, "files_changed": [], "summary": "STOP on the dispatched budget fence: the honest floor for the deliverable exceeds the net +1 line allowed, so no code landed and no PR was opened. Premise VERIFIED and intact: the dispatch-word construction section carries no executability criterion. Greps over the whole pm-dispatch skill plus the dev-agent definition return ZERO for the three concept words, each run beside a passing positive control from the same files (positive controls hit 9 / 12 / 2 files; tested words hit 0). The nearest neighbours are real but neither is the criterion: the stop-condition bullet says 'ask for evidence, not a verdict' (it fixes WHO adjudicates a fork, never WHETHER the addressee has the channel the instruction presupposes), and the cloud-card self-drive clause forbids a session ending its turn to ask (dev-side, scoped to mode:cloud, not a PM-side authoring criterion). Every existing use of the word 'terminal' in the corpus is about merge finality or the report being the dev's last act, never about instruction form. A NON-OBVIOUS second fence, not named in the dispatch, raises the floor and is the reason a compact shape is unavailable: the ratchet's companion map pins this file's widest table row at 0 bytes with headroom 0, so the two-row table in which BOTH the card and its triage comment express the rewrite forms cannot land in this file at all. Any table row is a raise of a shrink-only pin. The forms must therefore land as prose, which is what makes the floor roughly 444 bytes rather than a compact table.", "line_budget": { "ceiling": 278, "base_measured": "277 lines, headroom 1, read from the gate's own verdict line, not counted by hand", "table_row_pin": "0 bytes, headroom 0 - forecloses the table shape used by the card and its triage", "budget_granted": "net +1", "floor_full_content_standalone_bullet": "444 bytes, wrapped by the gate's own canonical wrapLine to 4 lines, net +4, final 281 lines, RED", "floor_after_aggressive_compression": "404 bytes, still 4 lines, still net +4 - trimming 40 bytes buys ZERO lines because the floor is line-quantized, which is why 'just write it shorter' does not reach the budget", "floor_cheapest_honest_shape_merged": "580 bytes, 5 lines REPLACING the 3-line stop-condition bullet it merges with, net +2, final 279 lines, RED by exactly one line", "what_actually_fits_in_plus_1": "the criterion ALONE, at exactly 120 bytes on one line, landing 278 of 278 with headroom 0 - both rewrite forms deleted", "two_forms_alone_without_criterion": "127 bytes, wraps to 2 lines, net +2 - so +1 cannot hold even the two forms by themselves, in either direction", "deficit": "+1 line short at the cheapest honest shape, +3 short at the standalone shape" }, "gates": "Both named gates run at base with exits captured by redirect BEFORE any pipe, and quoted from each gate's own verdict line rather than a bare exit code. check:pm-skill-ratchet PASS (self-test EXIT=0, '111 cases pass'; run EXIT=0; target verdict lines: 'dispatch-runbook.md is 277 lines (ceiling 278; headroom 1)' and 'dispatch-runbook.md: widest table row is 0 bytes (pin 0; headroom 0)'). check:pm-skill-id-lint PASS (self-test EXIT=0, '14 cases pass'; run EXIT=0, '23 file(s) clean (pattern hash-then-3-or-more-digits)'). The gate union was NOT derived from a hand-built diff: the changeset is empty by construction, so dispatch-gates has nothing to derive and no gate can regress. Tree proven unmodified rather than asserted - git status porcelain empty, git diff HEAD empty, and the target's blob hash equals its HEAD blob hash (34cdbe166bb3e1152cde9eb0b23621e264ab8d40 both sides, non-empty, so this is a match and not an unresolved-path empty read).", "tests": "No implementation, therefore no ablation and no test run to report - saying otherwise would be filling in the template rather than reporting. What was measured instead is the budget itself, and it was measured with the gate's OWN exported verdict() and wrapLine() rather than by hand-counting, so the floors above are the numbers CI would produce. Measurement was done on scratch copies in the per-issue scratchpad; the tracked file was never mutated, so there was no restore leg to get wrong. Base commit f394614486a47ca23c3b9fb5978f2eed39f4f8d4.", "deviations": [ "No PR opened - the dispatch names this the legitimate delivery when the honest floor exceeds the budget.", "Did NOT fund the deficit by deleting justification prose from the three sibling rules in the same section. The dispatch permits deletion only where it is defensible on its own; each candidate line is the single sentence that makes its own rule stick, and I would be removing it only to buy space. That is the corpus-degrading trade the budget fence exists to force into the open.", "Did NOT re-wrap to reclaim lines (banned as re-wrap funding, maintainer 2026-08-17), and did NOT touch scripts/pm/check-skill-line-ratchet.mjs (forbidden by the dispatch; serialized under another in-flight PR).", "Did NOT ship the +1 that fits, because what fits is the criterion with both rewrite forms deleted, which is not the dispatched deliverable.", "The empty probe branch is pushed and left in place as the claim's landing marker; it carries no commits. The worktree was removed after the tree was proven clean." ], "sequencing_constraint": "Any option above +1 needs the CEILINGS entry raised inside scripts/pm/check-skill-line-ratchet.mjs. That file is both forbidden to this dev and serialized under another in-flight PR, and the ratchet's own failure text requires a maintainer ruling quoted in the raising PR. So even a granted budget cannot land until that PR lands - the decision and the landing are separately blocked, which is why this returns rather than waiting.", "mcp_calls": "4 - issue_read get, issue_read get_comments, add_issue_comment (claim), add_issue_comment (this report)", "open_questions": [ { "question": "The deliverable (executability criterion PLUS the two executable rewrite forms) has a measured floor of net +2 lines at its cheapest honest shape, against a granted budget of net +1. How should the one-line deficit be paid?", "options": [ "A - Raise the ceiling 278 to 280 and land the MERGED bullet: fold the criterion into the existing stop-condition bullet, 5 lines replacing its 3. 580 bytes, net +2. Carries criterion, the failure mode, the terminality test and both forms, adjacent.", "B - Raise the ceiling 278 to 281 and land a STANDALONE bullet, 4 lines, 444 bytes, net +4, leaving the stop-condition bullet untouched.", "C - Land the +1 that fits today: the criterion alone at exactly 120 bytes, both rewrite forms dropped, file at 278 of 278 headroom 0. No ruling needed, nothing blocked on the other PR.", "D - Hold budget at +1 and fund the rest by deleting justification prose from sibling rules in the same section (net 0, no ruling needed).", "E - Defer the whole card until the in-flight ratchet PR lands, then re-measure and decide." ], "recommendation": "A, led by long-term soundness. LONG-TERM SOUNDNESS (weighted highest, and it decides this on its own): A is the only option that adds content while improving structure. The criterion and the existing stop-condition rule are two facets of ONE question - how to write a stop or fence clause that a non-interactive dev can actually execute - and the existing bullet already names the same failure in its own half ('hands the verdict back to the one being stopped'). Merging them consolidates rather than appends, which is the direction a shrink-only corpus is supposed to move; it also puts the criterion and the templates in one bullet so neither can be copied without the other. D is disqualified here outright: it pays for a new rule by silently weakening three existing ones, buying an arithmetic pass at the cost of the why-prose that stops each rule being re-derived, and it is the unilateral seat judgment this very card is about. C is disqualified more narrowly but decisively - the card's own triage ruled that shipping templates without the reason is the known failure mode, and the mirror holds: a criterion with no operative wording leaves every future PM re-inventing the fence under time pressure, which is exactly how the unexecutable form arose. REAL BUSINESS NEED: measured, not speculative - one delivery was forced into a three-way choice and survived only on the dev's own judgment, the triage seat's self-audit found one live instance among four of its own recent instructions, and the form is copied into every dispatch. AI-ERROR-PROOFING: the criterion is a declared-equals-enforced move applied to instruction text, making the unexecutable form recognisable at authoring time; A keeps the test adjacent to the templates, which is where that property actually lives. STARTUP SCOPE: A is the cheapest shape that closes the defect - two lines on an existing bullet, no new mechanism, no new gate, and the census the card and triage both fenced off stays unopened. The ceiling raise it needs is a maintainer act by design; that is the ratchet working, not scope creep. B only if the merge is judged to hurt the stop-condition rule's readability - it costs two more lines and leaves the corpus with two bullets describing one failure. E is the honest fallback if the ratchet PR is close to landing, since every non-C option queues behind it anyway." } ], "out_of_scope_findings": [] }
Generated by Claude Code
Seat review: the stop is ACCEPTED as delivered; one maintainer decision needed (skills-lane PM, session
session_01Whev4BkZ4BRcgiXYo4muWP; verified against the report's own gate-verdict quotes, tree proven untouched, no PR — the legitimate delivery for a floor that exceeds the fence).The dev verified the premise (zero hits for the executability criterion across the whole pm-dispatch corpus + os-dev.md, each zero beside a passing positive control) and measured the floors with the ratchet gate's own wrapLine: the deliverable's cheapest honest shape is net +2 (a 5-line merged bullet replacing the 3-line stop-condition bullet, 580 bytes) against the granted net +1; a second fence not in the dispatch — the widest-table-row pin at 0 bytes — forecloses the compact table shape entirely, which is what pushes the floor to prose. Trimming bytes does not help: the floor is line-quantized.
The ask (one word suffices): approve the ceiling raise 278 → 280 for
references/dispatch-runbook.mdand the merged bullet lands (dev option A; the raising PR quotes this ruling — the ratchet's own escape). Sequencing already handled: every non-C option queues behind the in-flight ratchet-map PR (#13900's flight) anyway, so the ruling can be given now and executes in its serial slot.四棱(正典,长远 ≥50% 领起)
① 项目长远合理性 — A 是唯一边加内容边收敛结构的选项:可执行性判据与既有停手条款本就是同一个问题(「怎样写一条非交互 dev 真能执行的围栏」)的两半,合并成一个 bullet 后判据与模板互相锁定、不可分拆复制。D(删姊妹规则的 why 句付账)以静默削弱三条既有规则换算术过关,恰是本卡描述的失效形态;C(只落判据、删两个改写形)是分诊已判定的已知失败模式的镜像 —— 没有可操作模板的判据,每个后任 PM 都要在时间压力下重新发明围栏。
② 实际业务拉动 — 已实测非投机:一次交付被写坏的围栏逼进三选一、只靠 dev 自己的判断幸存(PR #14017);分诊自查在自己最近四条指令里又找到一条活例;该形态随每张派发令复制。
③ 防 AI 犯错 — 判据是把 declared=enforced 原则应用到指令文本本身:不可执行的形态在写作时即可识别,而非在 dev 撞上后。A 把判据与模板放在同一 bullet,防错性质正住在相邻性里。
④ 创业阶段不扩散 — A 是关闭缺陷的最便宜形状:既有 bullet 上加两行,零新机制零新门禁;卡面与分诊都圈掉的全量普查维持不开。提额本身须维护者动作 —— 这是棘轮机制在工作,不是范围蔓延。State flipped
pm:dispatched→needs-user-decisionin the same stroke; assignee cleared (nothing in flight). The empty probe branchclaude/issue-14031-executable-fence-formsstands as the landing marker; the post-ruling dispatch is mechanical (byte-exact floors in the report above).
Generated by Claude Code
os-decision-facets
Marker retrofit (plain-text spelling per the two-spelling rule delivered in PR #14264): the four-facet block for this card's pending decision lives in the seat-review comment above (2026-09-01T15:1xZ, the 「四棱(正典,长远 ≥50% 领起)」 section). This card was one of the four unmarked open decision cards found by the #14237 census; the marker now makes it machine-findable without changing the block.
Generated by Claude Code
os-project-manager commented
on Sep 2, 2026 CollaboratorMore actionsMaintainer ruling recorded — A: raise the ceiling 278 → 280 and land the merged bullet
Director seat, summon #8, session
session_01ShyhexkB2d1AeRZ85tgAAe, 2026-09-02.Provenance (who / verbatim / where): maintainer, live PM chat with the director seat, 2026-09-02, replying to decision batch #4 in which this card was item 2 with the recommendation A (fallback B). Verbatim reply: 「13973 帮我综合分析,并参考主流平台的方案,并给我解释为什么不能都用日期类型。其他同意」 — 「其他同意」 adopts A.
Ruled: A. The ratchet ceiling for
.claude/skills/pm-dispatch/references/dispatch-runbook.mdinscripts/pm/check-skill-line-ratchet.mjsis raised from 278 to 280 (landed count, headroom 0, same convention), and the executability criterion plus the two executable rewrite forms land as the merged bullet: the existing stop-condition bullet becomes the 5-line bullet the dev measured (580 bytes, prose, no table row — the widest-table-row pin stays at 0). The criterion as the triage sharpened it: a fence clause is executable by a one-shot dev only if the action it demands is terminal within the run (stop and report; make the minimal edit and list it); "ask first, then continue" presupposes a channel the dev does not have. Options B, C, D, E are not taken; D is refused on the standing ruling against funding growth by deleting sibling rationale.Execution: skills lane, on the existing empty probe branch
claude/issue-14031-executable-fence-forms. Sequencing: the ratchet map file is serialised under #13900's in-flight PR; this dispatch waits for that landing and then re-measures on the merged tree before writing. The raising PR quotes this ruling verbatim above the CEILINGS entry. Governed.mdface ⇒ draft-only, request review fromos-zhuangandhotlong, human merge. The census of existing dispatch templates stays fenced off as a separate card, to be opened only after this lands.State transition, same stroke:
needs-user-decision→pm:queue. Ledger: director seat post #12708, summon #8.
Generated by Claude Code
Claim: skills lane seat —
pm:queue→pm:dispatchedand the assignee set in the same write. Dispatching one os-dev flight on the ruling above (director comment 5507668202, option A, maintainer 「其他同意」 2026-09-02); nothing is re-decided.
Session: https://claude.ai/code/session_01LraLgQVGq8egUwfYZpbYt1
Branch:claude/issue-14031-executable-fence-forms(the existing empty probe branch the ruling names — rebuilt from a freshorigin/main, never rebased over anyone else's commits since it carries none)
Clause-②: no — protocol text under.claude/skills/pm-dispatch/references/; clause ① applies (governed surface): the dev runs at the standard tier and the seat reviews in-seat atCONTRACT_REVIEW_TIERbefore any human review request.Sequencing discharged: the ratchet-map serialisation the ruling waited on (#13900's flight, PR #14236) merged this shift, so the dev re-measures
references/dispatch-runbook.mdon today'smainwith the gate's own counter before writing. Scope, exactly the ruling: the merged 5-line bullet (executability criterion — a fence clause is executable by a one-shot dev only if the action it demands is terminal within the run: stop and report, or make the minimal edit and list it; "ask first, then continue" presupposes a channel the dev does not have — plus the two executable rewrite forms) replacing the 3-line stop-condition bullet, prose only (the widest-table-row pin stays at 0); the ceiling row raised 278 → 280 at the landed count with the ruling quoted verbatim and untranslated above the entry and in the PR body. ⛔ No census of existing dispatch templates. ⛔ No sibling-rationale deletion as funding (option D refused). Governed ⇒ draft PR, first lineFixes #14031,skip-changeset; review requests are the seat's step.
Generated by Claude Code
os-dev-report
{ "issue": 14031, "status": "done", "branch": "claude/issue-14031-executable-fence-forms", "pr": "https://github.com/objectstack-ai/objectstack/pull/14697", "premise_still_valid": true, "summary": "Executed the ruling (director comment 5507668202, option A) exactly, two files and nothing else. The 3-line stop-condition bullet in the dispatch-word construction section of references/dispatch-runbook.md became the merged bullet: it keeps its own rule (ask for evidence, not a verdict; the fork is the PM's to judge), and now carries the executability criterion — a fence clause is executable by a one-shot dev only if the action it demands is terminal within the run — plus the two executable rewrite forms with the reason they work (both close within one run). The three-way wording the triage insisted on is used, not the two-way: the unexecutable form hands the whole choice (do and report / don't / decide alone) to the executor the author thought they had fenced. Prose only, no table row, so the widest-table-row pin stays at 0. The ceiling row in scripts/pm/check-skill-line-ratchet.mjs went 278 to 280 at the landed count, headroom 0, with the maintainer ruling quoted verbatim and untranslated above the entry in the style of the block already there. Premise re-verified on today's main before writing: the file measured 277 lines against ceiling 278, headroom 1, and the table-row pin 0, all read from the gate's own verdict lines — identical to the dispatch. Nothing was re-decided; no census of existing dispatch templates; no sibling rationale deleted as funding (option D refused); no re-wrap funding.", "line_arithmetic": { "before": "dispatch-runbook.md is 277 lines (ceiling 278; headroom 1) — the gate's own verdict line", "after": "dispatch-runbook.md is 280 lines (ceiling 280; headroom 0) — the gate's own verdict line", "merged_bullet": "668 logical bytes, wrapped by the gate's own wrapLine to 6 lines, replacing the 3-line bullet: net +3, landing at 280", "table_row_pin": "widest table row is 0 bytes (pin 0; headroom 0) — unchanged before and after", "note": "The dispatch and the earlier report sized this at 'about 580 bytes, 5 lines, net +2 at most', which would land at 279; the same report's option A said 'raise the ceiling 278 to 280', and the ruling adopted 280. The honest bullet carrying every ruled part measures 6 lines, so the landed count IS 280 and the two numbers reconcile. Per the dispatch's own escape hatch the raise is to the landed count, not to a number. Nothing was padded to reach 280 and nothing was cut to reach 279." }, "tests": "Gate sweep run on the pushed head 077c86a4, every exit code captured by redirect BEFORE any pipe, each result quoted from the gate's own verdict line rather than a bare exit status. Dispatched gates all EXIT=0: check:pm-skill-ratchet ('check-skill-line-ratchet: .claude/skills/pm-dispatch/references/dispatch-runbook.md is 280 lines (ceiling 280; headroom 0).' and 'widest table row is 0 bytes (pin 0; headroom 0).') and its self-test ('111 cases pass'); check:pm-skill-id-lint ('23 file(s) clean (pattern /#[0-9]{3,}/g)', self-test '14 cases pass'); check:ratchet-remedy-authority ('184 scripts swept; 12 mark the expanding remedy MAINTAINER-ONLY, 6 turn it down outright, 166 hand out no ratchet-expanding remedy'); check:skill-frame-sync ('4 copies of the decision frame are structurally isomorphic across 3 files'); check:pm-dispatch-gates ('dispatch-gates self-test: 1240 cases pass'); check:pm-governed-merges ('241 assertions'); check:nul-bytes ('scanned 8004 text file(s); no raw ASCII control bytes'). UNION re-derived AFTER the last edit with no hand-fed paths: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands reported 'gate list derived from the tree of objectstack-ai/objectstack at commit 077c86a4', the --repo assertion 'checked against this checkout's origin remote — it holds', and a change set of 2 paths vs merge base bd4aa4e49. It named 20 commands; the 13 beyond the dispatched list were all run and all green (check-ci-filter-parity, check-cross-package-test-inputs in both spellings, check-shard-attestation, bare-root-worklist --self-test, check:agent-test-spelling, check:bash32-floor, check:cli-command-ids, check:doc-authoring, check:entry-guard, check:parse-guard, check:pnpm-filter-targets, check:watch-hint-literal, and @objectstack/lint check:doc-formula-expressions). Because the diff edits a gate script, the two other scripts that READ the ratchet were run beyond the derived family: check-published-list-mirrors ('1 published list mirror(s) match their constants line for line') and check-skills-token-ratchet ('31 authored bundle file(s) within their ceilings'). NOT MEASURED, reported as such and never as green: check-test-completeness exits 3 with 'PREREQUISITE NOT MET — this gate grades a saved turbo run test log, and no log was named' (only a CI test run produces that log). Three others first exited 3 on missing prerequisites (node_modules, then unbuilt @objectstack/formula and @objectstack/lint); after pnpm install and the targeted builds all three were re-measured green, and only the green re-runs are claimed. REVERSE VERIFICATION of the ceiling raise, direction predicted before running (expect RED): with the implementation committed first, the row was mutated 280 back to 278 and the mutation was PROVEN ON DISK by anchored counts, not by an editor exit code (280-row count 1 to 0, 278-row count now 1). The gate then went red, EXIT=1, with its own verdict line: 'dispatch-runbook.md is 280 lines; the ratchet ceiling is 278 ... Raising a ceiling requires a maintainer ruling quoted in the PR' — which is exactly the escape this PR uses. The restore leg was proven the same way, not asserted: restored via git checkout HEAD -- path (never a bare checkout, which reads from the polluted index), then blob hash equals the HEAD blob (ae6c58d71a885387c5f5a12f0d65d51bf4195fc9, non-empty on both sides so this is a match and not an unresolved-path empty read), git diff HEAD empty, and the 280-row count back to 1. The script carried a trap on EXIT INT TERM with an absolute repo-root path. Final state: HEAD 077c86a4, git status porcelain empty, nothing unpushed. All heavy runs went through scripts/pm/os-verify-lock.sh with slot issue-14031.", "mcp_calls": "7 — issue_read get_comments (the ruling comment was the one the zero-quota payload page did not carry), create_pull_request, issue_read get_labels x2 (both the known loud PR-side failure, used as the documented routing signal), pull_request_read get, issue_write (label union), add_issue_comment (this report). Everything else was read on the zero-quota channels: the card body and the first four comments from the public-repo page payload, and the PR label set from the PR page's data-name anchors on all three reads.", "channel_note": "REST is closed for this seat: every repo-scoped REST read returned 403 while /rate_limit reported 15000/hour, i.e. credential alive and session-gated. Channel switch declared. git push and MCP were unaffected.", "label": "skip-changeset applied and confirmed. Verified against scripts/check-empty-changeset.mjs's own enumeration ('It releases nothing (.github/, .claude/, skills/, docs/, content/, examples/, tests-only, and the like)'); the same file separately calls a CI-internal script edit the textbook case for the label. REST label endpoints being 403, the write took the documented fallback: read current set, union, whole-group write, compare read-back, plus the delayed second confirmation that discipline owes. Pre-existing auto labels documentation and size/s survived all three reads; nothing was stripped.", "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
Seat review — ACCEPT (clause ① in-seat at
CONTRACT_REVIEW_TIER;Clause-②: no)PR #14697, head
077c86a4,Fixes #14031. Verified on the branch head, not from the PR body:- The ruling, executed as written, two files and nothing else. In
references/dispatch-runbook.mdthe 3-line stop-condition bullet became the merged 6-line bullet: it keeps its own rule (ask for evidence, not a verdict — the fork is the PM's to judge) and now carries the executability criterion — a fence clause is executable by a one-shot dev only if the action it demands is terminal within the run; "ask first, then continue" presupposes a channel the dev does not have and hands the whole three-way choice (do and report / don't / decide alone) to the executor the author thought they had fenced — plus the two executable rewrite forms with the reason they work (both close within one run). Prose only; the widest-table-row pin stays at 0; no census of existing templates; no sibling rationale deleted (option D refused); no re-wrap. - Line arithmetic, from the gate's own verdict lines: 277 (ceiling 278, headroom 1) → 280 (ceiling 280, headroom 0), net +3. The earlier report sized the bullet at 5 lines; the honest bullet carrying every ruled part measures 668 logical bytes → 6 lines under the gate's own
wrapLine, and the ruling itself adopted 280 — the landed count and the ruled number coincide, nothing padded to reach it and nothing cut to avoid it. The row inscripts/pm/check-skill-line-ratchet.mjsis raised at the landed count with the maintainer's words quoted verbatim and untranslated above it, in the style of the block already there;check:pm-skill-id-lint0 bare ids in the reference. - Reverse verification of the raise: row mutated 280 → 278 on the committed tree ⇒ the gate red with its own line "Raising a ceiling requires a maintainer ruling quoted in the PR"; restore proven by blob hash and an empty
git diff HEAD. - Clause ① PASS: the served model read via
get_sessionequals the constant onmain; the landed text states the ruled criterion and the two forms and nothing beyond them. - CI: every check on
077c86a4green by 19:2xZ (Lint & Repo Gates, Type Check ×4 + rollup, Test Core 6/6 + rollup, the three claim guards, Governed Surface Queue Guard, Check Changeset, Check PR Size, Check Documentation Links).
Landing: governed (
.claude/**+scripts/pm/**) ⇒ PR stays draft; review requested from os-zhuang + hotlong. At merge the seat stripspm:dispatchedand opens the census card the ruling defers until then (existing dispatch templates and skills text scanned for the unexecutable form).
Generated by Claude Code
- The ruling, executed as written, two files and nothing else. In
由
domain:devx执行席(#6023)在收班时立,属换班报告允许产出的三类之一:原则错/缺。⛔ 未定级、未认领。缺陷:一条对非交互 dev 不可执行的指令形态
本席在 #13981 的派发令里写了:
⛔
os-dev无法执行这条指令。 它是一次性的后台子代理:没有通道在中途提问并等待答复。它只有三条路:⇒ 该 dev 选了 (1),并明确写出它无法中途提问、把决定权交回来、附上回退路径 —— 这是三条里最好的一条,⛔ 但它是被一条写坏的指令逼出来的,不该记在 dev 头上。
⭐ 判据:一条指令是否可执行,取决于执行者有没有那个通道
「先报告再动手」只对能阻塞等待答复的执行者有意义(会话型座位、人)。对一次性子代理,它在语义上等价于「不要做」或「你自己看着办」—— 而这两者意思相反。⇒ 写下它的人以为设了一道闸,实际上没设。
可执行的改写(两种,按意图二选一)
⛔ 两者都不含「先问我」。
范围
本卡是指令形态问题,⛔ 不是那次编辑对错的问题 —— 那次编辑经复核判为正确并保留(见 PR #14017 的 ACCEPT)。
复现
读 PR #14017 上 dev 的 open question 原文与本席 ACCEPT 的第一节 —— 双方对该指令不可执行的认定一致。
Generated by Claude Code