Skip to content

QA run · release-18.3.0-w3-tier1-a (73/73) · c4c515ad · 2026-10-29 · 59 PASS / 14 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #27409

Closed

Description

@objectstack-fleet

domain:devx#1 · sunhaolin · session_017xRBcScm27Q3R5mkYLPWdB
Part of #27377 (wave 3, W3-C2a)

Selector release-18.3.0-w3-tier1-a: Tier 1 half A of the 18.3.0 release-candidate sweep, the 73 runnable items that carry automated.ref in access-security, ai, api-backend, approvals, attachments-storage, automation and cli. Release-candidate rerun (SKILL §5 trigger 1). Every item has a verdict: 59 PASS / 14 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN. No item is planned.

Environment fingerprint

  • Subject: framework c4c515ad3cc342043a2b81b5a06a5793f79a23e8 (detached, never followed main). The Console was built in-repo from that same commit (ui/): pnpm build --concurrency=2 (114/114 tasks), then pnpm console:build --concurrency=2 (cache hit plus copy). pnpm build alone left packages/console/dist absent, so the first boots answered /_console 503 until console:build ran. Browser legs were re-driven after that.
  • Node v22.22.0, pnpm 10.31.0, Playwright chromium from /opt/pw-browsers.
  • App: examples/app-showcase. Canonical boot per area, each with its own port and file DB: OS_PORT=PORT OS_STORAGE_LOCAL_ROOT=/tmp/w3c2a/AREA/uploads setsid pnpm -C examples/app-showcase exec objectstack dev --ui --seed-admin -p PORT -d file:/tmp/w3c2a/AREA/data.db. Ports: cli 41411, ai 41412, approvals 41413, api-backend 41414, attachments-storage 41415, automation 41416 (plus a Vite console dev server on 41496 for the live Playwright spec), access-security 41417.
  • Extra boots: a walled isolated boot for access-security (OS_TENANCY_POSTURE, OS_PLATFORM_OWNER_EMAIL, OS_AUTH_MEMBERSHIP_POLICY); a second automation boot with OS_AUTOMATION_SCHEDULED_WORK_ENABLED=1 from a scratch copy of the showcase; scratch apps and copies for cli under /tmp/w3c2a/cli; a local registry with no upstream for the cli scaffold pre-release leg (108 tarballs packed from c4c515a).
  • Seed: --seed-admin (admin@objectos.ai), the showcase demo personas, and members minted by invite then sign-up (RUNNER environment facts).
  • Times: 2026-10-29 04:20Z to 05:30Z.
  • Execution: one coordinating runner plus seven per-area runner subagents in parallel, each with its own port and DB. Their verdicts were checked against their evidence files and transcripts before this record was written. One subagent's self-reported minutes were inconsistent with its wall clock, so the time figures below use wall clock where they disagree.

Scope: selector and the revision each verdict is valid for

Revisions as node scripts/checklist-select.mjs reports them at c4c515a. All 73 match the area files.

  • access-security (23): rls-both-sides r9, write-path-guards r8, record-access-explain r4, crud-permission-matrix r10, owd-sharing-matrix r6, fls-mask-and-strip r7, anonymous-deny-surfaces r5, public-form-withdrawal-layers r5, activation-write-operator-gate r12, platform-owner-email-anchor r11, me-permissions-aggregation-parity r4, record-view-read-audit r6, share-link-landing-page r6, anonymous-floor-v18-doors r5, walled-environment-metadata-operator-only r6, meta-authoring-trail-and-audience-gates r4, security-catalog-activation-and-clone-doors r3, security-catalog-one-holder-and-boot-report r4, grant-table-write-contract r8, parent-and-organization-write-guards r7, deployment-tables-platform-only r4, share-link-combined-gates r5, org-admin-assignment-boundary r2
  • ai (6): mcp-http-surface r7, mcp-stdio-fail-closed r8, mcp-validate-expression r5, skill-instructions-mcp-prompts r4, mcp-oauth-private-host-transport r5, mcp-coded-refusals-and-runtime-exposure r3
  • api-backend (13): query-contract-matrix r7, bulk-write-contract r6, declarative-endpoint-execution r6, packaged-action-disabled-dispatch r9, action-activation-door-contract r7, rest-crud-config-contract r6, rest-batch-config-contract r6, rest-metadata-config-contract r8, rest-route-generation-tombstones r4, second-object-exposure-and-internal-fields r3, data-request-shape-and-query-arity r4, meta-read-doors-v18 r4, error-sentences-and-unique-violation-wire-code r5
  • approvals (4): email-action-token-door r9, status-mirror-field r5, request-page-reply-and-reader-visibility r4, act-door-and-admin-rescue-slate r5
  • attachments-storage (10): presigned-upload-roundtrip r3, download-authz-both-sides r9, read-inherits-parent-rls r9, attach-requires-parent-edit r9, sys-file-status-pipeline r5, orphan-tombstone-reap r3, upload-session-abort r6, inline-grid-receipt-cells r5, upload-limits-scope-and-ownership r3, chunked-upload-integrity r8
  • automation (10): trigger-type-matrix r9, screen-flow-roundtrip r7, durable-suspend-restart r3, paused-run-trigger-record-masked r5, setup-packaged-automation-board r10, flow-registration-verdict-on-read r2, flow-authoring-refusals-v18 r4, flow-run-semantics-v18 r3, inbound-hook-timestamped-signature r2, scheduled-work-opt-in r2
  • cli (7): scaffold-first-run r7, dev-automigrate-policy r8, migrate-meta-write-stored-and-all r3, organization-ownership-ceremony r6, meta-package-flags-and-explain r3, validate-v18-authoring-verdicts r2, verify-derived-proof-families r3

Tier 1 pins: one vitest invocation per area per package

62 invocations at --maxWorkers=1 covered every pinned test file the 73 refs name: 279 file runs, 7488 passed, 0 failed, 3 skipped. The 3 skips are by design: two rls-multitenant cases and one cross-tenant matrix case. cli *.e2e.test.* ran separately under OS_TEST_TIERS=nightly. The ui jsdom suites ran from the ui/ root (the objectui vitest guard refuses a package-dir run).

area invocations file runs passed
access-security 19 96 2249
ai 6 18 293
api-backend 7 51 1783
approvals 5 18 545
attachments-storage 6 27 667
automation 12 32 1076
cli 7 37 875

Live Playwright specs:

  • ui/e2e/live/screen-flow.spec.ts was run against the automation boot. 1 passed on the third attempt, after two runs that failed while the console dev server was still cold. Run 2 had completed server-side.
  • ui/e2e/live/grid-file-upload.spec.ts was not run. That item was driven by hand against the built console instead.

Per RUNNER rule 6, each clause names the layer its pin drives. A pin below the clause's oracle scored the clause partial unless its live leg was driven on the area's boot.

Reproduction rules

None: 0 clause fail. The product defects found by off-clause probes are extracted as their own cards, each with its own reproduction. They are listed in the close-out comment.

