Repository navigation
QA run · walled:isolated+group (11/14) · 580fd4ed · 2026-10-20 · 8 PASS / 1 PARTIAL / 1 FAIL / 1 BLOCKED / 3 NOT-RUN #24783
Description
QA run record: the walled-posture pass of the 18.0 round-3 top-up (anchor #24579). Server half (2): surface:cli, surface:build and this walled pass. The sister card S1 runs surface:api on the default single posture and parked its walled legs here. Maintainer-approved top-up, dispatched from session session_01CfRDy7SuTfUqaTu2AEH2Hi on 2026-10-20.
Scope rule for this record: for each item, only the walled leg is judged, i.e. the clauses its fixtures.knownGaps names as walled. Each is judged once under isolated and once under group, and both answers are written. Non-walled clauses are out of scope (walled pass). Console clauses are not-run (browser). A knownGaps entry recorded as blocked for another reason is carried as written.
Environment fingerprint
- framework:
580fd4ed3c98a1752dfb0041b45cc713644fef7e(no pull, no sha change)..objectui-sha: not used. The console was not built, by dispatch decision. - build:
pnpm install --frozen-lockfilethenpnpm build --concurrency=2, giving 76/76 tasks.node scripts/check-dev-prereqs.mjsis green. - runner: one Claude Code cloud session. A second, independent agent did the RUNNER rule 7 re-derivation (see "Rule 7").
- scratch app: a copy of
examples/app-showcase(tar, withoutnode_modules,.objectstackordist) in a session scratch directory. Its ownpackage.jsoncarries every showcase dependency aslink:to the workspace package, plus"@objectstack/organizations": "link:/home/user/objectstack/packages/plugins/organizations", installed there withpnpm install --ignore-workspace.- Package-file refs, for example the OpenAPI connector spec, resolve against the served root, so a config that only re-exports the stock showcase does not boot. The copy has to carry
src/.
- Package-file refs, for example the OpenAPI connector spec, resolve against the served root, so a config that only re-exports the stock showcase does not boot. The copy has to carry
- boot command, run from the scratch app:
OS_PLATFORM_OWNER_EMAIL=admin@objectos.ai OS_AUTH_MEMBERSHIP_POLICY=invite-only OS_PORT=P OS_TENANCY_POSTURE=isolated|group node packages/cli/bin/run.js dev --seed-admin -p P -d file:RUNDIR/{iso,grp}.dbisolatedran on port 47621, thengroupon 47631, one after the other.- A third short
isolatedboot on 47651 ran the removed-member producer probe. - Each boot printed
Tenancy: isolatedorTenancy: groupand mountedOrganizations.GET /api/v1/auth/configansweredfeatures.multiOrgEnabled: truewithtenancyPostureequal to the posture.
- personas, per boot:
- operator
admin@objectos.ai: the seeded admin. It isOS_PLATFORM_OWNER_EMAIL, positions includeplatform_admin, andisPlatformAdmin: true. - A, B, N: minted with
POST /api/v1/auth/admin/create-user, thenchange-password. Self-registration answers403 SELF_REGISTRATION_CLOSED(audienceinvite_only). Each answeredmembershipCreated: false. - A and B each created their own organization:
POST /api/v1/auth/organization/create, thenset-active. - N holds no membership at all.
- A later created a second organization, A2.
- operator
- fixture writes made outside HTTP (system-level stamps on the run's own scratch SQLite, never a shared DB):
- one
sys_user_permission_setrow granting A a runtime-authoredqa_meta_authorset (systemPermissions: ['manage_metadata']) in organization A. No HTTP door could place it: the operator is refused writing into an organization it is not a member of, and A's own org-admin insert is refused by ADR-0090 D12 condition (c). sys_setting.locked = 1on A's tenant row. No HTTP door sets a tenant lock:sys_settingrefusesupdatewith 405OBJECT_API_METHOD_NOT_ALLOWED, andPUT /api/settings/NScarries no lock.- one legacy unscoped
admin_full_accessgrant row for N, used for the platform-owner leg.
- one
- times (UTC): install and build 04:57–05:09. Scratch app and prerequisite probes 05:10–05:17.
isolated05:17–05:26,group05:26–05:30, removed-member probe 05:37–05:39.
Environment self-check (run before scoring)
OS_TEST_TIERS=nightlyvitestpackages/cli/test/serve-organizations-host-resolution.e2e.test.tsandserve-organizations-mount-failure.e2e.test.ts: Test Files 2 passed (2), Tests 7 passed (7). These are the seven walled e2e cases.- vitest
packages/qa/dogfood/test/wall-*.dogfood.test.ts: Test Files 6 passed (6), Tests 121 passed (121). - Prerequisite refusals, measured through
os devfrom the scratch app underisolated, one prerequisite absent each time:@objectstack/organizationsremoved from the app'spackage.json(the link still present innode_modules): exit 1,✖ FATAL: tenancy posture 'isolated' was requested but @objectstack/organizations could not be loaded, so the organization wall is INACTIVE … (ADR-0093 D5).OS_PLATFORM_OWNER_EMAILunset: exit 1,✗ [auth] tenancy posture 'isolated' requires OS_PLATFORM_OWNER_EMAIL to be set ….OS_AUTH_MEMBERSHIP_POLICYunset: exit 1,✖ FATAL: tenancy posture 'isolated' is walled, but this deployment never declared a membership policy(membership policy "auto", source: default).- With all three present, the boot served (
✓ Server is ready, health 200). No FATAL refusal occurred with the prerequisites met.
Scope: items and revisions
access-security.no-active-org-session-semantics r4 (P0) · access-security.walled-environment-metadata-operator-only r3 (P0) · platform-core.settings-organization-isolation-and-platform-rung r3 · access-security.activation-write-operator-gate r6 · access-security.platform-owner-email-anchor r5 · access-security.grant-table-write-contract r4 · access-security.parent-and-organization-write-guards r3 · records-forms.record-discussion-mentions r4 · integration-system.webhook-lifecycle r8 (all P1) · api-backend.action-activation-door-contract r3 · attachments-storage.chunked-upload-integrity r5 · automation.connector-dispatch-matrix r3 · identity-auth.workspace-org-switch r4 · studio-authoring.metadata-diagnostics-sweep r5 (all P2).
Per-clause verdicts (walled legs only; ISO = isolated, GRP = group)
access-security.no-active-org-session-semantics (P0): FAIL (GRP), pass on ISO
The whole item is a walled leg (requires[0]). Producer used: walled posture plus invite-only. An admin-created user with no membership is durable and non-racy: ADR-0093 D1 no-target-org, membershipCreated: false. Its session reads activeOrganizationId: null (get-session payload) and it has 0 sys_member rows. Second producer: an organization member who clears the active org with POST /api/v1/auth/organization/set-active {"organizationId": null}; get-session then reads null.
- a[0] tenant-scoped reads resolve to nothing:
- ISO pass: N,
GET /data/showcase_taskand/data/showcase_accountanswer 200records: []. - GRP pass for N.
- Note: under GRP the member with no active org (A) reads its own organization's rows (11 tasks, all organization A), because group reads span the caller's memberships. See accuracy finding F3.
- ISO pass: N,
- a[1] tenant-scoped writes refused 4xx naming the missing org:
- ISO pass: N and A (cleared) get
403 PERMISSION_DENIED"[Security] Access denied: 'showcase_task' is scoped to an organization, and this session has no active organization — so this insert has no organization to place the record in …". - GRP pass for N, same 403.
- GRP fail for A (member, cleared active org):
POST /api/v1/data/showcase_taskanswers500 {"error":"Internal server error","code":"ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED"}. Reproduced twice by the runner and twice by the rule-7 verifier on fresh boots. Reproduction is below. showcase_accountis no control: its 403 is the object-permission gate (allowCreate: falsefor the caller's sets), which runs first.
- ISO pass: N and A (cleared) get
- a[2] no NULL stamping: ISO pass, GRP pass. Admin-side counts of
showcase_task/showcase_accountrows with NULL or emptyorganization_idwere 0 before and 0 after every refused attempt, including the 500s, and no row titled with the probe exists. - a[3] org-scoped holder with no active org reads and writes nothing across tenants:
- ISO pass: A (owner of org A,
organization_adminin A) with active org cleared./auth/me/permissionsdropsorganization_admin, sosystemPermissionsis []. Lists ofshowcase_task,showcase_account,sys_memberandsys_invitationreturn 0 rows. B's task by id answers 404, and so does A's own task. Writes are refused, andinvite-memberinto B's org answersMEMBER_NOT_FOUND. - GRP pass on the cross-tenant point: A sees only organization A rows (its membership), and B's task answers 404.
- ISO pass: A (owner of org A,
- a[4] audit rows are not permanently invisible:
- ISO and GRP pass, with a note. N's
login/logoutrows insys_audit_logcarrytenant_id: nullbecause the user belongs to no organization at all, so there is no real tenant to stamp. - The platform operator reads them through
GET /api/v1/data/sys_audit_log?filter={user_id}(200, login and logout listed), so they are not invisible to every RLS reader. N itself gets 403 onsys_audit_log. See F3.
- ISO and GRP pass, with a note. N's
- a[5] the state is legal and nothing 500s:
- ISO pass: get-session 200,
GET /data/sys_user200,POST /auth/update-user200, no 5xx. - GRP fail: the member write path in a[1] answers 500 (negative[3]).
- ISO pass: get-session 200,
- a[6] the three subsystems agree:
- ISO pass. Sharing drops org grants with no active org; the wall gives empty reads and 403 writes; the audit rows are recorded and readable by the operator.
- GRP fail: the write path gives two answers to the same state, 403 for a non-member and 500 for a member.
- Negatives: negative[0], [1], [2], [4] and [5] did not occur on either posture. negative[3] (a 500) occurred on GRP.
access-security.walled-environment-metadata-operator-only (P0): PASS
The walled legs per knownGaps[0] are a[1], a[2] and negative[0]. A holds manage_metadata in organization A only: /auth/me/permissions includes it, positions are [org_owner, everyone], isPlatformAdmin: false.
- a[1]: ISO pass, GRP pass. As A:
PUT /meta/object/qa_walled_probe(sharingModel set) → 403 FORBIDDEN, "… requires the platform operator: this deployment runs the 'isolated'/'group' tenancy posture …".PUT /meta/permission/showcase_member_access→ 403 FORBIDDEN.POST /meta/view/showcase_task.urgent/publish→ 403 FORBIDDEN.DELETE /packages/com.example.showcase→ 403 PERMISSION_DENIED.POST /security/permission-sets/showcase_member_default/clone→ 403 PERMISSION_DENIED.POST /meta/_migrate-stored→ 403 FORBIDDEN.POST /automation→ 403 PERMISSION_DENIED.POST /marketplace/install-localwith a catalog-carrying manifest → 403 FORBIDDEN.- Read-backs as the operator: the object, clone and flow answer 404, the package is absent, and the showcase package is still present.
- a[2], walled half: ISO pass, GRP pass. The operator's identical object PUT answers 200 ("Saved object … env-wide"), GET answers 200, and the follow-up delete answers 200. The
singlehalf is out of scope (walled pass). - negative[0]: ISO pass, GRP pass. No org-owner write succeeded.
platform-core.settings-organization-isolation-and-platform-rung (P1): PASS
- a[2]: ISO pass, GRP pass.
- A
PUT /api/settings/company {"legal_name":"A Corp"}stores a tenant row in organization A. B's read stays default/null, then B's own value. The lock was stamped on A's row (see the fixture writes above); A's read showslocked: true. - B reads
locked: falseand B's write is admitted. The DB holds one row per organization, A locked and B unlocked.
- A
- a[3]: ISO pass, GRP pass. The operator with active org cleared,
PUT /api/settings/company→400 SETTINGS_VALIDATION"… Legal name is a per-organization setting, and this write names no organization to store it for …". No row was written.- Callers without
setup.writeget403 SETTINGS_FORBIDDENfirst.
- Callers without
access-security.activation-write-operator-gate (P1): PASS
The walled leg is a[4], live.
- ISO pass, GRP pass. As A (org admin with
manage_metadata):POST /automation/showcase_urgent_task_alert/toggle {"enabled":false}→ 403 PERMISSION_DENIED "Enabling or disabling a packaged flow writes an INSTALL-WIDE activation row, and this deployment runs the 'isolated'/'group' tenancy posture … It requires the platform operator (ADR-0126 §5) … ask your platform operator; an organization that needs flows of its own is given an environment of its own." No clone is recommended.- Action door
POST /actions/_activation/showcase_task/showcase_mark_done→ the 403 action sentence, also operator-only with no clone. - The invalid body
{"enabled":"false"}still answers the 403. sys_metadata_activationis empty after the refusals.
- The operator's toggles answer 200 at both doors. The ledger rows are
flowandaction,active: false, with noorganization_idkey on either. Both were restored to enabled. - B (no
manage_metadata) gets the tier sentence "requires themanage_metadatacapability".
access-security.platform-owner-email-anchor (P1): PASS
The walled half of a[5], live.
- ISO pass, GRP pass. The config anchor confers on the walled rig: the operator has
isPlatformAdmin: trueandplatform_adminamong its positions. - A legacy unscoped
admin_full_accessgrant row (N,organization_idNULL) confers no rung on a walled posture: N reads positions[everyone],isPlatformAdmin: false. The held set's capabilities still apply:GET /datasourcesanswers 200 andsystemPermissionsincludesmanage_platform_settings. This matches the clause ("the held set still grants its own capabilities; only the rung and the built-in platform_admin position go"). - With that set, N is still refused metadata writes: 403 "requires the platform operator".
access-security.grant-table-write-contract (P1): PASS
- a[4]: ISO pass, GRP pass. A (org admin, org A)
POST /data/sys_user_permission_set {"user_id": B, "permission_set": "showcase_member_default"}→ 400 VALIDATION_FAILED,fields[0] {field: user_id, code: reference_not_found}, "… is not a member of the organization … add the user to that organization first". - Controls: naming B's organization explicitly → 403 "the row belongs to organization …, not the one you administer". A grant to A itself → 201.
access-security.parent-and-organization-write-guards (P1): PASS
- a[1]: ISO pass, GRP pass.
- A
PATCH /data/showcase_task/ID {"organization_id": null}→ 403 PERMISSION_DENIED "the update would leave 'showcase_task' with no organization".""gives the same answer. Naming B's org → 403 "would place … in another tenant". The row is unchanged. - Inserts carrying
organization_id: ""ornull→ 201, stamped with organization A (DB read).
- A
records-forms.record-discussion-mentions (P1): NOT-RUN (no walled leg)
- Its knownGaps names no walled leg. The hit that put it on the list is a pin fixture name (
lead_walled); see F1. Every clause is out of scope (walled pass), and the console clauses are not-run (browser). - Observed while probing the server half on both walled boots: an authorization / tenancy-wall finding, filed separately with detail withheld pending maintainer (see "Extracted"). Reproduced on both postures by the runner and by the rule-7 verifier.
integration-system.webhook-lifecycle (P1): BLOCKED
- a[2] (bulk pair):
blocked(dependency), carried as knownGaps[1] writes it. The flow-node predicate multi-write organization question on QA run · surface:mixed (90/90) · 36b2889c · 2026-10-12 · 72 PASS / 10 PARTIAL / 8 FAIL / 0 BLOCKED / 0 NOT-RUN #23166 is unruled. Not hard-judged. - Observed on both walled boots, outside the clauses:
- The declared
showcase_task_changedis switched on only by the operator. An org admin gets 403 "writes an INSTALL-WIDE activation row … requires the platform operator"; an undeclared name answers 404. - Once on, it delivered one
sys_http_deliveryrow per task create, stamped with that event's organization:declared:showcase_task_changedfor A, and the same for B. Each organization reads only its own delivery rows. - An in-organization scratch
sys_webhookauthored by A (organization A) received A's create only. B's create in the same window did not reach it. B reads nosys_webhookrow of A's: list empty, by-id 404, PATCH 404. - B's
POST /api/v1/webhooks/redeliverof A's delivery id → 404 RESOURCE_NOT_FOUND. - See F4: requires[0]'s "under a walled posture it would be refused as belonging to no organization" no longer holds.
- The declared
api-backend.action-activation-door-contract (P2): PASS
The walled reading is a[0], authority first under a wall. knownGaps[2] calls it unreachable; see F5.
- ISO pass, GRP pass.
- A (org admin with
manage_metadata)POST /actions/_activation/showcase_task/no_such_action {"enable": false}(mis-bodied and undeclared) → 403 PERMISSION_DENIED with the posture/operator sentence. That is neither the 400 nor the 404, and it recommends no clone. - B (no
manage_metadata) → 403 with themanage_metadata"functionally equivalent to deleting it" sentence. Anonymous → 401 UNAUTHENTICATED.
- A (org admin with
- Operator controls: undeclared → 404 "has no declaration — there is nothing to switch off";
{"enable":false}on the declared action → 400 VALIDATION_FAILEDunknown_field, "did you meanenabled?". - No ledger row was written by any refusal.
attachments-storage.chunked-upload-integrity (P2): PASS
- a[3]: ISO pass, GRP pass.
- Cookie sign-in as A with active org A.
POST /api/v1/storage/upload/chunked(2 chunks), then chunk 0 → 200. set-activeto A2, then chunk 1 PUT →409 RESOURCE_CONFLICT"This upload was started in a different organization than your active one …", and complete → the same 409.- Progress → 200,
status: in_progress,uploadedChunks: 1. ItsexpiresAtis 24 h after the start, so the stamp is not due.
- Cookie sign-in as A with active org A.
- Cross-user probe: B with A's upload id gets progress 403 "Only the user who started this upload can act on it" and file URL 404.
automation.connector-dispatch-matrix (P2): NOT-RUN (no walled leg)
- No walled leg: the "isolated boot" in its text means the dogfood §0 own-port boot (F1).
- Observed: on both walled boots a task created in organization A or B fired
showcase_declarative_connector_pingandshowcase_mcp_connector_echo, bothcompleted, with runs stamped with that organization. Each organization reads only its ownsys_automation_runrows.
identity-auth.workspace-org-switch (P2): PARTIAL
- a[0], a[2], a[4]: not-run (browser). The posture precheck for a[0] holds:
/auth/configtenancyPostureis isolated/group andmultiOrgEnabled: true. - a[1]: ISO pass, GRP pass. A, holding organizations A and A2,
set-activeA2 → 200.get-active-membernames A2. - a[3]: ISO pass, GRP pass.
- ISO: A's org-A task by id → 404 after the switch, and the list holds only A2 rows (10 seeded).
- GRP: org-A rows stay readable (13 A plus 10 A2, reads span memberships), and a create after the switch lands in A2 (DB read of
organization_id). - Both:
GET /meta/object/showcase_taskis byte-identical (md5) before and after.
- a[5] API half: ISO pass, GRP pass. Forged
set-activeto B's organization →403 USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATION. Afterwardsget-active-member→400 NO_ACTIVE_ORGANIZATIONand get-session active is null, never B's org. The UI half is not-run (browser).
studio-authoring.metadata-diagnostics-sweep (P2): NOT-RUN (no walled leg)
- No walled leg: "isolated scratch file DB" means the run's own DB (F1).
- Observed on both walled boots: an org admin
GET /meta/diagnostics→ 200entries: [],scannedTypes: 28,scannedItems: 402.?type=viewes→ 400 with the spelling refusal.
Reproduction rule: the one publishable fail (GRP only)
- Boot the scratch app as in the fingerprint, with
OS_TENANCY_POSTURE=group. - As the operator,
POST /api/v1/auth/admin/create-user {"email":"qa-a@wall.test","password":"…"}. Sign in as that user, change the password, and sign in again to get token T. POST /api/v1/auth/organization/create {"name":"qa-org-a","slug":"qa-org-a"}, thenPOST /api/v1/auth/organization/set-active {"organizationId": "ORG_A"}.- Create
showcase_account {name}, thenshowcase_project {name, account}, and keep the project id. POST /api/v1/auth/organization/set-active {"organizationId": null}.GET /api/v1/auth/get-sessionnow showssession.activeOrganizationId: null.POST /api/v1/data/showcase_task {"title":"x","project":"PROJECT_ID"}.- expected (a[1], and the ISO answer to the same steps): 403 PERMISSION_DENIED naming the missing active organization.
- actual:
500 {"error":"Internal server error","code":"ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED"}. The server log shows[REST] Unhandled error: SystemWriteOrganizationRequiredError: Insert on 'showcase_task' was REFUSED: a system-context write on a tenant-scoped object must carry an organization …. No row was written.
- Disposition: product defect. The fix is in the walled write path, not the checklist; it was extracted.
Rule 7
The P0 fail and the authorization finding were re-derived by an independent agent on its own fresh isolated and group boots, from the steps alone. It agrees on both:
- the 500 reproduces on
grouponly, with no row written; - the 403 holds for a member-less caller on both postures;
- the 500 is error-contract severity, not a security bypass: the write is evaluated as the session, and only the error text says "system-context".
Removed-member producer (knownGaps[0] of the P0 item)
On isolated:
- The operator
add-members M into organization A. M's session reads A's task (200). - A
remove-members M; M'ssys_membercount is 0. - M's live token then answers 401 UNAUTHENTICATED on reads, list, create and update. The removal revokes the session, so this path no longer yields "a live session with no organization" (F3).
Extracted
See the comments below; card numbers are added at close-out.
Checklist-accuracy findings / fixture gaps (for the anchor #24579, not extracted)
- F1, the dispatch's list of 14 walled items: three carry no walled leg in
fixtures.knownGaps. Their keyword hit is a word collision:records-forms.record-discussion-mentions: the pin fixture namelead_walled.automation.connector-dispatch-matrix: "boot showcase isolated", the dogfood §0 own-port boot.studio-authoring.metadata-diagnostics-sweep: "isolated scratch file DB".- They are NOT-RUN here, so the denominator 14 overstates the walled set by three.
- F2, the RUNNER entry "A walled boot is a fixture of its own" and the rewritten knownGaps:
- The three prerequisites refuse as described through
os dev. - Through bare
os serve(and soos start) withoutNODE_ENV=development, the boot runs in production mode and needsOS_AUTH_SECRETand a stable encryption key first. Without themAuthPluginis skipped (⚠ AuthPlugin skipped — set OS_AUTH_SECRET …), the walledOS_PLATFORM_OWNER_EMAILand membership-policy gates never run, and the walled server comes up⚠ Server is ready — DEGRADED: missing core services: auth, not FATAL. Measured withos serve --no-uifrom the scratch app, prerequisites 1 and 3 present and 2 absent, and with 1 and 2 present and 3 absent. - So the entry's "each one absent refuses the boot naming itself" holds for
os devonly;serve/startneed the auth secret as a fourth prerequisite before the other two are judged. - A config that only re-exports
examples/app-showcase/objectstack.config.tsfrom a scratch directory does not boot: package-file refs (the OpenAPI connector spec) resolve against the served root. The scratch app must be a full copy.
- The three prerequisites refuse as described through
- F3,
access-security.no-active-org-session-semantics:- knownGaps[0] and [1] say the durable producers are the removed-member path or a reconciler that binds nobody, and that
invite-onlyis blocked(fixture). On a walled boot withOS_AUTH_MEMBERSHIP_POLICY=invite-only(a walled-boot prerequisite), every admin-created user lands withmembershipCreated: false, which is a durable producer.set-active {"organizationId": null}is a second durable producer. - The removed-member path now revokes the session (401), so it no longer produces the state.
- a[0] reads "resolve to nothing", but under
groupa member with no active org reads its memberships' rows by design. The clause should scope itself to a caller with no membership, or say whatgroupanswers. - a[4] assumes every first-session audit row has a real tenant; for a user with no organization at all the rows are NULL-tenanted and readable only by the platform operator. The clause should say whether that is the intended answer.
- knownGaps[0] and [1] say the durable producers are the removed-member path or a reconciler that binds nobody, and that
- F4,
integration-system.webhook-lifecyclerequires[0]: "under a walled posture it would be refused as belonging to no organization" is stale.- Under
isolatedandgroupthe declared webhook, switched on by the operator, delivers one row per event stamped with that event's organization, and each organization reads only its own. That is the shapewall-declared-webhook-deployment-wide.dogfood.test.tspins. - Creating a scratch
sys_webhookover/dataneedsdefinition_json(required) and lower-casemethod; the recipe names neither.
- Under
- F5,
api-backend.action-activation-door-contractknownGaps[2] still says the group/isolated legs "need an enterprise tenancy runtime no example app composes". That is stale since feat(objectql,cli)!: 18.x step 4: the walled lift (8b walled half plus the walled part of #24489) #24580; a scratch app with the open@objectstack/organizationscomposes it, and the ordering held on both postures. - F6,
platform-core.settings-organization-isolation-and-platform-rungsteps[2] says "save a tenant key and lock it". No HTTP door sets a tenant-row lock:sys_settingrefuses update 405, and the settings PUT carries no lock. The run stampedlockeddirectly, so the step needs a named recipe. - F7,
access-security.walled-environment-metadata-operator-onlyrequires[2] andaccess-security.activation-write-operator-gateneed an organization owner holdingmanage_metadatain their own org. No HTTP door grants it on a walled boot:- the operator cannot insert a grant into an organization it is not a member of (403 "outside the caller's organization scope");
- the org admin's own insert is refused (ADR-0090 D12 condition (c):
manage_metadatais not scopeorg). - The run used a system stamp; the fixture needs a named recipe (the dogfood harness inserts it through the engine).
- F8,
identity-auth.workspace-org-switchrequires[0]: the parenthetical "measured by QA run QA run · surface:mixed (90/90) · 36b2889c · 2026-10-12 · 72 PASS / 10 PARTIAL / 8 FAIL / 0 BLOCKED / 0 NOT-RUN #23166 … REFUSES TO BOOT" predates feat(objectql,cli)!: 18.x step 4: the walled lift (8b walled half plus the walled part of #24489) #24580, and step text should cite the RUNNER walled-boot entry instead. A user can hold two memberships by creating a second organization itself; the platform-adminadd-memberis not needed.
Handover
None of the 14 is left un-handled. The three NOT-RUN items have no walled leg (F1). The browser clauses of identity-auth.workspace-org-switch need a console build.
Activity
objectstack-fleet commentedon Oct 20, 2026
Close-out: extraction for this record (RUNNER extraction obligation; one line each).
Extracted: #24784 · access-security.no-active-org-session-semantics · acceptance[1] (group posture: a member with no active organization gets 500 ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED; also acceptance[5], acceptance[6], negative[3])
Extracted: #24785 · records-forms.record-discussion-mentions · acceptance[4] (authorization class: detail withheld pending maintainer)
Parked-on: #24579 · checklist-accuracy findings F1–F8 and the walled-boot prerequisite note (F2), from this record's "Checklist-accuracy findings / fixture gaps" section
Both extracted findings were re-derived on fresh walled boots by an independent agent (RUNNER rule 7), which agreed with each.
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Closure complete (checklist-test §5): every FAIL in this record has a disposition (the
Extracted:/Parked-on:lines in comment 6284383133). #24784 and #24785 are both closed: #24785 was fixed by PR #24794, and its ledger clause landed through PR #24811 and PR #24869. Accuracy findings F1–F8 are parked on #24579 (comment 6284472874), and round 11 (#24801) took the walled-boot corrections.Closed by: the 18.0 QA wave dispatch session
session_01CfRDy7SuTfUqaTu2AEH2Hi, on the maintainer's standing instruction there (2026-10-19, verbatim 「qa-run的卡片处理完的是不是可以关闭」), at 2026-10-20T13:11Z, after 18.0.0 was published.Generated by Claude Code