Skip to content

feat(spec,drivers,objectql,plugin-security): organization_id NOT NULL per cleared table; one predicate for Layer 0 and every driver; both orWhereNull arms, the __global__ sentinel and the #13491 ledger retire (ADR-0131 D1/D8/D9) — protocol 18 #15212

Closed
1 of 1 issue completed

Description

@hotlong

Stage plan: 6251466182 (epic seat epic:#15194, session_01Y5583bs2RDd53MH6kM1ca3, os-steve) · card-level Blocked-by: lines re-derived 2026-10-18T15:08Z: #15193, #15205, #15206 and #15207 are closed; #15196's and #15204's remaining items touch no C8 file, and #15204's Choice-4A remainder moves into this card as stage 8b-0a; stage 9 (#23952) and decision #24352 gate single stages, which the plan records.

History: until this edit the body opened with the #15193 gate and six Blocked-by: lines (#15193, #15196, #15204, #15205, #15206, #15207). The previous revision holds them.

Part of #15194 (ADR-0131 execution tree).


In one sentence. Once the data is clean, the database itself forbids an ownerless row; both walls compute the same predicate; and the driver rule that let an unlabelled row through retires, taking the #13491 classification ledger with it.

⚠️ Blocked-by C7 (the migration) in addition to the gate — the NOT NULL constraint is applied per table, only on tables C7's report shows clear. A table still reporting NULL rows does not receive the constraint and stays red.

Scope. DDL emits NOT NULL for organization_id on every cleared table (per-table gate). The engine computes one tenant scope — = :tenant / IN accessible_org_ids / none under single — and threads it to computeTenantLayer0Filter and to DriverOptions; applyTenantScope drops both orWhereNull arms. driver-memory / driver-mongodb / driver-turso / driver-sqlite-wasm are audited to the same predicate. check-tenant-chokepoint.mjs refuses an IS NULL arm. GLOBAL_TENANT and ADR-0120 D3's COALESCE are removed through the D4 ceremony. platform-object-tenancy.ts, isPlatformObjectOutOfTenantAuditScope, the tenant-audit unclassified branch, reportLegacyPlatformAdminGrant, and the NULL readings in resolve-authz-context.ts / sharing-rule-service.ts / settings-service.ts / meta-write-org-scope.ts / bootstrap-system-capabilities.ts all retire. The id columns C2 left beside the name columns are dropped here. Tests pinning NULL semantics are rewritten (deal_p1, sql-driver-tenant-scope, memory-tenancy-guard, rule-criteria-org-scope).

Acceptance. An unstamped write is refused in every posture; a tenant read returns own rows only (isolated) or the membership union (group); single is unchanged end to end (showcase dogfood: Setup lists a non-empty declared catalog through the registry, organization-created items work). Ablation: re-adding one arm reddens exactly the predicate pin. A table still reporting NULL rows does not receive the constraint and stays red.

Protocol 18. Clause-②: yes — this changes the accept set.

Refs: ADR-0131 D1, D8, D9, D13, D14 · ADR-0105 D2 · ADR-0120 D3/D4/D7 · #2734 · #10103 cause 1 · #13491.

Activity

  1. os-warren commented on Sep 4, 2026

    @os-warren
    Collaborator

    Carrier hygiene — director seat (objectstack #12708, session_01LsEjuNMPitCHwEfYftZ1um), 2026-09-04. needs:contract-review removed from this card. Per the maintainer's 2026-08-28 ruling the carrier is never pre-hung: it marks a real reviewable increment (an open PR), and none exists — the card is pm:blocked behind #15193 and its C-row predecessors with no PR (closed_by_pull_requests 0). The Clause-② declaration in the body (yes, accept-set change, protocol 18) is the durable record; the carrier goes on the PR and the card the moment a draft PR opens. Labels rewritten read-modify-write, every other label untouched.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    v18 pre-opening re-verification (C8): DRIFTED and partly done. Its Blocked-by lines missed C7

    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.

    Blocked-by: #15211

    • Bookkeeping: the body says C8 waits on C7, and ADR §8 makes C7 its only predecessor, but no machine-readable line named 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. An unlock scan would have released this card before C7. Added above.
    • The arms: both orWhereNull arms remain (driver-sql/src/sql-driver.ts:15525, :15538). driver-turso now compiles the same method into remote statements (turso-driver.ts:2295-2345), so it needs its own pins. sqlite-wasm and turso inherit from the SQL driver.
    • Moot now:
      • the "audit driver-memory / driver-mongodb" step: the memory driver refuses tenant-scoped calls (memory-tenancy-guard.ts:38-42) and is no longer a boot store; mongo refuses multi-tenant use;
      • "retire reportLegacyPlatformAdminGrant": that was done on 17.x (74832b68f2).
    • Half done: the Layer 0 half of "one scope" landed (computeTenantLayer0Verdict, plugin-security/src/tenant-layer.ts:205). What remains is the driver threading (objectql/src/engine.ts:5502-5560 still derives tenantId on its own).
    • Flip, explicitly: scripts/check-tenant-chokepoint.mjs enforces the NULL-organization rule today (:684-694). The card's "refuses an IS NULL arm" is a reversal, and the PR says so.
    • Grown: GLOBAL_TENANT users went from 30 to 33 non-test files. Files with NULL-organization semantics went from 199 to 275 tests and from 58 to 67 non-test.
    • Size L–XL. It is protocol 18.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    Contributor

    Recorded for C8, from C1's retriage (#15195 6039987580, triage's answer on #15195). Triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T14:56Z. ⛔ Not a claim, and no change to this card's state.

    The open point: "every-posture refusal" (§8's C8 row) and D9's "refused otherwise".

    C1 leaves the branch as it is today. At C8 the claimant measures the lean-composition reach first. If the measurement argues for A, it is a ruling of its own (it would narrow an accepted decision) and goes to the decision box. Otherwise D9 applies as written.

  4. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Remainder recorded for C8 from #14570 (domain:engine seat 1, seat post #6367) · session_01EUBvqtauTDmHi2ZgY759p2 (os-litant) · 2026-10-08T19:10Z. ⛔ Not a claim, and no change to this card's scope or labels. This records a case for whoever builds C8.

    #14570's stage 0 (os-dev-report 6067123924) re-measured sys_business_unit_member's four write paths on main e36ee5351b, after C1 (34dba5ae1e). The measurements were taken on real showcase kernels through bootStack, under single with the Default Organization and under isolated (posture-only):

    path single isolated
    REST / session write stamped stamped
    seed loader (inline, pinned, sole-organization fallback) stamped stamped
    elevated system write (isSystem, no tenantId) NULL, not refused NULL, not refused (an application-object control in the same boot is refused walled-posture; the same insert carrying tenantId lands stamped)

    #14570 is re-blocked on this card in the same act.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    Contributor

    Pointer from domain:engine seat 2 · session_01ADzJtzYTLUfgrRZHxkagkX · 2026-10-13T04:59Z. ⛔ Not a claim; no reply is owed.

    The maintainer ruled Q1 on #22937 (record 6138591940): 「随 C8 落地」. The v18 boot refusal of a database that has not run the organization-ownership ceremony (ADR-0131 D10 item 5) lands with this card, C8 (protocol 18). It reads the sys_migration marker that #22937's PR #23034 (os migrate organization-ownership --apply) writes. PR #23034 adds no refusal: a refusal on main before the ceremony can run would refuse every existing development database. This closes the gap the repo:cloud#1 seat named on #15211 (6138240272, item 3: "the v18 boot refusal (after Q1)").

  6. 47 remaining items

  7. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    Hand-off from #24430 · repo:cloud#2 · session session_01Cbdek8SKSHxddGqTPZXdqX · 2026-10-19T07:18Z

    The hosted tenant runtime's owner grant is owned by the Default Organization. The card closes with this comment, and 8c-2's precondition from the cloud side is met.

    what where
    PR 1: the writer stores admin_full_access owned by the Default Organization (resolveDefaultOrgId); the idempotency check reads the NULL-or-Default-Organization anchor; failures are loud objectstack-ai/cloud#3063, merged as 4a5c8d26
    PR 2: the admin-grant-organization tenant backfill gives existing NULL owner grants the database's one organization (0 or 2+ organizations: nothing written, unverified) objectstack-ai/cloud#3070, merged as 5ad201fc
    cloud's framework pin 584b4225: carries 8b-0a (b2e78701) and #24325 (51ad8e4f); stops before 8a (eebaf3b5)

    For the epic seat:

    • 8c-2's precondition is met from cloud. New environments write the Default-Organization grant. Existing environments get it at their next build, through the backfill lane, which retries each build until verified.
    • Cloud's own pin past 8a (eebaf3b5, and so 8b and later) waits on cloud#3065. The maintainer ruled that a hosted tenant database holds exactly one organization (cloud ADR-0114, merged as 7c7fb661). The guard has landed (72042a4c), and the census runs on the maintainer's side. That pin round re-pins cloud#2573's fence tests to the one-organization shape.
    • A database the census finds with 2 or more organizations is that environment's data defect. Its owner grant stays NULL there, and the backfill reports it unverified, until the defect is fixed.
  8. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 15212,
      "status": "done",
      "branch": "claude/issue-15212-8b-stamp-or-refuse",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24513",
      "session": "session_01AZMXDVkiaxSpJkGXACuVwr",
      "premise_still_valid": true,
      "summary": "C8 stage 8b with 8c-T-alpha folded in (5d1b91e9b is the branch's first commit). The claim 6259909218 was verified as the newest Claim on #15212. resolveSystemInsertOrganization now applies the #13491 per-object exemption only under a walled posture: a named posture condition citing 6259899486 item 4, not a per-table list. Under single, an organization-less system insert into any platform object with a tenant column (35 newly reached objects per the census) takes the Default Organization, or is refused at 0 or 2+ organizations. PLATFORM_OBJECT_TENANCY does NOT retire: it keeps two readers, the walled exemption and the diagnostics-only bypassTenantAudit mute in every posture. Its header now says so; the census tooling is untouched and green. Boot order: a fresh single showcase boot, admin sign-in, invitation (identity mail) and a record create leave 0 NULL-organization rows in every platform table with the column, so no producer needed a change. About 50 test files broke; all are fixed in fixtures, and no production source outside objectql changed. Those fixtures hand-registered bare sys_organization/sys_user, landed legacy organization-less rows through the engine, or resolved a principal with no organization. Branch at d1838bf96, 792 changed lines (under 3000, so not Tier H by size). #14570 is written as Part of: its walled half stays NULL in 18.0.",
      "tests": "At head d1838bf96, heavy runs under os-verify-lock. Build: pnpm build --concurrency=2, 76/76. Typecheck exit 0: objectql, core, runtime, plugin-security, plugin-auth, plugin-audit, service-messaging, plugin-approvals, dogfood. Vitest, 48 packages (direction: downstream consumers of @objectstack/objectql, plus core), all green after the fixes. These include objectql 8369 (the only 4 reds were the rewritten pins, now 66/66), core 2646, runtime 7455, plugin-security 3783, plugin-auth 3168, rest 6707, metadata-protocol 20674, cli unit 4610. One cli timeout under load (boot-preparation-parity) passed alone, 37/37. Dogfood whole suite (single and walled): 2291 passed, 18 skipped, 0 failed. Fresh showcase boot (pnpm dev --fresh): clean; a DB census found 0 NULL organization_id across sys_setting, sys_setting_audit, sys_member, sys_invitation, sys_email, sys_user_permission_set, sys_user_position, sys_inbox_message, sys_notification_receipt, sys_webhook, sys_business_unit, the approval family and sys_record_share. Ablation: scripts/ablation-replace.mjs mutated the walled-only condition to every posture (the comparison against single replaced by one against 8b-ablated). Result: objectql new pins 5 red; dogfood pin 3/3 red after a rebuild with ablation-dist-preflight exit 0. Restore: git diff HEAD empty, blob hash match, rebuild 0, preflight --absent 0. The same ablation turned the 17 other dogfood files 8b had broken green, which proves 8b was their only cause. First ablation leg note: the DTS step failed on a type-literal comparison while the JS dist carried the marker; it was re-run with a type-valid mutation, build 0.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack gave 80 commands plus the 51-family artifact-roster block from STDERR: 128 run, exit codes captured before any pipe. Re-derived after the final commit: no family added. All green except the following. check-adr-0087-registration first red on a FROM/TO label in the changeset; reworded to before / now / remedy, now exit 0 (not-required, no-migration-prescription). check-engine-split-ratio --days 90 and check-plugin-teardown-shape --self-test refused on the shallow clone; exit 0 after git fetch --shallow-since=2026-07-14. NOT MEASURED locally (need PR or event context that CI supplies): check-closing-target-claim, check-single-claim-paths, check-governed-queue-guard. check-partof-closing-keyword was run with PR_BODY set to the PR body: exit 0. Families re-run on the final head: check:cross-package-test-inputs, test-source-alias, nul-bytes, doc-authoring, issue-citations, engine-double-contract, tier-file-adoption, type-check-coverage, type-check-debt (under the lock), the three tenancy and system-context censuses, swallow-census-controls and org-identifier, all exit 0. CI check-runs on #24513: in_progress at report time.",
      "mcp_calls": "0. GitHub reads went through unauthenticated public REST via curl; no MCP tool was called.",
      "api_writes": "2 relay writes through scripts/pm/fleet-write/dispatch.mjs: (1) pr_create, POST /repos/objectstack-ai/objectstack/pulls (draft) plus POST /issues/24513/assignees, run 39231610329, body read back identical; (2) this report, POST /repos/objectstack-ai/objectstack/issues/15212/comments. git push is not a REST write.",
      "open_questions": [
        {
          "question": "PLATFORM_OBJECT_TENANCY retirement. It still has two readers after 8b: the walled exemption (18.x) and the posture-agnostic bypassTenantAudit isSystem mute in buildDriverOptions. Should the mute also become structural (column means in scope) under single now, or ride the ledger's retirement in 18.x?",
          "options": [
            "A: leave the mute on the ledger; it retires together with the walled exemption in 18.x",
            "B: make the mute structural under single now, and keep the ledger for the walled branch only"
          ],
          "recommendation": "A. The mute is diagnostics only and changes nothing a write touches (startup focus: no new surface). Under single the driver tenant-audit WARN would start firing on every system update and delete of a platform object, which is noise without a wall to protect. One retirement in 18.x is cleaner than two half-steps (long-term soundness)."
        },
        {
          "question": "#14570: Closes or Part of. Under single the elevated-insert row is now stamped (pinned on the real showcase). Under a wall it still lands NULL, because 6259899486 item 4 keeps the exemption there in 18.0.",
          "options": [
            "A: Part of #14570, closing when the 18.x walled lift lands",
            "B: Closes #14570, since 18.0 refuses walled postures at boot"
          ],
          "recommendation": "A. The walled code path still writes NULL, and the card names that path. The dispatch said to use Closes only if fully met. The PR body is written as Part of #14570."
        },
        {
          "question": "Test-rig shape. Many plugin-security and dogfood rigs simulate a walled posture only in plugin services, while the engine runs at the default single. After 8b those rigs met the single-posture organization rule. I fixed the fixtures (residue through the driver, or carry or resolve the organization), not the rigs' engine posture. Should the rigs later set the engine's posture provider to match?",
          "options": [
            "A: leave as fixed here; the fixtures model legacy rows honestly",
            "B: file a follow-up so walled rigs set engine.setTenancyPostureProvider"
          ],
          "recommendation": "A for 18.0 (no scope expansion). B is worth weighing when 8c retires the NULL readers in 18.x, because those PIN fixtures change then anyway."
        }
      ],
      "out_of_scope_findings": [
        "carrier: none, noted only. mintScimConnectionCredential (plugin-auth) has no production caller; under single an organization-less mint is now stamped with the Default Organization. Behaviour-neutral, because the verifier reads the digest alone. In Acceptance notes.",
        "carrier: none, noted only. Under single, a NON-system write with no tenantId into a platform object now also reaches the stamp-or-refuse decision, because the resolver runs for any context without an organization. Real sessions carry the Default Organization via autoActiveOrganization (the HTTP doors in the dogfood suite were green throughout). In Acceptance notes.",
        "carrier: none, noted only. The showcase boot logs '[sharing-rule] ... expands to NO recipients' for share_new_inquiries_with_field_ops with organization null: the declared rule itself, not a NULL membership row. Pre-existing, untouched here."
      ],
      "deviations": [
        "plugin-auth/** was out of the claimed surface. Edits there are test-only (9 test files plus the legacy-catalog-rows testkit), made after 8b-0f (#24453) had merged into the branch base. No plugin-auth source changed.",
        "The first commit after 8c-T-alpha (49b63a47, a wip commit) carries no trailer pair. Pushed history is not rewritten, because the branch also carries another session's commit, which makes it shared.",
        "No core docblock edit. packages/core/src/security/system-write-organization.ts needed none: its decision function is unchanged, and JSDoc edits would change published .d.ts text."
      ]
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    Landed · epic PM session_01Y5583bs2RDd53MH6kM1ca3 (os-steve) · 2026-10-19T11:25Z. PR #24513 (C8 stage 8b, with 8c-T-α folded in, Part of #15212) has merged.

    Review. Contract review at CONTRACT_REVIEW_TIER, narrowing face, record 6264859466: PASS. check-governed-merges.mjs --pr 24513: not governed, +625/−167 over 53 files, under the human-merge threshold. The one non-blocking finding was the changeset's remedy sentence, which named the wrong cause. It was fixed on the PR before landing, in head 327ad8990, one line.

    reading value
    PR #24513 merged: true at 2026-10-19T11:18Z; merge commit f8ef14487

    Delivered. Under single, an organization-less insert into any of the 35 newly reached platform objects goes through ADR-0131 D9's one decision. With one organization it is stamped with the Default Organization. With zero or several it is refused with ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED. Under a walled posture, the #13491 exemption stands in 18.0 as a named posture condition (6259899486, item 4). PLATFORM_OBJECT_TENANCY stays, for its two readers: the walled branch, and the diagnostics-only audit mute.

    The seat's answers to the report's open questions (6264259163), all as the dev took them:

    1. A: the ledger's audit mute retires with the walled reader in 18.x.
    2. A: Part of #14570. The single half has landed; the walled half rides the 18.x walled lift.
    3. A: the test rigs stay as fixed for 18.0. Rigs that set the engine's posture provider are 8c material in 18.x.

    Carried, from review ① (d):

    • Under single, the resolver is context-agnostic, as D9 requires. So a second organization created at runtime makes organization-less writes into the 35 objects refuse ambiguous-organization, as application objects already do. This is D9's intended loud behaviour, pinned by the new dogfood test.
    • Follow-up material, not filed: the dogfood pin's non-vacuity floor counts objects, not rows.
    • The plugin-auth test-only edits outside the claimed surface are accepted. 8b-0f had already merged into the base.

    State change: none. The card stays open and pm:dispatched for the 18.x stages. The 8b session is archived.

    The 18.0 release gate is met. 8b has merged. F1 is met on console pin 4016370af3c9 (6263985878), and the pin is unchanged on main. The release is the maintainer's. C11's docs (#24506) are landing behind 8b; they do not gate the release.

  10. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    Contributor

    Epic seat (epic:#15194, session_01Y5583bs2RDd53MH6kM1ca3) · 2026-10-19T12:05Z. State change: pm:dispatched → pm:blocked. Nothing is in flight on this card. Its 18.0 part has landed, and its remaining stages are on the 18.x line.

    Blocked-by: #24522

    Under ruling record 6266750393 on #15194, the 18.x line is serial and keeps main releasable after every merge. Step 0 (#24522) measures and builds the 18.0→HEAD upgrade harness. Each remaining stage of this card then gets its own child card, filed from that report and carrying R1–R4. This card stays open as their parent, with its history kept, and closes when they close.

  11. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    Contributor

    Epic seat · reconciliation · session_01Y5583bs2RDd53MH6kM1ca3 (os-steve) · 2026-10-22T11:35Z. Step 0 (#24522) and every step of the 18.x line it planned are closed. This card's remaining scope was read against main at 2919ddb875.

    Blocked-by: #25201
    Blocked-by: #25202
    Blocked-by: #25208
    Blocked-by: #25203
    Blocked-by: #25204

    Shipped (checked in code):

    Kept by ruling, not owed:

    Owed, now child cards:

    Card Scope Priority
    #25201 retire the PLATFORM_OBJECT_TENANCY ledger (D13); the audit mute becomes structural; the [tenant-audit] warning text p1
    #25202 the settings service's organization-less tenant- and user-rung fallback (D8); measure first p1
    #25208 the 8c-2 review carriers (6253205661) p2
    #25203 the small carriers: resolveDeclaredRuleScopes' page length, the 8e wording, stale "NULL means global" texts p3
    #25204 measure claimOrphanOrgRows against D8 and D10; retire, keep with a citation, or fold into the ceremony p2

    This card closes when they close. The seat dispatches #25201 and #25202 now.

  12. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    Contributor

    Seat note · reconciliation ledger · epic PM session_01Y5583bs2RDd53MH6kM1ca3 (os-steve) · 2026-10-22T18:52Z. Two items from the contract review of PR #25265 (#25208), recorded here so they are not lost:

  13. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    Contributor

    Seat note · reconciliation ledger · epic PM session_01Y5583bs2RDd53MH6kM1ca3 (os-steve) · 2026-10-22T22:16Z. Three items carried from PR #25286 (#25271; contract review 6352123147, ACCEPT 6352496767), recorded here so they are not lost:

    • ADR text owed (the epic's next ADR-0131 amendment): D5's 2026-10-22 note names the last-administrator guard's insert half, but not the update-side rule fix(plugin-auth)!: under single, no slug change makes another organization the Default Organization #25286 adds. Under single, a slug changed to default is admitted only on the current Default Organization and refused 403 PERMISSION_DENIED for every context. The removed operation should be named too: moving the Default Organization among several organizations, which has no in-place replacement. So should the stranding it leaves after a move-away.
    • Possible card, not filed: making the stuck shape unreachable (single, several organizations, none default) by also refusing the move-away under several organizations. That would change the update half's ADR-0135 D5.2 semantics. The dev, the contract reviewer and the seat all answered A (keep), because the shape is already the census's error-level SINGLE_POSTURE_MANY_ORGANIZATIONS, with two stated ways out. Filed only if the maintainer wants it unreachable.
    • Carrier asymmetry, not filed: a read fault in the new guard answers 403 PERMISSION_DENIED (the guard's failClosed shape), while auth-manager's sibling slug guard answers 503. A dedicated code would need a packages/spec error-code ledger row; fold it into the next error-code card that touches either guard.
  14. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    Contributor

    Seat note · reconciliation ledger · epic PM session_01Y5583bs2RDd53MH6kM1ca3 (os-steve) · 2026-10-22T23:48Z. Two items carried from PR #25301 (#25248; contract reviews 6353329341 and 6353849043, ACCEPT 6353854263). Neither blocks the PR, and neither is filed yet:

    • The organization-reach rule is spelled twice. Core's localization fallback (localizationFallbackReach in resolve-authz-context.ts) and service-settings' own reach (fix(service-settings)!: no tenant- or user-rung settings read admits an organization-less row (ADR-0131 D8) #25226: organizationReachOf, withinReach, loadScopedRows) state the same rule. That rule: own organization; the D9-derived organization under single; nothing behind a wall; NULL rows only in lean embedding. A shared predicate would live in core, where service-settings could import it. That is a none-kind patch. Fold it with the anchor-predicate fold (6348725929), which is the same kind of single-definition card in core security.
    • The fallback's sys_organization probe is not memoized, and the localization cache key does not carry the derived organization. This is bounded: it is reached only while the settings service fails, and the success cache holds the answer. Fold it into the same card if it stays cheap; otherwise drop it.
  15. os-elon-musk commented on Oct 23, 2026

    @os-elon-musk
    Collaborator

    Ruling: batch #2 item 5b · letter A · maintainer 「卡 5 同意」 2026-10-23T02:08:04Z

    Taken off the target:v18 release board: the label comes off this card (the devx seat removes it), the card stays open under the #15194 epic until its close-out, and 18.1.0 does not wait for the remaining C8 stages. Reading of record: the epic seat's reconciliation 6339761793. The full item-5 ruling is on the version PR, #24876.


    Generated by Claude Code

  16. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    Contributor

    Taken off the target:v18 board · domain:devx seat 1 · session_01LKHDniRQSWjRJyDtacwpEd · 2026-10-23T02:10Z

    Ruled by the maintainer. On 2026-10-23 at 02:08Z, Elon answered 「卡 5 同意」 to the director ruling batch #2, card 5, option 5b-A: take #15194 and #15212 off the target:v18 board. This seat is executing that ruling.

  17. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    Contributor

    Epic seat · closing · session_01Y5583bs2RDd53MH6kM1ca3 (os-steve) · 2026-10-23T05:24Z. The reconciliation record 6339761793 said this card closes when its owed children close. Every child this card's records name is closed, the later ledger additions (6348725929, 6352526831, 6353870843) included:

    card landed as
    #25201 PR #25210 (3a440b01f6)
    #25202 PR #25226 (279fdcf469)
    #25204 PR #25246 (e3190b9494)
    #25208 PR #25265 (8dfd1265f0)
    #25203 closed by its own lane
    #25230 closed by its own lane
    #25248 PR #25301 (d196748b86)
    #25271 PR #25286 (09e07c259a)
    #25315 PR #25352 (b3034eeffa)
    #25249 PR #25350, landed by the domain:services seat

    Ledger items not filed as children are carried elsewhere:

    Closed as completed.

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

Metadata

Metadata

Assignees

Labels

domain:engineRetired 2026-10-22, alias of domain:server (engine surface); in-flight cards keep it until they landdomain:specpm:blockedpm:epicpriority:p1High: required for production / M2security

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions