Repository navigation
Description
domain:spec#1 · os-tesla · session_01L9qibzzqHZdAVqgBAvxXKB
Filing gate: ③ a task on the maintainer's word. Ruling 6691022506 on #29594 (director seat, batch #437 item 1). The maintainer, verbatim, 2026-11-06T17:17Z: 「① 定制单位 = App;同意 ② 内核作为平台套件、版本随运行时、总是全套安装,我理解是事实吧,元数据app运行时引用的平台都是统一版本号的呀,平台发版本也是统一版本号的。这个应该你负责确认。」. The ruling's own execution line: "the spec seat files the ADR-0146 D3 amendment as its own Tier H card (os-zhuang reviewer)".
Business reason. Today D3 gives one .custom pair per read-only package. Every kernel package shares namespace sys, so only the first can get a pair; the rest answer 422 NAMESPACE_CONFLICT (#29594). A suite like HotCRM (one App plus three modules, one version) would also get four pairs, while the customer thinks of one product. Without this amendment, the server lane's ensure-door change (pairOf(base) by App) has no ADR text to cite. Studio would keep sending a customer's HotCRM changes to four places.
Hands-on reader. spec seat 1 (domain:spec#1) dispatches this card to a Fable card thread. The draft PR goes to os-zhuang. The server lane's ensure-door PR cites the merged text.
Lane. The pm-dispatch lane table puts docs/adr/** under domain:skills (.claude/skills/pm-dispatch/SKILL.md:161). The ruling's Workload line gives "ADR-0146 D3 amendment, Tier H" to domain:spec, so this card carries domain:spec on the ruling's word.
Governed surface. docs/adr/** is Tier H (AGENTS.md Prime Directive 14; check-governed-merges). The PR stays draft. It lands only by the maintainer's hand, or by an APPROVED review from os-zhuang followed by the seat's landing.
维护者速读
按你 ① 的裁决,这张卡只改 ADR-0146 D3 的文字:
- 定制单位从「每个只读包一个
.custom」改为「每个 App 一个.custom」,HotCRM →app.objectstack.hotcrm.custom。 - 内核整体算一个平台套件,只有一个平台 pair,名字由修订写定。
- 平台 pair 的依赖是平台版本
^18,不看各内核包 manifest 自己的 version。 - 某个内核包没装时,它的覆盖保留并标记,不拒绝安装。
- ③(内核白名单)未裁前,内核对象仍不可定制。
- 代码改动走 server 车道,不在这张卡里。
Today (objectstack origin/main 69e133ea)
In docs/adr/0146-studio-designs-setup-administers-one-editor-per-item-paired-customize-package.md:
- D3 (
:284-340): "Every installed base gets a paired<base>.custompackage … one per base". Namespace<base namespace>_custom(Q4,:300). Dependency^<major>of the base'smanifest.version("Merge question 1"). - Q4 row (
:597) and Consequences (:620, "one per base, folded under each in Studio") repeat the per-package unit. - The code spelling of the same rule is
packages/spec/src/kernel/customization-package.ts(customizationPackageId:94,customizationNamespace:166,customizationDependencyRange:205). It changes on the server lane's cards, not here.
Expected (ADR text only)
- A dated status-line amendment, in the house form "Amended in place (2026-11-…, ruling 6691022506 on Customization pairs: every system package shares namespace sys, so only the first can get a .custom pair (422 NAMESPACE_CONFLICT on the rest) #29594, maintainer, verbatim: 「① 定制单位 = App;同意」)". It links the ruling comment.
- D3's unit becomes the App (ADR-0019 D1–D4; ADR-0130 D1/D6: one artifact, one version):
- One pair per App:
<app id>.custom, e.g. HotCRM →app.objectstack.hotcrm.custom. - Namespace = the App package's own namespace +
_custom. - Dependency =
^<major>of the App. - A module never owns a pair. A customization on any object of any member of the App lands in the App's pair.
- The ensure door returns the App's existing pair (200), not 422.
- 422
NAMESPACE_CONFLICTstays only for a namespace held by a package outside the App's artifact.
- One pair per App:
- One platform pair for the kernel suite. The amendment names its id. The id must satisfy
MANIFEST_ID_PATTERN, be held by no real package, and be onecustomizationBasePackageIdinverts. The namespace issys_custom. The PR body states the chosen id and the alternatives weighed. - The platform pair's dependency is the platform version
^<major>(18 today: the changesetfixedgroup ships one version;resolveRuntimeVersion()inpackages/runtime/src/runtime-version.ts:80). It is never a kernel manifest's ownversion(0.1.0–3.x, unrelated to release). - Orphan tolerance (② as recorded in the ruling): the platform pair tolerates an absent kernel package. Its overrides are kept and marked, never refusing the install. This is the same handling as a module removed in a later App version, and the amendment states that case too. The
customizableverdict is served for the packages present. - (b) stays, one sentence: the package list row and the ensure door serve a readable
customizableverdict, and the pair a Customize would land in. - Until ruling ③ (kernel whitelist), kernel objects stay NOT customizable. The amendment says so in one line and points at Customization pairs: every system package shares namespace sys, so only the first can get a .custom pair (422 NAMESPACE_CONFLICT on the rest) #29594 for the second ruling comment.
- Not taken, recorded so silence is not consent: (a) a pair per package; (c) N pairs sharing
<ns>_custom; (e) an explicit split key. ADR-0019 and ADR-0130 are not amended. - The Q4 row, the Consequences line (
:620) and any other "one per base" sentence follow the new unit or are shown unchanged on purpose. pnpm adr:indexis regenerated in the same PR. No other ADR is touched.
Acceptance
- The diff touches only
docs/adr/0146-…mdand the generateddocs/adr/README.md. - The ADR lint step and
pnpm check:pm-governed-prosepass. - Every passage under Today either states the App unit or is shown unchanged on purpose.
- The PR is opened as a draft, says "Tier H", and requests
os-zhuang. ⛔ No seat readies, queues or arms it before an authorized APPROVED review. - Contract review at
CONTRACT_REVIEW_TIERbefore the hand-off.
Serial: none. The server lane's ensure-door PR cites this record once it merges. Its first PR (the lookup refactor, no behaviour change) does not wait.
Dedupe (2026-11-06), run as gh api -X GET search/issues:
repo:objectstack-ai/objectstack "ADR-0146" D3 in:title,body is:issue→ 34 hits. The ADR-0146 cards are metadata-protocol: the <base>.custom ensure door — the one idempotent creation path for the paired package, explicit <base namespace>_custom, walled 403 #28407 (ensure door), objectql: uninstalling a base package is refused while its <base>.custom exists, naming the pair (409, the extender-refusal family) #28408 (uninstall refusal) and docs(adr): ADR-0146 amendment — an upgrade plan may report a.customoverride that hides a vendor change, as advice only;basedOnstill never gates (epic cloud#3652 D2) #30881 (basedOnadvisory amendment), all closed and other clauses. None.repo:objectstack-ai/objectstack is:issue "platform pair" OR "customization unit" OR "app.objectstack.hotcrm.custom"→ 109 hits. The only match is Customization pairs: every system package shares namespace sys, so only the first can get a .custom pair (422 NAMESPACE_CONFLICT on the rest) #29594 itself, the parent. None.
Suggested-grade: p2 (the parent's grade) · Clause-②: no (ADR text only; no spec key, route or error code) · Metadata-protocol: none.
Ruling-ref: 6691022506 on #29594.
🤖 Generated with Claude Code
Activity
objectstack-fleet commentedon Nov 6, 2026
domain:spec#1 · os-tesla · session_01L9qibzzqHZdAVqgBAvxXKB
Claim: PM loop round 4 · 2026-11-06T17:31Z
Session:
session_01L9qibzzqHZdAVqgBAvxXKBAccount:
os-tesla(the card's assignee)Branch:
claude/project-thread-kouhp1(the card thread's designated branch; dev sessionsession_01L9qibxn8FPvL85i9w26qoq)Worktree:
objectstack-issue-31014Domain:
domain:spec(ruling 6691022506's Workload line)Seat:
domain:spec#1File surface:
docs/adr/0146-studio-designs-setup-administers-one-editor-per-item-paired-customize-package.md,docs/adr/README.md(regenerated bypnpm adr:index). ⛔ code, ⛔ any other ADR (stop on breach)Container & model:
S,mode:thread,model: CONTRACT_REVIEW_TIER(dispatch-gates --tier: MANDATORY fromdocs/adr/**, no one-line exemption),effort: xhigh. The card thread opened on the project default model and cannot switch without the maintainer's word, which the seat has asked for. Editing starts only once that is answered.Clause-②: no
Metadata-protocol: none
Responsibility: ADR-0146 D3 pairs one
.customper read-only package, so the kernel's sharedsysnamespace yields a single pair and 422s the rest (#29594). The maintainer ruled the App, and one platform suite, as the unit. The fix is the D3 text, which the server lane's ensure-door change cites.Thread-read: 6691133916
Premise: holds. On
origin/main69e133ea, D3 (:284-340) still says "one per base".Serial constraints cleared:
none(no open PR names #31014 or edits ADR-0146)Tier H (
docs/adr/**): the seat reviews the PR, then hands it toos-zhuang. It stays draft until then.Order:
/mnt/project-files/spec-seat-1/r2026-11-06/dispatch-31014.md(frameFRAME.mdbeside it).objectstack-fleet commentedon Nov 6, 2026
domain:spec#1 · os-tesla · session_01L9qibxn8FPvL85i9w26qoq
os-dev-report
Posted 2026-11-06T18:35Z · gates read at head e2cc08e 2026-11-06T18:25Z · PR opened 2026-11-06T18:33Z
{ "issue": 31014, "status": "done", "branch": "claude/project-thread-kouhp1", "pr": "https://github.com/objectstack-ai/objectstack/pull/31027", "session": "session_01L9qibxn8FPvL85i9w26qoq", "premise_still_valid": true, "summary": "ADR-0146 D3 amended in place on ruling records 6691022506 (unit = App) and 6691217245 (kernel whitelist next version): one pair per App (APP_ID.custom, namespace APP_NS_custom, range the App's ^MAJOR; a module never owns a pair; the ensure door answers the App's pair, 201 then 200, 422 only for a namespace held outside the artifact; HotCRM = app.objectstack.hotcrm + four modules at 6961ab1, one pair app.objectstack.hotcrm.custom), one platform pair com.objectstack.kernel.custom for the kernel suite (namespace sys_custom, range the platform version ^18 declared in engines.platform, orphan overrides kept and marked, no kernel object customizable in this version, Users/Organizations first in the next with the two prerequisites), ruling (b)'s readable customizable verdict, the sys_ pass-through close, Not taken (a)/(c)/(e), Q4 row, Consequences and D11 following. Status-line sentence in house form; Decided-here items 8 (pair id), 9 (engines.platform + which 'platform version'), 10 (kernel overlay rows wait). pnpm adr:index regenerated: README byte-identical. Tier H draft PR #31027 for the seat's contract review and os-zhuang.", "platform_pair_id": "com.objectstack.kernel.custom — base com.objectstack.kernel: MANIFEST_ID_PATTERN ok; 0 hits for com.objectstack.kernel in objectstack 33bc8ae5 and hotcrm 6961ab1; customizationBasePackageId inverts it; namespace sys_custom; names the suite in the com.objectstack. family. Not taken: com.objectstack.platform (22 test files use it as a stand-in for ONE kernel package, so per-package pair and platform pair would coincide in every fixture and the lookup refactor could not be told apart), com.objectstack.sys (a namespace, not an id), com.objectstack (the vendor), com.objectstack.core (used as a generic dependency id in tests and a zod example), com.objectstack.platform-suite (free, but coins a word the record does not use).", "tests": "none owed — docs/adr/** only; no package in the diff, so no closure (①) and no package suite (②). Verification = the ADR gates below.", "gates": "derived 21 families with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at e2cc08eb52 (merge base 33bc8ae5ff); all 21 run in the foreground, stdin from /dev/null, exit codes captured before any pipe, every one exit 0: check-adr-links (+self-test), check-closing-keyword-parity (+self-test), check-comment-mask-corpus, ci/plan-test-core-shards --self-test, lint check:doc-formula-expressions (after `pnpm --filter '@objectstack/lint...' build` under the verify lock, exit 0), check:adr-anchors, check:adr-index, check:adr-symbol-anchors, 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, check:pm-governed-merges, check:pm-prior-rulings, check:refd-timer-probe, check:watch-hint-literal. `--ran` reconciliation: 21 derived, 21 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. Beyond the derivation, as the card's Acceptance names it: pnpm check:pm-governed-prose exit 0; node scripts/adr-index.mjs --check exit 0 (README unchanged). CI on PR #31027: in_progress at report time; the seat reads the check-runs.", "line_budget": "161 changed lines (+133 / −28, 1 file) vs the 3000 human-merge threshold: under. No ratchet or skills budget applies (no skills/** path).", "deviations": [ "Commit e2cc08eb52 author spelled objectstack-fleet[bot] with the generic noreply email instead of the checkout's configured Claude author — my commit-line mistake; not rewritten because the thread branch is not force-pushable under Multi-agent discipline §3 (name is not claude/issue-*); the squash merge replaces the author.", "The order's Expected 4 named resolveRuntimeVersion() as the reading of the platform version; measured, that function prefers the injected OS_RUNTIME_VERSION stamp (image tag / git sha), so the ADR names the fixed-group release version and says that function is NOT the range's source (Decided-here 9). The seat accepted this before the edit.", "The card and ruling ① say three HotCRM modules; hotcrm origin/main 6961ab1 ships four (.o2c joined in hotcrm PR #2413). The ADR names four, as measured.", "docs/adr/README.md carries no diff: the regenerated index is byte-identical. A three-line status sentence would have pushed the Supersedes field past adr-index's 40-line header window and dropped ADR-0146's Supersedes column; the sentence is one line so the field stays at line 39 (one line of headroom left).", "The harness's assignee/reviewer step (GitHub MCP issue_write / update_pull_request) was skipped: the frame forbids MCP writes; the seat sets the assignee and the reviewer at hand-over.", "The PR was opened as the relay opens every PR — a draft — and carries skip-changeset and documentation on the create. Labels are to be read back by the seat on the PR." ], "files_changed": ["docs/adr/0146-studio-designs-setup-administers-one-editor-per-item-paired-customize-package.md"], "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0 writes. Reads only: github issue_read (#31014 get + comments; #29594 get + comments ×3 pages), pull_request_read (#30990 files, #30747 get, #31027 get), list_pull_requests (open, numbers only); claude-code-remote get_session ×2.", "api_writes": "0 REST proxy writes. Relay: 1 pr_create (fw-20261106T183248Z-6215fc, run 42271687534, read-back identical, 16480 bytes). git push ×1 (e2cc08eb52 to claude/project-thread-kouhp1).", "open_questions": [ { "question": "Keep com.objectstack.kernel.custom as the platform pair id, or take com.objectstack.platform (the ruling's own word) despite the 22 test fixtures that use it as a single-package stand-in?", "options": ["A keep com.objectstack.kernel.custom (as written)", "B com.objectstack.platform.custom, and the server lane renames the fixtures' stand-in id in its first PR"], "recommendation": "A, because the fixtures would otherwise make the old per-package lookup and the new per-App lookup indistinguishable in every test that names the kernel." }, { "question": "Decided-here 9: the platform pair's range lives in engines.platform (^18), not manifest.dependencies — accept, or should ADR-0141 D2 gain a platform-id arm so dependencies can name com.objectstack.kernel?", "options": ["A engines.platform (as written; no ADR-0141 change)", "B a dependencies entry plus an ADR-0141 D2 amendment"], "recommendation": "A, because the handshake already reads engines.platform against the protocol major and no new mechanism is needed." }, { "question": "Decided-here 10: a package-less overlay row over a kernel item stays unmigrated with its write open until the whitelist — accept, or close the write and strand those rows read-only?", "options": ["A keep the write open for kernel items (as written)", "B close it with the rest of D11 and accept read-only kernel overlays until the next version"], "recommendation": "A, because B leaves an administrator no way to change an existing kernel email template or view for a whole version." } ], "security_findings": "none", "out_of_scope_findings": [ "carrier: domain:server (#29594 PRs) · the code spelling of the same rules (customizationPackageId / customizationNamespace / customizationDependencyRange in packages/spec/src/kernel/customization-package.ts) is untouched here by order; the server lane's PR 2+ cites this record.", "class: none · reach: n/a · observation for the next ADR-0146 amendment: adr-index reads header fields from the first 40 lines only; ADR-0146's Supersedes field now sits at line 39. Noted, not filed." ] }objectstack-fleet commentedon Nov 6, 2026
domain:spec#1 · os-tesla · session_01L9qibzzqHZdAVqgBAvxXKB
ACCEPT → PR #31027 comment 6694028141 (head
2990a3dc, contract review PASS over four rounds, final 6693795084, CI green, clean). Tier H (docs/adr/**):pm:awaiting-merge+ review requested from os-zhuang / hotlong. The seat lands after an authorized APPROVED review.