Repository navigation
QA run · priority:P0 (23/23) · 5b14b7f3 · 2026-10-19 · 17 PASS / 5 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN #24556
Description
QA run record for selector priority:P0 of the 18.0 release sweep (plan B: Tier 1 + Tier 2, Tier 3 deferred). Run by the checklist-test skill following docs/qa/platform-checklist/RUNNER.md.
Environment fingerprint
- framework:
5b14b7f3ad8e2e0786d228772f473d07b36b2477(objectstack-ai/objectstackmain), tree clean,pnpm install --frozen-lockfile+pnpm build76/76 green - console:
.objectui-sha=4016370af3c9c9dafec2bc5299afd8e8079701b8, built withpnpm objectui:build;packages/console/dist/.objectui-shastamp equals the pin (pnpm check:console-shagreen), sostale-console-bundleis ruled out for every console observation - app:
examples/app-showcase, bootOS_PORT=PORT pnpm -C examples/app-showcase exec objectstack dev --ui --seed-admin -p PORT -d file:SCRATCH/db/BATCH/ITEM.db(one file DB per item, own port per item in ranges 41100–41999, at most one server per runner at a time); seed:--seed-admin(admin@objectos.ai) + showcase seed 132 rows; demo personas fromexamples/app-showcase/src/security/demo-personas.ts - Tier 1: every framework file named in the items'
automated.ref, one vitest invocation per owning package (pnpm exec vitest run --maxWorkers=1 FILESinside the package; 33 packages, 254 files incl. one Playwright spec) - date: 2026-10-19 (UTC), container Linux 4 vCPU / 16 GB; runner: one orchestrator + 5 runner subagents (default judgment tier) in parallel, plus independent RUNNER rule 7 verifiers
Scope
Selector priority:P0 resolved with node scripts/checklist-select.mjs priority:P0 --json → 23 runnable items (1 blocked, hidden, not run: --include-blocked not passed per plan); 0 planned items matched. Item · revision · derived verdict:
| item | rev | verdict |
|---|---|---|
| access-security.rls-both-sides | 6 | PARTIAL |
| access-security.write-path-guards | 5 | PASS |
| access-security.crud-permission-matrix | 6 | PARTIAL |
| access-security.owd-sharing-matrix | 3 | PASS |
| access-security.anonymous-deny-surfaces | 3 | PASS |
| access-security.walled-environment-metadata-operator-only | 1 | PARTIAL |
| ai.mcp-stdio-fail-closed | 6 | PASS |
| api-backend.query-contract-matrix | 3 | PASS |
| api-backend.packaged-action-disabled-dispatch | 3 | PASS |
| approvals.account-app-entry | 2 | PASS |
| automation.packaged-flow-disable-durable | 3 | PASS |
| cli.dev-boot-contract | 5 | PASS |
| cli.organization-ownership-ceremony | 1 | PARTIAL |
| identity-auth.default-organization-boot-invariant | 1 | PASS |
| integration-system.datasource-credential-refusal-matrix | 4 | PARTIAL |
| platform-core.boot-health | 7 | PASS |
| platform-core.seed-integrity | 3 | PASS |
| platform-core.console-login | 4 | PASS |
| platform-core.nav-surfaces-render | 6 | PASS |
| platform-core.builtin-apps-nav-render | 6 | PASS |
| platform-core.v18-boot-refusals | 1 | FAIL |
| records-forms.crud-roundtrip | 10 | PASS |
| studio-authoring.first-run-loop | 3 | PASS |
Hidden blocked item (not run, per plan): access-security.no-active-org-session-semantics. Tier split: 14 items pinned (Tier 1 vitest + live drive of every non-test clause), 9 unpinned (Tier 2, every clause driven by hand: 3 api/cli, 6 browser/mixed against the console built at the pin). No Tier 3 (unpinned P2) item is in this selector, so nothing was deferred under the plan. Pin evidence: 58 pinned items across both selectors, 253 framework pin files, 0 failed, 0 zero-test files; platform-core.nav-surfaces-render's Playwright pin examples/app-showcase/e2e/showcase-smoke.spec.ts ran against a live boot with OS_TEST_CHROMIUM_EXECUTABLE_PATH=/opt/pw-browsers/chromium: 49 passed.
Per-clause verdicts
Clause ids are 0-based over acceptance[]; N0… are negative[]. Evidence is text server truth (API / log / build / test output). Clauses whose oracle is test cite the Tier 1 pin run.
| item | clause | oracle | verdict | evidence |
|---|---|---|---|---|
| access-security.rls-both-sides | 0 | api | pass | as A (get-session=rls-a@verify.test) GET /data/showcase_private_note → 200 titles [A note 1, A note 2], owner_id=A, no B row; as B (get-session=rls-b) → 200 [B note 1] o… |
| access-security.rls-both-sides | 1 | api | pass | as A GET /data/showcase_private_note/‹B id> → 404 RECORD_NOT_FOUND (not-found-shaped denial) |
| access-security.rls-both-sides | 2 | api | pass | as A PATCH /‹B id> {body:'forged'} → 404 RECORD_NOT_FOUND; admin re-read body='b-original' unchanged (pre/post identical); A DELETE → 403 PERMISSION_DENIED; control: B P… |
| access-security.rls-both-sides | 3 | api | pass | admin GET list → 200 with all 3 ids created this run (2×A, 1×B) |
| access-security.rls-both-sides | 4 | test | pass | live objectstack verify --rls (exit 0): per-persona probe line '21 PROVEN (21 consistent, 0 HOLES) · 3 NOT PROVEN (0 member-visible, 0 probe-blocked, 3 skipped)'; tota… |
| access-security.rls-both-sides | 5 | test | blocked(dependency: D11 spot-check needs the maintainer-hel… | skipped-explanation half holds: 3 skipped rows each carry a benign detail — showcase_project_membership 'no plain-text probe field', showcase_ext_customer / showcase_ext… |
| access-security.rls-both-sides | N0 | api | pass | forged PATCH answered 404 and admin re-read shows row unchanged |
| access-security.rls-both-sides | N1 | api | pass | D11 verdict recorded only here (owd-sharing-matrix clause 4 cross-references) |
| access-security.rls-both-sides | N2 | api | pass | naming collision respected — no bare handle cited |
| access-security.write-path-guards | 0 | api | pass | admin POST /data/showcase_contact {lead_score:10} → 201, header x-objectstack-dropped-fields 'lead_score;reason=readonly', body droppedFields [{fields:[lead_score],reaso… |
| access-security.write-path-guards | 1 | api | pass | PATCH {lead_score:99} → 200 with droppedFields readonly; GET before/after both null |
| access-security.write-path-guards | 2 | api | pass | as Alice POST note {owner_id:‹Bob>} → 403 PERMISSION_DENIED ('creating a record owned by another user requires the transfer grant'); admin full list has 0 rows titled 'p… |
| access-security.write-path-guards | 3 | api | pass | Alice POST {owner_id:‹Alice>} → 201 owner=Alice; PATCH owner_id=‹Bob> → 403, owner_id=null → 403 PERMISSION_DENIED; admin re-read owner_id=Alice |
| access-security.write-path-guards | 4 | api | pass | Alice POST /createMany bare array of 3 → 201; all 3 owner_id=Alice's sys_user id; {records:[…]} wrapper → 400 VALIDATION_FAILED |
| access-security.write-path-guards | 5 | api | pass | seeded paid INV-1003: PATCH tax_rate 15 → 200 droppedFields reason readonly_when, re-read 8; its line PATCH quantity/unit_price/product → 200 all three dropped readonly_… |
| access-security.write-path-guards | 6 | api | pass | updateMany [valid, qty -1, valid] continueOnError:true → succeeded 2 failed 1, row1 VALIDATION_FAILED 'Qty must be ≥ 0'; re-reads rows 0/2 changed (8, 12), row1 unchange… |
| access-security.write-path-guards | N0 | api | pass | admin POST note owner_id=‹Bob> → 201 owner=Bob; admin PATCH owner transfer → 200 and persisted (both notes) |
| access-security.write-path-guards | N1 | test | pass | pin run: 5 pin file(s), 72 tests, 0 failed (vitest --maxWorkers=1 @ 5b14b7f) |
| access-security.crud-permission-matrix | 0 | api | pass | 45-row access-matrix.json recounted: 41 showcase_* rows = 164 cells, 87 allow/77 deny after baseline union, 9 baseline flips all 2xx; every allow cell 2xx + effect prove… |
| access-security.crud-permission-matrix | 1 | api | pass | all 77 showcase_* deny cells → 403 PERMISSION_DENIED; delegate deny cells: sys_business_unit & _member create/edit/delete 403 PERMISSION_DENIED, sys_user edit 403, sys_u… |
| access-security.crud-permission-matrix | 2 | api | pass | every denied create: admin listing count of rows with the run's unique marker = 0 |
| access-security.crud-permission-matrix | 3 | api | pass | auditor GET by id + list → 200/contained for foreign private_note, inquiry, invoice, invoice_line; contrast: contributor 404 + absent (note, inquiry), ops 404 absent (no… |
| access-security.crud-permission-matrix | 4 | api | pass | ops PATCH admin-owned announcement → 200, re-read changed; member_default identical PATCH → 403 PERMISSION_DENIED, re-read unchanged |
| access-security.crud-permission-matrix | 5 | api | blocked(fixture: guest anchor unbound on stock boot; member… | per knownGaps |
| access-security.crud-permission-matrix | 6 | api | pass | verdict per cell recorded for all 9 sets: 164 showcase_* cells + 16 delegate×sys_* cells (crud-cells.json in scratch G/) |
| access-security.crud-permission-matrix | N0 | api | pass | one deny cell per set re-run as admin: auditor inquiry edit 403→200, liaison brief delete 403→200, contributor account create 403→201, executive inquiry edit 403→200, gu… |
| access-security.crud-permission-matrix | N1 | api | pass | no withheld cell answered 2xx |
| access-security.owd-sharing-matrix | 0 | api | pass | private: B list excludes A's note, B GET by id 404, B PATCH 404 (admin re-read body 'orig'); A GET 200, A PATCH 200 persisted |
| access-security.owd-sharing-matrix | 1 | api | pass | public_read: admin announcement; B list contains it, B GET by id 200; B PATCH → 403 PERMISSION_DENIED, re-read title unchanged |
| access-security.owd-sharing-matrix | 2 | api | pass | ops PATCH same announcement → 200, re-read 'OPS-edit' |
| access-security.owd-sharing-matrix | 3 | api | pass | public_read_write: C1 (contributor) GET admin project 200, PATCH name → 200 persisted; A (member_default) PATCH → 403 PERMISSION_DENIED, row unchanged |
| access-security.owd-sharing-matrix | 4 | api | pass | cbp: C1 created invoice (owner=C1 email) + line 201; C2 list excludes line, by-id 404, PATCH 404 (re-read unchanged), DELETE 403; C1 list/GET/PATCH 200 persisted. D11 cr… |
| access-security.owd-sharing-matrix | 5 | api | pass | auditor list contains C1's line; by-id 200 |
| access-security.owd-sharing-matrix | 6 | api | pass | all four models driven per persona-verb |
| access-security.owd-sharing-matrix | N0 | api | pass | forged direct PATCH by B on public_read announcement → 403, unchanged |
| access-security.owd-sharing-matrix | N1 | api | pass | C1 runs the same line probes → 200 (route works; denial is derivation) |
| access-security.anonymous-deny-surfaces | 0 | api | pass | anonymous (get-session 401): data, meta, actions, automation/_status, batch, security/explain, analytics query/sql/meta → all 401 code UNAUTHENTICATED |
| access-security.anonymous-deny-surfaces | 1 | api | pass | POST /actions/showcase_task/showcase_mark_done/anon-probe-id anon → 401 (member contrast → 404 RECORD_NOT_FOUND) |
| access-security.anonymous-deny-surfaces | 2 | api | pass | rest-flat {error,code,message}, no success: data/meta/batch/security; dispatcher-wrapper {success:false,error:{code,message,httpStatus:401}}: actions/automation/3 analyt… |
| access-security.anonymous-deny-surfaces | 3 | api | pass | anon: query/sql valid + malformed and meta → 401 dispatcher-wrapper; member: query 200 (count 10), sql 200, meta 200, malformed query/sql → 400 VALIDATION_FAILED |
| access-security.anonymous-deny-surfaces | 4 | api | pass | member GET /data/showcase_private_note → 200, GET /meta → 200 |
| access-security.anonymous-deny-surfaces | 5 | api | pass | anonymous GET /forms/contact-us → 200 {slug:'contact-us',object:'showcase_inquiry',…} |
| access-security.anonymous-deny-surfaces | 6 | api | pass | all 7 variant families driven (analytics at 3 faces) |
| access-security.anonymous-deny-surfaces | N0 | api | pass | anon DELETE /automation/showcase_reassign_wizard → 401 dispatcher-wrapper; admin GET same → 200 flow still registered |
| access-security.walled-environment-metadata-operator-only | 0 | test | pass | pin run: 7 pin file(s), 130 tests, 0 failed (vitest --maxWorkers=1 @ 5b14b7f) |
| access-security.walled-environment-metadata-operator-only | 1 | api | blocked(fixture: walled posture cannot be booted on 18.0 — … | boot log: '✖ FATAL: tenancy posture 'isolated' is not supported in 18.0 (NOT_IMPLEMENTED). Refusing to boot … the HTTP server was never started' |
| access-security.walled-environment-metadata-operator-only | 2 | api | blocked(fixture: walled posture cannot be booted on 18.0 — … | walled-operator half unrunnable. Single-posture half measured and holds: admin (get-session admin@objectos.ai, platform_admin) PUT /api/v1/meta/object/qa_walled_probe {n… |
| access-security.walled-environment-metadata-operator-only | N0 | api | blocked(fixture: walled posture cannot be booted on 18.0 — … | no walled boot possible |
| ai.mcp-stdio-fail-closed | 0 | log | pass | stdio on, key unset: process exit 1, stderr "[MCP] The stdio transport is enabled (OS_MCP_STDIO_ENABLED / autoStart) but OS_MCP_STDIO_API_KEY is not set. … Refusing to s… |
| ai.mcp-stdio-fail-closed | 1 | log | pass | osk_unknown: exit 1, "[MCP] OS_MCP_STDIO_API_KEY did not resolve to a valid identity (unknown / revoked / expired / owner-less). Refusing to start stdio (ADR-0101)."; re… |
| ai.mcp-stdio-fail-closed | 2 | log | pass | "[MCP] stdio transport principal-bound to OS_MCP_STDIO_API_KEY identity DvzFELfpPw5c6dpvzXNVqSHicKL5YfcR (RLS/FLS/tenant applied)" = contributor member userId from sign-… |
| ai.mcp-stdio-fail-closed | 3 | api | pass | RLS (contributor key): MCP query_records showcase_invoice → 2 rows [INV-QA-MCP-1,-2] = member REST (Bearer same key) 2 rows, identical field sets; admin REST 14 rows. ge… |
| ai.mcp-stdio-fail-closed | 4 | api | pass | count by status, member MCP aggregate_records → [{draft:2}] = member REST POST /data/showcase_invoice/query aggregate [{draft:2}]; admin REST [{draft:4},{paid:5},{sent:5… |
| ai.mcp-stdio-fail-closed | 5 | api | pass | liaison MCP aggregate sum(budget), count groupBy budget, count_distinct(spent) → isError {code PERMISSION_DENIED, status 403, message "[Security] Field read denied: not … |
| ai.mcp-stdio-fail-closed | 6 | api | pass | same session: pre-revoke query_records 2 rows; PATCH /api/v1/data/sys_api_key/UndscXiXI3IAZTDr {revoked:true} → 200; next query_records → result.isError true, text parse… |
| ai.mcp-stdio-fail-closed | 7 | log | pass | os start with neither OS_MCP_STDIO_ENABLED nor key: health 200, stdout 0 bytes, stderr "[MCP] Transport not auto-started (HTTP is served per-request at /api/v1/mcp regar… |
| ai.mcp-stdio-fail-closed | N0 | api | pass | no invalid/revoked key ever produced a serving process (health refused) or a served read |
| ai.mcp-stdio-fail-closed | N1 | api | pass | member MCP rows ⊆ member REST rows (equal sets) |
| ai.mcp-stdio-fail-closed | N2 | api | pass | member MCP count 2 ≠ admin total 14 |
| ai.mcp-stdio-fail-closed | N3 | api | pass | masked-field aggregates refused, no number |
| ai.mcp-stdio-fail-closed | N4 | api | pass | post-revoke call carried API_KEY_REVOKED and no row |
| api-backend.query-contract-matrix | 0 | api | pass | 20 operator variants × 3 spellings ($-object POST, AST array POST, GET $filter AST) — all OK set-equal vs locally computed ids from the 14-row account / 10-row task base… |
| api-backend.query-contract-matrix | 1 | api | pass | GET $orderby=name&$top=3&$skip=2 = sorted[2..4]; $top=4&$skip=7 = sorted[7..10]; POST {orderBy,limit:3,offset:2} and {top:4,offset:7} equal the same slices |
| api-backend.query-contract-matrix | 2 | api | pass | $select=name,status and body fields [name,status] → every record keys exactly ["name","status"]; fields ["account.name"] on showcase_invoice → 400 INVALID_FIELD, message… |
| api-backend.query-contract-matrix | 3 | api | pass | $orderby annual_revenue asc/desc and POST orderBy asc/desc: full 14-value sequence equals local sort; $orderby=no_such_field → 400 INVALID_SORT, POST orderBy same → 400 … |
| api-backend.query-contract-matrix | 4 | api | pass | contributor member (invite+sign-up+contributor position) POST /data/showcase_invoice/query {where name INV-QA-H1, expand contact} → own invoice returned, contact left as… |
| api-backend.query-contract-matrix | 5 | api | pass | POST where {status:{$nin:"done"}} → 400 VALIDATION_FAILED fields[0].field "query.where.status.$nin" message names $nin, status, ARRAY; AST [status,not_in,done] → 400 VAL… |
| api-backend.query-contract-matrix | 6 | api | pass | ?$pageSize=5 → 400 UNSUPPORTED_QUERY_PARAM listing $top,$skip,$orderby,$select,$count,$search,$searchFields,$filter,$expand; ?not_a_field=x → 400 INVALID_FIELD; where {n… |
| api-backend.query-contract-matrix | 7 | api | pass | $in [] → 200 0 rows; $nin [] → 200 10/10 task rows (set-equal) |
| api-backend.query-contract-matrix | 8 | api | pass | every variant recorded: 16 op variants (plus date-between, no-wildcard like, 2 task-typed) + params $top,$skip,$select,$orderby,$count (total 14 with 2 rows),$search (No… |
| api-backend.query-contract-matrix | N0 | api | pass | {limit:"ten"} → 400 VALIDATION_FAILED; {not_a_query_key:{a:1}} → 400 INVALID_FIELD; neither returned records |
| api-backend.packaged-action-disabled-dispatch | 0 | api | pass | stock: no ledger row for showcase_mark_done; POST /actions/_activation/showcase_task/showcase_mark_done {enabled:false} → 200; ledger row {metadata_type:action,name:show… |
| api-backend.packaged-action-disabled-dispatch | 1 | api | pass | param_gallery disabled + {recordId bogus, params:{bogus_key:1}} → 409 ACTION_DISABLED; re-enabled identical request → 400 VALIDATION_ERROR "Invalid action params: Action… |
| api-backend.packaged-action-disabled-dispatch | 2 | api | pass | both disabled traces 409 with a nonexistent recordId in play and no mutation; enabled-control caveat noted (record load is best-effort, no 404 expected) |
| api-backend.packaged-action-disabled-dispatch | 3 | api | pass | showcase_zoo_perm_missing enabled → 403 PERMISSION_DENIED "…requires capability [showcase.restricted_ops]…"; disabled → 403 identical body (byte-equal true) |
| api-backend.packaged-action-disabled-dispatch | 4 | api | pass | live POST /api/v1/mcp tools/call run_action {actionName:showcase_portfolio_snapshot}: enabled → ok result; disabled (/_activation/global/…) → isError, {error:{code:ACTIO… |
| api-backend.packaged-action-disabled-dispatch | 5 | api | pass | after full restart: ledger row active:false still present; invoke → 409 ACTION_DISABLED; re-enable → 200; invoke real task → 200 {ok:true} (progress 0→100); same row id … |
| api-backend.packaged-action-disabled-dispatch | 6 | api | pass | showcase_bulk_reassign disabled → 409 ACTION_DISABLED naming showcase_bulk_reassign; no ledger row for target flow showcase_reassign_wizard; re-enabled control → 200 sta… |
| api-backend.packaged-action-disabled-dispatch | N0 | api | pass | no 400/handler answer for any disabled action |
| api-backend.packaged-action-disabled-dispatch | N1 | api | pass | unentitled caller got 403 not 409; stock boot had no ledger row and actions dispatched (bulk_reassign/portfolio controls 200) |
| api-backend.packaged-action-disabled-dispatch | N2 | api | pass | anonymous POST /actions/showcase_task/showcase_mark_done → 401 UNAUTHENTICATED |
| approvals.account-app-entry | 0 | build | pass | packages/console/dist/.objectui-sha = 4016370af3c9c9dafec2bc5299afd8e8079701b8 == .objectui-sha; grep of dist/assets/index-a3aFDTDQ.js (entry chunk): '…as({ref:`approval… |
| approvals.account-app-entry | 1 | screenshot | pass | clicked the account app's Inbox → 'Approvals' sidebar entry (href /_console/apps/com.objectstack.account/component/approvals/inbox); landed that URL; screenshot: 'Approv… |
| approvals.account-app-entry | 2 | api | pass | persona qa-approver-i@verify.test (admin create-user → change-password; sys_user_position contributor + finance; get-session positions [org_member, contributor, finance,… |
| approvals.account-app-entry | 3 | api | pass | request areq_02d7f853… (launched by persona PATCH of own invoice INV-QA-I-1 status=sent): before GET /api/v1/approvals/requests/:id pending_approvers [persona, admin, ad… |
| approvals.account-app-entry | 4 | screenshot | pass | cold load /_console/apps/com.objectstack.account/component/approvals/inbox?request=areq_02d7f853… (2 fresh loads) → drawer opened on that request (INV-QA-I-1, Finance + … |
| approvals.account-app-entry | 5 | dom | pass | after screenshot of the list: record link href = /_console/apps/com.objectstack.account/showcase_invoice/record/35zoZgHUw-ArB1oK (current app segment, not setup); person… |
| approvals.account-app-entry | 6 | screenshot | pass | interface language set via the login-page globe menu (option '中文', html lang 'zh'): account sidebar entry reads 待我审批; tabs 待我审批 / 我发起的 / 全部; status badge 待审批 in the All … |
| approvals.account-app-entry | N0 | screenshot | pass | full inbox rendered, no component-not-found state |
| approvals.account-app-entry | N1 | api | pass | Approvals entry present for the non-admin; setup absent for the same session |
| automation.packaged-flow-disable-durable | 0 | api | pass | POST /automation/showcase_urgent_task_alert/toggle {enabled:false} → 200; GET /data/sys_metadata_activation → exactly 1 row {id:-iXdUI7AO17xTUTx, metadata_type:flow, nam… |
| automation.packaged-flow-disable-durable | 1 | api | pass | POST /automation/showcase_urgent_task_alert/trigger → 409 FLOW_DISABLED "Flow 'showcase_urgent_task_alert' is disabled — it is switched off for this installation in the … |
| automation.packaged-flow-disable-durable | 2 | api | pass | new process: GET /automation/_status → {enabled:false,bound:false}; boot log (info) "[Automation] Activation ledger: 1 packaged flow(s) are switched off for this install… |
| automation.packaged-flow-disable-durable | 3 | api | pass | runs list 1 before post-restart urgent create, 1 after (no new run); baseline create pre-toggle had produced 1 run, same-boot disabled create 0 |
| automation.packaged-flow-disable-durable | 4 | api | pass | toggle {enabled:true} → 200; same row id -iXdUI7AO17xTUTx now active:true (updated_at bumped, 1 row); _status enabled:true bound:true; final urgent create → runs 2 |
| automation.packaged-flow-disable-durable | N0 | api | pass | toggle wrote the row |
| automation.packaged-flow-disable-durable | N1 | api | pass | restart did not re-arm (bound false, no run) |
| automation.packaged-flow-disable-durable | N2 | api | pass | row not deleted on re-enable |
| automation.packaged-flow-disable-durable | N3 | api | pass | ledger clause scored on message text, not code alone |
| cli.dev-boot-contract | 0 | api | pass | dev --ui --seed-admin -p 41807: /api/v1/health 200 after 13 s; /api/v1/ready 200 {status:ready,state:running}; /_console/ 200 text/html, headless screenshot showed the O… |
| cli.dev-boot-contract | 1 | api | pass | sign-in admin@objectos.ai/admin123 → 200 + token; restart same DB with --admin-password changed99 → admin123 200 token, changed99 401 INVALID_EMAIL_OR_PASSWORD |
| cli.dev-boot-contract | 2 | log | pass | Database lines: -d file:… → that file; OS_DATABASE_URL=file:…devboot-env.db → env file; -d :memory: → ":memory:"; config-declared default (named sqlite datasource qa_hom… |
| cli.dev-boot-contract | 3 | log | pass | --fresh: "🧪 Fresh OS_HOME: /tmp/objectstack-dev-vo6Duz", Database file:/tmp/objectstack-dev-vo6Duz/data/objectstack.db; SIGINT exit 130; dir gone after exit; ‹cwd>/.obj… |
| cli.dev-boot-contract | 4 | log | pass | B on busy 41808: "↪ server bound to port 41809 (requested 41808)", API/Console URLs printed with 41809, health on 41809 200 |
| cli.dev-boot-contract | 5 | log | pass | after touching src/ui/actions/index.ts: "⚠ dist/objectstack.json is OLDER than your sources — this boot serves the STALE build. newest source: src/ui/actions/index.ts (2… |
| cli.dev-boot-contract | 6 | log | pass | empty dir: exit 1, stdout "✗ Config file not found in …", stderr "Run in a directory with objectstack.config.ts, pass --artifact ‹path|url>, or run from the monorepo ro… |
| cli.dev-boot-contract | N0 | log | pass | nothing-chosen default is persistent file (marker survived restart) |
| cli.dev-boot-contract | N1 | log | pass | --database-driver memory → INVOCATION ERROR oclif allowlist, exit 2; OS_DATABASE_DRIVER=mingo → refused before any Database line, exit 1, names --fresh and :memory:; -d … |
| cli.dev-boot-contract | N2 | log | pass | legacy dev.db read with notice; no empty objectstack.db created beside it |
| cli.dev-boot-contract | N3 | log | pass | shifted port reported |
| cli.organization-ownership-ceremony | 0 | test | pass | pin run: 7 pin file(s), 162 tests, 0 failed (vitest --maxWorkers=1 @ 5b14b7f) |
| cli.organization-ownership-ceremony | 1 | build | skipped | capability withdrawn in 18.0 (ruling record 6259608309, commit 5b14b7f #24506): bare os migrate organization-ownership --database-url file:cer.db → exit 1 '✗ os migra… |
| cli.organization-ownership-ceremony | 2 | build | skipped | same withdrawal: --apply --backup-taken (no plan), --apply --plan-file ‹foreign plan>, --apply with a second process holding the file, and --json each exit 1 with the NO… |
| cli.organization-ownership-ceremony | 3 | build | pass | drop-gate half (driveable without the ceremony): os migrate apply --allow-destructive --yes on v17 copy gate.db → exit 1 '✗ Refusing this --allow-destructive run: it w… |
| cli.organization-ownership-ceremony | 4 | log | skipped | no migrated copy can exist in 18.0 (ceremony refuses NOT_IMPLEMENTED); the before-state refusal is covered in platform-core.v18-boot-refusals |
| cli.organization-ownership-ceremony | N0 | build | pass | every refusing ceremony arm (bare, 3× --apply variants, --json) left cer.db byte- and logically identical (sha 28faf786…, dbdiff 0); the refused drop-gate run left gate.… |
| identity-auth.default-organization-boot-invariant | 0 | test | pass | pin run: 2 pin file(s), 59 tests, 0 failed (vitest --maxWorkers=1 @ 5b14b7f) |
| identity-auth.default-organization-boot-invariant | 1 | log | pass | fresh DB: sys_organization row {id:org_mvf9n2x7e56ow4f5, slug:'default', name:'Default Organization', created_at:2026-10-19T13:04:08.592Z} precedes the first user admin@… |
| identity-auth.default-organization-boot-invariant | 2 | api | pass | GET /api/v1/data/sys_member (admin) → 200: admin user role 'owner' org_mvf9n2x7e56ow4f5; member1@example.com (POST /auth/admin/create-user → 200 mustChangePassword:true,… |
| identity-auth.default-organization-boot-invariant | 3 | api | pass | GET /api/v1/data/sys_business_unit → 5 seeded rows (bu_acme, bu_field_ops, bu_west_coast, bu_east_coast, bu_hq_finance) all organization_id org_mvf9n2x7e56ow4f5 |
| identity-auth.default-organization-boot-invariant | N0 | api | pass | scratch-DB scan of every table with an organization_id column after boot+seed: 32 non-empty tables (sys_member, sys_user_position, sys_business_unit, sys_approval_*, sys… |
| integration-system.datasource-credential-refusal-matrix | 0 | build | pass | 11 door variants, os build exit 2 AND POST /api/v1/datasources 400 DATASOURCE_ADMIN_ERROR for each, every message naming the key/position and external.credentialsRef: co… |
| integration-system.datasource-credential-refusal-matrix | 1 | api | blocked(environment: no reachable credential-protected post… | publish half observed: credentialsRef datasource accepted build exit 0 and POST 201 (status error — secret not resolvable / ECONNREFUSED 127.0.0.1:5432); connect not pro… |
| integration-system.datasource-credential-refusal-matrix | 2 | api | pass | admin: GET /datasources/‹n> and GET /meta/datasource/‹n> for qa_set, qa_unset, qa_enc_rt, qa_legacy_*: zero PLANT- strings in full bodies; config identical on both doors… |
| integration-system.datasource-credential-refusal-matrix | 3 | api | pass | GET /datasources/qa_set → hasSecret:true, redactedConfigKeys:[] (meta door external.credentialsRef sys_secret:sec_…); qa_unset → hasSecret:false, no credentialsRef; qa_e… |
| integration-system.datasource-credential-refusal-matrix | 4 | api | pass | planted rows (server stopped): postgres config {passwd,pwd}, turso {token,jwt,auth_token,authtoken}; after reboot both doors serve config {url} only, admin door redacted… |
| integration-system.datasource-credential-refusal-matrix | 5 | api | pass | unknown driver qa_plugin_driver (POST 201): password, authToken absent and url userinfo stripped (qadb://qa@host:1/db) on both doors, redactedConfigKeys ["authToken","pa… |
| integration-system.datasource-credential-refusal-matrix | 6 | api | blocked(environment: no reachable postgres for the connect … | partial reading: GET /datasources/qa_set then PATCH with its config unmodified → 200; afterwards hasSecret still true and meta-door credentialsRef unchanged (sys_secret:… |
| integration-system.datasource-credential-refusal-matrix | 7 | api | pass | authenticated contributor member: both doors 403 PERMISSION_DENIED (manage_platform_settings); anonymous: 401 UNAUTHENTICATED on both; no PLANT- strings; data API sys_me… |
| integration-system.datasource-credential-refusal-matrix | N0 | api | pass | no canonical credential in any read; only the ruled-boundary apiSecret |
| integration-system.datasource-credential-refusal-matrix | N1 | build | pass | build and runtime doors agree on every variant |
| integration-system.datasource-credential-refusal-matrix | N2 | api | pass | both doors redact identically |
| integration-system.datasource-credential-refusal-matrix | N3 | api | pass | legacy aliases redacted |
| integration-system.datasource-credential-refusal-matrix | N4 | api | pass | unknown driver canonical keys redacted |
| integration-system.datasource-credential-refusal-matrix | N5 | api | pass | echoed config did not drop the bound secret (stored half) |
| integration-system.datasource-credential-refusal-matrix | N6 | build | pass | every refusal names credentialsRef / credentialRef |
| platform-core.boot-health | 0 | api | pass | GET /api/v1/health → 200 {status:ok, version 18.0.0-next.5} at 10.0 s after process start (polled 1 s) |
| platform-core.boot-health | 1 | api | pass | GET /api/v1/ready → 200 {status:'ready', state:'running'} right after health went green |
| platform-core.boot-health | 2 | log | pass | Boot log (captured before any probe besides health/ready): Flows banner '32 flow(s) 19 bound · 8 draft' + two ℹ lines, both 'NOT bound — disabled by deployment policy' (… |
| platform-core.boot-health | 3 | api | pass | GET /_console/ → 200 text/html (‹base href=/_console/>); GET /api/v1/meta/app?id=showcase_app (admin bearer) → 200 {type:'app', items:[showcase_app]} keys name,label,ico… |
| platform-core.boot-health | 4 | api | pass | grp_data served children = 12 objectNames (project, task, account, contact, invoice, expense_report, product, team, category, business_unit, field_zoo, cascade) — diff v… |
| platform-core.boot-health | N0 | log | pass | no SeedLoader rejection / dropped-record line; Seeds row clean (132 rows) |
| platform-core.boot-health | N1 | log | pass | health 200 with zero ERROR lines in boot window; no post-health 4xx probe traffic was misread |
| platform-core.seed-integrity | 0 | api | pass | expected from the seed module (compiled artifact data[] of src/data/seed/index.ts, matching the authoring baseline): account 14, contact 32, inquiry 3, product 4, projec… |
| platform-core.seed-integrity | 1 | api | pass | Specimen — Full: 35 authored fields equal (multiselect/checkboxes/tags/lookups as sets, json/address/repeater/record structurally, f_lookup = Northwind id wHuawcMIE5R7KU… |
| platform-core.seed-integrity | 2 | log | pass | banner "Seeds: com.example.showcase 132 rows" plain (no ⚠, no error/lost-link count); no "[Seeder] … dropped record(s)" line |
| platform-core.seed-integrity | 3 | api | pass | restart on same DB: second 19-object sweep identical to the first (diff empty), banner still 132 rows |
| platform-core.seed-integrity | 4 | api | pass | f_user null, f_users null, f_secret null; 0 of 10 tasks carry cover — recorded expected-absent |
| platform-core.seed-integrity | N0 | api | pass | no nav object at 0 |
| platform-core.seed-integrity | N1 | api | pass | counts did not grow on restart |
| platform-core.console-login | 0 | screenshot | pass | Form sign-in (Playwright fill = native input events; ref-targeted 'Sign In' button) → POST /api/v1/auth/sign-in/email 200 → landed /_console/home; screenshot: header + '… |
| platform-core.console-login | 1 | network | pass | after page.reload(): first authed calls GET /auth/get-session 200, /discovery 200, /auth/organization/list 200, /meta/app 200; in-page GET /api/v1/meta/app?id=showcase_a… |
| platform-core.console-login | 2 | network | pass | in-page POST /api/v1/auth/sign-out (bearer) → 200 {success:true}; same old token still in localStorage → GET /api/v1/meta/app?id=showcase_app 401 {code:UNAUTHENTICATED};… |
| platform-core.console-login | 3 | screenshot | pass | authed navigation to /_console/apps/com.example.showcase/showcase_account after expiry → redirected to /_console/login?redirect=%2Fapps%2Fcom.example.showcase%2Fshowcase… |
| platform-core.console-login | 4 | network | pass | re-signin 200 → returned to the SAME route /_console/apps/com.example.showcase/showcase_account, Accounts grid rendered (华宁科技 …); 32 API responses all 2xx; meta/app?id=s… |
| platform-core.console-login | N0 | network | pass | wrong password → POST sign-in/email 401 {code:INVALID_EMAIL_OR_PASSWORD}, no set-cookie, no set-auth-token; UI shows role=alert 'Invalid email or password. Please try ag… |
| platform-core.console-login | N1 | network | pass | expired session did not keep serving the shell: 401 on wire + redirect to login (see c2/c3) |
| platform-core.nav-surfaces-render | 0 | test | pass | Pin run by this runner against its own boot: SMOKE_API_URL=http://localhost:41901 OS_TEST_CHROMIUM_EXECUTABLE_PATH=/opt/pw-browsers/chromium pnpm exec playwright test --… |
| platform-core.nav-surfaces-render | 1 | api | pass | GET /api/v1/meta/app?id=showcase_app → 49 non-separator leaves; keyed diff vs SURFACES (49 entries, path base()/slice()): served-not-in-SURFACES {} and SURFACES-not-serv… |
| platform-core.nav-surfaces-render | 2 | dom | pass | /_console/apps/com.example.showcase/object_that_does_not_exist, 2 fresh loads: screenshot first shows header + full Showcase sidebar (Capability Map, Data Model, Analyti… |
| platform-core.nav-surfaces-render | 3 | screenshot | pass | none encountered: 0 pageerrors / 0 failures across 49 smoke surfaces + bad-route probe, so no ErrorBoundary fallback was triggered (explicit none-encountered) |
| platform-core.nav-surfaces-render | N0 | test | pass | no blank ‹main> (suite + bad route) |
| platform-core.nav-surfaces-render | N1 | test | pass | suite treats data-boot-splash / splash lines as not rendered; all 49 passed past it |
| platform-core.nav-surfaces-render | N2 | dom | pass | bad route kept shell (no white page) |
| platform-core.nav-surfaces-render | N3 | test | pass | chart assertions are the bounded-poll ones; all 5 chart surfaces green |
| platform-core.builtin-apps-nav-render | 0 | screenshot | pass | Admin walk via the real sidebar (all groups expanded, every href visited on a fresh navigation, screenshot first, then DOM): Setup 42/42 and Account 8/8 rendered, 0 blan… |
| platform-core.builtin-apps-nav-render | 1 | api | pass | GET /api/v1/meta/app (admin) → [showcase_app, setup, account]; ?id=studio → 200 {items:[]} (asserted absence, by design). setup (requiredPermissions [setup.access]) grou… |
| platform-core.builtin-apps-nav-render | 2 | screenshot | pass | Mei (phone.demo@example.com; get-session positions [org_member, everyone]) form sign-in: /_console/apps/setup, /_console/apps/com.objectstack.setup and a deep Setup URL … |
| platform-core.builtin-apps-nav-render | 3 | api | pass | forged as Mei: GET /api/v1/meta/app?id=setup → 200 {items:[]}; GET /api/v1/meta/app/setup → 403 PERMISSION_DENIED "You do not have permission to open the 'setup' app."; … |
| platform-core.builtin-apps-nav-render | 4 | api | pass | Mei GET /api/v1/meta/app?id=setup → 200 {items:[]} so nav_api_keys + manage_platform_settings settings URLs are unreachable; CONTROL only: admin vs Mei account navs iden… |
| platform-core.builtin-apps-nav-render | 5 | api | pass | nav_organizations absent (Tenancy: single); nav_business_units present and sys_business_unit registered (meta 200); nav_jwks absent for admin |
| platform-core.builtin-apps-nav-render | 6 | screenshot | pass | pruned entries absent from served+rendered nav: nav_sso_providers (not wired; sys_sso_provider object exists but no entry), sys_verification / sys_device_code (omit list… |
| platform-core.builtin-apps-nav-render | N0 | screenshot | pass | no blank/placeholder destination; marketplace is a named error state (knownGap) |
| platform-core.builtin-apps-nav-render | N1 | api | pass | member cannot reach Setup (server 403 / empty items; UI named denial); Studio absent for all |
| platform-core.builtin-apps-nav-render | N2 | api | pass | no permission-gated entry served to member (whole setup app withheld) |
| platform-core.v18-boot-refusals | 0 | test | pass | pin run: 3 pin file(s), 29 tests, 0 failed (vitest --maxWorkers=1 @ 5b14b7f) |
| platform-core.v18-boot-refusals | 1 | log | pass | exit 1 after 4 s, no 'Press Ctrl+C'/listening line, nothing on 41403; '✗ This database is still in the v17 organization-ownership shape: sys_job, sys_job_queue, sys_job_… |
| platform-core.v18-boot-refusals | 2 | build | fail | checksum before 28faf786d7ed1255… after f157438a35920a0f… (run 1, showcase stack). Logical diff of the refused copy vs original: +37 tables (showcase_, sys_approval_, … |
| platform-core.v18-boot-refusals | 3 | log | pass | exit 1: '✗ SecurityPlugin cannot boot: its authorization store reads sys_user, sys_member, and this kernel does not register sys_user, sys_member… mount AuthPlugin, or, … |
| platform-core.v18-boot-refusals | N0 | log | pass | the v18 boot did not serve the v17 DB (exit 1, no listener) and wrote no rows (sys_migration/sys_organization/seed tables unchanged); the additive DDL it did apply is sc… |
| records-forms.crud-roundtrip | 0 | api | pass | UI New → name os-qa-i2, Industry Finance, Lifecycle Active, website empty → POST /api/v1/data/showcase_account body {industry:finance,status:active,sales_region:amer(for… |
| records-forms.crud-roundtrip | 1 | api | pass | detail Edit → annual_revenue 1234567 → Update → PATCH /api/v1/data/showcase_account/Jc8ZtGwLTwq93X8H body {annual_revenue:1234567} 200; full-row diff before/after: only … |
| records-forms.crud-roundtrip | 2 | api | pass | detail ⋯ → Delete → confirm 'Delete Account "os-qa-i2"?' → DELETE 200; filtered GET → {records:[], total:0}; unfiltered list reload (2 loads) lacks os-qa-i2, 16 records |
| records-forms.crud-roundtrip | 3 | screenshot | pass | post-create full reload: grid row 'os-qa-i2 · Active · Finance · —' (17 records); post-delete reload: row gone (16 records), siblings intact |
| records-forms.crud-roundtrip | 4 | dom | pass | History tab (after screenshot): 'Dev Admin UPDATE … Annual Revenue: — → 1234567' and 'Dev Admin CREATE ▸ 5 fields populated' expanding to Owner: Dev Admin, Account Name:… |
| records-forms.crud-roundtrip | 5 | api | pass | UI create of os-qa-i2-华宁 → 201; filtered GET returns name bytes os-qa-i2-\xe5\x8d\x8e\xe5\xae\x81 (identical); $search=华宁 → total 2 [华宁科技, os-qa-i2-华宁]; list quick-searc… |
| records-forms.crud-roundtrip | 6 | api | pass | readonly half via pin protocol.readonly-insert.test.ts (2 pin files, 32 tests, 0 failed @ 5b14b7f); non-readonly half: source Contoso re-owned to the member, admin POST… |
| records-forms.crud-roundtrip | 7 | api | pass | contributor-bound member (recipe search:qa-contributor-bound-member replayed: admin create-user + change-password + sys_user_position contributor; positions [org_member,… |
| records-forms.crud-roundtrip | N0 | dom | pass | New → Create with empty Account Name: dialog stays open with 'Account Name is required'; no POST sent; count 14→14 |
| records-forms.crud-roundtrip | N1 | api | pass | clone re-derived id/audit/owner (c6) and RLS-invisible clone refused 404 (c7); readonly approval_status carry-over → readonly half via pin protocol.readonly-insert.test.… |
| records-forms.crud-roundtrip | N2 | api | pass | SUBSTITUTION (showcase_account.status has a default): POST /api/v1/data/showcase_invoice without required name (no default) → 400 VALIDATION_FAILED fields[{field:name, c… |
| records-forms.crud-roundtrip | N3 | api | pass | POST showcase_account tax_id 'not-a-tax-id!!' → 400 VALIDATION_FAILED fields[{field:tax_id, code:invalid_format, 'Tax ID must look like 12-3456789.'}]; count 17→17 |
| studio-authoring.first-run-loop | 0 | network | pass | Home 'Build an app' → /_console/studio; New package (writable base) wizard: name 维修中心, package-form-id-input com.example.repairs, namespace repairs → POST /api/v1/packag… |
| studio-authoring.first-run-loop | 1 | api | pass | New object 'Repair Ticket' (identifier auto-suggested repair_ticket, dialog shows 'Saved as repairs_repair_ticket', OWD Private confirmed) → PUT /meta/object/repairs_rep… |
| studio-authoring.first-run-loop | 2 | api | pass | Studio Records grid → Add record name 'Broken compressor RT-1', Status In Progress → POST /api/v1/data/repairs_repair_ticket 201 {status:'in_progress'}; GET /api/v1/data… |
| studio-authoring.first-run-loop | 3 | screenshot | pass | Create app 'Repair Center' (identifier auto repair_center, 'Add this package's objects as menu items' checked by default) → PUT /meta/app/repair_center draft with nav_re… |
| studio-authoring.first-run-loop | 4 | log | pass | server log: exactly one 'Server is ready' (182 lines, no restart/rebuild event); listener PID 10088 recorded at boot 13:19:54 still the listener at 13:27:57 after the en… |
| studio-authoring.first-run-loop | 5 | api | pass | forged writes vs read-only com.example.showcase: PUT /meta/object/showcase_qa_probe?mode=draft&package=com.example.showcase → 422 WRITABLE_PACKAGE_REQUIRED ('package is … |
| studio-authoring.first-run-loop | N0 | api | pass | no silent acceptance (c5) |
| studio-authoring.first-run-loop | N1 | screenshot | pass | published app in launcher; list renders label chip (c3) |
Fails — reproduction rules and disposition
platform-core.v18-boot-refusals · acceptance[2] — FAIL (P0) · disposition: assertion defect
Clause: "the refused boot did not alter the database" (verify: checksum before == after).
Reproduction rule:
- Mint a v17 SQLite: in a scratch dir outside the workspace,
pnpm add --ignore-workspace @objectstack/cli@17.7.0, thenobjectstack start -d file:V17.db --auth-secret <32+ chars>, make one sign-up, stop it. cp V17.db COPY.db; recordsha256sum COPY.dband the schema (sqlite_master,pragma_table_infoper table — read through SQLite so the-walis included).- In any v18 app dir:
OS_DATABASE_URL=file:COPY.db objectstack serve -p PORT→ exit 1 with the organization-ownership refusal, nothing listening (clauses 1 and 3 pass). - Re-read COPY.db. Expected (clause): identical to V17.db. Actual: the additive v18 schema sync ran before the guard — run 1 (showcase stack): sha 28faf786… → f157438a…, +37 tables,
__searchcolumn on 21 sys_* tables,bundle_member/draft_changesonsys_metadata, ~40 indexes, no row content changed; run 2 (one-object stack): main-file sha unchanged but a 259 KB-walheld 2 new tables, 2sys_metadatacolumns, 9 indexes (a main-file checksum alone can mask the write).
RUNNER rule 7: an independent agent re-derived the verdict from the captured evidence alone — agrees the clause is violated; disposition assertion defect (clause wrong, product right): packages/runtime/src/organization-ownership-boot-guard.ts documents starting after the engine (whose start() runs the additive schema sync the ceremony depends on) and ahead of every plugin that writes a row; ADR-0131 D10 forbids auto-migration (the ceremony steps), not additive sync; no cited source requires a byte-unchanged file. Not release-blocking. Proposed clause: "the refused boot wrote no row and ran no D10 step", verified by a row-level diff that includes the -wal. Open question for the maintainer (not a defect on this evidence): the refusal tells the operator to keep the database on a 17.x runtime after the v18 boot has added v18 schema to it.
Derived item verdicts
17 PASS / 5 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN. PARTIAL items carry only blocked clauses besides passes: rls-both-sides c5 (D11 spot-check needs the private write-up — blocked(dependency)); crud-permission-matrix c5 (guest create-without-read not observable on a stock boot — blocked(fixture)); walled-environment-metadata-operator-only c1, c2, N0 (18.0 refuses to boot OS_TENANCY_POSTURE=isolated: "FATAL: tenancy posture 'isolated' is not supported in 18.0 (NOT_IMPLEMENTED)", so the walled posture cannot be driven live — the P0 negative rests on its pins only); cli.organization-ownership-ceremony c1, c2, c4 skipped (18.0 refuses os migrate organization-ownership NOT_IMPLEMENTED by ruling — every arm refused and left the DB identical); datasource-credential-refusal-matrix c1, c6 (no reachable Postgres — blocked(environment)). Several clauses were scored on the clause's evident intent where its literal wording disagrees with both the product and the item's own pin; each is listed under Checklist-accuracy below so the wording gets fixed (none of them hides a product defect on this evidence).
Checklist-accuracy findings / fixture gaps
For the wave anchor card (collected by the dispatch session); not extracted, no checklist edit in this wave. 22 checklist-accuracy findings and 7 fixture gaps — the full itemized list is the first comment on this issue (moved there only because the body limit is 65,536 characters).
Handoff
Every item the selector returned has a verdict; no item left un-reached.
Timing
- Environment preparation ≈ 4,840 s: orchestrator 1,212 s wall (cold
pnpm install21 s,pnpm build331 s, console build 3 attempts — the first two were cgroup-OOM-killed (exit 137) while racing vitest and runner boots, the third, alone with turbo--concurrency=1, took 527 s) + runner boots/provisioning summed over 9 batches 3,630 s. - Testing ≈ 11,980 s: Tier 1 vitest 1,521 s (first attempt at
--maxWorkers=2was OOM-killed on@objectstack/dogfoodand@objectstack/objectql; re-run at--maxWorkers=1with nothing else heavy running — the verdicts cite only the re-run) + live clause driving summed over 9 batches 10,461 s. - Environment : testing ≈ 1 : 2.5. Both runs (priority:P0 and since:v18) shared ONE build and one Tier 1 batch; 4 items sit in both selectors and carry the same verdicts in both records.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 19, 2026
Checklist-accuracy findings / fixture gaps (record continuation)
Continuation of the run record above (
priority:P0, 5b14b7f). For the wave anchor card; not extracted.Checklist-accuracy
actionName, notaction(anactionkey is refused -32602 with a did-you-mean); step 6 does not name the argumentos migrate organization-ownershipas a NOT_IMPLEMENTED refusal (fresh-installs-only ruling 6259608309; packages/cli/src/commands/migrate/organization-ownership.ts ORGANIZATION_OWNERSHIP_UPGRADE_UNAVAILABLE). Clauses 1,2,4 and the checkpoint half of 3 describe a…os migrate comment-reactions --applystill runs in 18.0 (not withdrawn): on cr.db with 2 planted sys_comment rows → run1 '2 converted', 1 not-JSON value listed, exit 1 (column cannot be dropped until every value reads); run2 '2 already converted, 0 converted' (idempotent), sys_comment_reaction holds 2 rows (dup user…mongois retired in spec 18 (build refuses it namingmongodb); probes must use driver: "mongodb"os serve … -d file:COPY.db:servehas no -d flag (INVOCATION ERROR — Nonexistent flag: -d); use OS_DATABASE_URL (oros start -d/os dev -d).os devwith DevPlugin services:{auth:false}: (a) defineStack refuses a DevPlugin instance under devPlugins (manifest shape), (b) under plugins it double-registers 'storage' inside os dev, (c) an os dev stack with no auth tier is refused earlier by the no-auth data-API refusal. The AuthzIdentityObjectsMissingE…OS_TEST_TIERS=nightly:packages/cli/test/serve-organization-record-page.e2e.test.tsis a nightly-tier file, so the recipe as written prints "FILTER SELECTED NOTHING" for it; with the switch: 1 file, 2 passed.Fixture gaps
npm installfails with arborist 'edgesOut' null;pnpm add --ignore-workspaceworks)pnpm add --ignore-workspace(npm install fails: arborist 'edgesOut' null)Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Close-out
Every
failin this record has its four-way disposition (checklist-test SKILL §5):platform-core.v18-boot-refusalsacceptance[2] — assertion defect (RUNNER rule 7 re-derivation agrees) → test-fix card platform-checklist + cli: three findings from the 18.0 QA sweep at 5b14b7f3 — two clauses mis-asserted against documented contracts, and a refusal that prescribes a withdrawn command (family card) #24567. Not release-blocking.Parked-on:line is written here.not-runitem: no handoff list needed.Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Close-out correction
The filing rules for this wave cap a session at three standalone defect cards. The earlier close-out's two cards from this record are now one family card; #24566 is closed as folded into it.
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Parked-on: #24579 · this record's checklist-accuracy findings, fixture gaps, partial coverage gaps and not-run handover (wave anchor §2–§4)
Generated by Claude Code
objectstack-fleet commentedon Oct 19, 2026
Closure complete (checklist-test §5): every FAIL in this record has a disposition (the
Extracted:/Parked-on:lines above), and its partial coverage gaps and not-run handover are parked on #24579.Closed by: the 18.0 QA wave dispatch session
session_01CfRDy7SuTfUqaTu2AEH2Hi, on the maintainer's instruction there on 2026-10-19, verbatim 「qa-run的卡片处理完的是不是可以关闭」.Generated by Claude Code
docs(qa): 18.0 sweep round 7 — integration-system checklist-accuracy …