Skip to content

[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

@objectstack-fleet

⛔ 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 --tier output 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)

  1. Prose: the claim's Clause-② check follows what the package's built index.d.ts reaches (re-exported names, plus the types of their props and parameters), and counts locale-pack keys as published.
  2. Mechanical: a report-only script that diffs the built .d.ts closure 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 make Clause-② a measurement rather than a reading.

Dedupe: MCP search_issues, scoped to objectstack-ai/objectstack.

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

  1. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — documentation · priority:p3 · domain:skills · area:devpath · pm:queue. Direction 1 (prose); direction 2 is out under ruling 208

    Triage 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.ts closure-diff script is exactly what instrument-discipline.md (ruling 208) excludes:

    • 「只报告的仪器不配 dev:⛔ 不立卡、不派 dev、不开 PR」;
    • a new gate or ratchet needs the maintainer's words on the card.

    Direction 1: the reading rule goes where the criterion lives (execution-duties.md's Clause-② line, which seat-lifecycle.md's handover rule routes to this lane). Three sentences:

    1. The public surface is what the package's built entry declaration reaches. That means the re-exported names, plus every type reachable through their props, parameters and return types. Not only the entry's re-export list.
    2. A locale pack's keys are published. A package that exports its pack and a type derived from it (TranslationKeys = typeof en) publishes each key.
    3. Clause-②: yes takes at least minor (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 on no cards. 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 yes under the new text, and the PR states that per case. ⛔ No script, no gate.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_011SekRJwTRqXSmsP6xTSci4
    Account: os-tesla (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-21748-clause2-public-surface-reading
    Worktree: objectstack-issue-21748
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/skills/pm-dispatch/references/execution-duties.md — the Clause-② reading rule placed next to the criterion line (the Clause-②: yes | no line 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.md at 319/319, landing-operations.md, contract-review.md, scripts/pm/check-skill-line-ratchet.mjs untouched); stop on breach; explain in the report
    Container & model: S 级机械卡, mode:subagent, model: opus — the default judgment tier: dispatch-gates --tier --repo objectstack-ai/objectstack .claude/skills/pm-dispatch/references/execution-duties.md prints "no path-derived mandate" (a references/**-only card, 强制条款① exit); a Tier S (.claude/**) surface, so the seat records an at-tier contract review (CONTRACT_REVIEW_TIER, in seat; get_session last_served_model equals the constant's value) and then lands it through the queue
    Clause-②: 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:retriage raised this round) and names different files; same-axis area:devpath in-flight cards #21777 · #21774 · #21761 · #21756 · #21727 · #21186 · #20749 sit on code files, so this card may fly; the six pm:epic territories name no .claude/** path; the lane holds no pm:on-hold card, so no Restart-touch: row intersects; same-day churn none on this file (last touch 7d078148, PR #21676, 2026-10-04T04:07Z); verify lock free, queue empty; harness CURRENT on ebfe658c = origin/main. No open P0/P1 in the lane. Readings taken at 2026-10-05T00:33Z.

  3. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  4. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #21783 (head af73798d9) · skills seat 1, session_011SekRJwTRqXSmsP6xTSci4 (os-tesla) · 2026-10-05T01:00Z

    Reviewed 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).

    • PR form: draft, base main, first line Fixes #21748, Clause-②: no at line start, ## 维护者速读(草稿) present with 席位意见 empty (informational on Tier S), one session-URL footer; labels documentation, size/s, skip-changeset; assignee os-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.
    • Diff, read by this seat: five lines under the Clause-②: yes | no criterion carrying the grade's three readings and the unsettled-reading rule; five summary lines deleted whose owning copies (thirteen phrases) each hit once on origin/main in dispatch-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).
    • Acceptance (grade 5981293521): the PR body states per case that objectui#11569, objectui#11601 and objectui#11591 read yes under the new text, with symbol-level evidence; satisfied.
    • Gates: 17 families derived (the same 17 the dispatch named), --ran reconciled 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 Gates and three Type Check legs) — the honest state, landing waits for them. Report comment 5986286681 present and parses; mcp_calls 0; api_writes 3 strokes as listed. Premise verified on ebfe658c (0 hits, control 2).
    • Out-of-scope findings: references/contract-review.md already 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 af73798d9 is green or an expected skip, this seat runs check-expected-skips --pr 21783 and check-governed-merges --pr 21783, then flips ready and arms auto-merge through the relay; Fixes closes this card on merge, then the seat strips pm:dispatched + assignee and posts the landing note.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — skills seat 1, session_011SekRJwTRqXSmsP6xTSci4 (os-tesla) · 2026-10-05T01:39Z

    PR #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 on af73798d9 (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_queue at 2026-10-05T01:12Z). Confirmed on origin/main by content: .claude/skills/pm-dispatch/references/execution-duties.md carries the five Clause-② reading-rule lines under the Clause-②: yes | no criterion (1 hit on the first) and no longer carries the five restated lines they were paid with (0 hits), at 183 lines. Fixes #21748 closed this card completed; pm:dispatched and 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 to origin/main after the merge, so the harness-loaded tree reads CURRENT for the next dispatch.


    Generated by Claude Code

  6. added a commit that references this issue on Oct 7, 2026
    e27a7c0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:skillspriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions