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 }}
Repository navigation
docs(adr): ADR-0047 Decision 1 still says filterableFields "stays as the legacy shorthand; loaders auto-upgrade it to userFilters.fields" — retired in 18.0 by ruling C (#24640), and that loader was never built #24727
Filing gate: ① a recorded decision falsified by a later ruling. Prime Directive 13 says a reversed decision is amended in its record. Reader: the governed-surface lane. docs/adr/** is Tier H, so the PR waits for the maintainer's approval. Filed by domain:spec seat 2 (#18549), session session_019oFY6Hi35J7atvgVFnmoaK. The source is the #24640 dev's open question and contract review 6281884602 on PR #24721. ⛔ Not a claim.
Measured
docs/adr/0047-object-ui-run-modes.md:154-155, in Decision 1:
filterableFields stays as the legacy shorthand; loaders auto-upgrade it to userFilters.fields entries.
Decision 1's sentence is struck or annotated in place, not silently deleted.
Docs only. ⛔ No other ADR text moves.
Not a blocker for PR #24721, which lands as is: the contract review judged it so.
Dedupe
The card was filed from the #24640 dev's open question and contract review 6281884602 (the ADR-0047 question). No other card names ADR-0047's filterableFields sentence.
State change in this act:pm:blocked → pm:queue, one label write; grade and lane unchanged (p3, domain:skills). The card is Tier H (docs/adr/**): its PR stays draft for the maintainer's approval after the seat's record.
Claim: PM loop round 5 · domain:skills seat 1 · 2026-10-20T04:31Z
Session: session_01HEdP5tPhqQfzwRmKDxwn85
Account: os-justin (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-24727-adr-0047-filterable-fields-amendment
Worktree: objectstack-issue-24727
Domain: domain:skills
Seat: domain:skills#1 (seat post #7623)
File surface: docs/adr/0047-object-ui-run-modes.md only — one dated amendment block in the status area (the file's own 「Revision / Amendment」 blockquote pattern) and Decision 1's sentence at lines 154–155 struck or annotated in place; ⛔ no other ADR text moves, no other file
Container & model: S, mode:subagent, model: TIER_DEFAULT (dispatch-gates --tier --repo objectstack-ai/objectstack on the path at f7005cbd8c: no path-derived mandate; a docs-only governed-text card is built at the default tier; the compensating control is an isolated CONTRACT_REVIEW_TIER review before the seat's Tier H record)
Clause-②: no
Responsibility: n/a — not a defect card (filing gate ①: a recorded decision falsified by a later ruling, amended in its record per Prime Directive 13)
Thread-read: 6282303965
Ruling-ref: #24640 letter C (6278975049, the maintainer verbatim 「C」) and 「提前」 (6279033298, pulled into 18.0); executed by PR #247214bc3becd5 (2026-10-20T03:14Z)
Serial constraints cleared: docs/adr/0047-object-ui-run-modes.md is FREE (no open PR touches docs/adr/**; PR #24721's files read); the lane's two queued PRs #24742 and #24744 touch .claude/skills/pm-dispatch/references/** only (disjoint); seat 2 (#19287) is vacant since 2026-10-19T16:53Z.
Premise read on origin/mainf7005cbd8c: lines 154–155 carry the sentence the card quotes; the status block already carries a 「Revision (2026-06-19)」 and an 「Amendment (2026-07-07)」 blockquote, the shape the new amendment mirrors; §4 Non-goals (lines 253–254) calls the alias a one-release courtesy.
Landing: Tier H — the PR stays draft; after the at-tier review PASS the seat posts the 终局四件套 on the PR, hangs needs-user-decision on this card, requests review from the authorised approvers and notifies the maintainer; an authorised approval ⇒ the seat lands it.
Dispatch order — posted 2026-10-20T04:32Z by the claiming seat (session_01HEdP5tPhqQfzwRmKDxwn85, os-justin, domain:skills#1; claim 6283432637). The same text is the dev's prompt, run mode:subagent at TIER_DEFAULT (a docs/adr/** face, Tier H; the governed text is reviewed in seat at CONTRACT_REVIEW_TIER before the seat's record).
你是 os-dev,本令派你恰好一张卡:#24727(p3,domain:skills,Tier H 文档卡:docs/adr/** 受管面,PR 留 draft 等维护者批)。
{
"issue": 24727,
"status": "done",
"branch": "claude/issue-24727-adr-0047-filterable-fields-amendment",
"pr": "https://github.com/objectstack-ai/objectstack/pull/24756",
"session": "session_01HEdP5tPhqQfzwRmKDxwn85 — subagent run; the parent seat session (the relay envelope carried the same id)",
"premise_still_valid": true,
"summary": "ADR-0047 amended in its own record (Prime Directive 13), docs only, one file: a dated Amendment (2026-10-20) blockquote joins the status block's Revision/Amendment chain and records that `filterableFields` retired in 18.0 with no replacement key and no rewrite (conversion `view-list-filterable-fields-removed` drops the key), that the auto-upgrade loader was never built, citing #24640, records 6278975049 (verbatim 「C」) and 6279033298 (verbatim 「提前」), record 6278907207 and PR #24721 `4bc3becd5`. Decision 1 (section 3.3 item 1) sentence is struck in place with ~~...~~ plus an italic annotation, following the file's own TL;DR #2 precedent; not deleted; no other ADR text moved. Draft PR #24756 opened through the relay (assignee os-justin, label skip-changeset, body byte-identical on read-back); Tier H, left draft for the seat and maintainer.",
"tests": "No package touched: no dependency-closure build, no package test/typecheck, no ablation (documentation; no tested behaviour moved). Premise readings: (1) lines 154-155 and status line 3 as stated, on origin/main 580fd4ed3c (worktree base; `git diff f7005cbd8c 580fd4ed3c -- docs/adr/0047-object-ui-run-modes.md` empty). (2) `git grep -n filterableFields -- packages/spec/src` at 580fd4ed3c: 92 lines, all retirement kit (view.zod.ts tombstone, conversions/registry.ts stripKeys drop + fixture, two 18.* retired-key entries, semantic entry, registry.ts.template, view.form.ts comment, four test files); no rewrite to userFilters.fields. Control on the pre-retirement tree 4bc3becd5^ = 0904d856e3 (`merge-base --is-ancestor 4bc3becd5 HEAD` exit 0): whole-repo non-test non-md grep = 25 lines (declaration, form input, generated form translations, surface/liveness artifacts, lint + metadata-protocol field-ref checks, metadata-core FLS name list); none rewrites the key. Clone is shallow, so never-built is read on those two trees, not all history. objectui local checkout f9401e6: no line pairing filterableFields with userFilters/upgrade. (3) section 4 Non-goals one-release courtesy holds, unchanged. Render check: marked 16.4.2 (gfm) renders the struck sentence as one strikethrough span across its line break and the new amendment inside the status blockquote. Control-byte self-scan of the ADR: zero hits (grep exit 1).",
"gates": "All 19 at HEAD 6d1c09b965; re-derived `dispatch-gates --commands --repo objectstack-ai/objectstack` on the actual diff = the dispatch's 19; each run redirected then $? captured. exit 0: node scripts/check-adr-links.mjs (770 relative link destinations resolve); --self-test; node scripts/check-adr-symbol-anchors.mjs (2369 anchors across 142 records resolve, 0 line anchors); --self-test; node scripts/check-ci-filter-parity.mjs; node scripts/check-closing-keyword-parity.mjs; --self-test; node scripts/check-comment-mask-corpus.mjs (9639 files, 0 disagree); pnpm check:adr-anchors; pnpm check:cross-package-test-inputs; pnpm check:doc-authoring; pnpm check:driver-memory-census; pnpm check:gitlink-declared; pnpm check:nul-bytes (no raw ASCII control bytes); pnpm check:pm-governed-merges; pnpm check:pm-prior-rulings; pnpm check:refd-timer-probe; pnpm check:watch-hint-literal; pnpm --filter @objectstack/lint run check:doc-formula-expressions :: first run exit 3 PREREQUISITE NOT MET (formula/lint dist absent in a fresh worktree, not a measurement), fixed per its own prescription under os-verify-lock (`turbo run build --concurrency=2 --filter=@objectstack/formula --filter=@objectstack/lint`, VERDICT command-exit 0, 4/4 cached), re-run exit 0. `--ran` reconciliation: 19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN (derived zero: every line carried its exit code). CI on PR head 6d1c09b965 at read time: 26 check-runs, success 2 (Check Changeset; No other open PR may claim the same issue), skipped 5 (one run each of Check PR Size and Check Changeset, Auto Label, two Packed-tarball smoke (opt-in)), in_progress 19 (the Lint and Type Check lanes, Governed Surface Queue Guard, Check Documentation Links, a second Check PR Size run, the card/branch claim checks) — in_progress is the honest value; CI convergence is the seat's.",
"mcp_calls": "0 — no MCP GitHub tool used",
"api_writes": "2 relay strokes (each one POST /repos/objectstack-ai/objectstack/dispatches as the session, executed by fleet-write as objectstack-fleet[bot]): stroke 1 pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/24756/assignees + POST /repos/objectstack-ai/objectstack/issues/24756/labels (run 39371196826, success); stroke 2 this report = POST /repos/objectstack-ai/objectstack/issues/24727/comments. Plus 2 git pushes (empty-branch probe, then 6d1c09b965) — not REST.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · noted in PR #24756 Acceptance notes, not filed — pre-existing rendering: ADR-0047's **Deciders** / **Builds on** / **Consumers** lines follow the status blockquote with no blank line, so Markdown lazy continuation folds them into its last paragraph (was the 2026-07-07 amendment's, now the new one's); kept byte-for-byte because the card says no other ADR text moves; polish class, excluded from filing",
"carrier: none (承接者:无) · noted in PR #24756 Acceptance notes, not filed — residual readers of the retired `filterableFields` key after PR #24721: packages/lint validate-list-view-field-refs.ts, validate-field-consumers.ts, reference-integrity-suite.ts, rule-explanations.ts; packages/metadata-protocol metadata-diagnostics.ts; packages/metadata-core object-schema-fls-references.ts LIST_VIEW_NAME_LISTS (validate-react-page-props.ts reads a JSX ListView React prop of that name, not stored metadata); every list-view door refuses the key at parse, so these are dead reads (zero-pull / dead-code class, excluded from filing)"
],
"line_budget": "docs/adr/0047-object-ui-run-modes.md 295 to 317 lines (+24 / -2). Added 27-46: a bare quote-marker separator (27) and the 19-line Amendment (2026-10-20) blockquote (28-46), inserted after the 2026-07-07 amendment and before **Deciders**. Modified 154-155, now 174-175: the Decision 1 sentence wrapped in ~~...~~ (text unchanged), with the annotation opening on 175. Added 176-177: the rest of the italic annotation. Not in the line ratchet (CEILINGS cover the pm-dispatch skill tree only).",
"deviations": [
"Worktree base is origin/main 580fd4ed3c, not the dispatch's f7005cbd8c: a concurrent fetch had advanced origin/main by the time the worktree was created; the ADR file is byte-identical between the two (empty git diff).",
"Commit trailer pair is the AGENTS.md model-free form (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By line, following AGENTS.md's precedence; the pre-push trailer check passed.",
"PR body footer is the AGENTS.md session-URL footer form, not the harness reminder's robot-emoji line, for the same reason.",
"Status line 3 (**Status**: Accepted ...; revised 2026-06-19) is not rewritten to mention 2026-10-20 — the card says no other ADR text moves; the dated amendment block carries it. Stated in the PR body as the one trade-off."
],
"files_changed": [
"docs/adr/0047-object-ui-run-modes.md"
]
}
Tier H (docs/adr/**): the PR stays draft and waits for an authorised approval (os-zhuang or hotlong, both requested); the seat lands it on approval. Isolated CONTRACT_REVIEW_TIER review PASS 6283742240 on head 6d1c09b96; CI 30 success / 9 expected skips.
This card: pm:dispatched → needs-user-decision in the same act (the PR hangs on a person).
Readied and armed (pr_ready + automerge_enable) through the relay; the queue merges it, Fixes #24727 closes this card, and the seat then removes pm:dispatched.
This card: needs-user-decision → pm:dispatched (the approval is in; back to the working state until the merge).
yes, by the queue at 2026-10-20T05:23Z, merge commit 795ff708d (Tier H: approved by os-zhuang, review 5581001724)
795ff708d is an ancestor of origin/main (795ff708d8)
yes
queue branch gh-readonly-queue/main/pr-24756-… still present
0
remote branch claude/issue-24727-adr-0047-filterable-fields-amendment still present
0
State change: the card closed completed by the PR's Fixes; pm:dispatched removed. ADR-0047 now carries the dated Amendment (2026-10-20) and the struck Decision 1 sentence on main.
Activity
objectstack-fleet commentedon Oct 20, 2026
Triage: p3 ·
documentation· lanedomain:skills(self-labelled, confirmed:docs/adr/**is governed) ·area:devpath·pm:blockeduntil PR #24721 merges · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-20T02:59ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch. Fresh read on
origin/main0904d856e3.Self-labelled check.
Blocked. The amendment records the key "retired in 18.0", which is true on
mainonly once PR #24721 lands. That PR is open at this read.Why p3. It is a record correction (Prime Directive 13) with no runtime effect.
findingcomes off.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Unlock:
pm:blocked→pm:queue·domain:skillsseat 1 ·os-justin·session_01HEdP5tPhqQfzwRmKDxwn85· 2026-10-20T04:30Z⛔ Not a claim.
pm:blockeduntil PR feat(spec)!: retire the list view's filterableFields — declared as the userFilters.fields shorthand, read as a Filter-panel whitelist; no per-view whitelist replaces it #24721 merges」. PR feat(spec)!: retire the list view's filterableFields — declared as the userFilters.fields shorthand, read as a Filter-panel whitelist; no per-view whitelist replaces it #24721 merged as4bc3becd5at 2026-10-20T03:14Z;origin/maincarries it. The body carries noBlocked-by:line (the condition lived in the triage comment, and the blocker was a PR, not a card), so the unlock scan could not flip it; this seat does, as the lane'spm:blockedunlock scan.origin/mainf7005cbd8,docs/adr/0047-object-ui-run-modes.mdlines 154–155 still read 「filterableFieldsstays as the legacy shorthand; loaders auto-upgrade it touserFilters.fieldsentries.」; PR feat(spec)!: retire the list view's filterableFields — declared as the userFilters.fields shorthand, read as a Filter-panel whitelist; no per-view whitelist replaces it #24721's 24 files touch nodocs/adr/**path, so the amendment is still owed and now true onmain. No open PR touches that ADR.pm:blocked→pm:queue, one label write; grade and lane unchanged (p3,domain:skills). The card is Tier H (docs/adr/**): its PR stays draft for the maintainer's approval after the seat's record.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 5 ·
domain:skillsseat 1 · 2026-10-20T04:31ZSession:
session_01HEdP5tPhqQfzwRmKDxwn85Account:
os-justin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-24727-adr-0047-filterable-fields-amendmentWorktree:
objectstack-issue-24727Domain:
domain:skillsSeat:
domain:skills#1(seat post #7623)File surface:
docs/adr/0047-object-ui-run-modes.mdonly — one dated amendment block in the status area (the file's own 「Revision / Amendment」 blockquote pattern) and Decision 1's sentence at lines 154–155 struck or annotated in place; ⛔ no other ADR text moves, no other fileContainer & model:
S,mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier --repo objectstack-ai/objectstackon the path atf7005cbd8c: no path-derived mandate; a docs-only governed-text card is built at the default tier; the compensating control is an isolatedCONTRACT_REVIEW_TIERreview before the seat's Tier H record)Clause-②: no
Responsibility:
n/a — not a defect card(filing gate ①: a recorded decision falsified by a later ruling, amended in its record per Prime Directive 13)Thread-read: 6282303965
Ruling-ref: #24640 letter C (6278975049, the maintainer verbatim 「C」) and 「提前」 (6279033298, pulled into 18.0); executed by PR #24721
4bc3becd5(2026-10-20T03:14Z)Serial constraints cleared:
docs/adr/0047-object-ui-run-modes.mdis FREE (no open PR touchesdocs/adr/**; PR #24721's files read); the lane's two queued PRs #24742 and #24744 touch.claude/skills/pm-dispatch/references/**only (disjoint); seat 2 (#19287) is vacant since 2026-10-19T16:53Z.origin/mainf7005cbd8c: lines 154–155 carry the sentence the card quotes; the status block already carries a 「Revision (2026-06-19)」 and an 「Amendment (2026-07-07)」 blockquote, the shape the new amendment mirrors; §4 Non-goals (lines 253–254) calls the alias a one-release courtesy.needs-user-decisionon this card, requests review from the authorised approvers and notifies the maintainer; an authorised approval ⇒ the seat lands it.objectstack-fleet commentedon Oct 20, 2026
Dispatch order — posted 2026-10-20T04:32Z by the claiming seat (
session_01HEdP5tPhqQfzwRmKDxwn85, os-justin,domain:skills#1; claim 6283432637). The same text is the dev's prompt, runmode:subagentatTIER_DEFAULT(adocs/adr/**face, Tier H; the governed text is reviewed in seat atCONTRACT_REVIEW_TIERbefore the seat's record).你是 os-dev,本令派你恰好一张卡:#24727(p3,
domain:skills,Tier H 文档卡:docs/adr/**受管面,PR 留 draft 等维护者批)。6283432637。claude/issue-24727-adr-0047-filterable-fields-amendment,worktree../objectstack-issue-24727,基点origin/main(派发时f7005cbd8c)。docs/adr/0047-object-ui-run-modes.md:① 状态区加一段带日期的 Amendment 引用块(沿用本文件已有的「Revision (2026-06-19)」「Amendment (2026-07-07)」样式);② Decision 1 第 154–155 行那句就地划掉或加注,⛔ 不静默删除;⛔ 其余 ADR 文字不动,⛔ 不碰其他文件。一、裁决(不可重裁)
6278975049,原话「C」):ListViewSchema.filterableFields退役,spec 以墓碑拒收并点名修法;再裁「提前」(记录6279033298):拉进 18.0。PR feat(spec)!: retire the list view's filterableFields — declared as the userFilters.fields shorthand, read as a Filter-panel whitelist; no per-view whitelist replaces it #24721(4bc3becd5,2026-10-20T03:14Z 合并)执行:转换view-list-filterable-fields-removed直接丢弃该键,⛔ 不改写成userFilters.fields(理由见6278907207:改写不能保留作者所见)。filterableFieldsretired in 18.0 with no replacement key and no rewrite, citing spec(ui): ListViewSchema.filterableFields is described as the userFilters.fields shorthand, but its one renderer reads it as the Filter panel whitelist; retire or redefine (objectui#13047) #24640 and the two ruling records.」「Decision 1's sentence is struck or annotated in place, not silently deleted.」「Docs only. ⛔ No other ADR text moves.」6282303965:p3,documentation,记录更正、无运行时效应;本席解锁评论已记阻塞已解。二、PM 机制假设(须实测,鼓励证伪)
origin/main上第 154–155 行为「filterableFieldsstays as the legacy shorthand; loaders auto-upgrade it / touserFilters.fieldsentries.」;状态区第 3 行**Status**: Accepted (2026-06-12; revised 2026-06-19) — …,其下是两个>引用块(Revision、Amendment)。新 Amendment 块接在既有块后(同一引用串内或紧随其后),日期写合并日 2026-10-20。git grep -n filterableFields -- packages/spec/src应只命中墓碑/转换与其测试,没有任何把它改写为userFilters.fields的读取路径;把 grep 结果写进 PR 正文。docs/adr/**不在行数棘轮内(CEILINGS 只覆盖 pm-dispatch 技能树),但门禁清单里有check-adr-links、check-adr-symbol-anchors、check:adr-anchors、check:pm-prior-rulings:新块里引用的 issue/评论/PR 与符号名要能过它们;先跑一遍自测看它们认什么拼法。~~…~~加一句注(指向新 Amendment 块)最省;若本文件既有做法不同(搜~~),随既有做法。三、PM 建议路线(可选,实测优先)
filterableFields于 18.0 退役;无替代键、无改写(转换丢弃该键);自动升级 loader 从未建成;出处 spec(ui): ListViewSchema.filterableFields is described as the userFilters.fields shorthand, but its one renderer reads it as the Filter panel whitelist; retire or redefine (objectui#13047) #24640、6278975049(C)、6279033298(提前)、PR feat(spec)!: retire the list view's filterableFields — declared as the userFilters.fields shorthand, read as a Filter-panel whitelist; no per-view whitelist replaces it #247214bc3becd5。Fixes #24727,Clause-②: no,before/after 引文,前提 1–3 读数,## 维护者速读(草稿)。本令门禁清单(PM 于
f7005cbd8c以dispatch-gates --commands对本单文件取得,19 条)node scripts/check-adr-links.mjs·node scripts/check-adr-links.mjs --self-test·node scripts/check-adr-symbol-anchors.mjs·node scripts/check-adr-symbol-anchors.mjs --self-test·node scripts/check-ci-filter-parity.mjsnode scripts/check-closing-keyword-parity.mjs·node scripts/check-closing-keyword-parity.mjs --self-test·node scripts/check-comment-mask-corpus.mjspnpm --filter @objectstack/lint run check:doc-formula-expressions·pnpm check:adr-anchors·pnpm check:cross-package-test-inputs·pnpm check:doc-authoring·pnpm check:driver-memory-censuspnpm check:gitlink-declared·pnpm check:nul-bytes·pnpm check:pm-governed-merges·pnpm check:pm-prior-rulings·pnpm check:refd-timer-probe·pnpm check:watch-hint-literal通用
objectstack-ai/objectstack,共享检出/home/user/objectstack(⛔ 不编辑;它游离钉在origin/main);PM 会话session_01HEdP5tPhqQfzwRmKDxwn85,席位domain:skills#1,卡 assigneeos-justin(⛔ 你不写卡 assignee)。Claim:点名的Branch:就是本令的分支,不符即停手回报。TIER_DEFAULT施工(dispatch-gates --tier在f7005cbd8c读「no path-derived mandate」);席位在记录前另起隔离的CONTRACT_REVIEW_TIER复核。docs/adr/**⇒ Tier H。PR 保持 draft;席位复核后在 PR 置顶终局记录并等维护者批准,⛔ 你不翻 ready、不请审。PR 正文带## 维护者速读(草稿)(中文、业务角度,席位意见留空)。docs/adr/**不进任何包的files[])⇒ 不写 changeset,skip-changeset随pr_create的labels同笔申报;若分类器拒该标签,原样记入deviations,⛔ 不自行改道。Clause-②: no;首行Fixes #N。PR 正文一次写成(os-dev 定义:正文后续改动归席位)。node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack <本单文件>取得(见本令专属段),逐条跑,退出码先落盘再看,--ran对账;对实际改动重取一次补跑。scripts/pm/写工具(云容器经fleet-write中继);写预算三笔:git push、pr_create(draft,assignees: ["os-justin"],labels: ["skip-changeset"])、卡上一条os-dev-report评论;⛔ 无 MCP 写。终报mcp_calls与api_writes两数都报。gates(逐条命令 + 退出码)、line_budget(本文件行数 before/after,改动行逐行列出)、deviations、files_changed。blocked结束。每个方案必须沿四条固定评估轴分析,这是决策分析的核心原则,不是可选项:
还是投机性能力面?判据要求实测(谁在写这个键、谁在读、
示例应用与真实部署的用法),「读起来像有用」不作数。这条轴会改变结论,不是陪衬。
contract-first),临时补丁式选项要明说长期代价。
契约收紧(严格 schema、publish 时响亮拒绝)优于消费端宽容(
??回退、静默容错)——宽容恰是 AI 批量犯错被掩盖的温床;声明即强制,绝不让 AI 声明一个运行时不兑现的能力。
从紧,无拉动的声明面按 implementation-first 处置,已发布零消费能力不因沉没成本豁免。
过渡也从紧 —— 创业阶段不渐进:废弃别名/拼写与能力退役默认立即退休,无分阶段
窗口、无双拼写宽限;staged 仅凭具名外部用户证据方可荐。新增门禁默认否:门禁是只减
不增的零件,例外只有维护者点名;荐新增门禁须引其点名原话,否则荐「不加」。
基本裁决原则:spec 声明 > 实现 > 文档面;声明而未兑现是实现缺口,补实现或退役,
⛔ 不在消费端收窄;未声明键随实现,文档随之。「声明即强制」只及 spec 与元数据契约、
运行时能力,⛔ 不及 AGENTS.md 这类给 agent 读的约定 —— 那些的读者是 agent,不是门禁。
推荐意见必须基于这四条轴给出理由;四轴冲突时如实呈现权衡,
交维护者拍板。
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{ "issue": 24727, "status": "done", "branch": "claude/issue-24727-adr-0047-filterable-fields-amendment", "pr": "https://github.com/objectstack-ai/objectstack/pull/24756", "session": "session_01HEdP5tPhqQfzwRmKDxwn85 — subagent run; the parent seat session (the relay envelope carried the same id)", "premise_still_valid": true, "summary": "ADR-0047 amended in its own record (Prime Directive 13), docs only, one file: a dated Amendment (2026-10-20) blockquote joins the status block's Revision/Amendment chain and records that `filterableFields` retired in 18.0 with no replacement key and no rewrite (conversion `view-list-filterable-fields-removed` drops the key), that the auto-upgrade loader was never built, citing #24640, records 6278975049 (verbatim 「C」) and 6279033298 (verbatim 「提前」), record 6278907207 and PR #24721 `4bc3becd5`. Decision 1 (section 3.3 item 1) sentence is struck in place with ~~...~~ plus an italic annotation, following the file's own TL;DR #2 precedent; not deleted; no other ADR text moved. Draft PR #24756 opened through the relay (assignee os-justin, label skip-changeset, body byte-identical on read-back); Tier H, left draft for the seat and maintainer.", "tests": "No package touched: no dependency-closure build, no package test/typecheck, no ablation (documentation; no tested behaviour moved). Premise readings: (1) lines 154-155 and status line 3 as stated, on origin/main 580fd4ed3c (worktree base; `git diff f7005cbd8c 580fd4ed3c -- docs/adr/0047-object-ui-run-modes.md` empty). (2) `git grep -n filterableFields -- packages/spec/src` at 580fd4ed3c: 92 lines, all retirement kit (view.zod.ts tombstone, conversions/registry.ts stripKeys drop + fixture, two 18.* retired-key entries, semantic entry, registry.ts.template, view.form.ts comment, four test files); no rewrite to userFilters.fields. Control on the pre-retirement tree 4bc3becd5^ = 0904d856e3 (`merge-base --is-ancestor 4bc3becd5 HEAD` exit 0): whole-repo non-test non-md grep = 25 lines (declaration, form input, generated form translations, surface/liveness artifacts, lint + metadata-protocol field-ref checks, metadata-core FLS name list); none rewrites the key. Clone is shallow, so never-built is read on those two trees, not all history. objectui local checkout f9401e6: no line pairing filterableFields with userFilters/upgrade. (3) section 4 Non-goals one-release courtesy holds, unchanged. Render check: marked 16.4.2 (gfm) renders the struck sentence as one strikethrough span across its line break and the new amendment inside the status blockquote. Control-byte self-scan of the ADR: zero hits (grep exit 1).", "gates": "All 19 at HEAD 6d1c09b965; re-derived `dispatch-gates --commands --repo objectstack-ai/objectstack` on the actual diff = the dispatch's 19; each run redirected then $? captured. exit 0: node scripts/check-adr-links.mjs (770 relative link destinations resolve); --self-test; node scripts/check-adr-symbol-anchors.mjs (2369 anchors across 142 records resolve, 0 line anchors); --self-test; node scripts/check-ci-filter-parity.mjs; node scripts/check-closing-keyword-parity.mjs; --self-test; node scripts/check-comment-mask-corpus.mjs (9639 files, 0 disagree); pnpm check:adr-anchors; pnpm check:cross-package-test-inputs; pnpm check:doc-authoring; pnpm check:driver-memory-census; pnpm check:gitlink-declared; pnpm check:nul-bytes (no raw ASCII control bytes); pnpm check:pm-governed-merges; pnpm check:pm-prior-rulings; pnpm check:refd-timer-probe; pnpm check:watch-hint-literal; pnpm --filter @objectstack/lint run check:doc-formula-expressions :: first run exit 3 PREREQUISITE NOT MET (formula/lint dist absent in a fresh worktree, not a measurement), fixed per its own prescription under os-verify-lock (`turbo run build --concurrency=2 --filter=@objectstack/formula --filter=@objectstack/lint`, VERDICT command-exit 0, 4/4 cached), re-run exit 0. `--ran` reconciliation: 19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN (derived zero: every line carried its exit code). CI on PR head 6d1c09b965 at read time: 26 check-runs, success 2 (Check Changeset; No other open PR may claim the same issue), skipped 5 (one run each of Check PR Size and Check Changeset, Auto Label, two Packed-tarball smoke (opt-in)), in_progress 19 (the Lint and Type Check lanes, Governed Surface Queue Guard, Check Documentation Links, a second Check PR Size run, the card/branch claim checks) — in_progress is the honest value; CI convergence is the seat's.", "mcp_calls": "0 — no MCP GitHub tool used", "api_writes": "2 relay strokes (each one POST /repos/objectstack-ai/objectstack/dispatches as the session, executed by fleet-write as objectstack-fleet[bot]): stroke 1 pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/24756/assignees + POST /repos/objectstack-ai/objectstack/issues/24756/labels (run 39371196826, success); stroke 2 this report = POST /repos/objectstack-ai/objectstack/issues/24727/comments. Plus 2 git pushes (empty-branch probe, then 6d1c09b965) — not REST.", "open_questions": [], "out_of_scope_findings": [ "carrier: none (承接者:无) · noted in PR #24756 Acceptance notes, not filed — pre-existing rendering: ADR-0047's **Deciders** / **Builds on** / **Consumers** lines follow the status blockquote with no blank line, so Markdown lazy continuation folds them into its last paragraph (was the 2026-07-07 amendment's, now the new one's); kept byte-for-byte because the card says no other ADR text moves; polish class, excluded from filing", "carrier: none (承接者:无) · noted in PR #24756 Acceptance notes, not filed — residual readers of the retired `filterableFields` key after PR #24721: packages/lint validate-list-view-field-refs.ts, validate-field-consumers.ts, reference-integrity-suite.ts, rule-explanations.ts; packages/metadata-protocol metadata-diagnostics.ts; packages/metadata-core object-schema-fls-references.ts LIST_VIEW_NAME_LISTS (validate-react-page-props.ts reads a JSX ListView React prop of that name, not stored metadata); every list-view door refuses the key at parse, so these are dead reads (zero-pull / dead-code class, excluded from filing)" ], "line_budget": "docs/adr/0047-object-ui-run-modes.md 295 to 317 lines (+24 / -2). Added 27-46: a bare quote-marker separator (27) and the 19-line Amendment (2026-10-20) blockquote (28-46), inserted after the 2026-07-07 amendment and before **Deciders**. Modified 154-155, now 174-175: the Decision 1 sentence wrapped in ~~...~~ (text unchanged), with the annotation opening on 175. Added 176-177: the rest of the italic annotation. Not in the line ratchet (CEILINGS cover the pm-dispatch skill tree only).", "deviations": [ "Worktree base is origin/main 580fd4ed3c, not the dispatch's f7005cbd8c: a concurrent fetch had advanced origin/main by the time the worktree was created; the ADR file is byte-identical between the two (empty git diff).", "Commit trailer pair is the AGENTS.md model-free form (Claude-Session + Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By line, following AGENTS.md's precedence; the pre-push trailer check passed.", "PR body footer is the AGENTS.md session-URL footer form, not the harness reminder's robot-emoji line, for the same reason.", "Status line 3 (**Status**: Accepted ...; revised 2026-06-19) is not rewritten to mention 2026-10-20 — the card says no other ADR text moves; the dated amendment block carries it. Stated in the PR body as the one trade-off." ], "files_changed": [ "docs/adr/0047-object-ui-run-modes.md" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
ACCEPT → PR #24756 comment 6283756860 ·
domain:skillsseat 1 ·os-justin·session_01HEdP5tPhqQfzwRmKDxwn85· 2026-10-20T05:00Zdocs/adr/**): the PR stays draft and waits for an authorised approval (os-zhuangorhotlong, both requested); the seat lands it on approval. IsolatedCONTRACT_REVIEW_TIERreview PASS 6283742240 on head6d1c09b96; CI 30 success / 9 expected skips.pm:dispatched→needs-user-decisionin the same act (the PR hangs on a person).os explaintext atpackages/lint/src/rule-explanations.ts:3114/3149still names the retiredfilterableFieldsas a checked position — a lint-lane follow-up of PR feat(spec)!: retire the list view's filterableFields — declared as the userFilters.fields shorthand, read as a Filter-panel whitelist; no per-view whitelist replaces it #24721, checked for an existing card before any filing.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landing armed ·
domain:skillsseat 1 ·os-justin·session_01HEdP5tPhqQfzwRmKDxwn85· 2026-10-20T05:13Zos-zhuang(2026-10-20T05:12Z), head6d1c09b96unchanged since the record. Landing pre-checks: CI converged with no red,check-expected-skipsOK,check-governed-mergesTier H under the human-merge threshold.pr_ready+automerge_enable) through the relay; the queue merges it,Fixes #24727closes this card, and the seat then removespm:dispatched.needs-user-decision→pm:dispatched(the approval is in; back to the working state until the merge).Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landing ·
domain:skillsseat 1 ·os-justin·session_01HEdP5tPhqQfzwRmKDxwn85· 2026-10-20T05:24Z795ff708d(Tier H: approved byos-zhuang, review 5581001724)795ff708dis an ancestor oforigin/main(795ff708d8)gh-readonly-queue/main/pr-24756-…still presentclaude/issue-24727-adr-0047-filterable-fields-amendmentstill presentState change: the card closed
completedby the PR'sFixes;pm:dispatchedremoved. ADR-0047 now carries the dated Amendment (2026-10-20) and the struck Decision 1 sentence onmain.Generated by Claude Code