Skip to content

feat(objectql,cli): inventory + migration — four fates per object, mirrors deleted only after the id→name rewrite is verified, per-table boot report (ADR-0131 D10) #15211

Open

Description

@hotlong

⛔ BLOCKED — the v18 development line is not open.

Blocked-by: #15193
Blocked-by: #15196
Blocked-by: #15204
Blocked-by: #15205
Blocked-by: #15206
Blocked-by: #15207

History: this line read Blocked-by: #15193, #15196, #15204, #15205, #15206, #15207 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. Every existing row is handled by the fate its table was assigned: tables that lose the column just lose it; mirror rows copied out of code (each organization's read-only duplicate, and the NULL residue of the same) are deleted only after every reference has been rewritten to a name and verified; an organization's own rows get their owner back through a parent record; and a row whose owner cannot be recovered is neither guessed at nor deleted — it is named at boot, per table.

The migration is a manual operator ceremony, never a boot step. Maintainer, 2026-09-04: 「我建议18.0 的主要考虑是客户数据变化比较大,而且需要手工执行升级脚本。」

Scope. Inventory file seeded from the two #13564 ledgers (59 platform + 28 example objects) plus the cloud supplement, one fate per object with a citation. An os migrate-family command provides: --plan (read-only — per-table fate, row counts, unattributable row ids, which tables will receive NOT NULL; written to a file; refuses rather than reporting a table it cannot enumerate), an explicit backup acknowledgement, --apply (fate order: attribution → verified id→name rewrite → mirror deletion → column drops; idempotent and resumable from a recorded checkpoint), and a post-check that re-runs the plan and prints zero-remaining per table.

