Skip to content

docs(adr): ADR-0146 amendment — an upgrade plan may report a .custom override that hides a vendor change, as advice only; basedOn still never gates (epic cloud#3652 D2) #30881

Closed

Description

@objectstack-fleet

repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2

Filing gate: ③ a task on the maintainer's word. Epic objectstack-ai/cloud#3652, coordinator session 2026-11-06, verbatim: 「我觉得先把受管软件包的开发循环走顺了」, then 「同意,然后第一步先解决我本地开发的软件包怎么能够方便地发布到云端」. Phase 2 lists ".custom drift: on a base upgrade, check each override's basedOn and list overrides that now hide a vendor change." Decision D2 on the epic (2026-11-06), the maintainer's selection verbatim: 「修订为允许只提示(推荐)」. Amend ADR-0146 to allow an advisory finding, "this override hides a vendor change", in the upgrade plan. It stays advisory: no blocking and no auto-merge. Ruling Q1 on cloud#3652, verbatim: 「a 本地 os dev(推荐)」.

Governed surface. docs/adr/** is Tier H (AGENTS.md Prime Directive 14, AGENTS.md:271-307; register GOVERNED_SURFACES in scripts/pm/check-governed-merges.mjs).

Lane: domain:skills. The pm-dispatch lane table gives docs/adr/** to domain:skills (.claude/skills/pm-dispatch/SKILL.md:161). The previous ADR-0146 amendment card, #28390, carried domain:skills.

维护者速读

ADR-0146 现在写明「basedOn 只记录、不判断」「升级差异推迟」。按你刚才的裁决,这张卡只改 ADR 的文字:允许升级预览给出一条提示,「这个 .custom 覆盖挡住了本次升级对同名项的修改」。只提示,不拒绝安装,不自动合并。ADR 属于受管文件,PR 保持草稿,由你亲手合并。代码改动在另一张卡(03),等这张合并后再做。

Today (objectstack origin/main 8b9cc712; ADR-0146 unchanged since c50e0dfa)

The passages that rule the finding out, in docs/adr/0146-studio-designs-setup-administers-one-editor-per-item-paired-customize-package.md (measured):

  • D2, :209-212: "basedOn records which version of the base package … basedOn is recorded, not judged: no door compares it with the installed base's version, no upgrade diff is produced, and nothing is refused on it (epic [Epic] Package-level override: every customization of an installed package lives in its paired <base>.custom package, one declared override shared by code and Studio (supersedes #28130) #28236, Not in this epic: upgrade diff / basedOn checking, recorded only)."
  • D2, :262: "Diff-vs-base and the upgrade skip-report stay deferred".
  • Merge question 2, :679-681: "basedOn is recorded and never judged … listed only so the declaration's contract carries the ruling and no card reads basedOn as a gate".
  • Consequences, :598-601: "an overridden item shadows the vendor's later change to that one item until the customer re-bases it, and the platform computes no diff to help".
  • Supersede table, :563: §9's "diff-vs-base and the skip-report stay deferred".
  • Status line (:3-23): the house form of an amendment is a dated "Amended in place (date, ruling …, verbatim …)" sentence on the status line. The index (docs/adr/README.md) is generated from that line by pnpm adr:index and must not be hand-edited (README.md:3, :8).

The code carries the same sentence; it is changed by card 03, not here:

  • packages/spec/src/kernel/override-declaration.zod.ts:137, :141;
  • packages/metadata-protocol/src/protocol-served-overrides.ts:46.

Expected

  1. A dated amendment on the status line: "Amended in place (2026-11-…, decision D2 on objectstack-ai/cloud#3652, maintainer, verbatim: 「修订为允许只提示(推荐)」): an upgrade plan may report an override that hides a vendor change, as advice; nothing is refused on it." It links the epic's ruling comment.
  2. D2 (:209-212) reads: basedOn is recorded and never gates. One reader is admitted, the package upgrade plan, which may list as advisory findings:
    • (a) a .custom item that declares an override of a base item the upgrade changes between the installed and the new version;
    • (b) an override whose basedOn is not the installed base version.
    • No door refuses on either, no token is asked, and nothing is merged, rebased or rewritten automatically. Whole-document replace (ADR-0005 principle 3) is unchanged.
  3. :262 and the Supersede table row read: the advisory upgrade finding of D2 is chartered. A field-level diff-vs-base view and the skip-report as a merge tool stay deferred.
  4. Merge question 2 (:679-681) keeps "no card reads basedOn as a gate" and adds the one advisory reader.
  5. Consequences (:598-601): "the platform computes no diff to help" becomes: the upgrade plan names each override that now hides a change; re-basing stays the customer's act.
  6. One sentence keeps ADR-0141 D3 intact: the advisory finding is not the base-upgrade interception D3 defers, since it refuses nothing. Merge question 1's ^<major> reasoning is unchanged.
  7. pnpm adr:index regenerated in the same PR. No other ADR is touched.

Acceptance

  • The diff touches only docs/adr/0146-…md and the generated docs/adr/README.md.
  • The ADR lint step and pnpm check:pm-governed-prose pass.
  • Every passage listed under Today either admits the advisory finding or is shown unchanged on purpose.
  • The PR is opened as a draft, says "Tier H — maintainer merges", and is never merged, queued or armed by a seat.
  • Card 03's Blocked-by: points here and is cleared when the maintainer merges.

Serial: no Phase 1 dependency. 03 waits on this; 01a does not.

Dedupe (2026-11-06), run as gh api -X GET search/issues -f q=…:

Suggested-grade: p2 · a short governed text change that unblocks 03. It is the ruling's own record.

Clause-②: no · ADR text only. No spec key, route or error code. The widening (a new finding kind in the plan) is card 03's, and is judged there.

🤖 Generated with Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    pm:queueReady for the PM dispatch loop
    repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Nov 6, 2026
  2. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2

    Claim: PM loop round R5 · 2026-11-06T09:10Z
    Session: session_01Q4EjjRhUZjdy8VXs6Kkur2
    Account: hotlong (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-30881-adr0146-advisory-drift
    Worktree: /home/user/w30881/objectstack-issue-30881
    Domain: domain:skills (claimed by the epic owner of objectstack-ai/cloud#3652 on the maintainer's word, verbatim, 「专题卡3652相关的任务你也都优先派发」)
    Seat: repo:cloud#3
    File surface: docs/adr/0146-*.md (the passages the card names, plus a dated "Amended in place" status note) and the regenerated ADR index (pnpm adr:index)
    Container & model: M, mode:subagent, model: TIER_DEFAULT, effort: high
    Clause-②: no — ADR text only
    Metadata-protocol: none
    Responsibility: ruling D2 on epic cloud#3652 (an upgrade plan may report a .custom override that hides a vendor change, as advice only) | none | the drift card that waits on it
    Thread-read: none
    Premise: holds — ADR-0146 today reads "basedOn is recorded, not judged … no upgrade diff" and defers the skip-report (draft reading)
    Serial constraints cleared: no in-flight claim on ADR-0146 found.
    Carrier: objectstack (governance text).

    Governed face: docs/adr/** (Tier H). The PR stays a draft for the maintainer's own merge; ⛔ the seat does not ready it, queue it or arm auto-merge.

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 6, 2026
  4. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2
    os-dev-report

    {
      "issue": 30881,
      "status": "done",
      "branch": "claude/issue-30881-adr0146-advisory-drift",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30899",
      "session": "session_01Q4EjjRhUZjdy8VXs6Kkur2",
      "premise_still_valid": true,
      "summary": "ADR-0146 amended in place for decision D2 on objectstack-ai/cloud#3652 (ruling record 6681380041, verbatim 「修订为允许只提示(推荐)」): a dated Amended-in-place note on the status line; D2 now says basedOn is recorded and never gates and admits one advisory reader, the base upgrade plan, with findings (a) override of a base item the upgrade changes and (b) basedOn not the installed base version; D2's section-9 lift, the Supersede table section-9 row, Consequences bullet 3 and merge question 2 follow; D3/merge question 1 unchanged on purpose, ADR-0141 D3 kept intact by one sentence. All card line hints re-located on d55acb78 at the same lines. One passage the card did not name was also amended: D6 'Not done' bullet (:393) 'No clone lineage, no upgrade diff, no basedOn judgement' would otherwise contradict the amended D2; it now reads 'no field-level upgrade diff, no gate on basedOn'. pnpm adr:index regenerated and wrote a byte-identical README (the index shows a truncated status prefix), so the diff is the one ADR file only; card acceptance said ADR + README, README is unchanged by construction. Draft PR #30899 stays draft for the maintainer's Tier H merge; not readied, no review requested, not queued.",
      "tests": "No package touched: no build closure, no tests, no typecheck, no dogfood (no ! in title, Clause-②: no). No ablation (ADR text only).",
      "gates": "Head 561b3b2d, objectstack. dispatch-gates --repo objectstack-ai/objectstack --commands: 21 families; all exit 0 captured before any pipe: check-adr-links (991 destinations resolve) + --self-test, check-closing-keyword-parity + --self-test, check-comment-mask-corpus, plan-test-core-shards --self-test, check:adr-anchors, check:adr-index ('README.md is current, every record parsed'), check:adr-symbol-anchors (3163 anchors resolve), check:ci-filter-parity, check:closed-ceremony-text, check:cross-package-test-inputs, check:doc-authoring, check:driver-memory-census, check:gitlink-declared, check:nul-bytes (no raw control bytes), check:pm-governed-merges, check:pm-prior-rulings, check:refd-timer-probe, check:watch-hint-literal, lint check:doc-formula-expressions (first run exit 3 PREREQUISITE NOT MET; after building @objectstack/formula + @objectstack/lint under os-verify-lock: VERDICT command-exit 0, Tasks 4/4; re-run exit 0). Plus check:pm-governed-prose exit 0 (card acceptance; outside the derivation). --ran reconciliation: '21 derived accounted for, 21 run, 0 NOT-MEASURED (a DERIVED zero — all 21 recorded an exit code)'. CI check-runs at report time (read once): Check Changeset success; Lint & Repo Gates lanes, Type Check lanes, Governed Surface Queue Guard, Check Documentation Links, PR-body guards in_progress; convergence is the PM's.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "3 — relay dispatch fw-20261106T094719Z-f8e577 (POST /repos/objectstack-ai/objectstack/dispatches) executing pr_create: POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/30899/labels [skip-changeset], read back identical; post-stamped os-dev-report comment POST /repos/objectstack-ai/objectstack/issues/30881/comments. Two git pushes (empty branch, then 561b3b2d) are not REST writes.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: none (internal tool `pnpm adr:index`, no public door; producer named: scripts/adr-index.mjs) · evidence: HEADER_WINDOW = 40 in scripts/adr-index.mjs reads **Key**: header fields only from a record's first 40 lines; growing ADR-0146's status line by 7 lines moved its **Supersedes in part** line from 35 to 42 and the regenerated index silently emptied ADR-0146's Supersedes cell (ADR-0126, ADR-0131, ADR-0005, ADR-0048, ADR-0141, ADR-0070 to an em dash) with exit 0, and check:adr-index would have called it current; avoided here by keeping the note to 3 lines · dedupe words: adr-index HEADER_WINDOW, supersedes column dropped, header window 40 · carrier: none · noted, not filed; PR #30899 body does not carry it (written once before the finding was classified) — seat may add one line to its Acceptance notes",
        "carrier: #30886 · quotes of the old sentence that describe today's runtime and change with the finding's code, listed not edited: packages/spec/src/kernel/override-declaration.zod.ts:98, :137, :141 (and the content/docs/references/** pages generated from it), packages/metadata-protocol/src/served-override.ts:35, protocol-packaged-base-refusal.ts:1016, content/docs/api/metadata-api.mdx:105, content/docs/concepts/metadata-lifecycle.mdx:121",
        "carrier: maintainer · governed quotes listed, not edited: docs/adr/0126-packaged-metadata-customization-model.md:3 (status-line pointer 'diff-vs-base and the skip-report stay deferred'), skills/objectstack-platform/evals/config-plugins-ops.json:169 ('basedOn recorded and never judged')"
      ]
    }
  5. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2
    os-dev-report

    {
      "issue": 30881,
      "status": "done",
      "round": "follow-up on contract review 6682453235",
      "branch": "claude/issue-30881-adr0146-advisory-drift",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30899",
      "head": "9647da1619402557e32ae6fc07bcdcb7be14a1fa",
      "session": "session_01Q4EjjRhUZjdy8VXs6Kkur2",
      "summary": "Both wording should-fixes from contract review 6682453235 are folded into D2 in one normal commit (9647da16, no rebase, no force). (1) D2 names the carrier class: the plan carries both findings in an advisory class its refusal never reads and no finding-set token covers. (2) The three negations (no refusal, no token, no automatic merge/rebase/rewrite) moved off basedOn onto the per-finding sentence, so they cover findings (a) and (b) alike; basedOn keeps 'recorded and never gates'. The status note is unchanged in size and content: the Supersedes line is still at :38, inside HEADER_WINDOW = 40. pnpm adr:index produced zero diff against origin/main, and the ADR-0146 row still lists ADR-0126, ADR-0131, ADR-0005, ADR-0048, ADR-0141, ADR-0070. The PR stays a draft (Tier H).",
      "gates": "Head 9647da16. dispatch-gates derived the same 21 families as at 561b3b2d; all 21 exited 0 locally. check:doc-formula-expressions ran after building @objectstack/formula and @objectstack/lint under os-verify-lock (VERDICT command-exit 0; the first attempt timed out in the queue with 99 and was retried in the same slot). check:pm-governed-prose also exited 0. --ran: '21 run, 0 NOT-MEASURED (a DERIVED zero)'. CI check-runs on 9647da16, read once: 41 in total, 25 success and 16 skipped, none failed or pending. Lint & Repo Gates, TypeScript Type Check, Test Core, Governed Surface Queue Guard, Check Documentation Links and PR-body guards all succeeded.",
      "mcp_calls": "0",
      "api_writes": "1 — this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/30881/comments via the relay). One git push, which is not a REST write. The PR body was not patched; the replacement text goes back to the seat.",
      "security_findings": "none"
    }
  6. objectstack-fleet commented on Nov 6, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2

    ACCEPT → PR #30899 comment 6683646742 · 2026-11-06T11:21Z · Tier H (governed docs/adr/**): contract review PASS 6682453235 and delta PASS 6683623046 (head 9647da16); PR left draft with needs-user-decision, review requested from os-zhuang. The maintainer merges by hand; the card closes on merge via Fixes #30881, and objectstack#30886 then waits only on #30884.

  7. added
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    on Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:skillsDomain lane — seat card indexed by label:pm:seatpm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-setpm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p2Medium: important, M3repo:cloudCard routed whole to the cloud PM: needs cloud code, a producer or a fact (cloud owns it to closure)

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions