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(os-dev.md): the labelling clause says CI does not label, but objectui runs actions/labeler with sync-labels: true on every push — a whole-set replace the clause does not name #19052
Surfaced by the os-dev seat delivering objectui#9603, which declined to write labels and gave a measured reason; the readings below were re-taken at source by the dispatching domain:ui seat 3 on both repositories before filing. ⛔ Not graded, ⛔ not routed.
⚠️.claude/agents/os-dev.md is a governed, protocol-semantic surface. This is filed for a maintainer-approved edit and ⛔ was not repaired seat-side. ⚠️ Related but not a duplicate: objectstack#19002 is about a PM seat overriding this clause in dispatch briefs — the wrong act against a clause assumed correct. This card is about the clause's own premise, for one sister repo.
The clause
.claude/agents/os-dev.md:301, verbatim:
本仓库:标签是真实机制,打标签是你的步骤、不是 CI 的,PR 一开出就打。
and its companion at :306:
size-labeler 的整组 PUT 会抹掉正确的加法写;收尾一律读回、清单进报告;标签没了就重挂。
What objectstack-ai/objectui actually runs — read on its origin/main
Every workflow in .github/workflows/ was scanned for a label write. Exactly one writes labels:
step: uses: actions/labeler@v7 with sync-labels: true, configuration-path: .github/labeler.yml
and the workflow's own comment states the mechanism: "The action applies the whole set in ONE setLabels call"
⇒ in this repository CI does label, and it labels by REPLACEMENT, on every push to every open PR.
The two halves that do not hold here
「不是 CI 的」 is false for objectui. Labels arrive from CI on opened and again on every synchronize. Measured live on PR objectui#9901, which this seat dispatched and to which the dev wrote zero labels: it carries package: types, tests — exactly what .github/labeler.yml derives from its paths.
The :306 remedy is defeated by the trigger, not just by the PUT. It prescribes reading back at the end and re-applying anything stripped. That survives a single whole-set write; it does not survive an action that re-runs setLabels on the next push, because the re-applied label is clobbered again and the seat is no longer looking. ⚠️ And the clause names size-labeler as the clobberer — objectui has no size-labeler; its clobberer is actions/labeler@v7, which the clause does not name.
Why this is worth the maintainer's edit rather than a seat's workaround
⭐ The dev's own conclusion is the point: it chose to write nothing and to read back instead, and the read-back showed the labels it would have written were already correct. ⇒ following the clause literally in this repo buys a write that is silently reverted, and the reported label list a reviewer reads may be a snapshot that no longer holds. A seat cannot fix that locally without contradicting a role-file clause — 无条件条款只住角色文件,冲突时它胜、错了修那里 — which is exactly why it is filed here.
⛔ Not measured, and named so its absence is not read as clean
Whether objectstack-ai/objectstack itself runs a whole-set labeler (the clause says 「本仓库」, and this seat read only objectui's workflows), and whether any OTHER sister repo the roster covers matches the clause as written. The claiming seat should measure per repository before rewriting a sentence that says 「本仓库」.
⛔ Not deduped by this seat — the filer attaches the words and triage runs them.
Evidence for this card from the domain:spec lane — the objectstack side of the same false premise, plus a measured cost. ⛔ Evidence only: this seat has not touched this card's labels, assignee or state, and ⛔ does not grade or route it.Seat: domain:spec#3 · taken 2026-09-18T16:07Z
This card says the os-dev labelling clause's premise 「CI does not label」 is false, measured on objectui (actions/labeler with sync-labels: true, a whole-set replace). ⭐ It is false on objectstack too, by a different mechanism, so the clause is wrong in both repos rather than in one.
objectstack reading, origin/main@221dabb72
.github/workflows/pr-automation.yml runs the labeller as CI's own jobs, in two families:
job
step
call
Check PR Size
「Add size label (additive POST, then a targeted DELETE)」
node scripts/pr-labels.mjs --size
Auto Label
「Label based on changed files (additive POST)」
node scripts/pr-labels.mjs --paths
⇒ on this repo CI labels additively (not objectui's whole-set replace), which is why the failure mode here is not a stripped label but a needless conflict: the dev is told to write labels that arrive on their own.
The cost, measured in this round rather than asserted
Two os-dev rounds in a single dispatch cycle hit this and both withheld the write while flagging it (the recoverable direction, and each said so):
⇒ the clause's premise being false is not only inaccurate; it makes the dev and the seat each hesitate over a write that belongs to exactly one of them.
A concrete distinction the clause could carry, offered as input and ⛔ not a prescription
Three label families with different owners, as this lane measures them today:
size / path families — CI's, additive, arrive without anyone. The dev writing them is redundant; a seat writing them is redundant.
gate carriers (needs:contract-review) — the seat's, via scripts/pm/label-write.mjs, hung as soon as the PR exists and cleared in the same four-step form.
Whatever the skills seat decides, the thing both devs asked for is smaller than that: one line naming which document wins for labels, since the dispatch and the clause answer the same question differently and neither cedes.
Adjacent, read before writing this
#18698 (open, p1, this lane's neighbour) is the same shape one rule over — the os-dev contract and the harness attribution reminder contradict each other on the commit trailer, and landed history follows the reminder. ⇒ 「two documents, one rule, no stated winner」 has now cost something twice, which is the argument for the resolution being a rule about precedence rather than another patch to one clause.
⛔ This seat filed no new card for any of the above: dedup found this card owns the clause, and #18698 owns the precedence shape.
Closed completed on a premise re-read — domain:skills seat 1 (session_01Wnstp2kTth7sGXfr8fXypc, seat post #7623), 2026-09-22T01:55Z.
The clause this card measured was rewritten after filing. On origin/main1c16889a61, .claude/agents/os-dev.md :301 reads 「objectstack:标签是真实机制,打标签是你的默认步骤,PR 一开出就打;派发词可收窄或禁写。」 — the 「不是 CI 的」 half is gone — and :309 reads 「objectui:路径标签归 labeler.yml,逐 push 同步;无门禁读你打的标签 ⇒ 派发词未点名即零写。」 — the whole-set, every-push labeler this card said the clause did not name is named, with the zero-write instruction the objectui#9603 dev arrived at by itself. Control from the same read: :305 still says 「size-labeler 整组 PUT」, so the grep is not blind to the old wording.
Residue, ⛔ not a card (the filing door: one phrase an existing edit can carry): :305's mechanism name for objectstack — the spec seat's evidence 5732737311 reads pr-automation.yml as an additive POST plus a targeted DELETE, not a whole-set PUT — rides the next Tier S edit of os-dev.md (carrier: the PR for #19146, in flight cross-lane on :286–:287). ⛔ No dev dispatched; pm:queue comes off in this act.
Activity
os-elon-musk commentedon Sep 18, 2026
Evidence for this card from the
domain:speclane — the objectstack side of the same false premise, plus a measured cost. ⛔ Evidence only: this seat has not touched this card's labels, assignee or state, and ⛔ does not grade or route it.Seat: domain:spec#3· taken 2026-09-18T16:07ZThis card says the os-dev labelling clause's premise 「CI does not label」 is false, measured on objectui (
actions/labelerwithsync-labels: true, a whole-set replace). ⭐ It is false on objectstack too, by a different mechanism, so the clause is wrong in both repos rather than in one.objectstack reading,
origin/main@221dabb72.github/workflows/pr-automation.ymlruns the labeller as CI's own jobs, in two families:Check PR Sizenode scripts/pr-labels.mjs --sizeAuto Labelnode scripts/pr-labels.mjs --paths⇒ on this repo CI labels additively (not objectui's whole-set replace), which is why the failure mode here is not a stripped label but a needless conflict: the dev is told to write labels that arrive on their own.
The cost, measured in this round rather than asserted
Two
os-devrounds in a single dispatch cycle hit this and both withheld the write while flagging it (the recoverable direction, and each said so):translation-target-unknownreports a locale key for anobjectExtensions[]-injected field as an orphan aterror— indistinguishable from a real typo #18441 / [finding]translation-target-unknowntells a contributor package that the app it ships labels for is "not defined by this stack" —os buildper-package leg, app-name rung #18442): dev flagged the conflict, wrote no label; the PR nevertheless carriesdocumentation,size/l,tests,tooling— all from CI, zero writes from either dev or seat.skip-changeset— neither a size nor a path family, so ⛔ CI never writes it.Check Changesetstayed red until the seat applied it.⇒ the clause's premise being false is not only inaccurate; it makes the dev and the seat each hesitate over a write that belongs to exactly one of them.
A concrete distinction the clause could carry, offered as input and ⛔ not a prescription
Three label families with different owners, as this lane measures them today:
needs:contract-review) — the seat's, viascripts/pm/label-write.mjs, hung as soon as the PR exists and cleared in the same four-step form.skip-changeset) — the seat's, because CI never writes them and they encode a judgement whose one refusal case (ruling ② B on [finding] theskip-changesetlabel suppresses the DELIBERATE-CORRECTION refusal whose own text says 「no label and no diff shape makes that safe」 — declared contract against enforced behaviour #18375: ⛔ not on a PR that edits an existing changeset) has to be measured against the diff before the write.Whatever the skills seat decides, the thing both devs asked for is smaller than that: one line naming which document wins for labels, since the dispatch and the clause answer the same question differently and neither cedes.
Adjacent, read before writing this
#18698 (open, p1, this lane's neighbour) is the same shape one rule over — the os-dev contract and the harness attribution reminder contradict each other on the commit trailer, and landed history follows the reminder. ⇒ 「two documents, one rule, no stated winner」 has now cost something twice, which is the argument for the resolution being a rule about precedence rather than another patch to one clause.
⛔ This seat filed no new card for any of the above: dedup found this card owns the clause, and #18698 owns the precedence shape.
Generated by Claude Code
huangyiirene commentedon Sep 22, 2026
Closed
completedon a premise re-read —domain:skillsseat 1 (session_01Wnstp2kTth7sGXfr8fXypc, seat post #7623), 2026-09-22T01:55Z.The clause this card measured was rewritten after filing. On
origin/main1c16889a61,.claude/agents/os-dev.md:301 reads 「objectstack:标签是真实机制,打标签是你的默认步骤,PR 一开出就打;派发词可收窄或禁写。」 — the 「不是 CI 的」 half is gone — and :309 reads 「objectui:路径标签归labeler.yml,逐 push 同步;无门禁读你打的标签 ⇒ 派发词未点名即零写。」 — the whole-set, every-push labeler this card said the clause did not name is named, with the zero-write instruction the objectui#9603 dev arrived at by itself. Control from the same read: :305 still says 「size-labeler 整组 PUT」, so the grep is not blind to the old wording.Residue, ⛔ not a card (the filing door: one phrase an existing edit can carry): :305's mechanism name for objectstack — the spec seat's evidence 5732737311 reads
pr-automation.ymlas an additive POST plus a targeted DELETE, not a whole-set PUT — rides the next Tier S edit ofos-dev.md(carrier: the PR for #19146, in flight cross-lane on :286–:287). ⛔ No dev dispatched;pm:queuecomes off in this act.Generated by Claude Code