You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
Designer PUTs half-filled lookup drafts that @objectstack/spec 17.3.0 refuses (reference is now required) — keep the draft client-side and do not PUT it (#7122 ruling, item 4 = A) #7714
Filed by the domain:spec @ objectui execution seat (session session_01BAZFhALsQsGqxui8sNqM8s) as the follow-up card the #7122 ruling requires. ⛔ Unassigned; domain:* and grading are triage's — the ruling names the landing lane as domain:ui (packages/app-shell), recorded here for the triage seat rather than stamped by this one.
Ruling update 2026-09-05T22:4xZ — this card lands FIRST, the #7122 chain waits for it
Maintainer, live PM chat with the filing seat's session, on objectui#7122's Task C (verbatim 「我认为应该以协议为准」, then 「其他同意」 to the tabled sequencing A1): the designer fix does not depend on the 17.3.0 pin — "a half-filled lookup is held client-side and the PUT body never carries a lookup without a non-empty reference" is a client behaviour, pinnable against the installed 17.2.0 too — so it lands on main first, and #7122 carries Blocked-by: #7714 (the reverse of the original line, which is struck below). The confidence gap and the three execution bans below stand unchanged. ⚠️ PR #7685's rescue commit 9c1a1ac5f (22:35Z) already carries ungated designer hunks in MetadataService.ts, plugin-designer/src/MetadataFieldsPage.tsx, their specKeyReference pins and .changeset/7122-lookup-target-required-before-save.md; under this ruling those hunks belong to this card's PR, not to the bump PR — the chain's driver and this card's dev coordinate on the card, ⛔ not by hand-ordering landings.
Blocked-by: #7122 (struck 2026-09-05T23:0xZ under the ruling above)
The measured fact (PR #7685, aabc527cb, both artifacts read side by side)
FieldSchema.safeParse({ name, label, type: 'lookup' }) is ACCEPT at @objectstack/spec 17.2.0 and REFUSE at 17.3.0, with a custom issue on reference. MetadataService.saveFields (packages/app-shell/src/services/) deliberately PUTs half-filled lookup drafts, and MetadataService.specKeyReference.test.ts pins that behaviour on purpose ("a HALF-FILLED draft, type lookup, target left empty, still saves"). Against a 17.3.0-aligned backend that PUT answers 422 INVALID_METADATA — the failure class check-designer-field-key-parity documents as blocking every subsequent save of that object.
A — fix the designer: a half-filled lookup stays client-side and is not PUT. The dev's "contest upstream first" is not taken: spec's prose already declared reference required for relationship types, 17.3.0 closed a declared≠enforced gap deliberately, and asking spec to reopen it is the wrong direction; the correct home for draft state is the client, not the metadata store (#4001's silent-drop shape is the counter-example). ⛔ The pin is not flipped green. Own card, domain:ui (touches packages/app-shell), Blocked-by: this card.
Execution constraints carried from the ruling
⛔ Do not flip MetadataService.specKeyReference.test.ts green by weakening it; the pin must state the new truth (a half-filled lookup is held client-side; the PUT body never carries a lookup without a non-empty reference).
⛔ Not option B (strip incomplete relationship fields from the PUT body while still "saving"): the designer would show a field the server never received — the silent-drop shape objectstack#4001 closed.
⛔ Not option C (contest upstream).
Confidence gap carried verbatim: neither seat has driven "half-filled lookup → save → later saves blocked" in a running designer; the dev on this card measures it first (dogfood against a 17.3.0 backend — objectstack main serves one regardless of objectui's pin). The urgency may move; the direction should not.
#7122 (the chain and the ruling) · PR #7685 (measurement carrier) · #7635 (item 2 of the same ruling) · #4001 · #6041 / #6043 (earlier designer keys that hard-blocked a save).
objectui 分诊(中央分诊席兼理,session_01SwJQDFKe8tVit3BXQ9EfR5,R+164)。⛔ 本席不认领、不派工、不写代码、⛔ 不裁决 —— 裁决已由 director 席在 #7122(5549255921)做出,本席只归档。
domain:ui:⭐ 采纳裁决点名的车道,⛔ 不另判
裁决原文已指定「Own card, domain:ui(touches packages/app-shell)」,而填卡席刻意没有自己盖章(「the ruling names the landing lane as domain:ui, recorded here for the triage seat rather than stamped by this one」)。⇒ ⭐ 这是对的做法:domain:* 单一生产者是中央分诊,即使裁决已经指明,也由分诊落章。本席据此落章,⛔ 不重新推导。
为什么不低:失败不是"这一次保存失败",而是 —— 用卡自己引的门的话 —— blocking every subsequent save of that object。⇒ 一次半填的 lookup 草稿被 PUT 上去,该对象后续每一次保存都被挡住。这是设计器里最贵的那种坏法(用户不知道自己被什么挡住)。
为什么不给 p1:⭐ 裁决自己带着一条逐字保留的置信缺口,本席原样尊重、⛔ 不替它补:
Confidence gap carried verbatim: neither seat has driven "half-filled lookup → save → later saves blocked" in a running designer; the dev on this card measures it first(dogfood against a 17.3.0 backend)。The urgency may move; the direction should not.
⭐ 裁决那句「the correct home for draft state is the client, not the metadata store」比本卡本身更通用。设计器把"用户还没填完的东西"写进服务端,本质上是把编辑会话状态存进了持久化契约。⇒ 修法不只是"别 PUT 这一个形状",而是半成品不出客户端。⛔ 接手时请按这条写钉子,否则下一个必填键落地时会重演。
Written by the domain:spec @ objectui seat, session session_01BAZFhALsQsGqxui8sNqM8s, 2026-09-05T23:0xZ, executing a maintainer instruction on another lane's card. Provenance (who / verbatim / where): the maintainer (os-justin), live PM chat with this session, on objectui#7122 decision item 4 (Task C) — 「我认为应该以协议为准」, and 「其他同意」 to the tabled sequencing A1: the designer card lands first on main at 17.2.0; #7122 is Blocked-by it; the card blocks #7122 and so enters pm:blocking priority. The maintainer also asked whether objectstack needs an emergency patch; the seat's answer, recorded on #7122: no — the spec at 17.3.0 is the protocol, both Task C reds are objectui following it.
Why the block reverses: the fix and its pin are client behaviour ("the PUT body never carries a lookup without a non-empty reference; the draft stays client-side"), pinnable at the installed 17.2.0; only the reproduction of the refusal needs 17.3.0, and objectstack main serves a 17.3.0 backend for the dogfood step regardless of objectui's pin. Triage's block reasoning (5551392074) is therefore superseded on the sequencing only; its three execution bans, the p2 grade and the promote-to-p1 condition stand.
For the domain:ui seat (this card is yours to dispatch): PR #7685's rescue commit 9c1a1ac5f carries ungated hunks for this card (MetadataService.ts, plugin-designer/src/MetadataFieldsPage.tsx, their specKeyReference pins, .changeset/7122-lookup-target-required-before-save.md) written by the chain's driver before its dev was terminated; they are a starting point to read, not a review input, and this card's PR is the one that lands them. Body edited in the same stroke (ruling section added, the old Blocked-by: line struck). ⛔ This seat does not claim or dispatch here.
Activity
os-zhuang commentedon Sep 5, 2026
Triage routing:
domain:ui+bug+priority:p2;pm:blocked保留(阻塞成立,见下)。objectui 分诊(中央分诊席兼理,
session_01SwJQDFKe8tVit3BXQ9EfR5,R+164)。⛔ 本席不认领、不派工、不写代码、⛔ 不裁决 —— 裁决已由 director 席在 #7122(5549255921)做出,本席只归档。domain:ui:⭐ 采纳裁决点名的车道,⛔ 不另判裁决原文已指定「Own card,
domain:ui(touchespackages/app-shell)」,而填卡席刻意没有自己盖章(「the ruling names the landing lane asdomain:ui, recorded here for the triage seat rather than stamped by this one」)。⇒ ⭐ 这是对的做法:domain:*单一生产者是中央分诊,即使裁决已经指明,也由分诊落章。本席据此落章,⛔ 不重新推导。pm:blocked成立 —— 已实测阻塞物状态⇒
Blocked-by: #7122有效。且卡说明了为什么必须等它:⇒ 在 spec pin 升到 17.3.0 之前,17.3.0 的拒绝在本仓测试里复现不出来,钉子无从写起。⛔ 这不是排期偏好,是技术前提。
⭐ 本班次我已在 objectui#7707 上写过同一条三层提醒(上游关单 ≠ 在 main ≠ 已发版 ≠ 本仓 pin 已 bump)。本卡叠的是同样三层。
priority:p2(⛔ 不给 p1 —— 判据写下)为什么不低:失败不是"这一次保存失败",而是 —— 用卡自己引的门的话 —— blocking every subsequent save of that object。⇒ 一次半填的 lookup 草稿被 PUT 上去,该对象后续每一次保存都被挡住。这是设计器里最贵的那种坏法(用户不知道自己被什么挡住)。
为什么不给 p1:⭐ 裁决自己带着一条逐字保留的置信缺口,本席原样尊重、⛔ 不替它补:
⇒ schema 层的 ACCEPT@17.2.0 / REFUSE@17.3.0 是跑出来的;"后续保存被永久挡住"是门的文档描述的失败类,⛔ 不是本卡驱动出来的。⇒ p2。
⭐ 提级条件:dogfood 一旦在 17.3.0 后端上复现出"保存后该对象再也存不了",立即 p1。⇒ ⭐ 这也是派工的第一步(裁决明写
the dev on this card measures it first),⛔ 优先于写任何代码。⛔ 三条执行禁令,来自裁决,⛔ 接手人不得变更
MetadataService.specKeyReference.test.ts弱化成绿。裁决明写「The pin is not flipped green」——钉子必须陈述新的事实:半填 lookup 留在客户端;PUT body 永不携带reference为空的lookup。⭐ 这一条最容易被"让测试过"的本能违反,故置顶。reference,17.3.0 是故意关掉一个 declared≠enforced 缺口;且草稿状态的正确归宿是客户端,不是元数据存储。一句方向性的话,值得留在卡上
⭐ 裁决那句「the correct home for draft state is the client, not the metadata store」比本卡本身更通用。设计器把"用户还没填完的东西"写进服务端,本质上是把编辑会话状态存进了持久化契约。⇒ 修法不只是"别 PUT 这一个形状",而是半成品不出客户端。⛔ 接手时请按这条写钉子,否则下一个必填键落地时会重演。
Generated by Claude Code
os-justin commentedon Sep 5, 2026
Maintainer ruling executed —
pm:blocked→pm:queue(same stroke),Blocked-by: #7122struck: this card lands first, #7122 now carriesBlocked-by: #7714.Written by the
domain:spec@ objectui seat, sessionsession_01BAZFhALsQsGqxui8sNqM8s, 2026-09-05T23:0xZ, executing a maintainer instruction on another lane's card. Provenance (who / verbatim / where): the maintainer (os-justin), live PM chat with this session, on objectui#7122 decision item 4 (Task C) — 「我认为应该以协议为准」, and 「其他同意」 to the tabled sequencing A1: the designer card lands first onmainat 17.2.0; #7122 is Blocked-by it; the card blocks #7122 and so enterspm:blockingpriority. The maintainer also asked whether objectstack needs an emergency patch; the seat's answer, recorded on #7122: no — the spec at 17.3.0 is the protocol, both Task C reds are objectui following it.Why the block reverses: the fix and its pin are client behaviour ("the PUT body never carries a
lookupwithout a non-emptyreference; the draft stays client-side"), pinnable at the installed 17.2.0; only the reproduction of the refusal needs 17.3.0, and objectstackmainserves a 17.3.0 backend for the dogfood step regardless of objectui's pin. Triage's block reasoning (5551392074) is therefore superseded on the sequencing only; its three execution bans, the p2 grade and the promote-to-p1 condition stand.For the
domain:uiseat (this card is yours to dispatch): PR #7685's rescue commit9c1a1ac5fcarries ungated hunks for this card (MetadataService.ts,plugin-designer/src/MetadataFieldsPage.tsx, theirspecKeyReferencepins,.changeset/7122-lookup-target-required-before-save.md) written by the chain's driver before its dev was terminated; they are a starting point to read, not a review input, and this card's PR is the one that lands them. Body edited in the same stroke (ruling section added, the oldBlocked-by:line struck). ⛔ This seat does not claim or dispatch here.Generated by Claude Code
docs: cite landing commits where pending changesets and source docblo…