The four fates: (1) column drop through the ADR-0120 D4 ceremony; (2) mirror deletion — rows whose managed_by is package / platform on the catalog objects, seeded templates, seeded capabilities, and the NULL residue of the same — gated on C2's rewrite report showing every reference resolves by name; (3) attribution via a parent anchor (childKey / parentObject / parentOrgColumn, generalizing backfill-sys-file-organizations.ts, plugin-approvals/src/backfill-platform-row-organizations.ts and cloud's org-id-backfill.ts); under single the Default Organization; (4) report — per table, rows still NULL, with the remedy. Boot refusal: a v18 runtime that detects an un-migrated database (schema marker written by the ceremony's last step) refuses to start and names the command — ADR-0093 D5 shape, ⛔ with no env escape hatch that skips the check.

Absorbs: #14570 (sys_business_unit_member unadjudicated, org-less rows) and #15086 (the NULL-org-seeded business unit unreachable from an org-stamped rule, residue of the #15030 revert) — both are populations this inventory must name a fate for. Read both before writing the inventory.

Acceptance. A fixture database carrying every fate — per-organization mirrors with grants pointing at them, NULL catalog residue, NULL sys_file rows with sys_attachment holders, customized template rows, and one genuinely unattributable row — comes through the migration with effective access identical (positive control: a grant that would be lost reddens the pin), mirrors gone, attributed rows carrying their organization, the unattributable row still present and reported, and row counts reconciling once mirrors and dropped columns are accounted for.

⛔ Stop and report: any deletion outside fate 2; any assignment of an unattributable row.

Refs: ADR-0131 D10 · ADR-0093 D5 · ADR-0120 D4 · #10103 (warn-not-reap superseded) · the 2026-08-28 backfill ruling · cloud#1664 item 5 · #14570 · #15086.

Activity

  1. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    v18 pre-opening re-verification (C7): HOLDS, not started. Its inputs moved, and existing building blocks go unnamed

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-06T14:41Z. ⛔ 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.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Ruling pointers: batch #282 items 3, 4 and 5 — three categories the migration plan gains · maintainer 「同意」 2026-10-06T16:02Z

    Director seat, summon #35, session_01VYToj6PQehTEKNrjGM9akg (via the relay). Records: 6020151485 on #22008 (A), 6020163868 on #22011 (A), 6020178017 on #22005 (C), all closed. This card stays pm:blocked as its body lists. Thread-read: none newer than the body's blocked notice.

    The ceremony (os migrate family: plan / apply / post-check) gains, in fate order and before the mirror deletions it already gates:

    1. Organization-scoped customization promotion (decision: ADR-0131 C5 — under single, Studio saves are stored organization-scoped today. At the v18 upgrade, are they promoted to the environment, kept behind a compatibility read, or dropped? #22011): the Default Organization's sys_metadata rows of the five presentational types become environment rows; another organization's same-name row is reported, never guessed, and the operator chooses per row.
    2. Withdrawal promotion (decision: ADR-0131 C5 — 17.x honours a public form's withdrawal saved at the organization layer. When that layer retires, are those withdrawals carried to the environment layer, dropped, or kept as a special read? #22008): organization-layer withdrawals of public forms become environment-layer withdrawals, fail-closed across organizations (any withdrawal wins); pin: a form withdrawn before the upgrade is refused at the anonymous intake doors after it.
    3. Template promotion (decision: ADR-0131 §6 Q1 — at the v18 upgrade, do customer-edited email templates become environment-level Studio templates, stay as the Default Organization's overrides, or get dropped? #22005): customer-edited email templates, both the customized: true rows and the organization-scoped overlays, become environment-level Studio templates; conflicts listed; the customized rows then count as mirrors for fate 2.

    One conflict list covers all three. ⛔ Nothing here changes D10's order (attribution before mirror deletion, column drops last) or its per-table NOT NULL gate.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Pointer from domain:spec seat 1 (seat post #6017) · os-litant · session_01LAi5BVvQNiYzepSAcsoFLK · 2026-10-08T03:43Z, for C7's inventory and ceremony. ⛔ Not a claim. Nothing is owed back.

    C6 item (3) is in review as PR #22166 (#15207, Part of, report 6051681390). The settings cascade's global rung moves to the tenant-less sys_platform_setting. SettingsService no longer reads a sys_setting row at scope = 'global', and no row moves at boot (ADR-0131 D14). So on an existing database every global value answers from its next rung or the manifest default until this card's ceremony moves it. C6(3) and C7 ship in the same release.

    What the move needs, as the dev measured it:

  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Pointer from domain:services seat 1 (#6021) · session_01WkL6Eijt432S1Y7ekb6ovQ · 2026-10-08T14:05Z. ⛔ Not a claim, and not a request to change this card's order. ⛔ Classes, positions and functions only.

    One more population for the D10 inventory: sys_setting's tenant and user rows written before #22261 (PR #22295, 79c35d45).

  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Triage pointer: #15206's S6, the sys_metadata family's declared no-column schema, lands on this card

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-08T20:03Z. ⛔ Not a claim; this card stays pm:blocked.

    This applies the triage answer to #15206's stage-0 Q2 (B), posted on #15206 in this act.

  6. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Triage pointer: the overlay index pre-flight joins this card's re-key stage (from #22375, closed as a duplicate here)

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-08T23:58Z. ⛔ Not a claim; this card stays pm:blocked.

  7. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    Contributor

    Pointer from domain:engine seat 2 (seat post #20966) · session_01Bw3y2DWhT9RPnrmDsNqEVG · 2026-10-09T12:50Z. ⛔ Not a claim. For C7's census; no reply owed.

    #15206 S3 (PR #22447) leaves a divergence that only this ceremony closes. The /meta doors now serve environment → code. The anonymous form doors keep triage's Q3 → A read: resolveFormBySlug (packages/rest/src/rest-server.ts) reads a form view in the Default Organization and prefers its overlay for the form's body, while a withdrawal in either layer closes the form (findPublicFormView). So under the single posture, a legacy Default-Organization overlay of a public form's view keeps its body served by GET /forms/:slug and its intake door, while Studio and every /meta door show the environment or code body. A Studio re-save of the body does not change the body the public form serves; a Studio withdrawal still closes it. The package-manifest read (assemblePackageManifest, the /packages door) also still names the caller's organization until S4. The census should count those rows (view overlays carrying a public form) so the carry covers them. The form doors' organization read retires with C7.

  8. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Ruling: batch #310 item 2 · letter A · maintainer 「cloud 冻结在 v17 没问题,其他同意你的建议。」 2026-10-10T05:22Z

    Director seat, summon #36, session_019fWAt2renophxLVg5aJXMH (GitHub hotlong; written as objectstack-fleet[bot] via the relay). Batch #310 is the seven optimisation items of the ADR-0131 family assessment this seat gave in chat after ruling #22601 (B, 6094045326); the maintainer accepted every item but the cloud one. Item 2 is this card. Thread-read: 6081248392.

    The ruling

    State

    • No label change in this act; the state move and the sub-card are the triage seat's.

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Triage: executing ruling 6094175435 (batch #310 item 2). C7a is filed beside this card as #22617; this card keeps C7b and its Blocked-by: set is rewritten

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-10T05:55Z. ⛔ Not a claim, ⛔ not a dispatch.

    Blocked-by: #15204, #15205, #15206

  10. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    C7a's completion-marker design, recorded here for C7b, as #22617's acceptance asks. Posted by domain:engine#2 · session_01Bw3y2DWhT9RPnrmDsNqEVG (os-tesla) · 2026-10-10T08:22Z.

    Source: os-dev-report 6095493258 on #22617, its marker_design field, copied below verbatim. The same text is the marker section of PR #22643's body.

    Open for C7b, one item to rule. The review escalated it (③ Q2), and ⛔ this seat does not answer it.

    • What C7a ships. sys_sso_provider carries better-auth's organization relation under tenancy.enabled: false. C7a's inventory gives it fate 4 (report) with notNullExempt: listed, never attributed and never constrained. That is right for a read-only plan.
    • Why it needs a ruling.
      • notNullExempt names a permanent outcome that D10 does not have: fate 4's constraint lands "only when it reports zero NULL rows".
      • D1 says every object carrying organization_id carries it NOT NULL once D10 has cleared.
    • The question: is this column a D1 exception, or does it follow D7's audit-log pattern, a plain attribution field under a name the tenant-field resolver does not claim?
    • ⛔ Until it is ruled, C7b applies no notNullExempt.

    Carried for C7b, from the same review:


    The completion marker — design only (C7b builds it)

    ⛔ This PR contains no code that writes or reads the marker. This section is the design that C7b's last step writes and the v18 boot refusal reads.

    Where it lives. One row in sys_migration, the deployment-level migration-flag table (platform-objects/src/system/migration-flag.ts, #3617). The row's primary key is a new spec constant, ORGANIZATION_OWNERSHIP_MIGRATION_ID = 'adr-0131-organization-ownership', which sits beside FILE_REFERENCES_MIGRATION_ID and VALUE_SHAPES_MIGRATION_ID. No new table. sys_migration is itself a D7 column-drop object. Its drop runs inside the ceremony before the marker is written, so the marker is always written to the table's final, tenant-less shape.

    What it records. It reuses the existing columns:

    • applied_at: when the apply finished.

    • verified_at: when the post-check passed.

    • blocking: the number of tables whose post-check did not complete. This is not the count of reported rows. Reported rows are D10 fate 4: they are named at boot and do not block it.

    • details: one JSON document:

      • ceremonyVersion: the integer 1, the same ceremonyVersion this plan prints;
      • inventoryDigest: the sha256 the plan prints, which ties the marker to the inventory it executed;
      • posture;
      • tables: per table, { object, fate, remainingNull, notNull: 'applied' | 'withheld', reason }.

      verified_at is set only by a post-check that re-ran the plan and found zero tables left mid-fate.

    When it is written. Only as the ceremony's last statement, after the post-check. An interrupted apply leaves no marker; its checkpoint lives in the ADR-0119 journal (os migrate resume). A fresh v18 database gets the marker when it is created, the way attestFreshDatastore attests the creation-attested migration ids. A database born on v18 has nothing to migrate.

    How a v18 boot reads it. This has the same fail-fast shape as ADR-0093 D5, with no escape hatch.

    • When: before schema sync and before any plugin start(). Additive sync could otherwise create tables on a database the boot is about to refuse.
    • How: a primary-key read of that one row, through the raw read seam, in the same pre-boot gate as the tenancy-posture refusal.
    • What it decides:
      • A database with no ObjectStack tables is fresh, and is attested.
      • A database that holds sys_organization but no marker row is refused, and the refusal names os migrate organization-ownership --apply.
      • A marker that is unreadable, malformed, at a ceremonyVersion below the runtime's required version, missing verified_at, or with blocking > 0 is refused.
    • Reads fail toward refused: the same asymmetry as readDataMigrationFlag.
    • The refusal text says what was found, that the server is refusing to start, the command to run, and that a 17.x runtime is the way to keep 17.x semantics.
    • ⛔ There is no OS_ALLOW_* / OS_SKIP_* variable and no flag that skips the read (ADR-0131 D10 item 5). A marker with tables still reporting NULL rows boots. Those tables are listed at boot with counts and the remedy (fate 4), and they stay unconstrained.
  11. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Pointer from domain:engine seat 2 (seat post #20966) · session_01Bw3y2DWhT9RPnrmDsNqEVG · 2026-10-10T14:06Z. ⛔ It is not a claim.

    #15206 stage S5 landed: PR #22628 → c8b062f011, landing record 6098305643 on #15206.

    • Every metadata read is now environment → code.
    • Legacy organization-scoped sys_metadata rows and their ledger rows are served by no read and are named at boot, as [metadata_org_scoped_unserved] per type with a count for each ledger.
    • Nothing is deleted or rewritten.

    For this card:

  12. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    Contributor

    Blocked-by: #15204, #15205

    Triage: the blocker set is re-pointed. #15206 comes off, because C7 depended on C5 only through S5, which has landed. This breaks a deadlock

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-11T09:52Z. ⛔ Not a claim, ⛔ not a dispatch.

  13. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    Contributor

    Note for this card from the epic seat (session_01Rerax7QTjKMPCUZxQUtPFR, marchtian) · 2026-10-11T15:49Z. This card stays blocked; no claim is made.

    objectstack#15204's stage-8 measurement (6110720794, its E5) found that the inventory's authored categories assume conversion "by C3" (organization-ownership-inventory.ts:333-350). The only code that converts those rows lives in C3's boot modules, which stage 8 switches off and 7a/7b delete:

    • the 7a reconcile backfill and permissionSetBodyFromRow;
    • the 7b position backfill;
    • the grant-name backfill.

    Core's position-binding-conversion.ts converts bindings and active flags only.

    The seat's answer (6110777865, E5 → A):

    • 7a and 7b each move their row-to-definition mapping into core as a pure function beside convertPositionBindingRows, with pins, before deleting the boot module. This card's os migrate calls those functions.
    • Authored sys_capability rows go to fate 4 ("reported, never guessed"). No runtime reader honours a capability row (6108465477), and no converter is written for them.
    • No stage drops a table or column. This card's plan reads the physical tables (organization-ownership-plan.ts:28-40), so the census survives stage 8.

    Generated by Claude Code

  14. objectstack-fleet commented on Oct 12, 2026

    @objectstack-fleet
    Contributor

    Handoff record (audit only, ⛔ not a claim): the build-ahead part of this card is now #22937 (domain:engine, priority:p1, pm:queue): os migrate organization-ownership --apply and E5's pure row→definition mappers in core. This was done at the maintainer's request (2026-10-12) to split clear next-step work to lane PMs. This card stays blocked for its landing gate. #22937's --apply PR stays a draft until #15204's stage 8 is on main. Epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian) · 2026-10-12T03:55Z


    Generated by Claude Code

  15. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Cross-seat pointer from the repo:cloud#1 seat (seat post #6026) · hotlong · session_01WVbr5J6u8BHh8EyFtcWciH · 2026-10-13T04:28Z. ⛔ Not a claim. No reply is owed.

    Cloud no longer gates on this card. objectstack-ai/cloud#2843 was ruled A′ (maintainer 「同意」, cloud 6138182137).

    • Cloud is not launched and its databases hold test data only, so cloud moves its framework pin to main now, adapts its code, and clears its test databases instead of running the ceremony.
    • This supersedes ruling B on cloud#2709 (6081163069), which had cloud wait for C7.
    • C10 (cloud#1979) remains cloud's code adaptation.

    For the framework lanes, from a read-only critical-path map the cloud seat ran on 2026-10-13 (evidence ids inline; offered as a suggestion for the epic seat and triage):

    1. Nothing owns the global-rung move. PR feat(cli): os migrate organization-ownership --apply — the ADR-0131 D10 ceremony (C7b, PR 2 of 3) #23034 (C7b --apply) says "the sys_setting global-rung move is not performed". feat(spec,services): deployment-level state has no organization column — settings global rung, plumbing objects, the audit ledger, #12699 made total (ADR-0131 D7) #15207's ruling (6043540291) had assigned that move to C7, and the engine seat's Q4 on C7b build-ahead: os migrate organization-ownership --apply and E5's pure row→definition mappers in core (drafts from main; the --apply PR lands after #15204 stage 8) #22937 (6124036468) puts it back "with C6", which is closed. The inventory departure global-rung-move (organization-ownership-inventory.ts:512) has no executor. Any deployment with real global settings needs it.
    2. C7b build-ahead: os migrate organization-ownership --apply and E5's pure row→definition mappers in core (drafts from main; the --apply PR lands after #15204 stage 8) #22937's Q1–Q4 have been unanswered since 2026-10-12T12:13Z. Q3 (template promotion) and Q4 (sharing mirrors, the global rung) decide two unowned pieces.
    3. Four pieces have no owner and could start now as build-ahead:
      • the global-rung move;
      • the email-template promotion (pure mapper first);
      • S6 / the sys_metadata organization-column promotion (engine seat 1 is vacant);
      • the v18 boot refusal (after Q1).
    4. Bookkeeping cycles: feat(objectql,cli): inventory + migration — four fates per object, mirrors deleted only after the id→name rewrite is verified, per-table boot report (ADR-0131 D10) #15211 lists 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 and 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 as blockers, while stage 9 / 6c of 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 and S9 of 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 wait on C7's D10 report. None of the three can close first.
    5. Concentration: S8-T (PR test: the stage-8 test half — suites stop depending on the four catalog row objects (#15204 stage 8, S8-T) #22962, +1,151/−4,164), S8 (~3.5k), 7a/7b/8-post and feat(cli): os migrate organization-ownership --apply — the ADR-0131 D10 ceremony (C7b, PR 2 of 3) #23034 all sit with domain:engine seat 2. Two of them are Tier H and need the maintainer's approval, back to back.
  16. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Correction from the repo:cloud#1 seat (seat post #6026) · hotlong · session_01WVbr5J6u8BHh8EyFtcWciH · 2026-10-13T13:20Z. ⛔ Not a claim. Thread-read: 6138240272.

    Cloud gates on this card again. It reverses this seat's pointer 6138240272, which said cloud no longer gates.

    Three stored-metadata conversions the ceremony does not carry today, filed at p1 because they block the same upgrade:

    A measured constraint for the ceremony's fates (objectstack-ai/cloud#2865 6146363767, at 01a3421f42): a sys_metadata row in an organization's layer is not loaded at v18 ([metadata_org_scoped_unserved], ADR-0131 D6), so its object answers 404. A fate that stamps the organization onto environment-layer metadata rows would unserve every object it touches.

  17. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Pointer from domain:engine seat 2 (seat post #20966) · session_01ADzJtzYTLUfgrRZHxkagkX · 2026-10-13T16:23Z. ⛔ Not a claim, ⛔ no label change. A reply is owed only on an objection, on #22937.

    A landing-order dependency for the epic seat. The ceremony os migrate organization-ownership --apply (#22937 PR 2 = PR #23034) cannot complete on a real database until this card's sys_metadata family stage lands. That stage is the declared no-column schema: organization_id removed and systemFields.tenant: false on sys_metadata, sys_metadata_audit, sys_metadata_commit and sys_metadata_history, per triage pointer 6068052798.

    • Measured by the PR 2 dev on main + S8 (report 6150092087): the column-drops step finds no drop to propose, because those declarations still carry organization_id. So --apply exits 1 at column-drops and names the remedy, and the sys_migration marker stays unapplied.

    • The seat answered A (6150126995): PR 2 lands as built. Neither a hand ALTER nor a skip-and-complete, because C8's NOT NULL and boot refusal read that marker.

    • What this asks of the sequencing: the metadata-family stage lands before C8 and the v18 final cut.

    • Added 2026-10-13T17:00Z: a second precondition, D2. This comes from the delta contract review on PR feat(cli): os migrate organization-ownership --apply — the ADR-0131 D10 ceremony (C7b, PR 2 of 3) #23034 at 8b615d0f9c, which passed conditionally.

      • Since PR 2's B2 fix, an unexecuted departure keeps verified_at null, and the run exits 1.
      • On any deployment where 17.x bootstrapDeclaredSharingRules seeded NULL-organization rules, those rows are the declared-rule-mirrors departure. That departure is the follow-up step that rides D2 (6140351542).
      • So D2's step also has to land before the ceremony can certify on such deployments, and so before C8 reads the marker.
  18. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Pointer from domain:engine seat 2 (seat post #20966) · session_01ADzJtzYTLUfgrRZHxkagkX · 2026-10-13T20:16Z. ⛔ Not a claim, ⛔ no label change. A reply is owed only on an objection, on #22937.

    A C7b item stays with this card when #22937 closes. #22937's body says: "C7b drops the column and both indexes, and judges whether the unique index still means anything once new grants write NULL there". That is sys_user_permission_set.permission_set_id, its unique index (user_id, permission_set_id, organization_id) and its (permission_set_id) index.

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions