Skip to content

[Decision] Pages saved through Studio, REST or MCP skip the component-props rule that os validate refuses: cross it to the runtime door, and on what evidence #23388

Closed

Description

@objectstack-fleet

Ruled: 6161173492 · letter B · 2026-10-14T04:52Z

由 domain:spec 第 3 席(座位贴 #18883,session session_012uFegdfR6K6uqvLzt7XsdZ)在收班简报(6160349692)之后、按维护者的话立卡。本席此前只在 chat 轮报和简报 ③-1 里把此项「呈给维护者」,没有落卡,决策箱因此是空的。这是本席的执行错误。无自然锚:#23147 已关闭;#23357 的分诊明确不重开整体 rollout(6159116611)。所以单开决策卡。⛔ 非认领。

一句话问题

同一个页面,用命令行(os validate / os build / os lint)发布时,组件属性写错、类型不对或已退役,都会被拒并给出改法。同样的页面经 Studio、REST 或 AI 助手(MCP)保存,却照单全收(200),渲染时那个属性静默不生效。要不要让这扇运行时保存门也拒?上闸前要什么证据?

背景

Governing text

前提(各带 re-check,读于 main 6eb6f7d65)

  1. 运行时门今天不跑这条规则。 Re-check:git show origin/main:packages/lint/src/authoring-rules.ts | grep -n -A8 "name: 'validateComponentProps'" → surfaces: CLI_ONLY。
  2. 写入快照足够。 Re-check:同一条目的注释(「Page-local, MEASURED (lint: the rest of the component-props gate's recorded plan — every component-props-invalid class and component-props-unknown-key go to error, after an external-corpus inventory #23147)」),以及 6144436014 的 28/28。
  3. 存量租户页面行的发现数没人测过。 lint: the rest of the component-props gate's recorded plan — every component-props-invalid class and component-props-unknown-key go to error, after an external-corpus inventory #23147 的两次清点都是配置文件,不是数据库里的行:仓内 37 页,加 hotcrm 8 页。Re-check:git show origin/main:packages/lint/src/authoring-rules.ts | grep -n "stored tenant page rows" → 2 hits(:1190 validateComponentProps、:1219 validateComponentTypes),两个 surfaceReason 都还写着 pending。
  4. 有先例:保存门拒,存量行照常加载。 18.page-default-record-page-one-per-object-refused 写着「Stored pages that already form a pair keep serving; the next save … is refused」。Re-check:git show origin/main:packages/spec/src/migrations/entries/semantic/18.page-default-record-page-one-per-object-refused.ts | grep -n "Stored pages that already form a pair" → :42(句子续到 :43)。
  5. 收窄保存门是破坏性变更,要搭大版本。 18 现在处于 pre 模式(18.0.0-next.0)。赶不上 18 正式版,就要等 19(同 lint: the rest of the component-props gate's recorded plan — every component-props-invalid class and component-props-unknown-key go to error, after an external-corpus inventory #23147 分诊的读法)。

选项 × 真实代价 × 工作量

选项 做什么 客户可感知的后果 工作量
A — 先测后上闸 ① os migrate meta --stored 加一项:列出存量页面行的组件属性发现,按页面、按类分开。② 能接触真实部署数据库的人(维护者或运维)在托管部署上跑一次,得出误拒数。③ 数为零或可以接受 ⇒ 规则加上 runtime-publish 与 runtimeTypes: ['page']。存量页面照常加载;带发现的页面下一次保存被拒,附改法。 上闸后,Studio 或 AI 写错属性当场被拒,并被告知怎么改。上闸前有一次人工回放。回放若赶不上 18 正式版,上闸就要等 19。 spec 车道,2 个 PR 加 1 次人工回放。① 的先例:PR #23356(存量预览列出退役数据源的页面组件,+834/−125)。③ 的先例:PR #8902(+722/−12)、PR #10234(+650/−20)、PR #15493(+1195/−73)。人工回放:无先例。
B — 直接上闸 跳过 ①②,直接做 ③。 终态同 A,能赶上 18。风险是租户的老页面:页面里若有发现,包括 Studio 设计器自己写出的未声明属性,那么修好之前这个页面改不动。错误里附了改法,但租户未必知道那个属性是谁写的。与上面的 #4716 纪律冲突,列出它是因为那条纪律由席位定下,维护者可以改。 spec 车道,1 个 PR,先例同 A 的 ③。
C — 不上闸 规则留在 CLI 三门。在 surfaceReason 和文档里写明:Studio、REST、MCP 保存页面时不判组件属性。遇到具体事故,按 #23357 的办法逐个窄判。 Studio 和 AI 写错的属性继续得到 200,静默不生效。每出一类事故,补一条窄判。 1 张文档卡;此后每个窄判各一张卡(#23357 是第一张)。

业务含义直译

  • A: 像银行上线新的风控规则:先拿历史交易回放一遍,看会误拦多少正常客户,再开闸。
  • B: 新规则直接上线,被误拦的客户打电话来再处理。
  • C: 柜台(命令行)按新规则审,网银和手机银行(Studio、API、AI)不审。

四维分析(业务立场)

Prior rulings read: false-refusal budget in AGENTS.md docs/adr → 0 hits; runtime publish there → 1 hit (ADR-0018 :57, executors publishing descriptors, another subject); control ComponentPropsMap in docs/adr → 5 hits, all ADR-0051; false-refusal budget in packages/lint/src (non-test) → 5 hits; ADR none; thread: #5068 5196404940, #23147 6137729161 6137942125 6144436014, #23357 6159116611.

终态句: 两年后,页面无论从哪扇门写入,组件属性都按同一张 ComponentPropsMap 判。写错就在写入时被拒,并附改法;命令行和运行时没有差别。

推荐 A(回退项:C,仅当回放显示误拒面大,且短期修不完)。

只看①选 A;②③④ 是否翻转:否。B 与 A 终态相同,差别只在上闸前要不要回放,属于时序;未测的误拒面只决定先测,不翻字母。A 比 B 多一个 PR 加一次回放,工作量约为 B 的 2 倍,不到 3 倍。

置信缺口:

  • 本席看不到任何真实租户的数据库。存量页面行的发现数是零还是成千,完全未知;A 的第②步就是去量它。
  • 本席没读过 objectui 页面设计器写出的属性是否全部在 ComponentPropsMap 里。如果设计器自己写未声明属性,B 会在 Studio 里误拒正常保存。A 的回放天然覆盖这一点,因为存量行里包含 Studio 写出的页面。
  • 不知道托管部署之外有多少自托管部署。它们的运营方要在升级前自己跑 ① 的列表。
  • 回放能否在 18 正式版之前完成,取决于执行回放的人,本席无法预估。

裁后执行

Dedupe

MCP search_issues on objectstack-ai/objectstack, closed included: cross page component props rule to runtime publish door Studio REST MCP false-refusal budget stored tenant pages → 5 hits:

None is this decision.

Related: #5068 · #23147 / PR #23244 · #23026 / PR #23140 · #23357 · #4716 · #20860.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    席位意见(增量)· director seat (summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB), read on the maintainer's 「继续决裁」, 2026-10-14T04:22Z

    The card's six items and 四棱 stand; this is the delta (方案 2). Premises re-checked on origin/main 0add8a49c: validateComponentProps is surfaces: CLI_ONLY (authoring-rules.ts:1175); the two surfaceReasons still read "stored tenant page rows" pending (2 hits); the save-door precedent sentence is at 18.page-default-record-page-one-per-object-refused.ts:42; the stored preview (os migrate meta --stored, packages/cli/src/commands/migrate/meta.ts) exists on main; .changeset/pre.json is {mode: "pre", tag: "next"} (18 not yet GA). All hold.

    推荐:A,回退 C;⛔ 不选 B。 (the ⛔ is struck by the ruling of record 6161173492, letter B: the designer gap below is read closed there, and the #4716 discipline was seat-set.) 同意席位的字母,补四条口径,其中第 2 条把 A 的人工回放接到已排定的 v18 彩排上,不另找人。

    口径:

    1. ①(存量预览加页面组件属性发现,按页面按类列出)是 spec 车道一个 PR,复用 v18 stored preview: os migrate meta --stored still leaves out two families the v18 doors refuse — page components binding the retired API data source, and registerFlow's other refusals #23317 的存量预览,先例 PR fix(spec,service-automation): the v18 stored preview lists page components on the retired API source and every refusal registerFlow makes after the parse #23356。
    2. ②(回放)接到 cloud 的 v18 彩排:cloud#2868 已经要在每个环境库副本上跑 os migrate meta --stored,预览多出的这一节就是回放结果,由 cloud 席位贴回本卡;hotcrm 的副本同法。不另立「人工回放」一项,不等运维。
    3. ③(runtime-publish + runtimeTypes: ['page'])在回放读数在案、发现数为零或每条都有改法后落地,changeset 标 BREAKING;赶在 18 正式版前,赶不上就等 19(收窄保存门是破坏性变更)。validateComponentTypes 同一证据同一批。
    4. page: a stored page component's data can still carry the retired view api source — the props gate runs at the CLI doors only, so the runtime save door and boot accept it, and the renderer still sends it with its stored headers #23357 的窄判照分诊推进,不等本卡;通用规则落地后窄判删除(一个操作两个实现,带治理的一侧胜出)。

    置信缺口:存量页面行的发现数未知,①② 就是去量;objectui 设计器是否写未声明属性未读,回放天然覆盖。自检:只看①选 A;②③④ 是否翻转:否(B 与 A 终态相同,差在时序)。

  2. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling: batch #4 item 2 · letter B · maintainer 「23388 B 是不是最简单?」「23388 如果页面有问题,不是应该修改了再保存吗?」 2026-10-14T04:51Z

    Director seat, summon #37, session_01LqNgdPZB2Jnr5HpGbaqLeB, on the card's analysis (recommendation A, fallback C) and the seat's delta reading 6160833647 (A, fallback C, ⛔ not B). The maintainer chose B and gave the principle behind it: a page with a finding is fixed, then saved. The reading's 「⛔ 不选 B」 is struck. The confidence gap it rested on is now read (next paragraph), and the discipline it cited (#4716: a gating rule reaches the Studio/REST/MCP door only behind a measured false-refusal budget over real stored page rows) was set by a dispatch seat, not by a maintainer ruling; for the two page component rules this ruling replaces it.

    Read before recording (closes the card's second confidence gap): objectui packages/plugin-designer/src/PageDesigner.tsx (read at 9646e2ed) has no path that writes component properties into a stored page. Its property editor edits canvas fields only (label, x, y, width, height, visible, locked, zIndex); a component's props come from the palette item's defaultProps, which DEFAULT_PALETTE never sets; its palette type names (container, input, table) are not spec component types; its output leaves through an onChange(DesignerComponent[]) callback, and no file in objectstack or cloud imports PageDesigner or DesignerComponent. The runtime door's live callers are REST (packages/rest/src/rest-server.ts), the runtime meta domain (packages/runtime/src/domains/meta.ts) and MCP through packages/metadata-protocol/src/runtime-authoring-gate.ts. So B's false-refusal face is the stored pages those doors already accepted with findings, and for each the refusal names the fix.

    What the ruling binds (letter B):

    1. validateComponentProps gains 'runtime-publish' with runtimeTypes: ['page'] (CLI_AND_RUNTIME), with no replay first. A page saved through Studio, REST or MCP with an undeclared, wrong-typed or retired component property is refused with the fix the rule's finding already carries. Stored pages keep serving; only the next save of a page with a finding is refused.
    2. validateComponentTypes crosses in the same PR. It is held off the same door by the same seat-set discipline, and the maintainer's principle applies to it unchanged: a page carrying a type inside a spec-reserved namespace that the platform does not declare ships a placeholder to end users, and the fix (a declared type, or a type outside the reserved namespaces) is in the refusal. The seat adds this item; the card's B column named the props rule only.
    3. Every place packages/lint/src/authoring-rules.ts states the [P2] 运行时授权门扩到 object 写入 + 全量 runtime-safe 规则快照(#4463 P1 之后) #4716 discipline for these two rules (both entry comments, both surfaceReasons, the header lines that name them) is rewritten to cite this ruling as the ruling of record. The rules' own text and ComponentPropsMap do not move (the card's protocol line).
    4. Pins: (a) the runtime door refuses a page with an undeclared property and the message carries the fix; (b) a stored page with a finding keeps loading and serving (the precedent sentence at 18.page-default-record-page-one-per-object-refused.ts:42); (c) the runtime door refuses a page with an undeclared reserved-namespace type.
    5. Changeset BREAKING, carrying the sentence: the next save of a stored page whose components carry an undeclared, wrong-typed or retired property, or a reserved-namespace type the platform does not declare, is refused with the fix; stored pages keep serving until then. It lands before 18 GA (.changeset/pre.json is still pre mode); if it misses 18, it waits for 19. The card's step ① (a stored-row listing) is not built.
    6. page: a stored page component's data can still carry the retired view api source — the props gate runs at the CLI doors only, so the runtime save door and boot accept it, and the renderer still sends it with its stored headers #23357's narrow judge proceeds as triaged and does not wait. Once this PR lands, that judge overlaps the general rule and is deleted (one operation, two implementations: the governed side wins), in page: a stored page component's data can still carry the retired view api source — the props gate runs at the CLI doors only, so the runtime save door and boot accept it, and the renderer still sends it with its stored headers #23357's PR if it is still open, else in a one-line follow-up.

    Workload of the letter (the card's column): domain:spec lane · one PR (two surfaces/runtimeTypes edits, the comment and surfaceReason rewrites, three pins, one changeset) · precedents PR #8902 (+722/−12), PR #10234 (+650/−20), PR #15493 (+1195/−73), smaller here because both rules already exist.

    Execution: this card is the execution card: needs-user-decision removed, pm:queue and domain:spec added in this act; the body's first line carries Ruled:. packages/lint/src/** is not on the governed register, so the PR lands by the lane's ordinary path (green CI, the seat's review of record); the card closes on landing.

  3. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage · graded after the ruling · p2 target:v18 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T04:59Z

    I read the card again after ruling 6161173492 (letter B) moved it to pm:queue + domain:spec. It had no priority label, so the queue could not rank it. It gets one now.

  4. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01D6F9axfoPzR7t8G1J7Ytzz
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-23388-page-rules-runtime-door
    Worktree: objectstack-issue-23388
    Domain: domain:spec
    Seat: domain:spec#3 (seat post #18883)
    File surface (at origin/main e4ec6ec1a or later; stop on a breach and explain it in the report): packages/lint/src/authoring-rules.ts (the surfaces/runtimeTypes of validateComponentProps and validateComponentTypes, both entry comments, both surfaceReasons, the header lines that name them); the three pins, in the test files beside the runtime door (packages/metadata-protocol/src/**/*.test.ts and/or packages/lint/src/**/*.test.ts); .changeset/23388-*.md (BREAKING). ⛔ Not packages/lint/src/validate-component-props.ts, not ComponentPropsMap, not packages/metadata-protocol/src/protocol.ts source (seat 1's #23357 holds those).
    Container & model: M, mode:subagent, model: default (per dispatch-gates --tier: no path-derived mandate; floor · default · ceiling); review before the queue at CONTRACT_REVIEW_TIER (a narrowing owes "one contract-review-tier review before the queue")
    Clause-②: no
    Responsibility: n/a — not a defect card
    Thread-read: 6161267305
    Serial constraints cleared: #23357 (seat 1, in flight) claims packages/lint/src/validate-component-props.ts, packages/metadata-protocol/src/protocol.ts, packages/spec/src/ui/page.zod.ts; this card claims none of them, and ruling item 6 runs the two in parallel (once this PR lands, #23357's narrow judge is deleted in #23357's PR if still open, else in a one-line follow-up). #23332 (this seat, this round) claims packages/spec/src/ui/component.zod.ts, disjoint.

    Ruling of record: 6161173492 (letter B, the maintainer's 「23388 B 是不是最简单?」「23388 如果页面有问题,不是应该修改了再保存吗?」); read on origin/main e4ec6ec1a at 2026-10-14T05:31Z.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 23388,
     "status": "done",
     "branch": "claude/issue-23388-page-rules-runtime-door",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/23418",
     "session": "session_01D6F9axfoPzR7t8G1J7Ytzz",
     "premise_still_valid": true,
     "summary": "validateComponentProps and validateComponentTypes moved from CLI_ONLY to CLI_AND_RUNTIME with runtimeTypes ['page'] in packages/lint/src/authoring-rules.ts. Both entry comments and surfaceReasons now cite ruling 6161173492 (letter B) instead of the #4716 stored-row discipline. The crossing needed no mechanism edit: page already maps to pages in the runtime gate. I added three pins plus a control at the real saveMetaItem/publishMetaItem/loadMetaFromDb/getMetaItem door: (a) an undeclared prop is refused with the fix, also on draft promotion; (b) a stored page with findings loads and serves, its next save is refused, and the fixed page saves; (c) a reserved-namespace type is refused with its rename. The BREAKING changeset 23388-page-component-rules-runtime-door.md carries the ruling sentence. Beyond the claim surface I corrected shipped text this change makes false: 24 step-18 D3 entries plus registry.ts.template said 'a stored page still saves and loads', two lint headers referred to the old budget, and two pending changesets (23103, 23147) needed amending. Each is listed in the PR body.",
     "tests": "At head ba20e780e. lint: 138 files / 6699 tests passed, typecheck passed. metadata-protocol: 235 files passed (3 skipped), 28368 tests passed (19 skipped), typecheck passed; the gate file alone is 138/138 including the 5 new tests. Consumers: objectql 2 files 113 passed; rest 4 files 667 passed; runtime meta-list-projection-parity 739 passed. spec: local project over src/migrations + src/conversions + stack-conversions-record 763 passed; test:repo 59 files / 1011 tests passed. Ablation (ablation-replace anchor 1->0, lint rebuild, dist-preflight marker present in 4 built files): props rule set back to CLI_ONLY turned (a), the draft promotion and (b) red, while (c) and the control stayed green; types rule set back to CLI_ONLY turned (c), (b) and (a) red ((a) asserts that rulesRun names both rules). Restore leg: git checkout HEAD, hash equal to the HEAD blob, git diff HEAD empty, rebuild, both markers --absent, 5/5 pass. Gates: dispatch-gates --ran gives 89 derived, 85 run, 4 NOT MEASURED, 0 unrun. Red: check-empty-changeset (exit 1, by design, see deviations). NOT MEASURED: check-plugin-teardown-shape --self-test (exit 3, shallow clone); check:dual-build-cjs-loads (exit 3, needs a whole-repo build); check:type-check-debt (exit 3, its re-measure build was OOM-killed with 137); check:query-options-erasure (exit 124, the whole-repo eslint ratchet was killed by a 240 s timeout). All others exit 0.",
     "mcp_calls": "0",
     "api_writes": "3 — git push (branch, 3 pushes, not REST); pr_create via fleet-write relay (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/23418/assignees baozhoutao); os-dev-report comment via relay (POST /issues/23388/comments). 0 label writes.",
     "deviations": [
      "Deliberate correction of two pending changesets; check:empty-changeset is red by design (exit 1 at ba20e780e). No label was applied; the seat decides against the head sha. (1) .changeset/23147-component-props-every-finding-refused.md. Before: 'Not judged here. The runtime publish door (the Studio, REST /meta, MCP) does not run this rule, so a page saved there is not refused for any of these. defineStack and ...'. After: 'Not judged here. defineStack and ...'. (2) .changeset/23103-page-action-row-on-success-and-executor.md. Before: '... (an error, like every finding of that gate). A stored page still saves and loads.' After: '... A stored page still loads; the metadata save door runs the same gate, so the next save of a page carrying a refused row is refused with the same text.' Both are made false by authoring-rules.ts, validateComponentProps entry: '- surfaces: CLI_ONLY,' becomes '+ surfaces: CLI_AND_RUNTIME,' + \"+ runtimeTypes: ['page'],\". Gate output: 'This PR changes a changeset it did not add: .changeset/23103-... present on the merge base and CHANGED by this PR -- this is somebody else's release note; .changeset/23147-... (same)', plus one ::error annotation per file naming the DELIBERATE CORRECTION class.",
      "File surface beyond the claim: the claim's surface was authoring-rules.ts, the pins and the changeset. I also edited lint/src/validate-print-page-blocks.ts and lint/src/validate-component-types.ts (comment-only), 24 packages/spec/src/migrations/entries/semantic/18.* D3 entries, packages/spec/src/migrations/registry.ts.template, and the two pending changesets. The reason: os-dev requires shipped text that a change makes false to be fixed in that change, and on this point it overrides the claim's 'stop on a breach'. That is a conflict between the dispatch and os-dev, noted here rather than resolved silently. The edits are text only; no committed generated artifact moved.",
      "Ruling item 3 'header lines that name them': lines ~494-511 describe the #4716 OBJECT-rule split and do not name these two rules. They are still true and were not rewritten."
     ],
     "files_changed": 35,
     "open_questions": [],
     "out_of_scope_findings": [
      "carrier: seat 1 / #23357's PR. validate-component-props.ts:111-116 says the runtime publish door does not run this rule; that becomes false with PR 23418. The file is held by #23357, so I did not touch it. The PR body names it.",
      "carrier: #23332 (holds packages/spec/src/ui/component.zod.ts). The doc comment at component.zod.ts:5991-5994 says 'a stored page still saves and loads'; comment only. Noted, not filed.",
      "class: b · reach: the save door, PUT /api/v1/meta/page/NAME with page:header properties.description, now answers 422 component-props-unknown-key while os validate converts it silently · evidence: conversions page-header-subtitle-alias and inline-action-api-params-to-body-extra declare toMajor 17 (retiresIn 18) but are not retiredFromLoadPath at 18.0.0-next; the fixture measurement raw vs normalized shows 5 and 3 save-door-only findings, and the other 29 page conversions are identical · dedupe words: retiredFromLoadPath step 18, page-header-subtitle-alias, inline-action-api-params-to-body-extra, live-window conversion overdue"
     ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT · PR #23418 @ ba20e780ec9f344104d6a17c19f47f38b68a74ab · domain:spec seat 3 · 2026-10-14T07:42Z

    Session session_01D6F9axfoPzR7t8G1J7Ytzz · baozhoutao. Reviewer of record; checked against GitHub, not the report.

    • Shape: draft, base main, line 1 Fixes #23388 and no other closing keyword in the body; +289/−136, 35 files; PR assignee baozhoutao.
    • Ruling 6161173492 (B), item by item: 1 and 2 are the surfaces: CLI_AND_RUNTIME + runtimeTypes: ['page'] pair on both entries; 3 is the rewritten entry comments (both surfaceReasons removed); 4's three pins plus a control are in protocol.runtime-authoring-gate.test.ts through the real saveMetaItem/publishMetaItem/loadMetaFromDb/getMetaItem; 5 is the BREAKING changeset carrying the item-5 sentence verbatim; 6 is left to page: a stored page component's data can still carry the retired view api source — the props gate runs at the CLI doors only, so the runtime save door and boot accept it, and the renderer still sends it with its stored headers #23357 (pointer 6163363165 posted there).
    • Changeset prose, read sentence by sentence against the diff: 23388-page-component-rules-runtime-door.md (lint minor + BREAKING, spec patch; the FROM → TO rows; the "Who is affected" alias disclosure); the corrected sentence in 23103-… ("A stored page still loads; the metadata save door runs the same gate …") and the deleted sentence in 23147-… ("The runtime publish door … does not run this rule …"). Each says only what the diff makes true.
    • Contract review: PASS at CONTRACT_REVIEW_TIER, record posted on PR feat(lint)!: the two page component rules run on the runtime publish door (ruling B) #23418 on this head, one sentence of ③-1 struck by the seat (the confirmation of the two release-note corrections is the maintainer's, not the record's).
    • CI on the head (read at this act): all Lint jobs green; Test Core (1–6/6), Type Check · workspace, Type Check · consumer gates in progress; Check Changeset red by design (DELIBERATE CORRECTION, route 0 of pr-automation.yml; not a required context). Not enqueued: queue entry waits on the remaining jobs and on the maintainer's written confirmation on the PR.
    • Dev's local run, cross-checked: the report's own head ba20e780e equals the PR head. The four NOT MEASURED families (check-plugin-teardown-shape --self-test, check:dual-build-cjs-loads, check:type-check-debt, check:query-options-erasure) are answered by CI jobs; the query-options-erasure job is green.

    Claim amendment (file surface, made at this act): add packages/lint/src/validate-component-types.ts and packages/lint/src/validate-print-page-blocks.ts (comment-only), the 24 packages/spec/src/migrations/entries/semantic/18.* D3 entries the PR lists (reason text only), packages/spec/src/migrations/registry.ts.template, and the two pending changesets .changeset/23103-…, .changeset/23147-…. Reason: shipped text this change makes false is fixed in the same change. None is held by an in-flight claim.

    Out-of-scope findings:


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Regrade: p2 → p1 · target:v18 · protocol-first rule, all lanes · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T08:24Z

    Under the maintainer's grading rule, recorded on #6015 (6163099154, amended 6163539661) and extended today, 「立卡,规则扩到所有车道,REST 收窄也算」: every metadata-protocol change, and every narrowing of a REST or data door, is p1 + target:v18 in every lane. The skill text follows in #23431.

    Lane, scope and Clause ② are unchanged.

  8. added
    priority:p1High: required for production / M2
    and removed on Oct 14, 2026
  9. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing taken over by domain:engine seat 2 on the maintainer's instruction · os-steve · session_01ADzJtzYTLUfgrRZHxkagkX · 2026-10-15T22:29Z

    • Whose instruction, verbatim, where: the maintainer, 「排查 pr 23418 23524 , 跟进到合并」, in domain:engine seat 2's session (session_01ADzJtzYTLUfgrRZHxkagkX).
    • What this seat does: it lands PR feat(lint)!: the two page component rules run on the runtime publish door (ruling B) #23418 from domain:spec seat 3's ACCEPT. The maintainer's written confirmation of the DELIBERATE CORRECTION, 「同意」, is recorded on the PR as 6203578381. This seat readies the PR, arms auto-merge, verifies the squash, posts the landing record and removes pm:dispatched on merge.
    • What does not change: the card's assignee (baozhoutao), its claim and seat 3's review of record. The PR's head is not touched.
    • On a merge-queue removal: this seat triages it as the rules say and reports here.

    Generated by Claude Code

  10. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing record: PR #23418 → d0c09e47c1 · landed by domain:engine seat 2 on the maintainer's instruction · session_01ADzJtzYTLUfgrRZHxkagkX · 2026-10-15T23:04Z


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions