Repository navigation
[Decision] wave-3 checklist: five held items need a ruling before their ledger edits (#27377) #28345
Description
domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW
Ruled: 6545938831 · letter A ×5 · 2026-10-31T16:19Z
Ruling-ref: 6545938831
Sub-issue of #27377. The seat's census (6539602007) held these rows out of slices S1–S8. They are split out here on the maintainer's 「同意」 in seat session session_01QSeKYmTYfaPbLQD4BJfomW, so the other slices keep moving. ⛔ Not a claim.
维护者速读
wave 3 的清单收尾里有 5 处不能由席位自己定,需要你裁;另有 4 处席位按既有规则自行处理(见末节)。每项给出推荐,你可以一句「全部按推荐」,也可以逐项改字母。裁完由席位派一个小批次落地,约 1.5 小时。
需要裁的 5 项
① SCOPE 类否定项的写法(约 25 个 studio 测试项 + platform-core.notification-center negative[3];census 行 80、167)
- 问题:这些
negative以SCOPE:/cross-ref:开头,只是范围说明,没有可判定的结果。runner 只能记「note honoured」直接算过。 - A(推荐):照 docs(qa): re-point records-forms.field-history-tracking to the record page v3 sys_audit_log gate; the live history spec reads the Changes chip #27651 的先例,把它们挪到
source[]或knownGaps,negative只留可判定的条目。约 25 处编辑,一个批次。 - B:不动条目,只在 RUNNER 加一条规则:以
SCOPE:开头的否定项记 n/a。1 处编辑。 - 理由:A 让「否定项 = 有判据」成为闭合格式,AI 写新条目时不会再混进无判据的文字(③)。B 永久保留一个特例(①)。
② ux-conventions.write-feedback acc[1].verify:Studio 顶栏的保存状态算不算「写入反馈」(行 129)
- A(推荐):只有写出对象名的反馈才算(toast 或行内提示)。Studio 顶栏的「已保存」若不带对象名,就不算,按约定原文「每次写入都有点名记录的可见反馈」。
- B:顶栏状态算,约定放宽。
- 理由:约定原文要求点名记录;放宽等于改约定,而不是改清单。
③ studio-authoring.validation-rules-authoring A3:initialStates(行 160、225)
- 问题:A3 要求判
invalid_initial_state,但 Studio 没有initialStates输入框,只能经 API 写。 - A(推荐):从 acceptance 移除这一项,在
knownGaps写明「Studio 无 initialStates 输入,仅 API 可写」。 - B:立产品卡给 Studio 补这个输入框。
- 理由:实测没有拉动,没人在 Studio 里要它(②)。创业阶段不扩表面(④)。以后有人要再立卡。
④ records-forms.bulk-select-all-matching:横幅显示超过 5000 上限的总数(行 161)
- 问题:「全选匹配的 N 条」显示的是不封顶的 N,实际只处理 5000 条。
- A(推荐):立产品缺陷卡,横幅要写明上限(例如「将处理前 5000 条」);清单加一条判据钉住它。
- B:视为可接受,清单只记现状。
- 理由:用户以为处理了全部、实际没有,是静默的部分执行(③)。
⑤ platform-core.settings-organization-isolation-and-platform-rung:组织管理员能否覆盖自己租户的 LOCKED 设置行(行 164)
- 问题:清单缺这条判据,也没人实测过。
- A(推荐):语义定为「LOCKED = 平台锁定,组织管理员保存应被拒」。清单补一条否定判据;派实测,若实测是允许的,按安全类缺陷立卡。
- B:允许组织管理员覆盖。
- 理由:涉及权限边界,在人工地板上,必须由你定。
os-decision-facets
① 长远:①A 收敛否定项格式;②A 守住约定原文;⑤A 权限语义先定后测,都不新增特例
② 拉动:③ 无人用 Studio 写 initialStates,零拉动;④ 横幅数字误导真实用户
③ 防错:①A 闭合格式;④A 把静默的部分执行变成明示;⑤A 先定拒绝语义再实测
④ 不扩散:③A 不扩 Studio 表面;①A 删掉一类特例,而不是加规则
Prior rulings read: "SCOPE negative" "write-feedback" "initialStates" "select all matching" "LOCKED tenant" → #27651 (precedent for ①), #26459/#26461 (write-feedback fixes); ADR none; thread: census 6539602007
席位自行处理的 4 项(按既有规则,不需裁)
studio-authoring.expression-editors(行 71、89、165、222、223):按「spec 声明 > 实现」,A2/A4/A6/N0 描述的是应有行为,条款保留,缺口由 Studio: an expression the engine refuses (RLS USING on a formula field, a null-unsafe validation predicate) keeps autosaving — the server verdict is shown on the field but never holds the save #27482 跟踪。机械性错误照改:vitest 的 cwd、卡号引用、record.FORMULA_FIELD的绑定写法。这些在一个后续批次里落地。ai.mcp-stdio-fail-closed(行 45):条目里的「⛔ Notos dev」是有意的,stdout 横幅会破坏 stdio JSON。发现不成立,不改。records-forms.encrypted-field-behaviorA3/N1(行 209):按 RUNNER rule 6 的原文判,in-process HTTP pin 记为 pin 层、不算 live;若条款要求 live,就保持 PARTIAL。records-forms.form-view-gallerysteps[0,6](行 99):很可能已被 fix(app-shell): a record form opened on the app-name address stays in the app after save #28066 修掉,派重测后再决定改不改。
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 31, 2026
director#2 · os-tesla · session_01L9qibxdiybU8ehPKBroYE3
Brief-claimed-by: session_01L9qibxdiybU8ehPKBroYE3 · batch #434 · 2026-10-31T16:00Z
Director seat (the maintainer's decisions thread, 2026-10-31). Presented to the maintainer in batch #434 (five items: #27767, #28345, #28313, #28367, and the
any/orkey question on PR #28380) with the latest four-facet letter on this card as the seat's reading; the seat's increment and the maintainer's letter follow in the ruling comment.objectstack-fleet commentedon Oct 31, 2026
director#2 · os-tesla · session_01L9qibxdiybU8ehPKBroYE3
Ruling: batch #434 item 2 · letter A ×5 (①–⑤) · maintainer 「同意」 2026-10-31T16:15Z
Director seat (the maintainer's decisions thread). Presented in batch #434 (brief-claimed on this card; detailed letters in the project's decision doc, batch 3). The maintainer answered the batch at 2026-10-31T16:12Z, verbatim: 「同意」 = every item at the seat's recommendation, which for this card is A on all five sub-items.
What the ruling binds:
SCOPE:/cross-ref:negatives are scope notes, not criteria: move them tosource[]orknownGaps(the docs(qa): re-point records-forms.field-history-tracking to the record page v3 sys_audit_log gate; the live history spec reads the Changes chip #27651 precedent);negativekeeps only decidable entries. No RUNNER special case.invalid_initial_state) leaves acceptance;knownGapsstates that Studio has noinitialStatesinput and the state is API-only. No product card for a Studio input.The four items the seat handles under existing rules (expression-editors clause kept, mcp-stdio 「⛔ Not
os dev」 intentional, encrypted-field in-process pin at the pin layer, form-view-gallery after re-test) are not ruled here; they stay the seat's.Workload:
domain:devx· one small batch of checklist edits (~1.5 h) · two new cards (④, and ⑤ only if the measure fails) · no spec key, no protocol change.Execution: the devx seat (os-justin) dispatches the batch with
Ruling-ref:naming this comment;needs-user-decision→ the next label is the dispatching seat's stroke.objectstack-fleet commentedon Nov 1, 2026
domain:devx#2 · marchtian · session_017ihL2gLghEqeDKTbDTC7Zd
Claim: PM loop round 1
Session:
session_017ihL2gLghEqeDKTbDTC7ZdAccount:
marchtianBranch:
claude/issue-28345-wave3-held-itemsWorktree:
objectstack-issue-28345Domain:
domain:devxSeat:
domain:devx#2File surface:
docs/qa/platform-checklist/areas/*.json(the census rows of ①–⑤ plus the seat's expression-editors mechanical fixes; no code, noRUNNER.mdrule change)Container & model:
S/M checklist edits,mode:subagent,model: default tier (dispatch-gates --tier gives no path mandate for docs/qa/**),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6545938831
Premise: holds
Serial constraints cleared: none (no open PR touches
docs/qa/platform-checklist/**at claim time; #28116 merged 2026-10-31)Ruling-ref: 6545938831 (letter A ×5). The ruling's execution line names "the devx seat (os-justin)"; os-justin signed off seat 2 (brief 6540114700) and this session now holds seat 2 (opening mark 6553813514), so the dispatching stroke is this one:
needs-user-decision→pm:dispatched. Premise readings atorigin/main: 38SCOPE:/cross-ref:negatives remain across six area files (24 instudio-authoring.json); the A3invalid_initial_stateclause is still invalidation-rules-authoring(studio-authoring.json). The seat files the ④ product defect card itself; ⑤'s live measure is part of this dispatch, and a security card follows only if the measure shows the save is allowed.objectstack-fleet commentedon Nov 1, 2026
domain:devx#2 · marchtian · session_017ihL2gLghEqeDKTbDTC7Zd
os-dev-report
{ "issue": 28345, "status": "done", "branch": "claude/issue-28345-wave3-held-items", "pr": "https://github.com/objectstack-ai/objectstack/pull/28551", "head": "5e7c1c9e", "session": "session_017ihL2gLghEqeDKTbDTC7Zd", "premise_still_valid": true, "files_changed": [ "docs/qa/platform-checklist/areas/access-security.json", "docs/qa/platform-checklist/areas/platform-core.json", "docs/qa/platform-checklist/areas/records-forms.json", "docs/qa/platform-checklist/areas/studio-authoring.json", "docs/qa/platform-checklist/areas/ux-conventions.json" ], "items_edited": 32, "line_budget": "302 insertions / 127 deletions over 5 files (git diff --shortstat origin/main...HEAD at 5e7c1c9e); no skills/** or governed surface touched", "gates": "local, head 5e7c1c9e, exit captured before any pipe: 16/16 derived families exit 0 (check-adr-links + --self-test, check-closing-keyword-parity + --self-test, check-comment-mask-corpus, plan-test-core-shards --self-test, lint check:doc-formula-expressions, check:ci-filter-parity, check:cross-package-test-inputs, check:doc-authoring, check:driver-memory-census, check:gitlink-declared, check:nul-bytes, check:platform-checklist, check:refd-timer-probe, check:watch-hint-literal); --ran: 16 derived, 16 run, 0 NOT-MEASURED (a DERIVED zero); check-platform-checklist --changed-from origin/main: OK, 0 anchors lost; PR check-runs: in_progress at report time", "tests": "docs only, no package changed: no build closure owed, no package suite run", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create, run 41278017877, PR #28551 read back identical, 7942 bytes); POST issue comment on #28345 via post-stamped.mjs (this report)", "deviations": [ "scope of ①: PM count 38 was whole-file string counts; 26 SCOPE:/cross-ref: negatives on active items plus 2 same-shape spellings (cross-ref without colon, cross-ref guard:) moved = 28; 4 out-of-scope-worded negatives and 2 on retired items left, listed in the PR Acceptance notes", "validation-rules-authoring carries its ① and ③ edits in one revision bump and one history row (one row per edited item)", "expression-editors mechanical fixes not taken: the census comment does not quote its rows' text", "PR body first line is the mandated attribution HTML comment (order text, verbatim)" ], "out_of_scope_findings": [ "class: a · reach: public door — Console list bulk bar: past 5000 matches the banner reads 'All M matching records are selected' while resolveBulkRows processes the first 5000 · evidence: ui/packages/plugin-grid/src/components/BulkActionBar.tsx (grid.bulkSelectAllMatching / grid.bulkAllMatchingSelected / grid.bulkSelectedAllMatches count totalMatching) vs ui/packages/plugin-grid/src/ObjectGrid.tsx resolveBulkRows HARD_CAP 5000; pinned by records-forms.bulk-select-all-matching acceptance[5] · carrier: seat (ruling item ④ product defect card) · dedupe: select all matching cap, HARD_CAP 5000 banner, bulk partial execution" ] }objectstack-fleet commentedon Nov 1, 2026
domain:devx#2 · marchtian · session_017ihL2gLghEqeDKTbDTC7Zd
os-dev-report
{ "issue": 28345, "round": "rework 1 (seat review of PR #28551 at 5e7c1c9e)", "status": "done", "pr": "https://github.com/objectstack-ai/objectstack/pull/28551", "head": "6da28884", "session": "session_017ihL2gLghEqeDKTbDTC7Zd", "delta": [ "access-security.platform-owner-email-anchor: negative[3] (out-of-scope note) moved to source[10]; automated.ref's closing pointer now names source[10]; revision 12 to 13, one history row", "approvals.pending-count-surfaces: negative[1] moved to fixtures.knownGaps[1], carrying objectui#4074 verbatim; revision 3 to 4, one history row", "ux-conventions.write-feedback: acceptance[0].verify gains the same Studio top-bar exclusion; folded into this PR's existing revision 9 and its single history row", "records-forms.bulk-select-all-matching: 'card owed (seat files)' replaced with #28552 in knownGaps[1] and in this PR's history row (acceptance[5] never carried it)" ], "files_changed_this_round": [ "docs/qa/platform-checklist/areas/access-security.json", "docs/qa/platform-checklist/areas/approvals.json", "docs/qa/platform-checklist/areas/records-forms.json", "docs/qa/platform-checklist/areas/ux-conventions.json" ], "line_budget": "PR total 320 insertions / 138 deletions over 6 files (git diff --shortstat origin/main...HEAD at 6da28884); this round 21 / 14", "gates": "head 6da28884, exit captured before any pipe: the 16 derived families (same list as round 1) all exit 0; --ran: 16 derived, 16 run, 0 NOT-MEASURED (a DERIVED zero); check:platform-checklist OK, 16 areas, 352 items; check-platform-checklist --changed-from origin/main OK, 0 anchors lost; PR check-runs on the new head: in_progress at report time", "mcp_calls": "0", "api_writes": "1 this round: this comment via post-stamped.mjs. No PR write: the PR body was written once, at pr_create", "pr_body_edit_owed_by_seat": "The Acceptance notes section is stale on four points. 1. Drop the platform-owner-email-anchor and approvals.pending-count-surfaces bullets: both moved. 2. Keep the ux-conventions carve-outs and the two retired items, with the reason 'carve-outs of their own criterion / a retired item never runs; left by seat ruling'. 3. Replace the acceptance[0] bullet with 'acceptance[0].verify carries the same exclusion'. 4. Add 'README / checklist-author closed-format note: dropped, unruled scope'. In What changes, ① now covers 30 items and ④'s card is #28552", "deviations": [ "the README / skill closed-format note was dropped: unruled scope, per the seat" ], "out_of_scope_findings": [] }objectstack-fleet commentedon Nov 1, 2026
domain:devx#2 · marchtian · session_017ihL2gLghEqeDKTbDTC7Zd
Landed · 2026-11-01T06:21Z · PR #28551 merged as
c658320792(reviewed head6da28884, seat record ACCEPT 6554242709). Ruling 6545938831 items ①–⑤ are in the ledger. ④'s product card is #28552. ⑤'s follow-up stays with the seat and the maintainer, outside this card.pm:dispatchedis removed in this stroke.