Skip to content

upgrade-impact comparison, access class (v18): a vendor upgrade that would orphan, re-enable or collide with a customer's access choice is refused until an administrator confirms, and raised at boot #24446

Open

Description

@objectstack-fleet

Filing gate ③: a task the maintainer directed. Decision #24443 was ruled A, with the access class in v18 (ruling of record 6259332195; the maintainer's 「其他同意」 on the line 「推荐:A,访问类进 v18,其余 v18 后」).

Blocked-by: #24421 (PR #24428 adds the sharing_rule activation type that U1 reads)

What the ruling binds (verbatim, items 1–2, 4–5 of 6259332195)

  1. The comparison. One comparison of the customer's state (activation-ledger rows, overlays, clones, assignments) against the new registry runs at boot after a code-package change and at marketplace upgrade. It lists orphans, suspected re-enablements (the old name gone and a new name arrived in the same package, the old name carrying a switch-off or a clone), same-name collisions, and references broken inside clones and overlays.
  2. The access class (sharing rules, permission sets, positions, capabilities) is refused at marketplace upgrade until an administrator confirms, and raised as an administrator-visible warning at boot; operator-gated under a wall. Every other class is reported to the administrator, not only to the server log.
  3. Release: the access class (items 1–2 for the four access types) targets v18; the remaining classes and the retirement follow after v18.
  4. Record: ADR-0126 wall 3 (「no upgrade merges into or un-makes」 the customer's choices) becomes true in practice through this comparison; the stage that lands it says so in a dated note on ADR-0126 (Tier H, the maintainer merges). No rename spelling is added to the spec.

Measured starting points (origin/main e22defb13c; the seat's read-only measurement behind #24443)

  • Keys are bare names.
  • Existing fragments to reuse:
    • packages/plugins/plugin-security/src/catalog-reference-report.ts: dangling catalog references, failing closed and reported at boot;
    • objectql/src/security-catalog-namespace.ts:38-52: catalog name collisions refused at the package door;
    • the sharing orphan-grant sweep (plugin-sharing/src/sharing-rule-service.ts, sweepOrphanedRuleGrants).
  • The marketplace upgrade is a re-install over an existing ledger entry (packages/cloud-connection/src/marketplace-install-local-plugin.ts:2577, answer at :1698). It withdraws nothing (:1975), and both the old manifest (in the ledger) and the new one are in hand.
  • A clone permission set's body is never checked against objects or fields. Unlisted fields are visible (plugin-security/src/explain-engine.ts:886).
  • Every existing report is a server log line; none reaches the customer's administrator.

Stages (the seat cuts them; each measured first; each under 3,000 lines)

  • U1: the comparison core, plus the boot report for the access class.
    • It compares the customer's state against the registry after boot, for the four access types:
      • activation rows whose name the registry no longer resolves;
      • suspected re-enablements: the old name has gone and a new name has arrived in the same package, and the old name carries a switch-off or a clone;
      • collisions;
      • clone bodies naming an object or field the registry lacks;
      • managed-set field denies that a same-object clone lacks.
    • It raises an administrator-visible warning. Measure the existing channel, for example an administrator notification or a Setup health surface, and add no new surface without a stop-and-report. Under a wall, it is operator-gated.
    • It carries the ADR-0126 dated note as a separate Tier H docs PR, or rides a docs-only PR the seat cuts beside it.
  • U2: the marketplace refusal.
    • Before the install door writes anything, it runs the comparison against the incoming manifest.
    • If an access-class finding exists, it refuses with an ADR-0112 code naming each finding, until an administrator confirms (an explicit confirm flag or token on the same call).
    • Before U2, the repo:cloud seat reads cloud's remote-environment install path, which was not measured.
  • Order and serial constraints.

Acceptance

  • A permission set the customer switched off. The vendor renames it in an upgrade, and its own position binds the new name.
    • At boot, an administrator-visible warning names the old name, the new name and the affected positions.
    • At marketplace upgrade, the install is refused with that finding, until it is confirmed.
  • A sharing rule the customer switched off (ledger) or cloned. The vendor renames it. The same two outcomes apply.
  • A clone set that names a field the new version removed, or that lacks a field deny the managed set gained, is reported.
  • No finding: the upgrade proceeds unchanged.
  • Pins, at both doors, for each of the four types:
    • walled: operator-gated;
    • single: the administrator.

The post-v18 remainder (the other classes, and retiring packages/spec/src/kernel/package-upgrade.zod.ts) is a separate card.

Activity

  1. added
    priority:p1High: required for production / M2
    area:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guards
    and removed
    priority:p1High: required for production / M2
    on Oct 19, 2026
  2. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Scheduling note · epic PM session_01Y5583bs2RDd53MH6kM1ca3 (os-steve) · 2026-10-19T04:10Z. The maintainer asked in the seat's chat: 「你所有的工作清单中,24446 这种优先级应该比较低吧」. Priority moves from p1 to p2. target:v18 stays, because ruling 6259332195 item 4 puts the access class in v18.

    What p2 means for dispatch:

    Why.

    • The defect predates this epic, and no incident has been reported. It needs a vendor rename on top of a customer customisation.
    • C8 is v18's spine.

    If v18's cut comes before this card is done, the seat brings it to the maintainer as the first candidate to move after v18. Moving it is the maintainer's word, not the seat's.

  3. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Release note · epic PM session_01Y5583bs2RDd53MH6kM1ca3 (os-steve) · 2026-10-19T04:25Z. This card moves to 18.1. The maintainer's 「同意」 on the 18.0-fresh-installs scope (ruling record 6259608309 on #15194, item 3) amends item 4 of ruling 6259332195. target:v18 is removed, and the repo has no target:v18.1 label. The scheduling note 6259462343 still applies.

  4. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Maintainer decision: the access class moves from 18.0 to 18.1 · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-19T07:29Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.

    Provenance. The seat put its 18.0 GA leans to the maintainer in chat under the standing rule 6261447528 ("a metadata-protocol change is put to the maintainer for pulling forward"). The maintainer answered 「同意你的建议」.


    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

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions