Skip to content

QA run · priority:P0 (23/23) · c4c515ad · 2026-10-29 · 20 PASS / 3 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #27481

Closed as not planned

Description

@objectstack-fleet

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 status clean before and after the run), including ui/. The Console was built in-repo from the same commit: pnpm install --frozen-lockfile, then pnpm build --concurrency=2 (12m43s, exit 0), then pnpm console:build --concurrency=2 (exit 0). node scripts/check-dev-prereqs.mjs was green (105 artifacts).
  • Stale-console-bundle ruled out: every boot served /_console/ entry assets/index-DkXHr74P.js, the same file as packages/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 the executablePath override).
  • App: examples/app-showcase. One os dev compile boot by the dispatcher wrote dist/objectstack.json. Every runner boot afterwards used --no-compile (from the tree, or from a scratch copy outside the tree with node_modules symlinked), 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 info where 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 dev with OS_TENANCY_POSTURE=isolated, OS_PLATFORM_OWNER_EMAIL and OS_AUTH_MEMBERSHIP_POLICY=invite-only. The banner read Tenancy: isolated, not degraded.
  • The v17-shaped DB came from npm @objectstack/cli@17.7.0 --legacy-peer-deps, from a blank-scaffold os dev boot, because no 17.x showcase is published. The 18.0 pre-release DB is the cli-18-prerelease-db restore. 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 400 VALIDATION_ERROR "Query parameter '$select' names no field". So do $select=,, select=, fields= and whitespace values.
    • $count=maybe answers 400 "must be true or false". So do count=maybe, $count=, TRUE and 1.
    • The controls are unchanged: $select=title gives 1 column, $count=true gives total=10, $count=false gives no total.
    • The POST /query door answers 400 VALIDATION_FAILED at query.fields, query.select and query.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 param key, 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 bare verify, 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-verify control tail read 15 verified, 0 gaps, 0 FAILED, 1 needs-fixture, 8 skipped, with no PROVEN 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:
  • Not run, and scored by hand instead, with the reason stated:
    • ui/e2e/live/record-history-display.spec.ts and ui/e2e/live/studio-object-designer.spec.ts need the console dev server on fixed ports outside the runner ranges;
    • packages/mcp/src/__tests__/plugin.test.ts is a plugin unit over a mocked ctx and corroborates only; every ai.mcp-stdio-fail-closed clause was scored on live os start stdio legs.

Derived item verdicts and fixture gaps

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_metadata side 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 $searchFields is 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-object overrides with 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 dispatched
    • records-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).

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

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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 fail rows: none owed, because this run recorded 0 clause fail.

    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

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    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:

    • records-forms.crud-roundtrip · observed beside the clauses · security finding — detail withheld, fix dispatched
    • records-forms.crud-roundtrip · observed beside the clauses · security finding — detail withheld, reported to PM

    The second row needs a contract decision before any fix. It is with the PM session.


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 1, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · sunhaolin · session_017xRBcVy4VXmkQjn2MGeaWk

    Superseded-by: #28545

    W3-C1R re-ran all 23 priority:P0 items at eeec88d1 and judged every one, so nothing is carried forward (checklist-test SKILL §5, supersede protocol). The parked cli.organization-ownership-ceremony gap from this record is closed at eeec88d1. The two access-security acceptance[5] gaps still stand, re-parked by 6554042054. Closed as not_planned per the protocol · 2026-11-01T06:46Z


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions