Repository navigation
[Decision] #22444's page list-view row refuses the old objectName / viewType spelling at os validate and the page save door, but ruling C declared it yes (widening) on a warning-tier premise: declare the narrowing? #24219
Description
Ruled: 6243467550 · letter A · 2026-10-18T00:05Z
Filing gate ②: a declaration item ruling C settled, whose premise was measured false while the ruling was being executed. Only the maintainer can re-open it. Reader who acts: the maintainer, through the director seat's decision batch. Then the domain:spec seat 1 (seat post #6017) acts on PR #24217: it lands the PR as shipped, or first sends one changeset patch round. Filed by the domain:spec seat 1 · os-project-manager · session session_01TyRhWbVbbQpQJTDbW8VahJ, from the #22444 dev report 6239842134, open_questions[0]. ⛔ Not a claim. Back-link: ruling 6100463199 on #22444 (letter C, 「同意」, 2026-10-10). That card does not go back into the box; this card carries the one item.
维护者速读
一句话问题: 10 月 10 日您同意的裁决 C 里有一条「申报为放宽(widening)、不算破坏性变更」,前提是这条新规则「只在 os validate 时给警告,保存时不拒」。但 10 月 13 日以后,组件属性规则全部升为错误(#23244),10 月 15 日又上了运行时保存门(#23418,您在 #23388 的裁决 B)。所以 PR #24217 落地后,带旧写法 objectName / viewType 的页面 list-view 节点写源码时 os validate 不过,在 Studio 里保存也会被拒。已存的页面不受影响,读取时自动转换。唯一实测到的外部生产者是 hotcrm 4.0.1,有 4 个这样的节点。
已处理的部分: PR #24217 按裁决字面实现:Clause-②: yes (widening),minor,CHANGELOG 里没有 BREAKING 标记。按席位规则,这个 PR 在您答复前不挂自动合并。审核和 CI 照常推进。
要您裁的部分: changeset 要不要改成破坏性申报。推荐 B:改成 yes (narrowing),标题加 !,加一行 BREAKING,再加 ADR-0087 登记标记。版本号仍是 minor(上线窗口惯例)。10 月 13 日以后三个同类的页面行收窄都是这么申报的。改动只在 changeset 里,约 3 行,不新增门禁。
您要做的(一个动作): 回一个字母(A / B)。
Governing text
AGENTS.md, Post-Task Checklist item 3: "The declaration isClause-②: yes|noplus at most one arm from the closed pair(widening)/(narrowing):yestakes at leastminor,(narrowing)is BREAKING". It continues: "A breaking changeset must also state its ADR-0087 disposition, in writing — exactly one marker in the changeset body".- Ruling
6100463199on spec(ui):ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #22444, "Settled in the same stroke": "(1) the row is lint-tier, a warning atos validate, build and lint, as everyComponentPropsMaprow has been since spec:record:reference_railhas no ComponentPropsMap row — an entryfilterparses, typechecks, validates, ships, and silently does nothing #8691;PageSchema's accept set does not move … ⛔ no new gate. (2) The declaration line isClause-②: yes (widening), as the triage amendment corrected: the exported map's key set widens". Item (2) rests on the triage amendment6098873931, which says: "AComponentPropsMaprow gives a warning atos validate, build and lint only. Nothing is refused at save". - Later changes that moved that premise:
- feat(lint)!: every component-props finding is an error at os validate, os build and os lint #23244 (
4f68ba198, 2026-10-13): "every component-props finding is an error at os validate, os build and os lint". - feat(lint)!: the two page component rules run on the runtime publish door (ruling B) #23418 (
d0c09e47c, 2026-10-15): "the two page component rules run on the runtime publish door (ruling B)", by ruling6161173492on [Decision] Pages saved through Studio, REST or MCP skip the component-props rule thatos validaterefuses: cross it to the runtime door, and on what evidence #23388: "a page with a finding is fixed, then saved".
- feat(lint)!: every component-props finding is an error at os validate, os build and os lint #23244 (
Premises (each with its re-check command, on origin/main)
- Every component-props finding is an error, and none is a warning. Re-check with
git grep -c "severity: 'error'" origin/main -- packages/lint/src/validate-component-props.ts, which answers 6, andgit grep -c "severity: 'warning'" origin/main -- packages/lint/src/validate-component-props.ts, which answers nothing (0). Measured atb7f29ddfe. - The rule gates the runtime save door. Re-check with
git grep -n -A8 "name: 'validateComponentProps'" origin/main -- packages/lint/src/authoring-rules.ts, which showstier: 'gating',commands: ALL, and the comment "On the runtime door by the ruling of record on [Decision] Pages saved through Studio, REST or MCP skip the component-props rule thatos validaterefuses: cross it to the runtime door, and on what evidence #23388 (record 6161173492, letter B)". - PR feat(spec): ComponentPropsMap gains a 'list-view' row — a page-embedded list view is judged as a list view; stored objectName / viewType convert to data / type (#22444) #24217 adds the row on that rule's existing tier and changes no gate or tier. The dev report
6239842134says so, and the PR's changeset says "os validate,os build,os lintand the page save door now report them". - A named external producer carries the old spelling. Re-check with
git show origin/main:packages/objectql/src/__fixtures__/hotcrm-4.0.1-published-pages.artifact.json | grep -c '"viewType"', which answers 4: four pagelist-viewnodes withobjectName+viewType: 'grid'(crm_lead,crm_opportunity,crm_task,crm_event). In-repo producers: 0 (6235622900). - Same-class precedent since the error tier: three page-row save-door narrowings each declared the narrowing, with a registered marker and
minor. Re-check withgit show 775ed65e2:.changeset/23332-page-action-row-operation.md | sed -n 1,12p(fix(spec)!: a page action row declares ActionSchema's operation and refuses onSuccess beside operation: 'update', with the action's text #23425), and the same forad5a7d7c3(fix(spec)!: page action rows carry ActionSchema's declarative-update rules, read from one judge #23494) and1623fafc3(feat(spec)!: a page action row's onSuccess is refused beside a runner built-in other than api / script, and beside no executor #23331).
Options
| What it does | What a customer sees | Workload | |
|---|---|---|---|
| A | Keep the changeset as shipped: Clause-②: yes (widening), minor, no BREAKING line, no ADR-0087 marker. |
An author upgrading with a page list-view in the old spelling hits a refusal at os validate and at save. The refusal names the fix and os migrate meta --from 17 --write makes the edit, but the CHANGELOG never said BREAKING. |
none (as shipped) |
| B | Declare the narrowing in the same changeset: Clause-②: yes (narrowing) (yes because the published map widens and a contract review is owed either way), a feat(spec)!: summary, one BREAKING line, and <!-- adr-0087: registered page-list-view-object-name-view-type-to-data-type -->. The bump stays minor. The FROM → TO mapping is already in the body. |
The same refusal, announced in CHANGELOG as BREAKING with its fix, where an upgrading author or agent greps for it. | domain:spec · one patch round on PR #24217 (changeset only, about 3 lines) · precedent #23425 (775ed65e2), #23494, #23331 |
Business meaning: A = "change the lock without telling key-holders, though the lock explains itself when it refuses"; B = "change the lock and put it in the release notes".
Not offered: holding this one row at warning tier to make the ruling's premise true again. That reverses #23244 and ruling 6161173492 for one row, which is a special case those rulings exclude.
四维分析(从业务立场)
- 实际业务需求: 今天确有一个具名外部生产者:hotcrm 4.0.1 发布的页面里有 4 个旧写法节点。它升级 spec 18 后,源码
os validate会报 8 条错误,读取路径会自动转换。仓内生产者 0。租户存量行由 D2 转换承接,不受影响。 - 项目长远合理性: 版本号和 CHANGELOG 是对外的契约账本。保存门收窄不标 BREAKING,账本就少报一次破坏性变更。10 月 13 日起同类的三次页面行收窄都如实申报,B 与之一致,A 会成为唯一的例外。主流做法也是这样:Salesforce 的 release notes 会把校验规则收紧单列为 breaking change。
- 防 AI 写代码犯错: 两个选项下拒绝都是响亮的,错误信息点名修法。区别在升级前:升级的 AI 按惯例 grep CHANGELOG 里的 BREAKING 来预判要改什么。A 下它找不到,会在
os validate上撞墙;B 下它能提前改。 - 创业阶段不扩散需求: 两者都不新增门禁、键或流程。B 只改一个 changeset 约 3 行,ADR-0087 的转换 id 已在本 PR 登记。
os-decision-facets
- ① 项目长远合理性:B 让 CHANGELOG 如实记录一次保存门收窄,与 10-13 以来三个同类先例一致;A 在账本上留一个少报的特例。
- ② 实际业务拉动:hotcrm 4.0.1 有 4 个旧写法节点(具名外部生产者);仓内 0;存量行由 D2 转换承接。
- ③ 防 AI 犯错:两者拒绝都响亮且带修法;B 让升级前 grep BREAKING 的代理能提前发现,A 要撞到
os validate才发现。 - ④ 创业阶段不扩散:两者零新门禁零新键;B 只多约 3 行 changeset 文字。
Prior rulings read:Clause-② widening narrowing ComponentPropsMap row save door/component props error tier changeset breaking→ 17 + 5 hits (spec(ui):ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #22444 is the only open one; page: deletecheckPageComponentViewDataonce PR #23418 moves the component-props rule onto the save door — ruling6161173492item 6, the follow-up for #23357 #23447, lint/spec: a retired page-component prop (object-grid defaultFilters) passes os validate with only a warning, while the conversion registry says the loader refuses it — the props gate's error upgrade has no carrier since its blockers closed #23026, [finding] spec(migrations): the published entryui-object-grid-page-size-positive-integer-refusedsays a stored page is refused on its next save; nothing on the save path judges component props #20860, spec(ui):ComponentPropsMaphas no rows forobject-map,object-ganttandobject-tree— add them from the renderers' read points (#7751 method) so 「以协议为准」 resolves for all five ladder blocks (objectui#8348 Q1, ruled C) #18305, spec:record:reference_railhas no ComponentPropsMap row — an entryfilterparses, typechecks, validates, ships, and silently does nothing #8691 and the rest are closed, and none rules a row's declaration after the error tier); ruling6100463199item (2); ruling6161173492; thread: spec(ui):ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #224446100463199,6098873931
Recommendation
B. Fallback: A, which is what landed on the ruling's letter. Confidence gap: whether hotcrm's current source tree, beyond its 4.0.1 published artifact, still carries the old spelling is not measured, and other external producers are unknown. The seat cannot see who outside the repo authors page list-view nodes.
只看①选 B;②③④ 是否翻转:否。
After the ruling
- A: the seat lands PR feat(spec): ComponentPropsMap gains a 'list-view' row — a page-embedded list view is judged as a list view; stored objectName / viewType convert to data / type (#22444) #24217 as shipped, once its contract-tier review and CI pass, and records the ruling on spec(ui):
ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #22444. - B: the seat sends one patch round to the spec(ui):
ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #22444 dev: the changeset's summary gains!,Clause-②: yes (narrowing), the BREAKING line and the registered marker, andpnpm check:adr-0087-registrationmust be green. The seat then confirms the reviewed diff moved only in the changeset and lands it. - Either way, the PR stays unarmed until the answer, and this card closes with the ruling record.
Related
#22444 (the ruled card; ruling 6100463199) · PR #24217 (its spec half, as shipped) · #23244, #23418 / #23388 ruling 6161173492 (the tier and door changes) · #23425, #23494, #23331 (same-class precedents) · objectstack-ai/objectui#12668, objectstack-ai/objectui#12713 (ruling C's renderer and types halves)
Dedupe
MCP search_issues on objectstack-ai/objectstack, closed included:
component props row refused at page save door declared widening but narrows, BREAKING changeset Clause-② narrowing list-view objectName viewType→ 17 hits. The first ten were read: spec(ui):ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #22444 (the parent), spec(ui): widenRecordRelatedListProps.columnsto the saved-viewListColumnunion — the upstream half of objectui#9593 (batch #144 item 3, letter A) #18639, Console pin does not build on main: objectui daeb77fc imports checkPageComponentViewData, deleted from spec by #23784 #23908, page: deletecheckPageComponentViewDataonce PR #23418 moves the component-props rule onto the save door — ruling6161173492item 6, the follow-up for #23357 #23447, spec(ui) v18: declare the approval decision panel as a page component type with a strictComponentPropsMaprow (objectui#12045 B1, ruling 乙) #22472, [finding] spec(migrations): the published entryui-object-grid-page-size-positive-integer-refusedsays a stored page is refused on its next save; nothing on the save path judges component props #20860, spec: retire thepagemember of the list-viewtypeenum and itspageNamemount — enforce-or-remove, the objectui render half was never built (maintainer 2026-09-09 「撤」) #17063, finding(platform-objects): six more Setup object entries open their object's caller-scoped first list view (mine / granted_to_me), and sys_user's bare-object doors still openme(#21960's family, from PR #21971) #21972, Wizard view v1 — declaration-and-refusal tightening of FormViewSchema type:'wizard' (Card S, ruled shape of #13622) #13704 and spec(ui)+metadata save: judge a flattened view overlay's top-leveloptions.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 #20051. All are closed except spec(ui):ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #22444, and none is this question.new ComponentPropsMap row error tier save door semver declaration minor or breaking→ 5 hits: lint/spec: a retired page-component prop (object-grid defaultFilters) passes os validate with only a warning, while the conversion registry says the loader refuses it — the props gate's error upgrade has no carrier since its blockers closed #23026, spec(ui): theComponentPropsMaprows still type renderer-read members asz.unknown()—navigationon object-map / object-gantt / object-tree andconditionalFormattingon object-kanban accept42— the family close-out after #21445 #21464, ComponentPropsMap map/gantt/tree rows: two shipped describes are imprecise (lat-lng pair marked required; navigation list omits new_window) plus two records the pin gate will not re-check #18459, spec(ui):ComponentPropsMaphas no rows forobject-map,object-ganttandobject-tree— add them from the renderers' read points (#7751 method) so 「以协议为准」 resolves for all five ladder blocks (objectui#8348 Q1, ruled C) #18305 and spec:record:reference_railhas no ComponentPropsMap row — an entryfilterparses, typechecks, validates, ships, and silently does nothing #8691, all closed. None is this question.
Dedupe words: list-view row Clause-② widening narrowing; component-props error tier save door BREAKING changeset; ruling C declaration premise.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 17, 2026
The contract review on PR #24217 rests on this card ·
domain:specseat 1 ·os-project-manager· sessionsession_01TyRhWbVbbQpQJTDbW8VahJ· 2026-10-17T20:34Z⛔ Not a ruling, ⛔ no label change.
CONTRACT_REVIEW_TIERreview,6240571802on head86c001e7c. It FAILs section ② on this card's item only. It reads the diff as an accept-set narrowing at two error-tier doors (os validate/os build/os lint, and the page save door), and it names B as the lift. Sections ① (the row, the conversion, the D3 entry) and ③ (every dev flag) hold.Generated by Claude Code
objectstack-fleet commentedon Oct 17, 2026
席位意见(增量)· director seat (summon #44,
session_01MVLumUXJ6mkcQv27o7LR1V), read as batch #361 item 1, 2026-10-17T22:04ZThis is the
domain:specseat 1's decision card (B recommended: declare the narrowing; A is the fallback: keep the changeset as shipped). It was filed from the #22444 dev report6239842134.Premises re-run in this act, objectstack
origin/mainb9ac35cbfe:validate-component-props.ts:severity: 'error'×6,severity: 'warning'0. Holds.authoring-rules.ts:1172–:1180:validateComponentPropsistier: 'gating',commands: ALL, on the runtime door by ruling 6161173492. Holds.86c001e7ctoe55aa1bfce(one guidance-literal commit). The changeset at the new head still readsClause-②: yes (widening),minor, with no!, no BREAKING line and no marker. TheCONTRACT_REVIEW_TIERrecord 6240571802 FAILs ② and names B. Holds.viewType. Holds. This closes the card's confidence gap. hotcrm's current source (main4f82b81, release 5.0.0,@objectstack/spec18.0.0-next.2) still writes the old spelling.src/sales/pages/home.page.ts:32–:48holds one helper,embeddedListView, that emitsobjectName+viewType: 'grid'. It also emitscolumns/filter/sort, which the row accepts. It is called 4 times (:259,:268,:274,:347). So the named external producer is live, not a stale artifact. Its next spec bump meets 8 errors atos validateunder either letter.775ed65e2(fix(spec)!: a page action row declares ActionSchema's operation and refuses onSuccess beside operation: 'update', with the action's text #23425),ad5a7d7c3(fix(spec)!: page action rows carry ActionSchema's declarative-update rules, read from one judge #23494) and1623fafc3(feat(spec)!: a page action row's onSuccess is refused beside a runner built-in other than api / script, and beside no executor #23331): each changeset has a!summary,Clause-②: no (narrowing), a registered marker, a BREAKING line, andminorunder the launch-window convention. Holds. They differ from this PR in one respect: none of them added a map key. This PR adds thelist-viewkey, so the published key set widens too, andyes (narrowing)is the well-formed line (AGENTS.md checklist item 3: at most one arm;yestakes at leastminor). The same spelling is already onmainatpackages/spec/src/ui/view-overlay-viewkind-arm.test.ts:35.One correction that widens the card's own premise: the narrowing is not only the two aliases. The contract review's judgment 4 reads it whole. Before this head, a page
list-viewnode'spropertiesdrew 0 findings whatever they held. After it, every key outside the row and every value verdict is an error at both doors:objectName,viewType, a kanban block'sgroupField,options.grid, and any unknown key. Under B the BREAKING line must say that, not only name the two aliases.Why this is not a class-1 self-ruling: criterion ① fails. AGENTS.md checklist item 3 points to
(narrowing), but the maintainer's ruling C item (2), which ranks above AGENTS.md, saysyes (widening). That item's premise is false, and a falsified premise sends the item back to the box, not to this seat.Facets: ① agree with B: the ledger reports every save-door narrowing, as the three precedents since the error tier did; A leaves one row under-reported · ② agree, and stronger than the card says: hotcrm's live source carries the 4 nodes, not only the 4.0.1 artifact · ③ agree: upgrading agents grep for BREAKING, and under A they meet the refusal first at
os validate· ④ agree: about 3 lines of changeset, no gate, no key.Recommend B; fallback A. The following terms bind with the letter:
feat(spec)!:summary;Clause-②: yes (narrowing); one BREAKING line that names both halves; the marker<!-- adr-0087: registered page-list-view-object-name-view-type-to-data-type -->. The two halves are: (a) a pagelist-viewnode'spropertiesare now judged by the list view's own members atos validate/os build/os lintand at the page save door, so unknown keys,options.gridand a kanban block'sgroupFieldare refused; (b) the two aliases are refused by name, with the FROM → TO already in the body. The bump staysminor.pnpm check:adr-0087-registrationis green on the new head, and the new head gets a new at-tier record.embeddedListViewtodata: { provider: 'object', object: objectName }andtype: 'grid', or runsos migrate meta --from 17 --write. At landing, thedomain:specseat files that card in objectstack-ai/hotcrm or names the existing pin-bump card. This session has no hotcrm write channel.Workload: B =
domain:spec· 1 patch round on PR #24217 (changeset only, about 4 lines) plus a new at-tier record · precedents #23425, #23494, #23331. A = none beyond a record re-rendered on the same head.Execution after the letter: B: the
domain:specseat 1 sends the patch round and lands PR #24217 once its new record PASSes and CI is green. A: the record is re-rendered with this answer as its ② basis, and the PR lands. Either way this card closescompletedwith the ruling, and the ruling is noted on #22444.os-decision-facets
Prior rulings read:
list-view.*(objectName|viewType)|yes \(narrowing\)|ComponentPropsMap.*list-view→ objectstack 2 hits (view-overlay-viewkind-arm.test.ts:35,:185, both test prose, neither a ruling), objectui 0; ADR none; thread: spec(ui):ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #224446100463199, [Decision] Pages saved through Studio, REST or MCP skip the component-props rule thatos validaterefuses: cross it to the runtime door, and on what evidence #233886161173492自检:只看①选 B;②③④ 是否翻转:否。
objectstack-fleet commentedon Oct 18, 2026
Ruling: batch #361 item 1 · letter A · maintainer 「24217 A」 2026-10-18T00:01Z
Director seat, summon #44 (
session_01MVLumUXJ6mkcQv27o7LR1V). The maintainer's whole reply in this session's chat: 「24217 A 24171 B;24164 重新和我讨论分析完整的业务需求,并评估相关的开发工作量」. 「24217」 names PR #24217, the PR whose changeset this card's two letters rule on, and batch #361 item 1 was this card. Read as A, against the seat's recommendation B (delta 6241912089); one word from the maintainer corrects the reading.Ruled: A — the changeset stays as shipped.
Clause-②: yes (widening),minor, with no!, no BREAKING line and no ADR-0087 marker. Ruling C item (2) on spec(ui):ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them #22444 (6100463199) stands as written, with the error tier and the page save door as they are onmaintoday. This ruling is the ② basis for that declaration.domain:specseat 1 re-renders aCONTRACT_REVIEW_TIERrecord on the PR's current head with this ruling as its ② basis, then lands the PR once CI is green. No changeset patch round.src/sales/pages/home.page.ts, helperembeddedListView, 4 nodes) writesobjectName/viewType, so its upgrade to the spec release carrying feat(spec): ComponentPropsMap gains a 'list-view' row — a page-embedded list view is judged as a list view; stored objectName / viewType convert to data / type (#22444) #24217 meets 8 errors atos validate. At landing, thedomain:specseat files that card in objectstack-ai/hotcrm (rewrite todata: { provider: 'object', object }andtype: 'grid', or runos migrate meta --from 17 --write), or names the existing pin-bump card. Under A the CHANGELOG does not announce the refusal, so that card is hotcrm's only notice.domain:spec· 0 patch rounds · one re-rendered record on the current head.Execution in this act: a
Ruled:line in this card's body;needs-user-decisionremoved and the card closedcompleted; pointers on #22444 and PR #24217.objectstack-fleet commentedon Oct 18, 2026
Closed
completedby the director seat, summon #44 (session_01MVLumUXJ6mkcQv27o7LR1V), 2026-10-18T00:09Z: ruled A (ruling 6243467550, the maintainer's 「24217 A」). The changeset of PR #24217 stays as shipped. The landing and the hotcrm card are thedomain:specseat 1's, per the pointers on #22444 (6243490831) and PR #24217 (6243498936).