docs(adr): ADR-0090 D5 offending bits are platform system permissions, not any systemPermissions - #17814
Conversation
…, not any systemPermissions D5's last bullet made any non-empty `systemPermissions` an offending bit for an `everyone` anchor binding, and the shared predicate implemented it literally. That list conflates two unlike tokens: the platform's own powers, and a capability a package declared for itself under ADR-0066 D1. The bullet is narrowed to a `systemPermissions` entry naming a PLATFORM system permission, with a dated revision note recording the two token kinds, the three fail-closed boundaries (the absolute platform floor, provenance rather than spelling, and omission refusing), that the D9 `guest` tier is untouched, and that the consuming callers keep the pre-revision behaviour until they supply the declared list. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MkQhmuuJAVDjmeWNixwDDH
|
Acting on a maintainer instruction given in live PM chat, 2026-09-13, verbatim: 「红的你要帮我解决啊」 (a direct instruction to clear the red CI on the stale open PRs, this one among them). Why this label and not a changeset.
Measured rather than assumed: this PR's file list is exactly one path — ⇒ route 1 ( Scope of this write. The label set was read, the single addition applied, and the union read back. ⛔ Nothing else on this PR moved: still draft, not enqueued, no auto-merge, no approving review.
Generated by Claude Code |
Part of #17189 — the protocol half of phase ①. ⛔ This PR does not discharge the card, and ⛔ carries no closing keyword: #17189 still owes step ②.
Sibling: #17811 carries the
packages/specpredicate, its test, the changeset and the two regenerated surface snapshots. The two were one PR until the seat review of heada21ad008; they are split here on the ruling's own instruction.Why this is its own PR
The ruling (#17189 comment
5615806616, director seat, batch #110) says it twice, verbatim:The triage seat had already ruled the same shape: 「那部分必须是独立的受管 PR,⛔ 不得与代码同 diff」.
Measured consequence, not style.
scripts/pm/check-governed-merges.mjs --teston this PR's one-file list exits 3 = GOVERNED; on the sibling's five-file list it exits 0 = NOT governed. Bundled, one governed path made the predicate change human-merge-only too. Split, this half waits for its human and the code half takes ordinary landing.Why the revision is required
Both halves are phase ①, per the ordering note (#17189 comment
5617614086) carrying the maintainer verbatim:D5's last bullet said any
systemPermissionswas an offending bit, anddescribeHighPrivilegeBitsimplemented that literally — so the protocol, not the implementation, was the half that was wrong. A predicate change without this revision would leave the ADR describing a rule the code no longer applies.What changed
D5's last bullet now reads "a
systemPermissionsentry naming a platform system permission", and names an app-declared capability token — one a package declared for itself under ADR-0066 D1, enteringsys_capabilitywithmanaged_by: 'package'+package_idprovenance — as not an offending bit.A dated revision note records:
manage_userscannot be laundered by declaring it); the discriminator is provenance, never spelling (⛔ the dotted-name rule was considered and rejected:setup.accessis a dotted platform capability today); omission refuses (a caller that cannot enumerate the declarations gets the pre-revision verdict);guesttier is untouched — D5 speaks for authenticated members;The revision text is byte-identical to what stood on
a21ad008before the split — verified by diffing this branch's file against that branch's. Removing the code hunks made no sentence of it false: nothing in the note claims the predicate ships in this PR.Clause ②
Recorded, not re-declared here: the card's declaration is
Clause-②: yes(放宽接受集)per the ruling's 执行 line, and theneeds:contract-reviewcarrier is already hung by the seat on card #17189 and on the code PR #17811. This half is prose only — it puts no key on any published payload and moves no accept set by itself. Whether the carrier is also owed on this PR is the seat's call; ⛔ this round writes no labels.Verification
a21ad008and is ⛔ not re-litigated here.check-governed-merges.mjs --test docs/adr/0090-permission-model-v2-concept-convergence.md→ exit 3 (GOVERNED). Control, the sibling's five-file list → exit 0 (NOT governed), so the 3 is a verdict about this file rather than an instrument that only ever says 3.check-adr-links,check-adr-symbol-anchors,check:adr-anchors,check-adr-0087-registration --base origin/main,check:nul-bytes,check:pm-governed-prose,check:doc-authoring— exit codes captured before any pipe, reported in the round's report.docs/adr/**is in no package'sfiles[], and a phrase unique to this revision note occurs in 0 built files underpackages/spec/dist— the negative control measured in the sibling PR's changeset decision.docs/adr/**. Draft only, and it stays draft: ⛔ not flipped ready, ⛔ not enqueued, ⛔ no auto-merge, ⛔ no approving review. A human merge is the review record.Generated by Claude Code