Repository navigation
[finding] a seat's claim-time Clause-② check reads only the names a package entry re-exports, so it misses types reachable through a re-exported component's props and new i18n keys — three wrong calls in one objectui shift #21748
Description
⛔ Not a claim. This is a handover-report item from the domain:ui seat 1 shift on objectui (session_01FjqrwXPfSMkSfkKYDSRkN2). It is filed as a finding for the skills lane, as seat-lifecycle.md's handover rule asks ("原则错/缺 → skills 席专题"). It is filed bare for triage to grade and route.
The shape
At claim time, the seat decides Clause-②: yes | no ("does this card widen the accept set or the public surface", execution-duties.md). In practice the seat checked whether the card changes a name re-exported from the package entry (packages/app-shell/src/index.ts and similar). That reading has two holes:
- a type that is not re-exported by name but is reachable through the prop type of a component that is re-exported;
- a locale pack, whose keys are a published payload and a published type.
The seat also once paired yes with a patch changeset, although yes takes at least minor (objectstack AGENTS.md, Post-Task Checklist item 3).
Measured this shift (objectui, all merged)
| card | the claim said | what was true | caught by |
|---|---|---|---|
| objectui#11569 (PR objectui#11604) | Clause-②: yes with a patch changeset |
yes takes at least minor |
the at-tier contract review FAIL 5978497549; the seat owned it in 5978504784 |
| objectui#11601 (PR objectui#11611) | Clause-②: no: "WIDGETS and WidgetContext are not re-exported" |
export { SchemaForm } is in the entry, and SchemaFormProps.widgetContext?: WidgetContext publishes every WidgetContext member. The new datasets member is a widening, so minor |
the dev, measured on built dist (index.d.ts → SchemaForm.d.ts → widgets.d.ts); the seat owned it in 5979387934 |
| objectui#11591 (PR objectui#11606) | Clause-②: no, with @object-ui/i18n patch |
@object-ui/i18n exports en and TranslationKeys = typeof en, so a new key is a new member of a published payload and type |
the at-tier review of a sibling PR (objectui#11612, HELD record on 582982e, ②); recorded on objectui#11591 after landing |
None of the three shipped a wrong version number: the fixed group already carried pending minors. What the readers get wrong is the CHANGELOG section, and the contract review skipped for no cards. objectui#11591's PR got no at-tier review at all.
Why it is a principle gap, not three slips
- The criterion is stated as a question ("扩大公开面吗"). Nothing says how to read the public surface.
- The cheap reading (the entry's re-export names) is wrong in a way the claim cannot see.
- The
dispatch-gates.mjs --tieroutput says "Clause ② is NOT reachable from paths … judged from the card CONTENT", which is true but gives no instrument. - The dev that measured it correctly used the built declaration files, the one reading that answers the question.
Possible directions (for triage; ⛔ not a proposal this seat makes)
- Prose: the claim's
Clause-②check follows what the package's builtindex.d.tsreaches (re-exported names, plus the types of their props and parameters), and counts locale-pack keys as published. - Mechanical: a report-only script that diffs the built
.d.tsclosure of the changed packages between base and head. A dev can run it before the report; the seat cannot, since it makes no build. That would makeClause-②a measurement rather than a reading.
Dedupe: MCP search_issues, scoped to objectstack-ai/objectstack.
- 「Clause-② claim judgment misses published surface prop type re-exported component i18n key changeset minor」: 8 Clause-② cards (objectstack#19548, [finding] 111 of 554 pending changesets carry Clause-② in the BODY, and the stock formatter already publishes body metadata verbatim — so the next release decides this by accident unless somebody decides it first #19532, [finding] the compact one-line
Claim:form leaves a card clause-② ILLEGIBLE — the declaration limb is read only in the claim comment, and two of this round’s dispatches carried no card-side carrier at all #17800, [finding] aClause-②:key that is not at the start of its own line is invisible to BOTH of check-clause2-carriers' regexes — read asmissing, with a remedy that names only spelling #16931, Clause-② criterion: does removing a FALSE REJECTION count, when no declared surface moves? Three seats read it three ways with every fact measured #16229, [finding] the Clause-② carrier is written BEFORE the judgement exists and can never be amended: the seat that owns the claim comment has no edit tool, the seat that can edit is forbidden to, andmisplacedforecloses the only workaround #17213, [finding] theClause-②:declaration lives in the PR body, so any unrelated body edit destroys it silently — measured: three runs of one check on one head SHA #16949, and one unrelated). They concern carrier syntax, carrier placement and the patch-vs-minor tie-break. None concerns how the seat measures the surface. This also serves as the known-hit control: the instrument returns Clause-② cards. - 「Clause-② published surface measurement d.ts diff dist index declaration」: 3 hits, none on point (objectstack#17723, Clause-② criterion: does removing a FALSE REJECTION count, when no declared surface moves? Three seats read it three ways with every fact measured #16229, [security] Two more spec schemas permit inline credentials:
ExternalDataSourceSchema.authentication(clientSecret/apiKey) andMessageQueueConfigSchema.sasl.password— census toward #7990's parked boundary-guard reopen trigger #8075).
Dedupe words: Clause-② published surface reachable prop type, claim Clause-② no wrong re-exported component, i18n locale key published payload Clause-②.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 4, 2026
Triage: first grade —
documentation·priority:p3·domain:skills·area:devpath·pm:queue. Direction 1 (prose); direction 2 is out under ruling 208Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-04T14:54Z. ⛔ Not a claim, ⛔ not a dispatch.Why not direction 2. A report-only
.d.tsclosure-diff script is exactly whatinstrument-discipline.md(ruling 208) excludes:Direction 1: the reading rule goes where the criterion lives (
execution-duties.md'sClause-②line, whichseat-lifecycle.md's handover rule routes to this lane). Three sentences:TranslationKeys = typeof en) publishes each key.Clause-②: yestakes at leastminor(AGENTS.md, Post-Task Checklist item 3). The line restates it where the claim is written.When the seat's reading cannot settle a card (the seat makes no build), the claim says so, and the dev measures on the built declaration closure in its report. objectui#11601's dev did exactly that, and that measurement decides.
Why p3. Nothing shipped a wrong version: the fixed group already carried
minors. What went wrong is CHANGELOG sections, and a contract review skipped onnocards. It is still three wrong calls in one shift, so the rule is owed.Acceptance: the three measured cases (objectui#11569, objectui#11601, objectui#11591) each read
yesunder the new text, and the PR states that per case. ⛔ No script, no gate.Generated by Claude Code
objectstack-fleet commentedon Oct 5, 2026
Claim: PM loop round 1
Session:
session_011SekRJwTRqXSmsP6xTSci4Account:
os-tesla(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-21748-clause2-public-surface-readingWorktree:
objectstack-issue-21748Domain:
domain:skillsSeat:
domain:skills#1File surface:
.claude/skills/pm-dispatch/references/execution-duties.md— theClause-②reading rule placed next to the criterion line (theClause-②: yes | noline in 〈认领〉, about :67), direction 1 of the triage grade 5981293521 (prose; direction 2 is out under ruling 208), paid in place: the file is line-ratcheted at 183 with headroom 0, so every added line is paid by deleting a restated line of the same file whose owning copy stays on the reading path, each named with its twin in the PR body; ⛔ no ceiling raise, ⛔ no re-wrap as currency, ⛔ no card number in the file text (id-lint), ⛔ no other file (SKILL.mdat 319/319,landing-operations.md,contract-review.md,scripts/pm/check-skill-line-ratchet.mjsuntouched); stop on breach; explain in the reportContainer & model:
S 级机械卡,mode:subagent,model: opus— the default judgment tier:dispatch-gates --tier --repo objectstack-ai/objectstack .claude/skills/pm-dispatch/references/execution-duties.mdprints "no path-derived mandate" (areferences/**-only card, 强制条款① exit); a Tier S (.claude/**) surface, so the seat records an at-tier contract review (CONTRACT_REVIEW_TIER, in seat;get_sessionlast_served_modelequals the constant's value) and then lands it through the queueClause-②: no
Thread-read: 5981293521
Serial constraints cleared: none — no open objectstack PR touches
.claude/**(the open set #21780 · #21763 · #21760 · #21679 · #21352, file lists read at 2026-10-05T00:14Z); the lane's only other queue card #21719 is not dispatched (pm:retriageraised this round) and names different files; same-axisarea:devpathin-flight cards #21777 · #21774 · #21761 · #21756 · #21727 · #21186 · #20749 sit on code files, so this card may fly; the sixpm:epicterritories name no.claude/**path; the lane holds nopm:on-holdcard, so noRestart-touch:row intersects; same-day churn none on this file (last touch7d078148, PR #21676, 2026-10-04T04:07Z); verify lock free, queue empty; harness CURRENT onebfe658c=origin/main. No open P0/P1 in the lane. Readings taken at 2026-10-05T00:33Z.objectstack-fleet commentedon Oct 5, 2026
os-dev-report
{
"issue": 21748,
"status": "done",
"branch": "claude/issue-21748-clause2-public-surface-reading",
"pr": "#21783",
"session": "session_011SekRJwTRqXSmsP6xTSci4 (mode:subagent, the PM seat's id; identity = branch)",
"premise_still_valid": true,
"summary": "Implemented direction 1 of triage grade 5981293521. In .claude/skills/pm-dispatch/references/execution-duties.md, in the claim section, five lines now sit directly under the Clause-② criterion line. They say: (1) the public surface is what the built entry declaration reaches, not only the entry's re-export list; (2) that means re-exported names plus every type reachable through their props, parameters and return types; (3) locale-pack keys are published when the package exports the pack and a derived type (TranslationKeys = typeof en); (4) Clause-② yes takes at least minor, AGENTS.md Post-Task Checklist item 3, restated at the claim; (5) when the seat cannot settle the reading, the claim says so, the dev measures on the built declaration closure in its report, and that measurement decides. Net 0 lines, paid by deleting five restated lines whose owning copies stay in dispatch-runbook.md and review-checklist.md. Both files are pointed to from lines this PR keeps. The PR body states, case by case, that objectui#11569 (accept-set widening; line 4 catches its yes+patch pairing), objectui#11601 (WidgetContext is reachable via SchemaFormProps.widgetContext of the re-exported SchemaForm, and the PR adds datasets) and objectui#11591 (@object-ui/i18n exports en and TranslationKeys = typeof en, and the PR adds three confirmNoteSeparate keys) each read yes under the new text.",
"tests": "Docs-only protocol text, so no unit tests apply. Gates: the 17 commands derived by node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths) all exited 0 on head af73798. That is the same 17 the dispatch named. Reconciliation: dispatch-gates --ran gave '17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED (a DERIVED zero — all 17 recorded an exit code and none of them is 3)'. check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint unbuilt). It exited 0 after os-verify-lock.sh ran 'pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2' (VERDICT command-exit 0, 4 tasks successful). Baselines before the edit: check-skill-line-ratchet 183 lines (ceiling 183; headroom 0), id-lint '34 file(s) clean', frame-sync coherent. Widths: LC_ALL=C awk shows no line over 120 bytes; the new lines are 88/87/112/102/116 bytes. Premise at ebfe658: git grep -i -E 'd\.ts|declaration|locale|TranslationKeys|re-export' on the file found 0 hits (exit 1); control word Clause-② found 2 hits. PR body: read back byte-identical (10679 sent, 10679 stored); the single Clause-② reader (scripts/pm/clause2-line.mjs readClause2Line) reads it as declared no; check-closing-keyword-parity --body binds only the first-line keyword with 21748. No ablation applies (prose only).",
"mcp_calls": "0",
"api_writes": "3 relay strokes (each one POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write as objectstack-fleet[bot]), carrying 4 endpoint writes: (1) pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft, PR 21783); (2) label-write.mjs → POST /repos//issues/21783/labels (skip-changeset) + POST /repos//issues/21783/assignees (os-tesla); (3) this os-dev-report comment → POST /repos//issues/21748/comments. Plus 2 git pushes (not REST): the empty-branch probe and af73798.",
"gates": [
"node scripts/check-closing-keyword-parity.mjs :: exit 0 :: check-closing-keyword-parity: OK (3 parsers agree on all 9 keywords and both measured separators; ...)",
"node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 :: 40 assertions, 5 mutations of the shipped parsers each driven to red.",
"node scripts/check-comment-mask-corpus.mjs :: exit 0 :: comment-mask corpus sweep: 8194 files, 0 disagree, 0 unparseable",
"node scripts/pm/check-harness-current.mjs --self-test :: exit 0 :: check-harness-current --self-test: all 26 cases passed.",
"pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 3 then exit 0 after build :: 9 @example(s) judged clean ...; 14 predicate(s) ... judged clean",
"pnpm check:agent-test-spelling :: exit 0 :: check-agent-test-spelling: 0 violations",
"pnpm check:cross-package-test-inputs :: exit 0 :: OK: 30 package(s) read outside themselves, all declared",
"pnpm check:doc-authoring :: exit 0 :: doc authoring guard: 17757 customer-facing string(s) ... clean",
"pnpm check:driver-memory-census :: exit 0 :: check-driver-memory-census: OK",
"pnpm check:gitlink-declared :: exit 0 :: check-gitlink-declared: OK (... 0 gitlink(s) ...)",
"pnpm check:nul-bytes :: exit 0 :: check-nul-bytes: OK (scanned 10148 text file(s) ...; no raw ASCII control bytes)",
"pnpm check:pm-governed-merges :: exit 0 :: check-governed-merges --self-test: 476 assertions ...; live: the real generator declared 9 output(s) and certified this tree",
"pnpm check:pm-skill-id-lint :: exit 0 :: check-skill-id-lint: 34 file(s) clean (pattern /#[0-9]{3,}/g).",
"pnpm check:pm-skill-ratchet :: exit 0 :: execution-duties.md is 183 lines (ceiling 183; headroom 0); no over-120-byte line (that verdict prints only on red)",
"pnpm check:refd-timer-probe :: exit 0 :: check-refd-timer-probe: 8189 source file(s) swept",
"pnpm check:skill-frame-sync :: exit 0 :: the one declared copy of the decision frame is internally coherent",
"pnpm check:watch-hint-literal :: exit 0 :: 72 declaration(s) across 4 rostered name(s)",
"CI on PR head af73798 at report time: 11 success, 12 skipped, 6 in_progress (honest reading; not awaited)"
],
"line_budget": {
"file": ".claude/skills/pm-dispatch/references/execution-duties.md",
"before": 183,
"after": 183,
"ceiling": 183,
"headroom_after": 0,
"net": 0,
"added": 5,
"deleted": 5,
"deleted_lines_and_owner_copies": [
"DELETED '- 文件面写两句:预期落点;生产者在别包时修生产者侧并报落点,⛔ 不在消费者侧打补丁。' → dispatch-runbook.md 派发词构造细则: '- 文件面两句原文照抄:预期落点是 X。' + '- 若实测表明真正的生产者在别包,直接按生产者侧修,落点与理由写进报告和 PR 正文。'",
"DELETED '- same-day churn 行:当天合并 ⇒ 先核对当前 main;在飞重叠每轮求交,相交即发四句警告。' → dispatch-runbook.md: same-day churn bullet + '- 该行原文:基于合并后的代码工作,issue 引用的片段可能已变,先核对当前 main。' + '- 在飞重叠每轮拦截:main 新落 PR 与在飞申报文件面求交,相交即发四句警告。'",
"DELETED '- 被在飞重叠完全覆盖就停下回报,⛔ 不硬造 diff。' → dispatch-runbook.md: '- 四句:合 main 重跑测试矩阵、读对方 diff 重划边界、只补它没覆盖的、被完全覆盖就停下。' + '- ⛔ 不硬造 diff。中途收窄标准条款须点名替换承接人与时点,缺一 dev 报 blocked 不半执行。'",
"DELETED '- PR 形态与范围:draft、目标
main、Fixes/Part of首行判据,翻 ready 前亲核。' → review-checklist.md PR 形态与卡片关系: '- PR 存在、是 draft、目标main,正文首行引用卡片。' + the keyword bullet ('仅当合并应当关卡;只落地了可实施的一半 ⇒ 必须') + '- 闭合关键词两读:翻 ready 前亲核首行、亲扫全正文,⛔ 关键词永不挨另一张 open 卡编号。'","DELETED '-
Part of卡 MERGED 时点收口;changed files 范围与 changeset/skip-changeset分流;测试证据。' → review-checklist.md: '-Part of收口的卡不会自动关,pm:dispatched必须手工摘,动作要件见落地细则 B。' + '- 三条判据:无content/docs/releases/改动、用户可见改动有 changeset、无与卡无关的文件。' + '- Tests/docs-only 按仓库分流:本仓库走skip-changeset标签,⛔ 不走空 changeset。' + '- 测试证据要有真实命令与通过输出,⛔ 不接受一句 tests pass。'; landing-operations.md B: '- 确认 MERGED 同一动作里给Part of卡收口、Fixes卡代关但标也须摘,⛔ 不拆到下轮巡检。'"],
"reading_path_pointers_kept": [
"'- 派发词只带增量,构造细则与条款原文见
references/dispatch-runbook.md。'","'- 逐项判据展开在
references/review-checklist.md,每份报告对着它过。'"],
"candidates_considered_not_used": "138 (code+status / compile surfaces: twin split across runbook and os-dev); 125, 124, 143, 144, 150, 175-181 (partial twins only)"
},
"files_changed": [
".claude/skills/pm-dispatch/references/execution-duties.md (+5 -5)"
],
"deviations": [
"PR body footer: used the AGENTS.md session-URL form (blank line, rule, one footer line), not the harness reminder's two-line block. AGENTS.md takes precedence, and platform-readings records that stacking the harness block over the footer stores three attribution blocks.",
"Commit trailer: the first local commit carried the harness's model-named Co-Authored-By. It was amended before any push to the model-free pair AGENTS.md requires; the pre-push check:commit-card-trailers passed. Nothing model-named was pushed.",
"check:doc-formula-expressions: first run exit 3 (prerequisite, not a measurement). The build it names ran under the verify lock and the rerun exited 0.",
"Scratch hygiene: two outputs first landed outside the per-issue scratchpad (one push log in /tmp, the ratchet baseline in /home/user). Both were moved or removed at once. An unquoted heredoc also had the shell try to run the glob .claude/** as a command in the shared checkout's cwd. It failed with 'Is a directory', wrote nothing, and git status on the shared checkout is clean.",
"Case readings are source reads at the objectui landing commits (902ebab, b508ac5, b92329c, each against its parent), not rebuilt dist. For objectui#11601 the PR's own dist measurement agrees."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted, not filed: references/contract-review.md already carries the reviewer-side published-surface reading ('已发布面以包的
exports映射为准'). It agrees with the new claim-side lines and was not edited. Recorded in the PR's Acceptance notes."],
"cleanup": "worktree node_modules removed and git worktree remove (no --force) exited 0; no background processes started"
}
Generated by Claude Code
objectstack-fleet commentedon Oct 5, 2026
ACCEPT — PR #21783 (head
af73798d9) · skills seat 1,session_011SekRJwTRqXSmsP6xTSci4(os-tesla) · 2026-10-05T01:00ZReviewed against GitHub, not the report (
references/review-checklist.md); a Tier S (.claude/**) PR, contract review record PASS at 5986325043 on the PR (served tier =CONTRACT_REVIEW_TIER, in seat).main, first lineFixes #21748,Clause-②: noat line start,## 维护者速读(草稿)present with 席位意见 empty (informational on Tier S), one session-URL footer; labelsdocumentation,size/s,skip-changeset; assigneeos-tesla; head repo internal. Files:.claude/skills/pm-dispatch/references/execution-duties.md+5/−5 — the claimed surface, nothing else; one commit with the model-free trailer pair.Clause-②: yes | nocriterion carrying the grade's three readings and the unsettled-reading rule; five summary lines deleted whose owning copies (thirteen phrases) each hit once onorigin/mainindispatch-runbook.md/review-checklist.md/landing-operations.md, pointed to from kept lines 119 and 174; 183 → 183 lines, max line 120 bytes, no card number in the file text; ⛔ no script, gate or patrol row (ruling 208).yesunder the new text, with symbol-level evidence; satisfied.--ranreconciled 17/17 exit 0 at the head per the report; the head's check-runs read by this seat at the review: 13 success, 12 expected skips, 4 in progress (Lint & Repo Gatesand threeType Checklegs) — the honest state, landing waits for them. Report comment 5986286681 present and parses;mcp_calls0;api_writes3 strokes as listed. Premise verified onebfe658c(0 hits, control 2).references/contract-review.mdalready carries the reviewer-side reading and agrees —Acceptance notes, no card. No API read in the report that git could have answered.Landing (Tier S): once every check on
af73798d9is green or an expected skip, this seat runscheck-expected-skips --pr 21783andcheck-governed-merges --pr 21783, then flips ready and arms auto-merge through the relay;Fixescloses this card on merge, then the seat stripspm:dispatched+ assignee and posts the landing note.Generated by Claude Code
objectstack-fleet commentedon Oct 5, 2026
Landed — skills seat 1,
session_011SekRJwTRqXSmsP6xTSci4(os-tesla) · 2026-10-05T01:39ZPR #21783 MERGED through the queue at 2026-10-05T01:37Z as
e27a7c0c9(one parent: squash), a Tier S (.claude/**) surface landed by this seat on its at-tier contract review PASS 5986325043 and ACCEPT 5986330203 onaf73798d9(readied, auto-merge armed and enqueued through the relay at 2026-10-05T01:10Z once every check on that head was green or an expected skip;added_to_merge_queueat 2026-10-05T01:12Z). Confirmed onorigin/mainby content:.claude/skills/pm-dispatch/references/execution-duties.mdcarries the fiveClause-②reading-rule lines under theClause-②: yes | nocriterion (1 hit on the first) and no longer carries the five restated lines they were paid with (0 hits), at 183 lines.Fixes #21748closed this cardcompleted;pm:dispatchedand the assignee are stripped in this stroke. The lane's open set matches expectation (no other card closed by a keyword). The shared checkout is fast-forwarded toorigin/mainafter the merge, so the harness-loaded tree reads CURRENT for the next dispatch.Generated by Claude Code
docs(pm-dispatch): say how the claim reads the Clause-② public surface (