Repository navigation
Description
domain:devx#1 · sunhaolin · session_017xRBcV2ijbfB8Drvs2oik6
Part of #27377 (wave 3, W3-C1)
Release-candidate run of the standing smoke (priority:P0) for 18.3.0. Every one of the 23 runnable items has a verdict: 20 PASS, 3 PARTIAL, 0 FAIL, 0 BLOCKED, 0 NOT-RUN. No item reported a clause failure. The three partials each come from one blocked clause that the item's own fixtures.knownGaps predicts. The off-clause probes produced four low-severity product cards (extracted, see the close-out comment) and two security findings, detail withheld and fix dispatched (see "Off-clause probes").
Environment fingerprint
- Framework
c4c515ad3cc342043a2b81b5a06a5793f79a23e8(detached checkout,git statusclean before and after the run), includingui/. The Console was built in-repo from the same commit:pnpm install --frozen-lockfile, thenpnpm build --concurrency=2(12m43s, exit 0), thenpnpm console:build --concurrency=2(exit 0).node scripts/check-dev-prereqs.mjswas green (105 artifacts). - Stale-console-bundle ruled out: every boot served
/_console/entryassets/index-DkXHr74P.js, the same file aspackages/console/dist/assets. The dispatcher checked this once and each browser runner re-checked it on its own boot. - Node 22.22.0, pnpm 10.31.0, Playwright chromium build 1243 (matches
/opt/pw-browsers; launched without theexecutablePathoverride). - App:
examples/app-showcase. Oneos devcompile boot by the dispatcher wrotedist/objectstack.json. Every runner boot afterwards used--no-compile(from the tree, or from a scratch copy outside the tree withnode_modulessymlinked), so concurrent boots never rewrote the shared artifact. - Boot line:
OS_PORT=PORT OS_STORAGE_LOCAL_ROOT=RUN/uploads setsid pnpm -C … exec objectstack dev --ui --seed-admin --no-compile -p PORT -d file:RUN/ITEM.db, with--fresh/--log-level infowhere an item asked for them. Seed:--seed-admin(admin@objectos.ai) plus the showcase seed (132 rows / 19 datasets, measured). - Ports: 41101–41109 (R1), 41201–41209 (R2), 41301–41309 (R3), 41401–41409 (R4), 41501–41509 (R5), 41601–41609 (R6), 41701–41709 (R7), 41001 and 41010 (dispatcher). Each item ran on its own file DB under its runner's scratch dir.
- Walled leg:
os devwithOS_TENANCY_POSTURE=isolated,OS_PLATFORM_OWNER_EMAILandOS_AUTH_MEMBERSHIP_POLICY=invite-only. The banner readTenancy: isolated, not degraded. - The v17-shaped DB came from npm
@objectstack/cli@17.7.0 --legacy-peer-deps, from a blank-scaffoldos devboot, because no 17.x showcase is published. The 18.0 pre-release DB is thecli-18-prerelease-dbrestore. Copies only, with a checksum or row diff around every step. - Timestamps: prep 04:19Z–04:32Z, runners 04:34Z–05:14Z, 2026-10-29.
Execution
Parallel, per SKILL §2. Seven runner subagents (R1–R7), each with its own port range and file DBs. API and CLI items fanned out; browser items ran at most three at a time (R5, R6, R7, one browser each). The dispatcher checked every runner's verdicts against the raw evidence it captured (pin outputs, HTTP traces, boot logs), and independently reproduced the off-clause security probes on its own boot (port 41010, twice) before dispatching anything. Container memory stayed under 11 GiB throughout.
Scope: selector priority:P0, 23 runnable items (no planned or blocked items matched)
| item | revision | surface | runner | item verdict |
|---|---|---|---|---|
| access-security.rls-both-sides | 9 | api | R1 | PARTIAL |
| access-security.write-path-guards | 8 | api | R1 | PASS |
| access-security.crud-permission-matrix | 10 | api | R1 | PARTIAL |
| access-security.owd-sharing-matrix | 6 | api | R2 | PASS |
| access-security.anonymous-deny-surfaces | 5 | api | R2 | PASS |
| access-security.walled-environment-metadata-operator-only | 6 | api | R2 | PASS |
| ai.mcp-stdio-fail-closed | 8 | cli | R4 | PASS |
| api-backend.query-contract-matrix | 7 | api | R3 | PASS |
| api-backend.packaged-action-disabled-dispatch | 9 | api | R3 | PASS |
| approvals.account-app-entry | 6 | browser | R6 | PASS |
| automation.packaged-flow-disable-durable | 7 | api | R3 | PASS |
| cli.dev-boot-contract | 9 | cli | R4 | PASS |
| cli.organization-ownership-ceremony | 6 | cli | R4 | PARTIAL |
| identity-auth.default-organization-boot-invariant | 3 | api | R2 | PASS |
| integration-system.datasource-credential-refusal-matrix | 7 | mixed | R7 | PASS |
| platform-core.boot-health | 12 | mixed | R5 | PASS |
| platform-core.seed-integrity | 6 | api | R3 | PASS |
| platform-core.console-login | 4 | browser | R5 | PASS |
| platform-core.nav-surfaces-render | 7 | browser | R5 | PASS |
| platform-core.builtin-apps-nav-render | 9 | browser | R5 | PASS |
| platform-core.v18-boot-refusals | 8 | cli | R4 | PASS |
| records-forms.crud-roundtrip | 15 | browser | R6 | PASS |
| studio-authoring.first-run-loop | 7 | mixed | R7 | PASS |
Per-clause verdicts
Layer note (RUNNER rule 6): a clause scored from a pin names the pin's layer in its evidence. Dogfood pins (bootStack) are in-process HTTP over a real engine and sqlite. objectql pins are engine over a mock or recording driver. Plugin-unit pins over stubs only corroborate. Every clause whose oracle is a public door's answer was also driven on a live boot, except where the row says otherwise.
| item · clause | verdict | text oracle evidence |
|---|---|---|
| access-security.rls-both-sides · acceptance[0] | pass | pin showcase-private-owd 'a member LISTS only the notes they own' + 'the OTHER member is symmetric' ✓ [HTTP (in-process: @objectstack/verify … |
| access-security.rls-both-sides · acceptance[1] | pass | live x2: A GET /data/showcase_private_note/‹B id> -> 404 {code:RECORD_NOT_FOUND} (not-found-shaped, same envelope as an unknown id); B->A symmetric … |
| access-security.rls-both-sides · acceptance[2] | pass | live x2: A PATCH ‹B id> {body:'forged'} -> 404 RECORD_NOT_FOUND; admin pre/post re-read of B note byte-identical (body 'b1 original', updated_at … |
| access-security.rls-both-sides · acceptance[3] | pass | live x2: admin GET list contains all 3 ids created in the run (adminHasAll=true); pin 'the admin (platform posture) lists every note this file … |
| access-security.rls-both-sides · acceptance[4] | pass | objectstack verify --rls (scratch copy of showcase, layer HTTP in-process via bootStack): per-persona line '── 21 PROVEN (21 consistent, 0 HOLES) · … |
| access-security.rls-both-sides · acceptance[5] | blocked | blocked{by: dependency, ref: knownGaps[0] / #22017 row 11} for the D11 spot-check (private write-up not held by this runner). Public half scored and … |
| access-security.rls-both-sides · negative[0] | pass | forged PATCH answered 404 and admin re-read unchanged (x2 live + pin) |
| access-security.rls-both-sides · negative[1] | pass | procedural: this run carries the private-defect verdict on this item's acceptance[5] only; owd-sharing-matrix not in this runner's scope |
| access-security.rls-both-sides · negative[2] | pass | procedural: this record cites item+clause, never the bare handle as a defect |
| access-security.write-path-guards · acceptance[0] | pass | live x2 (admin, per steps[1]): POST showcase_contact {lead_score:10} -> 201, header 'X-ObjectStack-Dropped-Fields: lead_score;reason=readonly', body … |
| access-security.write-path-guards · acceptance[1] | pass | live x2: PATCH {lead_score:99} -> 200 with dropped header; before/after GET lead_score null/null; pin 'a direct PATCH forging the readonly field is … |
| access-security.write-path-guards · acceptance[2] | pass | live x2 as member Alice: POST note {owner_id:‹Bob>} -> 403 PERMISSION_DENIED ('creating a record owned by another user requires the transfer grant'); … |
| access-security.write-path-guards · acceptance[3] | pass | live x2: Alice self-owner POST -> 201 owner_id=Alice; PATCH owner_id=Bob -> 403 PERMISSION_DENIED, re-read owner Alice; PATCH owner_id=null -> 403 … |
| access-security.write-path-guards · acceptance[4] | pass | live x2: Alice POST /createMany bare array of 3 -> 201, all 3 rows owner_id == Alice's sys_user id; {records:[...]} wrapper -> 400 VALIDATION_FAILED … |
| access-security.write-path-guards · acceptance[5] | pass | live x2 (admin): paid invoice PATCH tax_rate 20 -> 200 dropped 'tax_rate;reason=readonly_when', re-read 5; paid line PATCH … |
| access-security.write-path-guards · acceptance[6] | pass | live x2: updateMany continueOnError [3,-1,3] -> total 3 / succeeded 2 / failed 1, row1 VALIDATION_FAILED, re-read [3,1,3]; default stop [4,-1,4] -> … |
| access-security.write-path-guards · negative[0] | pass | live x2 as admin: forge-insert owner_id=Bob -> 201 persisted owner Bob; transfer Alice's note to Bob -> 200 persisted; disown -> 200 owner null; pin … |
| access-security.write-path-guards · negative[1] | pass | layer ENGINE (real ObjectQL engine over recording/fake driver, own test objects — not showcase lead_score, as the negative directs): … |
| access-security.crud-permission-matrix · acceptance[0] | pass | live socket sweep (port of the pin over admin-REST re-reads): 164 showcase_* cells, 87 effective-allow all ‹300 with effect proven (created row … |
| access-security.crud-permission-matrix · acceptance[1] | pass | live: all 77 effective-deny cells 403 with body code PERMISSION_DENIED (envelope top-level code); delegate sys_user create/delete 405 … |
| access-security.crud-permission-matrix · acceptance[2] | pass | live: every denied CREATE followed by admin scan by marker -> 0 rows left (judge field left=0 on all deny-create cells) |
| access-security.crud-permission-matrix · acceptance[3] | pass | live: auditor by-id 200 and in-list on foreign private_note, inquiry, invoice, invoice_line; contributor contrast by-id 404 and excluded from lists … |
| access-security.crud-permission-matrix · acceptance[4] | pass | live: ops PATCH admin's announcement -> 200, re-read 'MAMA ops-edited v1'; plain member same PATCH -> 403 PERMISSION_DENIED, re-read unchanged; … |
| access-security.crud-permission-matrix · acceptance[5] | blocked | blocked{by: dependency, ref: #23267} per knownGaps[2]; re-observed live: GET /meta/position/guest 200, PUT /meta/position/guest naming … |
| access-security.crud-permission-matrix · acceptance[6] | pass | access-matrix.json recounted: 45 rows (41 showcase_* + 4 field_ops_delegate × sys_*); live sweep 164 cells (87 allow / 77 deny / 9 flips) + 16 … |
| access-security.crud-permission-matrix · negative[0] | pass | live: first denied cell of each of 8 sets re-run as admin -> 2xx (auditor×inquiry edit 200, client_liaison×client_brief delete 200, … |
| access-security.crud-permission-matrix · negative[1] | pass | no withheld cell answered 2xx (bad=[] over 164 + 16 cells) |
| access-security.owd-sharing-matrix · acceptance[0] | pass | HTTP live x2 (rounds a,b): A POST note 201; B list(filter id)=[] and list(all) n=0; B GET by id 404; B PATCH 404 RECORD_NOT_FOUND; admin re-read … |
| access-security.owd-sharing-matrix · acceptance[1] | pass | HTTP live x2: admin-owned announcement; B GET by id 200, list contains; B forged PATCH 403 PERMISSION_DENIED; admin re-read title unchanged. Pin … |
| access-security.owd-sharing-matrix · acceptance[2] | pass | HTTP live x2: showcase_ops PATCH of admin's announcement 200, admin re-read 'R2-b edited by ops'. Pin showcase-crud-persona-matrix 49/49 (in-process … |
| access-security.owd-sharing-matrix · acceptance[3] | pass | HTTP live (round b; round a project create was my bad body status='completed' -> 400 invalid_initial_state, fixed to 'planned'): C1 (contributor) GET … |
| access-security.owd-sharing-matrix · acceptance[4] | pass | HTTP live x2: C1 invoice (owner=C1 email) 201 + line 201; C2 list(filter id) excludes, list(all) n=0, GET by id 404, PATCH 404 + admin re-read … |
| access-security.owd-sharing-matrix · acceptance[5] | pass | HTTP live x2: showcase_auditor list(filter id) contains C1's line, list(all) n=7, GET by id 200 |
| access-security.owd-sharing-matrix · acceptance[6] | pass | procedural: all four models driven per persona-verb in this record (private, public_read, public_read_write, controlled_by_parent) |
| access-security.owd-sharing-matrix · negative[0] | pass | forged direct PATCH (no UI) by B on public_read announcement -> 403 PERMISSION_DENIED, row unchanged |
| access-security.owd-sharing-matrix · negative[1] | pass | C2's three line probes repeated as C1: C1 list contains / GET 200 / PATCH 200 — denial is derivation, not a broken route |
| access-security.anonymous-deny-surfaces · acceptance[0] | pass | HTTP live, no Authorization header and no cookie jar (anon get-session 401): data, meta, actions, automation/_status, batch, security/explain, … |
| access-security.anonymous-deny-surfaces · acceptance[1] | pass | anon POST /api/v1/actions/showcase_task/showcase_mark_done/anon-probe-id -> 401 (member same call -> 404 RECORD_NOT_FOUND, proving the 401 precedes … |
| access-security.anonymous-deny-surfaces · acceptance[2] | pass | each 401 body matched exactly one family with the pin's predicates: rest-flat for /data /meta /batch /security/explain; dispatcher-wrapper for … |
| access-security.anonymous-deny-surfaces · acceptance[3] | pass | anon: analytics query/sql (valid + malformed body) and meta -> 401 UNAUTHENTICATED dispatcher-wrapper; member: query 200 rows, sql 200, meta 200, … |
| access-security.anonymous-deny-surfaces · acceptance[4] | pass | member (org_member, not platform admin) GET /data/showcase_private_note 200 and GET /meta 200 |
| access-security.anonymous-deny-surfaces · acceptance[5] | pass | anon GET /api/v1/forms/contact-us -> 200 serving showcase_inquiry form |
| access-security.anonymous-deny-surfaces · acceptance[6] | pass | procedural: all seven variant families driven live (data, meta, actions, automation, batch, security-explain, analytics x3 faces) |
| access-security.anonymous-deny-surfaces · negative[0] | pass | anon DELETE /api/v1/automation/showcase_reassign_wizard -> 401 dispatcher-wrapper; admin GET of the flow afterwards -> 200 … |
| access-security.walled-environment-metadata-operator-only · acceptance[0] | pass | all 7 pins at c4c515a, vitest maxWorkers=1: @objectstack/rest meta-migrate-stored-walled-refusal 6/6 (unit: RestServer over vi.fn transport); … |
| access-security.walled-environment-metadata-operator-only · acceptance[1] | pass | HTTP live on walled boot (os dev, OS_TENANCY_POSTURE=isolated + OS_PLATFORM_OWNER_EMAIL + OS_AUTH_MEMBERSHIP_POLICY=invite-only; banner 'Tenancy: … |
| access-security.walled-environment-metadata-operator-only · acceptance[2] | pass | walled operator PUT /meta/object/qa_walled_probe_{a,b} 200 + read-back 200, then DELETE 200 and read-back 404; single-posture fresh boot (Tenancy: … |
| access-security.walled-environment-metadata-operator-only · negative[0] | pass | no org-owner environment-metadata write succeeded on the walled boot across 9 doors x2 rounds + 12 probe doors; nothing stored |
| ai.mcp-stdio-fail-closed · acceptance[0] | pass | LIVE os start (scratch r4/app, -d file:r4/mcp/mcp.db) OS_MCP_STDIO_ENABLED=true, key unset: exit 1, stderr "✗ Plugin com.objectstack.mcp failed to … |
| ai.mcp-stdio-fail-closed · acceptance[1] | pass | osk_unknown → exit 1 "[MCP] OS_MCP_STDIO_API_KEY did not resolve to a valid identity (unknown / revoked / expired / owner-less). Refusing to start … |
| ai.mcp-stdio-fail-closed · acceptance[2] | pass | --log-level info: "INFO [MCP] stdio transport principal-bound to OS_MCP_STDIO_API_KEY identity b9VDCncXLLBjO75KsDQv0vRT5QpLwHmz (RLS/FLS/tenant … |
| ai.mcp-stdio-fail-closed · acceptance[3] | pass | RLS (contributor-bound member, recipe search:qa-contributor-bound-member): MCP query_records showcase_invoice → ids {0pWA7HevhfNZSFgP (own … |
| ai.mcp-stdio-fail-closed · acceptance[4] | pass | aggregate count by status: member MCP [{status:draft,n:1}] == member REST POST /data/showcase_invoice/query [{draft,1}]; admin REST … |
| ai.mcp-stdio-fail-closed · acceptance[5] | pass | liaison MCP aggregate sum(budget) / groupBy budget / count_distinct(spent) → isError {code PERMISSION_DENIED, status 403, "[Security] Field read … |
| ai.mcp-stdio-fail-closed · acceptance[6] | pass | same live stdio session: pre-revoke query_records → own row; admin PATCH /api/v1/data/sys_api_key/vMiIf2drgEPCPT1i {"revoked":true} → 200; next … |
| ai.mcp-stdio-fail-closed · acceptance[7] | pass | os start with neither OS_MCP_STDIO_ENABLED nor a key, --log-level info: health 200, "INFO [MCP] Transport not auto-started (HTTP is served … |
| ai.mcp-stdio-fail-closed · negative[0] | pass | no invalid/revoked/empty key produced a serving session: keyless, osk_unknown, revoked, empty-string, whitespace-only all exit 1 before HTTP health |
| ai.mcp-stdio-fail-closed · negative[1] | pass | member MCP rows == member REST rows; hidden INV-1003 absent on both |
| ai.mcp-stdio-fail-closed · negative[2] | pass | member MCP count total 1 vs admin 13 |
| ai.mcp-stdio-fail-closed · negative[3] | pass | masked-field aggregates refused, no number |
| ai.mcp-stdio-fail-closed · negative[4] | pass | post-revocation: no row, code API_KEY_REVOKED |
| api-backend.query-contract-matrix · acceptance[0] | pass | HTTP live: 25 operator variants + 5 extra is_empty rows, each run three ways (POST $-object body, POST AST array, GET $filter AST) on … |
| api-backend.query-contract-matrix · acceptance[1] | pass | HTTP live: GET $orderby=name&$top=3&$skip=2 and $top=4&$skip=9 equal baseline-sorted slices; POST {limit,offset} and {top,skip} with orderBy name asc … |
| api-backend.query-contract-matrix · acceptance[2] | pass | HTTP live: GET $select=name,status and POST fields [name,status] -> 14 rows, key set exactly ["name,status"] (no id added); POST … |
| api-backend.query-contract-matrix · acceptance[3] | pass | HTTP live: GET $orderby annual_revenue asc/desc and POST orderBy asc/desc: full 14-row sequences equal local sort (14 distinct values, no nulls); GET … |
| api-backend.query-contract-matrix · acceptance[4] | pass | HTTP live, both personas proven via get-session (admin@objectos.ai, r3-contrib@example.test minted invite->sign-up, sys_user_position contributor): … |
| api-backend.query-contract-matrix · acceptance[5] | pass | HTTP live: POST where {status:{$nin:"done"}} -> 400 VALIDATION_FAILED fields[0].field="query.where.status.$nin" message names $nin, status, ARRAY; … |
| api-backend.query-contract-matrix · acceptance[6] | pass | HTTP live: ?$pageSize=5 -> 400 UNSUPPORTED_QUERY_PARAM listing $top,$skip,$orderby,$select,$count,$search,$searchFields,$filter,$expand; … |
| api-backend.query-contract-matrix · acceptance[7] | pass | HTTP live: $in:[] -> 200, 0 of 10 tasks; $nin:[] -> 200, 10 of 10; AST in [] 0/10, AST not_in [] 10/10 |
| api-backend.query-contract-matrix · acceptance[8] | pass | one recorded row per variant: all 22 op:* variants in qcm-operators.txt; params $top/$skip/$select/$orderby/$count ($count=true total=14, … |
| api-backend.query-contract-matrix · negative[0] | pass | HTTP live: POST {limit:"ten"} -> 400 VALIDATION_FAILED fields query.limit; POST {not_a_query_key:{…}} -> 400 INVALID_FIELD; neither carries rows. … |
| api-backend.packaged-action-disabled-dispatch · acceptance[0] | pass | HTTP live: after flip, POST /api/v1/actions/showcase_task/showcase_mark_done {recordId:"no-such-record-0000"} -> 409 … |
| api-backend.packaged-action-disabled-dispatch · acceptance[1] | pass | HTTP live: gallery disabled + {recordId bogus, params:{bogus_key:1}} -> 409 ACTION_DISABLED; re-enabled, identical request -> 400 VALIDATION_ERROR … |
| api-backend.packaged-action-disabled-dispatch · acceptance[2] | pass | HTTP live: every disabled 409 (mark_done, gallery, post-restart mark_done) had recordId no-such-record-0000 in play and no write; corroboration only: … |
| api-backend.packaged-action-disabled-dispatch · acceptance[3] | pass | HTTP live: showcase_zoo_perm_missing enabled -> 403 PERMISSION_DENIED "requires capability [showcase.restricted_ops]"; disabled -> 403, body … |
| api-backend.packaged-action-disabled-dispatch · acceptance[4] | pass | HTTP live MCP: POST /api/v1/mcp initialize 200; portfolio_snapshot disabled -> tools/call run_action {actionName} result isError:true, text … |
| api-backend.packaged-action-disabled-dispatch · acceptance[5] | pass | HTTP live, cold restart over same action-disabled.db: post-restart mark_done -> 409 ACTION_DISABLED; re-enable 200; invoke real id -> 200 operation … |
| api-backend.packaged-action-disabled-dispatch · acceptance[6] | pass | HTTP live: showcase_bulk_reassign (type flow) disabled -> 409 ACTION_DISABLED naming showcase_bulk_reassign; showcase_reassign_wizard runs list empty … |
| api-backend.packaged-action-disabled-dispatch · negative[0] | pass | disabled legs answered 409, never the 400 param shape nor a record answer (gallery pair, bogus-id traces) |
| api-backend.packaged-action-disabled-dispatch · negative[1] | pass | absence means active: before any flip, no ledger row for mark_done and the gallery garbage bag answered 400 param contract, not 409; D4 403 wins over … |
| api-backend.packaged-action-disabled-dispatch · negative[2] | pass | anonymous POST mark_done and perm_missing -> 401 |
| approvals.account-app-entry · acceptance[0] | pass | pnpm console:build was run by the dispatcher in this checkout at HEAD c4c515a (tree read-only for runners); its log prints '✓ @objectstack/console … |
| approvals.account-app-entry · acceptance[1] | pass | screenshot after clicking account app Inbox > Approvals: landed /_console/apps/com.objectstack.account/component/approvals/inbox; 'Approvals Inbox' … |
| approvals.account-app-entry · acceptance[2] | pass | non-admin persona (positions org_member/contributor/finance/everyone, isPlatformAdmin false) GET /api/v1/meta/app -> [showcase_app, account] (admin: … |
| approvals.account-app-entry · acceptance[3] | pass | row click -> /apps/com.objectstack.account/sys_approval_request/record/areq_3dcda2fa… with Approve/Reject/Reassign/Send back/Request info; … |
| approvals.account-app-entry · acceptance[4] | pass | cold load /apps/com.objectstack.account/component/approvals/inbox?request=areq_3dcda2fa… -> URL replaced with … |
| approvals.account-app-entry · acceptance[5] | pass | after screenshot, inbox row record link href=/_console/apps/com.objectstack.account/showcase_invoice/record/iSSJWwgth9jEKbPN (current app segment); … |
| approvals.account-app-entry · acceptance[6] | pass | avatar menu Preferences > Language > 中文(中国) (options English / 中文(中国)), html lang zh-CN; screenshot: nav entry 待我审批, tabs 待我审批 / 我发起的 / 全部, status … |
| approvals.account-app-entry · negative[0] | pass | no component-not-found / blank pane: full inbox rendered from the nav entry (screenshot) |
| approvals.account-app-entry · negative[1] | pass | Approvals entry present in persona meta/app and sidebar; setup absent (meta/app list, ?id=setup empty, GET /meta/app/setup 403, /_console/apps/setup … |
| automation.packaged-flow-disable-durable · acceptance[0] | pass | HTTP live: baseline urgent create -> runs 0->1; POST /api/v1/automation/showcase_urgent_task_alert/toggle {enabled:false} -> 200; GET … |
| automation.packaged-flow-disable-durable · acceptance[1] | pass | HTTP live: POST …/trigger -> 409 FLOW_DISABLED message "Flow 'showcase_urgent_task_alert' is disabled — it is switched off for this installation in … |
| automation.packaged-flow-disable-durable · acceptance[2] | pass | cold restart (process group stopped, port empty) over same flow-disable.db with --log-level info: boot log line 1000 "[Automation] Activation ledger: … |
| automation.packaged-flow-disable-durable · acceptance[3] | pass | HTTP live new process: runs 1 before, urgent create 201, runs 1 after 3s settle; trigger still 409 with ledger phrasing |
| automation.packaged-flow-disable-durable · acceptance[4] | pass | HTTP live: toggle {enabled:true} 200; GET sys_metadata_activation/n-xK3Z2bD4Tl6j6m -> same id, active true, updated_at moved; still 1 row; _status … |
| automation.packaged-flow-disable-durable · negative[0] | pass | 2xx toggle wrote the row (acceptance[0]) |
| automation.packaged-flow-disable-durable · negative[1] | pass | restart did not re-arm (acceptance[2]/[3]) |
| automation.packaged-flow-disable-durable · negative[2] | pass | re-enable kept the row (same id) |
| automation.packaged-flow-disable-durable · negative[3] | pass | 409 carried the ledger phrasing, not the bare status sentence |
| cli.dev-boot-contract · acceptance[0] | pass | os dev --ui --seed-admin -p 41406 -d file:r4/dev/data.db from scratch devapp (compiled first): health 200 after ~18s; GET /api/v1/ready 200 … |
| cli.dev-boot-contract · acceptance[1] | pass | boot1 POST /auth/sign-in/email admin@objectos.ai/admin123 → 200; stopped (SIGINT, exit 0); same command + --admin-password changed99 on the SAME DB: … |
| cli.dev-boot-contract · acceptance[2] | pass | per-variant Database lines: explicit -d → file:r4/dev/data.db; env OS_DATABASE_URL → file:r4/dev/env.db; -d :memory: → ":memory:" (showcase_task read … |
| cli.dev-boot-contract · acceptance[3] | pass | --fresh: "🧪 Fresh OS_HOME: /tmp/objectstack-dev-AJURYy", Database file:/tmp/objectstack-dev-AJURYy/data/objectstack.db, admin123 sign-in 200 … |
| cli.dev-boot-contract · acceptance[4] | pass | instance B on the busy 41406: "⚠ Port 41406 is in use — serving on 41407 instead." and "↪ server bound to port 41407 (requested 41406)"; URLs printed … |
| cli.dev-boot-contract · acceptance[5] | pass | touch src/coverage.ts (25 s newer than dist), os dev --no-compile: "⚠ dist/objectstack.json is OLDER than your sources — this boot serves the STALE … |
| cli.dev-boot-contract · acceptance[6] | pass | empty scratch dir, os dev -p 41406: exit 1; stderr "Run in a directory with objectstack.config.ts, pass --artifact ‹path/url>, or run from the … |
| cli.dev-boot-contract · acceptance[7] | pass | /_console/ 200 text/html → /_console/login; screenshot (taken before any DOM read) shows the ObjectOS "Welcome back" login card with Email/Password … |
| cli.dev-boot-contract · negative[0] | pass | restart against the existing data.db kept the seeded account (original password 200) and data; nothing-chosen resolves to a persistent project file, … |
| cli.dev-boot-contract · negative[1] | pass | --database-driver memory → exit 2 "INVOCATION ERROR — Expected --database-driver=memory to be one of: sqlite, …" (oclif allowlist); … |
| cli.dev-boot-contract · negative[2] | pass | legacy dev.db boot read dev.db with the notice; no objectstack.db created beside it (directory listing after boot: dev.db*, dev.telemetry.db*, … |
| cli.dev-boot-contract · negative[3] | pass | shifted port reported (see acceptance[4]); printed URLs name the bound port 41407 |
| cli.organization-ownership-ceremony · acceptance[0] | pass | layer: unit/integration (engine over SQLite, no HTTP). @objectstack/cli @c4c515ad: apply-flags 7/7, dialect 19/19, apply.generation-1 17/17, … |
| cli.organization-ownership-ceremony · acceptance[1] | pass | v17 copy c1 served once by os serve (refused, exit 1), then plan: exit 0, "✓ Plan written … no row or table in the database was changed"; plan kind … |
| cli.organization-ownership-ceremony · acceptance[2] | pass | --apply --plan-file plan.json --backup-taken --out apply.json --json (production env, OS_AUTH_SECRET set): exit 0, complete true, blocking 0, 13 … |
| cli.organization-ownership-ceremony · acceptance[3] | pass | unmigrated copy c2: os serve exit 1, "✗ This database carries no organization-ownership marker … sys_flow_credential, sys_job, … sys_secret still … |
| cli.organization-ownership-ceremony · acceptance[4] | pass | fresh copy c3: comment-reactions --apply without --yes → exit 1 refused; with --yes twice → exit 0 both ("Converted 0 reaction(s) … recorded as … |
| cli.organization-ownership-ceremony · acceptance[5] | blocked | by: fixture (one leg). Every other leg held on the cli-18-prerelease-db restore (born 18.0.0-next.5 820fd5a), all with --dev: first `os serve … |
| cli.organization-ownership-ceremony · negative[0] | pass | no ceremony arm altered a DB while refusing or planning: c1 plan + noplan refusal checksum c14aa322 unchanged; c3 drop-gate refusal checksum 2d71d461 … |
| identity-auth.default-organization-boot-invariant · acceptance[0] | pass | @objectstack/plugin-auth ensure-default-organization.test.ts 57/57 (plugin unit: fake driver); @objectstack/runtime … |
| identity-auth.default-organization-boot-invariant · acceptance[1] | pass | fresh boot --log-level info: '[default-org] created the Default Organization (org_mvt2c3tynoqiotp8)' at 04:48:25.705Z before 'Dev admin seeded' … |
| identity-auth.default-organization-boot-invariant · acceptance[2] | pass | sys_member?organization_id=DEFAULT: admin role owner, created-user r2-dorg-member role member; get-session admin … |
| identity-auth.default-organization-boot-invariant · acceptance[3] | pass | GET /data/sys_business_unit: 5 seeded rows (bu_acme, bu_east_coast, bu_field_ops, bu_hq_finance, bu_west_coast) all … |
| identity-auth.default-organization-boot-invariant · negative[0] | pass | no NULL: sys_business_unit 0 NULL; DB scan of all 62 tables carrying organization_id found no NULL row |
| integration-system.datasource-credential-refusal-matrix · acceptance[0] | pass | One row per door, both doors. BUILD (os compile, scratch app): password(pg), authToken(turso), alias passwd(pg), url userinfo(pg), syncUrl … |
| integration-system.datasource-credential-refusal-matrix · acceptance[1] | pass | Scratch PG16 on 127.0.0.1:41703 (scram-sha-256, role r7app with password). POST /api/v1/datasources {name:r7pg, driver:postgres, config.url … |
| integration-system.datasource-credential-refusal-matrix · acceptance[2] | pass | Full-body grep across GET /datasources (list), /datasources/‹n>, /meta/datasource (list), /meta/datasource/‹n>, /data/sys_metadata?type=datasource … |
| integration-system.datasource-credential-refusal-matrix · acceptance[3] | pass | GET /api/v1/datasources/r7pg -> hasSecret:true, redactedConfigKeys:[]. GET /api/v1/datasources/r7pg_nosecret -> hasSecret:false. These can be told … |
| integration-system.datasource-credential-refusal-matrix · acceptance[4] | pass | Planted with the server STOPPED (direct node:sqlite insert into dsmatrix.db sys_metadata): r7legacy_pg {passwd,pwd}, r7legacy_turso … |
| integration-system.datasource-credential-refusal-matrix · acceptance[5] | pass | Unknown driver 'acme-plugin-db' was accepted by the runtime door 201 and by os compile exit 0, both the ruled boundary. The stored row holds password … |
| integration-system.datasource-credential-refusal-matrix · acceptance[6] | pass | GET /datasources/r7pg config echoed back: PATCH {config} -> 200 status ok, then PATCH of the full echoed object -> 200. external.credentialsRef was … |
| integration-system.datasource-credential-refusal-matrix · acceptance[7] | pass | auditor.demo (identity checked via get-session) -> 403 PERMISSION_DENIED on /datasources, /datasources/‹n>, /meta/datasource, /meta/datasource/‹n> … |
| integration-system.datasource-credential-refusal-matrix · negative[0] | pass | No cleartext planted value appeared in any read response body, refusal body or server log (grep counts 0). |
| integration-system.datasource-credential-refusal-matrix · negative[1] | pass | No two-door disagreement: every door refused at both os compile and POST /datasources, and connector authentication was refused at both os compile … |
| integration-system.datasource-credential-refusal-matrix · negative[2] | pass | The admin and metadata doors redact identically, as does the data door. |
| integration-system.datasource-credential-refusal-matrix · negative[3] | pass | All six alias spellings in stored rows were redacted. |
| integration-system.datasource-credential-refusal-matrix · negative[4] | pass | Unknown-driver canonical spellings (password, authToken, passwd, URL userinfo) were withheld. Only non-canonical apiSecret is served, which is the … |
| integration-system.datasource-credential-refusal-matrix · negative[5] | pass | No mask is ever served, and the echoed PATCH did not overwrite the stored secret (credentialsRef unchanged, reconnect ok). |
| integration-system.datasource-credential-refusal-matrix · negative[6] | pass | Every credential refusal names external.credentialsRef (connector: credentialRef). encryptionKey points at removal (it is not a credential to bind). |
| platform-core.boot-health · acceptance[0] | pass | GET /api/v1/health -> 200 {status:ok, version 18.2.0}; time-to-healthy 11.26 s from launch |
| platform-core.boot-health · acceptance[1] | pass | GET /api/v1/ready -> 200 {status:ready,state:running} |
| platform-core.boot-health · acceptance[2] | pass | Flows: '32 flow(s) 19 bound … · 8 draft'; two ℹ deployment-policy lines (showcase_task_due_reminder time_relative, showcase_scheduled_digest … |
| platform-core.boot-health · acceptance[3] | pass | GET /api/v1/meta/app?id=showcase_app -> 200, top-level {type,items}; app keys … |
| platform-core.boot-health · acceptance[4] | pass | 50 nav_* ids in src/ui/apps/index.ts vs 50 served leaf ids (incl. separator): comm diff empty both directions; grp_data serves all 12 … |
| platform-core.boot-health · acceptance[5] | pass | GET /_console/ -> 200 text/html; charset=utf-8, entry assets/index-DkXHr74P.js |
| platform-core.boot-health · negative[0] | pass | no SeedLoader rejection/dropped line; banner 'Seeds: com.example.showcase 132 rows' (no ⚠) |
| platform-core.boot-health · negative[1] | pass | 0 ERROR lines in the boot window |
| platform-core.seed-integrity · acceptance[0] | pass | HTTP live, fresh DB: expected counts derived by importing ShowcaseSeedData from src/data/seed/index.ts (19 datasets, 132 rows — matches the item … |
| platform-core.seed-integrity · acceptance[1] | pass | HTTP live: Specimen — Full field-by-field vs the seed literal: all MATCH incl. f_multiselect [red,green] as set, f_lookup = Northwind id … |
| platform-core.seed-integrity · acceptance[2] | pass | log: banner "Seeds: com.example.showcase 132 rows" plain (no ANSI color, no ⚠, no error/lost-link count); --log-level info "[Seeder] Seed loading … |
| platform-core.seed-integrity · acceptance[3] | pass | restart over same DB: second sweep byte-identical to first (diff empty), Seeder {inserted:0,updated:0,skipped:132,errored:0}. Third boot: all counts … |
| platform-core.seed-integrity · acceptance[4] | pass | expected-absent: f_user null, f_users null, f_secret null on Specimen — Full; task.cover null on all 10 tasks |
| platform-core.seed-integrity · negative[0] | pass | no seeded object counts 0 |
| platform-core.seed-integrity · negative[1] | pass | counts did not grow on restart |
| platform-core.console-login · acceptance[0] | pass | form sign-in (Playwright fill, request body carried the creds) -> POST sign-in/email 200, landed /_console/home; screenshot: header + 'Your apps' … |
| platform-core.console-login · acceptance[1] | pass | after reload URL stays /_console/home; first authed call GET /auth/get-session 200 (bearer), then discovery 200…; in-page GET … |
| platform-core.console-login · acceptance[2] | pass | POST /api/v1/auth/sign-out 200, then same bearer: GET meta/app?id=showcase_app 401 UNAUTHENTICATED, GET auth/get-session 401 (token still in … |
| platform-core.console-login · acceptance[3] | pass | full navigation after expiry -> redirected to /_console/login?redirect=%2Fapps%2Fcom.example.showcase%2Fshowcase_task (login form screenshot). In-app … |
| platform-core.console-login · acceptance[4] | pass | re-login 200, console returned to the same route /apps/com.example.showcase/showcase_task (screenshot: Tasks grid, 10 records); fresh reads … |
| platform-core.console-login · negative[0] | pass | wrong password -> 401 INVALID_EMAIL_OR_PASSWORD, no set-cookie header, cookie jar empty, no localStorage token; UI shows red alert 'Invalid email or … |
| platform-core.console-login · negative[1] | pass | expired session got 401s and redirect/named re-auth state, never cached data as authed |
| platform-core.nav-surfaces-render · acceptance[0] | pass | layer: browser (Playwright/chromium 1243) against live HTTP boot :41501 with built console. 'pnpm test:smoke e2e/showcase-smoke.spec.ts' equivalent: … |
| platform-core.nav-surfaces-render · acceptance[1] | pass | served showcase_app nav: 49 non-separator leaves mapped to console paths vs 49 SURFACES paths — diff empty both ways; console-added 'All reports' … |
| platform-core.nav-surfaces-render · acceptance[2] | pass | /_console/apps/com.example.showcase/object_that_does_not_exist (2 fresh loads): screenshot shows header + sidebar alive, main 'Object Not Found — The … |
| platform-core.nav-surfaces-render · acceptance[3] | pass | none encountered: no render failure in 49 suite surfaces + 1 hand-walk + bad route (vacuous per verify; boundary fallback not exercised — knownGap) |
| platform-core.nav-surfaces-render · negative[0] | pass | suite: no blank main |
| platform-core.nav-surfaces-render · negative[1] | pass | suite: splash-aware wait/assertion green on all 49 |
| platform-core.nav-surfaces-render · negative[2] | pass | bad route did not white-page; shell present |
| platform-core.nav-surfaces-render · negative[3] | pass | chart surfaces passed polled boundingBox assertions |
| platform-core.builtin-apps-nav-render · acceptance[0] | pass | admin, groups expanded via aria-expanded, every sidebar link walked screenshot-first: Setup 45/45 (44 served + All reports), Account 9/9 (8 + All … |
| platform-core.builtin-apps-nav-render · acceptance[1] | pass | setup payload: 9 groups group_overview…group_advanced (advanced collapsed) filled with 44 leaves incl. contributions (Positions/Permission … |
| platform-core.builtin-apps-nav-render · acceptance[2] | pass | member Mei (get-session phone.demo@example.com, positions [org_member,everyone]): /_console/apps/com.objectstack.setup and /apps/setup -> screenshot … |
| platform-core.builtin-apps-nav-render · acceptance[3] | pass | forged member GET /api/v1/meta/app?id=setup -> 200 {items:[]}; GET /meta/app/setup -> 403 PERMISSION_DENIED; member unfiltered list = [showcase_app, … |
| platform-core.builtin-apps-nav-render · acceptance[4] | pass | member ?id=setup empty => nav_api_keys + settings URLs unreachable; CONTROL: account nav admin 8 vs member 8 identical (not the gate's proof) |
| platform-core.builtin-apps-nav-render · acceptance[5] | pass | nav_organizations absent (multiOrgEnabled:false, single); nav_business_units present with sys_business_unit registered (meta/object 200); … |
| platform-core.builtin-apps-nav-render · acceptance[6] | pass | nav_jwks, nav_sso_providers, sys_verification/sys_device_code entries absent from served setup nav and sidebar (sys_sso_provider object exists but … |
| platform-core.builtin-apps-nav-render · negative[0] | pass | no blank/placeholder; only 'failed to load' is the knownGap marketplace named error |
| platform-core.builtin-apps-nav-render · negative[1] | pass | member denied Setup on wire (403 / empty) and UI |
| platform-core.builtin-apps-nav-render · negative[2] | pass | no gated entry served to member (no setup app at all) |
| platform-core.builtin-apps-nav-render · negative[3] | pass | member GET /api/settings/‹ns> 403 SETTINGS_FORBIDDEN for all 9 namespaces (admin 200 each); /_console/apps/setup/system/settings/auth renders inside … |
| platform-core.v18-boot-refusals · acceptance[0] | pass | layer: unit + kernel (no HTTP). @objectstack/runtime @c4c515ad: organization-ownership-boot-guard.test.ts 22/22, … |
| platform-core.v18-boot-refusals · acceptance[1] | pass | production os serve --no-ui (OS_DATABASE_URL=file:copyB.db, auth secret + key set) exit 1, 0 listening/ready lines: "✗ This database carries no … |
| platform-core.v18-boot-refusals · acceptance[2] | pass | row-level SQLite diff (wal included): copyA (--dev) 69 pre-existing tables / 67 rows → 0 differences over pre-existing columns; 41 created tables all … |
| platform-core.v18-boot-refusals · acceptance[3] | pass | LIVE rig (not the pin): scratch stack r4/rig mounting new SecurityPlugin() + one object (sharingModel private), `serve --dev --no-server --preset … |
| platform-core.v18-boot-refusals · negative[0] | pass | both v18 boots over v17 copies refused before listening and left every pre-existing row unchanged (see acceptance[2]) |
| records-forms.crud-roundtrip · acceptance[0] | pass | UI New form POST /api/v1/data/showcase_account body {industry:'retail',status:'active',sales_region:'amer',name:'os-qa-r6w3c1'} -> 201 id … |
| records-forms.crud-roundtrip · acceptance[1] | pass | UI Edit->Update sent PATCH …/t96x1_vgfHoYa5Gp body {annual_revenue:4321000} -> 200; full-row GET before/after differs only in annual_revenue … |
| records-forms.crud-roundtrip · acceptance[2] | pass | detail More actions > Delete > confirm 'Delete Account "os-qa-r6w3c1"?' -> DELETE …/t96x1_vgfHoYa5Gp 200 {success:true}; filtered GET total 0; GET by … |
| records-forms.crud-roundtrip · acceptance[3] | pass | post-reload list screenshot at create: row os-qa-r6w3c1 Active/Retail badges, revenue '—', 15 records; post-reload at delete: row absent, 16 records … |
| records-forms.crud-roundtrip · acceptance[4] | pass | screenshot then DOM of record page Activity>Timeline>Changes: create line 'Owner — → Dev Admin; Account Name — → os-qa-r6w3c1; Industry — → Retail; … |
| records-forms.crud-roundtrip · acceptance[5] | pass | UI create of 'os-qa-r6w3c1-华宁' 201; filtered GET returns name with utf-8 hex 6f732d71612d7236773363312de58d8ee5ae81 == expected; $search=华宁 -> 2 rows … |
| records-forms.crud-roundtrip · acceptance[6] | pass | admin clone of os-qa account: 201 {object,id K8rng5Mp1VZhReg_ != sourceId, sourceId, record}, business values copied, id/created_at/updated_at … |
| records-forms.crud-roundtrip · acceptance[7] | pass | recipe search:qa-contributor-bound-member replayed (invite->sign-up->sys_member role member->sys_user_position contributor); premise: member list … |
| records-forms.crud-roundtrip · negative[0] | pass | Create with empty Account Name: inline 'Account Name is required', dialog stays open, zero POST captured, account total unchanged (reproduced on two … |
| records-forms.crud-roundtrip · negative[1] | pass | clones re-derive id/audit/autonumber (0001->0003) and drop readonly lead_score (droppedFields reason readonly); RLS-invisible source clone refused … |
| records-forms.crud-roundtrip · negative[2] | pass | POST showcase_account {industry,status} (no name) -> 400 VALIDATION_FAILED fields[{field:name,code:required}]; repeat with name:'' same |
| records-forms.crud-roundtrip · negative[3] | pass | POST with tax_id '123456789' and 'AB-CDEFGHI' -> 400 VALIDATION_FAILED fields[{field:tax_id,code:invalid_format,message:'Tax ID must look like … |
| studio-authoring.first-run-loop · acceptance[0] | pass | Driven by hand in the browser; F1 pin not run. Studio's New Package dialog (display name 维修中心, typed id com.example.repairs, namespace derived … |
| studio-authoring.first-run-loop · acceptance[1] | pass | After 'Publish all' (toast 'Published 1 item in this package (one atomic release)', publish-drafts publishedCount 1): GET … |
| studio-authoring.first-run-loop · acceptance[2] | pass | Record created in the Studio Records tab's Add record dialog (Status = In Repair): POST /api/v1/data/repairs_repair_ticket 201 {name:'Broken pump … |
| studio-authoring.first-run-loop · acceptance[3] | pass | Create app 'Repair Center' (identifier auto 'repair_center', 'add objects as menu items' checkbox on by default) -> Interfaces shows the Repair … |
| studio-authoring.first-run-loop · acceptance[4] | pass | Single boot: the boot log has one 'Server is ready', and the only restart mention is the watcher banner. The listener pid 15429 started 04:35:57 UTC … |
| studio-authoring.first-run-loop · acceptance[5] | pass | Forged writes as admin: PUT /api/v1/meta/object/showcase_forged_obj?mode=draft&package=com.example.showcase -> 422 WRITABLE_PACKAGE_REQUIRED … |
| studio-authoring.first-run-loop · negative[0] | pass | No silent acceptance: both forged write shapes were refused server-side (422/403) and nothing landed (see acceptance[5]). |
| studio-authoring.first-run-loop · negative[1] | pass | The published app is in the Home launcher, and the end-user list renders the label chip 'In Repair', not raw 'wip' (screenshots, acceptance[3]). |
Reproduction rules for fails
None: 0 clause fail this run.
Retest (anchor §4, SKILL §5 trigger 2)
api-backend.query-contract-matrix, fix data list door: a blank $select answers every column and an unrecognised $count value counts — malformed values are read as the absent default #26644 (empty$select/ bad$count): the fix holds. Driven on two loads of the same DB:GET /api/v1/data/showcase_task?$top=2&$select=answers 400VALIDATION_ERROR"Query parameter '$select' names no field". So do$select=,,select=,fields=and whitespace values.$count=maybeanswers 400 "must be true or false". So docount=maybe,$count=,TRUEand1.- The controls are unchanged:
$select=titlegives 1 column,$count=truegives total=10,$count=falsegives no total. - The
POST /querydoor answers 400VALIDATION_FAILEDatquery.fields,query.selectandquery.count. - The fix pins pass: two rest door pins (17 passed) and the metadata-protocol pin (37 passed).
- Residual, not a fail: the message names the parameter, but the envelope has no
paramkey, and three codes answer this one class.
Pins and the Playwright smoke
examples/app-showcase/e2e/showcase-smoke.spec.ts: 49 passed, 0 failed (2.6 min), run against a live boot on 41501 (SMOKE_API_URL), from a scratch copy.objectstack verify --rls, run separately from bareverify, on a scratch copy:- per-persona line:
21 PROVEN (21 consistent, 0 HOLES) · 3 NOT PROVEN (… 3 skipped); - total line:
all personas: 38 PROVEN (38 consistent, 0 HOLES) · 226 NOT PROVEN [unit: one object × persona probe]; - 10 of 10 positions probed.
- The bare-
verifycontrol tail read15 verified, 0 gaps, 0 FAILED, 1 needs-fixture, 8 skipped, with no PROVEN line.
- per-persona line:
- Dogfood pins (in-process HTTP), all green with
--maxWorkers=1:- private-owd 8, rls-fixture 6, owner-anchor-and-bulk-writes 12, static-readonly 4, readonly-when-parent 9, crud-persona-matrix 49, permission-zoo 12;
- public-read-owd 4, invoice-line-contributor-pair 5, controlled-by-parent 4, invoice-cbp 4;
- anonymous-deny-surfaces 75;
- wall-environment-metadata-refusal 23, wall-catalog-refusal 17, wall-package-doors-refusal 23;
- showcase-expand-crud-gate 10, packaged-action-disabled-dispatch-live plus packaged-activation-ledger-reach 19.
- Engine and unit pins, all green:
- objectql
engine.test.tsand filter-array-lowering 196, readonly-strip and isSystem 55; - rest request-schema-gate 16 and data list door: a blank $select answers every column and an unrecognised $count value counts — malformed values are read as the absent default #26644 doors 17, metadata-protocol 37;
- runtime action-activation-dispatch 11, service-automation flow-activation-ledger 47;
- rest meta-migrate-stored-walled-refusal 6, runtime packages-walled 30, automation-walled 12, meta-walled-catalog 19;
- runtime identity-objects-default-organization pin 4, plugin-auth ensure-default-organization 57;
- cli ownership-ceremony and boot-refusal pins 179 (8 files), runtime boot-guard 22 plus kernel 10, plugin-security 3.
- objectql
- Not run, and scored by hand instead, with the reason stated:
ui/e2e/live/record-history-display.spec.tsandui/e2e/live/studio-object-designer.spec.tsneed the console dev server on fixed ports outside the runner ranges;packages/mcp/src/__tests__/plugin.test.tsis a plugin unit over a mocked ctx and corroborates only; everyai.mcp-stdio-fail-closedclause was scored on liveos startstdio legs.
Derived item verdicts and fixture gaps
access-security.rls-both-sides: PARTIAL. acceptance[5] is blocked{by: dependency, ref: knownGaps[0] / qa(checklist): park the blocked partial-coverage gaps of the 17.7 pre-release runs (#21720, #21721, #21782, #21784) — each gets a fixture recipe, a pin, a re-pointed clause or a recorded knownGap #22017 row 11}: the D11 spot-check needs the maintainer-held private write-up. The public half (the three benign skip lines, plus a hand spot-check of project_membership and the ext_* objects as a plain member) holds.access-security.crud-permission-matrix: PARTIAL. acceptance[5] is blocked{by: dependency, ref: security: no door can bind a permission set to theguestanchor — ADR-0138 D3 item 5 has no enforcer (PUT /meta/position/guestanswers 403 NOT_OVERRIDABLE; guest suggestions are refused) #23267} per knownGaps[2]: no door binds a set to the guest anchor. Re-observed:PUT /meta/position/guestanswers 403NOT_OVERRIDABLE, and anonymous requests answer 401.cli.organization-ownership-ceremony: PARTIAL. acceptance[5] is blocked{by: fixture} on one leg: thecli-18-prerelease-dbdump's reset token expired at 2026-10-27T17:42:21Z, one hour after the dump was generated, so the reset answers 400INVALID_TOKEN. Every other leg of acceptance[5] held (refused first boot, reviewed apply complete with blocking 0, moved rows with 0 diffs, sign-ins 200/401, onesys_http_deliveryrow).- Coverage notes on passing items: the walled item's install-local leg rests on the wall-* pins (an admitted install writes into the shared tree);
platform-core.nav-surfaces-render's ErrorBoundary fallback is still unexercised (existing knownGap);platform-core.builtin-apps-nav-render's marketplace catalog content is environment-blocked (egress denied, existing knownGap); the v17 fixture is a blank-scaffold DB, not a showcase DB.
Off-clause probes (RUNNER rule 8)
53 runner-minutes in total, after the clauses had verdicts, on the same boots and as the same personas: R1 4, R2 10, R3 5, R4 8, R5 10, R6 8, R7 8. R1 and R3 were under the 10–15 minute budget.
- Doors:
- data CRUD, list and query, clone, batch create/update/delete, shares, field-access, export, analytics;
meta/app,meta/apps,/api/settings/:ns, sign-in and get-session,/ready;- actions, activation and the flow trigger; the approvals request, decision and actions routes;
- MCP key admission and MCP reads and writes;
- datasource and
sys_metadataside channels; - the walled overlay types;
- the ownership-ceremony command and
os dev -d "".
- Personas: admin, plain member, contributor, client_liaison, auditor, ops, field_ops_delegate, an approver, anonymous, and a bogus or empty bearer token.
- Boundary classes:
- empty, whitespace and comma-only values;
- unknown, empty and trailing-slash ids, and key-case variants;
- forged owner, id and audit overrides; non-object overrides; RLS-invisible targets; foreign requests;
- opposite posture (walled against single; setup for a non-admin); readers outside scope.
- Findings, each in its own card (listed in the close-out comment):
api-backend.query-contract-matrix· observed beside the clauses: a blank$searchFieldsis read as absent;records-forms.crud-roundtrip· observed beside the clauses: the history "Changes" line shows a currency value unformatted;records-forms.crud-roundtrip· observed beside the clauses: clone accepts a non-objectoverrideswith 201;approvals.account-app-entry· observed beside the clauses: the approvals actions sub-route answers 200[]for an unknown request.
- Security findings:
records-forms.crud-roundtrip· observed beside the clauses · security finding — detail withheld, fix dispatchedrecords-forms.crud-roundtrip· observed beside the clauses · security finding — detail withheld, fix dispatched
- Recorded, not filed:
- the publish response for a namespace-prefix refusal is HTTP 200 with an inner
outcome: "refused", which is how that response is designed; - a PATCH of a stored legacy datasource row carries its withheld invalid keys forward, with no cleartext served;
- a field-zoo clone does not carry a masked password field (its source read is masked).
- the publish response for a namespace-prefix refusal is HTTP 200 with an inner
Time
- Environment prep: 13 min (install and full build) plus about 2 min (dispatcher compile boot and bundle check), then 30 runner-minutes of per-runner prep (scratch copies, persona minting, the walled boot, the v17 DB, scratch Postgres).
- Testing: 40 min wall clock (04:34Z–05:14Z), or 114 runner-minutes of clause work plus 53 of probes.
- Ratio: about 1 : 2.7 by wall clock (15 min prep to 40 min testing), and about 1 : 5.6 by runner-minutes (30 to 167).
Checklist-accuracy findings from this run are parked on #27377 as ledger edits for the devx lane; they are not repeated here.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcV2ijbfB8Drvs2oik6
Close-out for this run (SKILL §5).
Extracted: #27484 · api-backend.query-contract-matrix · observed beside the clauses
Extracted: #27486 · records-forms.crud-roundtrip · observed beside the clauses
Extracted: #27489 · records-forms.crud-roundtrip · observed beside the clauses
Extracted: #27493 · approvals.account-app-entry · observed beside the clauses
Parked-on: #27377 · access-security.rls-both-sides · acceptance[5] D11 spot-check blocked(dependency), knownGaps[0]
Parked-on: #27377 · access-security.crud-permission-matrix · acceptance[5] blocked(dependency, #23267), knownGaps[2]
Parked-on: #27377 · cli.organization-ownership-ceremony · acceptance[5] reset-password leg blocked(fixture): the cli-18-prerelease-db dump's token expired
Parked-on: #27377 · checklist-accuracy findings from this run (13 lines, listed on the anchor)
Four-way disposition of
failrows: none owed, because this run recorded 0 clausefail.Two security findings (off-clause, records-forms.crud-roundtrip): detail withheld, fix dispatched through pm-dispatch. No card is filed for them, per the maintainer ruling of 2026-10-29.
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:devx#1 · sunhaolin · session_017xRBcV2ijbfB8Drvs2oik6
Correction to the off-clause security rows in the record body, following the PM session's direction of 2026-10-29:
The second row needs a contract decision before any fix. It is with the PM session.
Generated by Claude Code
docs(qa): wave-3 accuracy slice S3 — access-security + identity-auth …
docs(qa): wave-3 accuracy slice S2 — studio-authoring.json
docs(qa): wave-3 accuracy slice S1 — conditional rules, dirty guard, …
objectstack-fleet commentedon Nov 1, 2026
domain:devx#1 · sunhaolin · session_017xRBcVy4VXmkQjn2MGeaWk
Superseded-by: #28545
W3-C1R re-ran all 23
priority:P0items ateeec88d1and judged every one, so nothing is carried forward (checklist-test SKILL §5, supersede protocol). The parkedcli.organization-ownership-ceremonygap from this record is closed ateeec88d1. The twoaccess-securityacceptance[5] gaps still stand, re-parked by 6554042054. Closed asnot_plannedper the protocol · 2026-11-01T06:46ZGenerated by Claude Code