Repository navigation
docs(checklist, north-star): retire records-forms.picklist-org-append — the per-organization picklist append is ruled out - #22982
Conversation
… — per-organization picklist append is ruled out The maintainer ruled the per-organization picklist append out rather than deferring it, and ADR-0131 D6 had already retired the per-organization overlay axis it depended on. Three declarations still promised it: - records-forms.json: picklist-org-append goes planned -> retired with a retiredReason (no supersededBy: nothing succeeds it); the row and its fields stay as history. The sibling picklist-shared-across-objects no longer cites a sentence it "splits" with a retired item (revision 2). - coverage.json: the picklist waiver names only the phase-1 item and no longer promises an organization item beside it. - NORTH-STAR.md: the shared-option-set row drops the per-organization append clause and the retired id. No product code; the append is not re-scoped to environment level. Claude-Session: https://claude.ai/code/session_01CinRQcE6T8SvMbhH8D3NhS Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CinRQcE6T8SvMbhH8D3NhS Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Scope: the governed rule-text face — ① Derived judgments
② Semver levelNo published package ships any of the three paths (the dev read 70 non-private manifests' ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)· PR #22982 · #22869席位 1( 改了什么:「按组织追加 picklist 值」从两处撤掉。测试清单里那条 planned 条目改为 为什么改:你 2026-10-11 的直令「按组织追加 picklist 值,不考虑」;ADR-0131 D6 早已退役按组织覆盖这条轴。清单与北极星还把它写成待做需求,会误导后来者。直接撤,不改成按环境追加。 风险与代价(含回滚):纯文本三文件,运行时零影响;回滚 = revert 本 PR。一个已知代价:清单校验器 席位意见:ACCEPT。契约复核(达档、在席)PASS 已贴本 PR;CI 在本 head 34 项 success/skipped,Lint & Repo Gates 复核时仍在跑,无红。一处当众更正:派发令假设「退役不需要动校验器」,dev 实测证伪(详见 #22869 的 ACCEPT 评论),处置是另开子卡,不在本 PR 发明数据。dev 顺手量到:覆盖率豁免说明的另一半也过时了(picklist 运行时层已落地),归下一次 coverage sweep,不在本卡。 你要做的:看一眼北极星第 43 行改后的写法;同意即给一个 APPROVED review。落地由席位走队列,且在 #22987 合入之后。 Generated by Claude Code |
Fixes #22869
Clause-②: no — the three paths are the North Star text and the platform-checklist ledger; no published schema, accept set or public surface is touched (no
packages/**path).Retires the per-organization picklist append everywhere it is still promised. The maintainer's direct order (filing gate ③ on #22869, 2026-10-11), verbatim: 「按组织追加 picklist 值,不考虑」. ADR-0131 D6 had already retired ADR-0005's per-organization overlay axis the item depended on (
docs/adr/0131-total-organization-ownership-no-null-organization-id.md: "ADR-0005's per-organization overlay axis is retired, sosys_metadataneeds no split (D6)"). No product code; the append is not re-scoped to environment level.Per file
docs/qa/platform-checklist/areas/records-forms.jsonrecords-forms.picklist-org-append:statusplanned → retired,retiredReasonadded (the ruling quoted, ADR-0131 D6, "no successor", "not moved to environment level"). NosupersededBy: nothing succeeds the capability, and neither the README nor the validator demands one. The row and every field (personas,fixtures,negative,source) stay as history, per the README's Lifecycle → Retire rule.revision1 → 2 with ahistoryentry, following the README's Change rule and the two retired precedents indashboards.json(both bumped on retire). The validator does not decide this: its revision check is consistency-only (revisionequals the lasthistoryentry). Measured both ways: unbumped gives the same 10 problems, with no revision complaint.records-forms.picklist-shared-across-objects: the#18164design-of-recordsourcecitation no longer says it "splits" the verification sentence with the retired item. Now: "…and the verification sentence, which is now this item's alone: its per-organization half left with records-forms.picklist-org-append, retired by platform-checklist + NORTH-STAR: retirerecords-forms.picklist-org-appendand the "customers append values per organization" promise — the per-organization picklist append is ruled out #22869 as ruled out". The#18164pointer and the rest of the text are unchanged.revision1 → 2 with a "source citation only"historyentry. No clause, negative or fixture moved.docs/qa/platform-checklist/coverage.json: thepicklistkind'swaivedtext names onlyrecords-forms.picklist-shared-across-objects("the phase-2 per-organization overlay is ruled out, #22869, and no item carries it"). Its closing promise "the planned organization item beside it" is dropped. Nothing else in the waiver changed (see Acceptance notes).docs/NORTH-STAR.md: one row (line 43), nothing else.Before:
After:
No committed generated census exists: the README's "Implementation status" section says there is no
STATUS.mdin this tree and no gate paired with one. The wiki page is regenerated on a schedule bychecklist-status.yml. A localpnpm gen:checklist-status(stdout only, tree left clean) now readsrecords-forms 41 active / 1 planned(it was 41 / 2), and the retired item is in neither total.Gates — run on the final commit
57ef232b7node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 14 commands from this change set. All 14 ran, pluspnpm check:pm-governed-prose.--ranreconciliation:✓ dispatch-gates --ran: 14 derived famil(ies) accounted for — 14 run, 0 NOT-MEASURED.node scripts/check-ci-filter-parity.mjsOK: all 21 build input(s) turbo.json declares outside the packages …node scripts/check-closing-keyword-parity.mjscheck-closing-keyword-parity: OK (3 parsers agree on all 9 keywords …)node scripts/check-closing-keyword-parity.mjs --self-test✓ … 40 assertions, 5 mutations of the shipped parsers each driven to red.node scripts/check-comment-mask-corpus.mjs✓ comment-mask corpus sweep …: 8834 files, 0 disagree, 0 unparseablepnpm --filter @objectstack/lint run check:doc-formula-expressions✓ check:doc-formula-expressions …: 15 predicate(s) … judged clean(first run exited 3, PREREQUISITE NOT MET, until@objectstack/formula+@objectstack/lintwere built)pnpm check:cross-package-test-inputsOK: 30 package(s) read outside themselves, all declared …pnpm check:doc-authoring✓ doc authoring guard: … no growth, no burn-down unrecorded.pnpm check:driver-memory-censuscheck-driver-memory-census: OK — every declaration is ledgered …pnpm check:gitlink-declaredcheck-gitlink-declared: OK (11005 index entries -- 0 gitlink(s) …)pnpm check:nul-bytescheck-nul-bytes: OK (scanned 10996 text file(s) … no raw ASCII control bytes).pnpm check:platform-checklistcheck-platform-checklist: 10 problem(s). Base117817ec2reads 8. The 2 new ones are explained belowpnpm check:pm-governed-merges✓ check-governed-merges --self-test: 476 assertions …pnpm check:refd-timer-probeOK check-refd-timer-probe: 8828 source file(s) swept …pnpm check:watch-hint-literal✓ check-watch-hint-literal: 72 declaration(s) across 4 rostered name(s) …pnpm check:pm-governed-prose✓ check-governed-prose: 2 instruction surface(s) name all 6 registered governed surfaces …check:platform-checklist— what is red, and whose it is117817ec2is already red, with 8 problems. All 8 are symbol anchors inaccess-security.json,attachments-storage.jsonandsearch.json, none in the files this PR touches. That red belongs to the watchdog (platform-checklist-watchdog.yml), and this gate is not per-PR CI."since" must be the release that introduced the capabilityand"steps" must be a non-empty array of strings. The cause is in the checker, not the row.scripts/check-platform-checklist.mjs#statusFieldProblemsgivesplannedits own branch, and judges every other status (retiredincluded) by the active rule. An item retired before it was ever implemented can satisfy that only with an invented release and invented steps. The README's Retire rule asks only forstatus: "retired"+retiredReason. Per the dispatch, the checker is not edited here, and nothing is invented to satisfy it. The fix is filed separately by the seat.maps to retired item(the 2 above plus the 8 at base). The current text gives the same 10. So awaivedprose mention is not a mapping: themaps to retired itemcheck reads only an entry'sitemsarray.No changeset: no published package's
files[]ships any of the three paths (70 non-private manifests read: 0 entries name them). The onlypackages/**mentions are two source comments citing the paths.skip-changesetis applied after this PR opens.维护者速读(草稿)
改了什么
「按组织追加 picklist 值」这件事,从测试清单和北极星两处撤掉。清单里那条 planned 测试项改成「已退役」。它的记录照留,只是不再算作待做。另外两处引用它的地方(同族的共享选项集测试项、覆盖率豁免说明)改成不再提它。北极星「共享选项集」那一行去掉「客户按组织追加值而不改应用源码」,只保留「多个对象复用同一份选项」。没有改任何产品代码。
为什么改
您 2026-10-11 的裁决:「按组织追加 picklist 值,不考虑」。ADR-0131 D6 早已取消「按组织覆盖元数据」这条轴,这条需求已没有落脚处。清单和北极星还写着,会让后来的人以为这是待做的需求。这次是直接撤掉,不是改成「按环境追加」。
风险与代价(含回滚)
只改文档和测试清单,不影响运行中的任何功能。一个已知代价:清单校验器目前不接受「从未实现就退役」的测试项,会多报 2 条错(主干原本已有 8 条与本 PR 无关的错)。建议先修校验器,修复单由席位另开,再合本 PR。回滚就是 revert 这个 PR,三个文件都是纯文本。
席位意见
你要做的
看一眼北极星第 43 行改后的写法是否合您的意。确认后批准(APPROVED review)或直接合并。最好等校验器修复单合入之后再合。
Acceptance notes
picklistwaiver incoverage.jsonis stale beyond what this PR touches. It still says "No runtime reads a picklist … PENDING the runtime layer (picklist metadata kind — runtime: resolvepicklist→ options when serving field metadata, validate writes against the resolved set, apply package-level extensions (phase 1 of objectstack#18164) #19519)", but the runtime layer landed in88b484e00(feat(objectql): resolve picklist references at runtime — served options, additive extensions, write validation, load-time refusal #21047).packages/spec/liveness/picklist.jsonnow gradesnamelive (evidencepackages/objectql/src/registry.ts#resolvePicklistOptions), andscripts/check-stack-collection-maps.mjsno longer carries picklist rows as PENDING. Sorecords-forms.picklist-shared-across-objectsmay now be drivable, and promotable after a passing run. Re-authoring the waiver and the item belongs to the next coverage sweep (SWEEP.md re-audits every waiver), not to this retire. Carrier: none named.Generated by Claude Code