Derived item verdicts

  • PASS (59): every item not listed below.
  • PARTIAL (14), each with the clause that kept it below PASS:
    • access-security.rls-both-sides: A5. The D11 spot-check needs the maintainer-held write-up (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).
    • access-security.crud-permission-matrix: A5. Guest create-without-read is not observable on a stock boot (security: no door can bind a permission set to the guest anchor — ADR-0138 D3 item 5 has no enforcer (PUT /meta/position/guest answers 403 NOT_OVERRIDABLE; guest suggestions are refused) #23267).
    • ai.mcp-oauth-private-host-transport: A0 blocked(fixture), the host holds no RFC1918 or link-local address. A2 partial, its private-address leg is missing.
    • api-backend.action-activation-door-contract: A4. The 503 arm for a degraded metadata plane has no stock door and no pin.
    • approvals.email-action-token-door: A0, A1, A3 and A4 are below the oracle (no pin and no stock door mints an action token). A5 blocked(fixture).
    • approvals.status-mirror-field: A2. The user-less cascade refusal on an SLA auto-decision has service-unit evidence only.
    • approvals.request-page-reply-and-reader-visibility: A2, no non-admin persona holds read on sys_approval_request on the stock showcase. A3, flipping the reader flag needs an object metadata write.
    • attachments-storage.read-inherits-parent-rls: A3. The bounded-probe half is reachable only through engine and unit pins.
    • attachments-storage.sys-file-status-pipeline: A2. The deleted-row-with-live-holder half has no live door.
    • attachments-storage.orphan-tombstone-reap: A1. The failed byte-delete veto has unit evidence only.
    • attachments-storage.upload-session-abort: A3, the warning text is asserted only on a mock logger. A4, failed is reachable only through a test seam.
    • automation.paused-run-trigger-record-masked: A0 and A1. No stock object has an internal: true field, so the internal-key-absent half rests on the in-process pin.
    • automation.setup-packaged-automation-board: A5. A plain member cannot open the Setup app, so the member's refusal is seen only as the server body.
    • cli.organization-ownership-ceremony: A4. The drop gate was driven on the 18.0.0-next.5 dump, because no v17-shaped DB was provisioned.

Fixture gaps and partial-coverage gaps are parked on #27377. The anchor comment lists them.

Off-clause probes (RUNNER rule 8)

About 48 agent-minutes in total, after the clauses had verdicts, on the same boots and personas:

  • access-security, ~6 min: the explain and share-link doors as admin, a plain member and the auditor; empty, unknown and missing ids. No finding. One cosmetic observation: the anonymous share page shows raw owner and organization ids.
  • ai, ~2 min, short of budget: MCP HTTP auth with empty, unknown and revoked keys; get_record with an empty id; validate_expression with empty or blank input and a bad site; prompts/get with an empty name. Finding: validate_expression answers ok:true for a blank expression (extracted).
  • api-backend, ~10 min: list and query doors with boundary $top, $skip, $orderby, $filter, $select and $expand values; bulk doors as admin and two members. No defect.
  • approvals, ~10 min: the act page (no token, empty token, oversized token, a script token that came back escaped), the reply door, and member access to others' requests. No defect. One hardening note: the write routes answer 403 for an existing request and 404 for an unknown id. It is not exploitable, because it needs a signed-in member and reveals only whether a random UUID exists.
  • attachments-storage, ~5 min: acl flips by other personas; unknown, empty and malformed ids on download and complete; size and filename edges on presign; chunk-index edges; attaching another user's file. Findings: two defects in chunk-index and presign-size validation (extracted), and one more:
    • attachments-storage.download-authz-both-sides · observed beside the clauses · security finding — detail withheld, fix dispatched
  • automation, ~8 min: run, screen and resume doors with unknown ids and bad inputs; toggle and clone edge cases; the action activation doors. Findings: cloning a packaged flow records no actor, and /automation/_status reports a time_relative flow as bound when its trigger refused it (both extracted).
  • cli, ~7 min: meta register with a blank package, explain boundaries, migrate meta --from boundaries, ceremony re-plan and re-apply. No defect. One low-severity observation: --from 99 warns but is not refused.

Time: environment prep vs testing

  • Environment prep: cold install plus pnpm build took 13 min wall (04:21Z to 04:34Z), plus 1 min of console:build, plus about 39 agent-minutes of per-area boots and fixtures.
  • Testing: the pin batches took 26 min wall (04:34Z to 05:00Z), plus about 167 agent-minutes of clause scoring and live legs, plus about 48 agent-minutes of probes.
  • Ratio: about 1 to 4.5. Wall clock for the whole run was about 70 min.

Per-clause verdicts

One row per acceptance clause, with the layer and one line of text oracle evidence. Each negative[] entry was checked under the clause it guards. access-security is below; ai, api-backend and approvals are in the first comment; attachments-storage, automation and cli are in the second.

access-security

item · rev clause verdict layer · text evidence
access-security.rls-both-sides · r9 A0 pass HTTP-in-process: showcase-private-owd.dogfood.test.ts — 8 passed (in-process HTTP stack via app.request): 'a member LISTS only the notes they own', 'the OTHER member is symmetric'
access-security.rls-both-sides · r9 A1 pass HTTP-in-process: showcase-private-owd: 'a member cannot READ another owner's note by id', 'a foreign by-id read is non-2xx' passed
access-security.rls-both-sides · r9 A2 pass HTTP-in-process: showcase-private-owd: 'a refused foreign PATCH leaves the row byte-identical on the admin re-read' passed (negative[0] held)
access-security.rls-both-sides · r9 A3 pass HTTP-in-process: showcase-private-owd: 'the admin (platform posture) lists every note this file created — the entitled side' passed
access-security.rls-both-sides · r9 A4 pass CLI-spawn: objectstack verify --rls (examples/app-showcase, own invocation, exit 0): per-persona line '21 PROVEN (21 consistent, 0 HOLES) · 3 NOT PROVEN (0 member-visible, 0 probe-blocked, 3 skipped)'; total '38 PROVEN (38 consis…
access-security.rls-both-sides · r9 A5 partial CLI-spawn: skip half pass: 3 skipped rows each explained (showcase_project_membership 'no plain-text probe field'; ext_customer/ext_order 'external read-only object'); D11 spot-check blocked(dependency, #22017 row 11)
access-security.write-path-guards · r8 A0 pass HTTP-in-process: showcase-static-readonly.dogfood.test.ts — 4 passed (in-process HTTP) incl. the INSERT strip ADVERTISED case (droppedFields + X-ObjectStack-Dropped-Fields)
access-security.write-path-guards · r8 A1 pass HTTP-in-process: showcase-static-readonly.dogfood.test.ts UPDATE strip case passed (4/4)
access-security.write-path-guards · r8 A2 pass HTTP-in-process: owner-anchor-and-bulk-writes.dogfood.test.ts — 12 passed (in-process HTTP): member owner forge refused, row not created
access-security.write-path-guards · r8 A3 pass HTTP-in-process: owner-anchor-and-bulk-writes: transfer/disown refused with owner unchanged, self-owner insert 2xx; admin 'a privileged caller CAN …' cases passed (negative[0])
access-security.write-path-guards · r8 A4 pass HTTP-in-process: owner-anchor-and-bulk-writes: member REST createMany of 3 rows reads back owner_id == caller (12/12 passed)
access-security.write-path-guards · r8 A5 pass HTTP-in-process: showcase-readonly-when-parent.dogfood.test.ts — 9 passed (in-process HTTP): paid invoice/lines locked; mixed updateMany per-row droppedFields reason readonly_when
access-security.write-path-guards · r8 A6 pass HTTP-in-process: showcase-readonly-when-parent: continueOnError updateMany total 3/succeeded 2/failed 1, violating row VALIDATION_FAILED unchanged (9/9 passed)
access-security.record-access-explain · r4 A0 pass browser (live /_console, booted server): Studio Access pillar > Explain access, user=auditor/plain, showcase_private_note, probe record: screenshot shows 10 layers + 'Record … is VISIBLE / NOT visible', 'Decided by: View/Modify A…
access-security.record-access-explain · r4 A1 pass HTTP-booted-server: POST /api/v1/security/explain as admin {userId:auditor, recordId}: 200, record {visible:true, decidedBy:'vama_bypass'}, layer vama_bypass contributors [showcase_auditor] (pin zoo explain case is in-process onl…
access-security.record-access-explain · r4 A2 pass HTTP-booted-server: auditor: explain visible:true ∧ GET /data/showcase_private_note/‹id> 200; plain member: explain visible:false ∧ GET 404 RECORD_NOT_FOUND
access-security.record-access-explain · r4 A3 pass HTTP-booted-server: plain-member explain: 200, record {visible:false, decidedBy:'sharing'}, no EXPLAIN_FAILED; negative[0]: admin asking, principal is the plain member (sets [showcase_member_default, member_default])
access-security.record-access-explain · r4 A4 pass browser + HTTP-booted-server: panel's own /security/explain network body vs my API-twin body: identical layer ids/verdicts/contributors/record outcomes for both personas (compare=true); panel text renders the same 10 layers
access-security.crud-permission-matrix · r10 A0 pass HTTP-in-process: showcase-crud-persona-matrix.dogfood.test.ts — 49 passed (in-process HTTP): every allowed cell 2xx + persisted; plus verify --rls CRUD tail 15 verified, 0 FAILED
access-security.crud-permission-matrix · r10 A1 pass HTTP-in-process: crud-persona-matrix: denials 403 PERMISSION_DENIED; 'the 16 showcase_field_ops_delegate × sys_* cells answer the matrix' (405 on sys_user create/delete) passed
access-security.crud-permission-matrix · r10 A2 pass HTTP-in-process: crud-persona-matrix sweep asserts denied CREATE leaves no row (49/49 passed)
access-security.crud-permission-matrix · r10 A3 pass HTTP-in-process: crud-persona-matrix: 'viewAllRecords: the auditor reads a FOREIGN private note…' and '…inquiry, invoice and invoice line…' passed
access-security.crud-permission-matrix · r10 A4 pass HTTP-in-process: crud-persona-matrix: 'modifyAllRecords: ops PATCHes a FOREIGN announcement; the same PATCH by a plain member is denied' passed
access-security.crud-permission-matrix · r10 A5 blocked n/a: blocked(dependency, #23267): no door binds a set to the guest anchor (knownGaps[2]); not attempted
access-security.crud-permission-matrix · r10 A6 pass HTTP-in-process: crud-persona-matrix: 'records the verdict of every cell…' + 41 showcase_* rows + delegate × sys_* case; plus verify --rls RLS block (21 PROVEN, 0 HOLES)
access-security.owd-sharing-matrix · r6 A0 pass HTTP-in-process: showcase-private-owd.dogfood.test.ts — 8 passed (in-process HTTP)
access-security.owd-sharing-matrix · r6 A1 pass HTTP-in-process: showcase-public-read-owd.dogfood.test.ts — 4 passed (in-process HTTP); live corroboration: plain member GET of admin announcement by id 200
access-security.owd-sharing-matrix · r6 A2 pass HTTP-in-process: showcase-crud-persona-matrix modifyAllRecords case passed
access-security.owd-sharing-matrix · r6 A3 pass HTTP-in-process: showcase-crud-persona-matrix: contributor × showcase_project edit 2xx persisted; member_default × project edit 403 (49/49); live: C PATCH 200, P PATCH 403 PERMISSION_DENIED
access-security.owd-sharing-matrix · r6 A4 pass HTTP-in-process: showcase-invoice-line-contributor-pair.dogfood.test.ts — 5 passed (in-process HTTP); D11 verdict recorded on rls-both-sides acceptance[5] only (dedupe #7687)
access-security.owd-sharing-matrix · r6 A5 pass HTTP-in-process: invoice-line-contributor-pair: auditor list and by-id carry C1 line (5/5 passed)
access-security.owd-sharing-matrix · r6 A6 pass HTTP-in-process: all four models driven by the cited pins: private, public_read, public_read_write, controlled_by_parent (+ controlled-by-parent 4, showcase-invoice-cbp 4 passed)
access-security.fls-mask-and-strip · r7 A0 pass HTTP-in-process: showcase-permission-zoo.dogfood.test.ts — 12 passed (in-process HTTP) 'FLS: a contributor can edit a project but NOT its budget fields'; live: C name PATCH 200
access-security.fls-mask-and-strip · r7 A1 pass HTTP-in-process: zoo FLS case passed; live: C budget PATCH 403 '[Security] Field write denied … [budget]', admin re-read 90000 before/after
access-security.fls-mask-and-strip · r7 A2 pass HTTP-in-process: zoo 'FLS: the admin's budget write on the same project succeeds and persists' passed
access-security.fls-mask-and-strip · r7 A3 pass browser (live /_console): contributor edit form …/showcase_project/record/‹id>/edit rendered (screenshot): budget input disabled=true, spent disabled=true, 'You do not have edit access to this field'; name enabled
access-security.fls-mask-and-strip · r7 A4 pass HTTP-in-process + browser: showcase-fls-read-mask-strip.dogfood.test.ts — 8 passed (in-process HTTP); live stock showcase_client_liaison member: API record lacks budget/spent/budget_remaining keys, UI detail shows no Budget; admi…
access-security.anonymous-deny-surfaces · r5 A0 pass HTTP-in-process: showcase-anonymous-deny-surfaces.dogfood.test.ts — 75 passed (in-process HTTP, platform-default posture)
access-security.anonymous-deny-surfaces · r5 A1 pass HTTP-in-process: showcase-anonymous-deny-surfaces.dogfood.test.ts — 75 passed (in-process HTTP, platform-default posture): action probe nonexistent id 401
access-security.anonymous-deny-surfaces · r5 A2 pass HTTP-in-process: showcase-anonymous-deny-surfaces.dogfood.test.ts — 75 passed (in-process HTTP, platform-default posture)
access-security.anonymous-deny-surfaces · r5 A3 pass HTTP-in-process: showcase-anonymous-deny-surfaces.dogfood.test.ts — 75 passed (in-process HTTP, platform-default posture)
access-security.anonymous-deny-surfaces · r5 A4 pass HTTP-in-process: showcase-anonymous-deny-surfaces.dogfood.test.ts — 75 passed (in-process HTTP, platform-default posture)
access-security.anonymous-deny-surfaces · r5 A5 pass HTTP-in-process: showcase-anonymous-deny-surfaces.dogfood.test.ts — 75 passed (in-process HTTP, platform-default posture): anonymous GET /forms/contact-us 200
access-security.anonymous-deny-surfaces · r5 A6 pass HTTP-in-process: showcase-anonymous-deny-surfaces.dogfood.test.ts — 75 passed (in-process HTTP, platform-default posture): all seven variant families driven
access-security.public-form-withdrawal-layers · r5 A0 pass HTTP-in-process: showcase-public-form-withdrawal-layers.dogfood.test.ts — 4 passed (in-process HTTP): save 200 env-wide, both doors 404 FORM_NOT_FOUND, 0 rows
access-security.public-form-withdrawal-layers · r5 A1 pass HTTP-in-process: same file: both doors open, row lands in the active organization (4/4)
access-security.public-form-withdrawal-layers · r5 A2 pass plugin-unit: packages/rest/src/public-form-withdrawal.test.ts — 27 passed (RestServer over mocked protocol) + metadata-core anonymous-form-intake.test.ts 47 passed (test oracle)
access-security.public-form-withdrawal-layers · r5 A3 pass plugin-unit: public-form-withdrawal.test.ts kill-switch describe (27 passed) + protocol.org-scoped-write-refused.test.ts 306 passed (in-process protocol, stub registry)
access-security.public-form-withdrawal-layers · r5 A4 pass plugin-unit: anonymous-form-intake.test.ts schema-parsed false case + protocol block (a) passed (47 / 306)
access-security.public-form-withdrawal-layers · r5 A5 pass plugin-unit: protocol.org-scoped-write-refused.test.ts block (c) package-less env-wide copy cases passed (306)
access-security.activation-write-operator-gate · r12 A0 pass HTTP-in-process: activation-write-operator-gate-single.dogfood.test.ts — 11 passed (in-process HTTP, stock single): flow toggle 403 FLOW_ENABLEMENT_DENY_MESSAGE (tier, not §5)
access-security.activation-write-operator-gate · r12 A1 pass HTTP-in-process: same file: action door 403 'a packaged action' / 'functionally equivalent to deleting it'
access-security.activation-write-operator-gate · r12 A2 pass HTTP-in-process: same file: {enabled:"false"} still 403 at both doors; no sys_metadata_activation row
access-security.activation-write-operator-gate · r12 A3 pass HTTP-in-process: same file: runtime manage_metadata set without platform_admin admitted 200 at both doors, row key set has no organization_id
access-security.activation-write-operator-gate · r12 A4 pass plugin-unit + HTTP-booted-server (walled): automation-activation-posture-gate 19 + action-activation-posture-gate 29 passed; live isolated boot: org owner with manage_metadata 403 PERMISSION_DENIED naming 'isolated' posture + 'pl…
access-security.activation-write-operator-gate · r12 A5 pass plugin-unit: isSystem arms in automation-activation-posture-gate.test.ts (19) / action-activation-posture-gate.test.ts (29) passed; live restart re-hydration line not separately read
access-security.platform-owner-email-anchor · r11 A0 pass HTTP-in-process: platform-owner-email-anchor.dogfood.test.ts — 6 passed (in-process HTTP, restarted deployments on one DB): unset → M 403, admin 200
access-security.platform-owner-email-anchor · r11 A1 pass HTTP-in-process: same file: unverified match confers nothing
access-security.platform-owner-email-anchor · r11 A2 pass HTTP-in-process: same file: non-matching address confers nothing; admin still 200
access-security.platform-owner-email-anchor · r11 A3 pass HTTP-in-process: same file: [authz] refusal printed once naming the entry, M refused while verified
access-security.platform-owner-email-anchor · r11 A4 pass engine: resolve-authz-context.platform-admin-config.test.ts — 37 passed (unit over resolver) + dogfood live leg with system-stamped email_verified (6/6)
access-security.platform-owner-email-anchor · r11 A5 pass engine: resolve-authz-context.platform-admin-config.test.ts L5 + ADR-0131 D5 describes (37) + platform-admin.test.ts 25 + admin-standing-surface.test.ts 10 passed
access-security.me-permissions-aggregation-parity · r4 A0 pass HTTP-booted-server: C map showcase_project allowEdit:true → C PATCH 200 persisted; P map allowEdit:false → P PATCH 403 PERMISSION_DENIED
access-security.me-permissions-aggregation-parity · r4 A1 pass HTTP-booted-server: C fields['showcase_project.budget'] {readable:true,editable:false}; C budget PATCH 403, value 90000 unchanged; C GET carries budget 90000
access-security.me-permissions-aggregation-parity · r4 A2 pass HTTP-booted-server: /me/apps: admin [showcase_app, setup(setup.access), account], P [showcase_app, account]; 0 apps violate requiredPermissions ⊆ systemPermissions or tab hidden for admin/P/C/W
access-security.me-permissions-aggregation-parity · r4 A3 pass HTTP-booted-server: anonymous: /auth/me/permissions 200 {authenticated:false}, /auth/me/localization 200 {authenticated:false}, /me/apps 200 {apps:[]}
access-security.me-permissions-aggregation-parity · r4 A4 pass HTTP-booted-server: P ?userId=‹C id> on /auth/me/permissions returns P's own userId and a body identical to P's own; localization likewise P's
access-security.me-permissions-aggregation-parity · r4 A5 pass HTTP-booted-server: P localization 200 {currency:null, locale:'en-US', timezone:'UTC'}; after admin PUT /api/settings/localization {currency:EUR,timezone:Asia/Shanghai} → EUR / Asia/Shanghai (restored after)
access-security.me-permissions-aggregation-parity · r4 A6 pass HTTP-booted-server: W (sets incl organization_admin_no_bypass, no admin_full_access): zoo entry present + read 200; project allowEdit:true, own PATCH 200; sys_secret absent from map, read 403; only sys_secret + sys_flow_credentia…
access-security.record-view-read-audit · r6 A0 pass HTTP-in-process: record-view-read-audit.dogfood.test.ts — 7 passed (in-process HTTP with AuditPlugin): stock boot 0 read rows, no install line
access-security.record-view-read-audit · r6 A1 pass HTTP-in-process: same file: install line 'on 1 object(s) — showcase_account', one row per detail read, un-opted read none
access-security.record-view-read-audit · r6 A2 pass HTTP-in-process: same file: row action read, user_id M, old/new null, created_at in read window
access-security.record-view-read-audit · r6 A3 pass HTTP-in-process: same file: filtered LIST read leaves count unchanged
access-security.record-view-read-audit · r6 A4 pass HTTP-in-process: same file: exclusion warning names sys_job; install set omits it
access-security.record-view-read-audit · r6 A5 pass plugin-unit: read-audit.test.ts — 33 passed (plugin unit) isSystem/no-principal skips; audit-plugin.test.ts 21 passed
access-security.share-link-landing-page · r6 A0 pass browser (live /_console) + network: link_only link with per-link redact [summary]: resolve 200 body has no internal_notes/deal_value/summary values (150000 absent); page renders record + 'Some fields are hidden by the owner: inte…
access-security.share-link-landing-page · r6 A1 pass browser + network: password link: 401 NEEDS_PASSWORD → 'Password required'; wrong → 401 WRONG_PASSWORD 'Wrong password.'; right → 200 render; both 401 bodies record-free
access-security.share-link-landing-page · r6 A2 pass browser (screenshot) + network: revoked and expired: 'This link has expired or was revoked.' (410 EXPIRED_OR_REVOKED); garbage token: 'This link is invalid or no longer available.' (404 INVALID_OR_EXPIRED); bodies record-free
access-security.share-link-landing-page · r6 A3 pass browser + network: signed_in link anonymous: 401 SIGN_IN_REQUIRED record-free, 'Sign in required' + 'The owner shared this link with signed-in users only.', Sign in href /_console/login?redirect=%2Fs%2F‹token>, 0 password inputs;…
access-security.share-link-landing-page · r6 A4 pass browser (screenshot): fresh context /s/‹token> renders standalone layout with no console chrome/sidebar and no login redirect
access-security.anonymous-floor-v18-doors · r5 A0 pass HTTP-in-process: all 8 named files ≥1 test, 0 failed: anonymous-floor-v18-doors 13, showcase-anonymous-deny-surfaces 75, anonymous-door-sweep 20, rest-api-description-anonymous-deny 9, rest-docs-viewer-retired 6, i18n-anonymous-d…
access-security.anonymous-floor-v18-doors · r5 A1 pass HTTP-in-process: anonymous-floor-v18-doors: six doors 401 UNAUTHENTICATED/AUTH_REQUIRED, admin control 200 (/keys 405) (13/13)
access-security.anonymous-floor-v18-doors · r5 A2 pass HTTP-in-process: showcase-anonymous-deny-surfaces retired-viewer case: GET /api/v1/docs 404 = control body, all callers
access-security.anonymous-floor-v18-doors · r5 A3 pass HTTP-in-process: anonymous-floor-v18-doors: BOGUS token resolve non-401 4xx (live probe: /share-links/%20/resolve 404 INVALID_OR_EXPIRED)
access-security.anonymous-floor-v18-doors · r5 A4 pass HTTP-in-process: anonymous-floor-v18-doors: anonymous submit 201 body keys ['id'], forged fields not stored
access-security.walled-environment-metadata-operator-only · r6 A0 pass HTTP-in-process: all 7 files 0 failed: meta-migrate-stored-walled-refusal 6, packages-walled-write-refusal 30, automation-walled-definition-write 12, meta-walled-catalog-refusal 19, wall-environment-metadata-refusal 23, wall-cata…
access-security.walled-environment-metadata-operator-only · r6 A1 pass HTTP-booted-server (walled): isolated boot, org-A owner holding manage_metadata (not platform_admin), 2 rounds: PUT meta/object 403 FORBIDDEN (read-back 404), PUT meta/permission 403 FORBIDDEN, view publish 403 FORBIDDEN, DELETE …
access-security.walled-environment-metadata-operator-only · r6 A2 pass HTTP-booted-server: walled operator: PUT meta/object/qa_walled_probe 200 + read-back 200 (deleted after), clone 200; single boot: admin same PUT 200 + read-back 200
access-security.meta-authoring-trail-and-audience-gates · r4 A0 pass HTTP-in-process: meta-view-audience-alternate-doors 8, wall-authoring-trail-doors 31, meta-history-diff-authoring-door 20, meta-view-dashboard-audience-gate 19 — 0 failed
access-security.meta-authoring-trail-and-audience-gates · r4 A1 pass HTTP-in-process: wall-authoring-trail-doors single describe: history/audit/diff 403 FORBIDDEN, /packages/:id/commits 403 PERMISSION_DENIED (31 passed)
access-security.meta-authoring-trail-and-audience-gates · r4 A2 pass HTTP-in-process: meta-view-audience-alternate-doors: gated view absent from list, by-name/published/layers/draft 403 PERMISSION_DENIED, /history FORBIDDEN first vs studio.access PERMISSION_DENIED; ETag replay 403 not 304 (8 passe…
access-security.security-catalog-activation-and-clone-doors · r3 A0 pass HTTP-in-process: catalog-activation-door.dogfood 10, permission-set-clone-door.dogfood 7, runtime catalog-activation-door 71, permission-set-clone 23 — 0 failed
access-security.security-catalog-activation-and-clone-doors · r3 A1 pass HTTP-in-process: catalog-activation-door.dogfood: position off 200, one row, grants stop/return
access-security.security-catalog-activation-and-clone-doors · r3 A2 pass HTTP-in-process: catalog-activation-door.dogfood: everyone/guest 400 naming anchor, unknown 404
access-security.security-catalog-activation-and-clone-doors · r3 A3 pass HTTP-in-process: permission-set-clone-door.dogfood: 200 facets w/o adminScope/isDefault/packageId; 409; 404; 400; 403; 401 (7 passed); live walled operator clone 200
access-security.security-catalog-one-holder-and-boot-report · r4 A0 pass HTTP-in-process: security-catalog-one-holder-http 4, cold-boot-environment-holder 4, standalone-stack one-holder 6, cli security-catalog-overlays.integration 6, catalog-reference-report 15, permission-set-owner-binding 19, permis…
access-security.security-catalog-one-holder-and-boot-report · r4 A1 pass HTTP-in-process: one-holder-http: install-local 422 PLUGIN_REGISTER_FAILED naming showcase_auditor + com.example.showcase, /packages unchanged
access-security.security-catalog-one-holder-and-boot-report · r4 A2 pass HTTP-in-process: one-holder-http: PUT meta/permission with foreign packageId 400 VALIDATION_ERROR at packageId
access-security.security-catalog-one-holder-and-boot-report · r4 A3 pass CLI-in-process (oclif): security-catalog-overlays.integration.test.ts 6 passed: preview exit 1 with rows, --apply --yes exit 0, --json listed/deleted/rows
access-security.security-catalog-one-holder-and-boot-report · r4 A4 pass HTTP-in-process (captured process output): one-holder-http: clean boot one INFO line; reboot with 51 orphan grants logs one ERROR '[security] 51 … grant(s) …' capped at 50
access-security.grant-table-write-contract · r8 A0 pass HTTP-in-process: grant-table-write-contract.dogfood 3, permission-set-assignment-window.dogfood 7, grant-permission-set-name 16, window-order 11, granted-by-writer-provenance 20, grant-holder-membership-refusal 21 — 0 failed
access-security.grant-table-write-contract · r8 A1 pass HTTP-in-process: grant-table-write-contract: permission_set_id 400 INVALID_FIELD, duplicate 409 UNIQUE_VIOLATION
access-security.grant-table-write-contract · r8 A2 pass HTTP-in-process: permission-set-assignment-window: inverted window 400 VALIDATION_FAILED [[valid_until, rule_violation]], no 'unevaluable'; valid window 201
access-security.grant-table-write-contract · r8 A3 pass HTTP-in-process: grant-table-write-contract: granted_by naming another user stores the caller
access-security.grant-table-write-contract · r8 A4 pass HTTP-booted-server (walled): isolated boot: org-A owner grants showcase_contributor to two non-members of org A → 400 VALIDATION_FAILED fields[0] {field:user_id, code:reference_not_found}; self-grant control 201
access-security.parent-and-organization-write-guards · r7 A0 pass HTTP-in-process: parent-and-organization-write-guards 6, cbp-parent-attachment-comment-gates 10, cbp-explain-master-write 20, tenant-wall-organization-removal 34, engine-unreadable-master-detail-header 30, engine-predicate-relate…
access-security.parent-and-organization-write-guards · r7 A1 pass HTTP-booted-server (walled): isolated boot: owner PATCH own showcase_private_note {organization_id:null} 403 PERMISSION_DENIED, org kept; title PATCH 200 (control); inserts with organization_id null and '' stamped org A (also pin…
access-security.parent-and-organization-write-guards · r7 A2 pass HTTP-in-process: parent-and-organization-write-guards: unreadable vs nonexistent header same 400 reference_not_found body; cbp detail one 403 body
access-security.parent-and-organization-write-guards · r7 A3 pass HTTP-in-process: cbp-parent-attachment-comment-gates (10) ATTACHMENT_PARENT_ACCESS / ATTACHMENT_DELETE_DENIED; cbp-explain-master-write (20) explain not-writable by sharing matches PATCH
access-security.deployment-tables-platform-only · r4 A0 pass HTTP-in-process: deployment-tables-platform-only.dogfood 15, deployment-level-no-tenant-column 31, sys-flow-dispatch.object 4, sys-presence.object 12 — 0 failed
access-security.deployment-tables-platform-only · r4 A1 pass HTTP-in-process: deployment-tables-platform-only: org admin 403 PERMISSION_DENIED on all seven, platform admin 200
access-security.deployment-tables-platform-only · r4 A2 pass HTTP-in-process: same file: organization_id filter 400 INVALID_FIELD on all seven
access-security.share-link-combined-gates · r5 A0 pass HTTP-in-process: share-link-combined-gates.dogfood 4, share-link-eligibility 43, share-link-envelope.conformance 26, share-links-messages-audience 85, share-links-refusal-order 60 — 0 failed
access-security.share-link-combined-gates · r5 A1 pass HTTP-in-process: combined-gates: link A three variants 401 SIGN_IN_REQUIRED byte-identical
access-security.share-link-combined-gates · r5 A2 pass HTTP-in-process: combined-gates: link B five variants 404 INVALID_OR_EXPIRED byte-identical with unknown token; control 200
access-security.share-link-combined-gates · r5 A3 pass HTTP-in-process: combined-gates: /messages 404 NOT_FOUND where /resolve refused, 400 UNSUPPORTED where it passed
access-security.org-admin-assignment-boundary · r2 A0 pass engine: org-admin-assignment-boundary.posture.test.ts 60, delegated-admin-gate.test.ts 137, rbac-objects.test.ts 13 — 0 failed
access-security.org-admin-assignment-boundary · r2 A1 pass engine: posture file per-cell in/out-of-boundary cases, three postures (60 passed)
access-security.org-admin-assignment-boundary · r2 A2 pass engine: posture file platform and member cells (60 passed)
access-security.org-admin-assignment-boundary · r2 A3 pass engine: posture file report/explain case per posture (60 passed)

Derived: rls-both-sides PARTIAL · write-path-guards PASS · record-access-explain PASS · crud-permission-matrix PARTIAL · owd-sharing-matrix PASS · fls-mask-and-strip PASS · anonymous-deny-surfaces PASS · public-form-withdrawal-layers PASS · activation-write-operator-gate PASS · platform-owner-email-anchor PASS · me-permissions-aggregation-parity PASS · record-view-read-audit PASS · share-link-landing-page PASS · anonymous-floor-v18-doors PASS · walled-environment-metadata-operator-only PASS · meta-authoring-trail-and-audience-gates PASS · security-catalog-activation-and-clone-doors PASS · security-catalog-one-holder-and-boot-report PASS · grant-table-write-contract PASS · parent-and-organization-write-guards PASS · deployment-tables-platform-only PASS · share-link-combined-gates PASS · org-admin-assignment-boundary PASS


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · sunhaolin · session_017xRBcScm27Q3R5mkYLPWdB

    Per-clause verdicts, part 2 of 3 (ai · api-backend · approvals) — the record body holds access-security, part 3 holds attachments-storage · automation · cli.

    ai

    item · rev clause verdict layer · text evidence
    ai.mcp-http-surface · r7 A0 pass HTTP-booted-server: OS_MCP_SERVER_ENABLED=false boot: anon GET /mcp/skill 404 RESOURCE_NOT_FOUND 'MCP server is not enabled'; session+osk_ POST /mcp 404 same; anon POST /mcp 401 UNAUTHENTICATED. Observed the 404 (switch off), not…
    ai.mcp-http-surface · r7 A1 pass HTTP-booted-server: default boot GET /api/v1/mcp/skill anon: 200, content-type text/markdown; charset=utf-8, content-disposition inline; filename="SKILL.md", cache-control no-store; body carries http://localhost:41412/api/v1/mcp
    ai.mcp-http-surface · r7 A2 pass HTTP-booted-server: POST /mcp/skill -> 405, allow: GET, {success:false,error:{code:METHOD_NOT_ALLOWED,message:'Method not allowed — use GET',httpStatus:405}}; pin mcp-skill-method-not-allowed.hono.integration.test.ts 9 passed (HT…
    ai.mcp-http-surface · r7 A3 pass HTTP-booted-server: OAuth-live boot: anon POST /mcp 401 'a valid OAuth access token or API key is required' + WWW-Authenticate resource_metadata=.../.well-known/oauth-protected-resource; MCP-off boot: 401 'Unauthorized: a valid A…
    ai.mcp-http-surface · r7 A4 pass HTTP-booted-server: admin osk_ key: initialize 200 (protocol 2025-03-26) + tools/list = exactly the 12 documented names incl. aggregate_records and resume_run (no degradation)
    ai.mcp-http-surface · r7 A5 pass HTTP-booted-server: real embedded-AS auth-code+PKCE token scope 'openid profile' -> 403 PERMISSION_DENIED 'Forbidden: the access token grants none of the MCP scopes (...)' + WWW-Authenticate error="insufficient_scope" scope="data…
    ai.mcp-stdio-fail-closed · r8 A0 pass CLI-spawn: OS_MCP_STDIO_ENABLED=true, no key: log '[MCP] The stdio transport is enabled ... OS_MCP_STDIO_API_KEY is not set ... Refusing to start an unscoped stdio server (ADR-0101).'; process exit 1, health never 200
    ai.mcp-stdio-fail-closed · r8 A1 pass CLI-spawn: osk_unknown: 'did not resolve to a valid identity (unknown / revoked / expired / owner-less). Refusing to start stdio (ADR-0101).' exit 1; revoked contributor key: 'is refused (API_KEY_REVOKED): ... Refusing to start s…
    ai.mcp-stdio-fail-closed · r8 A2 pass CLI-spawn: '[MCP] stdio transport principal-bound to OS_MCP_STDIO_API_KEY identity nge9rHYTqzzgJ2cvxyrBMAIgMJKqswwg (RLS/FLS/tenant applied)' = the contributor member's userId
    ai.mcp-stdio-fail-closed · r8 A3 pass CLI-spawn: RLS: contributor stdio query_records showcase_invoice total 1 (own QA-AI-INV-1) = REST 1; INV-1003 absent on both; admin stdio total 13. FLS: liaison stdio+REST showcase_project both return name,status only (budget/spe…
    ai.mcp-stdio-fail-closed · r8 A4 pass CLI-spawn: contributor stdio aggregate count by status = [{draft:1}] = REST /data/showcase_invoice/query [{draft:1}]; admin (stdio and REST) draft 3/paid 5/sent 5 — member counts strictly lower
    ai.mcp-stdio-fail-closed · r8 A5 pass CLI-spawn: liaison stdio sum(budget), groupBy budget, count_distinct(spent) each -> PERMISSION_DENIED '[Security] Field read denied: not permitted to aggregate [budget|spent] on 'showcase_project''; count by status ok (4 groups)…
    ai.mcp-stdio-fail-closed · r8 A6 pass CLI-spawn: same stdio session: query_records returned row before; admin PATCH /data/sys_api_key/gLs5ynZw6BAeINM3 {revoked:true} 200; next query_records and aggregate_records isError, {error:{code:API_KEY_REVOKED,status:403}}, no …
    ai.mcp-stdio-fail-closed · r8 A7 pass CLI-spawn: clean boot --log-level info: 1 '[MCP] Transport not auto-started (HTTP is served per-request at /api/v1/mcp regardless)...'; default warn-level boot logs: 0
    ai.mcp-validate-expression · r5 A0 pass HTTP-booted-server: validate_expression showcase_task 'record.estimate_hours * 2' formula: ok:true, inferredType 'number', inScope.fields includes estimate_hours; pin mcp-validate-expression.test.ts 8 passed (plugin-unit, corrobo…
    ai.mcp-validate-expression · r5 A1 pass HTTP-booted-server: 'estimate_hours > 8' formula: error bare-reference 'Write record.estimate_hours'; 'record.estimate_hour > 8': error unknown-field 'did you mean estimate_hours'; 'record.title * 2': ok:true + warning type-misma…
    ai.mcp-validate-expression · r5 A2 pass HTTP-booted-server: same expression 'estimate_hours > 8': site flow_condition ok:true, errors []; site formula ok:false bare-reference error
    ai.mcp-validate-expression · r5 A3 pass HTTP-booted-server: objectName no_such_obj: isError 'Object "no_such_obj" not found'; sys_user: isError 'Object "sys_user" is a system object and is not exposed via MCP', no schema in response
    ai.skill-instructions-mcp-prompts · r4 A0 pass HTTP-booted-server: after PUT /meta/skill/qa_prompt_full (200), osk_ prompts/list = [{name:qa_prompt_full,title:'QA Prompt Full',description:'Full QA skill'}]
    ai.skill-instructions-mcp-prompts · r4 A1 pass HTTP-booted-server: prompts/get qa_prompt_full returns the authored instructions text; after re-PUT with 'QA-INSTR-FULL-V2' the next get returns V2 (re-read at get time)
    ai.skill-instructions-mcp-prompts · r4 A2 pass HTTP-booted-server: prompts/list omitted qa_prompt_bare (no instructions) and qa_prompt_off (active:false); after re-PUT qa_prompt_off active:true it appears and prompts/get serves 'QA-INSTR-OFF'
    ai.skill-instructions-mcp-prompts · r4 A3 pass HTTP-booted-server: prompts/get qa_prompt_bare, qa_prompt_off (inactive) and no_such_skill each -> JSON-RPC error -32602 'Prompt "..." not found'
    ai.skill-instructions-mcp-prompts · r4 A4 pass plugin-unit: skill-prompts.test.ts 'declares NO prompts capability when the host cannot read skill metadata' passed (file 12 passed); [test] oracle per verify line
    ai.mcp-oauth-private-host-transport · r5 A0 blocked HTTP-booted-server: corroboration only: OS_AUTH_URL=http://10.0.0.5:41412 (unheld) advertised resource http://10.0.0.5:41412/api/v1/mcp on both PRM paths (200) and 401 resource_metadata pointer at that origin
    ai.mcp-oauth-private-host-transport · r5 A1 pass HTTP-booted-server: OS_AUTH_URL=http://192.0.2.2:41412: both PRM paths 404 ENDPOINT_NOT_FOUND, anon /mcp 401 without WWW-Authenticate; log 1x 'OAuth discovery is served over PUBLIC plain HTTP' + 1x 'OAuth track is NOT live'; 0x '…
    ai.mcp-oauth-private-host-transport · r5 A2 partial HTTP-booted-server: UNENCRYPTED: (c) info-level 1 at INFO, (c) warn-level 0, (b) 0, https 0, unheld-10.0.0.5 1 at WARN; PUBLIC line: (b) 1, (c) 0, https 0; each names issuer ‹origin>/api/v1/auth. (a) leg on a held private address…
    ai.mcp-oauth-private-host-transport · r5 A3 pass HTTP-booted-server: loopback boot: both PRM paths 200 {resource:http://localhost:41412/api/v1/mcp, authorization_servers:[.../api/v1/auth], scopes 4+offline_access}, same shape as the 10.0.0.5 boot with origin substituted; 401 ca…
    ai.mcp-oauth-private-host-transport · r5 A4 pass HTTP-booted-server: boot (b) re-run with OS_ALLOW_INSECURE_OAUTH_HTTP=true: identical 404/404, 401 no pointer, same two log lines; git grep finds the variable only in ai.json, CHANGELOG and two test files
    ai.mcp-coded-refusals-and-runtime-exposure · r3 A0 pass plugin-unit/engine: all 5 named files report >=1 test, 0 failed: record-resource-exposure 8, action-refusal-details 5, plugin-runtime-object-metadata-copy 10, mcp-coded-refusal 43, mcp-stdio-runtime-object-exposure 10 passed
    ai.mcp-coded-refusals-and-runtime-exposure · r3 A1 pass HTTP-booted-server: get_record showcase_task recordId does-not-exist-123 -> isError, {error:{code:RECORD_NOT_FOUND,message:'Record ... not found in showcase_task',status:404}}
    ai.mcp-coded-refusals-and-runtime-exposure · r3 A2 pass HTTP-booted-server: runtime qa_hidden_obj (enable.apiEnabled:false): query_records OBJECT_API_DISABLED 404 before and after restart; qa_shown_obj served both times; after DELETE /meta/object it left list_objects, describe 'not fo…
    ai.mcp-coded-refusals-and-runtime-exposure · r3 A3 pass HTTP-booted-server: auditor osk_ run_action declarative update qa_ai_mark on showcase_task -> {error:{code:PERMISSION_DENIED,message,status:403}}, keys error.code/message/status only, no positions/permissionSets/details; admin co…

    Derived: mcp-http-surface PASS · mcp-stdio-fail-closed PASS · mcp-validate-expression PASS · skill-instructions-mcp-prompts PASS · mcp-oauth-private-host-transport PARTIAL · mcp-coded-refusals-and-runtime-exposure PASS

    api-backend

    item · rev clause verdict layer · text evidence
    api-backend.query-contract-matrix · r7 A0 pass HTTP-booted-server: live :41414 admin: 23 operator variants x 2 spellings ($-object + AST) = 46 POST /query probes, id-set equal to local baseline (14 accounts) on all 46, 0 diffs
    api-backend.query-contract-matrix · r7 A1 pass HTTP-booted-server: GET $orderby=name $top/$skip windows (3,2) and (4,6) + POST {limit,offset},{top,offset},{top,skip} all equal locally sorted baseline slices
    api-backend.query-contract-matrix · r7 A2 pass HTTP-booted-server: GET $select=name,status and POST fields:[name,status]: 14/14 records keyset exactly {name,status}; invoice fields:[account.name] -> 400 INVALID_FIELD, message names expand
    api-backend.query-contract-matrix · r7 A3 pass HTTP-booted-server: annual_revenue asc+desc full 14-value sequence equal on GET $orderby and POST orderBy; $orderby=nope and orderBy nope -> 400 INVALID_SORT
    api-backend.query-contract-matrix · r7 A4 pass HTTP-in-process + HTTP-booted-server: showcase-expand-crud-gate.dogfood 10 passed (bootShowcase); live: contributor body/list/by-id expand of own invoice -> contact bare id (direct read 403); admin same queries -> contact object
    api-backend.query-contract-matrix · r7 A5 pass HTTP-booted-server: POST {status:{$nin:"done"}} -> 400 VALIDATION_FAILED fields[query.where.status.$nin] names $nin,status,ARRAY; AST twin -> 400 VALIDATION_FAILED at query.where; GET $filter twin -> 400 INVALID_FILTER; no rows
    api-backend.query-contract-matrix · r7 A6 pass HTTP-booted-server: ?$pageSize=5 -> 400 UNSUPPORTED_QUERY_PARAM listing supported $-params; ?not_a_field=x -> 400 INVALID_FIELD; where nope ($eq and $ne, POST) and GET $filter nope -> 400 INVALID_FIELD
    api-backend.query-contract-matrix · r7 A7 pass HTTP-booted-server: showcase_task $in:[] -> 200 n=0; $nin:[] -> 200 n=10 = full visible task baseline (10)
    api-backend.query-contract-matrix · r7 A8 pass HTTP-booted-server: one row per variant recorded in scratchpad ab/matrix.out (46 operator rows + window/select/sort/negative/boundary rows); none skipped
    api-backend.bulk-write-contract · r6 A0 pass HTTP-booted-server: member createMany (bare array, 3 rows) 201; single-door row keyset identical; owner_id/created_by/org = member id, pinned default false on both; {records} wrapper -> 400 VALIDATION_FAILED
    api-backend.bulk-write-contract · r6 A1 pass HTTP-booted-server: member updateMany 3 marker ids -> 200 succeeded 3; admin re-read 3/3 marker body updated, control single note and foreign note body null; {where,data} -> 400 naming records
    api-backend.bulk-write-contract · r6 A2 pass HTTP-booted-server: nonexistent id and foreign (m2) note id each -> 200 success:false succeeded 0, row RECORD_NOT_FOUND (both, also under continueOnError); foreign updated_at unchanged; records:[] -> total 0; repeat deleteMany ro…
    api-backend.bulk-write-contract · r6 A3 pass HTTP-booted-server: admin createMany 201 -> 400 BATCH_TOO_LARGE count 201 max 200; 0 marker rows found; per-object /batch create 201 -> 400 BATCH_TOO_LARGE, 0 rows
    api-backend.bulk-write-contract · r6 A4 pass HTTP-booted-server: member deleteMany 2 own ids -> row0 PERMISSION_DENIED, row1 NOT_ATTEMPTED, 3 markers remain; admin deleteMany 3 ids -> 3 success, GET each 404, single+foreign notes remain
    api-backend.bulk-write-contract · r6 A5 pass HTTP-booted-server: ERR_BULK_RESULT_MISMATCH: absent from all captured responses and 0 hits in boot.log
    api-backend.declarative-endpoint-execution · r6 A0 pass HTTP-in-process + HTTP-booted-server: showcase-declarative-endpoints.dogfood 24 passed incl. "carries the declared cacheTtlSeconds as a Cache-Control header"; live GET /api/v1/apps/showcase/tasks authed 200, Cache-Control: privat…
    api-backend.declarative-endpoint-execution · r6 A1 pass HTTP-in-process + HTTP-booted-server: pin "DENIES an anonymous caller with 401"; live anon GET /api/v1/apps/showcase/tasks -> 401 error.code UNAUTHENTICATED
    api-backend.declarative-endpoint-execution · r6 A2 pass CLI-spawn + plugin-unit: declarative-endpoint-authoring-refusal.dogfood 8 passed (os validate/os build refuse script+proxy, controls accept; PUT /meta/api refused); endpoint-executor.test 51 passed; apis-publish-gates.test 48 pas…
    api-backend.declarative-endpoint-execution · r6 A3 pass HTTP-in-process + HTTP-booted-server: pin "an undeclared path UNDER the endpoint mount is the same bare 404"; live /api/v1/apps/showcase/does-not-exist -> 404 ENDPOINT_NOT_FOUND identical to /api/v1/zzz-unmounted
    api-backend.packaged-action-disabled-dispatch · r9 A0 pass HTTP-in-process: packaged-action-disabled-dispatch-live.dogfood "acceptance[0]: ... 409 ACTION_DISABLED with the engine's sentence and writes nothing" passed (8/8 file)
    api-backend.packaged-action-disabled-dispatch · r9 A1 pass HTTP-in-process: same file "acceptance[1]: ... 409 disabled, 400 enabled, for the identical request" passed (gallery action)
    api-backend.packaged-action-disabled-dispatch · r9 A2 pass HTTP-in-process: same file "acceptance[5] / [2]" passed: disabled 409 with bogus recordId; enabled 404 RECORD_NOT_FOUND recorded as corroboration
    api-backend.packaged-action-disabled-dispatch · r9 A3 pass HTTP-in-process: same file "acceptance[3]: the unentitled caller's 403 is byte-identical whether enabled or disabled" passed
    api-backend.packaged-action-disabled-dispatch · r9 A4 pass HTTP-in-process: same file "acceptance[4]: the live MCP run_action tool refuses with ACTION_DISABLED / 409 and the REST door's own sentence" passed (MCPServerPlugin composed, POST /api/v1/mcp)
    api-backend.packaged-action-disabled-dispatch · r9 A5 pass HTTP-in-process: same file "acceptance[5] / [2]: after a cold boot the switch holds; re-enabling updates the same row and re-arms dispatch" passed (file DB kept across reboot)
    api-backend.packaged-action-disabled-dispatch · r9 A6 pass HTTP-in-process: same file "acceptance[6]: a disabled type: flow action is refused by its OWN switch" passed
    api-backend.action-activation-door-contract · r7 A0 pass HTTP-in-process: action-activation-door-live.dogfood "acceptance[0]: authority runs first — the member gets the capability 403, the anonymous caller the 401" passed (7/7 file)
    api-backend.action-activation-door-contract · r7 A1 pass HTTP-in-process: same file "acceptance[1]: the 2-segment path is the door's shape 400; the 4-segment path is the router's 404" passed
    api-backend.action-activation-door-contract · r7 A2 pass HTTP-in-process: same file "acceptance[2]: the body contract refuses with named field codes, never inverts" passed
    api-backend.action-activation-door-contract · r7 A3 pass HTTP-in-process: same file "acceptance[3]: an empty body ENABLES — 200 with enabled true" passed
    api-backend.action-activation-door-contract · r7 A4 partial HTTP-in-process: same file "acceptance[4]: undeclared 404 nothing to switch off, no refusal wrote a row" passed; metadata-plane 503 arm: no stock door, no pin (knownGaps[3]) -> not covered
    api-backend.action-activation-door-contract · r7 A5 pass HTTP-in-process: same file "acceptance[5]: the flip answers its body and keeps exactly ONE deployment-level row, updated in place" passed
    api-backend.action-activation-door-contract · r7 A6 pass HTTP-in-process: same file "acceptance[6]: 409 RESOURCE_CONFLICT naming every owner, from either object, and nothing written" passed (activation-ambiguity-fixture)
    api-backend.action-activation-door-contract · r7 A7 pass plugin-unit: action-activation-posture-gate.test 29 passed (501 ADR-0126 §8, 503 SERVICE_UNAVAILABLE); packaged-activation-ledger-reach.dogfood 11 passed incl. "the flip that answered 503 ... now succeeds"
    api-backend.rest-crud-config-contract · r6 A0 pass HTTP-in-process: rest-config-contract-live.dogfood "crud acceptance[0]: all six default data mounts answer, none with the routing-404 control" passed
    api-backend.rest-crud-config-contract · r6 A1 pass plugin-unit (real RestServer route table): rest-config-mount-table.pin.test 24 passed (per-switch exact route-set diff, list removes two)
    api-backend.rest-crud-config-contract · r6 A2 pass plugin-unit + HTTP-in-process: rest-config-contract-harness "acceptance[2]: a switched-off operation leaves no handler at all" passed + live pin "apiEnabled:false object answers OBJECT_API_DISABLED, distinguishable from the routi…
    api-backend.rest-crud-config-contract · r6 A3 pass plugin-unit (real RestServer): harness "acceptance[3]: dataPrefix re-bases the whole data surface, nothing left under /data" passed; discovery-services-route-follows-mount.test 10 passed
    api-backend.rest-crud-config-contract · r6 A4 pass plugin-unit (real RestServer): harness "acceptance[4]: both tombstones refuse at construction with the schema and the prescription" passed; rest-sub-config-parse-not-cast §E passed
    api-backend.rest-crud-config-contract · r6 A5 pass plugin-unit: rest-sub-config-parse-not-cast.test 25 passed (§C/§D defaults, partial operations)
    api-backend.rest-batch-config-contract · r6 A0 pass HTTP-in-process: rest-config-contract-live "batch acceptance[0]: the four per-object bulk doors and the cross-object door are mounted" passed
    api-backend.rest-batch-config-contract · r6 A1 pass plugin-unit (real RestServer route table): rest-config-mount-table.pin.test 24 passed (enableBatchEndpoint removes only per-object /batch)
    api-backend.rest-batch-config-contract · r6 A2 pass plugin-unit (real RestServer route table): rest-config-mount-table.pin.test 24 passed incl. §2 protocol-member conjunct
    api-backend.rest-batch-config-contract · r6 A3 pass plugin-unit: rest-batch-size-cap.test 8 passed (five doors, at-cap pass, configured-not-hardcoded)
    api-backend.rest-batch-config-contract · r6 A4 pass HTTP-in-process + HTTP-booted-server: live pin "batch acceptance[4]" passed; live :41414 createMany 201 -> 400 BATCH_TOO_LARGE count 201 max 200, 0 marker rows
    api-backend.rest-batch-config-contract · r6 A5 pass plugin-unit (real RestServer): rest-config-contract-harness "acceptance[5]: upsertMany and defaultAtomic (true and false) refuse with the schema and the replacement" passed
    api-backend.rest-batch-config-contract · r6 A6 pass plugin-unit: rest-sub-config-parse-not-cast.test 25 passed (§A 0/2000/2.5 refused, default 200)
    api-backend.rest-metadata-config-contract · r8 A0 pass HTTP-in-process: rest-config-contract-live "metadata acceptance[0]: every default-prefix metadata mount answers, none with the routing-404 control" passed
    api-backend.rest-metadata-config-contract · r8 A1 pass plugin-unit (real RestServer): harness "acceptance[1]: prefix re-bases every metadata route, nothing left under /meta, discovery follows" passed
    api-backend.rest-metadata-config-contract · r8 A2 pass plugin-unit (real RestServer route table): rest-config-mount-table.pin.test 24 passed (four endpoints.* rows as absence diffs, both directions)
    api-backend.rest-metadata-config-contract · r8 A3 pass HTTP-in-process + plugin-unit: live pin "metadata acceptance[3]: the client_liaison member's served schema omits the withheld fields entirely" passed; meta-object-fls.test 95 passed (maskObjectFields:false D8 case)
    api-backend.rest-metadata-config-contract · r8 A4 pass plugin-unit (real RestServer): harness "acceptance[4]: enableCache selects the cached read, and each carve-out bypasses it with the switch on" passed
    api-backend.rest-metadata-config-contract · r8 A5 pass plugin-unit (real RestServer): harness "acceptance[5]: cacheTtl (3600, 0, -1) and endpoints.schema refuse with the schema and the replacement" passed
    api-backend.rest-route-generation-tombstones · r4 A0 pass plugin-unit (real RestServer): rest-route-generation-tombstones.test "acceptance[0]: each key refuses at construction, whatever value is authored" passed (10/10 file)
    api-backend.rest-route-generation-tombstones · r4 A1 pass plugin-unit: same file "acceptance[1]: the same refusals survive the plugin path, beside a control that boots" passed; parse-not-cast §B passed
    api-backend.rest-route-generation-tombstones · r4 A2 pass plugin-unit: same file "acceptance[2]: each prescription names a surface that exists in the shipped spec and server" passed
    api-backend.rest-route-generation-tombstones · r4 A3 pass build (tsc): same file: 5 "fails tsc on the key's own line" cases + "control: the empty block typechecks clean" passed
    api-backend.rest-route-generation-tombstones · r4 A4 pass plugin-unit: same file "acceptance[4]: routes: {} constructs and normalizes to {}, unknown key stripped" passed
    api-backend.second-object-exposure-and-internal-fields · r3 A0 pass engine + plugin-unit: metadata-protocol 4 files 77 passed (relation-condition 13, expand-target 15, data-door-internal 41, app-pkg 8); objectql internal-field-positions 6 passed
    api-backend.second-object-exposure-and-internal-fields · r3 A1 pass HTTP-in-process: second-object-exposure.dogfood 48 passed (bootStack fixture): nested-relation 404 OBJECT_API_DISABLED at filter.REL / 405 whitelist, GET+POST, admin+member
    api-backend.second-object-exposure-and-internal-fields · r3 A2 pass HTTP-in-process: second-object-exposure.dogfood 48 passed: $expand into unexposed target returns bare id
    api-backend.second-object-exposure-and-internal-fields · r3 A3 pass HTTP-in-process: second-object-exposure.dogfood (filter/sort/groupBy/aggregate, admin+member, 400 INVALID_FIELD sox_source.internal_f) + internal-field-data-door-positions.dogfood 15 passed
    api-backend.data-request-shape-and-query-arity · r4 A0 pass plugin-unit / engine: rest request-schema-gate 16, runtime data-write-request-gate 73, data-update-expected-version 65, data-delete-expected-version 34, dispatcher-query-arity 33, packages-write-flag-arity 11, data-conflict-calle…
    api-backend.data-request-shape-and-query-arity · r4 A1 pass HTTP-in-process: data-request-shape-live.dogfood: null/array/number body, expectedVersion "", empty If-Match -> 400 VALIDATION_FAILED, updated_at unchanged (5 cases passed)
    api-backend.data-request-shape-and-query-arity · r4 A2 pass HTTP-in-process + HTTP-booted-server: pin "400 VALIDATION_FAILED on query, and no rows" passed; live probes: POST /query where:[] -> 400, limit:"ten" -> 400 VALIDATION_FAILED
    api-backend.data-request-shape-and-query-arity · r4 A3 pass HTTP-in-process + HTTP-booted-server: pins "GET /packages?status=a&status=b ... supplied 2 times" and keepData doubled refused, package+tables remain passed; live $top=2&$top=3 -> 400 "supplied 2 times"
    api-backend.data-request-shape-and-query-arity · r4 A4 pass HTTP-in-process: pin "member: 404, exactly what the same PATCH with no token answers" + owner 409 CONTROL passed
    api-backend.meta-read-doors-v18 · r4 A0 pass plugin-unit: rest meta-object-sortability 13, meta-member-selector 32, meta-door-closed-sets 29; runtime meta-app-package-id-key 12, sortability 8, meta-package-all-fold 13; protocol app-package-id-key 8 — all passed
    api-backend.meta-read-doors-v18 · r4 A1 pass HTTP-in-process + HTTP-booted-server: meta-read-doors-live pins passed; live GET /meta/app/com.example.showcase -> 200 showcase_app; unknown pkg and unknown name both 404 RESOURCE_NOT_FOUND, identical bodies
    api-backend.meta-read-doors-v18 · r4 A2 pass HTTP-in-process + HTTP-booted-server: pins (zh-CN/en-US member, object ?member= 400, unknown param 400) passed; live /meta/object/showcase_task?member=zh-CN -> 400 VALIDATION_ERROR naming selector
    api-backend.meta-read-doors-v18 · r4 A3 pass HTTP-in-process + HTTP-booted-server: pin passed; live GET /meta/view?package=all body byte-identical to /meta/view (200)
    api-backend.meta-read-doors-v18 · r4 A4 pass HTTP-in-process: pins "client_liaison: budget is ABSENT from sortability.fields" and "sort=budget is 403 PERMISSION_DENIED" + admin CONTROL passed; showcase-fls-read-mask-strip 8 passed
    api-backend.error-sentences-and-unique-violation-wire-code · r5 A0 pass plugin-unit / engine: rest-write-route-hook-refusal-sentence.ledger 589, rest-hook-script-fault-envelope 18, dispatcher-unique-violation-wire-code 7, storage-routes.server-fault-withheld 18 — all passed
    api-backend.error-sentences-and-unique-violation-wire-code · r5 A1 pass HTTP-in-process: error-sentences-live.dogfood: POST /data/OBJECT and /createMany -> 400 with hook sentence, no code, nothing written (2 passed)
    api-backend.error-sentences-and-unique-violation-wire-code · r5 A2 pass HTTP-in-process: error-sentences-live "409 UNIQUE_VIOLATION, details exactly { developerMessage, object }, and the row keeps its email" passed
    api-backend.error-sentences-and-unique-violation-wire-code · r5 A3 pass HTTP-in-process: error-sentences-live "POST /storage/upload/chunked: 500 INTERNAL with the generic sentence, never the caught text" passed

    Derived: query-contract-matrix PASS · bulk-write-contract PASS · declarative-endpoint-execution PASS · packaged-action-disabled-dispatch PASS · action-activation-door-contract PARTIAL · rest-crud-config-contract PASS · rest-batch-config-contract PASS · rest-metadata-config-contract PASS · rest-route-generation-tombstones PASS · second-object-exposure-and-internal-fields PASS · data-request-shape-and-query-arity PASS · meta-read-doors-v18 PASS · error-sentences-and-unique-violation-wire-code PASS

    approvals

    item · rev clause verdict layer · text evidence
    approvals.email-action-token-door · r9 A0 partial plugin-unit + engine + HTTP-booted-server: approval-service.test.ts 'issueActionTokens: stores hashes only…' + 'remind: … none carries an action link' passed (unit, fake engine); approval-token-internal-hash 1 passed, sys-approva…
    approvals.email-action-token-door · r9 A1 partial HTTP-in-process (plugin mount on real Hono over started kernel) + plugin-unit: action-page-member.integration 'GET renders the confirm page … never decides however often it is fetched' passed; approval-service 'peek: validates wi…
    approvals.email-action-token-door · r9 A2 pass HTTP-in-process + engine + plugin-unit: approval-service 'redeem: approves as the bound approver and burns the token (single-use)'; action-page-member 'POST redeems as the bound approver — the audit row names that approver'; remi…
    approvals.email-action-token-door · r9 A3 partial engine + HTTP-in-process + plugin-unit: replay halves passed: approval-service redeem single-use (reason consumed), sys-approval-token-generic-door 'peeks, redeems exactly once, refused as consumed on replay', reminder positive c…
    approvals.email-action-token-door · r9 A4 partial HTTP-booted-server (invalid) + HTTP-in-process (expired/consumed) + plugin-unit (reasons): Live anon client (GET /approvals/requests 401): GET act?token=garbage and POST token=garbage both 200 text/html, ‹title>Invalid link · 链接无…
    approvals.email-action-token-door · r9 A5 blocked none: blocked(fixture, knownGaps[0]): no stock door mints a raw token to present as Bearer. Converse pinned: action-page-member 'the token is the only credential: a cookie or Authorization header is never read' passed (HTTP-in-pr…
    approvals.status-mirror-field · r5 A0 pass HTTP-booted-server: scratch flow w3_mirror (approvalStatusField f_textarea, maxRevisions 1) via POST /api/v1/automation 200; GET showcase_field_zoo after each: pending→approved, rejected, recalled, returned, then resubmit pending…
    approvals.status-mirror-field · r5 A1 pass HTTP-booted-server: record d5vzuk-VhL2KycP0 pending: f_textarea='pending' already landed; submitter PATCH {f_email} → 409 RECORD_LOCKED 'locked while an approval is in progress'; f_email stayed null
    approvals.status-mirror-field · r5 A2 partial engine (real ObjectKernel + AutomationServicePlugin + RecordChangeTrigger + SqlDriver) + plugin-unit: status-mirror-cascade.integration 2 passed (approve mirror hands flow a trigger user; dead-run release user-less, refused). Liv…
    approvals.status-mirror-field · r5 A3 pass HTTP-booted-server: w3_nomirror (no approvalStatusField): record created with f_textarea='seed-value' stayed 'seed-value' through submit+approve; second record f_textarea null through submit+reject; updated_by never moved off sub…
    approvals.status-mirror-field · r5 A4 pass HTTP-booted-server (log): w3_badmirror (f_does_not_exist): approve 200 finalized:true resumed:true, request approved, approve action row by phone; boot.log 'WARN [approvals] mirrorStatusField failed: Unknown field 'f_does_not_exi…
    approvals.request-page-reply-and-reader-visibility · r4 A0 pass jsdom/plugin-unit + engine (protocol findData/getData in-process): sys-approval-request-page 20, component-record-approval-decision-22472 8, record-reader-opt-in 8, request-read-gate 16, request-child-read-gate 25, subject-title-…
    approvals.request-page-reply-and-reader-visibility · r4 A1 pass HTTP-booted-server: GET /meta/page/sys_approval_request_detail: 1 'record:approval_decision'. POST …/areq_157233ab…/comment as auditor (pending approver) 200, as phone (submitter) 200, as invited member 403 {code:FORBIDDEN}; /act…
    approvals.request-page-reply-and-reader-visibility · r4 A2 partial engine (pin) + HTTP-booted-server (live): request-read-gate 'by id, a hidden request answers exactly as a missing one: 404' passed (engine, no plugin-security). Live: member GET /data/sys_approval_request/ID 403 PERMISSION_DENIED…
    approvals.request-page-reply-and-reader-visibility · r4 A3 partial engine (protocol in-process): record-reader-opt-in 8 passed incl. 'read-only: no approval action is offered' and 'the inbox is not widened'. Live flag flip blocked(fixture): enable.approvalsVisibleToReaders is object metadata, re…
    approvals.request-page-reply-and-reader-visibility · r4 A4 pass screenshot (Playwright chromium, form sign-in, console from packages/console/dist): /_console/apps/setup/sys_approval_request/record/‹expense req>: as auditor (pending approver) decision panel renders: progress 0 of 2 groups, Wai…
    approvals.act-door-and-admin-rescue-slate · r5 A0 pass plugin-unit/engine/HTTP-in-process: approvals-act.test 13, action-page-member 12, hono-approvals-act.conformance 4, admin-rescue-named-slate 16, approval-admin-rescue-slate.dogfood 1 — all passed, 0 failed
    approvals.act-door-and-admin-rescue-slate · r5 A1 pass HTTP-booted-server (PUT, dead link) + HTTP-in-process (live-token GET/POST): live: PUT /api/v1/approvals/act?token=garbage 404 {code:ENDPOINT_NOT_FOUND}, no Allow header; GET and POST token=garbage 200 text/html Invalid link page…
    approvals.act-door-and-admin-rescue-slate · r5 A2 pass HTTP-in-process (pin) + HTTP-booted-server (live): dogfood pin 1 passed (two admins listed/counted, via_override false). Live w3_unstaffed (position w3_nobody_holds_this): admin pending list has it, pending_approvers=[admin], not…

    Derived: email-action-token-door PARTIAL · status-mirror-field PARTIAL · request-page-reply-and-reader-visibility PARTIAL · act-door-and-admin-rescue-slate PASS


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · sunhaolin · session_017xRBcScm27Q3R5mkYLPWdB

    Per-clause verdicts, part 3 of 3 (attachments-storage · automation · cli).

    attachments-storage

    item · rev clause verdict layer · text evidence
    attachments-storage.presigned-upload-roundtrip · r3 A0 pass HTTP-booted-server (+pin HTTP-in-process): live: presign 200 keys [uploadUrl,method,headers,fileId,expiresIn,downloadUrl]; sys_file pending, owner_id=fCx7uwnf… (admin) despite body owner_id/ownerId SPOOFED_OWNER; pin (e) owner se…
    attachments-storage.presigned-upload-roundtrip · r3 A1 pass HTTP-booted-server: live: sys_file status pending before POST /upload/complete (200), committed after
    attachments-storage.presigned-upload-roundtrip · r3 A2 pass HTTP-booted-server (+pin HTTP-in-process envelope): live: /files/:id/url 200 {success:true,data:{url}}; GET url 200, 20 bytes byte-equal to upload; pin (e-read) passed
    attachments-storage.presigned-upload-roundtrip · r3 A3 pass HTTP-booted-server: live: GET /files/:id 302, Location identical to the /url signed url; following it 200 byte-equal
    attachments-storage.presigned-upload-roundtrip · r3 A4 pass HTTP-booted-server (+pin HTTP-in-process): live: anon presign 401 AUTH_REQUIRED; sys_file total 2 before and 2 after; no "[storage] no session resolver" line in boot log; pin (e) anonymous presigned 401 passed
    attachments-storage.download-authz-both-sides · r9 A0 pass HTTP-booted-server (+pin HTTP-in-process): live anon: attachments file on qa_vault, field-owned qa_vault.doc and showcase_invoice_line.receipt files -> /url and /files both 401 AUTH_REQUIRED, no Location; attachments-permission-m…
    attachments-storage.download-authz-both-sides · r9 A1 pass HTTP-booted-server (+pin HTTP-in-process): live: persona B -> attachments 403 ATTACHMENT_DOWNLOAD_DENIED, field-owned (vault doc, invoice receipt) 403 FILE_DOWNLOAD_DENIED on both routes; persona A same on vault files
    attachments-storage.download-authz-both-sides · r9 A2 pass HTTP-booted-server: live: A (reads qa_shared) /url 200 envelope, url bytes equal; uploader bypass: C-owned file attached by admin to qa_vault (C reads vault 404) -> C /url 200, bytes equal; gated grant TTL 300s
    attachments-storage.download-authz-both-sides · r9 A3 pass HTTP-booted-server (+pin HTTP-in-process, 8 passed): live: after admin PATCH sys_file acl=public_read, anon GET /files/:id 302 -> bytes equal, TTL 3600s; sibling on qa_shared stays 401; flip back to private -> 401 AUTH_REQUIRED
    attachments-storage.download-authz-both-sides · r9 A4 pass browser (built /_console on this boot) + jsdom pin: persona A open qa_shared record, panel listed 2 files; admin DELETE A binding (200) without reload; Download -> GET /url 403 ATTACHMENT_DOWNLOAD_DENIED; panel shows "You don't h…
    attachments-storage.read-inherits-parent-rls · r9 A0 pass HTTP-booted-server (+pin HTTP-in-process): live: list scoped to qa_vault/V -> admin 2 rows, A/B/C 0 rows; unscoped list vault rows A/B/C = 0; matrix (c) passed
    attachments-storage.read-inherits-parent-rls · r9 A1 pass HTTP-booted-server (+pin HTTP-in-process, count-parity 7 passed): live $top=1 totals: scoped V admin 2 / A,B,C 0; unscoped admin 3, A 1, B 0, C 1 equal to rows served at $top=500; count-parity pin passed incl. engine.count under …
    attachments-storage.read-inherits-parent-rls · r9 A2 pass HTTP-booted-server: live: GET sys_attachment/‹vault attachment id> -> A, B, C 404; admin 200
    attachments-storage.read-inherits-parent-rls · r9 A3 partial HTTP-in-process (ordinary-parent half) + engine/unit (probe half): scan-cap dogfood 3 passed (>2000 rows served whole, true total, no cap warning); probe half only attachment-read-leaf.integration (engine, 11 passed) + attachment…
    attachments-storage.attach-requires-parent-edit · r9 A0 pass HTTP-booted-server (+pin HTTP-in-process): live: A attach to qa_shared -> 403 ATTACHMENT_PARENT_ACCESS; A list of that parent 200 (1 row); admin re-list unchanged (1)
    attachments-storage.attach-requires-parent-edit · r9 A1 pass HTTP-booted-server (+pin): live: C attach with uploaded_by=A id -> 201, row uploaded_by = C id (GiqXG8…), not spoof (D3n0Zr…)
    attachments-storage.attach-requires-parent-edit · r9 A2 pass HTTP-booted-server (+pin): live on C-uploaded attachment of C-owned qa_shared row: A DELETE 403 ATTACHMENT_DELETE_DENIED, B DELETE 404 RECORD_NOT_FOUND, row survives (200); C swapped editor->reader (edit of row now 403) DELETE 20…
    attachments-storage.attach-requires-parent-edit · r9 A3 pass test (engine holder over in-process booted stack): attachments-unscoped-delete-gate.dogfood.test.ts 10 passed incl. block 2 refusal for an all-entitled caller and on an empty table; attachment-access-hooks.test.ts 141 passed
    attachments-storage.attach-requires-parent-edit · r9 A4 pass HTTP-booted-server (+pin): live: admin attach to qa_nofiles -> 403 FILES_DISABLED, re-list 0 rows; showcase_account fallback also 403 FILES_DISABLED
    attachments-storage.attach-requires-parent-edit · r9 A5 pass HTTP-booted-server (+engine pin 12 passed): live: admin PATCH sys_attachment parent_object=qa_nofiles,parent_id=N -> 403 FILES_DISABLED; re-read parent_object qa_shared / parent_id unchanged
    attachments-storage.sys-file-status-pipeline · r5 A0 pass HTTP-booted-server: live reads: pending after presign -> committed after complete -> committed after first join delete -> deleted (deleted_at set) after last -> committed (deleted_at null) after re-attach
    attachments-storage.sys-file-status-pipeline · r5 A1 pass HTTP-booted-server: live: /url and /files on the pending file -> 404 FILE_NOT_FOUND
    attachments-storage.sys-file-status-pipeline · r5 A2 partial HTTP-booted-server (live legs) + route-handler unit (live-holder half): live: tombstoned holder-less /url 404 FILE_NOT_FOUND; re-attach -> row committed before any download, /url 200 bytes equal; deleted+live-holder half only tom…
    attachments-storage.sys-file-status-pipeline · r5 A3 pass HTTP-booted-server: live: one file joined to Website Relaunch and Data Platform; delete DP join -> still committed; delete WR join -> deleted
    attachments-storage.sys-file-status-pipeline · r5 A4 pass HTTP-booted-server: live: re-attach to Data Platform -> committed, deleted_at null; second re-attach to Website Relaunch reads the same
    attachments-storage.sys-file-status-pipeline · r5 A5 pass HTTP-booted-server (+unit pin): live: user-scope field-owned receipt file joined to a project then join deleted -> status committed, deleted_at null before and after
    attachments-storage.orphan-tombstone-reap · r3 A0 pass test (HTTP-in-process dogfood + unit): matrix lifecycle block 5 passed (sweep reaps/regained/pending/abandoned chunked) + attachment-lifecycle.test.ts 50 passed (createSysFileReapGuard veto cases)
    attachments-storage.orphan-tombstone-reap · r3 A1 partial HTTP-booted-server scheduler sweep (success leg) + unit (failure leg): live: tombstone backdated 31d and pending backdated 8d (driver write), restart -> platform initial sweep removed both sys_file rows AND their bytes under OS_S…
    attachments-storage.orphan-tombstone-reap · r3 A2 pass HTTP-booted-server scheduler sweep: live: tombstone backdated 31d with a sys_attachment row inserted behind the hooks -> after sweep status committed, deleted_at null, bytes kept
    attachments-storage.orphan-tombstone-reap · r3 A3 pass HTTP-booted-server scheduler sweep: live: fresh tombstone (deleted_at now) still deleted with same deleted_at; committed control file unchanged
    attachments-storage.upload-session-abort · r6 A0 pass HTTP-booted-server: live: init 200 {uploadId,resumeToken,fileId,totalChunks 3,chunkSize 5242880}; row in_progress 0 -> PUT 0 progress uploadedChunks 1 in_progress, row 1 -> complete 200, row completed 3/3
    attachments-storage.upload-session-abort · r6 A1 pass test (HTTP-in-process dogfood) + live corroboration: matrix "(item 4 + multipart-abort guard)" passed; live: abandoned session (expires_at backdated 2d) reaped by restart sweep and its .parts/‹uploadId> dir removed
    attachments-storage.upload-session-abort · r6 A2 pass test (unit guard): attachment-lifecycle.test.ts createUploadSessionReapGuard cases passed (50/50 file); live: completed session (created_at backdated 8d) reaped
    attachments-storage.upload-session-abort · r6 A3 partial unit (mock logger): VETOES on abort failure case passed; warning text not asserted and no live abort failure staged
    attachments-storage.upload-session-abort · r6 A4 partial HTTP-booted-server + unit: live reached in_progress, completed, expired; failed only via storage-routes.test.ts seam (50 passed); completing transient (knownGaps[1]); retention onlyWhen read at system-upload-session.object.ts:144
    attachments-storage.upload-session-abort · r6 A5 pass HTTP-booted-server: live: expires_at backdated 60s (driver write, no sweep) -> chunk PUT 410 UPLOAD_SESSION_EXPIRED, row expired, uploaded_chunks 1 unchanged; complete 410 UPLOAD_SESSION_EXPIRED; progress 200 status expired; in-d…
    attachments-storage.inline-grid-receipt-cells · r5 A0 pass browser manual (built /_console on this boot): MANUAL browser run (Playwright script replicating grid-file-upload.spec.ts steps; the spec itself was NOT run): screenshot showed Create Invoice dialog; Line Items headers include ex…
    attachments-storage.inline-grid-receipt-cells · r5 A1 pass browser manual: input[type=file] count 1 in line-items grid; input[type=text][aria-label=Receipt] count 0
    attachments-storage.inline-grid-receipt-cells · r5 A2 pass network (browser trace): POST /api/v1/storage/upload/presigned 200, PUT /storage/_local/raw/‹token> 200, POST /storage/upload/complete 200; chip file-cell-chip "receipt.png" with remove x shown before submit
    attachments-storage.inline-grid-receipt-cells · r5 A3 pass network + api read: batch line op receipt = "d3c803ad-…" bare id (not data:/blob:, not object); batch 200; sys_file committed, ref_object showcase_invoice_line, ref_id = created line qZz08mEChOiKDJm7, ref_field receipt, acl priva…
    attachments-storage.upload-limits-scope-and-ownership · r3 A0 pass test (route-handler unit + HTTP-in-process + engine): storage-limits 18, upload-scope-vocabulary 6, storage-unclaimed-download 6, upload-door-ownership 23, raw-token-refusal 30, engine-file-hydrate-refused 15, -parent-derived 17:…
    attachments-storage.upload-limits-scope-and-ownership · r3 A1 pass HTTP-booted-server: live: 101MiB presign 413 PAYLOAD_TOO_LARGE, sys_file total 29->29; PUT /api/settings/storage max_upload_mb=1 200; 2MiB presign 413 naming 1 MB without restart, count 29->29; 0.5MiB 200
    attachments-storage.upload-limits-scope-and-ownership · r3 A2 pass HTTP-booted-server: live: scope avatars/PUBLIC/public/null -> 400 INVALID_REQUEST naming user,tenant,private,temp,attachments; omitted -> 200, sys_file scope user
    attachments-storage.upload-limits-scope-and-ownership · r3 A3 pass HTTP-booted-server (+wall pin HTTP-in-process 10 passed): live: member C complete on admin presign 403 PERMISSION_DENIED; progress and chunked complete on admin session 403 PERMISSION_DENIED
    attachments-storage.upload-limits-scope-and-ownership · r3 A4 pass HTTP-booted-server: live: unclaimed committed user-scope private file -> anon /url 401 AUTH_REQUIRED no url; /files 401 no Location
    attachments-storage.upload-limits-scope-and-ownership · r3 A5 pass HTTP-booted-server: live: reader D (qa_shared read, no sys_file) -> record holding a foreign file id {id,metadataRefused:true}; its own file hydrates {id,name,size,mimeType,url}
    attachments-storage.chunked-upload-integrity · r8 A0 pass test (unit + HTTP-in-process): chunked-upload-integrity 13, storage-chunked-resume-integrity 4, chunk-part-record-concurrency 24, storage-upload-organization-change.wall 10: all passed
    attachments-storage.chunked-upload-integrity · r8 A1 pass HTTP-booted-server: live: 3-chunk session, chunks 0 and 2 sent, complete 409 RESOURCE_CONFLICT details.missingChunks [1]; progress in_progress
    attachments-storage.chunked-upload-integrity · r8 A2 pass HTTP-booted-server: live: re-PUT chunk 0 -> progress uploadedChunks stays 2; then chunk 1 + complete 200, session completed
    attachments-storage.chunked-upload-integrity · r8 A3 pass HTTP-in-process (booted organization wall pin): storage-upload-organization-change.wall.test.ts 10 passed: chunk PUT 409, chunked complete 409, progress 200 live / 409 once expiry due, RESOURCE_CONFLICT, row unchanged

    Derived: presigned-upload-roundtrip PASS · download-authz-both-sides PASS · read-inherits-parent-rls PARTIAL · attach-requires-parent-edit PASS · sys-file-status-pipeline PARTIAL · orphan-tombstone-reap PARTIAL · upload-session-abort PARTIAL · inline-grid-receipt-cells PASS · upload-limits-scope-and-ownership PASS · chunked-upload-integrity PASS

    automation

    item · rev clause verdict layer · text evidence
    automation.trigger-type-matrix · r9 A0 pass HTTP-booted-server: record_change run_6e6ce3b7 (urgent_task_alert, Flow.type record_change) trigger {record-after-write,object showcase_task,recordId UPYC..}; autolaunched run_012b0b52 batch_reminders trigger manual; screen run_d…
    automation.trigger-type-matrix · r9 A1 pass HTTP-booted-server: urgent_task_alert runs: exactly 2, recordIds UPYCAkm2U0xwLXxH (urgent create) and t9FuyjR8neJpOeYF (medium->urgent); the later title-only save of t9Fu produced no third run
    automation.trigger-type-matrix · r9 A2 pass HTTP-booted-server: POST /automation/hooks/showcase_inbound_task_webhook/intake t=,v1= -> 202 {accepted:true,messageId}; task pQGCXFZONBXtcX12 title/assignee/project equal the posted body
    automation.trigger-type-matrix · r9 A3 pass HTTP-booted-server: flag boot: scheduled_digest completed ticks 05:15:55, 05:16:55, 05:17:55, 05:18:55 (60s apart, no manual help), each with a project.digest sys_notification row
    automation.trigger-type-matrix · r9 A4 pass HTTP-booted-server+browser: launch POST /api/v1/actions/showcase_task/showcase_bulk_reassign 200 {status:paused,runId,screen.nodeId:collect}; resume POST; run_30c511d5 re-read paused then completed; screen-flow.spec 1 passed
    automation.trigger-type-matrix · r9 A5 pass static-ledger (test): packages/qa/dogfood/test/flow-trigger-conformance.test.ts 2 passed (reads flow.zod.ts enum, classifies every Flow.type)
    automation.screen-flow-roundtrip · r7 A0 pass HTTP-booted-server+browser: served console click: POST /api/v1/actions/showcase_task/showcase_bulk_reassign {recordId BbQ5..} -> 200 status paused runId run_30c511d5, screen.nodeId collect; GET run status paused, steps end at col…
    automation.screen-flow-roundtrip · r7 A1 pass HTTP-booted-server: GET /runs/run_30c511d5/screen -> fields [{name:new_assignee,type:text,required:true}]
    automation.screen-flow-roundtrip · r7 A2 pass browser (live Playwright): ui/e2e/live/screen-flow.spec.ts at c4c515a 1 passed (21.2s) vs my boot (LIVE_API_URL :41416, console vite :41496); own screenshot: dialog heading New Assignee, #ff-new_assignee present
    automation.screen-flow-roundtrip · r7 A3 pass browser+HTTP-booted-server: spec asserts resume POST inputs.new_assignee = submitted value; run_d642e302 re-read status completed (steps collect success, apply update_record acted 1)
    automation.screen-flow-roundtrip · r7 A4 pass HTTP-booted-server: GET /api/v1/data/showcase_task with assignee filter -> 7cEHH2cVc-XX7bDX assignee e2e-1793250047393@example.com (authoritative read, not the grid)
    automation.screen-flow-roundtrip · r7 A5 pass HTTP-booted-server: POST resume {inputs:{}} -> 400 INVALID_SCREEN_INPUT "new_assignee is required"; run re-read paused; later valid resume -> 200, run completed
    automation.screen-flow-roundtrip · r7 A6 pass browser+HTTP-booted-server: Cancel clicked: 0 dialogs, only the launch POST sent; run_30c511d5 still paused, /screen served, valid resume completed, task BbQ5MEyFnOnPrhbE assignee qa-cancel-resume@example.com
    automation.durable-suspend-restart · r3 A0 pass HTTP-booted-server: sys_automation_run rows read by id: run_1ea16987 follow_up node hold paused vars 2224B ctx 2007B; run_40f66dc3 project_closure node signoff paused vars 2631B; run_54a6f015 closure_signoff ask_signoff paused
    automation.durable-suspend-restart · r3 A1 pass HTTP-booted-server (two processes): after SIGTERM of boot A and cold boot B over the same file DB: run_40f66dc3 and run_54a6f015 re-read paused with same nodes and payload sizes; seeded task 9KYk.. present
    automation.durable-suspend-restart · r3 A2 pass HTTP-booted-server (two processes): boot A stopped 05:12:10Z; follow_up run_1ea16987 remind step success 05:12:59.849Z on boot B, status completed; sys_notification task.followup row 05:12:59.839Z
    automation.durable-suspend-restart · r3 A3 pass HTTP-booted-server: POST /approvals/requests/areq_649f5351/approve -> child closure_signoff completed output {decision:approved}; parent project_closure completed, notify_owner ran; notification body "...: approved."
    automation.durable-suspend-restart · r3 A4 pass HTTP-booted-server: after resume: GET /data/sys_automation_run/‹id> -> RECORD_NOT_FOUND for all three paused rows; run history reads completed
    automation.paused-run-trigger-record-masked · r5 A0 partial HTTP-booted-server: runtime fixture qa_mask_pause on showcase_field_zoo: variables_json+context_json record/$record/previous f_password,f_secret = mask, name value kept, no PlainPw/NewPw/TopSecret/secret: in either column; intern…
    automation.paused-run-trigger-record-masked · r5 A1 partial HTTP-booted-server: GET /automation/qa_mask_pause/runs/run_ae9d609b (admin): record/previous/$record pw+secret masked, name kept, leak scan clean; internal-field omission not observable (stock object has no internal:true field)
    automation.paused-run-trigger-record-masked · r5 A2 pass HTTP-booted-server: after resume, echo body: seen_name=qa zoo 1 renamed|seen_password=mask|seen_secret=mask|seen_previous_password=mask
    automation.paused-run-trigger-record-masked · r5 A3 pass HTTP-booted-server (two processes): run_85a480bb paused on boot A, row still masked after cold boot B, resumed on B: echo seen_name=qa zoo 2 renamed, password/secret/previous all mask
    automation.paused-run-trigger-record-masked · r5 A4 pass engine (bootStack in-process, test): flow-trigger-record-credential-mask.dogfood.test.ts 7 passed (armed case reads plaintext write result; resolveSecretField returns plaintext)
    automation.setup-packaged-automation-board · r10 A0 pass HTTP-booted-server+browser: GET /meta/app?id=setup: group_apps holds nav_packaged_automation type component componentRef automation:packaged label Packaged Automation after nav_packages; sidebar link click -> /component/automatio…
    automation.setup-packaged-automation-board · r10 A1 pass browser (dom after screenshot): 32 rows = 32 packaged flows in /meta/flow; switch unchecked only showcase_approver_bindings (_status enabled:false); 2 Not running here (deployment_policy), 29 On; actions section rendered; clone a…
    automation.setup-packaged-automation-board · r10 A2 pass browser+HTTP-booted-server: urgent_task_alert switch clicked -> toggle 200; after full reload switch aria-checked false, badge off; sys_metadata_activation row active:false
    automation.setup-packaged-automation-board · r10 A3 pass browser (dom): 32 Clone buttons on page = 32 flow rows; the Packaged actions section has no Clone control
    automation.setup-packaged-automation-board · r10 A4 pass browser (dom): after the clone existed: no customized/diff/cloned-from/drift/lineage text and no lineage-shaped data-testid anywhere on the page
    automation.setup-packaged-automation-board · r10 A5 partial browser+HTTP-booted-server: admin: notify_owner toggle 409 rendered verbatim in a role=alert inside its row; member cell undrivable via page (Setup 403); member API toggle body = exact manage_metadata sentence
    automation.setup-packaged-automation-board · r10 A6 pass browser+HTTP-booted-server: prefilled submit enabled; empty name or label -> Create clone disabled; Bad-Name! -> alert "Invalid flow definition: name: ... must match pattern /^[a-z_][a-z0-9_]*$/"; legal clone notice rendered verb…
    automation.setup-packaged-automation-board · r10 A7 pass browser+HTTP-booted-server: posture recorded: fresh-context member (form sign-in) -> "You don't have access to this app" (GET /meta/app/com.objectstack.setup 403); sys_metadata_activation read 403; third run to meet it
    automation.flow-registration-verdict-on-read · r2 A0 pass plugin-unit (rest, stubbed) + engine (ObjectKernel+SqlDriver): rest meta-flow-cached-registration.test.ts 3 passed; service-automation flow-refused-registration-read.integration.test.ts 5 passed
    automation.flow-registration-verdict-on-read · r2 A1 pass HTTP-booted-server: GET /meta/flow/showcase_urgent_task_alert registration {state:registered}; qa_refused_flow (type api, no secret) registration {state:refused, reason.message names config.secret} while status reads active
    automation.flow-registration-verdict-on-read · r2 A2 pass HTTP-booted-server: GET /meta/flow -> registrations map (44 keys) with qa_refused_flow refused and showcase_urgent_task_alert registered
    automation.flow-authoring-refusals-v18 · r4 A0 pass unit (spec/lint, no I/O): 8 spec files 609 passed + lint validate-expressions.flow-cel-root.test.ts 80 passed; 0 failed
    automation.flow-authoring-refusals-v18 · r4 A1 pass CLI (os validate in scratch app): each arm exit 1: value/text token, record.x, user.id -> expression-invalid at located path; $x, outputVariable:42, bogusKey, dangling edge, job maxRetry, endpoint runAs -> STACK_SCHEMA_INVALID wi…
    automation.flow-authoring-refusals-v18 · r4 A2 pass HTTP-booted-server: PUT /meta/flow: value/text token, $x, bogusKey, outputVariable 42, dangling + repeated edge, try_catch retry.maxRetry, runAs system named by anonymous qa_open_api -> 422 INVALID_METADATA, GET 404; record.x and…
    automation.flow-authoring-refusals-v18 · r4 A3 pass CLI + HTTP-booted-server: os validate exit 0 for CEL envelope record.owner, notify "Case { { record.name } }", {current_user_id} filter; PUT controls 200 (mustache, current_user, try_catch with maxRetries)
    automation.flow-run-semantics-v18 · r3 A0 pass engine + plugin-unit + HTTP-in-process (bootStack): service-automation 15+17+22, runtime action 35 + endpoint 17, verify trigger-elevated-door 16 (bootStack+HttpDispatcher), dogfood flow-door-elevated-start 27: all passed
    automation.flow-run-semantics-v18 · r3 A1 pass HTTP-booted-server: member PATCH own showcase_private_note 7Ao9.. title -> qa_stamp_user run trigger.userId nK1J.. (member); read-back body = nK1JaJrZJVz.. (member id)
    automation.flow-run-semantics-v18 · r3 A2 pass HTTP-booted-server: member POST /automation/qa_elevated/trigger -> 403 PERMISSION_DENIED; runs list 0 before and after; data door sys_automation_run flow_name=qa_elevated total 0
    automation.flow-run-semantics-v18 · r3 A3 pass HTTP-booted-server: qa_decision (two true edges): run_5ffc5c8c steps start success, d success, branch_a success, branch_b skipped
    automation.inbound-hook-timestamped-signature · r2 A0 pass plugin-unit (kernel, no HTTP) + unit + plugin-unit (dispatcher): trigger-api inbound-hook-member.test.ts 12, core http-signature.test.ts 16, runtime domains/automation-hooks.test.ts 19 passed
    automation.inbound-hook-timestamped-signature · r2 A1 pass HTTP-booted-server: valid t=‹now>,v1= -> 202 {"accepted":true,"messageId":"msg_39784829-..."}
    automation.inbound-hook-timestamped-signature · r2 A2 pass HTTP-booted-server: sha256= body-only, t-400s, unknown flow, wrong hook id (and wrong key, no header) -> 401, byte-identical {"success":false,"error":{"code":"INVALID_SIGNATURE",...}}; run count 1 before and after
    automation.scheduled-work-opt-in · r2 A0 pass plugin-unit (LiteKernel, fake scheduler): trigger-schedule per-kernel-scheduled-work-policy.test.ts 10 passed; service-automation per-kernel-scheduled-work-policy.test.ts 12 passed
    automation.scheduled-work-opt-in · r2 A1 pass HTTP-booted-server (log + runs): default boot banner: "1 flow declares a 'schedule' trigger but is NOT bound - disabled by deployment policy ...: showcase_scheduled_digest"; digest runs 0 at 05:02:40Z, about 3.8 min after ready
    automation.scheduled-work-opt-in · r2 A2 pass HTTP-booted-server: flagged boot: no NOT bound line, _status bound:true; digest runs completed 05:15:55, 05:16:55, 05:17:55, 05:18:55 (trigger.type schedule)

    Derived: trigger-type-matrix PASS · screen-flow-roundtrip PASS · durable-suspend-restart PASS · paused-run-trigger-record-masked PARTIAL · setup-packaged-automation-board PARTIAL · flow-registration-verdict-on-read PASS · flow-authoring-refusals-v18 PASS · flow-run-semantics-v18 PASS · inbound-hook-timestamped-signature PASS · scheduled-work-opt-in PASS

    cli

    item · rev clause verdict layer · text evidence
    cli.scaffold-first-run · r7 A0 pass CLI-spawn (live, pre-release variant): PRE-RELEASE path: 108 tarballs from c4c515a on local verdaccio (no upstream for @objectstack/*); repo bin scaffold exit 0, pnpm install ok (no "Dependency installation failed"), validate 0,…
    cli.scaffold-first-run · r7 A1 pass CLI-spawn (live): variants=[blank] only: blank scaffold npm run validate exit 0, npm run build exit 0 -> dist/objectstack.json 2.5KB; lockfile integrity of all 60 @objectstack/* entries == local tarball sha512
    cli.scaffold-first-run · r7 A2 pass HTTP-booted-server (scaffold artifact): npx os start --artifact ./dist/objectstack.json --port 41411 booted healthy (no RC skew: scaffold pins 18.2.0 == candidate tarballs); health 200, ready exit 0
    cli.scaffold-first-run · r7 A3 pass CLI-spawn (live): 18-line scaffold (pinned-probe): .claude/skills == node_modules/@objectstack/skills@18.2.0 dist/skills by name (11=11), 0 symlinks, no .agents, no dogfood-verification; GitHub-path `skills add ‹checkout>/skills …
    cli.scaffold-first-run · r7 A4 pass CLI-spawn (live) + workflow read: single-attempt 60s probe, no retry; server became healthy, server.log captured; scaffold-e2e.yml:218-219 carries the "::error::server never became healthy"; cat server.log; exit 1 branch at this …
    cli.dev-automigrate-policy · r8 A0 pass CLI-spawn boot (live, scratch app, config-declared qa_main sqlite): safe boot log: "[schema-drift] auto-reconciled replace_unique_index on qaam_item.uq_field", dump lost qaam_item_uq_field_unique (f30897a0->0b9b17a5); relax_not_n…
    cli.dev-automigrate-policy · r8 A1 pass CLI-spawn boot (live): autoMigrate off and key omitted boots (serve --dev): 3 [schema-drift] warnings each (nn_field NOT NULL, doomed orphaned, legacy uq index), no auto-reconciled line, dump f30897a0e965eee9 identical before/aft…
    cli.dev-automigrate-policy · r8 A2 pass CLI-spawn boot (live, NODE_ENV=production serve): prod boot log carries "[schema-drift] autoMigrate='safe' is ignored under NODE_ENV=production — schema is never auto-altered in production. Run 'os migrate' deliberately." no reco…
    cli.dev-automigrate-policy · r8 A3 pass CLI-spawn boot (live): on both safe boots the destructive orphan (doomed) and needs_confirm relax (nn_field) stayed warnings; columns doomed and nn_field! still present in dump after safe boots
    cli.dev-automigrate-policy · r8 A4 pass engine (driver pins) + CLI-spawn boot (hand-staged): pins: 25031-blocked-unique-apply-limit 4 passed, unique-tenancy 25 passed (engine/driver); hand-staged: 2 rows dupf="same", unique declared, safe boot x2: "The op is BLOCKED ..…
    cli.dev-automigrate-policy · r8 A5 pass CLI-spawn boot (live, no config datasource): os dev -d file:host.db with no authored key: "[schema-drift] auto-reconciled replace_unique_index on qaam2_item.uq_field", legacy index gone; replanted + os start (non-dev): warnin…
    cli.migrate-meta-write-stored-and-all · r3 A0 pass CLI in-process (MigrateMeta.run) + library units: migrate-meta-write.test.ts 24, meta.report-order.test.ts 21, semantic-relevance 22, canonicalize-stored-flow 40, refused-shapes 72 — all passed, 0 failed (maxWorkers=1)
    cli.migrate-meta-write-stored-and-all · r3 A1 pass CLI-spawn (live, scratch showcase copy): planted refreshInterval + object-grid defaultFilters; os migrate meta --from 17 exit 0, tree checksum bae216a5dfd7b53b before == after
    cli.migrate-meta-write-stored-and-all · r3 A2 pass CLI-spawn (live): --write --json: written 5 (refreshInterval->refreshIntervalSeconds, defaultFilters->filter, 3x flow-decision-mode-inclusive-explicit), diff = only those lines; spread-planted site listed manual kind "spread", fi…
    cli.migrate-meta-write-stored-and-all · r3 A3 pass CLI-spawn (live, minimal stack w/o jobs/agents): default: one line "21 more manual change(s) not listed: their surfaces are absent from this stack (run with --all to list them)." (417 listed); --all lists 438 (+21)
    cli.migrate-meta-write-stored-and-all · r3 A4 pass CLI-spawn (live, --stored over scratch DB): stored flow with get_record filter {record.id}: --json canonical 2, skipped 1, row todos[flow-value-slot-template-dialect-refused] at flows[0].nodes[1].config.filter.id; text mode print…
    cli.organization-ownership-ceremony · r6 A0 pass CLI in-process/integration + runtime unit: 9 pin files: apply-flags 7, apply 112, occupancy 5, dialect 19, drop-gate 5, comment-reactions 7, host-supplement 7, generation-1 17, boot-guard 22 — all passed
    cli.organization-ownership-ceremony · r6 A1 pass CLI-spawn (live, restored 18.0.0-next.5 copy): bare plan exit 0, plan kind organization-ownership-plan / ADR-0131 D10 / digest 91c0815d..., 111 tables fated; DB sha 1302aee647d84400 before == after; --apply w/o --plan-file exit 1…
    cli.organization-ownership-ceremony · r6 A2 pass CLI-spawn (live): --apply --plan-file --backup-taken --json exit 0: 13 steps done, complete true, blocking 0; sys_migration adr-0131 verified_at set, blocking 0, checkpoint.shapeGeneration 1 == ORGANIZATION_OWNERSHIP_SHAPE_GENERA…
    cli.organization-ownership-ceremony · r6 A3 pass HTTP-booted-server (os serve, production): unmigrated: exit 1 before listening, "This database carries no organization-ownership marker ... Run 'os migrate organization-ownership --out PLAN' ..." (no release to stay on); migrated…
    cli.organization-ownership-ceremony · r6 A4 partial CLI-spawn (live, 18.0.0-next.5 copy — not v17-shaped): after comment-reactions --apply --yes x2 (exit 0 both), migrate apply --allow-destructive --yes --json exit 1, message refused_organization_ownership_unmigrated, tables [sy…
    cli.organization-ownership-ceremony · r6 A5 pass HTTP-booted-server + SQLite row reads (restored dump): serve1 exit 1 naming sys_flow_credential, sys_secret; apply complete/0; serve2 ready; 2 identity mails moved to sys_identity_email same ids, invitations stay; 8 global audits…
    cli.meta-package-flags-and-explain · r3 A0 pass CLI in-process over real REST handlers + engine: register-package 8, delete-reset-carriers 29, register-force 7, explain-rule-id 14, delete-noop-line 7 — all passed
    cli.meta-package-flags-and-explain · r3 A1 pass CLI-spawn -> HTTP-booted-server :41411: PUT .../meta/view/showcase_project.qa_view?package=com.qa.writable2 (wire URL in CLI log) -> "Saved view ... package=com.qa.writable2"; --package "" on register and delete: refusal, exit 1,…
    cli.meta-package-flags-and-explain · r3 A2 pass CLI-spawn -> HTTP-booted-server: field removed w/o --force: exit 1 "would drop or transform existing data: Field 'note' removed" + hint "Re-run with --force"; with --force exit 0 "Metadata registered"
    cli.meta-package-flags-and-explain · r3 A3 pass CLI-spawn: os explain field-no-consumers exit 0; --json {rule,covers,paragraphs}; no arg lists schemas + "Rule Explanations" (field-no-consumers present) exit 0; no_such_rule exit 1 "Unknown schema or rule id"
    cli.validate-v18-authoring-verdicts · r2 A0 pass plugin/library units (spec, formula, lint): define-seed-record-keys 13, validate-field-existence-spellings 31, stack-duplicate-entry 138, master-detail-required 24, stack-cbp-extension-master 12, validate-component-props 118, sta…
    cli.validate-v18-authoring-verdicts · r2 A1 pass CLI-spawn (scratch copy): validate exit 1 + build refused (no artifact) per arm: created_atx records[0]; record["typo"] expression-invalid; datasource declared twice; cbp master_detail w/o required objects.25.sharingModel; compon…
    cli.validate-v18-authoring-verdicts · r2 A2 pass CLI-spawn (scratch copy): controls validate exit 0 valid:true and build exit 0 with artifact: seed key created_at; record.title == "record.typo"; cbp master_detail required:true; email {provider:"log"}
    cli.verify-derived-proof-families · r3 A0 pass CLI-spawn (pins spawn the real producer): verify-reference-shapes 3, verify-delete-behaviors 3, verify-unique-scopes 3, verify-parent-write-reach 3, verify-dashboard-windows 3 — all passed
    cli.verify-derived-proof-families · r3 A1 pass CLI-spawn (showcase scratch copy): each of --reference-shapes/--delete-behaviors/--unique-scopes/--parent-write-reach/--dashboard-windows --json exit 0, hardFailures 0, keys referenceShapes/deleteBehaviors/uniqueScopes/parentWrit…
    cli.verify-derived-proof-families · r3 A2 pass CLI-spawn (pin spawns CLI over its stack + beforeDelete hook): verify-delete-behaviors.test.ts "NEGATIVE CONTROL: reports a cascade a hook undid, counts it, and exits 1" passed (spawnSync tsx CLI, asserts exit 1, status contradic…

    Derived: scaffold-first-run PASS · dev-automigrate-policy PASS · migrate-meta-write-stored-and-all PASS · organization-ownership-ceremony PARTIAL · meta-package-flags-and-explain PASS · validate-v18-authoring-verdicts PASS · verify-derived-proof-families PASS


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · sunhaolin · session_017xRBcScm27Q3R5mkYLPWdB

    Close-out for this record (SKILL §5).

    Extracted: #27411 · ai.mcp-validate-expression · observed beside the clauses
    Extracted: #27412 · attachments-storage.chunked-upload-integrity · observed beside the clauses
    Extracted: #27413 · attachments-storage.presigned-upload-roundtrip · observed beside the clauses
    Extracted: #27414 · automation.setup-packaged-automation-board · observed beside the clauses
    Extracted: #27415 · automation.trigger-type-matrix · observed beside the clauses
    Parked-on: #27377 · 14 PARTIAL items: coverage gaps, fixture gaps and checklist-accuracy findings (listed in the anchor comment)

    Four-way disposition: there is no clause fail in this run (0 FAIL), so no fail row needs a disposition.

    All five extracted cards are product defects found by off-clause probes. Each is filed without qa-run or pm:* labels so triage grades it.

    One further probe finding is an authorization finding. Under the maintainer's 2026-10-29 disclosure ruling it is not filed on GitHub, and its fix was dispatched directly. Its row in the record body reads only "security finding — detail withheld, fix dispatched".


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · sunhaolin · session_017xRBcScm27Q3R5mkYLPWdB

    Closing at 2026-10-29T05:39Z: the close-out is complete. Five product defects were extracted (#27411 to #27415). The 14 PARTIAL coverage gaps, the fixture gaps and the checklist-accuracy findings are parked on #27377 (comment 6488948228). There was no clause fail, so no fail row needs a disposition.


    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