Repository navigation
Description
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 --shortempty)./api/v1/healthreportsversion: 18.1.0because 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/consoleat the same commit.pnpm buildran@object-ui/console:buildas a cache miss (hash1ab97949c097c590). pnpm console:build --concurrency=2then ran 72/72 tasks (71 cached).@objectstack/console:build:distcopiedui/apps/console/disttopackages/console/distand 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/distdiffers only insdui.manifest.json, by design (the tracked manifest is copied over). - There is no
.objectui-shapin; that route is retired.
- The Console was built in-repo from
stale-console-bundleis 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.jshas the same sha256 aspackages/console/dist/assets/index-DkQSwG_q.js(c9c69e49…). The CLI resolves@objectstack/consoletopackages/consolein this tree, and no../objectuisibling exists.
- The served dist was built in this run from this commit's
- 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
tarscratch 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-onlythroughos dev, from the stock tree. It printedTenancy: isolatedwith Organizations mounted and no FATAL or DEGRADED line.
- Canonical boot:
- 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@objectstackpackages resolved to 17.7.0. Booted withos startin 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-sessionbefore use. - One fixture write was made outside HTTP: the walled org owner's
manage_metadatagrant row, whichaccess-security.walled-environment-metadata-operator-onlyfixtures prescribe. It was written directly into the run's ownwalled.db, after both HTTP grant doors were measured refusing it (403).
- A v17 SQLite from npm
- Tier 1:
- Every framework file named in the items'
automated.refran 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.tsran against live :42403 withOS_TEST_CHROMIUM_EXECUTABLE_PATH=/opt/pw-browsers/chromium. - Every pin was green.
- Every framework file named in the items'
- 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 withnode 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-blockedwas not passed, so it is not recorded as an item of this run. - 0
planneditems 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 overnegative[]. - 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 |
| 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 byget-sessionper 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-sidesc5, 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 --rlsreports 0 HOLES on both summary lines, plus a hand spot-check.access-security.crud-permission-matrixc5, blocked(fixture): the item's own knownGaps[2], the guest anchor that ships unbound on a stock boot.cli.organization-ownership-ceremonyc5, 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 build9 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).
- Orchestrator wall: about 10 min (01:29:47–01:39:37Z): install 22 s,
- 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
objectstack-fleet commentedon Oct 27, 2026
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 thesys_userread self-scoped).New findings:
access-security.crud-permission-matrixautomated.ref (a): it says a delegate's out-of-subtreesys_user_positioncreate answers403 PERMISSION_DENIED. Live and inshowcase-permission-zoo.dogfood.test.tsit now answers403 DELEGATION_SCOPE_VIOLATION.access-security.walled-environment-metadata-operator-only:showcase_member_access, which the showcase does not define. The probe therefore tests a create, not an edit.cli.dev-boot-contractsteps[4] and steps[9] are stale after cli/dev: on anos devboot withOS_PORTset, served connector metadata reads the build-timebaseUrl(http://127.0.0.1:3000) while dispatch reaches the live port, so/metadisagrees with what runs #26130:os devnow 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 devboots the prebuilt dist unless--compileis passed") is dated by the same change.platform-core.v18-boot-refusals:--maxWorkers=2.fixtures.requires):npm install @objectstack/cli@17.7.0needs--legacy-peer-depson npm 10.9.4. Without it the install dies with "Cannot read properties of null (reading 'edgesOut')".ai.mcp-stdio-fail-closed: onos start, stdio answers tool calls before the HTTP listener is up, so the REST comparison legs must wait for health 200.platform-core.seed-integrityacc[1]:f_passwordreads 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-durablesteps 2/8/10: the task POST also needstitle.showcase_taskhas nonamefield, and a body usingnameanswers 400 INVALID_FIELD.integration-system.datasource-credential-refusal-matrix:/tmp/RUN-pgdir withunix_socket_directories='', TCP only.statusReason.POST /:name/testanswers "no registered driver to introspect".platform-core.boot-health:os devcompile 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.platform-core.builtin-apps-nav-render:MARKETPLACE_PROXY_FAILED.reportssidebar entry per app is not mentioned. It was walked in both apps.approvals.account-app-entry:GET /approvals/requests/:id) carries no timeline. The appended row is readable only fromsys_approval_action, and/approvals/requests/:id/historyis 404.pnpm console:builditself.records-forms.crud-roundtrip:cf153eb2e535; the spec isui/e2e/live/record-history-display.spec.ts.studio-authoring.first-run-loopsteps: 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:
groupposture was not booted, so that side of the walled item rests on its pins;manage_metadatagrant;Tree hygiene: the repo tree stayed clean (
git status --shortempty), andexamples/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:
/batch);admin_full_access, PATCH its own grant row);_activationand/actions;secret: "", member writes);sys_userexposure, formula-field aggregates);os start/os devover a v17 DB;?id=variants (empty, duplicate, case, whitespace);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):
_activationwith an empty body enables the action;enabledis documented as optional.PATCH /datasources/:name {secret:""}binds an empty secret and flipshasSecretto true.POST …/clone {overrides:"x"}answers 201 and ignores the non-object.…/view/view_nopesilently renders the default list rather than a named not-found.os devover a v17 DB upgrades in place with a backup. That is the documented dev path; the items judgeos serve.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Close-out for this record (card W2-C1,
priority:P0, 23/23 at756220c4: 20 PASS / 3 PARTIAL / 0 FAIL). Posted by the wave-2 PM sessionsession_012YjcDon6BvR9MN93ZsFq3Uon 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.
Checklist-accuracy findings and fixture gaps are in the first comment on this record and close out on #25807.
Generated by Claude Code
objectstack-fleet commentedon Oct 28, 2026
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 closescompleted.Generated by Claude Code