Uh oh!
There was an error while loading. Please reload this page.
docs(adr): ADR-0130 addendum — the permission matrix is outside the package boundary's payoff (#14487) - #14498
Conversation
…ackage boundary's payoff (#14487) Records the maintainer's 2026-09-02 ruling (option B on #14454 item 3): permission sets stay whole in the `type: app` package, and the 30 x 9 x 6 permission matrix §1.3(a) measures is NOT part of the payoff §4 claims for this boundary. Measured, from the HotCRM split plan (objectstack-ai/hotcrm#1449): four of the six permission sets span five or six of the six planned modules, and not one is confined to a single module — a set grants per role, not per module, so no module owns it. Per-package composition of grants is filed as #14488 for the phase in which a module ships on its own, with no commitment; the section records the three constraints that phase inherits (ADR-0086 D4 stands until amended; D4's conflict-freedom argument assumes one namespace per package, which D1 relaxes; and which Access door edits a split product's app-owned sets is unmeasured). No decision text changes: D1-D8, §1 and §3's non-goal on grouping keys stand as written. The Status line gains a pointer to the addendum, per the ADR-0006/0085 precedent for a record whose scope an addendum bounds. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UHvF5hyiZjnCyExFnfQB8m
hotlong
commented
Sep 2, 2026
PM 复审:PASS(内容与格式)—— 受管面,留 draft,请维护者手合复审会话 对树核实
CI( |
hotlong
commented
Sep 3, 2026
Maintainer ruling, 2026-09-03, given in chat to the director seat (session_01WXyGTWPbbreqXow7Z2pZCk) on decision batch 1, item 2 (this PR, option A: merge as-is). Verbatim: 「以上都同意,你帮我合并pr」. Executing on that instruction: marking ready and merging directly (squash) from the maintainer's own account. No approving review is submitted by any seat; under the governed-surface regime the human merge is the review record (see the header of Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#14487
Part of #14122
Governed surface — maintainer merge. This PR edits
docs/adr/**, so it stays draft and is merged by hand by the maintainer;Governed Surface Queue Guardmarks it. Nothing here authorises implementation work, and the record it amends is stillProposed.What this is
One addendum section appended to
docs/adr/0130-release-artifact-as-co-ownership-boundary.md, in that repository's existing addendum format (## Addendum (date, #card) — title, as in ADR-0006, ADR-0085, ADR-0087), recording the maintainer's 2026-09-02 ruling — option B on item 3 of #14454, the item carried onto decision card #14457: permission sets stay whole in thetype: apppackage, and the permission matrix ADR-0130 §1.3(a) measures is not part of the payoff §4 claims for the package boundary.⛔ No decision text moved. D1–D8, §1 and §3's non-goal on grouping keys are unchanged; no
owner/publisherfield; no new decision. The only edit outside the new section is a one-sentence pointer appended to the Status line — the ADR-0006 / ADR-0085 precedent for a record whose scope an addendum bounds.The added text
Heading:
The bound it places on §1.3(a) and §4:
The measurement it rests on:
Where the sets live:
What was not decided:
The section then records three constraints that phase inherits, so they are not rediscovered: ADR-0086 D4 stands until amended ("A package never writes into a shared/foreign record.", so #14488 is an amendment to D4, not an addition beside it); D4's conflict-freedom argument assumes one namespace per package, which D1 relaxes for co-owners inside one artifact; and which Access door edits a split product's app-owned sets is unmeasured (D7 scopes the package door to "this package's own object slice", and after a split the app package owns the sets but no objects). All three are marked as inputs, not decisions.
Status line, appended:
Evidence
navigationContributions[].group语义、权限集的模块归属、dashboard/report → dataset 跨包绑定(hotcrm 分拆方案挖出的 4 个上游缺口) #14454 (comment 5507189677) and quoted in the words that record carries, marked as the PM seat's rather than a transcript of the maintainer's.docs/architecture/module-split-plan.md§上游缺口 / Upstream gaps item 3 and its generatedmodule-split-inventory.json(unmeasured_edge_classes), per set:sales_rep6,sales_manager6,system_admin6,service_agent5,marketing_user4,guest_portal2, of six planned modules.[ADR-0086 D3]anchor is real inpackages/spec/src/security/permission.zod.ts; it is cited by tag, not line number, per this record's own §7 discipline.Changeset — precedent followed
No changeset; the
skip-changesetlabel carries it. Precedent, checked over the last 30 commits touchingdocs/adr: every ADR-only commit carries no changeset at all — including ADR-0130's own landing commit682d03ba7(#14151) andabeb5665e(#12867).scripts/check-empty-changeset.mjsrejects a newly added empty-frontmatter changeset, so in this repository the label is the mechanism and an empty file is not; the label is applied on this PR.Gates
Family derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(1 path in the change set, 5 commands). All re-run at commit018270546underscripts/pm/os-verify-lock.sh, exit codes captured into a file before any pipe:node scripts/check-adr-links.mjs✅ check-adr-links: 600 relative link destination(s) under docs/adr/ resolvepnpm --filter @objectstack/lint run check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 427 files / 1398 TS blocks judged cleanpnpm check:adr-anchorscheck-adr-anchors: OK (52 anchored file(s) [...] 31335 citation(s) across 4067 file(s) resolve)pnpm check:doc-authoring✓ doc authoring guard: 394 files clean — no bare metadata literals.pnpm check:pm-governed-merges✓ check-governed-merges --self-test: 243 assertionspnpm check:nul-bytes(not derived; run on every edit)check-nul-bytes: OK (scanned 7914 text file(s) [...] no raw ASCII control bytes)check:doc-formula-expressionsfirst exited 3 — PREREQUISITE NOT MET (@objectstack/formula, then@objectstack/lint, not built), which is "nothing was measured", not a finding; both packages were built and the gate then ran green. The 9 further familiesdispatch-gatesnames apply only once a changeset path exists, which by the precedent above this PR does not create.🤖 Generated with Claude Code
https://claude.ai/code/session_01UHvF5hyiZjnCyExFnfQB8m
Generated by Claude Code