Repository navigation
docs(agents): os-dev.md — the Clause-② copy line is conditional on the claim carrying one - #19305
Merged
os-steve merged 1 commit intoSep 20, 2026
Conversation
…e claim carrying one The line told every dispatched dev, unconditionally, to copy the claim's `Clause-②:` line into the PR body. Both halves are conditional: a claim may carry no such line (the clause-② flow is the objectstack dual-carrier mechanism; objectui's own gate states it has no `check-clause2-carriers.mjs` reader), and a dev following the unconditional wording either spends a step on a non-existent obligation or, worse, invents the line — which the body reader would then believe. The rewrite conditions the obligation on the claim itself (true in both repositories without naming either), keeps the `Check Changeset` reads-the-body rationale, and names the negative branch: no line ⇒ zero write, never fabricate. The dropped "carry it on the PR-open write" clause restates the body-written-once rule already at :56. Net 0 lines on a zero-slack file (403 / 403); the rewritten line sits at the 120-byte cap. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ETYWqMQD4qMtZzAGovWNi
Collaborator
Author
Contract reviewServed-tier: ① Derived judgments
② Semver levelNone — ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
os-steve
marked this pull request as ready for review
September 20, 2026 11:08
os-steve
enabled auto-merge
September 20, 2026 11:09
os-steve
deleted the
claude/issue-19096-clause2-copy-line-repo-conditional
branch
September 20, 2026 11:34
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #19096
Clause-②: no
What changed
One line of
.claude/agents/os-dev.md(:279), rewritten in place. Net 0 lines (403 / 403, headroom 0); the new line is exactly 120 bytes, the file'sMAX_LINE_BYTEScap. No other line of the file moved.Before (
4efb988, verbatim):After (
fba3bb3, verbatim):Why
The old line told every dispatched dev, unconditionally, to copy the claim's
Clause-②:line into the PR body. Both halves are conditional and the file said so nowhere: a claim may carry no such line (the clause-② flow is the objectstack dual-carrier mechanism), and the reader the rationale names does not exist in objectui. A dev following the unconditional wording either spends a step on a non-existent obligation or, worse, invents the line, andCheck Changesetreads the body, so an invented declaration would be believed.The shape is the one the card's triage grading points at (an unconditional clause takes its condition, as :68's landing-repo precedent does) with the PM's pick between the three named shapes: condition on the claim, not the repository, and name the reader once, so the line stays true in both repositories without naming either. Evidence that the claim, not the repo, is the right condition:
scripts/pm/check-clause2-carriers.mjs's own fixtures (:9306–9320 at4efb988) hold objectui claims that carry aClause-②:line (the objectui 7804 rows, the later objectui 7696 row) and one that carries none (the first objectui 7696 row). A repo-conditional line would be false in both directions on that board; a claim-conditional line is true on every row.The dropped clause 「开 PR 那一笔就带上」 restates :56 (「PR 正文 dev 只写一次,在开 PR 那一笔,⛔ 不
PATCH」), so removing it loses no rule; that is how the added negative branch (「无则零写,⛔ 不自造」) is paid for inside the same 120-byte line. No line elsewhere was retired.Premise re-verified on the base (
4efb988,origin/mainat branch time)Clause-②occurs exactly once in the file (grep -c→ 1);wc -l→ 403.scripts/pm/check-clause2-carriers.mjs(header: 「the dual carrier is asserted by mechanism」, 「the claim comment SELECTED as the carrier」). objectui has none, in its own words:scripts/check-governed-queue-guard.mjs:187 「scripts/pm/check-clause2-carriers.mjs, and this repository has no such file」 and :1959 「check-clause2-carriers.mjsto defer the verdict question」, read at objectuiorigin/main0c2eb5e. Controls on the same tree:ls scripts | wc -l→ 124;git ls-tree --name-only -r origin/main | grep -ci clause2→ 0.scripts/pm/check-skill-line-ratchet.mjs(CEILINGSrow['.claude/agents/os-dev.md', 403],MAX_LINE_BYTES = 120); 14 lines of the file already sit at exactly 120 bytes, none over. The :68 precedent for a one-line repo-conditional clause is 119 bytes.check:pm-skill-id-lintscans this file with/#[0-9]{3,}/; the new line has 0 hits.Gates (union run on head
fba3bb3; every exit captured before any pipe)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackwith no paths (changed set from the merge-base) printed 19 commands, identical to the dispatch-time list. All 19 ran and exited 0:node scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/pm/check-governed-queue-guard.mjs --self-testnode scripts/pm/check-harness-current.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:agent-model-declaredpnpm check:agent-test-spellingpnpm check:commit-card-trailerspnpm check:cross-package-test-inputspnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:pm-skill-id-lintpnpm check:pm-skill-ratchetpnpm check:refd-timer-probepnpm check:skill-frame-syncpnpm check:watch-hint-literalReconciliation:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran FILE(one line per command asCOMMAND :: exit CODE) → 「19 derived famil(ies) accounted for — 19 run, 0 NOT-MEASURED (a DERIVED zero — all 19 recorded an exit code and none of them is 3)」.Note on row 6: the first run exited 3 (PREREQUISITE NOT MET:
@objectstack/formulaand@objectstack/lintunbuilt; the gate says 「Nothing was measured」). Not a measurement. Afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock (VERDICT command-exit 0) the gate ran and exited 0.Push-time hook on the one commit: 「check:commit-card-trailers: 1 commit message(s) on this push carry no card relation and no model identifier in the trailer pair」.
Not run locally, CI-owned:
pnpm lint(repo-wide eslint). The diff touches one Markdown file under.claude/, no lintable source, so there is no narrowing to declare. Byte hygiene:grep -naPfor control bytes over the file → 0.Tier the landing guard will read
node scripts/pm/check-governed-merges.mjs --test .claude/agents/os-dev.md→ 「GOVERNED — Tier S(席内达档复核落地)」,.claude/**×1 (exit 3, the governed code). This PR stays draft; the owning seat's in-seat contract-tier review record lands it. No changeset:.claude/**publishes nothing (skip-changeset).Acceptance notes
Clause-②:line (:9306–9320); evidence for the chosen shape, not a defect. Bearer: the skills seat reviewing this PR.dispatch-gates.mjsrefuses--commandstogether with--ran(exit 2, clear message); the reconciliation is a second invocation with--ranalone. Bearer: none.维护者速读(草稿)
改了什么:os-dev 开发 agent 定义文件里的一行指令改成条件式:认领评论带
Clause-②:行才照抄进 PR 正文行首;没有就不写、⛔ 不自己编一行。只改这一行,净行数 0(403 / 403),行宽恰在 120 字节上限。为什么改:原句是无条件的。objectui 卡的认领评论常常不带这一行,那边也没有读这行的门禁;dev 照做会扑空,更坏的是自己编一行——而 objectstack 这边的
Check Changeset恰恰读正文不读卡,会把编造出来的声明当真。按「认领有没有这一行」取条件,两个仓都成立,且不用点名任何仓;载体检查器自己的 fixture 里 objectui 认领有带的也有不带的,说明按仓取条件在两个方向上都会出错。风险与代价(含回滚):一行改动、无生成物、无 changeset、19 个派生门禁全绿。措辞更紧凑但读者名与理由都保留;去掉的「开 PR 那一笔就带上」已由第 56 行「正文只写一次」覆盖。回滚 = revert 这一个 commit。
席位意见:
你要做的:本 PR 属 Tier S(
.claude/**),由 skills 席在席内达档复核后经队列落地,不需要你点击。若你不认同「按认领取条件」这个形状(另两种:按落地仓取条件、点名双载体的归属车道),在卡上留一句即可。Generated by Claude Code