Repository navigation
Description
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
os-warren commentedon Sep 4, 2026
Carrier hygiene — director seat (objectstack #12708, session_01LsEjuNMPitCHwEfYftZ1um), 2026-09-04.
needs:contract-reviewremoved 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 ispm:blockedbehind #15193 / #15195 / #15196 with no PR (closed_by_pull_requests0). The Clause-② fact stays where it lives, in the card body (a new authoring keyPositionSchema.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
hotlong commentedon Sep 5, 2026
Pointer added after this card was written: the sharing-rule recipient population gained a member on
main.SharingRuleRecipientTypenow includesfield(packages/spec/src/contracts/sharing-service.ts), landed by #14103 under the maintainer's ruling B, with theplugin-sharinghalf 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:
fieldrecipient'svalueis a field name on the matched record — held to theFieldSchema.namegrammar 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.⇒ Re-derive the recipient population against the then-current
mainwhen 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.objectstack-fleet commentedon Oct 6, 2026
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 objectstackmain6befe19c6e. 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/bootstrapSystemCapabilitiesinplugin-security.bootstrapDeclaredSharingRules(plugin-sharing).bootstrapPlatformAdmin, with the Choice 4A grant row still written owner-less (bootstrap-platform-admin.ts:1137).per-organization-catalog.ts.Add to the retirement list:
bootstrapDeclaredCapabilities(plugin-security/src/bootstrap-declared-capabilities.ts:460, called atsecurity-plugin.ts:4759). It writessys_capability. Without it, the "zerosys_capabilityrows" acceptance cannot pass.bindBaselineToEveryone, which insertssys_position_permission_setrows at boot (security-plugin.ts:4447).Corrections:
warnPreFixOrganizationLessRowsis nowwarnOrganizationLessRows(per-organization-catalog.ts:319, renamede3f056fce5). ADR-0131 D13 still uses the old name.reportLegacyPlatformAdminGrantretires in C8". It was removed on 17.x for walled postures (74832b68f2, Amend ADR-0131 D13 to drop the two platform-admin reporter symbols (maintainer ruling B on #18336) — and close thesingle-row NULL-ownership question the drop leaves open #18413).not_planned(09-23). Its step 3 moved here and its census to C7. platform-admin re-anchor follow-up (Choice 4B): config-anchor thesingleposture — first-user promotion becomes development-only fallback #11979 is open,Blocked-by: #15204.bcb6a17cf2).PositionSchema.permissionSetsis still absent, andspec/src/identity/position.zod.ts:51carries a closed-shape guidance entry that refuses the key. It must be replaced, not just added beside.delegated-admin-gate.tsusesresolveOwnOrganizationRow(:720,:1105; fix(plugin-security): the delegated-admin gate resolves a scope's business-unit anchor inside the caller's own organization #19800). Retiring the module moves that helper, and [finding] The delegated-admin gate resolves an EMPTY subtree on a stockobjectstack devboot — seeded business units are organization-less while every session carries an active organization, so every in-scope delegated write is refused #21057's direction says the gate's organization match does not change.234d1d8b7c);Order: see #15196's note. The C2/C3 order for
permissionSetsis contradictory and goes to the maintainer.Generated by Claude Code
objectstack-fleet commentedon Oct 7, 2026
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 stayspm:blockedontarget:v18. Thread-read: 6018622568.PositionSchema.permissionSetsreplaces the closed-shape refusal atpackages/spec/src/identity/position.zod.ts:51; thesys_position_permission_setrows 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.Generated by Claude Code
fix(plugin-security): a cloned permission set is not reported as an u…
objectstack-fleet commentedon Oct 7, 2026
Scope amended by #22006 (ruled B,
6028793924): C3 gains the position field, the row migration and the read switch, landed togetherTriage 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:
PositionSchema.permissionSetsreplaces the closed-shape refusal atpackages/spec/src/identity/position.zod.ts:51;sys_position_permission_setrows migrate into the position definitions;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:blockedbehind them.Its file surface is re-verified at claim, against the then-current
main.objectstack-fleet commentedon Oct 8, 2026
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 stayspm:blocked. ⛔ Classes, positions and functions only.6070148106) in theplugin-securityunit harness: a realObjectQLoverSqlDriverplusSecurityPlugin, in the isolated posture with the organization-scoping service.position-catalog-refusal.tsjudges assignments only; nothing judges a position create by posture.6050490870) and C7's inventory (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). It is not this card's to migrate.247 remaining items
objectstack-fleet commentedon Oct 16, 2026
Status read on the maintainer's question · director seat (summon #43 continuation 2,
session_01QJC7i981TSs9L1CGJK59Ax) · 2026-10-16T13:30ZThe maintainer asked in the director's chat whether this card is finished. Read at this write: not finished.
dac99c2277, 2026-10-14T06:18Z) and 7b (5c9bfb0d3f); 8-post (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, closed); C7b (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, feat(metadata-core,metadata-protocol,runtime): #15211 S2+S5 — the sys_metadata family drops organization_id, and the v18 boot refusal lands with it (C7b, split for seat 1) #23429, feat(plugin-security,cli): #15211 S3 — retire sys_user_permission_set.permission_set_id and its indexes, delete the boot grant-name backfill, add the named-grant unique index (C7b, split for seat 1) #23430, closed); the S8 regression fix (fix(plugin-security): an environment kernel's security catalog serves permission sets and positions saved through the metadata door again (S8 regression) #23308, closed).bootstrapDeclaredSharingRulesamong them —pm:epic, unassigned at this read; objectui [Direction · v18] Per-user scope for view personal configuration (parked from #7494) #7611 (C9)pm:on-holdon anextcarrying S8 (18.0.0-next.2, published today, descends from it) and on 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's close; and the ordering question at 6213772296: the ceremony's verified marker waits on thedeclared-rule-mirrorsrows leavingsys_sharing_rule, which only stage 9 can do, while stage 9's gate reads the ceremony's D10 report.Blocked-by: #15193and#15195name closed cards;Blocked-by: #15196is live.This seat dispatches nothing and takes no lane; the epic PM's next record answers the order and moves #15196.
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
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/main099cc9d6::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」.sys_sharing_ruleas fate 3 (attribution) with one departure,declared-rule-mirrors(managed_by in [package, platform]and notcustomized,as: 'mirror-deletion', citing D2 and D10 fate 2):packages/cli/src/utils/organization-ownership-inventory.ts:514-524.remainingForcounts a fate-3 table's departing rows as remaining (packages/cli/src/utils/organization-ownership-apply.ts:2517;departingRowsat:2510is 「NULL rows a departure still has to carry out of the table」), a complete run adds them todiscrepancies(:2734),runMirrorDeletionexecutes only tables whose fate ismirror-deletion(:2350), and the only departures any step executes are themovedones (:1909-1911). The 11 rows on the maintainer's database are NULL-organization rows no ceremony step can carry out.packages/plugins/plugin-sharing/src/bootstrap-declared-sharing-rules.ts:30-49) runs one organization-less pass undersingleon purpose, and enforcement reads onlysys_sharing_rulerows (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 (β):
bootstrapDeclaredSharingRulesretires, and the ceremony then deletes thedeclared-rule-mirrorsrows (themirror-deletiondeparture 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」.declared-rule-mirrorsawaiting stage 9 satisfies that gate. Nothing else is exempted: any other NULL row keeps blocking both the marker and stage 9.singlepass re-seeds NULL rows at every boot until stage 9, so the false statement would stand. (γ) attributing the mirrors to the Default Organization undersingle: the next boot's organization-less pass inserts fresh NULL copies, so it needs the seeder change that is stage 9's.packages/runtime/src/organization-ownership-boot-guard.ts:222);os migrate apply --allow-destructivekeeps holding theorganization_iddrops 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.sys_record_share.source_idrewritten from rule id to name BEFORE any mirror row is deleted; (a) whethersharing_rulebecomes a registered metadata kind ispackages/specwork (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.declared-rule-mirrorsnames 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 gainsRuled:on its first line; its twoBlocked-by:lines that name closed cards (#15193, #15195) are removed in the same write,Blocked-by: #15196stays (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.objectstack-fleet commentedon Oct 18, 2026
Stale claim released: assignee and
pm:dispatchedoff ·pm:epicstays · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T14:16ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch. Done on the maintainer's question in this seat's chat on 2026-10-18: 「15204 没有人在处理,是不是应该把认领人扯掉」.
epic:#15194(marchtian,session_01Rerax7QTjKMPCUZxQUtPFR) stood down at 2026-10-15T07:04Z ([epic] ADR-0131 — total organization ownership: no NULL organization_id (v18 line) #151946186498514). Its own record says "No claim is held".pm:dispatchedstayed on this card anyway, and nothing has been written here since the ordering ruling β (6216760903).marchtianis also the account ofdomain:servicesseat 1, which is active today. So the stale assignee read as "services is working on it". It is not.pm:dispatchedcomes off.pm:epicstays. Who takes this tree's remaining stage, C3 stage 9 (#15204): declared sharing rules read from the registry, bootstrapDeclaredSharingRules retires, and the ceremony deletes the declared-rule mirrors; the verified marker follows (director ordering ruling) #23952, is the maintainer's choice, asked in chat. The choices are a restarted epic seat, or C3 stage 9 (#15204): declared sharing rules read from the registry, bootstrapDeclaredSharingRules retires, and the ceremony deletes the declared-rule mirrors; the verified marker follows (director ordering ruling) #23952 released todomain:services. Until that answer, no domain seat dispatches this parent.organization_idNOT NULL per cleared table; one predicate for Layer 0 and every driver; bothorWhereNullarms, the__global__sentinel and the #13491 ledger retire (ADR-0131 D1/D8/D9) — protocol 18 #15212 (C8) unblocks.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Claim: PM loop round 1 · 2026-10-18T15:00Z
Session:
session_01Y5583bs2RDd53MH6kM1ca3Account:
os-steve(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-15196-retired-catalog-residue(a fold led by #15196; that card carries the full claim)Worktree:
objectstack-issue-15196Domain:
domain:servicesSeat:
epic:#15194(the epic lane; seat record 6251069534)File surface: stage 6c only.
packages/plugins/plugin-security/src/per-organization-catalog.ts(28 lines, one exportrowMatchesDeclaration, no importer onorigin/maindd72a047) is deleted, andper-organization-catalog.test.ts's kept resolver case moves to the suite of the code it pins, or is deleted only where a duplicate pins the same assertion at least as close to the code. Plus the stale pointer inscripts/check-logger-receiver-detach.mjs.Container & model:
S,mode:subagent,model: TIER_DEFAULT(dispatch-gates --tier: no path-derived mandate)Clause-②: no
Responsibility: n/a — not a defect card
Thread-read: 6250965607
Serial constraints cleared: see #15196's claim; stage 9 (#23952) is disjoint.
What stays on this card after the fold lands. Stage 9 is #23952 (ruling β, 6216760903). The Default-Organization ownership of the
single-postureadmin_full_accessgrant (Choice 4A, ADR-0131 D5) moves to #11979, whose acceptance it is. It lands as C8's stage 8b-0 with the resolver anchor it needs (resolve-authz-context.tsreads platform standing only from an organization-less grant today, so the two must change together). When the fold lands and #23952 is dispatched, this card closes with that pointer.Correction to 6250965607: #23952 does not carry #15196's S8a, S8b and S9. They landed as this card's stages 1, 2a–2d and 3 (cutover plan 6094501866).
objectstack-fleet commentedon Oct 18, 2026
ACCEPT → PR #24365 comment 6252137527 · epic PM
session_01Y5583bs2RDd53MH6kM1ca3· 2026-10-18T16:13Z · on head2fb7b3621e. It lands through the queue once every check on that head is green.objectstack-fleet commentedon Oct 18, 2026
Closed: C3 is complete except stage 9, which has its own card · epic PM
session_01Y5583bs2RDd53MH6kM1ca3(os-steve) · 2026-10-18T17:08Z6a49efb9c4, Landed record on 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):per-organization-catalog.tsis deleted. Stages 0–8, W, W2, W3 and CD landed earlier (records on this card).sys_sharing_rulerow of "a fresh boot in every posture writes zero rows".singleplatform-admin grant owned by the Default Organization, ADR-0131 D5) is platform-admin re-anchor follow-up (Choice 4B): config-anchor thesingleposture — first-user promotion becomes development-only fallback #11979's acceptance, dispatched as C8 stage 8b-0a (claim 6251512145).single, read-only under a wall); assignment pages stay data pages; pickers list the registry (objectstack ADR-0131 D3/D7) objectui#7611's remainder and the F1 re-test.origin/main51ad8e4f, is in the epic seat's session; its two remainders were the items above.pm:dispatchedcomes off and the card closescompletedin this act.objectstack-fleet commentedon Oct 18, 2026
Ruling β item 6 · deviation record · epic PM
session_01Y5583bs2RDd53MH6kM1ca3(os-steve) · 2026-10-18T19:26Z. One line, as stage 9's contract review asked (record 6253094552 ③2, re-confirmed in 6254128352 ③5 on PR #24376): thedeclared-rule-mirrorspost-check label names the step and the stage ("deleted by the mirror-deletion step (ADR-0131 C3 stage 9)"), not #23952, becausecheck:doc-authoringrefuses a tracker id in apackages/**runtime string; the card number sits in the adjacent code comment (organization-ownership-inventory.ts:537-548), the gate is unchanged, and the ruling's purpose holds: after stage 9 the rows wait for nothing beyond that release's own step.objectstack-fleet commentedon Oct 19, 2026
GA condition record · epic PM
session_01Y5583bs2RDd53MH6kM1ca3(os-steve) · 2026-10-19T04:26Z. Condition (c) is waived for 18.0 (ruling record 6259608309 on #15194, item 4; the maintainer's 「同意」).single, read-only under a wall); assignment pages stay data pages; pickers list the registry (objectstack ADR-0131 D3/D7) objectui#7611's walled organization-admin assignment, carried by plugin-security: organisation admins assign positions and permission sets to their own members inside the D12 boundary — gate branch, overrides, explain and my-delegable-scope, three-posture acceptance (ruling B on #23960) #24136. 18.0 ships for fresh installs only and does not promise organization-admin assignment under a wall.