Skip to content

QA run · priority:P0 (23/23) · 6679644a · 2026-10-25 · 19 PASS / 4 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #25812

Open

Description

@objectstack-fleet

QA run record for selector priority:P0 of the 18.2.0 release test sweep (wave anchor #25807, card T1). Run by the checklist-test skill following docs/qa/platform-checklist/RUNNER.md, for the Version Packages PR #25640.

Environment fingerprint

  • framework: 6679644a1a56b552d6864b125900221823ec78b3 (objectstack-ai/objectstack main, head at start, 2026-10-25T13:35Z), tree clean; pnpm install --frozen-lockfile + pnpm build --concurrency=2 76/76 green; node scripts/check-dev-prereqs.mjs green. The tree is unreleased, so /api/v1/health reports version: 18.1.0 (52 pending changesets).
  • console: .objectui-sha = b41ed7f68956c8cfda21bc790548361af81b09ac, built with OBJECTUI_DEPS_BUILD_CMD='pnpm exec turbo run build --concurrency=2 --filter=@object-ui/console^...' pnpm objectui:build ("dist ready … from objectui@b41ed7f68956"); packages/console/dist/.objectui-sha equals the pin and pnpm check:console-sha is green, so stale-console-bundle is ruled out for every console observation. A pin move is in flight (chore(console): move the objectui pin b41ed7f68956 → objectui main before the 18.2.0 cut (maintainer: bump first) #25810); the maintainer directed this run to stay on b41ed7f68956.
  • app: examples/app-showcase; canonical boot OS_PORT=PORT setsid pnpm -C examples/app-showcase exec objectstack dev --ui --seed-admin -p PORT -d file:SCRATCH/ITEM.db, own port per item (ranges 41101–41599) and own file DB per item; items that author metadata, install or plant rows booted from a scratch copy of the app. Seed: --seed-admin (admin@objectos.ai) + showcase seed 132 rows. Walled leg: the same boot with OS_TENANCY_POSTURE=isolated, OS_PLATFORM_OWNER_EMAIL, OS_AUTH_MEMBERSHIP_POLICY=invite-only.
  • Tier 1: every framework file named in the items' automated.ref, one vitest invocation per owning package at --maxWorkers=1, serialised across runners with a file lock; the Playwright pin examples/app-showcase/e2e/showcase-smoke.spec.ts ran against a live boot with OS_TEST_CHROMIUM_EXECUTABLE_PATH=/opt/pw-browsers/chromium.
  • Fixtures provisioned by the runners: v17 SQLite from npm @objectstack/cli@17.7.0 (os start, real 17.x shape); local Postgres 16 (scram-sha-256) for the datasource matrix; personas minted by invite + sign-up or admin create-user + change-password.
  • date: 2026-10-25 (UTC), container Linux 4 vCPU / 15 GB; runner: one orchestrator + 5 runner subagents in parallel (api ×2, cli ×1, browser/mixed ×2).

Scope

Selector priority:P0 resolved with node scripts/checklist-select.mjs priority:P0 --json → 23 runnable items; 1 blocked item hidden and not run (access-security.no-active-org-session-semantics, --include-blocked not passed); 0 planned items matched. Every item the selector returned has a verdict. Item · surface · revision · derived verdict:

item surface rev verdict
access-security.rls-both-sides api 7 PARTIAL
access-security.write-path-guards api 6 PASS
access-security.crud-permission-matrix api 7 PARTIAL
access-security.owd-sharing-matrix api 4 PASS
access-security.anonymous-deny-surfaces api 3 PASS
access-security.walled-environment-metadata-operator-only api 5 PARTIAL
ai.mcp-stdio-fail-closed cli 6 PASS
api-backend.query-contract-matrix api 5 PASS
api-backend.packaged-action-disabled-dispatch api 7 PASS
approvals.account-app-entry browser 4 PASS
automation.packaged-flow-disable-durable api 5 PASS
cli.dev-boot-contract cli 7 PASS
cli.organization-ownership-ceremony cli 4 PARTIAL
identity-auth.default-organization-boot-invariant api 2 PASS
integration-system.datasource-credential-refusal-matrix mixed 5 PASS
platform-core.boot-health mixed 9 PASS
platform-core.seed-integrity api 4 PASS
platform-core.console-login browser 4 PASS
platform-core.nav-surfaces-render browser 6 PASS
platform-core.builtin-apps-nav-render browser 7 PASS
platform-core.v18-boot-refusals cli 6 PASS
records-forms.crud-roundtrip browser 13 PASS
studio-authoring.first-run-loop mixed 6 PASS

Per-clause verdicts

Clause ids are 0-based over acceptance[]; N0… are negative[]. Evidence is text server truth (API / log / build / test output); a screenshot oracle is described in one line. Pins name the layer they reach (RUNNER rule 6).

item clause verdict evidence
access-security.rls-both-sides 0 pass live :41101 — A list 200 titles [A note 2, A note 1] (no B), B list 200 [B note 1] (no A); identities proven by get-session
access-security.rls-both-sides 1 pass A GET /data/showcase_private_note/‹B id› → 404 RECORD_NOT_FOUND (not-found-shaped denial)
access-security.rls-both-sides 2 pass A PATCH ‹B id› {body:forged} → 404 RECORD_NOT_FOUND; admin re-read body=original-b, record JSON byte-identical (updated_at unchanged)
access-security.rls-both-sides 3 pass admin GET list 200 n=3, contains A1, A2, B1 ids
access-security.rls-both-sides 4 pass objectstack verify --rls (showcase, in-process HTTP): per-persona line "21 PROVEN (21 consistent, 0 HOLES) · 3 NOT PROVEN"; total line "all personas: 38 PROVEN (38 consistent, 0 HOLES) · 226 NOT PROVEN [unit: object ×…
access-security.rls-both-sides 5 blocked(dependency: the D11 judgement needs the private write-up named in knownGaps, #7463) skipped half explainable: project_membership "no plain-text probe field", ext_customer/ext_order "external read-only"; hand spot-check of project_membership: baseline member GET/PATCH/list 403, row unchanged — D11 judge…
access-security.rls-both-sides N0 pass forged PATCH answered 404 and admin re-read unchanged — no silent 2xx, no mutated row
access-security.rls-both-sides N1 pass D11 verdict carried on this item only (acceptance[5]); owd-sharing-matrix A4 cross-references, not double-counted
access-security.rls-both-sides N2 pass procedural: cited by item+clause only, bare handle not restated
access-security.write-path-guards 0 pass admin POST contact {lead_score:10} → 201, header x-objectstack-dropped-fields "lead_score;reason=readonly", body droppedFields [{fields:[lead_score],reason:readonly}], GET lead_score=null
access-security.write-path-guards 1 pass PATCH {lead_score:99} → 200 with dropped header readonly; GET lead_score still null (before=after)
access-security.write-path-guards 2 pass Alice POST note owner_id=Bob → 403 PERMISSION_DENIED "owner_id … system-managed … requires the transfer grant"; admin filtered count title=planted total=0
access-security.write-path-guards 3 pass Alice self-owner POST 201 owner_id=Alice; PATCH owner_id=Bob 403, owner_id=null 403; re-read owner_id=Alice
access-security.write-path-guards 4 pass Alice createMany bare array of 3 → 201; all 3 owner_id==Alice [true,true,true]; {records:[…]} wrapper → 400 VALIDATION_FAILED
access-security.write-path-guards 5 pass paid invoice PATCH tax_rate → 200, header tax_rate;reason=readonly_when, re-read 5; paid line PATCH qty/price/product → dropped readonly_when, re-read unchanged; mixed updateMany: locked row results[0].droppedFields [qu…
access-security.write-path-guards 6 pass updateMany continueOnError:true over [21, -5, 41] → succeeded 2 failed 1, row1 VALIDATION_FAILED "Qty must be ≥ 0"; re-read 21,3,41; default run → row2 NOT_ATTEMPTED, re-read 22,3,41 (stop shape also captured)
access-security.write-path-guards N0 pass ADMIN insert owner_id=Bob 201 (persisted Bob); ADMIN transfer Alice→Bob 200 (re-read Bob)
access-security.write-path-guards N1 pass pins packages/objectql engine-insert-static-readonly-strip ("isSystem seeds the readonly column") + engine-readonly-strip-caller-values ("an isSystem caller is untouched") — 2 files 55/55 passed, layer: engine (real Obj…
access-security.crud-permission-matrix 0 pass live :41101 port of the pin over 41 showcase_* rows × 4 verbs: 87 allow cells all ‹300 with effect (create re-readable, edit re-reads changed, delete gone); 9 baseline-flip cells allowed; delegate sys_user_position C/R/…
access-security.crud-permission-matrix 1 pass 77 deny cells: all "403 PERMISSION_DENIED" (77/77); delegate sys_* deny cells 403 PERMISSION_DENIED; sys_user create/delete → 405 OBJECT_API_METHOD_NOT_ALLOWED for delegate, plain AND admin
access-security.crud-permission-matrix 2 pass every denied create: admin filtered count by marker = 0 (left=0 on all deny-create cells)
access-security.crud-permission-matrix 3 pass auditor byId 200 + list contains foreign private_note/inquiry (plain-owned) and invoice/line (admin-owned); contributor byId 404 + list excludes, for all four
access-security.crud-permission-matrix 4 pass ops PATCH admin-owned announcement 200 persisted; member_default identical PATCH 403 PERMISSION_DENIED, row unchanged
access-security.crud-permission-matrix 5 blocked(fixture: knownGaps[2], guest anchor ships unbound) guest anchor ships unbound; a member holding guest_portal reads inquiries via baseline (measured POST 201 + GET own 200 — union, as knownGaps predicts)
access-security.crud-permission-matrix 6 pass matrix 45 rows: 41 showcase_* rows = 164 cells (87 allow / 77 deny after union) driven for 8 sets + 4 field_ops_delegate × sys_* rows (16 cells) driven by hand = all 9 variants, one verdict per cell
access-security.crud-permission-matrix N0 pass one denied cell per set run as admin: auditor inquiry.edit 200, client_liaison client_brief.delete 200, contributor account.create 201, executive inquiry.edit 200, guest_portal announcement.create 201, manager contact.c…
access-security.crud-permission-matrix N1 pass 0 withheld cells answered 2xx (bad=0 over 164 cells + 16 delegate cells)
access-security.owd-sharing-matrix 0 pass private: B list excludes A note; B GET 404, B PATCH 404; admin re-read body=orig; A GET own 200, A PATCH own 200
access-security.owd-sharing-matrix 1 pass public_read: B list contains admin announcement, B GET 200; B forged PATCH 403 PERMISSION_DENIED, admin re-read title unchanged
access-security.owd-sharing-matrix 2 pass ops PATCH same foreign announcement 200, re-read title "ops-edit …"
access-security.owd-sharing-matrix 3 pass public_read_write: C1 (contributor) PATCH admin project 200, re-read name changed; A (member_default) PATCH 403 PERMISSION_DENIED, name unchanged
access-security.owd-sharing-matrix 4 pass cbp: C2 list excludes C1 line, C2 GET 404, C2 PATCH 404 + admin re-read unchanged (same updated_at); C1 list includes, GET 200, PATCH 200 re-read "c1 own" (D11 verdict carried on rls-both-sides A5 per dedupe rule)
access-security.owd-sharing-matrix 5 pass auditor list showcase_invoice_line contains C1 line; auditor GET by id 200
access-security.owd-sharing-matrix 6 pass all four models driven per persona-verb (private/public_read/public_read_write/controlled_by_parent); pins 4 files 16/16 (HTTP, verify harness)
access-security.owd-sharing-matrix N0 pass public_read foreign PATCH forged as direct request → 403, row unchanged
access-security.owd-sharing-matrix N1 pass C2 line probes repeated as C1: list true, GET 200, PATCH 200 — route works, denial is derivation
access-security.anonymous-deny-surfaces 0 pass anonymous 401 code UNAUTHENTICATED on /data, /meta, /actions, /automation/_status, /batch, /security/explain, /analytics query|sql|meta (12/12 probes incl. malformed + DELETE)
access-security.anonymous-deny-surfaces 1 pass POST /actions/showcase_task/showcase_mark_done/anon-probe-id → 401 (member gets 404 RECORD_NOT_FOUND on same path)
access-security.anonymous-deny-surfaces 2 pass each body matched exactly one family: rest-flat for data/meta/batch/security; dispatcher-wrapper for actions/automation/analytics×3
access-security.anonymous-deny-surfaces 3 pass analytics anon: query/sql/meta 401, malformed query/sql 401; member: query 200 (count rows), sql 200, meta 200, malformed → 400 VALIDATION_FAILED
access-security.anonymous-deny-surfaces 4 pass member GET /data/showcase_private_note 200, GET /meta 200
access-security.anonymous-deny-surfaces 5 pass anonymous GET /api/v1/forms/contact-us → 200 (form body, object showcase_inquiry)
access-security.anonymous-deny-surfaces 6 pass all 7 variant families probed live; pin showcase-anonymous-deny-surfaces 74/74 (HTTP, verify harness)
access-security.anonymous-deny-surfaces N0 pass anonymous DELETE /automation/showcase_reassign_wizard → 401 dispatcher-wrapper; authed GET afterwards 200 (flow present)
access-security.walled-environment-metadata-operator-only 0 pass pins at 6679644: rest meta-migrate-stored-walled-refusal 6/6; runtime packages-walled-write-refusal + automation-walled-definition-write + meta-walled-catalog-refusal 3 files 61/61 (plugin-unit/dispatcher-domain layer)…
access-security.walled-environment-metadata-operator-only 1 blocked(fixture: org-scoped manage_metadata grant not placeable through any HTTP door) walled :41102 booted (Tenancy: isolated, Organizations mounted); org owner minted (create-user) + own org created; manage_metadata grant row not placeable: operator data-door insert 403 "outside the caller's organizatio…
access-security.walled-environment-metadata-operator-only 2 pass walled :41102 operator PUT /meta/object/qa_walled_probe 200 "Saved … env-wide", read-back 200, deleted → 404; single :41101 admin PUT /meta/object/qa_single_probe 200, read-back 200, deleted
access-security.walled-environment-metadata-operator-only N0 blocked(fixture: same grant gap as clause 1) needs the manage_metadata-holding org owner (same fixture gap); supplemental: organization_admin owner refused 403 on PUT object, PUT permission, publish, DELETE /packages, clone, _migrate-stored, POST /automation, noth…
ai.mcp-stdio-fail-closed 0 pass os start, OS_MCP_STDIO_ENABLED=true, no key: exit 1, 0 stdout bytes, health never 200; stderr '[MCP] The stdio transport is enabled (OS_MCP_STDIO_ENABLED / autoStart) but OS_MCP_STDIO_API_KEY is not set. … Refusing to s…
ai.mcp-stdio-fail-closed 1 pass osk_unknown: exit 1 '[MCP] OS_MCP_STDIO_API_KEY did not resolve to a valid identity (unknown / revoked / expired / owner-less). Refusing to start stdio (ADR-0101).'; key revoked over PATCH sys_api_key (osk_wZOqlBLZ…): e…
ai.mcp-stdio-fail-closed 2 pass INFO '[MCP] stdio transport principal-bound to OS_MCP_STDIO_API_KEY identity XGqq2jEnM1CdkzaaZYwzSyQ07wPvKIoc (RLS/FLS/tenant applied)' = contributor's sys_user id (liaison session: DujY6PHx…)
ai.mcp-stdio-fail-closed 3 pass RLS (contributor key): MCP query_records showcase_invoice 2 rows INV-QAC-1/2 = REST GET 2 rows, identical 18-field set; get_record INV-1003 (linus) MCP isError 'Record … not found' / REST 404 RECORD_NOT_FOUND / admin RE…
ai.mcp-stdio-fail-closed 4 pass count by status: MCP member rows [{draft:2}] = REST member POST /data/showcase_invoice/query [{draft:2}]; REST admin [{draft:4},{paid:5},{sent:5}] (member strictly lower)
ai.mcp-stdio-fail-closed 5 pass liaison MCP aggregate_records sum(budget), count_distinct(spent), count groupBy budget: isError, {code PERMISSION_DENIED, status 403, message "[Security] Field read denied: not permitted to aggregate [budget|spent] on …
ai.mcp-stdio-fail-closed 6 pass same stdio session: pre-revoke query_records 2 rows; admin PATCH /api/v1/data/sys_api_key/w0D4233Kc6zXITyA {revoked:true} 200; next query_records isError, content parses {error:{code:'API_KEY_REVOKED',status:403,…}}, 0 …
ai.mcp-stdio-fail-closed 7 pass os start with neither var (env checked: 0 OS_MCP vars): health 200, INFO '[MCP] Transport not auto-started (HTTP is served per-request at /api/v1/mcp regardless). …'
ai.mcp-stdio-fail-closed N0 pass no keyless/unknown/revoked/empty/whitespace-key start ever served (all exit 1, health 000)
ai.mcp-stdio-fail-closed N1 pass MCP member rows == REST member rows (2 vs 2, INV-1003 hidden on both)
ai.mcp-stdio-fail-closed N2 pass MCP member count 2 ≠ admin total 14
ai.mcp-stdio-fail-closed N3 pass every aggregate naming budget/spent refused, no numeric result
ai.mcp-stdio-fail-closed N4 pass post-revoke read 0 rows and carries API_KEY_REVOKED
api-backend.query-contract-matrix 0 pass 27 operator variants (eq,ne,gt,gte,lt,lte incl. 12M/8M boundaries & dates, in,not_in,between incl. inclusive ends, contains,not_contains,starts_with,ends_with, like x3 incl. no-wildcard=0 rows (not auto-wrapped), is_nul…
api-backend.query-contract-matrix 1 pass orderby name windows (3,2),(4,8),(5,12): GET $top/$skip, POST limit/offset, POST top/skip all equal locally sorted slice (e.g. [Fabrikam,Globex,Hooli]); last window hasMore:false
api-backend.query-contract-matrix 2 pass $select=name,status and fields:[name,status] → every record key set exactly {name,status} (no id), n=14; fields:[account.name] on showcase_invoice → 400 INVALID_FIELD, message "Read the related record with 'expand' (exp…
api-backend.query-contract-matrix 3 pass annual_revenue asc+desc full 14-value sequence equals local sort on GET "$orderby=f dir", GET "-f", POST orderBy; $orderby=no_such_field and POST orderBy no_such_field → 400 INVALID_SORT
api-backend.query-contract-matrix 4 pass LIVE (HTTP): contributor-bound member (admin create-user + sys_user_position contributor) POST showcase_invoice/query expand contact{fields:[name]} → 200, own invoice INV-QA-B-EXPAND returned, contact left as raw FK id …
api-backend.query-contract-matrix 5 pass POST {status:{$nin:"done"}} → 400 VALIDATION_FAILED fields[0].field=query.where.status.$nin msg names $nin, status, ARRAY; POST AST [status,not_in,done] → 400 VALIDATION_FAILED fields[0].field=query.where (same text); G…
api-backend.query-contract-matrix 6 pass GET ?$pageSize=5 → 400 UNSUPPORTED_QUERY_PARAM listing $top,$skip,$orderby,$select,$count,$search,$searchFields,$filter,$expand; GET ?not_a_field=x → 400 INVALID_FIELD; POST where not_a_field $eq and $ne, GET $filter no…
api-backend.query-contract-matrix 7 pass POST where status $in [] → 200 rows=0; $nin [] → 200 rows=10 (= full task baseline)
api-backend.query-contract-matrix 8 pass run record /tmp/qa-t1/B/matrix-1.json has a row per variant: 16 op variants (27 rows incl. extra boundaries) + params $top,$skip,$select,$orderby,$filter (above), $count (total=14 with $top=2), $search (Northwind→[North…
api-backend.query-contract-matrix N0 pass POST {limit:"ten"} → 400 VALIDATION_FAILED field query.limit; POST {not_a_query_key:{…}} → 400 INVALID_FIELD; neither returned rows (no full-table 200)
api-backend.packaged-action-disabled-dispatch 0 pass POST /actions/showcase_task/showcase_mark_done {recordId:no-such-record-0000} (disabled) → 409 ACTION_DISABLED "…switched off for this installation in the packaged-metadata activation ledger (sys_metadata_activation, AD…
api-backend.packaged-action-disabled-dispatch 1 pass param_gallery disabled + {params:{bogus_key:1},recordId:bogus} → 409 ACTION_DISABLED; re-enabled identical request → 400 VALIDATION_ERROR "Invalid action params: Action param "p_text" is required; Unknown action param…
api-backend.packaged-action-disabled-dispatch 2 pass disabled traces (mark_done, param_gallery) 409 with nonexistent recordId; corroboration: enabled mark_done same id → 404 RECORD_NOT_FOUND (stock boot, before flip)
api-backend.packaged-action-disabled-dispatch 3 pass showcase_zoo_perm_missing enabled → 403 PERMISSION_DENIED "requires capability [showcase.restricted_ops]"; disabled → 403, bodies byte-identical (true); contributor persona also 403 when disabled
api-backend.packaged-action-disabled-dispatch 4 pass LIVE MCP POST /api/v1/mcp tools/call run_action {actionName:showcase_portfolio_snapshot}: enabled → ok; disabled → isError:true, {code:ACTION_DISABLED,status:409}, message === REST /actions/global/… 409 message (strict …
api-backend.packaged-action-disabled-dispatch 5 pass after cold restart (same action.db): ledger rows rehydrated; mark_done real id → 409 ACTION_DISABLED, task unchanged (done:false,progress:45); re-enable → 200, invoke → 200 operation update, task done:true progress:100;…
api-backend.packaged-action-disabled-dispatch 6 pass showcase_bulk_reassign (type flow) disabled → 409 ACTION_DISABLED naming showcase_bulk_reassign (pre- and post-restart); showcase_reassign_wizard runs list empty ([]) — automation never ran
api-backend.packaged-action-disabled-dispatch N0 pass no disabled invocation answered 400/handler/record shape (all 409); enabled control 400 proves params enforced only when enabled
api-backend.packaged-action-disabled-dispatch N1 pass unentitled caller got 403 (never 409) in both states; stock boot with empty ledger (total 0): enabled mark_done answered 404 RECORD_NOT_FOUND, not ACTION_DISABLED
api-backend.packaged-action-disabled-dispatch N2 pass anonymous POST /actions/showcase_task/showcase_mark_done and POST /actions/_activation/… → 401 UNAUTHENTICATED
approvals.account-app-entry 0 pass dist/.objectui-sha = .objectui-sha = b41ed7f…; grep dist/assets/index-B3gsloWY.js: ts({ref:approvals:inbox,label:Approvals Inbox,source:@object-ui/console,component:…Suspense…})
approvals.account-app-entry 1 pass nav click landed /_console/apps/com.objectstack.account/component/approvals/inbox; screenshot: 'Approvals Inbox', tabs My Pending 1 / Submitted by me / All, row INV-QA-APPR-D2 Pending, keyboard hint bar. Drawer is repla…
approvals.account-app-entry 2 pass persona (sys_member role member; positions contributor+finance) GET /api/v1/meta/app → [showcase_app, account] (admin: +setup); ?id=setup → items []; account nav keeps component nav_account_approvals approvals:inbox
approvals.account-app-entry 3 pass request page actions Approve/Reject/Reassign/Send back/Request info/…; Approve→Confirm POST …/approve 200; GET before {got:0,need:2, pending incl persona, viewer.can_act:true} after {got:1,need:2, pending [admin], can_a…
approvals.account-app-entry 4 pass cold load …/component/approvals/inbox?request=areq_533b6ea8… → replaced to …/com.objectstack.account/sys_approval_request/record/areq_533b6ea8…, h1 'Invoice Dual Sign-off (parallel approval)', record INV-QA-APPR-D2 visi…
approvals.account-app-entry 5 pass row link href /_console/apps/com.objectstack.account/showcase_invoice/record/EI8Y9BMETlOXDUk9 (current app segment); persona GET record 200; click rendered invoice in Account app
approvals.account-app-entry 6 pass avatar › Preferences › Language → 中文(中国): nav '待我审批', tabs 待我审批/我发起的/全部, All-tab status badge '待审批'
approvals.account-app-entry N0 pass no component-not-found/blank pane; full inbox rendered
approvals.account-app-entry N1 pass Approvals entry present for non-admin; setup absent from same session's meta/app
automation.packaged-flow-disable-durable 0 pass toggle {enabled:false} → 200 {enabled:false}; sys_metadata_activation: exactly 1 row metadata_type=flow name=showcase_urgent_task_alert package_id=com.example.showcase active=false id=cI1GYrYwi5HvxIh7; key set has no or…
automation.packaged-flow-disable-durable 1 pass POST /automation/showcase_urgent_task_alert/trigger → 409 FLOW_DISABLED "Flow 'showcase_urgent_task_alert' is disabled — it is switched off for this installation in the packaged-metadata activation ledger (sys_metadata_…
automation.packaged-flow-disable-durable 2 pass cold restart (process group killed, new server same flow.db, --log-level info): /_status {enabled:false,bound:false}; boot log "[Automation] Activation ledger: 1 packaged flow(s) are switched off for this installation a…
automation.packaged-flow-disable-durable 3 pass runs list 1 before and 1 after post-restart urgent create (and 1 after a low→urgent escalation PATCH); baseline pre-toggle create had produced run_e75b77c9… completed
automation.packaged-flow-disable-durable 4 pass re-enable → 200; row cI1GYrYwi5HvxIh7 (same id) active:true, created_at 14:34:09 kept, updated_at 14:35:13; /_status enabled+bound true; final urgent create → runs 2, newest trigger.recordId = the new task, status compl…
automation.packaged-flow-disable-durable N0 pass 2xx toggle was accompanied by the ledger row (1 row) — no ledger-less write
automation.packaged-flow-disable-durable N1 pass post-restart enabled:false bound:false and no run row from post-restart create
automation.packaged-flow-disable-durable N2 pass re-enable kept the row (same id, read by id 200)
automation.packaged-flow-disable-durable N3 pass 409 message carries "packaged-metadata activation ledger (sys_metadata_activation" phrasing, not the bare status sentence
cli.dev-boot-contract 0 pass health 200 after 7 polls; GET /api/v1/ready 200 {status:'ready',state:'running'}
cli.dev-boot-contract 1 pass sign-in admin@objectos.ai/admin123 200 (wrong pw 401); restart same DB with --admin-password changed99: admin123 → 200, changed99 → 401
cli.dev-boot-contract 2 pass Database lines: -d file → file:/tmp/qa-t1/C/dev.db; -d :memory: → :memory:; OS_DATABASE_URL → file:/tmp/qa-t1/C/env.db; config default (named qa_home + datasourceMapping default) → file:‹proj›/.objectstack/data/qa_home.…
cli.dev-boot-contract 3 pass '🧪 Fresh OS_HOME: /tmp/objectstack-dev-NZR6hK', Database file:/tmp/objectstack-dev-NZR6hK/data/objectstack.db; dir gone after SIGINT (exit 130) and a second run after SIGTERM (exit 143); cwd .objectstack/data/showcase_…
cli.dev-boot-contract 4 pass instance B: '↪ server bound to port 41302 (requested 41301)', API/Console URLs printed with 41302, health on 41302 = 200; SIGINT → exit 0
cli.dev-boot-contract 5 pass '⚠ dist/objectstack.json is OLDER than your sources — this boot serves the STALE build. newest source: src/coverage.ts (15m newer than the artifact) fix: run objectstack build or start with --compile…' then health 2…
cli.dev-boot-contract 6 pass empty dir: exit 1; stdout '✗ Config file not found in /tmp/qa-t1/C/noconf'; stderr 'Run in a directory with objectstack.config.ts, pass --artifact ‹path|url›, or run from the monorepo root.'
cli.dev-boot-contract 7 pass dist stamp = pin b41ed7f; GET /_console/ 200 text/html → redirected to /_console/login; screenshot showed the ObjectOS 'Welcome back' sign-in card (email, password, Sign In, 'Sign in as dev admin')
cli.dev-boot-contract N0 pass nothing-chosen boot persisted to unified file; QA probe task read back after restart
cli.dev-boot-contract N1 pass --database-driver memory exit 2 (oclif allowlist); OS_DATABASE_DRIVER=memory|mingo|in-memory exit 1, 0 Database lines, text names --fresh and :memory:; -d memory:// and mingo:// exit 1 after 'Database: memory://' nami…
cli.dev-boot-contract N2 pass legacy dev.db read with notice; no objectstack.db created beside it; QA probe row present
cli.dev-boot-contract N3 pass shift reported (41302) in both the ↪ line and the URLs
cli.organization-ownership-ceremony 0 pass @ 6679644, --maxWorkers=1: packages/cli apply-flags 7, organization-ownership-apply 112, occupancy.integration 5, dialect 19, apply-organization-ownership-gate.integration 5, comment-reactions.integration 7, host-suppl…
cli.organization-ownership-ceremony 1 pass plan on v17 copy exit 0, plan.json kind organization-ownership-plan, ceremony 'ADR-0131 D10', inventoryDigest 74c9ab1d…, 134 tables all with a fate (73 present); sha256 b4480ee1… before = after; --apply w/o --plan-file …
cli.organization-ownership-ceremony 2 pass cG (v17 copy, refused boot first): --apply --plan-file --backup-taken exit 0, complete true, blocking 0, 13/13 steps done; sys_migration marker verified_at set, blocking 0, details.checkpoint.shapeGeneration 1 (= ORGANI…
cli.organization-ownership-ceremony 3 pass unmigrated cA: os serve exit 1 'This database carries no organization-ownership marker…' naming os migrate organization-ownership --out PLAN and the apply, no 17.x advice; migrated cE: '✓ Server is ready', health 200,…
cli.organization-ownership-ceremony 4 pass fresh v17 copy cD: first run refused by the sibling gate refused_comment_reactions_unconverted (exit 1, applied 0, row diff 0); after comment-reactions --apply --yes ×2 (exit 0 both, 0 converted, verified): exit 1, mess…
cli.organization-ownership-ceremony 5 blocked(fixture: needs a showcase DB born under an 18.0.0-next.* build) not consulted; an npm install of @objectstack/cli@18.0.0-next.5 resolved 18.1.0 deps and its DB carried an 18.1.0 birth marker, so it was discarded as evidence
cli.organization-ownership-ceremony N0 pass plan runs (cB, cE, cG): checksum unchanged; refusals plan-file-required, backup-unacknowledged, plan-database-mismatch, existing --out: checksum unchanged; drop-gate refusals: row diff 0
identity-auth.default-organization-boot-invariant 0 pass @objectstack/plugin-auth ensure-default-organization.test.ts 57 passed (plugin unit); @objectstack/runtime identity-objects-default-organization.pin.test.ts 4 passed (real ObjectKernel+ObjectQL+DefaultDatasource = engin…
identity-auth.default-organization-boot-invariant 1 pass fresh file DB, --log-level info: log line 919 "[default-org] created the Default Organization (org_mvnx8046nekgol14)" at 14:26:25.306 precedes line 1085 "Dev admin seeded" 14:26:29.738; sys_organization {id:org_mvnx8046…
identity-auth.default-organization-boot-invariant 2 pass sys_member org=default: admin role owner, member2@qa-b.test (admin create-user) role member; get-session activeOrganizationId=org_mvnx8046nekgol14 for both (member2 before and after change-password); member2 isPlatformA…
identity-auth.default-organization-boot-invariant 3 pass sys_business_unit 5 seeded rows (bu_acme,bu_east_coast,bu_field_ops,bu_hq_finance,bu_west_coast) all organization_id=org_mvnx8046nekgol14
identity-auth.default-organization-boot-invariant N0 pass 0 NULL organization_id on sys_business_unit; extra sweep on the seed boot: all 19 seeded objects, every row non-null org (single org id)
integration-system.datasource-credential-refusal-matrix 0 pass 15 doors × build (os build per door: exit 2, no artifact, message names key + external.credentialsRef/credentialRef; encryptionKey names removal) and × runtime POST /api/v1/datasources (all 400 DATASOURCE_ADMIN_ERROR na…
integration-system.datasource-credential-refusal-matrix 1 pass POST qa_pg_paved {host,port,database,username} secret→201 status ok; POST …/test {ok:true,tableCount:1}; remote-tables [probe]; PG password-auth proven (wrong pw → FATAL)
integration-system.datasource-credential-refusal-matrix 2 pass admin door config {host,port,database,username} hasSecret:true; meta door same config + external.credentialsRef sys_secret:sec_41c7…; grep 'QaDsSecret-7781' 0 hits in both + lists + sys_metadata + sys_secret
integration-system.datasource-credential-refusal-matrix 3 pass qa_pg_paved hasSecret:true vs qa_pg_nosecret hasSecret:false (same config, redactedConfigKeys [] both)
integration-system.datasource-credential-refusal-matrix 4 pass planted (server stopped) rows passwd/pwd (pg), token/jwt (turso), auth_token (mysql), authtoken (mongodb), encryptionKey beside file: url; boot logged metadata_spec_invalid 'registered anyway'; admin door redactedConfig…
integration-system.datasource-credential-refusal-matrix 5 pass driver qa_plugin_driver POST 201 (stored raw incl. password/authToken/url pw); both doors: url 'qadb://pluguser@127.0.0.1/x', password/authToken absent (redactedConfigKeys [authToken,password,url]); planted plugin row p…
integration-system.datasource-credential-refusal-matrix 6 pass PATCH /api/v1/datasources/qa_pg_paved {config: admin-read config} 200; PUT 405; hasSecret still true, credentialsRef unchanged sys_secret:sec_41c7…; POST …/test ok:true tableCount 1
integration-system.datasource-credential-refusal-matrix 7 pass member (sys_member member): admin door 403 PERMISSION_DENIED, meta door 403, sys_metadata 403 on all 10 names + lists; anonymous: 401 everywhere; 0 planted hits; identities proven via get-session
integration-system.datasource-credential-refusal-matrix N0 pass full-body greps across 3 doors × 3 personas: 0 cleartext hits; boot logs 0 hits
integration-system.datasource-credential-refusal-matrix N1 pass every door refused at build AND runtime admin AND metadata write door — no disagreement
integration-system.datasource-credential-refusal-matrix N2 pass metadata door redacts every planted key the admin door redacts
integration-system.datasource-credential-refusal-matrix N3 pass all six alias spellings redacted
integration-system.datasource-credential-refusal-matrix N4 pass unknown-driver canonical password/authToken/url-userinfo and aliases passwd/token redacted
integration-system.datasource-credential-refusal-matrix N5 pass echoed config carries no mask; stored secret handle unchanged, connect ok
integration-system.datasource-credential-refusal-matrix N6 pass every credential refusal names external.credentialsRef / auth.credentialRef; encryptionKey refusal names deletion (not a credential replacement case)
platform-core.boot-health 0 pass curl /api/v1/health -› 200 {status:ok,version:18.1.0} at 12.3 s after launch (fresh DB, port 41401)
platform-core.boot-health 1 pass GET /api/v1/ready -› 200 {status:ready,state:running}
platform-core.boot-health 2 pass boot-window log (snapshot taken at first health 200, 51 lines): 0 ERROR lines, 0 ⚠ lines; Flows: '32 flow(s) 19 bound … · 8 draft' + two ℹ deployment-policy lines (showcase_task_due_reminder time_relative, showcase_sche…
platform-core.boot-health 3 pass GET /api/v1/meta/app?id=showcase_app (admin bearer) -› 200 {type,items[1]}; item keys name,label,icon,branding,active,isDefault,navigation,_packageId,_packageVersion,_provenance,_diagnostics; no-query list = showcase_ap…
platform-core.boot-health 4 pass diff authored src/ui/apps/index.ts (57 nav ids) vs served navigation: authored-not-served = []; grp_data served = showcase_project,task,account,contact,invoice,expense_report,product,team,category,business_unit,field_zo…
platform-core.boot-health 5 pass GET /_console/ -› 200 text/html; charset=utf-8, ‹base href="/_console/"› shell HTML
platform-core.boot-health N0 pass no SeedLoader rejection/dropped line in boot log; ready banner 'Seeds: com.example.showcase 132 rows' (no ⚠, no N ok / M errors)
platform-core.boot-health N1 pass health 200 with 0 ERROR lines in the boot window (cut at the health-green instant); post-window log also 0 ERROR after probes
platform-core.seed-integrity 0 pass 19 datasets, expected counts from src/data/seed/index.ts (loaded via tsx; equals dist/objectstack.json) vs GET ?$top=1 total: 19/19 equal, 132=132 (account 14, contact 32, inquiry 3, product 4, project 5, task 10, categ…
platform-core.seed-integrity 1 pass Specimen — Full: 21 scalar fields equal; f_multiselect/f_checkboxes/f_tags/f_vector set-equal; f_json,f_location,f_address,f_composite,f_repeater,f_record structurally equal; f_lookup = Northwind id, f_lookups = {Northw…
platform-core.seed-integrity 2 pass banner "Seeds: com.example.showcase 132 rows" (no ⚠/error/lost-link); info "[Seeder] Seed loading complete {inserted:132,updated:0,skipped:0,errored:0}"; 0 "dropped record" lines
platform-core.seed-integrity 3 pass restart same seed-integrity.db: "[Seeder] Seed loading complete {inserted:0,updated:0,skipped:132,errored:0}"; second sweep diff vs first: 0 rows differ
platform-core.seed-integrity 4 pass expected-absent: f_user null, f_users null, f_secret null; showcase_task.cover null on all 10 rows
platform-core.seed-integrity N0 pass no seeded object reads 0 (min 1: showcase_preference)
platform-core.seed-integrity N1 pass no count grew on restart (132 → 132)
platform-core.console-login 0 pass form sign-in (Playwright fill + submit) -› POST /api/v1/auth/sign-in/email 200 + set-auth-token; landed /_console/home; screenshot: header + 'Your apps' launcher (Showcase tile), no sidebar (by design); main 'Good after…
platform-core.console-login 1 pass after reload URL stays /_console/home; first authed calls GET /api/v1/auth/get-session 200 (bearer), /discovery 200; in-page GET /api/v1/meta/app?id=showcase_app -› 200 items=[showcase_app]
platform-core.console-login 2 pass POST /api/v1/auth/sign-out (bearer) -› 200 {success:true}; same bearer (still in localStorage) GET /api/v1/meta/app?id=showcase_app -› 401 UNAUTHENTICATED; get-session -› 401 (2/2 runs)
platform-core.console-login 3 pass full navigation after expiry -› redirected to /_console/login?redirect=%2Fapps%2Fcom.example.showcase%2Fshowcase_task, login form shown (screenshot); in-shell client nav after expiry -› data region shows named 'Sign in …
platform-core.console-login 4 pass re-sign-in 200 -› returned to /_console/apps/com.example.showcase/showcase_task (same route); meta/app 200, meta/object 200, meta/view 200; fresh read GET /api/v1/data/showcase_task -› 200 {object,records,total,hasMore}…
platform-core.console-login N0 pass wrong password -› 401 {code:INVALID_EMAIL_OR_PASSWORD}, no set-cookie, no set-auth-token; UI alert 'Invalid email or password. Please try again.'; cookies [] and localStorage token null after (2/2)
platform-core.console-login N1 pass no dead shell observed: server 401s every authed call after sign-out and the console either redirects to login (navigation) or shows the named sign-in-required state (in-shell nav)
platform-core.nav-surfaces-render 0 pass layer: real Chromium against live HTTP boot :41404 (pin = oracle layer). flock … SMOKE_API_URL=http://localhost:41404 OS_TEST_CHROMIUM_EXECUTABLE_PATH=/opt/pw-browsers/chromium playwright test e2e/showcase-smoke.spec.ts…
platform-core.nav-surfaces-render 1 pass served meta/app?id=showcase_app leaves 49 (page 25/object 17/dashboard 3/report 4) mapped to console paths vs SURFACES 49: served-not-in-SURFACES [] , SURFACES-not-served []; rendered sidebar (all groups expanded) 50 hr…
platform-core.nav-surfaces-render 2 pass /_console/apps/com.example.showcase/object_that_does_not_exist: screenshot shows shell (header + sidebar) alive; main = 'Object Not Found — The object "object_that_does_not_exist" does not exist in the current configura…
platform-core.nav-surfaces-render 3 pass none encountered: 49/49 smoke + 1 hand-walk + 6 bad-route probes (object/page/dashboard/report/view/record not-found) all rendered named states inside the shell; ErrorBoundary fallback never triggered, 0 pageerrors
platform-core.nav-surfaces-render N0 pass no blank ‹main› on any of 50 surfaces (smoke mainText›0 assertion 49/49 + hand-walk)
platform-core.nav-surfaces-render N1 pass smoke at this revision refuses [data-boot-splash] and both English splash lines; 49/49 past splash; pin b41ed7f is after objectui 54159d3 (marker present)
platform-core.nav-surfaces-render N2 pass bad route kept header + sidebar; no white page
platform-core.nav-surfaces-render N3 pass chart assertions polled (pollUntil, SURFACE_BUDGET_MS 25000); no chart red to classify
platform-core.builtin-apps-nav-render 0 pass admin, groups expanded (Advanced/Developer included): Setup 43 sidebar hrefs (42 served + 'reports') and Account 9 (8 + 'reports') walked, screenshot-first: 0 pageerror, 0 blank main, 0 placeholder, 0 boundary; Browse M…
platform-core.builtin-apps-nav-render 1 pass admin ?id=setup: 9 anchors group_overview/apps/people_org/access_control/approvals/configuration/diagnostics/integrations/advanced, 42 leaves; vs source (setup-nav.contributions.ts + security/sharing/approvals/webhooks/…
platform-core.builtin-apps-nav-render 2 pass member Mei (positions org_member,everyone; isPlatformAdmin false): /_console/apps/com.objectstack.setup and /apps/setup -› named 'You don't have access to this app — This app exists, but your account is not authorized…'…
platform-core.builtin-apps-nav-render 3 pass forged member GET /api/v1/meta/app?id=setup -› 200 {items:[]}; GET /api/v1/meta/app/setup and /meta/app/com.objectstack.setup -› 403 PERMISSION_DENIED; member no-query list = showcase_app,account
platform-core.builtin-apps-nav-render 4 pass member ?id=setup -› items:[] so nav_api_keys + manage_platform_settings settings URLs unreachable; CONTROL: admin vs member ?id=account navigation JSON byte-identical (8 vs 8 leaves), carries no permission-gated entries
platform-core.builtin-apps-nav-render 5 pass nav_organizations (requiresService org-scoping) absent; /auth/config tenancyPosture single, multiOrgEnabled false; nav_business_units present and sys_business_unit registered (meta 200, data 200)
platform-core.builtin-apps-nav-render 6 pass no sys_verification/sys_device_code/sys_sso_provider/sys_jwks entry in setup or account payloads; /auth/config features.sso false (SSO absent per knownGap); sys_jwks data 404 OBJECT_API_DISABLED (why it is not in nav); …
platform-core.builtin-apps-nav-render N0 pass 0 blank ‹main› / placeholder across 52 admin destinations; the one 'Failed to load' is the named marketplace egress state with its own error panel and Retry
platform-core.builtin-apps-nav-render N1 pass member never obtained Setup: app routes refused, meta/app/setup 403, ?id=setup empty; console system routes /apps/setup/system/settings/‹ns› are refused per-namespace server-side (403 SETTINGS_FORBIDDEN requires setup.a…
platform-core.builtin-apps-nav-render N2 pass member payloads carry no Setup entries at all; account entries identical to admin and every one rendered for the member (profile, sessions/mine 4 own rows, api_keys/mine empty state)
platform-core.v18-boot-refusals 0 pass @ 6679644: packages/runtime organization-ownership-boot-guard.test.ts 22 passed + .kernel.test.ts 10 passed (engine layer, real kernel+SQLite); packages/plugins/plugin-security authz-identity-objects-boot-refusal.test.…
platform-core.v18-boot-refusals 1 pass os serve (OS_DATABASE_URL=file:cA.db, 17.7.0-born) exit 1, 0 ready/listening lines; '✗ This database carries no organization-ownership marker: … sys_audit_log, sys_job, sys_job_queue, sys_job_run, sys_metadata, sys_meta…
platform-core.v18-boot-refusals 2 pass node:sqlite row diff: 74 pre-existing tables, 144 rows before/after, 0 row/value/column differences, 0 tables dropped; 40 tables created, all 0 rows; additive columns on 41 tables; marker read → no row
platform-core.v18-boot-refusals 3 pass live rig: scratch stack plugins [new SecurityPlugin()], tiers ['core'], os serve --dev --no-server --preset minimal → exit 1 '✗ SecurityPlugin cannot boot: … does not register sys_user, sys_member … mount createIdenti…
platform-core.v18-boot-refusals N0 pass v18 serve never served the v17 copy; row diff zero
records-forms.crud-roundtrip 0 pass form POST /api/v1/data/showcase_account 201 body {industry:finance,status:active,sales_region:amer,name:os-qa-d2a}; filtered GET total 1 echoes every key verbatim, website null (not defaulted)
records-forms.crud-roundtrip 1 pass UI Edit→Save sent one PATCH body {annual_revenue:1234567} 200; full-row before/after diff = annual_revenue null→1234567 + updated_at stamp only
records-forms.crud-roundtrip 2 pass row-menu Delete → confirm dialog 'Delete Account "os-qa-d2a"?' → DELETE 200; filtered GET total 0; reloaded list shows no os-qa-d2a (16 records)
records-forms.crud-roundtrip 3 pass screenshot after full reload: create showed os-qa-d2a with Active/Finance chips (15 records); after delete row absent (16 incl. CJK+clone); detail shows $1,234,567.00 after update
records-forms.crud-roundtrip 4 pass History tab (screenshot then text): 'Dev Admin UPDATE Annual Revenue: — → 1234567'; CREATE expanded 'Owner: Dev Admin · Industry: Finance · Lifecycle: Active · Sales Region: AMER'; no raw ids/values, no Unknown user, no…
records-forms.crud-roundtrip 5 pass form create os-qa-d2a-华宁 201; filtered GET name bytes hex-identical; $search=华宁 → 2 (华宁科技, os-qa-d2a-华宁); UI quick-search sent search=华宁 and grid showed both (2 records)
records-forms.crud-roundtrip 6 pass admin clone 201 {id≠sourceId,sourceId,record}, diff only id/created_at/updated_at/name(override); member clone of field_zoo 201 owner_id=member (src=admin), created_by=member, f_autonumber 0002→0003; readonly half: plan…
records-forms.crud-roundtrip 7 pass contributor-bound member (recipe search:qa-contributor-bound-member, list 0→1 own invoice): GET INV-1003 404 RECORD_NOT_FOUND (premise); POST clone 404 code RECORD_NOT_FOUND; admin invoice count 13→13; control clone of …
records-forms.crud-roundtrip N0 pass Create with empty name: no POST sent, field error 'Account Name is required', count 14→14
records-forms.crud-roundtrip N1 pass clone never carried id/audit/autonumber (re-derived, see acc[6]); RLS-invisible clone refused 404, no row
records-forms.crud-roundtrip N2 pass substituted showcase_invoice (name required, no default): POST {account} → 400 VALIDATION_FAILED fields[{field:name,code:required}]
records-forms.crud-roundtrip N3 pass POST showcase_account tax_id 'abc' → 400 VALIDATION_FAILED fields[{field:tax_id,code:invalid_format,'Tax ID must look like 12-3456789.'}]; 0 rows stored
studio-authoring.first-run-loop 0 pass wizard POST /api/v1/packages 201 {manifest id com.example.repairs, namespace repairs (derived), status installed}; switcher (studio-pkg-chip) lists 维修中心 Writable; 2nd package com.example.qaprobe: window marker survived …
studio-authoring.first-run-loop 1 pass after Publish all (POST …/publish-drafts 200 publishedCount 1, toast 'Published 1 item in this package (one atomic release)') GET /api/v1/meta/object/repairs_repair_ticket status {type:select, options open/Open,in_progr…
studio-authoring.first-run-loop 2 pass Studio Records → Add record POST /api/v1/data/repairs_repair_ticket 201 {name,status:in_progress}; GET lists 1 row status in_progress
studio-authoring.first-run-loop 3 pass Create app seeded nav (default-ON checkbox) → publish 200; meta/app names add repair_center, ?id=repair_center navigation [{type:object,objectName:repairs_repair_ticket}]; Home launcher tile 'Repair Center' → /apps/com.…
studio-authoring.first-run-loop 4 pass studio.boot.log 'Server is ready' ×1; listener pid 14204 started 14:37:50 unchanged at loop end; zero code edits
studio-authoring.first-run-loop 5 pass forged PUT meta/object/showcase_qa_probe?package=com.example.showcase → 422 WRITABLE_PACKAGE_REQUIRED; add-field PUT showcase_account (draft, package=showcase) → 403 ITEM_LOCKED-class 'read-only managed package'; plain …
studio-authoring.first-run-loop N0 pass no silent acceptance (see acc[5])
studio-authoring.first-run-loop N1 pass launcher shows app; list renders label chip

Fails — reproduction rules and disposition

None. No clause failed, so no RUNNER rule 7 verifier was owed and no product defect is extracted from this record. No authentication or authorization finding (each runner checked its auth-class candidates and ruled them out with evidence: member DELETE on a foreign private note answers 403 for an unknown id too, so there is no existence oracle; the org-wide sys_user read is the sys_user_org_members peer directory by design).

Derived item verdicts

19 PASS / 4 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN — 198 clauses pass, 5 blocked, 0 fail. Each PARTIAL carries only blocked clauses beside passes:

  • access-security.rls-both-sides c5 — blocked(dependency): the D11 judgement needs the private write-up the item's knownGaps names; the skipped-explanation half holds.
  • access-security.crud-permission-matrix c5 — blocked(fixture): the item's own knownGaps[2] (guest anchor ships unbound on a stock boot).
  • access-security.walled-environment-metadata-operator-only c1, N0 — blocked(fixture): the walled boot itself now comes up (Tenancy: isolated, Organizations mounted) and the operator half (c2) passes live, but the org owner's org-scoped manage_metadata grant cannot be placed through any HTTP door (operator insert 403 "outside the caller's organization scope"; owner self-grant 403 under ADR-0090 D12 condition (c)). Supplemental: the organization_admin owner was refused 403 at 7 metadata doors and nothing was stored.
  • cli.organization-ownership-ceremony c5 — blocked(fixture): needs a showcase DB born under an 18.0.0-next.* build; a published prerelease CLI resolves 18.1.0 dependencies (measured), so it is not a substitute.

Compared with the 18.0 P0 record #24556 (17/5/1): platform-core.v18-boot-refusals and integration-system.datasource-credential-refusal-matrix are PASS now, the walled boot is no longer refused, and the ownership ceremony is live again (rev 4, #24681) and was scored on it.

Checklist-accuracy findings / fixture gaps

For the wave anchor #25807 (collected there; not extracted, no checklist edit in this run).

  • RUNNER environment facts: (1) the walled-boot entry is stale — examples/app-showcase/package.json now declares @objectstack/organizations, so a walled run boots from the tree with three env vars, no scratch copy; (2) the Playwright entry is stale — /opt/pw-browsers now holds chromium 1243 and the alias resolves there (the alias advice still works).
  • platform-core.boot-health c2: deployment-policy unbound flows print as ℹ lines, not ⚠; the clause still describes ⚠.
  • platform-core.nav-surfaces-render: the console-added "All reports" sidebar destination is outside both meta/app nav and SURFACES, so the served-vs-SURFACES diff cannot see it; step 1's test:smoke also collects two other specs beside the pin.
  • platform-core.builtin-apps-nav-render: marketplace knownGap names "Forbidden", the screen reads "HTTP 502 · fetch failed" (MARKETPLACE_PROXY_FAILED); step 6 names sys_approval_request/my_pending for Account Approvals, the served entry is component/approvals/inbox; no clause covers a member opening Setup's url-type entries (they render inside the Showcase shell while the server refuses every namespace 403).
  • approvals.account-app-entry: "drawer" wording in steps 6–7 and acc[1], acc[3], acc[4] is stale — objectui removed the side sheet (objectui#12484); a row click or ?request= now opens /apps/APP/sys_approval_request/record/ID; the account app answers on two URL segments (account and com.objectstack.account), which matters for acc[5].
  • records-forms.crud-roundtrip: the owner half of acc[6] says "not yet run" — it was replayed this run.
  • integration-system.datasource-credential-refusal-matrix step 2: an schemaMode: 'external' datasource needs an external: {} block or it answers 400, easy to misread as a refusal.
  • automation.packaged-flow-disable-durable: steps 2/8/10 task POST needs project; step 4's "reads are open" holds only at the apiMethods layer (a contributor gets 403 on sys_metadata_activation).
  • identity-auth.default-organization-boot-invariant: step 3 filters organization = default, the column is organization_id and takes the org id; fixtures.requires says --fresh but c1 needs --log-level info and a readable file DB; acc[0] prescribes --maxWorkers=2 against RUNNER's memory fact.
  • platform-core.seed-integrity: the Specimen diff should name the canonical time form ("14:30" → "14:30:00"); step 2's baseline lists 9 of the 19 seeded datasets.
  • access-security.crud-permission-matrix knownGaps[1]: a plain member reads the whole org sys_user directory, not a self-scoped row (sys_account / sys_session are the self-scoped ones); the pin header says 6 delegate × sys_* rows, the matrix has 4.
  • access-security.walled-environment-metadata-operator-only: steps name showcase objects while the wall-* dogfood pins boot the CRM app — worth stating in the item.
  • cli.organization-ownership-ceremony: planning a raw v17 DB before any v18 boot blocks the apply at the rewrite step (resumable after one boot) — put the refused boot before the plan; apply needs OS_AUTH_SECRET (or --dev) or it blocks at authored-conversion; on a real 17.x DB the drop gate's first refusal is refused_comment_reactions_unconverted, so os migrate comment-reactions --apply --yes (step 4, which also lacks --yes) must come before step 3; acc[0] prescribes --maxWorkers=2; c5 knownGaps should say a published prerelease CLI is no substitute.
  • platform-core.v18-boot-refusals step 1: production os serve --preset minimal is refused earlier ("This stack mounts no auth…"); os serve --dev --no-server is the spelling that reaches the SecurityPlugin refusal.
  • ai.mcp-stdio-fail-closed steps 2 and 9: the INFO lines need --log-level info on os start; query_records caps limit at 50.

Fixture gaps (parked on #25807): the walled org-scoped grant (above); the 18.0.0-next.* born DB (above); the guest anchor (crud-permission-matrix knownGaps[2]); the marketplace catalog needs egress to cloud.objectos.ai (named error state scored); no fixture throws inside a route, so the ErrorBoundary fallback stands on "none encountered".

Off-clause probes (RUNNER rule 8)

About 63 minutes over five runners, after every clause had a verdict, on the same boots. Doors: by-id data doors and side write doors (/batch, updateMany, deleteMany), search / analytics / security/explain read channels, /actions and _activation, /automation toggle, sys_metadata_activation, auth sign-in/sign-out, meta/app, console bad routes, approvals act doors, datasource read doors (history, audit, draft/raw, search), stdio admission, ownership plan/apply, dev DB resolution. Personas: admin, baseline members, contributor-bound member, liaison, auditor, outsider member, seeded member, anonymous. Boundary classes: unknown / empty / blank ids, empty strings on every query param, missing booleans, bad windows ($top −1, abc, 100000), bad comparands ($in [null], reversed and 3-value $between, $regex), repeated params, owner forging on bulk doors, double approve, act-as another position, foreign plan file, existing --out, missing --backup-taken, empty and whitespace stdio keys. Nothing found that passes the filing gate. Observed, not filed (no declared contract or by design): member marketplace page says admin-only while GET /api/v1/marketplace/packages proxies upstream for the member (502 here, could not judge with egress closed); the ownership plan's missing-column note sits only in tables[].grants.note, and two mid-apply blockers that are knowable before any write are reported only after attribution and up to 7 steps are written (resumable by design); the in-shell session-expiry state offers "Retry" rather than a sign-in link; the History tab shows currency raw.

Timing

  • Environment preparation ≈ 17 min orchestrator wall (pnpm install 18 s, pnpm build 6 m 32 s, console build ≈ 11 min) + ≈ 36 min of runner provisioning summed over five runners (boots, scratch copies, the v17 npm fixture, Postgres, personas).
  • Testing ≈ 108 min summed over five runners (Tier 1 pins serialised, live clause driving, probes); wall 14:25–15:07Z.
  • Environment : testing ≈ 53 : 108 ≈ 1 : 2.

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out for this record at 2026-10-25T15:10Z. No FAIL was scored, so no clause needs a four-way disposition and nothing is extracted. The four PARTIAL items carry only blocked clauses; each gap is parked on the wave anchor, and the checklist-accuracy findings in the body close out there too.

    Parked-on: #25807 · access-security.rls-both-sides · acceptance[5] blocked on the D11 private write-up
    Parked-on: #25807 · access-security.crud-permission-matrix · acceptance[5] guest anchor ships unbound
    Parked-on: #25807 · access-security.walled-environment-metadata-operator-only · acceptance[1] and negative[0] need an org-scoped manage_metadata grant no HTTP door places
    Parked-on: #25807 · cli.organization-ownership-ceremony · acceptance[5] needs a showcase DB born under an 18.0.0-next build

    This record supersedes the 18.1.0 P0 record #25478 (10/23); all 23 items were re-judged here, so nothing is carried forward.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions