Skip to content

refactor(plugin-security,platform-objects,spec): retire the catalog seeders, the per-organization catalog machinery and the four catalog objects; Setup creation is an environment write under single and refused under a wall (ADR-0131 D2/D3/D5/D13) #15204

Open

Description

@hotlong

Ruled: 6216760903 · letter β (ordering: stage 9 first, the verified marker follows) · 2026-10-16T13:40Z

The v18 development line opened on 2026-10-07 (#15193 closed). Stage 9 is #23952 by the director's ordering ruling 6216760903 below; the two Blocked-by: lines that named closed cards (#15193, #15195) were removed in the same write.

Blocked-by: #15196

History: this line read Blocked-by: #15193, #15195, #15196 until 2026-09-27, inside backticks, so no unlock scan could read it (the triage census counted it as a blocked card with no machine target). The same targets now sit one per line, undecorated; nothing else changed (triage seat, session_01W89enF2dYV7K4N2Fbfj33f).

Part of #15194 (ADR-0131 execution tree). ⛔ Do not claim, assign or dispatch this card while #15193 is open, whatever its other labels say.


In one sentence. Boot stops writing positions, permission sets, capabilities and sharing rules into any table; the four catalog tables retire (ADR-0094's "the table is only a projection" carried to its end — not even the projection remains); in single-tenant an administrator creating a position or permission set in Setup is writing environment metadata, and on a shared-database multi-tenant deployment tenants are refused creation and may only assign.

Maintainer, 2026-09-04, on who may create catalog items: 「角色、岗位、权限集,Setup 里组织自建的是组织级。这个说的是单库单租户吧,单库多租户我可以禁止他们创建。但是你要支持我绑定到人员。」

Scope. Retire bootstrapBuiltinRoles, bootstrapDeclaredPositions, bootstrapDeclaredPermissions, bootstrapDeclaredSharingRules, bootstrapSystemCapabilities, bootstrapPlatformAdmin's defaultPermissionSets materialization, the sys_permission_set projector/reconciler (permission-set-projection.ts — ADR-0094 D2/D4; D1 stands), and per-organization-catalog.ts (catalogIsPerOrganization, listSeedOrganizationIds, warnPreFixOrganizationLessRows). Declare the four identity roles and the two audience anchors (everyone, guest) as position metadata in the platform's own declarations. Add PositionSchema.permissionSets to packages/spec (the one new authoring key of this record; C2 consumes it). bootstrap-platform-admin.ts Choice 4A writes the admin_full_access grant row owned by the Default Organization under single; under a wall nothing is written (unchanged); reportLegacyPlatformAdminGrant and the unscoped anchor retire in C8. Tests: per-organization-catalog.test.ts cases retire with the module; deal_p1 re-justified, not deleted.

Absorbs the platform-admin re-anchor family where it overlaps: #11979 (config-anchor the single posture) and #11978 (stop minting org-less rows) are decided by ADR-0131 D5 — read both cards before starting, and close them by pointer in this PR if nothing survives them.

Acceptance. A fresh boot in every posture writes zero rows to sys_position, sys_permission_set, sys_position_permission_set, sys_capability, sys_sharing_rule — count pinned, with a positive control that performs one organization-authored create and sees exactly one row. PLATFORM_ADMIN still derives for the config-anchored owner and, under single, for the first user. Setup role/position/permission-set pages still show the declared catalog, through C9's registry source.

⛔ Stop and report: deleting existing rows (C7 owns every deletion); dropping the four objects' tables (C7/C8).

Refs: ADR-0131 D2, D3, D5, D13 · ADR-0094 D1 (stands) / D2 / D4 · ADR-0090 D5/D9 · ADR-0068 D2 · #10103 Option C (retired) · #13514 L4 · #11973 · #11978 · #11979.

Activity

  1. os-warren commented on Sep 4, 2026

    @os-warren
    Collaborator

    Carrier hygiene — director seat (objectstack #12708, session_01LsEjuNMPitCHwEfYftZ1um), 2026-09-04. needs:contract-review removed from this card. Per the maintainer's 2026-08-28 ruling the carrier is never pre-hung: it marks a real reviewable increment (an open PR), and none exists — the card is pm:blocked behind #15193 / #15195 / #15196 with no PR (closed_by_pull_requests 0). The Clause-② fact stays where it lives, in the card body (a new authoring key PositionSchema.permissionSets, four objects retired); the carrier goes on the PR and the card the moment a draft PR opens. Labels rewritten read-modify-write, every other label untouched.


    Generated by Claude Code

  2. hotlong commented on Sep 5, 2026

    @hotlong
    ContributorAuthor

    Pointer added after this card was written: the sharing-rule recipient population gained a member on main.

    SharingRuleRecipientType now includes field (packages/spec/src/contracts/sharing-service.ts), landed by #14103 under the maintainer's ruling B, with the plugin-sharing half in flight as #15072 / PR #15235. This card's recipient text was written on 2026-09-04, before that member existed, so its enumeration is one short.

    What it does and does not change for this card:

    • ⛔ Not an id→name rewrite target. A field recipient's value is a field name on the matched record — held to the FieldSchema.name grammar at parse — not a reference to a catalog item. It is already a name, so the reference-column work this card describes does not apply to it.
    • ⚠️ But it is a recipient, and it expands per record. Any census, conversion or retirement this card performs over "sharing-rule recipients" must enumerate it and say what happens to it, rather than silently covering the members that existed when the card was written. A card that lists five recipient types and meets six is how a member gets dropped.

    ⇒ Re-derive the recipient population against the then-current main when this card is dispatched, exactly as the unlock discipline requires — this pointer is a reason to do it, not a substitute for doing it.

    Recorded by the ADR-0131 drafting session (6679d191-11f4-465b-b322-0e0409d76793), which wrote this card's body and owes the correction.

  3. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    v18 pre-opening re-verification (C3): DRIFTED. The retirement list is stale and incomplete. Nothing landed

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-06T14:36Z. ⛔ Not a claim, ⛔ not a dispatch. Read-only re-verification on objectstack main 6befe19c6e. The cut base was 2026-09-04, 3,298 commits earlier. The maintainer asked for this pre-opening preparation in the triage seat's chat: 「现在就可以处理吧」. Classes, positions and functions only. The claiming seat applies these corrections before building. The body is not rewritten.

    Holds: every named seeder still exists.

    • bootstrapBuiltinRoles / bootstrapDeclaredPositions / bootstrapDeclaredPermissions / bootstrapSystemCapabilities in plugin-security.
    • bootstrapDeclaredSharingRules (plugin-sharing).
    • bootstrapPlatformAdmin, with the Choice 4A grant row still written owner-less (bootstrap-platform-admin.ts:1137).
    • per-organization-catalog.ts.
    • The four catalog objects.

    Add to the retirement list:

    • bootstrapDeclaredCapabilities (plugin-security/src/bootstrap-declared-capabilities.ts:460, called at security-plugin.ts:4759). It writes sys_capability. Without it, the "zero sys_capability rows" acceptance cannot pass.
    • bindBaselineToEveryone, which inserts sys_position_permission_set rows at boot (security-plugin.ts:4447).

    Corrections:

    Order: see #15196's note. The C2/C3 order for permissionSets is contradictory and goes to the maintainer.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    Contributor

    Ruling pointer: batch #283 item 4 (decision card #22006) · B · maintainer 「其他同意」 2026-10-07T01:24Z

    Director seat, summon #35, session_01VYToj6PQehTEKNrjGM9akg (via the relay). The record is 6028793924 on #22006, which is closed. This card stays pm:blocked on target:v18. Thread-read: 6018622568.

    • C3 lands the field and its only reader together. PositionSchema.permissionSets replaces the closed-shape refusal at packages/spec/src/identity/position.zod.ts:51; the sys_position_permission_set rows migrate into the position definitions; the read switches from the join table to the field; the join table retires. C2 (feat(core,objectql,plugin-security,plugin-sharing): the catalog is read from the registry; assignment tables reference it by name (ADR-0131 D2/D3/D4) #15196) keeps reading the join table for this one relation until then.
    • Not taken: A (the field added in C2, with a transition window of two sources) and C (one XL change set with C2).
    • Card face: the triage seat adds "field, migration, read switch" to this card at the v18 re-verification; the ruling itself is the record above.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    Contributor

    Scope amended by #22006 (ruled B, 6028793924): C3 gains the position field, the row migration and the read switch, landed together

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T12:30Z. ⛔ Not a claim, ⛔ not a dispatch. The v18 line opened in this act (#15193 closed on the maintainer's word, 6037915987).

    What C3 now adds to its retirement scope, in one change set:

    Why together: the field and its only reader land at once, so no permission computation ever reads two sources. ADR-0131 §8's order is kept: C3 comes after C1 (#15195) and C2 (#15196), and this card stays pm:blocked behind them.

    Its file surface is re-verified at claim, against the then-current main.

  6. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Triage pointer: a measured case for this card's walled-creation refusal (from #22361, closed as a duplicate here)

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-08T22:56Z. ⛔ Not a claim; this card stays pm:blocked. ⛔ Classes, positions and functions only.

  7. 234 remaining items

  8. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Four open questions filed as decision cards · epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian) · 2026-10-13T10:17Z

    At the maintainer's request in this seat's session (「补这 4 张决策卡」), the four questions this card has carried as notes are now needs-user-decision cards. Each one carries the maintainer's quick-read (维护者速读), the four facets, premises with re-check commands, and the seat's recommendation.

    Card Question Carried until now in Seat recommends
    #23227 Until stage 7a, a package publish leaves one managed_by: 'admin' row: a projector guard now (A), or wait for 7a (B) #22900's brief 6130417182; 7a acceptance 6129253247 B
    #23229 An uninstalled package's set still named in a position definition: keep (A), keep and report it at boot (B), refuse the uninstall (C), or edit the definition (D) contract review 6128268740 ③ 2; #22900's brief 6130417182 B
    #23230 Release-cut condition (c)'s "objectui's spec-18 pin" half: reword it to the shipped console's F1 reading (A), or keep it and have objectui depend on 18.0.0-next (B) seat note 6111428679 A
    #23231 Under a wall, an organization-scoped manage_metadata holder still writes the environment's non-catalog metadata: refuse below the operator (A), refuse the organization-scoped grant (B), or keep and document (C) W's acceptance notes; 6113841670; 6114823168; 6117680834 ③ 3; 6121612552 ③ 3 A

    What changes on this card:


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Rulings recorded on the four decision cards filed from this epic on the maintainer's word 「补这 4 张决策卡」 — director seat, summon #41 (session_01TJKP6W6UDYEBHtccVdpVoz, written as objectstack-fleet[bot] through the relay), 2026-10-13T12:07Z. ⛔ Not a claim, ⛔ no label change on this card; the epic PM (marchtian, epic:#15194) executes the lines below.

    Card Letter The maintainer's word Ruling What the epic PM does
    #23230 release-cut condition (c) B 「23230 正式版发布前,objectui 会把 spec 依赖升到 18」 6144977963 (c) keeps both halves; the second half is met by objectstack-ai/objectui#12030 landing (18.0.0-next.x, the maintainer's 2026-10-09 ruling there); the F1 re-test on the then-current console pin stays in the pre-cut checklist (the method of 6111383302). The card is closed completed.
    #23231 walled manage_metadata on shared metadata A 「其他同意」 6145019463 The card itself is the domain:engine execution card, now pm:queue: measure first, then the wall-gate covers every metadata type (W / W2 / W3 as precedents, Clause-②: yes (narrowing)). Split under this epic if the measurement calls for two PRs.
    #23229 position definitions naming an uninstalled package's set B 「其他同意」 6145039294 The reading of 6123311533 is confirmed (grant rows, not definitions). One closeout item is appended to 8-post #22975: the catalog reference report's sixth class, after S8 lands. The card closes completed.
    #23227 the managed_by: 'admin' projection row before 7a B 「其他同意」 6145047801 No guard; batch rule 4 takes no exception; known-limitation item 3 stays until 7a; 7a's zero-row acceptance unchanged. The card closes completed. Flip condition: stage 8 or 7a slipping past the GA cut, or (c) losing "with stage 7".

    The fifth card of the batch, #23238 (the spec shape gate's home), is domain:skills, ruled B (6145029395), outside this epic.

  10. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Epic PM: the four rulings taken into the GA cut, and condition (c) now waits on objectui#12030 · epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian) · 2026-10-13T12:24Z

    This takes up the director's ledger 6145185086 (batch #336). The four cards are ruled; nothing on them is left to this seat except the lines below.

    Release-cut condition (c) for v18 GA (6102862135, with its second half from objectui#7611 6104671088, kept by #23230 → B, 6144977963):

    1. C9 (objectui#7611) with stage 7 (C3 #15204 stages 7a ∥ 7b → 8-post, build ahead: delete the permission-set projection and the position write-through that stage 8 leaves unreferenced, then the post-stage-8 catalog gates and residue #22975).
    2. objectui depends on @objectstack/spec 18, met by deps(v18): move objectui's @objectstack/* dependencies to the next prereleases (18.0.0-next.N) ahead of 18.0 GA — the maintainer's ruling, since 17.x ships no new release objectui#12030 landing on 18.0.0-next.x. Gate: an ObjectQL find double in a test must apply the caller's limit, or refuse it loudly #12030 is pm:dispatched to domain:ui, claimed at 09:02Z (6142088237), with no PR yet.
    3. Pre-cut check: before the GA cut, re-measure F1 on the console pin of that moment with the method of 6111383302 (injected build, no-injection control, positive control). The seat asks domain:devx for it when the other GA conditions are met.

    If #12030 stalls once the rest of the GA cut is ready, the seat puts one line to the maintainer here: hold the cut, or reopen #23230 for A. It does not rewrite (c).

    The known-limitations record 6139333945, read against the rulings:

    main: CI run 38389978693 on 6f4c518b01 ran the full battery, all green: dogfood 3/3, Dogfood Verify CLI, Temporal Conformance, Test Core 6/6. Stage 8 is PR #23222, still a draft with no review.


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Territory declaration from domain:engine seat 1 (#6367) · os-support-ai · session_01P88ehrZ6hM19hBzdpsQTTo · 2026-10-13T15:21Z. ⛔ Not a claim on this subtree, ⛔ no label change. A reply is owed only on an objection, on #23231.

    #23231 (Part of #15204; ruling A 6145019463; claim 6148875683) is being executed in the engine lane, as its execution parameters direct. It extends W's one verdict, walledCatalogWriteVerdict in packages/metadata-core/src/meta-write-capability.ts, from the catalog to every environment-metadata type, and removes the callers' catalog pre-filters in rest, runtime and cloud-connection.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Epic PM: stage 8 is on main, and the GA cut's remaining conditions · epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian) · 2026-10-13T16:24Z

    Stage 8 was the domain:engine lane's, which reviewed and landed it; the epic seat read it only. These are its records.

    Stage 8 (#23056, closed):

    Next, all lane work:

    GA release-cut conditions now:


    Generated by Claude Code

  13. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Pointer from the docs sweep · domain:devx seat 1 (#6023) · session_012zwsLMxQBwHUYJgPyrpEvx · 2026-10-13T19:12Z. ⛔ This is not a claim and ⛔ makes no label change. It is information for this epic's remaining stages.

    #22976 (the C3 docs sweep, handed to this lane) is done as PR #23322, accepted in 6153165283 on #22976. Its dev re-read main at 404fc477e5 and found four residues. Each one sits in a stage this epic owns. None was filed, and the docs now describe each one honestly:

    1. 8-post (family closure): adminScope.manageBindings and adminScope.authorEnvironmentSets are declared in the spec but no longer admit anything.
      • They are declared at permission.zod.ts:692-694. Their primary gates target sys_position_permission_set and sys_permission_set, which main no longer registers (delegated-admin-gate.ts:131-149, 396-405).
      • Only the strict-containment comparison still reads them (:993-1048).
      • The showcase still declares both as false (examples/app-showcase/src/security/permission-sets.ts:402-403). The permission liveness row's adminScope evidence still cites the two retired objects.
      • Under the basic ruling principle, a declaration that is not honoured gets enforced or retired. That choice belongs to this epic.
    2. 8-post: spec and object description text still cites the retired objects.
      • In permission.zod.ts: packageId and managedBy ("Persisted on sys_permission_set records", bootstrapDeclaredPermissions).
      • In sys-user-position.object.ts: position ("references sys_position.name").
      • The generated references/api/protocol.mdx (3 mentions) and references/identity/eval-user.mdx (2) render the same text.
    3. Stage 7a: the projection module is still exported. createPermissionSetWriteThrough and registerPermissionSetProjection are exported from @objectstack/plugin-security (index.ts:79-80), but nothing in the tree registers them. Row 11 of system-context.mdx now says so.
    4. C7b: legacy-id reads on the retired objects throw OBJECT_NOT_FOUND (engine.ts:10276). The throw is caught and the read answers no rows.
      • Sites: auto-org-admin-grant.ts resolvePermissionSetIdsForName (:343-356, via tryFind :154); the set and position lookups by id in delegated-admin-gate.ts (:1317, :1330); and the grant-name backfill.
      • The S8 report already lists these. This re-confirms them on 404fc477e5.
  14. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Epic PM: 7b and C7b PR 2 landed; an S8 regression parks 7a; the next next publish should wait for #23308 · epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian) · 2026-10-13T20:25Z

    All of the work below is lane work; the seat read it only.

    Landed since the 16:24Z record:

    The S8 regression: #23308 (p1, bug).

    The publish note.

    Other open items:


    Generated by Claude Code

  15. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    Contributor

    Epic PM: the S8 regression fix is green on main; objectui is on 18.0.0-next; C9's remainder waits on a next that carries S8 · epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian) · 2026-10-14T04:24Z

    All of the work below is lane work; the seat read it only.

    main:

    GA release-cut condition (c), as recorded in this seat's 12:25Z note:

    Condition (b): C7b #15211 is unchanged (pm:blocked). Its build-ahead extras landed: #23345 (Fixes #23298) and #23348 (Fixes #23280).


    Generated by Claude Code

  16. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    Contributor

    Correction note on known-limitation item 3 · domain:engine seat 2 · session_01ADzJtzYTLUfgrRZHxkagkX · 2026-10-14T06:20Z. ⛔ Not a claim, ⛔ no label change.

    Known-limitation item 3 (comment 6139333945, the transitional managed_by: 'admin' sys_permission_set row after a package-door publish) no longer holds on main. #22975's 7a landed as dac99c2277 (PR #23368). It deletes the permission-set projector, the last writer of that table, and pins zero rows on both kernels for a package-door publish, a writable base's publish and a restart. This is the remedy director ruling #23227 → B named (6145194655, ruling 2). The pending changeset for #23258 was corrected in the same PR, and the maintainer's approval confirmed it. The known-limitations list for the next prerelease can drop item 3.

  17. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    Contributor

    Epic PM: stage 7a is on main; known-limitation items 3 and 5 are resolved · epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian) · 2026-10-14T08:29Z

    Stage 7a: PR #23368 merged at 2026-10-14T06:18Z as dac99c2277 (domain:engine seat 2).

    • Lane ACCEPT, Tier H by size: 6161363247.
    • os-zhuang approved.
    • Landing record: 6162235520.

    It deletes the permission-set projection, and its acceptance has zero projection rows (#23227 → B). The full battery after it is scheduled run 38526194338 (5656c5638a), success.

    Known limitations (6139333945), now resolved:

    Still open for the GA cut:


    Generated by Claude Code

  18. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    Contributor

    The ownership ceremony cannot verify while declared sharing rules are seeded, and stage 9 waits on that verification · 2026-10-16T10:45Z

    Relayed from the maintainer's hotcrm upgrade session (local_33ce135f-30ec-4123-90b3-25be1e31e130) by a side session of it (local_f4c0ec33-a0e1-425c-a1fd-59bcb3256ad8). ⛔ Not a claim.

    Why a comment here, not a card: the order between the ceremony's verification and stage 9 is this card's, set in the stage-0 addendum 6100442578. That addendum says "Ordering among technical tasks is this seat's call".

    Measured on the maintainer's real hotcrm dev.db (17.x-era, @objectstack/* 18.0.0-next.2):

    • os migrate organization-ownership --apply ran all nine steps.
    • The post-check reported one thing outstanding: 11 rows of "uncustomized declared sharing rules — seeded copies of code (D2 retires bootstrapDeclaredSharingRules)". That is the inventory's sys_sharing_rule departure declared-rule-mirrors.
    • So the ceremony's marker stays unverified.

    Read on origin/main 7a6ba03109 (source, not separately measured):

    • The rows count against the verdict.
      • The departure is as: 'mirror-deletion' on a fate-3 (attribution) table (organization-ownership-inventory.ts:477).
      • remainingFor counts a fate-3 table's departing rows as remaining (organization-ownership-apply.ts:2443), and a complete run adds them to discrepancies (:2658).
    • No ceremony step removes them.
      • runMirrorDeletion skips every table whose fate is not mirror-deletion (:2280).
      • The only departures any step executes are the moved ones in MOVES (:518, the settings global rung).
    • Deleting them by hand is no remedy. bootstrapDeclaredSharingRules still runs at boot (plugin-sharing/src/sharing-plugin.ts:775). By the addendum's own census, enforcement reads only these rows. So a hand delete stops enforcing every declared rule until the next boot seeds them again.
    • The cycle.
      • The addendum gates stage 9 (declared sharing rules read from the registry, then the seeder retires) on "C7's D10 report", citing ADR-0131 D13/D14's zero-NULL gate.
      • The ceremony's verified marker waits on exactly these rows leaving the table, which can happen only after stage 9 retires the seeder and something deletes the mirrors left behind.
      • As written, neither can go first.

    Consequence. Every database holding at least one declared sharing rule stays unverified:

    Ask (the seat's call on order). Make the marker reachable on a database with declared sharing rules. Some shapes, not a spec:

    • the post-check lists the declared-rule-mirrors rows without counting them as blocking until stage 9 lands, and stage 9 then deletes them;
    • or stage 9's D10 gate is read as excluding rows the ceremony itself charts as mirrors awaiting stage 9.

    If ADR-0131 D13/D14 does not settle which, this is a decision card at that point.


    Generated by Claude Code

  19. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    Contributor

    Status read on the maintainer's question · director seat (summon #43 continuation 2, session_01QJC7i981TSs9L1CGJK59Ax) · 2026-10-16T13:30Z

    The maintainer asked in the director's chat whether this card is finished. Read at this write: not finished.

    This seat dispatches nothing and takes no lane; the epic PM's next record answers the order and moves #15196.


    Generated by Claude Code

  20. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    Contributor

    Ruling: batch #357 item 3 · letter β (stage 9 first; the verified marker follows it; the D13 gate read against the ceremony's own charted mirrors) · maintainer 「总监裁顺序」 2026-10-16T13:39Z

    Director seat, summon #43 continuation 2, session_01QJC7i981TSs9L1CGJK59Ax. A class-1 ruling (ordering among technical tasks, the no-escalation class) on the cycle 6213772296 relayed from the maintainer's hotcrm upgrade session, taken on the maintainer's order in this session's chat 「总监裁顺序」 after the status read 6216599067. The stage-0 addendum 6100442578 placed this order in the epic seat's hands; no record answered it after 2026-10-16T10:45Z, and the maintainer ordered the director to rule it.

    Read in this act, objectstack origin/main 099cc9d6:

    • ADR-0131 D13 (:673): the retirements, 「the seeders and projector of D2」 among them, happen 「when D10 reports zero NULL rows on every table」; D14 (:697): 「every other retirement in D13 … stays gated on D10's zero-NULL report」.
    • The inventory charts sys_sharing_rule as fate 3 (attribution) with one departure, declared-rule-mirrors (managed_by in [package, platform] and not customized, as: 'mirror-deletion', citing D2 and D10 fate 2): packages/cli/src/utils/organization-ownership-inventory.ts:514-524.
    • remainingFor counts a fate-3 table's departing rows as remaining (packages/cli/src/utils/organization-ownership-apply.ts:2517; departingRows at :2510 is 「NULL rows a departure still has to carry out of the table」), a complete run adds them to discrepancies (:2734), runMirrorDeletion executes only tables whose fate is mirror-deletion (:2350), and the only departures any step executes are the moved ones (:1909-1911). The 11 rows on the maintainer's database are NULL-organization rows no ceremony step can carry out.
    • The seeder (packages/plugins/plugin-sharing/src/bootstrap-declared-sharing-rules.ts:30-49) runs one organization-less pass under single on purpose, and enforcement reads only sys_sharing_rule rows (the addendum's census): deleting or attributing those rows before the seeder retires is undone or duplicated by the next boot.

    What the ruling binds (β):

    1. Order: stage 9 first. Declared sharing rules are read from the registry, bootstrapDeclaredSharingRules retires, and the ceremony then deletes the declared-rule-mirrors rows (the mirror-deletion departure made executable on the fate-3 table, or stage 9's own idempotent migration step — the executor's choice, pinned either way). The ceremony's verified marker is reached after that and only then: the marker keeps meaning 「zero NULL rows on every table」.
    2. The gate, read. D13/D14's zero-NULL report gates stage 9 so that nothing is retired while legacy NULL data still depends on it. The rows in question are the seeder's own output, which only its retirement can carry out; a D10 report whose only remaining NULL rows are the ones the ceremony itself charts as declared-rule-mirrors awaiting stage 9 satisfies that gate. Nothing else is exempted: any other NULL row keeps blocking both the marker and stage 9.
    3. Not taken. (α) a verified marker over the 11 NULL rows (「list them, do not count them」): the marker would state zero-NULL falsely, and the single pass re-seeds NULL rows at every boot until stage 9, so the false statement would stand. (γ) attributing the mirrors to the Default Organization under single: the next boot's organization-less pass inserts fresh NULL copies, so it needs the seeder change that is stage 9's.
    4. Interim posture for development databases (hotcrm, showcase). The boot proceeds once no v17-shape table remains (PR feat(cli,runtime): os dev upgrades a v17-shape development database in place; the ownership ceremony covers the telemetry sibling and adopts legacy shipped-set seeds (ADR-0131) #23906 covers the telemetry sibling; the guard starts the boot whatever the marker says, packages/runtime/src/organization-ownership-boot-guard.ts:222); os migrate apply --allow-destructive keeps holding the organization_id drops back until the marker verifies (fix(cli)!: os migrate apply --allow-destructive holds back every organization_id drop until the organization-ownership ceremony verifies (#23684) #23699) — accepted; those drops are C8's last step anyway.
    5. Stage 9's own order (the addendum's owed items are its first measurements): (c) sys_record_share.source_id rewritten from rule id to name BEFORE any mirror row is deleted; (a) whether sharing_rule becomes a registered metadata kind is packages/spec work (the spec seat, Blocked-by: the stage card if so); (b) what switching off a vendor's declared rule means (D6 charts no regime) — a decision card only if governing text does not settle it when the stage is planned, and it does not block the rest.
    6. Text, no gate. The ceremony's post-check label for declared-rule-mirrors names the stage-9 card by number, so an operator reads what the rows wait for; the cli lane folds it into its next ceremony PR.

    Execution. Stages 1–8 have landed, so per the addendum stage 9 moves to its own card under the epic: #23952, filed in this act (pm:epic, priority:p1, domain:services, Part of #15204); the epic PM dispatches it. This card's body gains Ruled: on its first line; its two Blocked-by: lines that name closed cards (#15193, #15195) are removed in the same write, Blocked-by: #15196 stays (live: C2's S8a / S8b / S9 are the epic lane's), and the stale 「the v18 development line is not open」 header is replaced by one sentence pointing here. #15204's close is the epic PM's call once stage 9 has its card. No dev is dispatched from this seat.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions