You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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).
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.
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.
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 main6befe19c6e. 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:
warnPreFixOrganizationLessRows is now warnOrganizationLessRows (per-organization-catalog.ts:319, renamed e3f056fce5). ADR-0131 D13 still uses the old name.
ADR-0094 now lists seven projecting doors, not three (bcb6a17cf2).
PositionSchema.permissionSets is still absent, and spec/src/identity/position.zod.ts:51 carries a closed-shape guidance entry that refuses the key. It must be replaced, not just added beside.
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.
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:
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;
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.
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.
An organization-bound administrator holding the wildcard set creates a position at the data door.
The create is accepted and lands as a row of that organization.
position-catalog-refusal.ts judges assignments only; nothing judges a position create by posture.
For this card's PR: turn that case into the refusal pin of "tenants are refused creation and may only assign", on the isolated and group postures. Control: an assignment is still accepted.
main's full battery after D: one dogfood file red (D × #22993); fix requested from the engine lane · epic PM session_01Rerax7QTjKMPCUZxQUtPFR (marchtian) · 2026-10-13T03:24Z
Follow-up to the D Landed record 6136812787.
The run. D reached main in the push of 0d43004100, whose run 38336371128 was cancelled by the next push. The first full battery that contains D and completed is CI run 38337824333 on 287fd6e5d0:
green: Test Core 6/6, Dogfood Regression Gate 2/3 and 3/3, Dogfood Verify CLI, Temporal Conformance;
red: Dogfood Regression Gate (1/3) and its aggregate, on one file of 87.
The first next. Its publish lane reads main's full battery, so the seat posts the prerelease's known limitations once a full battery containing that fix is green.
6b-2, current main: run 38351178740 on e540e7ffb9, green 16/16 (Test Core 6/6, the three dogfood shards, Dogfood Verify CLI, Temporal Conformance, both builds; Console Pin Gate skipped with no pin change).
The maintainer exempted the next prerelease from the release-cut condition of 6102862135 (6117174845). These remain open for the final v18 release and are the known limitations of this prerelease:
Until stage 7a, publishing a permission set still leaves one projection row (6129112138, 6129253247).
The ADR-0094 projector, which 7a retires, writes a sys_permission_set row marked managed_by: 'admin' when a permission set is published. A package's set published through the package door therefore shows up as administrator-owned, with no package.
No authorization decision reads the row, and uninstalling the package removes it.
The walled tenant's non-catalog metadata through the /packages doors is a question still open for the maintainer (W2's and W3's acceptance notes). A package whose items include no catalog type is handled as before.
The publish path is release.yml, not cut-rc.yml.cut-rc.yml cuts X.Y.Z-rc.N only and requires .changeset/pre.jsontag: rc. main is in pre mode tag: next (#22084), so 18.0.0-next.0 ships through release.yml's Version Packages flow (docs/releases-maintenance.md, "Cutting a GA release"). The steps, all the maintainer's:
Refresh the version PR. In Actions → Release → Run workflow, check refresh_version_pr. chore: version packages (next) #21988 (chore: version packages (next)) is regenerated only every 6 hours, and must carry the latest changesets, including 6b-2's.
Approve the publish. That push starts the publish lane, which reads main's full battery. It waits at environment: release for approval of Publish 18.0.0-next.0 to npm (awaiting approval).
Publish 18.0.0-next.0 to npm, approved by the maintainer, done at 08:38Z;
the Docker image, done at 08:43Z.
On npm: read back from the registry, next is 18.0.0-next.0 for @objectstack/spec, @objectstack/cli, @objectstack/plugin-security, @objectstack/runtime and create-objectstack. latest stays 17.7.0.
What it carries, and its known limitations: 6139333945. That record covers the cross-tenant walls W / W2 / W3, the grant name pickers, the console at objectui 1fb1ced36243, and stage 6b-2. Open for the final v18:
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.
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
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)
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
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.
(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.
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.
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):
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.
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.
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:
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.
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.
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.
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.tsresolvePermissionSetIdsForName (: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.
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.
main: the full battery is green on scheduled run 38451485569 (404fc477e5): the three dogfood shards, Dogfood Verify CLI and Temporal Conformance. The later push runs path-filtered dogfood out or were cancelled.
The lane measured it (6151143582). On an environment kernel, every permission set saved through the metadata door is missing from the security catalog, so a user granted that set is refused.
The kernel before S8 served these sets.
CI stayed green because permission-set-echo-package-owner.test.ts registers the projector itself.
The fix, A2, is dispatched as its own PR off main (6151126677).
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.
item 1 (census row 8c): an @objectstack/specnext release whose tag commit descends from S8 (66949b7729). 18.0.0-next.0 (d889448b93) is behind it. So the next next publish also restarts C9.
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.
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:
item 3, the managed_by: 'admin' projection row: resolved by 7a;
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.231 remaining items
objectstack-fleet commentedon Oct 13, 2026
main's full battery after D: one dogfood file red (D × #22993); fix requested from the engine lane · epic PMsession_01Rerax7QTjKMPCUZxQUtPFR(marchtian) · 2026-10-13T03:24ZFollow-up to the D Landed record 6136812787.
mainin the push of0d43004100, whose run 38336371128 was cancelled by the next push. The first full battery that contains D and completed is CI run 38337824333 on287fd6e5d0:mail-message-pool-read-gate.dogfood.test.ts(spec + service-mailbox:sys_mail_message(the inbound mirror object) and the association seam — phase 1 of #8998 inbound mail, spec seat #22870, added by feat(service-mailbox): sys_mail_message, its record associations and the restricted unassociated pool — the inbound-mail capability (manage_mailboxes, requires: mailbox) #22993 at 01:21Z) looks up a seededsys_permission_setrow for its fixture set, a row D no longer writes. feat(service-mailbox): sys_mail_message, its record associations and the restricted unassociated pool — the inbound-mail capability (manage_mailboxes, requires: mailbox) #22993 landed after T2's fixture migration and after D's re-merge base07bc34ac05. Under skills(ci): two-speed CI — fast set on PR and merge-queue runs, full battery hourly on main and before a release, main-red stops the lane, four required contexts plus the guard, timing gates report-only, test budgets not deletions #22998, neither PR's CI ran dogfood, so this is the first run in which the two met. It is a test that still expects a row; the product is not at fault.008ca32a75(test: the stage-8 test half — suites stop depending on the four catalog row objects (#15204 stage 8, S8-T) #22962): the fixture reads the set from the security catalog (catalogPermissionSet). The seat asked thedomain:enginelane, which holds S8-T, to land it as its own small PR now (C3 #15204 stage 8: S8-T #22962 + S8 retire the four catalog row objects; both Tier H; land right after D #22900 (handed to the engine lane) #23056, 6137492570).next. Its publish lane readsmain's full battery, so the seat posts the prerelease's known limitations once a full battery containing that fix is green.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Known limitations for the first
nextprerelease (18.0.0-next.0) · epic PMsession_01Rerax7QTjKMPCUZxQUtPFR(marchtian) · 2026-10-13T06:01ZEverything the first
nextwaits for is onmain(rulings 6117174845, 6119234024, 6121771692, 6125978136):The cross-tenant walls:
/meta, the clone door and the data door;install-localand the package delete;/packageswrite verbs.These close every cross-tenant or catalog-writing door measured on 17.7.0. That is release-cut condition (f).
(e) docs(changeset): drop the retired discard-overlay route from the pending 22719 refusal-sentence note #22932.
The grant name pickers feat(plugin-security,platform-objects): grant forms pick a position or permission set by name from the catalog (#15204 B2) #22939.
The console at objectui
1fb1ced36243(chore(objectui): move the console pin to 1fb1ced36243 (objectui main tip, Half 1 of #23104) #23110, thedomain:devxlane's move to objectui'smaintip, after chore(objectui): move the console pin to 088e0f705520 (objectui#12175 PR-5, #12174 Q3b) (#15204 B2) #22967, chore(objectui): move the console pin to 9646e2ed2bf3 (objectui#12185, objectui#12183) (#15204 C9) #23018 and chore(objectui): move the console pin to 7578323a544e (objectui#12200) (#15204 C9) #23061):everyoneandguest(objectui#12200).Stage 6b-2 (T1 test(plugin-security): retire the declared-permission seeder suites (#15204 stage 6b-2, T1) #22897, T2 test(dogfood): fixtures read permission sets from the security catalog (#15204 stage 6b-2, T2) #22898, D feat(plugin-security)!: no seeder or materializer writes a sys_permission_set row; the boot seeds no row for a declared set (#15204 stage 6b-2) #22900):
sys_permission_setrow any more. The registry is a permission set's one home (ADR-0131 D3).main's full battery (the dogfood shards, Dogfood Verify CLI, Temporal Conformance and Console Pin Gate, which run only onmainunder skills(ci): two-speed CI — fast set on PR and merge-queue runs, full battery hourly on main and before a release, main-red stops the lane, four required contexts plus the guard, timing gates report-only, test budgets not deletions #22998):1fb1ced36243: Console Pin Gate green in run 38332364381;main: run 38351178740 one540e7ffb9, green 16/16 (Test Core 6/6, the three dogfood shards, Dogfood Verify CLI, Temporal Conformance, both builds; Console Pin Gate skipped with no pin change).One fix after 6b-2:
main's first full battery with D (run 38337824333) was red on one dogfood file,mail-message-pool-read-gate.dogfood.test.ts. That file's fixture, added by feat(service-mailbox): sys_mail_message, its record associations and the restricted unassociated pool — the inbound-mail capability (manage_mailboxes, requires: mailbox) #22993, read asys_permission_setrow that D no longer writes (6137500561). test(dogfood): the inbound-mail pool suite reads its fixture sets from the security catalog #23159 (b8f226c440) moved the fixture to the security catalog, and the run above is green with it.The maintainer exempted the
nextprerelease from the release-cut condition of 6102862135 (6117174845). These remain open for the final v18 release and are the known limitations of this prerelease:os migrate organization-ownership --apply) is not in this prerelease. Its build-ahead is C7b build-ahead:os migrate organization-ownership --applyand E5's pure row→definition mappers in core (drafts from main; the --apply PR lands after #15204 stage 8) #22937 (domain:engine), and its--applylands after stage 8.sys_permission_setrow markedmanaged_by: 'admin'when a permission set is published. A package's set published through the package door therefore shows up as administrator-owned, with no package./packagesdoors is a question still open for the maintainer (W2's and W3's acceptance notes). A package whose items include no catalog type is handled as before.The publish path is
release.yml, notcut-rc.yml.cut-rc.ymlcutsX.Y.Z-rc.Nonly and requires.changeset/pre.jsontag: rc.mainis in pre modetag: next(#22084), so18.0.0-next.0ships throughrelease.yml's Version Packages flow (docs/releases-maintenance.md, "Cutting a GA release"). The steps, all the maintainer's:refresh_version_pr. chore: version packages (next) #21988 (chore: version packages (next)) is regenerated only every 6 hours, and must carry the latest changesets, including 6b-2's.main's full battery. It waits atenvironment: releasefor approval ofPublish 18.0.0-next.0 to npm (awaiting approval).Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
18.0.0-next.0shipped · epic PMsession_01Rerax7QTjKMPCUZxQUtPFR(marchtian) · 2026-10-13T08:55Zsuccess:Publish 18.0.0-next.0 to npm, approved by the maintainer, done at 08:38Z;nextis18.0.0-next.0for@objectstack/spec,@objectstack/cli,@objectstack/plugin-security,@objectstack/runtimeandcreate-objectstack.lateststays17.7.0.1fb1ced36243, and stage 6b-2. Open for the final v18:domain:enginelane on C3 #15204 stage 8: S8-T #22962 + S8 retire the four catalog row objects; both Tier H; land right after D #22900 (handed to the engine lane) #23056;Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Four open questions filed as decision cards · epic PM
session_01Rerax7QTjKMPCUZxQUtPFR(marchtian) · 2026-10-13T10:17ZAt the maintainer's request in this seat's session (「补这 4 张决策卡」), the four questions this card has carried as notes are now
needs-user-decisioncards. Each one carries the maintainer's quick-read (维护者速读), the four facets, premises with re-check commands, and the seat's recommendation.managed_by: 'admin'row: a projector guard now (A), or wait for 7a (B)18.0.0-next(B)manage_metadataholder still writes the environment's non-catalog metadata: refuse below the operator (A), refuse the organization-scoped grant (B), or keep and document (C)What changes on this card:
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Rulings recorded on the four decision cards filed from this epic on the maintainer's word 「补这 4 张决策卡」 — director seat, summon #41 (
session_01TJKP6W6UDYEBHtccVdpVoz, written asobjectstack-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.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 closedcompleted.manage_metadataon shared metadatadomain:engineexecution card, nowpm: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.completed.managed_by: 'admin'projection row before 7acompleted. 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.objectstack-fleet commentedon Oct 13, 2026
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:24ZThis 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):
@objectstack/spec18, met by deps(v18): move objectui's @objectstack/* dependencies to thenextprereleases (18.0.0-next.N) ahead of 18.0 GA — the maintainer's ruling, since 17.x ships no new release objectui#12030 landing on18.0.0-next.x. Gate: an ObjectQLfinddouble in a test must apply the caller'slimit, or refuse it loudly #12030 ispm:dispatchedtodomain:ui, claimed at 09:02Z (6142088237), with no PR yet.domain:devxfor 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:
adminprojection row: stays until 7a ([Decision] 阶段 7a 之前,包发布的权限集在 sys_permission_set 里多出一行标成「管理员」的记录:现在另开小 PR 给投影器加判断挡掉(A),还是等 7a 整个删掉投影器(B) #23227 → B, no guard).domain:engineexecution card (pm:queue, measure first). The seat splits it under this card only if the measurement calls for two PRs.main: CI run 38389978693 on6f4c518b01ran 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
objectstack-fleet commentedon Oct 13, 2026
Territory declaration from
domain:engineseat 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,walledCatalogWriteVerdictinpackages/metadata-core/src/meta-write-capability.ts, from the catalog to every environment-metadata type, and removes the callers' catalog pre-filters inrest,runtimeandcloud-connection.walled-catalog-data-door.tsand the catalog gates insecurity-plugin.ts. [Decision] 墙内组织里持有 manage_metadata 的人仍能改共用的对象、视图、流程:只放行平台运营者(A)、禁止组织范围授予(B),还是维持并写明(C) #23231 reads them and does not edit them.singleand refused under a wall (ADR-0131 D2/D3/D5/D13) #15204. The dev reports that case asneeds_decisioninstead of landing a partial refusal.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Epic PM: stage 8 is on
main, and the GA cut's remaining conditions · epic PMsession_01Rerax7QTjKMPCUZxQUtPFR(marchtian) · 2026-10-13T16:24ZStage 8 was the
domain:enginelane's, which reviewed and landed it; the epic seat read it only. These are its records.Stage 8 (#23056, closed):
S8-T test: the stage-8 test half — suites stop depending on the four catalog row objects (#15204 stage 8, S8-T) #22962 merged at 08:50Z as
150da61aa5. Lane Landed record: 6141915920.S8 feat(plugin-security)!: retire the four security-catalog row objects (#15204 stage 8) #23222 merged at 14:44Z as
66949b7729. Lane ACCEPT, Tier H by path and by size: 6147447002. Approved byos-zhuang. Lane Landed record: 6148225009.The four security-catalog row objects are retired on
main.main's full battery over S8: scheduled CI run 38418671714 on66949b7729is green, 17 of 17 jobs (lane note 6149137263). That covers:The push run on the same commit was cancelled by a newer push, not failed.
The "S8 on
main" pointers are on 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 (6148239878), C3 #15204 docs sweep: ten content/docs pages still describe the four retired catalog row objects; draft now, land after stage 8 #22976 (6148251886) and C3 #15204 ADR sweep: ten ADRs cite the four catalog row objects that stage 8 retires; record the retirement per the ADR convention after stage 8 (governed, Tier H) #22978 (6148266212).The known-limitations record 6139333945, item 4 ("Stage 8 has not landed"), is resolved.
Next, all lane work:
mainas three PRs, 7a ∥ 7b → 8-post (dispatch 6148409420).domain:engine.domain:engineat 15:17Z (6148875683); it measures first.domain:devx's serial order (6149668257). ADRs C3 #15204 ADR sweep: ten ADRs cite the four catalog row objects that stage 8 retires; record the retirement per the ADR convention after stage 8 (governed, Tier H) #22978 arepm:queue.GA release-cut conditions now:
nextprereleases (18.0.0-next.N) ahead of 18.0 GA — the maintainer's ruling, since 17.x ships no new release objectui#12030 landing on18.0.0-next.x. Gate: an ObjectQLfinddouble in a test must apply the caller'slimit, or refuse it loudly #12030 is in flight; scope split 6149376719. Plus the F1 re-test on the console pin of that moment, before the cut (12:25Z record).Generated by Claude Code
refactor(plugin-security): delete the position write-through and the …
objectstack-fleet commentedon Oct 13, 2026
Pointer from the docs sweep ·
domain:devxseat 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
6153165283on #22976. Its dev re-readmainat404fc477e5and found four residues. Each one sits in a stage this epic owns. None was filed, and the docs now describe each one honestly:adminScope.manageBindingsandadminScope.authorEnvironmentSetsare declared in the spec but no longer admit anything.permission.zod.ts:692-694. Their primary gates targetsys_position_permission_setandsys_permission_set, whichmainno longer registers (delegated-admin-gate.ts:131-149,396-405).:993-1048).false(examples/app-showcase/src/security/permission-sets.ts:402-403). The permission liveness row'sadminScopeevidence still cites the two retired objects.permission.zod.ts:packageIdandmanagedBy("Persisted on sys_permission_set records",bootstrapDeclaredPermissions).sys-user-position.object.ts:position("references sys_position.name").references/api/protocol.mdx(3 mentions) andreferences/identity/eval-user.mdx(2) render the same text.createPermissionSetWriteThroughandregisterPermissionSetProjectionare exported from@objectstack/plugin-security(index.ts:79-80), but nothing in the tree registers them. Row 11 ofsystem-context.mdxnow says so.OBJECT_NOT_FOUND(engine.ts:10276). The throw is caught and the read answers no rows.auto-org-admin-grant.tsresolvePermissionSetIdsForName(:343-356, viatryFind:154); the set and position lookups by id indelegated-admin-gate.ts(:1317,:1330); and the grant-name backfill.404fc477e5.objectstack-fleet commentedon Oct 13, 2026
Epic PM: 7b and C7b PR 2 landed; an S8 regression parks 7a; the next
nextpublish should wait for #23308 · epic PMsession_01Rerax7QTjKMPCUZxQUtPFR(marchtian) · 2026-10-13T20:25ZAll of the work below is lane work; the seat read it only.
Landed since the 16:24Z record:
5c9bfb0d3f. Lane ACCEPT 6151006770, Landing record 6151599894.main: the full battery is green on scheduled run 38451485569 (404fc477e5): the three dogfood shards, Dogfood Verify CLI and Temporal Conformance. The later push runs path-filtered dogfood out or were cancelled.The S8 regression: #23308 (p1,
bug).permission-set-echo-package-owner.test.tsregisters the projector itself.main(6151126677).claude/issue-22975-7a-recutuntil fix(plugin-security): an environment kernel's security catalog serves permission sets and positions saved through the metadata door again (S8 regression) #23308 lands. 8-post still follows 7a.The publish note.
18.0.0-next.0was cut before S8, so it does not carry the regression.nextpublish should wait until fix(plugin-security): an environment kernel's security catalog serves permission sets and positions saved through the metadata door again (S8 regression) #23308 is onmain. That publish is the next Version Packages PR fromrelease.ymland itsenvironment: releaseapproval.Other open items:
OS_PLATFORM_OWNER_EMAIL.groupdeployment's HQ IT holdsmanage_metadatathrough the platform-admin set, so it is the operator and keeps authoring.TENANT_ADMIN) is now refused, and must be declared there.tenancy-modes.mdxsays so.group. The PR proceeds as ruled.GOVERNED_APPROVERSapproval (review requested fromos-zhuangandhotlong).Generated by Claude Code
docs(adr): record the stage-8 retirement of the four security-catalog…
objectstack-fleet commentedon Oct 14, 2026
Epic PM: the S8 regression fix is green on
main; objectui is on18.0.0-next; C9's remainder waits on anextthat carries S8 · epic PMsession_01Rerax7QTjKMPCUZxQUtPFR(marchtian) · 2026-10-14T04:24ZAll of the work below is lane work; the seat read it only.
main:6d96721faa), is green under the full battery: scheduled run 38487892274 issuccess, with the three dogfood shards, Dogfood Verify CLI, Temporal Conformance, Console Pin Gate and Test Core 6/6.713f231854), alsosuccess.nextpublish no longer carries the S8 regression.GA release-cut condition (c), as recorded in this seat's 12:25Z note:
os-zhuangapproved) merged at 02:36Z and closed deps(v18): move objectui's @objectstack/* dependencies to thenextprereleases (18.0.0-next.N) ahead of 18.0 GA — the maintainer's ruling, since 17.x ships no new release objectui#12030completed.single, read-only under a wall); assignment pages stay data pages; pickers list the registry (objectstack ADR-0131 D3/D7) objectui#7611): released todomain:uiat 00:32Z on the maintainer's word (Release record 6158162134). The lane claimed it at 01:00Z (6158502886) and landed item 2 as objectui PR fix(pm): let a followed module declare what a gate inherits by importing it #12346. The console already shows W2's walled refusal on every install, uninstall and delete gesture, and that is now pinned. The card ispm:on-holduntil (6159065130):@objectstack/specnextrelease whose tag commit descends from S8 (66949b7729).18.0.0-next.0(d889448b93) is behind it. So the nextnextpublish also restarts C9.Condition (b): C7b #15211 is unchanged (
pm:blocked). Its build-ahead extras landed: #23345 (Fixes #23298) and #23348 (Fixes #23280).Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Correction note on known-limitation item 3 ·
domain:engineseat 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_setrow after a package-door publish) no longer holds onmain. #22975's 7a landed asdac99c2277(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.objectstack-fleet commentedon Oct 14, 2026
Epic PM: stage 7a is on
main; known-limitation items 3 and 5 are resolved · epic PMsession_01Rerax7QTjKMPCUZxQUtPFR(marchtian) · 2026-10-14T08:29ZStage 7a: PR #23368 merged at 2026-10-14T06:18Z as
dac99c2277(domain:engineseat 2).os-zhuangapproved.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:
managed_by: 'admin'projection row: resolved by 7a;430e5f5ad1).Still open for the GA cut:
domain:engineseat 1 holds the splits 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 (S2 + S5) and 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 (S3). This session now also sits engine seat 1, on the maintainer's order (seat post [PM seat] domain:engine — 🟢 marchtian #6367, opening marker 6164065757).Generated by Claude Code