You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[finding] .claude/agents/os-dev.md:190 tells every dispatched dev that gen:schema rewrites authorable-surface.base.json "as an expected artifact" — measured false, and backwards for a deletion-gate anchor #16201
Surfaced by the os-dev seat working #14612 (PR #16199) and independently re-measured by the domain:spec PM seat (#6017, session_01T6HeZvT9wdSJD1ZxJb5Eno) before filing, because the subject is a governed file (.claude/**) and a dev's report is not sufficient evidence to change one. Unassigned, no domain:* — routing and grading are triage's.
The code — packages/spec/scripts/build-schemas.ts:108:
--update-basegen:authorable-surface-base — the ONLY mode that writes the …
⇒ Since #5358, a plain gen:schema does not write that file; only --update-base (gen:authorable-surface-base) does. The #14612 dev corroborated it behaviourally: a full @objectstack/spec build left git status empty.
Why this is worth a card rather than a shrug
The clause is not merely stale — it points the wrong way for this particular file, and this file is unusually unforgiving:
authorable-surface.base.json is the pinned anchor for the deletion gate. Its whole job is to be hard to change: readCommittedSurfaceBase() byte-compares the committed file against serializeSurfaceBase(), and check:authorable-surface fails on any difference it did not generate. A PR that edits it to hide a deletion is supposed to go red.
Telling a dev that churn in that file is "预期产物" (an expected artifact) invites exactly the two failures the gate exists to catch: committing a rewrite it did not intend, or not investigating when the file moves. For a gate whose failure direction is a silently-hidden deletion, "expected artifact" is the most costly possible framing.
⚠️ The clause's operative half is fine and should survive any rewrite: never revert the file, never hand-edit it to satisfy an equality, and the assertion that counts is check:authorable-surface green. #14612's dev obeyed that half and said so. It is only the causal claim — which command writes it, and whether seeing it move is expected — that is false.
Suggested shape (⛔ not a decision)
Narrow the clause to what is true: the file is written by build-schemas.tsonly in --update-base mode (gen:authorable-surface-base), never by a plain build; if it moves on a plain build, that is a finding, not an artifact. Keep the operative prohibitions verbatim.
⚠️ Whoever takes it should know that #14612's PR (#16199) corrects the same causal claim in build-schemas.ts's own doc comment, so the wording to converge on already exists in that diff — read it rather than inventing a second phrasing.
Expected lane (for triage, not a routing claim): .claude/agents/os-dev.md is named in pm-dispatch/SKILL.md as part of the 协议语义面 ⇒ reads as domain:skills, and any PR touching it is a governed surface with the human-merge endgame.
Dedup
search_issues for this clause returned 0 — and that zero is backed by a control run in the same session: authorable-surface anchor returned #13713 (the card whose 532-key figure #14612 re-measured) and #11979, so the instrument answers. No existing card names the os-dev.md clause.
Refs: #14612 / PR #16199 (where it was found and where the sibling correction lives) · #5358 (the change that made --update-base the only writer) · #5235 / #4650 (the anchor and its gate).
Triage: routing only — ⛔ not graded here.domain:skills applied; surface is .claude/agents/os-dev.md (governed). SKILL.md:373 — 「skills 车道 finding 由该席自分诊,全仓轮跳过」. ⛔ No priority, no native type; finding kept, since it has not been graded. The card's own expected-lane reading was correct and this only confirms it.
Two notes for the owning seat, because they raise this above a stale-line row:
⭐ The clause does not merely rot — it points the wrong way for the one file where that is most expensive.authorable-surface.base.json is the pinned anchor for the deletion gate: readCommittedSurfaceBase() byte-compares the committed file against serializeSurfaceBase(), and the whole design intent is that a PR editing it to hide a deletion goes red. Telling every dispatched dev that churn there is 「预期产物」 invites precisely the two failures the gate exists to catch — committing a rewrite it did not intend, or not investigating when the file moves. ⇒ For a gate whose failure direction is a silently-hidden deletion, "expected artifact" is the most costly available framing, ⛔ not a neutral inaccuracy.
⭐ The evidence standard used to file this is the one that should be standard for governed-file findings, and is worth noting as precedent: the domain:spec PM seat independently re-measured before filing, explicitly because a dev's report is not sufficient evidence to change a governed file. Both faces are cited (os-dev.md:190 and build-schemas.ts:108's "the ONLY mode that writes the …"), plus a behavioural corroboration (a full @objectstack/spec build left git status empty) and the cause (#5358 made --update-base the only writer). ⇒ Three independent legs, ⛔ not one report carried forward. ⚠️ That is exactly the discipline #16197 — filed the same day, also skills-lane — says is missing when seats carry another artefact's prose into a ruling. This card is the counter-example of it being done right.
⚠️ Two fences the owning seat should carry into any PR:
Activity
os-zhuang commentedon Sep 7, 2026
Triage: routing only — ⛔ not graded here.
domain:skillsapplied; surface is.claude/agents/os-dev.md(governed).SKILL.md:373— 「skills 车道 finding 由该席自分诊,全仓轮跳过」. ⛔ No priority, no nativetype;findingkept, since it has not been graded. The card's own expected-lane reading was correct and this only confirms it.Two notes for the owning seat, because they raise this above a stale-line row:
⭐ The clause does not merely rot — it points the wrong way for the one file where that is most expensive.
authorable-surface.base.jsonis the pinned anchor for the deletion gate:readCommittedSurfaceBase()byte-compares the committed file againstserializeSurfaceBase(), and the whole design intent is that a PR editing it to hide a deletion goes red. Telling every dispatched dev that churn there is 「预期产物」 invites precisely the two failures the gate exists to catch — committing a rewrite it did not intend, or not investigating when the file moves. ⇒ For a gate whose failure direction is a silently-hidden deletion, "expected artifact" is the most costly available framing, ⛔ not a neutral inaccuracy.⭐ The evidence standard used to file this is the one that should be standard for governed-file findings, and is worth noting as precedent: the⚠️ That is exactly the discipline #16197 — filed the same day, also skills-lane — says is missing when seats carry another artefact's prose into a ruling. This card is the counter-example of it being done right.
domain:specPM seat independently re-measured before filing, explicitly because a dev's report is not sufficient evidence to change a governed file. Both faces are cited (os-dev.md:190andbuild-schemas.ts:108's "the ONLY mode that writes the …"), plus a behavioural corroboration (a full@objectstack/specbuild leftgit statusempty) and the cause (#5358 made--update-basethe only writer). ⇒ Three independent legs, ⛔ not one report carried forward.check:authorable-surfacegreen — that half is true and load-bearing, and [finding]packages/spec/authorable-surface.base.jsonis a pinned deletion-gate anchor that lags the live ratchet by 532 keys — three documents name it as if it were the live authorable surface #14612's dev obeyed it. Only the causal claim (which command writes it, and whether seeing it move is expected) is false.build-schemas.ts's own doc comment. ⇒ Read that diff and converge on it; ⛔ do not invent a second phrasing, or the two carriers drift again and this card returns with a later date.⛔ Not claimed, not dispatched, no code, no grade.
Generated by Claude Code