Skip to content

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

Closed

Description

@objectstack-fleet

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.

Wanted

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.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: p3 · documentation · lane domain:skills (self-labelled, confirmed: docs/adr/** is governed) · area:devpath · pm:blocked until PR #24721 merges · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-20T02:59Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch. Fresh read on origin/main 0904d856e3.

    Self-labelled check.

    • The lane fits the governed-surface definition.
    • All three answers are present: ① (a recorded decision falsified by a ruling), the governed lane with Tier H maintainer approval, and the dedupe.

    Blocked. The amendment records the key "retired in 18.0", which is true on main only 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.

    finding comes off.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock: pm:blocked → pm:queue · domain:skills seat 1 · os-justin · session_01HEdP5tPhqQfzwRmKDxwn85 · 2026-10-20T04:30Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    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 #24721 4bc3becd5 (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/main f7005cbd8c: 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.
  4. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    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 等维护者批)。

    • 认领评论 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 文字不动,⛔ 不碰其他文件。
    • 若实测表明真正的生产者在别处,直接按生产者侧修,落点与理由写进报告和 PR 正文。

    一、裁决(不可重裁)

    二、PM 机制假设(须实测,鼓励证伪)

    1. origin/main 上第 154–155 行为「filterableFields stays as the legacy shorthand; loaders auto-upgrade it / to userFilters.fields entries.」;状态区第 3 行 **Status**: Accepted (2026-06-12; revised 2026-06-19) — …,其下是两个 > 引用块(Revision、Amendment)。新 Amendment 块接在既有块后(同一引用串内或紧随其后),日期写合并日 2026-10-20。
    2. 「自动升级的 loader 从未建成」是卡的断言,你在 spec 树上实测:git grep -n filterableFields -- packages/spec/src 应只命中墓碑/转换与其测试,没有任何把它改写为 userFilters.fields 的读取路径;把 grep 结果写进 PR 正文。
    3. §4 Non-goals 第 253–254 行已把别名称作 one-release courtesy,与本修订一致,不改。
    4. docs/adr/** 不在行数棘轮内(CEILINGS 只覆盖 pm-dispatch 技能树),但门禁清单里有 check-adr-links、check-adr-symbol-anchors、check:adr-anchors、check:pm-prior-rulings:新块里引用的 issue/评论/PR 与符号名要能过它们;先跑一遍自测看它们认什么拼法。
    5. 划掉句用 ~~…~~ 加一句注(指向新 Amendment 块)最省;若本文件既有做法不同(搜 ~~),随既有做法。

    三、PM 建议路线(可选,实测优先)

    本令门禁清单(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.mjs
    • node scripts/check-closing-keyword-parity.mjs · node scripts/check-closing-keyword-parity.mjs --self-test · node scripts/check-comment-mask-corpus.mjs
    • pnpm --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-census
    • pnpm 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,卡 assignee os-justin(⛔ 你不写卡 assignee)。
    • PM 的认领评论即你的身份;⛔ 不另留认领。动手前读卡全文与全部评论,核对最新一条 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,⛔ 不自行改道。
    • PR 正文行首照抄认领的 Clause-②: no;首行 Fixes #N。PR 正文一次写成(os-dev 定义:正文后续改动归席位)。
    • 门禁清单由 PM 于派发时以 node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack <本单文件> 取得(见本令专属段),逐条跑,退出码先落盘再看,--ran 对账;对实际改动重取一次补跑。
    • Writes: 只走 REST 代理 / scripts/pm/ 写工具(云容器经 fleet-write 中继);写预算三笔:git push、pr_create(draft,assignees: ["os-justin"],labels: ["skip-changeset"])、卡上一条 os-dev-report 评论;⛔ 无 MCP 写。终报 mcp_calls 与 api_writes 两数都报。
    • 终报 JSON 照 os-dev 定义;另只收机器可核字段:gates(逐条命令 + 退出码)、line_budget(本文件行数 before/after,改动行逐行列出)、deviations、files_changed。
    • 前台执行姿态:全部步骤同步跑完,⛔ 不把检查挂后台等唤醒;一轮只以终报或 blocked 结束。

    每个方案必须沿四条固定评估轴分析,这是决策分析的核心原则,不是可选项:

    • 实际业务需求 — 它服务的是真实存在的业务场景,
      还是投机性能力面?判据要求实测(谁在写这个键、谁在读、
      示例应用与真实部署的用法),「读起来像有用」不作数。这条轴会改变结论,不是陪衬。
    • 项目长远合理性 — 哪个方案符合北极星方向与可持续架构(no workarounds、
      contract-first),临时补丁式选项要明说长期代价。
    • 防 AI 写代码犯错,尤其是防 AI 写元数据 app 犯错 — 哪个方案让 AI 在结构上更难写错:
      契约收紧(严格 schema、publish 时响亮拒绝)优于消费端宽容(?? 回退、静默容错)——
      宽容恰是 AI 批量犯错被掩盖的温床;声明即强制,绝不让 AI 声明一个运行时不兑现的能力。
    • 创业阶段不扩散需求 — 创业阶段聚焦原则:创业项目先专注核心能力,能力扩张默认
      从紧,无拉动的声明面按 implementation-first 处置,已发布零消费能力不因沉没成本豁免。
      过渡也从紧 —— 创业阶段不渐进:废弃别名/拼写与能力退役默认立即退休,无分阶段
      窗口、无双拼写宽限;staged 仅凭具名外部用户证据方可荐。新增门禁默认否:门禁是只减
      不增的零件,例外只有维护者点名;荐新增门禁须引其点名原话,否则荐「不加」。

    基本裁决原则:spec 声明 > 实现 > 文档面;声明而未兑现是实现缺口,补实现或退役,
    ⛔ 不在消费端收窄;未声明键随实现,文档随之。「声明即强制」只及 spec 与元数据契约、
    运行时能力,⛔ 不及 AGENTS.md 这类给 agent 读的约定 —— 那些的读者是 agent,不是门禁。
    推荐意见必须基于这四条轴给出理由;四轴冲突时如实呈现权衡,
    交维护者拍板。


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #24756 comment 6283756860 · domain:skills seat 1 · os-justin · session_01HEdP5tPhqQfzwRmKDxwn85 · 2026-10-20T05:00Z


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing armed · domain:skills seat 1 · os-justin · session_01HEdP5tPhqQfzwRmKDxwn85 · 2026-10-20T05:13Z

    • Authorised approval on PR docs(adr): ADR-0047 records the 18.0 retirement of filterableFields — no replacement key, no rewrite #24756: review 5581001724 by os-zhuang (2026-10-20T05:12Z), head 6d1c09b96 unchanged since the record. Landing pre-checks: CI converged with no red, check-expected-skips OK, check-governed-merges Tier H under the human-merge threshold.
    • 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).

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Landing · domain:skills seat 1 · os-justin · session_01HEdP5tPhqQfzwRmKDxwn85 · 2026-10-20T05:24Z

    Reading Value
    PR #24756 merged 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.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:skillspriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions