Skip to content

QA run · priority:P0 (23/23) · 756220c4 · 2026-10-27 · 20 PASS / 3 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #26481

Closed

Description

@objectstack-fleet

QA run record for selector priority:P0 of the 18.2.0 release test sweep, wave 2 (wave anchor #25807, card W2-C1). It supersedes the wave-1 P0 record #25812, which was run on the old head 6679644a. The run used the checklist-test skill and followed docs/qa/platform-checklist/RUNNER.md.

Environment fingerprint

  • Framework: 756220c4a7adcbb1228864607cb4b6a1ca486dc0, checked out detached and pinned for the whole run. The tree was clean before and after (git status --short empty). /api/v1/health reports version: 18.1.0 because the tree is unreleased.
  • Build:
    • pnpm install --frozen-lockfile: exit 0, 22 s.
    • pnpm build --concurrency=2: 119/119 tasks, 0 cached, 9 m 25 s, exit 0.
    • node scripts/check-dev-prereqs.mjs: green, 108 artifacts.
  • Console build line: this is the first release-candidate run of the in-repo Console.
    • The Console was built in-repo from ui/apps/console at the same commit. pnpm build ran @object-ui/console:build as a cache miss (hash 1ab97949c097c590).
    • pnpm console:build --concurrency=2 then ran 72/72 tasks (71 cached). @objectstack/console:build:dist copied ui/apps/console/dist to packages/console/dist and printed:
      • "✓ Single-zod canary: exactly one zod version literal {major:4,minor:6,patch:7}"
      • "✓ @objectstack/console dist ready (80644 KB) from ui/apps/console, with the tracked sdui.manifest.json"
    • Entry bundle: assets/index-DkQSwG_q.js. diff -rq ui/apps/console/dist packages/console/dist differs only in sdui.manifest.json, by design (the tracked manifest is copied over).
    • There is no .objectui-sha pin; that route is retired.
  • stale-console-bundle is ruled out explicitly, on two grounds:
    • The served dist was built in this run from this commit's ui/ tree.
    • On every console-serving boot (ports 42206, 42320, 42401–42404, 42501–42503), GET /_console/ answered 200. The served /_console/assets/index-DkQSwG_q.js has the same sha256 as packages/console/dist/assets/index-DkQSwG_q.js (c9c69e49…). The CLI resolves @objectstack/console to packages/console in this tree, and no ../objectui sibling exists.
  • 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.
    • Every boot had its own port (lanes 42101–42599) and its own file DB. Servers were stopped by process group.
    • Items that author metadata or need an unshared app dir booted from tar scratch copies: cli.dev-boot-contract, the ceremony, MCP and studio legs.
    • Seed: --seed-admin (admin@objectos.ai) plus the showcase seed, 132 rows.
    • Walled leg: OS_TENANCY_POSTURE=isolated, OS_PLATFORM_OWNER_EMAIL=admin@objectos.ai, OS_AUTH_MEMBERSHIP_POLICY=invite-only through os dev, from the stock tree. It printed Tenancy: isolated with Organizations mounted and no FATAL or DEGRADED line.
  • Fixtures provisioned by the runners:
    • A v17 SQLite from npm @objectstack/cli@17.7.0. This image's npm 10.9.4 needs --legacy-peer-deps; all 53 @objectstack packages resolved to 17.7.0. Booted with os start in an empty dir, plus one sign-up: 74 tables, 130 rows.
    • A local Postgres 16 (scram-sha-256), TCP only, on 42290.
    • Personas minted by invite + sign-up, or by admin create-user + change-password. Each identity was proven by get-session before use.
    • One fixture write was made outside HTTP: the walled org owner's manage_metadata grant row, which access-security.walled-environment-metadata-operator-only fixtures prescribe. It was written directly into the run's own walled.db, after both HTTP grant doors were measured refusing it (403).
  • Tier 1:
    • Every framework file named in the items' automated.ref ran as 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 live :42403 with OS_TEST_CHROMIUM_EXECUTABLE_PATH=/opt/pw-browsers/chromium.
    • Every pin was green.
  • Date and container: 2026-10-27 (UTC), Linux, 4 vCPU / 15 GB.
  • Runners: one orchestrator plus 5 parallel runner subagents: api ×2, cli ×1, browser/mixed ×2. Each runner worked through its own lane sequentially.

Scope

  • Selector priority:P0, resolved with node scripts/checklist-select.mjs priority:P0 --json: 23 runnable items.
  • One blocked item is hidden and was not run: access-security.no-active-org-session-semantics. --include-blocked was not passed, so it is not recorded as an item of this run.
  • 0 planned items matched.
  • Every item the selector returned has a verdict.

Item · surface · revision (pinned from the resolver) · derived verdict:

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

Per-clause verdicts

  • Clause ids are 0-based over acceptance[]; N0… are over negative[].
  • Coverage was checked mechanically against each item's JSON: 204/204 clauses carry exactly one verdict.
  • Evidence is text server truth (API, log, build or test output), and a screenshot oracle is described in one line.
  • Pins name the layer they reach (RUNNER rule 6). Cells are cut at about 165 characters (…); the full cells are in the runner scratch records.
item clause verdict evidence
access-security.rls-both-sides 0 pass live :42101. A GET /data/showcase_private_note 200 returned titles [A note 1, A note 2] (no B); B returned [B note 1] (no A). Both personas are plain create-user…
access-security.rls-both-sides 1 pass A GET /data/showcase_private_note/‹B id› → 404 RECORD_NOT_FOUND (not-found-shaped denial). An unknown id gives the same 404, so there is no existence oracle
access-security.rls-both-sides 2 pass A PATCH ‹B id› {body:forged} → 404 RECORD_NOT_FOUND. The admin re-read of B's note is byte-identical to the pre-attempt read (body original-b, updated_at unchan…
access-security.rls-both-sides 3 pass admin GET /data/showcase_private_note 200 n=3, with A1, A2 and B1 ids all present
access-security.rls-both-sides 4 pass objectstack verify --rls (showcase, in-process HTTP, exit 0). Per-persona line: 21 PROVEN (21 consistent, 0 HOLES) · 3 NOT PROVEN. Total line: `all personas: 38…
access-security.rls-both-sides 5 blocked(dependency: the D11 judgement needs the private write-up named in knownGaps, #7463) The skipped half holds: 3 skipped, each explained (project_membership "no plain-text probe field"; ext_customer / ext_order "external read-only object"). Hand spot-…
access-security.rls-both-sides N0 pass forged PATCH answered 404 and the admin re-read is unchanged: no 2xx, no mutated row
access-security.rls-both-sides N1 pass D11 verdict recorded on this item only (acceptance[5]); owd-sharing-matrix c4 cross-references it and does not count it
access-security.rls-both-sides N2 pass procedural: cited by item and clause only, handle not restated
access-security.write-path-guards 0 pass admin POST /data/showcase_contact {lead_score:10} → 201. Header x-objectstack-dropped-fields: lead_score;reason=readonly, body droppedFields `[{fields:[lead_sco…
access-security.write-path-guards 1 pass PATCH {lead_score:99} → 200, dropped header lead_score;reason=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 count of the unique 'planted-…' title = 0
access-security.write-path-guards 3 pass Alice self-owner POST → 201 with owner_id=Alice. PATCH owner_id=Bob → 403 PERMISSION_DENIED; owner_id=null → 403. Re-read owner_id=Alice
access-security.write-path-guards 4 pass Alice POST …/createMany with a bare array of 3 → 201, all 3 re-read owner_id==Alice. A {records:[…]} wrapper → 400 VALIDATION_FAILED
access-security.write-path-guards 5 pass paid invoice PATCH tax_rate:20 → 200, header tax_rate;reason=readonly_when, re-read 5. Paid line PATCH qty/unit_price/product → 200, all three dropped readonl…
access-security.write-path-guards 6 pass updateMany with continueOnError:true over [21, −5, 41] → succeeded 2, failed 1; row1 VALIDATION_FAILED "Qty must be ≥ 0"; re-read 21/3/41. Default run: row1 VALIDAT…
access-security.write-path-guards N0 pass ADMIN insert owner_id=Bob → 201 (persisted Bob). ADMIN transfer of Alice's note to Bob → 200 (re-read Bob)
access-security.write-path-guards N1 pass pins @objectstack/objectql: engine-insert-static-readonly-strip 21/21 ("isSystem seeds the readonly column" passed) and engine-readonly-strip-caller-values 34/34 ("…
access-security.crud-permission-matrix 0 pass live :42101 port of the pin: 41 showcase_* rows × 4 verbs, one fresh member per set (grant via admin POST /data/sys_user_permission_set). All 87 allow cells ‹300…
access-security.crud-permission-matrix 1 pass all 77 deny cells answered "403 PERMISSION_DENIED" (77/77). Delegate sys_* deny cells: 403 PERMISSION_DENIED (bu C/E/D, bu_member C/E/D, sys_user E). sys_user creat…
access-security.crud-permission-matrix 2 pass every denied create: the admin list filtered on the run-unique marker field shows 0 rows. Delegate denied bu create: re-read 404
access-security.crud-permission-matrix 3 pass auditor: by-id 200 and list contains the foreign private_note and inquiry (plain-owned) and the invoice and line (admin-owned). Contributor (no bit): by-id 404 RECO…
access-security.crud-permission-matrix 4 pass ops PATCH of the 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) member holding guest_portal: POST inquiry 201, GET own 200 (the union, as knownGaps predicts). REST anonymous POST and GET → 401 UNAUTHENTICATED
access-security.crud-permission-matrix 6 pass access-matrix.json has 45 rows: 41 showcase_* rows = 164 cells (87 allow / 77 deny after union) over 8 sets × 20 objects, plus 4 field_ops_delegate × sys_* rows (16…
access-security.crud-permission-matrix N0 pass one denied cell per set, run as admin: auditor inquiry.edit 200, client_liaison project.edit 200, contributor account.edit 200, executive inquiry.edit 200, manager…
access-security.crud-permission-matrix N1 pass 0 withheld cells answered 2xx (0 of 77, plus 0 of 9 delegate deny cells)
access-security.owd-sharing-matrix 0 pass private: B's list excludes A's note; B GET 404 RECORD_NOT_FOUND, 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's list (200) contains the 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 of the same foreign announcement → 200; re-read shows the ops title
access-security.owd-sharing-matrix 3 pass public_read_write: C1 (contributor) GET of the admin project 200, PATCH name → 200, re-read changed. A (member_default) identical PATCH → 403 PERMISSION_DENIED, nam…
access-security.owd-sharing-matrix 4 pass cbp: C1 creates invoice (owner=C1 email) and line, 201/201. C2's list excludes C1's line; C2 GET 404, C2 PATCH 404; admin re-read byte-identical. C1: list includes,…
access-security.owd-sharing-matrix 5 pass auditor GET /data/showcase_invoice_line 200 contains C1's line; by id 200
access-security.owd-sharing-matrix 6 pass all four models driven per persona and verb (private / public_read / public_read_write / controlled_by_parent). Pins showcase-private-owd 5/5, showcase-public-read-…
access-security.owd-sharing-matrix N0 pass public_read foreign PATCH sent as a forged direct request → 403, row unchanged
access-security.owd-sharing-matrix N1 pass C2's line probes repeated as C1: list true, GET 200, PATCH 200. The route works, so the denial is derivation
access-security.anonymous-deny-surfaces 0 pass anonymous → 401 code UNAUTHENTICATED on /data, /meta, POST /actions/showcase_task/showcase_mark_done/anon-probe-id, /automation/_status, `POST /batch {operations:…
access-security.anonymous-deny-surfaces 1 pass actions probe with a nonexistent id → 401 (member on the same path → 404 RECORD_NOT_FOUND)
access-security.anonymous-deny-surfaces 2 pass every body matched exactly one family under the pin's predicates: rest-flat for data, meta, batch and security; dispatcher-wrapper for actions, automation, analytic…
access-security.anonymous-deny-surfaces 3 pass analytics anonymous: query, sql and meta 401, malformed query and sql 401 (dispatcher-wrapper). Member: query 200, sql 200, meta 200; malformed → 400 VALIDATION_FAI…
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 spec, 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, name=showcase_reassign_wizard
access-security.walled-environment-metadata-operator-only 0 pass pins at 756220c: @objectstack/rest meta-migrate-stored-walled-refusal 6/6 (unit: RestServer over a stub http server); @objectstack/runtime packages-walled-write-re…
access-security.walled-environment-metadata-operator-only 1 pass walled :42102. The org owner of QA Wall A (not platform admin; explain shows permissionSets incl. qa_meta_author carrying manage_metadata; fixture row placed outsid…
access-security.walled-environment-metadata-operator-only 2 pass walled operator PUT /meta/object/qa_walled_probe → 200 "Saved … (env-wide, state=active)", read-back 200, deleted → 404. Single :42101 admin, same PUT → 200, read…
access-security.walled-environment-metadata-operator-only N0 pass no environment-metadata write by the owner succeeded: beyond the steps, also refused were DELETE /meta/object/showcase_account 403 FORBIDDEN, POST /packages 403, PO…
ai.mcp-stdio-fail-closed 0 pass os start, OS_MCP_STDIO_ENABLED=true, key unset: exit 1 in 4.8 s, 0 stdout bytes, health never 200; stderr '✗ Plugin com.objectstack.mcp failed to start … [MCP] The…
ai.mcp-stdio-fail-closed 1 pass osk_unknown: exit 1, 0 stdout bytes, health 000, '[MCP] OS_MCP_STDIO_API_KEY did not resolve to a valid identity (unknown / revoked / expired / owner-less). Refusin…
ai.mcp-stdio-fail-closed 2 pass --log-level info: 'INFO [MCP] stdio transport principal-bound to OS_MCP_STDIO_API_KEY identity dGlwEpXArkS5cNFZ6sxdL2bupbSwvjZz (RLS/FLS/tenant applied)' = contri…
ai.mcp-stdio-fail-closed 3 pass RLS (contributor key): MCP query_records showcase_invoice limit 50 → 2 rows INV-QAC-1/2 = REST GET (same key) 2 rows; field sets equal (18 = 18); admin REST 14 rows…
ai.mcp-stdio-fail-closed 4 pass count by status: MCP member {rows:[{status:draft,n:2}]} = REST member POST /data/showcase_invoice/query [{draft:2}]; REST admin [{draft:4},{paid:5},{sent:5}] (membe…
ai.mcp-stdio-fail-closed 5 pass liaison MCP aggregate_records sum(budget), count_distinct(spent), count groupBy budget: each isError, {code PERMISSION_DENIED, status 403, message "[Security] Field…
ai.mcp-stdio-fail-closed 6 pass same stdio session: pre-revoke query_records 2 rows; admin PATCH /api/v1/data/sys_api_key/2LgriiYxjT6RGXcl {revoked:true} 200; next query_records result.isError tru…
ai.mcp-stdio-fail-closed 7 pass os start, no OS_MCP_* in env, --log-level info: health 200, 0 stdout bytes, 'INFO [MCP] Transport not auto-started (HTTP is served per-request at /api/v1/mcp rega…
ai.mcp-stdio-fail-closed N0 pass no keyless / unknown / revoked / empty-string / whitespace-key start served: all exit 1, 0 stdout bytes, health never 200
ai.mcp-stdio-fail-closed N1 pass MCP member rows == REST member rows (2 vs 2); INV-1003 hidden on both surfaces
ai.mcp-stdio-fail-closed N2 pass MCP member draft count 2 ≠ admin total 14 / admin draft 4
ai.mcp-stdio-fail-closed N3 pass every aggregate naming budget/spent (input or groupBy) refused with no numeric result
ai.mcp-stdio-fail-closed N4 pass post-revoke read served 0 rows and carried API_KEY_REVOKED, status 403
api-backend.query-contract-matrix 0 pass Baseline GET showcase_account $top=500 gave 14 rows and showcase_task gave 10. I ran 26 variants in both POST /query spellings ($-object and AST array) and got 52 o…
api-backend.query-contract-matrix 1 pass orderby name, windows (top,skip) = (3,2), (4,8) and (5,12). GET $top/$skip, POST limit/offset and POST top/skip all returned the locally sorted slice, e.g. [Fabrika…
api-backend.query-contract-matrix 2 pass $select=name,status and fields:[name,status] each returned 14 records, every key set exactly {name,status} with no id. POST showcase_invoice/query `fields:['acc…
api-backend.query-contract-matrix 3 pass annual_revenue: the full 14-value sequence matched the local sort on GET $orderby=f asc, f desc, -f and on POST orderBy asc/desc. $orderby=no_such_field (GE…
api-backend.query-contract-matrix 4 pass LIVE over HTTP. I minted the contributor with admin create-user, change-password and sys_user_position=contributor (session positions [org_member,contributor,everyo…
api-backend.query-contract-matrix 5 pass POST where {status:{$nin:"done"}} returned 400 VALIDATION_FAILED, fields[0].field=query.where.status.$nin, msg 'Operator "$nin" on field "status" requires an ARRAY'…
api-backend.query-contract-matrix 6 pass GET ?$pageSize=5 returned 400 UNSUPPORTED_QUERY_PARAM, listing $top,$skip,$orderby,$select,$count,$search,$searchFields,$filter,$expand. GET ?not_a_field=x returned…
api-backend.query-contract-matrix 7 pass POST showcase_task where status $in [] returned 200 with 0 rows. $nin [] returned 200 with 10 rows, equal to the task baseline of 10.
api-backend.query-contract-matrix 8 pass Every variant has a row in rB/qcm.ops.json plus the param rows: $count (total 14 with $top=2), $search Northwind returned [Northwind], $filter AST and object forms…
api-backend.query-contract-matrix N0 pass POST {limit:"ten"} returned 400 VALIDATION_FAILED on field query.limit. POST {not_a_query_key:{…}} returned 400 INVALID_FIELD. Neither carried records. Control: `fi…
api-backend.packaged-action-disabled-dispatch 0 pass With mark_done disabled, POST /api/v1/actions/showcase_task/showcase_mark_done {recordId:no-such-record-0000} returned 409, error.code ACTION_DISABLED, "Action 'sho…
api-backend.packaged-action-disabled-dispatch 1 pass Param_gallery disabled, request {params:{bogus_key:1},recordId:bogus}: 409 ACTION_DISABLED. After re-enable, the identical request returned 400 VALIDATION_ERROR 'In…
api-backend.packaged-action-disabled-dispatch 2 pass Both disabled traces (mark_done, param_gallery) returned 409 with a nonexistent recordId and no read or side effect. Corroboration only: before any flip, enabled ma…
api-backend.packaged-action-disabled-dispatch 3 pass showcase_zoo_perm_missing returned 403 PERMISSION_DENIED "requires capability [showcase.restricted_ops]" while enabled, and 403 while disabled. The two bodies are b…
api-backend.packaged-action-disabled-dispatch 4 pass LIVE MCP: POST /api/v1/mcp tools/call run_action {actionName:showcase_portfolio_snapshot}. Enabled: ok (accounts 14). Disabled: isError:true with {code:ACTION_DISAB…
api-backend.packaged-action-disabled-dispatch 5 pass Cold restart (process group stopped, new boot on the same action.db). mark_done on a real task returned 409 and the task stayed done:false/progress:0. Re-enable ret…
api-backend.packaged-action-disabled-dispatch 6 pass showcase_bulk_reassign (type flow) disabled returned 409 ACTION_DISABLED naming showcase_bulk_reassign, both before and after the restart. GET /automation/showcase_…
api-backend.packaged-action-disabled-dispatch N0 pass No disabled invocation answered with a 400 or a handler/record shape; all were 409. The enabled control's 400 proves the param contract fires only when enabled.
api-backend.packaged-action-disabled-dispatch N1 pass The unentitled action answered 403 in both states, never 409. On the stock boot the ledger total was 0 and enabled mark_done returned 404 RECORD_NOT_FOUND, not ACTI…
api-backend.packaged-action-disabled-dispatch N2 pass Anonymous POST /actions/showcase_task/showcase_mark_done returned 401, and anonymous POST /actions/_activation/… returned 401.
approvals.account-app-entry 0 pass framework 756220c; console:build ready line "✓ @objectstack/console dist ready (80644 KB) from ui/apps/console" (orchestrator line file); `grep approvals:inbox pac…
approvals.account-app-entry 1 pass nav click "Approvals" landed /_console/apps/com.objectstack.account/component/approvals/inbox; screenshot: "Approvals Inbox", tabs [My Pending 1, Submitted by me, A…
approvals.account-app-entry 2 pass persona get-session role user, sys_member role member, positions contributor+finance; GET /api/v1/meta/app → [showcase_app, account] (admin: +setup); ?id=setup → it…
approvals.account-app-entry 3 pass row click → /apps/com.objectstack.account/sys_approval_request/record/areq_64b3f6b7…; buttons Approve/Reject/Reassign/Send back/Request info/Reply; Approve→Confirm…
approvals.account-app-entry 4 pass cold load …/component/approvals/inbox?request=areq_64b3f6b7… → URL /_console/apps/com.objectstack.account/sys_approval_request/record/areq_64b3f6b7…, history.length…
approvals.account-app-entry 5 pass screenshot showed the list rendered; All-tab row link href /_console/apps/com.objectstack.account/showcase_invoice/record/I8Q53JoCfAbXlddE (current app segment); pe…
approvals.account-app-entry 6 pass avatar menu › Preferences › Language → 中文(中国): nav entry 待我审批, header 审批中心, tabs [待我审批, 我发起的, 全部], All-tab status badge 待审批 (screenshot)
approvals.account-app-entry N0 pass full inbox rendered (tabs + row + hint bar); no component-not-found state and no blank pane
approvals.account-app-entry N1 pass Approvals entry present for the non-admin in meta/app and in the rendered sidebar; setup absent from the same session's meta/app
automation.packaged-flow-disable-durable 0 pass toggle {enabled:false} returned 200 {enabled:false}. sys_metadata_activation then holds exactly 1 row with metadata_type=flow, name=showcase_urgent_task_alert, pack…
automation.packaged-flow-disable-durable 1 pass POST /automation/showcase_urgent_task_alert/trigger returned 409 FLOW_DISABLED "…switched off for this installation in the packaged-metadata activation ledger (sys_…
automation.packaged-flow-disable-durable 2 pass New process on the same flow.db, booted at --log-level info. _status shows {enabled:false,bound:false}. Boot log: "[Automation] Activation ledger: 1 packaged flow(s…
automation.packaged-flow-disable-durable 3 pass Runs list: 1 before the post-restart urgent create and 1 after it (4 s settle). The single run is the pre-toggle baseline, run_6b507614 completed.
automation.packaged-flow-disable-durable 4 pass Re-enable returned 200. GET by id _84PILrMZWAqKmjZ gives active:true, created_at kept, updated_at advanced, still 1 row. _status shows enabled+bound true. The final…
automation.packaged-flow-disable-durable N0 pass The 2xx toggle came with its ledger row. 0 "IN PROCESS ONLY" warns in either boot log.
automation.packaged-flow-disable-durable N1 pass After the restart: enabled:false, bound:false, and no run from the post-restart create.
automation.packaged-flow-disable-durable N2 pass The re-enable kept the row (same id, read by id 200).
automation.packaged-flow-disable-durable N3 pass The 409 message carries the "packaged-metadata activation ledger (sys_metadata_activation" phrasing, not the bare status sentence.
cli.dev-boot-contract 0 pass dev --ui --seed-admin -p 42320 -d file:rC/dev/data.db: health 200 after 6 polls; GET /api/v1/ready 200 {status:'ready',state:'running'}; boot printed Environment…
cli.dev-boot-contract 1 pass POST /api/v1/auth/sign-in/email admin@objectos.ai/admin123 200 (wrong password 401); restart on the same DB with --admin-password changed99: admin123 → 200, chang…
cli.dev-boot-contract 2 pass Database lines: -d file → file:…/rC/dev/data.db; -d :memory: → ':memory:' (health 200); OS_DATABASE_URL → file:…/rC/dev/env.db; config tier (named qa_home + datasou…
cli.dev-boot-contract 3 pass '🧪 Fresh OS_HOME: /tmp/objectstack-dev-L5R4ig', Database file:/tmp/objectstack-dev-L5R4ig/data/objectstack.db; dir present while serving and gone after SIGINT (exit…
cli.dev-boot-contract 4 pass instance B on busy 42320: '↪ server bound to port 42321 (requested 42320)', API/Console/MCP URLs printed with 42321, health on 42321 = 200; both instances SIGINT →…
cli.dev-boot-contract 5 pass after touching src/coverage.ts, --no-compile: '⚠ dist/objectstack.json is OLDER than your sources — this boot serves the STALE build. newest source: src/coverage.…
cli.dev-boot-contract 6 pass dir with no config: exit 1; stdout '✗ Config file not found in …/noconf'; stderr 'Run in a directory with objectstack.config.ts, pass --artifact ‹path/url›, or run…
cli.dev-boot-contract 7 pass GET /_console/ 200 text/html, redirected to /_console/login, served entry bundle = in-repo packages/console/dist (sha256 match); screenshot showed the ObjectOS 'Wel…
cli.dev-boot-contract N0 pass nothing-chosen boot: probe showcase_task 'QA-RC persist probe' created, read back after a restart (11 tasks, probe 1)
cli.dev-boot-contract N1 pass --database-driver memory exit 2 (INVOCATION ERROR, oclif allowlist); OS_DATABASE_DRIVER=memory/mingo/in-memory exit 1, 0 Database lines, text names `os dev --fres…
cli.dev-boot-contract N2 pass legacy: '⚠ Reading legacy database file …/.objectstack/data/dev.db — dev, start and migrate now share one default, …/objectstack.db; migrate with: mv … or pin it ex…
cli.dev-boot-contract N3 pass shift reported in both the ↪ line and the printed URLs (42321)
cli.organization-ownership-ceremony 0 pass @756220c4, --maxWorkers=1: @objectstack/cli 8 files (apply-flags, organization-ownership-apply, occupancy.integration, dialect, apply-organization-ownership-gate.in…
cli.organization-ownership-ceremony 1 pass cB: refused os serve first (exit 1), then plan exit 0, plan.json kind organization-ownership-plan, ceremony 'ADR-0131 D10', inventoryDigest 74c9ab1d…, 134 entries a…
cli.organization-ownership-ceremony 2 pass cB --apply --plan-file plan.json --backup-taken --out apply.json --json exit 0: complete true, blocking 0, 13/13 steps done (attribution … not-null); sys_migratio…
cli.organization-ownership-ceremony 3 pass unmigrated cC: os serve exit 1 '✗ This database carries no organization-ownership marker …' naming os migrate organization-ownership --out PLAN and `--apply --pla…
cli.organization-ownership-ceremony 4 pass raw v17 copy cD: first apply --allow-destructive --yes --json exit 1 refused_comment_reactions_unconverted, applied [], row diff 0; comment-reactions --apply withou…
cli.organization-ownership-ceremony 5 blocked(fixture: needs a DB born and served under an 18.0.0-next.* build) not consulted. Building one needs the release's tag commit in its own worktree, plus pnpm install and build there; this card forbids repo changes and new builds. kn…
cli.organization-ownership-ceremony N0 pass plan runs (cB, cE) changed no row; refusals plan-file-required, backup-unacknowledged ('--apply needs a backup … --backup-taken'), plan-database-mismatch, existing…
identity-auth.default-organization-boot-invariant 0 pass At 756220c: @objectstack/plugin-auth src/ensure-default-organization.test.ts, 1 file / 57 passed (plugin unit). @objectstack/runtime src/identity-objects-defau…
identity-auth.default-organization-boot-invariant 1 pass --fresh --log-level info boot. Log line 1102 at 01:47:24.685 "[default-org] created the Default Organization (org_mvq0zm2x9dx2qbwg)" comes before line 1269 at 01:…
identity-auth.default-organization-boot-invariant 2 pass GET sys_member?organization_id=org_mvq0zm2x9dx2qbwg: admin role owner, qa-dorg-member (admin create-user + change-password) role member, demo personas member. get-s…
identity-auth.default-organization-boot-invariant 3 pass GET sys_business_unit: 5 seeded rows (bu_acme, bu_east_coast, bu_field_ops, bu_hq_finance, bu_west_coast), all organization_id=org_mvq0zm2x9dx2qbwg.
identity-auth.default-organization-boot-invariant N0 pass sys_business_unit has 0 rows with NULL organization_id. Extra sweep on the seed boot: all 19 seeded objects, 0 null-org rows among those that carry the column.
integration-system.datasource-credential-refusal-matrix 0 pass 18 doors, each run through os build (scratch app, exit 2, no artifact) and through POST /api/v1/datasources (400 DATASOURCE_ADMIN_ERROR). Doors: password on pg/my…
integration-system.datasource-credential-refusal-matrix 1 pass POST qa_pg_paved {driver postgres, config host/port/database/username, external:{}, secret top-level} returned 201 status ok. POST /datasources/qa_pg_paved/test ret…
integration-system.datasource-credential-refusal-matrix 2 pass Admin door: config {host,port,database,username}, hasSecret:true. Meta door: the same config plus external.credentialsRef sys_secret:sec_7036…. Planted cleartexts g…
integration-system.datasource-credential-refusal-matrix 3 pass GET /api/v1/datasources/qa_pg_paved gives hasSecret:true and qa_pg_nosecret gives hasSecret:false; the config is the same and redactedConfigKeys is [] for both.
integration-system.datasource-credential-refusal-matrix 4 pass I planted rows directly into sys_metadata of ds.db while the server was stopped: passwd/pwd (pg), token/jwt (turso file:), auth_token (mysql), authtoken (mongodb),…
integration-system.datasource-credential-refusal-matrix 5 pass Driver qa_plugin_driver: POST returned 201. Both doors show url qadb://pluguser@127.0.0.1/x with the password stripped, password and authToken absent (admin redac…
integration-system.datasource-credential-refusal-matrix 6 pass Read the admin-door config and sent it back verbatim with PATCH /api/v1/datasources/qa_pg_paved: 200 (PUT returns 405). Afterwards hasSecret is still true, credenti…
integration-system.datasource-credential-refusal-matrix 7 pass Member, identity confirmed via get-session ([org_member,everyone]): 403 PERMISSION_DENIED on the admin and meta doors for 5 names, on both lists and on sys_metadata…
integration-system.datasource-credential-refusal-matrix N0 pass Full-body greps for 15 planted values across 3 read doors × 3 personas plus boot logs: 0 hits. Refusal bodies never echo the value (PW echoed false on all 18 runtim…
integration-system.datasource-credential-refusal-matrix N1 pass Every door refused at build AND at the runtime admin door. The meta write door (PUT /meta/datasource) also refused config.password with 422 INVALID_METADATA. No dis…
integration-system.datasource-credential-refusal-matrix N2 pass The meta door withholds every planted key the admin door withholds (identical config objects).
integration-system.datasource-credential-refusal-matrix N3 pass All six alias spellings (passwd, pwd, token, jwt, auth_token, authtoken) are redacted.
integration-system.datasource-credential-refusal-matrix N4 pass Unknown driver: canonical password, authToken, URL userinfo, and aliases passwd/token are all redacted on both doors.
integration-system.datasource-credential-refusal-matrix N5 pass The echoed config carries no mask, the stored secret handle is unchanged and connect still works.
integration-system.datasource-credential-refusal-matrix N6 pass Every credential refusal names external.credentialsRef / the secret binder, including the connector one. encryptionKey names its removal and ?sslkey= names a file-p…
platform-core.boot-health 0 pass port 42401, fresh DB boot-health.db: curl /api/v1/health → 200 {status:ok,version:18.1.0} 16.0 s after launch (this time includes the dev compile of dist/object…
platform-core.boot-health 1 pass GET /api/v1/ready → 200 {status:ready,state:running} right after health went green
platform-core.boot-health 2 pass Log cut at first health 200 (01:41:20.33Z). The ready banner's diagnostics are stamped ≤01:41:20.10, so they fall inside the window. Flows: `32 flow(s) 19 bound … ·…
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,_packageVe…
platform-core.boot-health 4 pass Every (nav grp)_* id in src/ui/apps/index.ts compared with the served navigation: 58 authored, 58 served. Authored-not-served [], served-not-authored []. grp_data…
platform-core.boot-health 5 pass GET /_console/ → 200 text/html; charset=utf-8, references index-DkQSwG_q.js (sha256 equal to packages/console/dist)
platform-core.boot-health N0 pass No SeedLoader rejection or dropped-record line. Banner row reads Seeds: com.example.showcase 132 rows, with no ⚠ and no ok/errors count
platform-core.boot-health N1 pass Health 200 with 0 ERROR lines in the boot window, and 0 in the whole log after my probes
platform-core.seed-integrity 0 pass I loaded the expected counts from src/data/seed/index.ts via tsx (ShowcaseSeedData, 19 datasets, 132 rows) and compared them with GET ?$top=1 totals: 19/19 equal, 1…
platform-core.seed-integrity 1 pass Specimen — Full, 37 authored fields: 36 equal. f_multiselect, f_checkboxes and f_tags are set-equal. f_json, f_location, f_address, f_composite, f_repeater, f_recor…
platform-core.seed-integrity 2 pass Banner shows the plain "Seeds: com.example.showcase 132 rows", with no ⚠, error count or lost-link count. Info line: "[Seeder] Seed loading complete {inserted:132…
platform-core.seed-integrity 3 pass Restart on the same seed.db logged "[Seeder] Seed loading complete {inserted:0,updated:0,skipped:132,errored:0}". The second sweep's diff against the first is empty…
platform-core.seed-integrity 4 pass Expected-absent list: f_user null, f_users null, f_secret null, and showcase_task.cover null on all 10 rows. I recorded these as expected, not as findings.
platform-core.seed-integrity N0 pass No seeded object reads 0. The minimum is 1 (showcase_preference).
platform-core.seed-integrity N1 pass No count grew on restart (132 to 132, per-object diff empty).
platform-core.console-login 0 pass Form sign-in → POST /api/v1/auth/sign-in/email 200 with set-auth-token, plus the better-auth.session_token cookie. Landed on /_console/home. Screenshot: heade…
platform-core.console-login 1 pass After reload the URL stays /_console/home. First calls: GET /runtime/config 200, GET /auth/get-session 200, GET /discovery 200. In-page `GET /api/v1/meta/ap…
platform-core.console-login 2 pass POST /api/v1/auth/sign-out (bearer) → 200. The same token, still in localStorage, then gets GET /meta/app?id=showcase_app → 401 UNAUTHENTICATED and `GET /auth…
platform-core.console-login 3 pass Full navigation after expiry → /_console/login?redirect=%2Fapps%2Fcom.example.showcase%2Fshowcase_task, login form shown in the screenshot. In-shell client nav af…
platform-core.console-login 4 pass Re-sign-in 200 → back on /_console/apps/com.example.showcase/showcase_task (same route). Calls after re-auth: meta/app 200, meta/view 200, meta/object 200.…
platform-core.console-login N0 pass Wrong password → 401 INVALID_EMAIL_OR_PASSWORD, no set-cookie, no set-auth-token. UI alert "Invalid email or password. Please try again." Afterwards cookies [] an…
platform-core.console-login N1 pass No dead shell: every authed call after sign-out was answered 401. The console either redirected to login or showed the named sign-in-required state. 0 pageerrors
platform-core.nav-surfaces-render 0 pass Layer: real Chromium against a live HTTP boot, which is the oracle's layer. `SMOKE_API_URL=http://localhost:42403 OS_TEST_CHROMIUM_EXECUTABLE_PATH=/opt/pw-browsers/…
platform-core.nav-surfaces-render 1 pass Served meta/app?id=showcase_app has 49 leaves, mapped to console paths, against the 49 SURFACES entries (evaluated from the spec): served-not-in-SURFACES [], SURF…
platform-core.nav-surfaces-render 2 pass /_console/apps/com.example.showcase/object_that_does_not_exist: screenshot shows the shell alive (header plus sidebar groups). Main reads "Object Not Found — The…
platform-core.nav-surfaces-render 3 pass None encountered: 49/49 smoke surfaces, 1 hand-walk and 6 bad-route probes rendered with no ErrorBoundary fallback and 0 pageerrors. Recorded as "none encountered",…
platform-core.nav-surfaces-render N0 pass No blank ‹main› on any of the 50 surfaces (smoke main-text assertion 49/49, plus the hand-walk)
platform-core.nav-surfaces-render N1 pass The smoke at this revision refuses [data-boot-splash] and both English splash lines; 49/49 got past the splash
platform-core.nav-surfaces-render N2 pass The bad route kept the header and sidebar; no white page
platform-core.nav-surfaces-render N3 pass Chart assertions poll against SURFACE_BUDGET_MS = 25_000 (no fixed sleep then a single read). The 5 chart surfaces were green, so there was no chart red to classi…
platform-core.builtin-apps-nav-render 0 pass Admin, all groups expanded (Advanced and Developer included), screenshot-first walk. Setup: 43 sidebar hrefs (42 served plus the console's reports). Account: 9 (8…
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(expanded:false), 42 leaves. Ev…
platform-core.builtin-apps-nav-render 2 pass Member: /_console/apps/com.objectstack.setup and /_console/apps/setup show the named full-page "You don't have access to this app — This app exists, but your ac…
platform-core.builtin-apps-nav-render 3 pass Forged member GET /api/v1/meta/app?id=setup → 200 {type:app,items:[]}. GET /api/v1/meta/app/setup and /meta/app/com.objectstack.setup → 403 `PERMISSION_DENI…
platform-core.builtin-apps-nav-render 4 pass Member ?id=setup → items [], so nav_api_keys and the manage_platform_settings settings URLs are unreachable. CONTROL: admin and member ?id=account navigation JS…
platform-core.builtin-apps-nav-render 5 pass nav_organizations (requiresService org-scoping) is absent. /auth/config reports features.tenancyPosture single, multiOrgEnabled false. nav_business_units is prese…
platform-core.builtin-apps-nav-render 6 pass No sys_verification / sys_device_code / sys_sso_provider / sys_jwks entry in the setup or account payloads (0 matches each). /auth/config features.sso false, so S…
platform-core.builtin-apps-nav-render N0 pass 0 blank ‹main› or placeholder across 52 admin destinations. The one "Failed to load" is the named marketplace egress state with its own panel
platform-core.builtin-apps-nav-render N1 pass The member never obtained Setup: app routes refused, meta/app/setup 403, ?id=setup empty
platform-core.builtin-apps-nav-render N2 pass Member payloads carry no Setup entries. The member walked all 9 Account hrefs: each rendered (profile, inbox/mine, approvals inbox, sys_account/mine, sessions/mine,…
platform-core.builtin-apps-nav-render N3 pass Member /_console/apps/setup/system/settings/localization rendered inside the Showcase shell (header "Showcase / System / Settings"). Main reads "Access denied: re…
platform-core.v18-boot-refusals 0 pass @756220c4, --maxWorkers=1: @objectstack/runtime organization-ownership-boot-guard.test.ts + .kernel.test.ts 2 files, 32 passed (kernel file = engine layer, real ker…
platform-core.v18-boot-refusals 1 pass OS_DATABASE_URL=file:cA.db os serve -p 42302 --no-ui (17.7.0-born copy): exit 1, 0 'listening'/'Server is ready' lines; '✗ This database carries no organization-o…
platform-core.v18-boot-refusals 2 pass node:sqlite row snapshots: 74 pre-existing tables, 130 rows before = after, 0 value/row/column differences, 0 tables dropped; 40 tables created, all 0 rows; 41 tabl…
platform-core.v18-boot-refusals 3 pass live rig (scratch stack: tiers ['core'], one object with sharingModel 'private', plugins [new SecurityPlugin()]): os serve --dev --no-server --preset minimal exit…
platform-core.v18-boot-refusals N0 pass v18 serve never served the v17 copy (cA, cC refused; os start on cG refused, exit 1, 0 ready lines); row diff zero
records-forms.crud-roundtrip 0 pass form POST /api/v1/data/showcase_account {industry:finance,status:active,sales_region:amer,name:os-qa-e1} → 201 id oUaOvoxyn_YOboWE; filtered GET total 1, all 4 keys…
records-forms.crud-roundtrip 1 pass detail Edit→Update sent one PATCH body {"annual_revenue":1234567} → 200; full-row before/after diff over 23 keys = annual_revenue null→1234567 + updated_at only
records-forms.crud-roundtrip 2 pass row menu Delete → dialog 'Delete Account "os-qa-e1"?' → DELETE /api/v1/data/showcase_account/oUaOvoxyn_YOboWE 200; filtered GET total 0; reloaded list: 0 exact "os-…
records-forms.crud-roundtrip 3 pass after reload at create, the screenshot showed os-qa-e1 with Active/Finance chips and "—" revenue; after delete the screenshot showed the row gone (os-qa-e1-clone an…
records-forms.crud-roundtrip 4 pass History tab (screenshot, then text): "Dev Admin UPDATE · Annual Revenue: — → 1234567"; CREATE expanded "Owner: Dev Admin · Account Name: os-qa-e1 · Industry: Financ…
records-forms.crud-roundtrip 5 pass form create os-qa-e1-华宁 201; filtered GET name hex 6f732d71612d65312de58d8ee5ae81 = sent; $search=华宁 → total 2 [华宁科技, os-qa-e1-华宁]; UI quick-search sent search=华宁 a…
records-forms.crud-roundtrip 6 pass admin clone 201 {id HyoEwsr5…≠sourceId oUaOvoxyn…, record}, diff only id/created_at/updated_at/name(override); member (contributor-bound) clone of seeded zoo FuXmL7…
records-forms.crud-roundtrip 7 pass recipe search:qa-contributor-bound-member: member list 0 → 1 after own invoice; member GET INV-1003 (linus@example.com) 404 (premise); member POST …/showcase_invoic…
records-forms.crud-roundtrip N0 pass Create with empty Account Name: no POST sent, field message "Account Name is required", dialog stays open, count 14→14
records-forms.crud-roundtrip N1 pass no clone carried id/audit/autonumber/readonly (acc[6]); clone of the RLS-invisible INV-1003 refused 404 with no new row (acc[7])
records-forms.crud-roundtrip N2 pass substituted showcase_invoice (name required, no default; account=seeded): POST {account} → 400 VALIDATION_FAILED fields[{field:name,code:required}]
records-forms.crud-roundtrip N3 pass POST showcase_account {name,status:active,tax_id:'abc'} → 400 VALIDATION_FAILED fields[{field:tax_id,code:invalid_format,"Tax ID must look like 12-3456789."}]; coun…
studio-authoring.first-run-loop 0 pass by hand (F1 pin not run, see notes): wizard POST /api/v1/packages {manifest:{name:维修中心,id:com.example.repairs,namespace:repairs}} → 201 {source:authored,status:inst…
studio-authoring.first-run-loop 1 pass after Publish → review sheet → Publish all: POST …/com.example.repairs/publish-drafts 200 publishedCount 1, toast "Published 1 item in this package (one atomic rele…
studio-authoring.first-run-loop 2 pass Studio Records → Add record: POST /api/v1/data/repairs_repair_ticket {name:"Broken boiler QA-E",status:"in_progress"} 201; GET lists 1 row status in_progress
studio-authoring.first-run-loop 3 pass Create app (seed-nav checkbox default ON) → PUT meta/app/repair_center draft → Publish all 200 publishedCount 1; meta/app names [showcase_app,setup,account,repair_c…
studio-authoring.first-run-loop 4 pass studio.boot.log: "Server is ready" ×1; listener pid 14579 started 01:55:49 is unchanged at 02:01 (loop end); no restart line; zero code edits (studio-app tree: no s…
studio-authoring.first-run-loop 5 pass forged PUT meta/object/showcase_qa_probe?mode=draft&package=com.example.showcase&surface=studio → 422 WRITABLE_PACKAGE_REQUIRED "…that package is read-only…"; add-f…
studio-authoring.first-run-loop N0 pass every forged write was refused with a named code and left nothing stored (acc[5]); publish-drafts on com.example.showcase → nothing_to_publish
studio-authoring.first-run-loop N1 pass launcher shows Repair Center; the end-user list renders the label chip "In Progress", not the raw value

Fails — reproduction rules and disposition

None. No clause failed, so:

  • no RUNNER rule 7 verify pass was owed;
  • no product defect is extracted from this record;
  • no authentication or authorization finding exists, and nothing is withheld.

Each runner ran its rule-2 self-checks anyway, with these traps ruled out by evidence:

  • auth-state-leak: identity proven by get-session per persona;
  • stale-console-bundle: entry-chunk sha256 match;
  • hydration-race: screenshot first;
  • automation-input: real typing and ref- or testid-targeted clicks;
  • destructive-in-place: per-sub-case DB copies, and the v17 master was never booted by v18;
  • first-boot-cold-start;
  • dispatcher-vs-hono-route.

One driver artifact was caught and retracted before scoring. A run-unique marker made an invoice name 61 characters long, over its 60-character limit, so one allow cell answered 400. A shorter marker gave a clean second full pass: 164/164.

Derived item verdicts

20 PASS / 3 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN. Of 204 clauses, 201 pass, 3 are blocked and 0 fail. (Corrected by the wave-2 PM session when posting: the runner's draft read 19 PASS / 4 PARTIAL, the wave-1 counts, while its own per-item table and the three PARTIAL items below give 20 / 3.)

Each PARTIAL item carries only a blocked clause beside its passes:

  • access-security.rls-both-sides c5, blocked(dependency): the D11 judgement needs the private write-up the item's knownGaps names (QA run · api-backend (FULL area) · a86db175 · 2026-08-10 · 6 PASS / 2 PARTIAL / 3 FAIL #7463). The skipped-explanation half holds: verify --rls reports 0 HOLES on both summary lines, plus a hand spot-check.
  • access-security.crud-permission-matrix c5, blocked(fixture): the item's own knownGaps[2], the guest anchor that ships unbound on a stock boot.
  • cli.organization-ownership-ceremony c5, blocked(fixture): it needs a showcase DB born under an 18.0.0-next.* build. Building one needs a tag-commit build, which this card's no-repo-change, no-rebuild rule excludes.

Compared with wave-1 #25812 (19 PASS / 4 PARTIAL at 6679644a), access-security.walled-environment-metadata-operator-only moved from PARTIAL to PASS. Its c1 and N0 are now scored, on the prescribed out-of-HTTP grant fixture (Environment fingerprint). Every other verdict holds on the new head and the in-repo Console.

Checklist-accuracy findings, fixture gaps and off-clause probes

Moved to the first comment on this record, to keep the body under the relay's size cap.

Timing

  • Environment preparation:
    • Orchestrator wall: about 10 min (01:29:47–01:39:37Z): install 22 s, pnpm build 9 m 27 s, console copy 1 s.
    • Runner provisioning: about 36 min summed over five runners (boots, scratch copies, the v17 npm fixture, Postgres, personas, approval staging).
  • Testing: about 120 min summed over five runners (Tier 1 pins under the lock, live clause driving, probes). Runner wall time was 01:40–02:08Z.
  • Environment : testing ≈ 46 : 120 ≈ 1 : 2.6.

Supersedes #25812. Every item of that record was re-judged here, so nothing is carried forward.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Checklist-accuracy findings / fixture gaps

    These go to the wave anchor #25807. Per the card they are not extracted, and no ledger edit is made in this run.

    Wave-1 findings for these 23 items: all re-checked against the current revisions. Every one is fixed except one: the stale header of showcase-crud-persona-matrix.dogfood.test.ts (it says 6 delegate × sys_* rows, while the matrix has 4, and it calls the sys_user read self-scoped).

    New findings:

    • access-security.crud-permission-matrix automated.ref (a): it says a delegate's out-of-subtree sys_user_position create answers 403 PERMISSION_DENIED. Live and in showcase-permission-zoo.dogfood.test.ts it now answers 403 DELEGATION_SCOPE_VIOLATION.
    • access-security.walled-environment-metadata-operator-only:
      • knownGaps still says no example app declares the multi-org runtime, but the showcase does, and it booted isolated from the stock tree.
      • steps[0] names showcase_member_access, which the showcase does not define. The probe therefore tests a create, not an edit.
      • The title names install-local, but no step drives it; only the pins cover it.
    • cli.dev-boot-contract steps[4] and steps[9] are stale after cli/dev: on an os dev boot with OS_PORT set, served connector metadata reads the build-time baseUrl (http://127.0.0.1:3000) while dispatch reaches the live port, so /meta disagrees with what runs #26130: os dev now compiles by default when a config exists. A boot "without --compile" therefore prints no staleness warning, so the step needs --no-compile. The RUNNER OS_PORT-connector environment fact ("os dev boots the prebuilt dist unless --compile is passed") is dated by the same change.
    • platform-core.v18-boot-refusals:
      • acc[0].verify still prescribes --maxWorkers=2.
      • steps[1]'s rig stack must declare at least one object. Without one it dies with "Dependency 'com.objectstack.engine.objectql' not found" before the refusal.
    • v17 fixture recipe (v18-boot-refusals and ceremony fixtures.requires): npm install @objectstack/cli@17.7.0 needs --legacy-peer-deps on npm 10.9.4. Without it the install dies with "Cannot read properties of null (reading 'edgesOut')".
    • ai.mcp-stdio-fail-closed: on os start, stdio answers tool calls before the HTTP listener is up, so the REST comparison legs must wait for health 200.
    • platform-core.seed-integrity acc[1]: f_password reads back as the mask "••••••••". A literal Specimen diff therefore shows one difference; the item should list the field as expected-masked.
    • automation.packaged-flow-disable-durable steps 2/8/10: the task POST also needs title. showcase_task has no name field, and a body using name answers 400 INVALID_FIELD.
    • integration-system.datasource-credential-refusal-matrix:
      • The Postgres recipe cannot put the data or socket dir under a session scratchpad: the parent chain is root 0700, and the socket path exceeds the 107-byte limit. What works is a /tmp/RUN-pg dir with unix_socket_directories='', TCP only.
      • A failed connect surfaces its real cause only in the create response's statusReason. POST /:name/test answers "no registered driver to introspect".
    • platform-core.boot-health:
      • The canonical os dev compile prints 65 author-time ⚠ lint lines before the server starts, which a ⚠ grep over the boot log hits. The item does not scope them out.
      • At the default log level no boot line names the Console mount path; it had to be proven by CLI resolution plus a bundle hash.
    • platform-core.builtin-apps-nav-render:
      • knownGaps[2] quotes "HTTP 502 · fetch failed". The page now reads "Failed to load marketplace — The marketplace catalog could not be reached." The wire is still 502 MARKETPLACE_PROXY_FAILED.
      • The console-added reports sidebar entry per app is not mentioned. It was walked in both apps.
    • approvals.account-app-entry:
      • The fixture recipe does not say the invoice's account must be active. The first seeded account (Wonka Brands, churned) answers 400 "This account has churned".
      • acc[3]'s evidence door (GET /approvals/requests/:id) carries no timeline. The appended row is readable only from sys_approval_action, and /approvals/requests/:id/history is 404.
      • acc[0] has the runner run pnpm console:build itself.
    • records-forms.crud-roundtrip:
      • The Accounts entry sits in the collapsed "Data Model" group.
      • The buttons read "Create" and "Update", not "Save".
      • acc[4].verify still cites the retired console pin cf153eb2e535; the spec is ui/e2e/live/record-history-display.spec.ts.
    • studio-authoring.first-run-loop steps: the New-object and Create-app dialogs confirm with "Save as draft", not "Create". Pin F1 (ui/e2e/live/studio-object-designer.spec.ts) was not run because it needs the console dev server, so acc[0] was scored by hand (RUNNER option a).

    Fixture gaps, parked on #25807:

    • the rls D11 private write-up;
    • the guest anchor;
    • the 18.0.0-next.*-born DB;
    • the walled group posture was not booted, so that side of the walled item rests on its pins;
    • no HTTP door places the walled org-scoped manage_metadata grant;
    • the marketplace catalog needs egress to cloud.objectos.ai (the named error state was scored);
    • no fixture throws inside a route, so the ErrorBoundary clause stands on "none encountered".

    Tree hygiene: the repo tree stayed clean (git status --short empty), and examples/app-showcase/.objectstack/installed-packages/ never existed. Three gitignored by-products remain in the checkout; a repo guard hook refused their deletion from the runner seats:

    • examples/app-showcase/e2e/.auth/state.json (the smoke pin's storage state, for a stopped boot);
    • examples/app-showcase/test-results/;
    • examples/app-showcase/.objectstack/data/showcase_external.db (the showcase's external datasource file, created by stock-tree boots).

    Off-clause probes (RUNNER rule 8)

    About 55 minutes across five runners, after every clause had a verdict, on the same boots.

    Doors probed:

    • bulk and side write doors (createMany owner forge, updateMany, deleteMany, /batch);
    • by-id data doors;
    • public-form submit with a forged owner;
    • walled self-escalation (self-grant admin_full_access, PATCH its own grant row);
    • query params ($top/$skip bad values; empty $filter, $select and $orderby; $in [null]; $between reversed or 3-valued; $regex);
    • _activation and /actions;
    • datasource admin and meta doors (unknown name, inline password, secret: "", member writes);
    • MCP stdio (empty and whitespace keys, admin key, sys_user exposure, formula-field aggregates);
    • ceremony re-apply, and os start / os dev over a v17 DB;
    • meta/app ?id= variants (empty, duplicate, case, whitespace);
    • settings namespaces, sign-in and sign-out boundaries;
    • console bad routes;
    • the approvals approve door (double approve, unknown id, actorId forge);
    • clone overrides, Studio package and object doors.

    Personas: admin, operator, walled org owner, baseline and contributor-bound members, liaison, approver, seeded member Mei, anonymous, and a bogus bearer.

    Result: nothing passed the filing gate.

    Observed, not filed (no declared contract, or by design):

    • _activation with an empty body enables the action; enabled is documented as optional.
    • PATCH /datasources/:name {secret:""} binds an empty secret and flips hasSecret to true.
    • POST …/clone {overrides:"x"} answers 201 and ignores the non-object.
    • …/view/view_nope silently renders the default list rather than a named not-found.
    • A prefix-less object is accepted as a draft and refused only at publish (NAMESPACE_PREFIX).
    • os dev over a v17 DB upgrades in place with a backup. That is the documented dev path; the items judge os serve.
    • History shows a currency value raw.
    • At 1366 px, a tab click on the Setup user record page scrolls the main region sideways (seen once, cosmetic).

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out for this record (card W2-C1, priority:P0, 23/23 at 756220c4: 20 PASS / 3 PARTIAL / 0 FAIL). Posted by the wave-2 PM session session_012YjcDon6BvR9MN93ZsFq3U on the runner's behalf; the runner's own session refused the write.

    No clause failed, so nothing needs a four-way disposition and no product defect is extracted. No authentication or authorization finding: nothing is withheld.

    Parked-on: #25807 · access-security.rls-both-sides · c5 blocked(dependency), the D11 judgement needs the private write-up named in knownGaps
    Parked-on: #25807 · access-security.crud-permission-matrix · c5 blocked(fixture), knownGaps[2] guest anchor ships unbound on stock
    Parked-on: #25807 · cli.organization-ownership-ceremony · c5 blocked(fixture), needs a showcase DB born under an 18.0.0-next build
    Superseded-by: none — this record supersedes #25812; every one of its 23 items is re-judged here, nothing is carried forward
    

    Checklist-accuracy findings and fixture gaps are in the first comment on this record and close out on #25807.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out (checklist-test §5) · 2026-10-28T15:31Z. No FAIL in this record. The 3 PARTIAL items are parked on the wave anchor #25807 (the Parked-on: lines above). No defect was extracted from this run. Every verdict has a disposition, so the record closes completed.


    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