Skip to content

[sweep] v18.2.0 release test sweep #25807

Open

Description

@objectstack-fleet

Filing gate: ③ a maintainer-directed task — the maintainer ordered the 18.2.0 release test wave in the Claude project thread on 2026-10-25, verbatim: 「18.2 准备发版本,评估一下哪些checklist需要运行」, then 「你应该按照相关的技能,派发 thread 测试卡」.
Business reason: 18.2.0 ships through the Version Packages PR #25640; the checklist runs are the release's evidence that the standing smoke and the 18.x line's capabilities still hold at the release head, before it merges.
Reader: the lane owning docs/qa/platform-checklist/** (domain:devx) — each checklist-accuracy row below is a ledger edit (revise the item, bump revision, append history citing the run record, keep pnpm check:platform-checklist green); the release decision reads the wave table in §0.
Dedupe (open AND closed): "[sweep] v18.2.0 release test sweep" → 19 hits; "v18.2 release sweep anchor qa checklist" → 59 hits. No 18.2 anchor exists; the nearest anchor is #24579 (18.0 wave, closed) and the nearest record #25479 (18.1.0 manual set, a single record, no anchor).

This card is the wave anchor for the 18.2.0 release test sweep (subject: framework main at or after 6679644a1a, console pin .objectui-sha = b41ed7f68956). Under RUNNER's extraction obligation (docs/qa/platform-checklist/RUNNER.md), checklist-accuracy findings, fixture gaps, partial coverage gaps and not-run handovers close out here; product defects are extracted as their own cards and listed in §5. Run records are qa-run issues and hang off this card by number.

0. The wave at a glance

record selector judged PASS PARTIAL FAIL BLOCKED NOT-RUN
#25812 priority:P0 23/23 19 4 0 0 0
#25815 release-18.2.0-tier1 131/156 6 123 0 2 25

Further records of this wave are added as they are filed. #25812 supersedes the 18.1.0 P0 record #25478. No P0 product failure; no auth/authz finding. #25815 (Tier 1): no pin red, no clause failed; its accuracy findings and gaps are in the comments below.

1. Re-point — red rows this anchor owns

None yet.

2. Checklist-accuracy findings

From #25812 (priority:P0) — each is a ledger edit for the lane owning the checklist:

  • RUNNER environment facts: (1) the walled-boot entry is stale — examples/app-showcase/package.json now declares @objectstack/organizations, so a walled run boots from the tree with three env vars, no scratch copy; (2) the Playwright entry is stale — /opt/pw-browsers now holds chromium 1243 and the alias resolves there (the alias advice still works).
  • platform-core.boot-health c2: deployment-policy unbound flows print as ℹ lines, not ⚠; the clause still describes ⚠.
  • platform-core.nav-surfaces-render: the console-added "All reports" sidebar destination is outside both meta/app nav and SURFACES, so the served-vs-SURFACES diff cannot see it; step 1's test:smoke also collects two other specs beside the pin.
  • platform-core.builtin-apps-nav-render: marketplace knownGap names "Forbidden", the screen reads "HTTP 502 · fetch failed" (MARKETPLACE_PROXY_FAILED); step 6 names sys_approval_request/my_pending for Account Approvals, the served entry is component/approvals/inbox; no clause covers a member opening Setup's url-type entries (they render inside the Showcase shell while the server refuses every namespace 403).
  • approvals.account-app-entry: "drawer" wording in steps 6–7 and acc[1], acc[3], acc[4] is stale — objectui removed the side sheet (objectui#12484); a row click or ?request= now opens /apps/APP/sys_approval_request/record/ID; the account app answers on two URL segments (account and com.objectstack.account), which matters for acc[5].
  • records-forms.crud-roundtrip: the owner half of acc[6] says "not yet run" — it was replayed this run.
  • integration-system.datasource-credential-refusal-matrix step 2: an schemaMode: 'external' datasource needs an external: {} block or it answers 400, easy to misread as a refusal.
  • automation.packaged-flow-disable-durable: steps 2/8/10 task POST needs project; step 4's "reads are open" holds only at the apiMethods layer (a contributor gets 403 on sys_metadata_activation).
  • identity-auth.default-organization-boot-invariant: step 3 filters organization = default, the column is organization_id and takes the org id; fixtures.requires says --fresh but c1 needs --log-level info and a readable file DB; acc[0] prescribes --maxWorkers=2 against RUNNER's memory fact.
  • platform-core.seed-integrity: the Specimen diff should name the canonical time form ("14:30" → "14:30:00"); step 2's baseline lists 9 of the 19 seeded datasets.
  • access-security.crud-permission-matrix knownGaps[1]: a plain member reads the whole org sys_user directory, not a self-scoped row (sys_account / sys_session are the self-scoped ones); the pin header says 6 delegate × sys_* rows, the matrix has 4.
  • access-security.walled-environment-metadata-operator-only: steps name showcase objects while the wall-* dogfood pins boot the CRM app — worth stating in the item.
  • cli.organization-ownership-ceremony: planning a raw v17 DB before any v18 boot blocks the apply at the rewrite step (resumable after one boot) — put the refused boot before the plan; apply needs OS_AUTH_SECRET (or --dev) or it blocks at authored-conversion; on a real 17.x DB the drop gate's first refusal is refused_comment_reactions_unconverted, so os migrate comment-reactions --apply --yes (step 4, which also lacks --yes) must come before step 3; acc[0] prescribes --maxWorkers=2; c5 knownGaps should say a published prerelease CLI is no substitute.
  • platform-core.v18-boot-refusals step 1: production os serve --preset minimal is refused earlier ("This stack mounts no auth…"); os serve --dev --no-server is the spelling that reaches the SecurityPlugin refusal.
  • ai.mcp-stdio-fail-closed steps 2 and 9: the INFO lines need --log-level info on os start; query_records caps limit at 50.

3. Fixture gaps, partial coverage and not-run handover

From #25812 (priority:P0); no not-run items.

  • access-security.rls-both-sides acceptance[5] — blocked(dependency): the D11 judgement needs the private write-up the item's knownGaps names.
  • access-security.crud-permission-matrix acceptance[5] — blocked(fixture): guest anchor ships unbound (the item's knownGaps[2]).
  • access-security.walled-environment-metadata-operator-only acceptance[1], negative[0] — blocked(fixture): the walled boot comes up, but the org owner's org-scoped manage_metadata grant cannot be placed through any HTTP door (operator insert 403 outside organization scope; owner self-grant 403 under ADR-0090 D12 condition (c)). A seed or a system-write fixture for that grant would close it.
  • cli.organization-ownership-ceremony acceptance[5] — blocked(fixture): needs a showcase DB born under an 18.0.0-next build; a published prerelease CLI resolves 18.1.0 dependencies, so knownGaps should say it is no substitute.
  • platform-core.builtin-apps-nav-render — marketplace catalog content needs egress to cloud.objectos.ai (the named error state was scored).
  • platform-core.nav-surfaces-render acceptance[3] — no fixture throws inside a route, so the ErrorBoundary fallback stands on "none encountered".

4. Retest list (SKILL §5 trigger 2)

None yet — a seat accepting a QA-extracted fix card appends the affected items here.

5. Extracted elsewhere (not repeated here)

None yet.


Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    priority:p1High: required for production / M2
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    on Oct 25, 2026
  2. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    From #25815 (release-18.2.0-tier1, 156 items) — §2 checklist-accuracy findings, part 1/2 (areas: access-security, ai, api-backend, approvals, attachments-storage, automation, cli, i18n, identity-auth, integration-system, platform-core). Each line is a ledger edit for the lane owning docs/qa/platform-checklist/**: revise the item, bump revision, append history citing #25815. Clause labels: aK = acceptance[K], nK = negative[K].

    Highlights (each is also in the list below): stale clause text — records-forms.field-unique-enforcement a4 still says org-less rows fold to ONE bucket while both pins assert they are exempt (ADR-0131 D1); cli.dev-automigrate-policy a4/n2 name two ADR-0120 D4 tightening cases that no longer exist (the file now asserts "no tightening proposed", ADR-0131 D1); records-forms.conditional-rules-header a2 claims a client lock on tax_rate the spec asserts the opposite of (objectui#13436). Refs that miss their own pins: e.g. access-security.no-active-org-session-semantics (two HTTP dogfood suites would cover a1–a3, n0, n1), attachments-storage.upload-session-abort, ai.mcp-coded-refusals-and-runtime-exposure, integration-system.email-template-render a3/a5, identity-auth.auth-method-matrix a3/a6/a9. Parser-hostile spellings: refs naming dropped files in prose (records-forms.conditional-rules-grid, records-forms.action-param-widgets, records-forms.adhoc-filter-sort-builder, records-forms.master-detail-atomic-save, records-forms.concurrent-edit-conflict), a brace glob in records-forms.bulk-select-all-matching, a source file named as a pin in access-security.rls-both-sides.

    access-security

    • access-security.activation-write-operator-gate a0/n2: ref claims the 'full posture x identity matrix' but automation-activation-posture-gate.test.ts has no caller-without-manage_metadata case; FLOW_ENABLEMENT_DENY_MESSAGE is asserted by no test in the repo
    • access-security.activation-write-operator-gate a1: action-activation-posture-gate.test.ts › REFUSES a caller without manage_metadata, in every posture asserts only toContain('manage_metadata') at the unit layer — not the 'functionally equivalent to deleting it' rationale nor 'a packaged action' subject, and it runs only single
    • access-security.activation-write-operator-gate a3: packages/qa/dogfood/test/packaged-activation-ledger-reach.dogfood.test.ts (not in ref) asserts one deployment-level row with no tenant column over HTTP, but as the dev admin, not a manage_metadata-without-platform_admin persona
    • access-security.activation-write-operator-gate a5: boot-log restart re-hydration corroboration is not covered by any pin (test half only)
    • access-security.anonymous-deny-surfaces a4: pin's /meta member contrast is .not.toBe(401), clause demands 200
    • access-security.anonymous-deny-surfaces a5: ref lists seven families but not the public-forms both-sides contrast; no pin covers it
    • access-security.anonymous-deny-surfaces n0: ref does not cover the post-DELETE authed GET /automation/showcase_reassign_wizard 200 read-back
    • access-security.anonymous-floor-v18-doors a1: the sweep's EVERYTHING_ELSE expectation checks status 401 + an error envelope, never error.code; UNAUTHENTICATED is asserted only in the unit pins (i18n, settings, api-description), none for /notifications, /keys, /share-links
    • access-security.anonymous-floor-v18-doors a3: DOOR_CLASSES[1] (share-link token face) uses REFUSED_WITHOUT_A_SUBJECT, which accepts 401 — the clause's 'not 401' is not asserted by any pin
    • access-security.anonymous-floor-v18-doors a2: rest-docs-viewer-retired.pin asserts no registration on RestServer/route manager; no pin compares GET /api/v1/docs to the never-served control path, anonymous and admin
    • access-security.anonymous-floor-v18-doors a4: the dogfood submit asserts 2xx and keys ['id'] on the showcase (step 4's forged owner_id/status not sent); exact 201 is asserted only by the Hono-transport pin over a protocol double
    • access-security.crud-permission-matrix ref: packages/verify/src/verify.ts / rls.ts (objectstack verify --rls) are a CLI proof, not test files — no pin here drives them; the object-level RLS half is unscored by the dogfood pins.
    • access-security.crud-permission-matrix a3: ref says the pin reaches clause 3; it probes only showcase_private_note (inquiry/invoice/invoice_line VAMA reads not asserted).
    • access-security.crud-permission-matrix a6: verify text says '45 rows × 4 verbs at revision 6'; the pin judges 41 rows (164 cells) and explicitly excludes the 4 sys_* rows, so clause 6 cannot be pinned whole.
    • access-security.crud-permission-matrix ref says 'showcase-permission-zoo pins on both sides' the delegate subtree gate: its out-of-subtree case asserts only non-2xx, not 403 PERMISSION_DENIED as the ref states.
    • access-security.crud-permission-matrix ref header comment in the pin says '6 showcase_field_ops_delegate × sys_* rows'; the ref and the pin's own assertion say 4 (2 retired).
    • access-security.deployment-tables-platform-only a0: packages/plugins/plugin-security/src/authz-identity-objects-boot-refusal.test.ts asserts SecurityPlugin's boot refusal when sys_user/sys_member/sys_organization are missing — nothing about the seven deployment tables or manage_platform_settings
    • access-security.deployment-tables-platform-only a1/a2: no pin drives either door over HTTP; both remain live-run clauses
    • access-security.fls-mask-and-strip a2: admin-side budget write (both sides of the lock) is asserted by neither pin, and the ref's STILL MANUAL list does not name it
    • access-security.fls-mask-and-strip a0: zoo FLS case asserts the name PATCH status only; the clause's 're-reads changed' leg is unpinned
    • access-security.grant-table-write-contract a1/a3/a4: api-oracle clauses are pinned only at the engine layer (real ObjectQL + SqlDriver, errors mapped by resolveThrownHttpError); no pin in the ref drives the /data door over HTTP for them
    • access-security.grant-table-write-contract a2: permission-set-assignment-window.dogfood.test.ts › 'the door refuses a window whose end is not after its start…' asserts [400, VALIDATION_FAILED] and fields [[valid_until, rule_violation]] only; the authored message, constraint absent/not 'unevaluable' and the valid-window 201 control are not asserted over HTTP
    • access-security.me-permissions-aggregation-parity a2: me-apps-and-everyone-baseline pin asserts only the member side (no gated app); the admin-sees-gated-app half is unpinned.
    • access-security.me-permissions-aggregation-parity a3: the anonymous trio's 200 shapes are pinned only in hono-current-user-endpoints.test.ts on a bare HonoServerPlugin with no auth service or auth gate — the 401-floor regression the clause guards is not reachable there; the dogfood anonymous /me/apps case asserts body.apps ?? [] only, never the status.
    • access-security.me-permissions-aggregation-parity a5: packages/plugins/plugin-hono-server/src/current-user-endpoints-localization.test.ts asserts the locale/timezone floors (unit) and is not in the ref.
    • access-security.meta-authoring-trail-and-audience-gates a2: meta-view-dashboard-audience-gate.test.ts drives RestServer with a mock server/protocol (unit) and covers list pruning + by-name refusal only — no /published, /layers or ?state=draft door, and no /history case for a studio.access holder lacking the view's requiredPermissions
    • access-security.meta-authoring-trail-and-audience-gates n0: the 304 assertion ('a caller who no longer holds the capability is never answered a 304…') exists only at the unit layer
    • access-security.no-active-org-session-semantics ref prose is stale: it describes a group CONTROL 'a NON-EMPTY membership set lands, even with no active organization'; on this tree that case is 'a NON-EMPTY membership set with NO active organization: an insert has nowhere to land, and is refused the same way' (asserts refusal)
    • access-security.no-active-org-session-semantics a1/a2/n1: packages/qa/dogfood/test/no-active-organization-write-refusal.dogfood.test.ts (HTTP 403 naming the missing org + nothing written) exists and is not in the ref
    • access-security.no-active-org-session-semantics a3/n0: packages/qa/dogfood/test/sharing-rule-org-less-caller.dogfood.test.ts (plugin-sharing: a manage_sharing holder whose session has no ACTIVE organization reads every tenant's sharing rules (adminOrgScope falls open) #8158 org-scoped manage_sharing holder over HTTP) exists and is not in the ref
    • access-security.no-active-org-session-semantics a7 (group, engine layer): packages/plugins/plugin-security/src/no-active-organization-insert-union-scope.test.ts (real ObjectQL + SqlDriver, group refusal and nothing stored) exists and is not in the ref; still in-process, not the live walled boot a7 requires
    • access-security.no-active-org-session-semantics ref says the pin 'pins every clause of this item at unit level' — a3, a4, a5, a6 have no case in it at any level
    • access-security.org-admin-assignment-boundary n2: the three-posture posture file only exercises admin_full_access out-of-boundary; the full set list (adminScope, platform-capability, org-admin sets, mcp agent ceilings) is asserted only by the unit gate in delegated-admin-gate.test.ts, not per posture
    • access-security.owd-sharing-matrix a0: verify's admin re-read of the denied PATCH is not asserted by showcase-private-owd (status only); clause text otherwise pinned; by-id GET asserted as not-200 rather than non-2xx
    • access-security.owd-sharing-matrix a2/a3/a5: ref implies all four OWD models pinned, but no pin covers modifyAllRecords bypass, public_read_write, or auditor VAMA
    • access-security.owd-sharing-matrix a4: showcase-invoice-cbp boots a test-local fallback set (showcase_cbp_member), not the showcase C1/C2 personas, and asserts no list exclusion; controlled-by-parent.dogfood.test.ts uses a synthetic cbp_account/cbp_note fixture, not showcase_invoice_line
    • access-security.parent-and-organization-write-guards a1/a2/n0: the walled organization-removal refusal and the unreadable-header parity are pinned only in-process (engine + SecurityPlugin over SQL drivers, thrown statusCode / resolveThrownHttpError) — the api-oracle legs have no HTTP pin; precedent QA run · tier1:24681-touched (63/82) · 307ce4c4 · 2026-10-20 · 10 PASS / 53 PARTIAL / 0 FAIL / 0 BLOCKED / 19 NOT-RUN #24840 scored them PASS (rev 4) before the layer rule.
    • access-security.platform-owner-email-anchor n0: admin-standing-surface.test.ts never asserts ADMIN_STANDING_NON_TABLE_INPUTS (the OS_PLATFORM_OWNER_EMAIL non-table declaration n0 cites); the declaration is unpinned
    • access-security.platform-owner-email-anchor a0-a3: ref correctly records these as STILL MANUAL live-HTTP arms; unit pins do not score them
    • access-security.public-form-withdrawal-layers a0: ref concedes the no-organization read of step 4 has no end-to-end pin, so a0 cannot score from pins alone (the save 200 /env-wide/ and both doors 404 FORM_NOT_FOUND, landed 0, are pinned)
    • access-security.public-form-withdrawal-layers a2-a5: the rest pin is a unit (RestServer over a mocked protocol), the protocol pin an in-process protocol over a stub registry; both fit the [test] oracle
    • access-security.record-access-explain a1: ref 'explain vama_bypass case' asserts vama_bypass via in-process security.explain() (isSystem context), not the POST /api/v1/security/explain door the oracle names
    • access-security.record-access-explain a2/a3/n0: pin has no plain-member (deny-side) explain call; only the GET denial half is pinned
    • access-security.record-view-read-audit n0: the item says the ledger failure is 'reported once per process'; read-audit.test.ts '[finding] plugin-audit: a THIRD copy of both #15166 defects lives in read-audit.ts — process-wide boolean plus an unconditional datasource remedy #18247' cases pin once per CAUSE (a second distinct cause reports again at error) — item text is stale.
    • access-security.record-view-read-audit a4: verify cites sys_job as the excluded name; the pin probes sys_audit_log / sys_session, and no pin observes the AuditPlugin install line ('record-view auditing installed on N object(s)').
    • access-security.rls-both-sides a4: ref names packages/verify/src/rls.ts, a source file, not a test; no pin runs runRlsProofs over the showcase (rls-fixture/rls-multitenant dogfood run it on purpose-built fixtures only)
    • access-security.rls-both-sides a2/n0: the pin's foreign PATCH asserts only status >=300; the row-unchanged re-read the clause requires is pinned for a fixture object in packages/qa/dogfood/test/rls-fixture.dogfood.test.ts, not for showcase_private_note
    • access-security.security-catalog-activation-and-clone-doors a2: the audience-anchor 400 (everyone/guest) is asserted only in packages/runtime/src/domains/catalog-activation-door.test.ts (handler with fakes); the dogfood pin drives the 404 arm only
    • access-security.security-catalog-activation-and-clone-doors a3: dogfood clone pin drives 200 + dropped keys, 409 (another set's name), 404, bad-name 400, 403; anonymous 401, the source's own name 409 and the closed-body 400 are unit-only
    • access-security.security-catalog-one-holder-and-boot-report a1: packages/cloud-connection/src/marketplace-install-local-catalog-name-collision.test.ts (not in ref) asserts 422 PLUGIN_REGISTER_FAILED + nothing registered on POST /marketplace/install-local (in-process plugin, stubbed cloud fetch) — the ref's pins only reach manifest.register / boot refusal
    • access-security.security-catalog-one-holder-and-boot-report a2: permission-set-owner-registration.test.ts proves VALIDATION_ERROR/400 at registerApp, not on a permission-set save door; no HTTP pin for the save
    • access-security.security-catalog-one-holder-and-boot-report a3: CLI is run via MigrateSecurityCatalogOverlays.run in-process (oclif), not a spawned process — acceptable for the build oracle
    • access-security.security-catalog-one-holder-and-boot-report a4: catalog-reference-report.test.ts asserts the [security] error/info lines on a vi.fn logger; the ≤50-names cap is not visibly asserted
    • access-security.share-link-combined-gates a1/a2: packages/runtime/src/domains/share-links-refusal-order.test.ts asserts the anonymous no-password-oracle and email-audience identical-refusal rows but is not in the ref (in-process layer, would not score the api clause either)
    • access-security.share-link-combined-gates a3: ref names share-links-messages-audience.test.ts for acceptance[3]; its harness is in-process route entries (no Hono/HTTP), so it scores a0 only, not the api oracle
    • access-security.walled-environment-metadata-operator-only a2: single-posture leg is pinned as a manage_metadata holder below the operator (stronger than 'admin'); no case drives the seeded admin specifically on single
    • access-security.write-path-guards a4/a6: ref names owner-anchor-and-bulk-writes for bulk writes, but its bulk cases are engine-direct ql.update/ql.delete owner scoping — no createMany stamping, no per-row validation
    • access-security.write-path-guards a5: showcase-readonly-when-parent asserts single-row PATCH strips + header X-ObjectStack-Dropped-Fields; the mixed updateMany results[i].droppedFields leg and the line's product field are unpinned
    • access-security.write-path-guards a0: showcase-static-readonly asserts no droppedFields on the INSERT strip (verify names droppedFields)
    • access-security.write-path-guards n1: objectql pins use a recording/fake driver (real engine) and other objects, not showcase lead_score

    ai

    • ai.mcp-coded-refusals-and-runtime-exposure a1: packages/mcp/src/mcp-coded-refusal.test.ts ('<tool>: RECORD_NOT_FOUND from <member> answers code, message and status') asserts the clause at unit layer but is not in the ref
    • ai.mcp-coded-refusals-and-runtime-exposure a2: no pin drives query_records on an apiEnabled:false runtime object across a restart; plugin-runtime-object-metadata-copy asserts the metadata copy/listing only
    • ai.mcp-http-surface a3: the pin asserts status 401 only; the 'Unauthorized: a valid API key is required' wording and the OAuth WWW-Authenticate form are unasserted
    • ai.mcp-http-surface a4: the pin's tool-discovery case uses a session bearer token (not an API key), skips initialize, and checks two tool names, not the documented 12
    • ai.mcp-http-surface ref is bare (one file) while the item has six acceptance clauses: a0–a2 and a5 have no pin at any layer
    • ai.mcp-oauth-private-host-transport a0-a4: item is api/log-oracle throughout but the only pin (auth-manager.mcp-oauth.test.ts) is a unit test of isOAuthEligibleBaseUrl / AuthManager getters — no booted server, no log capture; it corroborates the rule but scores no clause
    • ai.mcp-oauth-private-host-transport a4: '… is reachable by no configuration key and no environment variable' (unit) covers the predicate half only
    • ai.mcp-stdio-fail-closed a0: the pin regex /OS_MCP_STDIO_API_KEY/ checks the var name only, not the remedy text nor 'the process does not serve'; scored from the verify's own oracle (plugin.start throws).
    • ai.mcp-stdio-fail-closed a1/a6/n4: no test in packages/mcp asserts the API_KEY_REVOKED arm ([Decision] API key 的生命周期与存放:到期上限与不活动失效取多长,key 继续放自有 sys_api_key 还是迁到 @better-auth/api-key(#23287 裁决 C′ 的留项) #23367) — grep for 'REVOKED' over packages/mcp tests finds none; ref is a single unit file for an item whose clauses are mostly live api/log.
    • ai.mcp-validate-expression a2: pin never runs the SAME expression under both sites (flow_condition case uses a different expression than the formula bare-field case)
    • ai.mcp-validate-expression a0/a1/a3: pin harness is a fake describeObject bridge, not the served MCP door the api oracle names
    • ai.skill-instructions-mcp-prompts a3: verify cites skill-prompts.test.ts as the pin, but it drives only an unknown name ('no_such_skill') through a stub bridge; a non-projected (inactive or instruction-less) name on prompts/get is not asserted
    • ai.skill-instructions-mcp-prompts n1: no pin asserts prompts/get refuses an inactive skill (only prompts/list omission is asserted)

    api-backend

    • api-backend.action-activation-door-contract a6: ref/verify says 'both owners named'; the ambiguity case asserts only messageOf(res) toContain('crm_account')
    • api-backend.action-activation-door-contract a5: ledger-reach asserts the key set via rows.find, never that exactly one row exists, and does not read the 200 body {name, objectName, enabled}
    • api-backend.action-activation-door-contract a2: ref claims 'unknown-key/non-boolean 400s' — pin asserts code VALIDATION_FAILED only, not fields[0] unknown_field/invalid_type or the non-object-body arm
    • api-backend.bulk-write-contract ref '(bulk halves)' overclaims: the pin's bulk cases call ql.update/ql.delete({multi:true}) on the engine with a resolved authz context; none of the createMany/updateMany/deleteMany HTTP doors the clauses name is driven, so no clause a0-a5/n0 is asserted
    • api-backend.bulk-write-contract a3: packages/rest/src/rest-batch-size-cap.test.ts pins BATCH_TOO_LARGE at the unit layer (mock protocol) and is not in this item's ref; it still would not score an api oracle
    • api-backend.data-request-shape-and-query-arity a1-a4: every pin invokes RestServer route handlers / HttpDispatcher.dispatch directly (real ObjectQL+SqlDriver for data-write-request-gate, data-delete-expected-version, data-conflict-caller-visibility; stubs for the arity files) — none boots the Hono adapter, so the api-oracle clauses stay a live leg
    • api-backend.data-request-shape-and-query-arity a1: the empty-version-token leg is in data-delete-expected-version.test.ts (DELETE), while the clause speaks of PATCH bodies + an empty version token — check the clause intends DELETE for the token
    • api-backend.declarative-endpoint-execution a1: no pin asserts the 401 body's code (UNAUTHENTICATED); showcase case checks success:false only, policy case status only
    • api-backend.declarative-endpoint-execution a2: spec gate (a) asserts the fix sentence but not that the message names the endpoint; the api 注册表条目声明 allowRuntimeCreate: true,但运行时创建的端点匹配器永远看不见 —— 声明的能力运行时不兑现(真实 boot 实测) #5488 runtime-authoring withdrawal is unasserted; the build oracle's os validate/os build run is not a pin
    • api-backend.error-sentences-and-unique-violation-wire-code a1: the verify names rest-hook-script-fault-envelope.test.ts for the 'live /data door' — that file imports mapDataError only, so the live leg is unit, not the door
    • api-backend.error-sentences-and-unique-violation-wire-code a2: dispatcher-unique-violation-wire-code.test.ts uses a real engine + SqlDriver behind HttpDispatcher; no Hono adapter, so the wire body is the dispatcher's result, not an HTTP answer
    • api-backend.meta-read-doors-v18 a4: no ref pin asserts the data-sort 403 on F (the 'two agree' half); showcase-fls-read-mask-strip.dogfood.test.ts has a sort-403 case but is not in this ref
    • api-backend.meta-read-doors-v18 a1-a3: precedent QA run · tier1:24681-touched (63/82) · 307ce4c4 · 2026-10-20 · 10 PASS / 53 PARTIAL / 0 FAIL / 0 BLOCKED / 19 NOT-RUN #24840 carried these as pass from QA run · surface:api (116/130) · 580fd4ed · 2026-10-20 · 62 PASS / 54 PARTIAL / 0 FAIL / 0 BLOCKED / 14 NOT-RUN #24779; on this tree every ref pin drives route handlers with a stub server/response (no Hono adapter), so they score a0 only
    • api-backend.packaged-action-disabled-dispatch a0: dogfood asserts status 409 and text toMatch(/ACTION_DISABLED|is disabled/) — neither the exact code nor the describeDisabledAction sentence, and no task re-read for side effects; the exact sentence is unit-only (action-activation-dispatch.test.ts › the shared guard itself › answers 409 ACTION_DISABLED with the ENGINE's own sentence)
    • api-backend.packaged-action-disabled-dispatch a3/a6/n1: ref credits action-activation-dispatch.test.ts for the 403-not-an-oracle, flow-type and absence-means-active legs, but it is a unit HttpDispatcher over fakes — it stops above the HTTP layer the api oracle needs
    • api-backend.packaged-action-disabled-dispatch a5: ref correctly says the restart leg stays manual
    • api-backend.query-contract-matrix a4: engine.test.ts '[Security: $expand bypasses RLS/FLS on the referenced object (data leak on lookups) #2850] routes the expand sub-read through the middleware … tagged __expandRead' proves the sub-read is routed through middleware on a mock driver — not that a contributor's expand withholds the contact over HTTP; under rule 6 it cannot score a4 (round 4 QA run · tier1:24681-touched (63/82) · 307ce4c4 · 2026-10-20 · 10 PASS / 53 PARTIAL / 0 FAIL / 0 BLOCKED / 19 NOT-RUN #24840 scored it pass)
    • api-backend.query-contract-matrix n0: request-schema-gate.conformance.test.ts drives RestServer with a mocked protocol — the ref says so itself
    • api-backend.query-contract-matrix whole item: Tier 1 in name only — no clause has a pin at its oracle's layer
    • api-backend.rest-batch-config-contract a5: rest-sub-config-parse-not-cast.test.ts §E › 'refuses batch.operations.upsertMany and batch.defaultAtomic' asserts the key and /never built/ resp. /options.atomic/; it does not assert that the messages name BatchEndpointsConfigSchema, nor the upsert replacement (an operation type of the generic batch door)
    • api-backend.rest-crud-config-contract a3: packages/rest/src/discovery-services-route-follows-mount.test.ts ('[finding] discovery contradicts itself under a non-default crud.dataPrefix: routes.data follows the key, services.data.route stays hard-coded at /api/v1/data #16674 — a moved crud.dataPrefix moves BOTH halves of the document') pins the discovery-advertisement half at a non-default prefix and is not in the ref; the moved-route-table half has no pin.
    • api-backend.rest-crud-config-contract a4: ref says §E pins acceptance[4]; the case asserts 'crud.patterns' + 'CrudEndpointsConfigSchema' + /was removed in @objectstack/spec 17/ only — the declarative-api-endpoint prescription is never matched, and the objectParamStyle refusal is checked for its key and /was removed/ only.
    • api-backend.rest-metadata-config-contract a1: ref says §D 'pins prefix … survival' — true, but no pin mounts at prefix '/metadata' or reads the discovery body's routes.metadata; the clause's move-together claim is unpinned
    • api-backend.rest-metadata-config-contract a5: §E's cacheTtl case asserts the key, MetadataEndpointsConfigSchema and /was removed/; the endpoints.schema case asserts the key and /does not exist/ only — neither asserts the replacement named in the verify
    • api-backend.rest-metadata-config-contract a3: only the normalizeConfig half is pinned; ref concedes the masking-effect half has no pin
    • api-backend.rest-route-generation-tombstones a0: §E › 'refuses every routes.* key' asserts routes.&lt;key>, RouteGenerationConfigSchema and /was removed/ — not the clause's 'was removed in @objectstack/spec 17'; nameTransform driven with 'none' only (ref concedes)

    approvals

    • approvals.decision-only-via-service all clauses: the ref (kind 'test') is packages/services/service-automation/src/resume-authority-gate.test.ts, an AutomationEngine + InMemorySuspendedRunStore unit — every clause's oracle is the api (route status, run/actions reads); precedent QA run · tier1:24681-touched (63/82) · 307ce4c4 · 2026-10-20 · 10 PASS / 53 PARTIAL / 0 FAIL / 0 BLOCKED / 19 NOT-RUN #24840 scored rev 1 PASS from it before the layer rule. Needs an HTTP pin (generic resume route + approvals API) to be Tier 1.
    • approvals.email-action-token-door a0: clause's live at-rest sys_notification read stays a run leg; FORBIDDEN arm is exercised with 'stranger' (not an approver at all) rather than a non-pending approver
    • approvals.email-action-token-door a1: pin asserts status pending + no decisions, not byte-identity of the actions timeline / token consumed_at
    • approvals.email-action-token-door a3: 'a decide that fails still burns it' (consume-first under a failing decide) is not asserted by any named pin
    • approvals.request-page-reply-and-reader-visibility a1: no pin asserts the approval_comment reply landing in the timeline, or the pending-approver/submitter-only restriction on replying
    • approvals.request-page-reply-and-reader-visibility a2: ref says request-read-gate covers acceptance[2]; it drives ObjectQL/protocol in-process, never /data/sys_approval_request over HTTP
    • approvals.status-mirror-field a2: the clause names the SLA auto-decision as a second user-less machine transition; the pin drives only the dead-run sweep (the verify asks only for the sweep)
    • approvals.status-mirror-field a0/a1/a3/a4: the ref is the only pin and covers a2/n2 alone; the api/log clauses have no automation

    attachments-storage

    • attachments-storage.attach-requires-parent-edit a2: the uploader legs of '(a) granted member: uploader may delete…' are an admin (who edits everything) and memberA on att_case (public_read_write, so memberA edits it); 'the uploader succeeds even without parent edit' is not driven
    • attachments-storage.attach-requires-parent-edit n1: none of the refused-attach cases ((b), (item 3), ([objectui/framework] enable.files: generic Attachments related-list (Salesforce Notes & Attachments parity) #2727)) re-reads sys_attachment for a row the refusal left
    • attachments-storage.chunked-upload-integrity a1: the clause names details.missingChunks [1] (chunk 1 not sent); the dogfood pin withholds chunk 0 and asserts [0] — same behaviour, the clause's literal does not match the pin's fixture.
    • attachments-storage.download-authz-both-sides a2: ref claims 'the uploader/entitled 200' covers clause 2; the owner case is the admin, who also owns/reads the parent, so the uploader-bypass-against-unreadable-parent leg and the 'url serves the bytes' leg are unasserted
    • attachments-storage.inline-grid-receipt-cells a2: the spec does not capture the /api/v1/storage/* upload requests; storage routing is inferred from the file door returning the uploaded bytes
    • attachments-storage.inline-grid-receipt-cells a3: the spec never reads the sys_file row (status 'committed', ref_object/ref_id/ref_field, acl 'private') nor asserts the batch response succeeded — only the request payload and GET /storage/files/:id
    • attachments-storage.inline-grid-receipt-cells n1: a data: URL would satisfy typeof==='string' && !contains('receipt.png'); the n1 guard rests on the follow-up storage GET answering 200 with the PNG bytes
    • attachments-storage.orphan-tombstone-reap a1: the dogfood sweep is lifecycle.sweep() called in-process after HTTP-driven setup (no door exists for it); the failed-byte-delete-leaves-the-row leg and its warn log are pinned only in attachment-lifecycle.test.ts with a fake engine.
    • attachments-storage.presigned-upload-roundtrip ref is bare: attachments-permission-matrix is a permission-matrix file whose uploadFile helper drives presign/PUT/complete but asserts only statuses; a0–a3's field, pending→committed, byte-equality and 302 halves are unpinned
    • attachments-storage.presigned-upload-roundtrip a4: the anonymous case asserts 401 + AUTH_REQUIRED but never counts sys_file rows around the attempt
    • attachments-storage.read-inherits-parent-rls a3: the probe half (D5 classes, warning text, probe-failure deny) is in-process/unit only; the item states it is unreachable from a run, so scoring it from those pins follows the item's own verify — note the warning's exact '[storage] attachment read visibility' text is asserted only at unit
    • attachments-storage.sys-file-status-pipeline a2: the live-holder half is scored, as the item directs, from tombstone-download-live-reference.test.ts, a unit test (mock HTTP server + fake engine); the live holder-less 404 FILE_NOT_FOUND and the post-re-attach /url 200 legs have no pin.
    • attachments-storage.sys-file-status-pipeline a1: tombstone-download-live-reference.test.ts 'leaves pending refused — only the tombstone limb widened' is a unit route test; the api-oracle 404 FILE_NOT_FOUND has no HTTP pin.
    • attachments-storage.upload-limits-scope-and-ownership a1–a3: storage-limits, upload-scope-vocabulary and upload-door-ownership call registered RouteHandlers with hand-built IHttpRequest/IHttpResponse — no HTTP adapter; a1's 'takes effect without restart' is at the plugin/kernel, not a served request
    • attachments-storage.upload-limits-scope-and-ownership a5: both hydrate pins are engine-level; no pin reads a copied file id over /data
    • attachments-storage.upload-session-abort a2/a3/n0/n1: packages/services/service-storage/src/attachment-lifecycle.test.ts › createUploadSessionReapGuard ('does NOT abort a completed session', 'reaps a session with no backend_upload_id without calling abort', 'VETOES on abort failure...', 'reaps the row when the adapter cannot abort at all') asserts these at unit layer but is not in the ref
    • attachments-storage.upload-session-abort a5: packages/services/service-storage/src/storage-routes.test.ts ('stamps expired and 410s a chunk PUT / a completion past the session deadline', 'does not expire a session still inside its deadline') asserts the 410 at route-handler unit layer, not in the ref (would not score the api oracle)
    • attachments-storage.upload-session-abort bare ref names only the dogfood matrix file; it scores a1 alone

    automation

    • automation.durable-suspend-restart a0/a1/a4: the pin drives its own fixture (flow_durable_suspend, a screen-node pause) — not the showcase showcase_task_follow_up timer or the showcase_project_closure → showcase_closure_signoff nested pair the steps name; the generic persistence/consumption assertions hold, the per-kind rows are not observed
    • automation.durable-suspend-restart a1: the pin's 'cold boot' is a second bootStack kernel over the same file inside one test process, not a separately spawned server process
    • automation.flow-authoring-refusals-v18 ref is accurate: it scopes the nine unit files to acceptance[0] only and says a1-a3 are manual; all nine files exist with ≥1 test
    • automation.flow-run-semantics-v18 a2/n0: the ref's two elevated-door pins (packages/runtime/src/{action,endpoint}-flow-elevated-door.test.ts) are unit door pins over a scripted automation service and never drive the trigger door the step names (POST /automation/:name/trigger); the wire pins that do — packages/verify/src/automation-trigger-elevated-door.test.ts (HTTP injection, 403 PERMISSION_DENIED, runs 0 by listRuns) and packages/qa/dogfood/test/flow-door-elevated-start.dogfood.test.ts — are not in the ref (the runtime file's own header names them as the wire half)
    • automation.flow-run-semantics-v18 a1: no pin in the ref reads back a field a record-triggered run stamped over HTTP; flow-cel-current-user.test.ts drives the engine only
    • automation.inbound-hook-timestamped-signature a2: no pin byte-compares the refusal arms' bodies against each other; rows assert code + typeof message only (member-vs-mount parity is per row, not across arms)
    • automation.paused-run-trigger-record-masked a0: the column parse is an engine (isSystem) read of sys_automation_run, plus an HTTP data-door read that checks only variables_json.record; 'null where unset' is not exercised
    • automation.paused-run-trigger-record-masked a3: the 'second process' is a second bootStack over the same SQLite file inside the same vitest process, not a spawned server
    • automation.paused-run-trigger-record-masked n0: every reader in the pin is the dev admin token; 'whichever persona reads it' is not driven across personas
    • automation.scheduled-work-opt-in a1/a2: both pins assert that flows are ARMED (or not) and the refusal sentence on a LiteKernel; neither observes a served boot log line or run rows after intervals
    • automation.screen-flow-roundtrip a4: the spec's final assertion is page.getByText(assignee) on the grid — exactly the 'not just the refreshed grid cell' the clause excludes
    • automation.screen-flow-roundtrip a0/a3: the spec never reads the run (status paused/completed); only request capture and UI toast
    • automation.setup-packaged-automation-board a0: the objectui ref→URL half names PackagedAutomationPage.navContribution.test.tsx (exists at the pin) in the clause's verify but not in automated.ref; it is component-layer and scores nothing either way.
    • automation.trigger-type-matrix n0: names packages/qa/dogfood/test/showcase-anonymous-deny-surfaces.dogfood.test.ts › 'anonymous POST /automation/:name/trigger is denied (401)' (exists, line 587) but the file is not in automated.ref, so a ref-driven run never executes it

    cli

    • cli.dev-automigrate-policy a4/n2: ref names cases 'auto-tightens at boot under autoMigrate: safe when the probe is clean' and 'BLOCKS the tightening on duplicate NULL-organization rows — old index kept, rows reported' in a describe 'bare-composite tightening + duplicate pre-flight (ADR-0120 D4)' — none exist in sql-driver-unique-tenancy.test.ts on this tree; the file now has 'bare composite from a pre-18 database — no tightening proposed (ADR-0131 D1)' asserting zero drift and 'duplicate NULL-organization rows are no longer a blocker — no op proposed, rows and index kept'. The clause text (D4 tighten, blocked report) is stale against ADR-0131 D1
    • cli.dev-automigrate-policy a4: a BLOCKED unique create_index is still pinned elsewhere (packages/drivers/driver-sql/src/sql-driver-25031-blocked-unique-apply-limit.test.ts), not in the ref — if a4 is rewritten around it, add it
    • cli.dev-automigrate-policy a2: the production case asserts the warning prefix only; the 'Run os migrate deliberately' remedy is unasserted (the ref says so)
    • cli.meta-package-flags-and-explain a1: verify names 'server log' as evidence; the pin observes the wire (?package= on the PUT) and the door's parsed request instead — equivalent, but no server log is read
    • cli.migrate-meta-write-stored-and-all a4: canonicalize-stored-flow.test.ts and refused-shapes.test.ts pin the TODO sink (canonicalizeStoredFlow todos / refused-shape onTodo); no file in the ref runs os migrate meta --stored and reads the printed TODO lines
    • cli.organization-ownership-ceremony a1: occupancy pin's plan run mocks boot; no pin compares a DB checksum before/after a bare plan run
    • cli.organization-ownership-ceremony a2: organization-ownership-apply.generation-1.test.ts › runs every step in order, certifies, and records this release's shape generation in the checkpoint calls apply() over a fake ledger — the CLI's --apply --plan-file --backup-taken exit 0 is not asserted
    • cli.organization-ownership-ceremony a3: organization-ownership-boot-guard.test.ts asserts assertOrganizationOwnershipMigrated's error code/message directly; the served-boot error line and the migrated boot's ready line need a live boot
    • cli.organization-ownership-ceremony a4: 'checksums before/after' approximated by columnsOf() still containing organization_id and applied: []
    • cli.scaffold-first-run ref .github/workflows/scaffold-e2e.yml exists but is a CI workflow, not a vitest/Playwright file: a Tier 1 pin run collects nothing for this item (scores via the workflow's own CI run only)

    i18n

    • i18n.flow-copy-translation-and-host-override a2: no file in the ref touches os i18n extract; the extraction of refusal, screen, option and toast keys is pinned in packages/cli/test/i18n-flow-{refusal,screen,toast-option}-coverage.test.ts (extractTranslations, the function the command runs — not the command's file write), none of them in the ref
    • i18n.flow-copy-translation-and-host-override a3: translation.test.ts › 'refuses a single-brace {token} in a translated title, through the one text-slot judge (i18n(flows): a translated screen title is not judged by the text-slot judge, so a single-brace {name} in a translated heading renders literally while the description and refusal message beside it are refused #22627)' pins the schema rule and its {{ name }} remedy; nothing in the ref runs os validate for the exit code
    • i18n.surface-matrix a5: ref is accurate that the two objectui component pins cover only the confirm half (plus successMessage→toast props); they render under a mocked ActionRunner/I18nProvider with no server round-trip, so the network-oracle clause stays the run's
    • i18n.surface-matrix a6/a7/a9: the i18n routes have HTTP coverage elsewhere (e.g. showcase-anonymous-deny-surfaces' I18N_FACES member 200 control) but nothing asserts the locale set, group vocabulary or zz-ZZ empty-map shape named here

    identity-auth

    • identity-auth.admin-lifecycle-operations a4: verify says the 'target's next PROTECTED request still 2xx' is pinned by admin-platform-admin-standing.dogfood.test.ts; that file asserts the 403 + code only, no protected request as the target
    • identity-auth.admin-lifecycle-operations a0/n1: C0 case asserts sys_user.banned/ban_reason and unban; no sign-in by the banned user is attempted, so the enforcement half is unpinned
    • identity-auth.admin-lifecycle-operations ref-parse: packages/plugins/plugin-auth/src/remove-user-atomicity.test.ts is named in the ref only as a contrast ('deliberately does NOT copy'), not as a pin; the parent's pins list includes it — it scores no clause
    • identity-auth.api-key-expiry-lifecycle a2: the dogfood case asserts 400 API_KEY_EXPIRY_TOO_LONG but not that the key count is unchanged; 'nothing is stored' is asserted only in packages/runtime/src/api-key-lifecycle.pin.test.ts over a fake objectql
    • identity-auth.api-key-expiry-lifecycle a3: the three 403 codes are pinned only at unit layer (rest-api-key-lifecycle.pin.test.ts over HTTP_STUB + fake ql; runtime dispatcher over a fake kernel); the dogfood file drives no revoked or expired key
    • identity-auth.auth-gate-held-session-raw-host-families a2: held-session-vendor-admin-doors arms PASSWORD_RESET_REQUIRED by a system write of must_change_password + auth.noteMustChangePasswordIssued() (simulating the forced-reset route), not by driving the admin's forced-reset door
    • identity-auth.auth-gate-held-session-raw-host-families a3: rest-api-key-account-posture.pin drives RestServer.enforceAuth with a hand-built req/res and a fake auth; http-dispatcher.api-key-account-posture drives HttpDispatcher with fakes — neither answers an HTTP x-api-key call
    • identity-auth.auth-gate-held-session-raw-host-families a1: 'raw-host families' are proven at mixed layers: storage, settings, share-link and cloud-connection pins call registered handlers with fake IHttpRequest/IHttpResponse
    • identity-auth.auth-method-matrix a3: verify names packages/plugins/plugin-auth/src/phone-otp-no-sms-service-refusal.test.ts as the pin — it exists but is not in automated.ref, and it drives AuthManager (unit), not the NODE_ENV=production boot's send-otp door.
    • identity-auth.auth-method-matrix a6: verify names packages/qa/dogfood/test/two-factor-lockout.dogfood.test.ts as the end-to-end pin for the 2FA gate — exists, not in automated.ref.
    • identity-auth.auth-method-matrix a9: verify names packages/plugins/plugin-auth/src/change-email-delete-user-wiring.test.ts ('auth-method-matrix: change-email and delete-user are booked as mounted in auth-route-ledger.ts but plugin-auth never configures better-auth's user.changeEmail / user.deleteUser — no switch to enable them #7735 — POST /delete-user stays unwired') — exists, not in automated.ref; AuthManager unit layer.
    • identity-auth.auth-method-matrix ref: a single OIDC pin (a7) for a 10-clause, 5-negative mixed item; kind 'e2e' over-implies coverage.
    • identity-auth.cookie-session-renewal-in-process a1: the runtime pin's DOORS are GET /data/:object, /auth/me/permissions and /i18n/locales — the clause's 'meta reads' leg has no door in it
    • identity-auth.implicit-account-linking-ownership a0-a3: the ref's 'end to end' cases drive the real better-auth handler (AuthManager.handleRequest) but over a hand-rolled in-memory data engine and with sys_account read off that fake, not an admin read through a booted server — they assert each clause's facts at the unit layer only
    • identity-auth.import-invitation-and-sso-domain-answers a1: the ref's admin-import-users-invite-link.test.ts asserts the auth.account_invitation template id on the import but never the 'self-requested reset still uses password_reset' half; packages/plugins/plugin-auth/src/admin-import-users-account-invitation.test.ts (cases ① and ②) asserts both and is not in the ref
    • identity-auth.import-invitation-and-sso-domain-answers a3: sso-domain-verification-unknown-provider.pin.test.ts mounts the real AuthPlugin on Hono but over createMemoryEngine (a hand-rolled engine fake), so it scores the doors at unit layer only
    • identity-auth.invitation-scope-gates a0: ref states its pending half is scored live — consistent
    • identity-auth.invitation-scope-gates n1: server-side denial of the forged request is pinned; the UI-hidden half is a5/a4 browser work

    integration-system

    • integration-system.connector-auth-kind-application a2: verify says 'pinned by connector-materialization.test.ts (fails boot loudly when credentialRef does not resolve)'; that case asserts /credentialRef 'MISSING' did not resolve/ only — not the connector, provider or the two remedies the clause requires, and it is an in-process kernel boot, not a boot log
    • integration-system.connector-auth-kind-application a3/n1: packages/spec/src/integration/connector-provider.test.ts ('rejects inline authentication secrets on a catalog descriptor / on a provider-bound instance (§3)') pins the [security] sys_metadata.metadata is a general cleartext sink: any authored artefact whose schema permits an inline credential lands it there (datasource config.password, connector authentication) #7990 half at schema level but is not in the ref; no pin found for the oauth2 discriminator refusal (spec/src/integration/connector.test.ts still parses oauth2 under AuthConfigSchema)
    • integration-system.connector-declarative-boot n1 says 'any of the four malformed-entry builds' while a3 lists three rejections — the counts disagree
    • integration-system.connector-declarative-boot ref's self-description matches the pin on this tree (two cases; halves only for a0–a2)
    • integration-system.connector-descriptor-audit a2: plugin.ts calls auditDeclaredConnectors on both the boot and the reload path; connector-descriptor-audit.test.ts drives only kernel:ready, so the reload half has no pin
    • integration-system.connector-descriptor-audit a1(c)/n1: no case in the ref feeds a provider-bound connector instance to findInertDeclaredConnectors or the kernel audit
    • integration-system.connector-stdio-default-deny ref is accurate: it scopes mcp-provider.test.ts to negative[0] at the provider unit and says a0-a2 are evidence-only, a3/n1 need the run
    • integration-system.datasource-admin-lifecycle a8: the ledger half names packages/services/service-datasource/src/datasource-route-ledger.conformance.test.ts as citable evidence, but it is not in automated.ref; the 404 half is pinned over a stubbed service only
    • integration-system.email-template-render a5: packages/qa/dogfood/test/email-template-overlay-survives-boot.dogfood.test.ts ('after a cold boot the metadata door and the rendered mail both carry the admin's wording') pins the redeploy-survival half and is not in the ref.
    • integration-system.email-template-render a3: packages/qa/dogfood/test/email-template-two-locales-survive-boot.dogfood.test.ts ('control: a locale nobody saved keeps the package ladder') touches the locale ladder and is not in the ref.
    • integration-system.email-template-render ref: one e2e pin for an 8-clause item; kind 'e2e' over-implies coverage (a1, a2, a4, a6, a7 unpinned).
    • integration-system.external-schema-drift-gate a4/a6: oracle is 'test' and the pins assert them, but each verify/evidence also asks for a live 'armed background drift check' log line — scored from the pin; the live line remains a boot leg
    • integration-system.external-schema-drift-gate n3: no pin asserts renderDiffMessage's text (datasource/object/per-column diff) — the fail-default case asserts rejects.toBeInstanceOf only
    • integration-system.external-schema-drift-gate n5: 'is a no-op when the external-datasource service is absent' asserts resolves undefined, not the absence of warn/error logs
    • integration-system.external-schema-introspection a3: remote-tables-twin.equivalence.test.ts only twins listRemoteTables; the object-draft ≡ external/tables/:remote/draft twin and the shared 400 EXTERNAL_DATASOURCE_ERROR refusal across spellings are not pinned (admin-routes covers the admin spelling's 400 only)
    • integration-system.external-schema-introspection a4: twin admission cases compare status+code across spellings but never assert the 403 message names manage_platform_settings
    • integration-system.external-schema-introspection n0/n2: admin-routes.test.ts drives a real HonoHttpServer with vi.fn services (route-level HTTP, not a booted stack)
    • integration-system.inbound-mailbox-association a2: scored at in-process — the clause's 'api' oracle is the stored rows, which the pin reads through the real engine after a real ingest; no HTTP read was made
    • integration-system.inbound-mailbox-association a1: inline-forward.test.ts pins the parser's participant extraction, not that an inline-forwarded message is ASSOCIATED with the original participants' records
    • integration-system.notification-org-and-redeliver-eligibility a1: notification-organization-follows-event.integration.test.ts proves organization_id on every row at the engine (ObjectQL+SqlDriver), but asserts nothing about the '[notify] no organization in scope' log line
    • integration-system.notification-org-and-redeliver-eligibility a2: the foreign mark-read is pinned only at unit level (messaging-service.test.ts › [security(service-messaging): a mark-read receipt takes the organization of whichever notification the caller names, with no check that the caller was its recipient #22026] markRead writes a read receipt only for a notification delivered to that user › ⛔ the non-recipient half…)
    • integration-system.notification-org-and-redeliver-eligibility a3: the redeliver pin drives the door through Request→Response (member handler + Hono canonical app) on a LiteKernel, not a full served stack

    platform-core

    • platform-core.activation-ledger-registration-home a4: packages/spec/src/system/constants/platform-object-names.test.ts ('registers exactly the objects each package declares') ties PLATFORM_OBJECTS_BY_PACKAGE to the declaring sources and would pin the one-owner membership, but is not in the ref
    • platform-core.activation-ledger-registration-home n2: platform-objects/src/plugin.test.ts asserts exactly one registering manifest; no pin drives a second registrant to observe the 'already owned by package' boot failure
    • platform-core.activation-ledger-row-contract n5/a4 (door half): packages/qa/dogfood/test/catalog-activation-door.dogfood.test.ts › 'a type with no switch is refused 400 by the door itself' and packages/runtime/src/domains/catalog-activation-door.test.ts (audience anchors 400, nothing written) exist and are not in this item's ref
    • platform-core.activation-ledger-row-contract a2: the dogfood key-set reading proves the physical table lacks organization_id but not the step-7 refused INSERT / control INSERT pair the verify names
    • platform-core.activation-ledger-row-contract a3: pins assert update-not-delete for the action (HTTP) and flow (store) kinds only; position/permission/sharing_rule re-enable rows are not covered here
    • platform-core.lifecycle-retention-sweep ref is accurate on scope (a2 pinned half, a3, n0-n1; a0/a1/a4 live; a5 a source read)
    • platform-core.lifecycle-retention-sweep a3: live sweep-line corroboration of the reaped count stays the run's
    • platform-core.lifecycle-retention-sweep n0: the unit proves the onlyWhen predicate reaches the reap filter/candidate read on a recording fake engine, not that real paused/running rows survive
    • platform-core.metadata-authoring-roundtrip ref is accurate: package-first-authoring.dogfood.test.ts and studio-object-designer.spec.ts are declared as scoring no clause; studio-record-page.spec.ts scores a2 only
    • platform-core.metadata-registry-serving a0: the pin never checks the registered kinds against DEFAULT_METADATA_TYPE_REGISTRY (step 2's presence table); it asserts only dashboard/action/report entries
    • platform-core.nav-surfaces-render a0/n0/n1/n3 score only if the parent can run pnpm -C examples/app-showcase test:smoke (Playwright + a live showcase with a console); otherwise not-run (browser)
    • platform-core.nav-surfaces-render a1: nothing in the ref computes the served-nav vs SURFACES diff — the 'coverage is current' clause has no automation
    • platform-core.serve-composition-v18 run note: serve-organization-record-page.e2e.test.ts is a *.e2e.test.ts file — it collects only under OS_TEST_TIERS=nightly; a run without it reports 0 tests for that file (a2 then not scored)
    • platform-core.v18-boot-refusals a3: scored from the pin by the clause's own fallback ('with no such boot run, this clause rests on authz-identity-objects-boot-refusal.test.ts — record which'); the run record must say the live steps[1] boot was not run.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    From #25815 (release-18.2.0-tier1, 156 items) — §2 checklist-accuracy findings, part 2/2 (areas: records-forms, search, studio-authoring). Each line is a ledger edit for the lane owning docs/qa/platform-checklist/**: revise the item, bump revision, append history citing #25815. Clause labels: aK = acceptance[K], nK = negative[K].

    records-forms

    • records-forms.action-param-widgets ref-parse: the parent's pins include objectui e2e/live/action-modal.spec.ts, which the ref names only as DROPPED ('cited here until revision 3 … so it was dropped') — a parser false positive; it scores nothing here.
    • records-forms.adhoc-filter-sort-builder a4: the pin reproduces the filter on page.reload() and checks the URL param + record-count-bar '2' only — it never captures the data request the clause's network oracle names, nor compares row identity.
    • records-forms.adhoc-filter-sort-builder ref-parse: the parent's pins include objectui e2e/live/saved-view-filter.spec.ts, which the ref names only as dropped ('cited here until revision 5 … so it was dropped') — parser false positive.
    • records-forms.bulk-select-all-matching a1/a4/n0: none of the three ref files exercises resolveBulkRows' paged fan-out or the HARD_CAP; the cross-page id resolution is unpinned even at component level
    • records-forms.bulk-select-all-matching a3/n2: bulkActionRefresh.test.tsx '[main 红:wildcard fall-through 守卫声明了一个已被删除的挂载(#4116 与 #4112 的竞态) #4140] bulk bar Clear resets both selection sources' asserts the behaviour in jsdom; the clause's dom/screenshot oracle needs the browser
    • records-forms.cascading-multilevel-and-clear a1: the spec POSTs {country:'us', province:'zj'} where the verify names {country:'cn', province:'ca'}, and asserts code invalid_option only — the verify's message key option_unavailable is not checked; the in-set answer is 201, not the verify's 200.
    • records-forms.cascading-multilevel-and-clear ref: rule-validator.option-visibility.test.ts is in the ref but by its own words scores no clause (validator layer) — the parent need not run it for this item.
    • records-forms.cascading-options a1/n0: the pin is an objectui Playwright live spec (needs a live stack + console at the objectui pin); it scores only if the parent runs it against a booted showcase.
    • records-forms.comment-reactions-and-edit-stamps a1/a2: sys-comment-reactions-door.integration.test.ts is named a 'door' test but boots ObjectKernel + ObjectQLPlugin over sqlite-wasm and maps errors with mapDataError — no HTTP adapter, so it cannot score the api clauses.
    • records-forms.concurrent-edit-conflict a3: the ref scores acceptance[3] from occSave.test.tsx › 'ObjectForm edit — OCC guarded save › 409 → "overwrite" retries re-keyed to the server currentVersion and completes the save', but that case runs over a mocked data source, so it pins the client re-key only — not the clause's api oracle (the retry answered 200 and a re-read shows one winner)
    • records-forms.concurrent-edit-conflict a1: occSave.test.tsx pins the modal Keep editing / Overwrite choice in jsdom; the dom oracle wants a rendered (screenshot-confirmed) dialog, and the inline ConcurrentUpdateDialog half has no pin
    • records-forms.concurrent-edit-conflict pins: the parent's pin list includes objectui e2e/live/inline-edit-polish-2572.spec.ts, which the ref names only to say it was DROPPED at revision 4 (no If-Match, no conflict, stale at the pin) — a ref-parse over-inclusion; it scores no clause
    • records-forms.conditional-rules-grid ref-parse over-inclusion: the parent's pins list carries objectui e2e/live/grid-file-upload.spec.ts, which the ref says was DROPPED at revision 8 and scores no clause — do not run it for this item
    • records-forms.conditional-rules-grid all objectui pins are Playwright e2e/live specs needing a live stack; they can only score in a browser run, and even green they score halves only
    • records-forms.conditional-rules-header a2: the ref claims field-conditional-rules.spec.ts pins 'acceptance[2]'s client lock … tax_rate's input giving way to the read-only field group at paid', but the spec asserts the OPPOSITE on the New dialog: at paid taxRate toBeEnabled() and the read-only group toHaveCount(0) (objectui#13436 — INSERT is exempt from readonlyWhen); no pin drives an edit form of a paid invoice
    • records-forms.conditional-rules-header pins: the parent's pin list includes objectui e2e/live/list-row-action-cel.spec.ts, which the ref names only to say it was DROPPED at revision 3 (it gates the task list's Mark Done, not the invoice's Edit/Delete) — a ref-parse over-inclusion; it scores no clause
    • records-forms.conditional-rules-header a0/a3: both pins are browser tests that read the DOM directly via Playwright locators (no screenshot step), which satisfies render-first only because Playwright waits for visibility
    • records-forms.delete-behavior-matrix a0–a4/n0–n3: every pin is engine-level (ObjectQL over a test driver); precedent QA run · tier1:24681-touched (63/82) · 307ce4c4 · 2026-10-20 · 10 PASS / 53 PARTIAL / 0 FAIL / 0 BLOCKED / 19 NOT-RUN #24840 scored a0–a4, n0–n3 PASS from them before the layer rule — at the api oracle they score not-run until a REST pin exists.
    • records-forms.delete-behavior-matrix a5: packages/spec/src/data/field.test.ts ('deleteBehavior: set_null on master_detail is a parse-time rejection') pins the FieldSchema accepts deleteBehavior: 'set_null' on a master_detail, and the engine silently resolves it to cascade #9689 parse seam at schema level and is not in the ref; the verify's PUT refusal has no pin.
    • records-forms.encrypted-field-behavior a0: the dogfood pin scores the masked-GET half only; the 'secret:<handle>' column / sys_secret ciphertext leg is asserted only in packages/objectql/src/secret-fields.test.ts at the engine layer (the verify makes that leg conditional on DB inspection)
    • records-forms.field-history-tracking a2: objectui e2e/live/record-history-display.spec.ts (in the ref, claiming no clause) does open showcase_account's History tab, so it holds a2's flag-true half in a browser; the task-detail absence half has no pin
    • records-forms.field-type-constraints a5/a6: ref says engine-lookup-referential-integrity / engine-autonumber-runtime-owned pin these; both drive ObjectQL in-process, not the /data door the api oracle names
    • records-forms.field-type-constraints ref names field-zoo.matrix.ts — a data module, not a test file (correctly absent from pins)
    • records-forms.field-type-constraints a0-a4: the ref's 'round-trip & masking' pin asserts only accepted vectors; none of the refusal codes (max_length, min_value, max_value, invalid_number, invalid_option, invalid_type) is pinned at any layer by the ref
    • records-forms.field-type-matrix ref names field-zoo.matrix.ts (a vectors module, not a test file) — a ref parser must treat it as a fixture, not a pin; field-zoo-value-shape.test.ts (in pins) asserts no clause directly (write vectors parse under valueSchemaFor)
    • records-forms.field-type-matrix a5/n1: ref implies relational coverage incl. data: a lookup accepts an id that does not exist in the referenced object — including the RBAC permission-set link tables #4441, but field-zoo-roundtrip only seeds real ids; no dangling-id refusal is asserted
    • records-forms.field-type-matrix a4: f_autonumber is a 'present' check (non-null) — 'server-assigned' is inferred from it not being written
    • records-forms.field-unique-enforcement a4: clause text says bare unique 'NULL-organization rows fold to ONE bucket' (ADR-0120 D3); both pins now assert the opposite — 'a row with NO organization is exempt — ... the D3 bucket retired' (memory) and 'on a pre-18 nullable column, rows with no organization are NOT constrained (ADR-0131 D1)' (SQL). The clause needs re-authoring; it cannot score pass from these pins as written
    • records-forms.field-unique-enforcement a0-a3/n0-n2: ref correctly says no pin drives a REST door
    • records-forms.form-dirty-guard a0/n0: discardGuard.test.tsx covers the X close + Cancel + pristine paths for ModalForm/DrawerForm, but no Escape or backdrop-click case
    • records-forms.form-dirty-guard a2: the file holds 11 it() cases at the pin; the '14/14' cited from QA run QA run · surface:browser (65/65) · 36b2889c · 2026-10-12 · 50 PASS / 2 PARTIAL / 12 FAIL / 1 BLOCKED / 0 NOT-RUN #23163 will not match this tree's count
    • records-forms.gantt-interactions a1/a2: ref maps these clauses to component/unit cases (cases exist at pin b41ed7f), but the clauses' oracle is api (row-set diffs / server reads) — the pins stop at the component's update callback and cannot score them
    • records-forms.gantt-interactions ref names objectui commit 0abd4f9 for the per-clause mapping; the run pin is b41ed7f (the named cases are present there)
    • records-forms.import-job-undo-cancel a3: the ref says each spec covers acceptance[3] ('the job list read on undoable and revertedAt'); the specs read the list once before undo (filter undoable && !revertedAt) and confirm the revert only through the UI testid import-history-reverted-<id>, so 'revertedAt once a job is reverted' is never read off GET /import/jobs
    • records-forms.import-job-undo-cancel a1/n0: both specs count with an unfiltered GET /api/v1/data/<object> and read records.length — a page-bounded list length, not the clause's marker-filter count — and they self-skip (IMPORT_CONSOLE_LIVE / harness reachability) and default to crm_app/crm_lead, so a skip or a non-showcase target scores nothing
    • records-forms.import-wizard-encoding-and-hints pins are objectui files (repo objectui → /home/claude/ou-pin); they score a0–a2 only when the objectui pin worktree's vitest runs them
    • records-forms.list-view-capabilities a1: ref says saved-view-filter.spec.ts covers acceptance[1]; it asserts only that no showcase_task data response was >=400 and the count bar starts '2 ' — the AST filter param and the count-vs-response-total match are not captured
    • records-forms.list-view-capabilities showcase-search.dogfood.test.ts is in the ref but, as the ref itself says, scores no clause of this item
    • records-forms.master-detail-atomic-save pins list includes e2e/live/summary-rollup.spec.ts, but the ref states it was dropped at revision 5 and asserts no clause — a ref-parse over-capture (it names the file in prose)
    • records-forms.master-detail-atomic-save a0: master-detail.spec.ts pins carrier-neutrally on showcase_project_workspace with one child; the two-line invoice payload and 'not N sequential writes' (batch count) remain the run's
    • records-forms.object-hook-lifecycle a0: the pin drives POST /forms/contact-us/submit (anonymous, status 'closed' stripped), not POST /api/v1/data/showcase_inquiry omitting source/status as the verify names — the hook's 'web' stamp is engine-side so it scores, but the /data door itself is undriven
    • records-forms.object-hook-lifecycle a6/n0: hook-error-format.dogfood.test.ts proves a throwing beforeDelete (hef_ref_guard, default onError) leaves the row; no pin drives a throwing beforeInsert POST
    • records-forms.object-hook-lifecycle ref says the four objectql units ran '83 tests'; this tree has 79 it() cases across them (25+12+22+20) — count drift, not a missing file
    • records-forms.predicate-relationship-traversal a3 is scored from an engine pin by the item's own knownGaps (no restricted persona on stock showcase) — a deliberate layer exception, not a rule-6 pass for an HTTP oracle
    • records-forms.record-clone-contract ref says packages/rest/src/search-clone-route-schema-conformance.test.ts 'drives the live mount' — it calls the registered handler on RestServer(mockServer) with a mocked protocol whose cloneData returns a constant body; no HTTP adapter, no engine
    • records-forms.record-clone-contract a3: the verify names 'the Check whether sys_session.token — a live session credential — serializes over the data API (ADR-0100 channel 3 has no read protection) #7823 strip suite' but the ref names no such file; packages/metadata-protocol/src/protocol.write-response-internal-fields.tripwire.test.ts (enumerates cloneData) exists and is not in the ref
    • records-forms.record-clone-contract ref spells files as 'packages/metadata-protocol — search-clone-schema-conformance.test.ts' (package + em dash + basename, no src/ path) — a strict path parser would miss both; the parent resolved them
    • records-forms.record-discussion-mentions a5: comments-permission-matrix '(f) enable.feeds:false still answers FEEDS_DISABLED' asserts 403 + code on its cmt_nofeeds fixture; it does not read the thread's zero rows after the refusal
    • records-forms.record-discussion-mentions a6/n3: capability-gate-update-verb.test.ts is engine-level (ObjectQL + installAuditWriters), as the clause itself says
    • records-forms.record-discussion-mentions a8: the clause names objectui recordActivityFeed.test.ts as a fallback oracle, but it is not in automated.ref (objectui), so a ref-driven run never executes it
    • records-forms.record-discussion-mentions a9: mention-recipient-gate.integration.test.ts is engine-level; the ref itself says partial at most
    • records-forms.record-edit-undo UndoManager.test.ts tests only the in-memory undo/redo stack; it scores no clause of this item (none of the clauses is a stack-semantics clause) — the ref should say so explicitly
    • records-forms.view-type-gallery a5: the pin is a Playwright spec (pnpm -C examples/app-showcase test:smoke) that needs a built console and a live stack — it scores only if the parent actually runs it; a vitest-only pin run leaves a5 not-run.
    • records-forms.write-answer-advisories-rollback-and-tree-delete a1: advisory-write-answer.test.ts calls ObjectStackProtocolImplementation createData/updateData in-process — the REST PATCH body is not observed
    • records-forms.write-answer-advisories-rollback-and-tree-delete a2/n0: engine-after-hook-abort-unit.test.ts drives ObjectQL directly; no HTTP pin for the aborting afterInsert
    • records-forms.write-answer-advisories-rollback-and-tree-delete a3: scored on the referenceless tree fixture (rtl_*), not a showcase object — acceptable since the clause names no carrier

    search

    • search.cross-field-object-search a1: the pin proves the name-hit control only as 'some returned name contains retail' (names.some(...includes('retail'))), not by naming Acme Retail; it satisfies the verify's 'a name-containing-retail account'
    • search.field-scoped-narrowing a1/n0/n1: the bare ref claims the item; the pin has no $searchFields refusal case. packages/rest/src/rest-server-closed-query-params.test.ts and list-view-grouping-query-door.test.ts mention INVALID_FIELD + searchFields (route-handler level) and are not in the ref
    • search.field-scoped-narrowing a3: pin drives only POST /data/showcase_account/query with bare search/searchFields; the GET $search spelling is unpinned
    • search.global-search-skips-unreadable a0–a2: the dogfood pin runs on its own skipsearch_open / skipsearch_walled fixtures, not the showcase objects (W, showcase_invoice) the steps name; a0's unscoped case does not assert totalObjects (the mixed case does)

    studio-authoring

    • studio-authoring.expression-editors a0-a6: every pin in the ref is a jsdom component/unit test; it holds evidence for the editor's lint, inference, completion and test-run logic but scores none of the screenshot/dom/api clauses
    • studio-authoring.meta-save-preconditions-and-draft-rows a1-a3: every pin stops above HTTP (RestServer with createMockServer, HttpDispatcher.dispatch called directly, objectql repository/protocol units) — the api-oracle clauses stay the run's live leg
    • studio-authoring.metadata-diagnostics-sweep a3/n0: the ref says the pin covers the outage clause ONLY, but its '[[finding] getMetaDiagnostics scannedTypes still overstates the swept set when a type is benignly skipped — no payload field lets a caller detect partial coverage #8924] a caller error the producer classified is refused loudly' describe asserts the ?type= misspelling refusal at the protocol layer — unclaimed protocol-layer evidence; the api-oracle clauses still need the REST door.
    • studio-authoring.object-designer-roundtrip a3: F4 seeds one real option, not the three the clause judges with, and never publishes — the ref says so; the banner half is pinned under a different fixture than the clause states.
    • studio-authoring.org-override-registry-gate all clauses are api-oracle but the only pin (overlay-precedence.test.ts) is a unit test of the overlay whitelist (describe 'overlay whitelist enforcement (shared-DB invariant)'), stopping above the HTTP door; it corroborates a0/a2/a3/n0 and scores none; no pin touches a4's DELETE reset
    • studio-authoring.permission-matrix-editor-ux fieldBulk.test.tsx asserts filter narrowing, the '2 / 8' counter and bulk scope as jsdom checkbox states — evidence for a0/a1 at the component layer, but never the SAVED fields map that a2/a3/n0 make the authority
    • studio-authoring.permission-matrix-editor-ux a5: readonly.test.tsx covers the package and type gates and a capability gate; the artifact gate ('provided by a code package') sits in PermissionMatrixEditor.artifactTier.test.tsx, not in the ref
    • studio-authoring.record-page-roundtrip ref cites console pin cf153eb for the reading; the run's objectui pin is b41ed7f (both specs present and asserting as described)
    • studio-authoring.save-door-runs-authoring-rules a1-a3/n0: none of the eight pins boots HTTP (metadata-protocol saveMetaItem, objectql, spec, lint units and a RestServer unit) — the api clauses stay the run's

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    From #25815 (release-18.2.0-tier1) — §3 fixture gaps, partial coverage and not-run handover.

    • Result: 156 items, 6 PASS / 123 PARTIAL / 0 FAIL / 2 BLOCKED / 25 NOT-RUN; 1178 clauses, 315 pass · 0 fail. No pin red (framework 374 files, 10,009 passed; objectui 29 unit files, 378 passed; objectui e2e/live 31/31; showcase Playwright 53/53; verify --rls 0 FAILED · 0 HOLES). Nothing for §5.
    • Partial coverage, parked here: one Parked-on: #25807 line per PARTIAL / NOT-RUN / BLOCKED item in QA run · release-18.2.0-tier1 (131/156) · 6679644a · 2026-10-25 · 6 PASS / 123 PARTIAL / 0 FAIL / 2 BLOCKED / 25 NOT-RUN #25815's close-out comment (150 lines; clause-level reasons in its three detail comments). Of the 861 unscored clauses, 254 are layer-limited (a pin asserts them below the oracle's layer — RUNNER rule 6), 132 half-asserted, 50 procedural, the rest unpinned.
    • Not-run handover (25) — each needs a live run, or a pin at the oracle's layer: access-security.me-permissions-aggregation-parity, access-security.record-access-explain, access-security.share-link-landing-page, ai.mcp-oauth-private-host-transport, ai.mcp-validate-expression, api-backend.bulk-write-contract, api-backend.query-contract-matrix, approvals.decision-only-via-service, automation.setup-packaged-automation-board, cli.scaffold-first-run, i18n.surface-matrix, integration-system.connector-descriptor-audit, platform-core.url-overlay-contract, records-forms.bulk-select-all-matching, records-forms.concurrent-edit-conflict, records-forms.conditional-rules-grid, records-forms.delete-behavior-matrix, records-forms.field-type-constraints, records-forms.gantt-interactions, records-forms.import-job-undo-cancel, records-forms.list-view-capabilities, records-forms.record-clone-contract, records-forms.record-discussion-mentions, studio-authoring.org-override-registry-gate, studio-authoring.permission-matrix-editor-ux.
    • New fixture gap: records-forms.import-job-undo-cancel — e2e/import-console/import-console-undo.spec.ts needs IMPORT_CONSOLE_LIVE=1 and an app-crm boot (crm_app/crm_lead); its twin e2e/import-harness/import-undo.spec.ts needs the plugin-grid demo harness on :5200 over app-crm on :3002. Neither runs on the stock showcase.
    • cli.scaffold-first-run: its only evidence is the nightly scaffold-e2e.yml, last green at 4cc17db3c0 (run 40158961882), not this subject.
    • BLOCKED, unchanged: access-security.no-active-org-session-semantics (QA run · priority:P0 · e4e5c6e3 · 2026-08-17 · 7 PASS / 7 PARTIAL / 2 FAIL / 2 BLOCKED #9334), records-forms.record-edit-undo (no packaged undoable update action).

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    T3 manual set recorded: #25817 (release-18.2.0-manual-set, 29/29 at 6679644a, pin b41ed7f68956: 25 PASS / 4 PARTIAL / 0 FAIL).

    Parked here (fixture gaps):

    • approvals.decision-action-matrix A9: there is no org-less request on stock. Both remaining candidates are refuted: a schedule-triggered approval, and an api-hook on an object with no organization column.
    • automation.trigger-status-contract A4: the 503 STORE_UNAVAILABLE arm.
    • automation.packaged-flow-subflow-disable-refusal N1: a second packaged caller needs a package-loader-installed package. A ?package=-authored flow counts as deployment-authored.
    • records-forms.action-location-matrix knownGaps[2]: A3 fail-closed and A4 (a).

    Checklist-accuracy findings: All of them are listed in #25817 under "Checklist-accuracy findings and fixture gaps". They include one RUNNER.md environment-fact correction: on os dev at 6679644a, the connector meta read shows the compiled baseUrl (3000) while live dispatch follows OS_PORT, so the prescribed Check misreports the fixture.

    Coverage gap: no ledger item asserts #25626's walled Create User join or 400 NO_ACTIVE_ORGANIZATION. This is pending confirmation by the addendum record on 17f8217b.

    Extracted product defects: #25818, #25819, #25820, #25821, #25822.

    Superseded: #25479. Its 7 un-rerun verdicts are carried forward on #25817.

  6. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    T3 addendum: #25823 (identity-auth.admin-lifecycle-operations 1/1 PASS at 17f8217b, after #25626). Parked here:

    • Coverage gap. No item asserts feat(plugin-auth): multi-org Create User joins the administrator's current organization #25626's walled Create User join. The missing clauses are:

      • joins the caller's active organization as member, and a body organizationId chooses nothing;
      • 400 NO_ACTIVE_ORGANIZATION with no row;
      • invite-only still joins.

      The candidate pin is packages/qa/dogfood/test/create-user-organization-join.dogfood.test.ts.

    • Stale after feat(plugin-auth): multi-org Create User joins the administrator's current organization #25626:

      • access-security.no-active-org-session-semantics rev 8, its member-less operator create-user producer;
      • identity-auth.workspace-org-switch rev 5, personas[2];
      • RUNNER.md "Walled personas come from the admin door".

      Each recipe now needs the operator to create and set-active an organization first.

    • identity-auth.admin-lifecycle-operations's automated.ref overclaims. The A0 sign-ins, the A4 live-session half, the A6 stop half and the A9 state read-back beyond two routes are unpinned.

  7. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: state — pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-25T16:00Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Checklist-accuracy findings carded — maintainer-directed (project thread, 2026-10-25 22:55Z, verbatim: 「写issue,不派发」). ⛔ Not dispatched; ⛔ not a claim.

    The accuracy findings parked on this anchor from #25812, #25815, #25817 and #25823 are now one card per ledger file, each listing its lines verbatim with the record they come from. They carry documentation · priority:p2 · domain:devx · area:devpath and no target:v18 (not release blockers). This anchor's §2 and the part 1/2 + 2/2 comments stay as the evidence; close-out of each line happens on its card.

    card ledger file lines
    #25835 access-security 65
    #25836 ai 14
    #25837 api-backend 28
    #25838 approvals 19
    #25839 attachments-storage 18
    #25840 automation 24
    #25841 cli 12
    #25842 i18n 9
    #25843 identity-auth 23
    #25844 integration-system 26
    #25845 platform-core 19
    #25846 records-forms 60
    #25847 search 6
    #25848 studio-authoring 9
    #25849 ux-conventions 5
    #25850 RUNNER.md 3

    Not carded here (still parked on this anchor): the fixture gaps and PARTIAL coverage in §3, the 25 not-run items, and the #25626 coverage gap's fixture side (its missing clauses are on the identity-auth card).


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: the 16 ledger-edit cards are pm:on-hold · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-25T23:56Z

    ⛔ Not a claim, ⛔ not a dispatch.

    Restart-when: the maintainer says to dispatch the 18.2.0 ledger-edit cards, on this card, on any of them, or in the project thread.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Released: the 16 ledger-edit cards → pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T10:41Z

    ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    18.2.0 sweep — wave 2 on the post-merge head · session_012YjcDon6BvR9MN93ZsFq3U · 2026-10-27T04:05Z

    Filing gate: ③ a maintainer-directed task — the maintainer, in this session on 2026-10-27, verbatim: 「准备发版本,评估运行哪些 checklist,可以用云卡运行」, then, on the plan below: 「同意」, and on writing: 「你应该使用 pm-dispatch 技能写入」.

    Why a second wave. Wave 1 (#25812, #25815, #25817) judged 6679644a against the objectui pin b41ed7f68956. Since then main moved 287+ commits:

    A delta-only rerun saves little, so this is a release-candidate rerun (SKILL §5 trigger 1). node scripts/check-platform-checklist.mjs is green on the subject.

    Subject: framework main @ 756220c4a7adcbb1228864607cb4b6a1ca486dc0; Console built in-repo from that same commit (pnpm console:build). Every card pins this sha; none follows the Version PR as it regenerates.

    card selector / set items surface carries
    W2-C1 priority:P0 23 browser-heavy supersedes #25812
    W2-C2a Tier 1 (automated.ref items), areas access-security · ai · api-backend · approvals · attachments-storage · automation · cli ~80 per-area vitest batches the #25815 not-run handover items in these areas
    W2-C2b Tier 1, areas dashboards · i18n · identity-auth · integration-system · platform-core · records-forms · search · studio-authoring · ux-conventions ~73 per-area vitest + showcase / ui Playwright the #25815 not-run handover items in these areas; with C2a supersedes #25815
    W2-C3a manual set, api · cli · build surface ~30 live REST / CLI —
    W2-C3b manual set, browser · mixed surface ~36 live browser with C3a supersedes #25817

    Manual set (same rule as #25817 / #25479): the unpinned since:v18.x items, plus the unpinned P0/P1 items whose source[] cites a file changed by a Clause-②: yes changeset in #25640 — 66 ids, listed in each card's dispatch. Deferred: the 67 unpinned P2 items (Tier 3), untouched by this wave.

    Backend: one mode:cloud session per card (create_session with source_url), model tier default (opus, dispatch-gates --tier gives no path mandate). Each card files one qa-run record per selector under this anchor and runs the supersede protocol (carry forward before closing the wave-1 record). Product defects are extracted as their own cards; accuracy findings and gaps close out here.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Maintainer rulings on QA-run writes and security findings · session_012YjcDon6BvR9MN93ZsFq3U · 2026-10-27T04:12Z

    Recorded verbatim from the maintainer, in the wave-2 session on 2026-10-27, in this order:

    1. 「你是跑测试啊,和车道有什么关系」 — a QA run is not a lane card: runners are dispatched directly, with no lane claim or seat-post act.
    2. 「你应该使用 pm-dispatch 技能写入」 — every GitHub write of a run goes through the scripts/pm/ doors (issue-create, post-stamped, close-cards, behind write-pace; the fleet relay in a cloud container).
    3. 「测试结果怎样,测试中遇到的问题应该创建 issue」 — every product defect a run meets is filed as its own issue in the same run.
    4. 「如果有安全问题不能写issue的,直接派卡修复」 and 「使用 pm-dispatch 技能 派卡修复」 — an authentication/authorization finding gets a withheld-detail card, and its fix is dispatched at once through pm-dispatch (in-seat os-dev, the reproduction only in the dispatch prompt), never waiting on the maintainer.
    5. 「以上应该写入你的 checklist skills」 — written into .claude/skills/checklist-test/SKILL.md and its twin, docs/qa/platform-checklist/RUNNER.md rule 2, on branch claude/sweet-fermat-jrcd80 (commit d49a510).

    The five wave-2 runner sessions are posting their records and defect cards through these doors now.


    Generated by Claude Code

  13. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    W2-C2b (Tier 1 half B: dashboards · i18n · identity-auth · integration-system · platform-core · records-forms · search · studio-authoring · ux-conventions), recorded at #26450: release-18.2.0-w2-tier1-b (80/80) at 756220c4, 15 PASS / 64 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN. 657 clauses: 273 pass · 226 partial · 1 fail · 157 not-run.


    Generated by Claude Code

  14. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    W2-C3b recorded: #26456 (release-18.2.0-w2-manual-browser, 34/34 at 756220c4, console built in-repo from ui/): 30 PASS / 3 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN. Six runners ran in two staggered waves, never more than three browser runners at once. Environment prep took about 15 min; testing about 140 runner-minutes, probes included.


    Generated by Claude Code

  15. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Wave 2, card W2-C2a (Tier 1 half A: access-security · ai · api-backend · approvals · attachments-storage · automation · cli) recorded: #26468 (release-18.2.0-w2-tier1-a, 73/73 at 756220c4, console built in-repo). 13 PASS / 60 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN, 499 clauses: 238 pass · 132 partial · 1 blocked · 128 not-run · 0 fail.

    Parked here:

    Checklist-accuracy findings follow in the next comment.


    Generated by Claude Code

  16. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    W2-C3a recorded: #26476 (release-18.2.0-w2-manual-api, 29/29 at 756220c4: 27 PASS / 2 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN). Every clause was driven live by six parallel runners. Env prep was about 14 min (cold pnpm build 12 min) and testing was about 19 min of wall clock.

    Wave-1 extraction retests: all five fixes hold, #25818, #25819, #25820, #25821 and #25822.

    Parked here (fixture gaps, unchanged from wave 1):

    • automation.trigger-status-contract A4: the 503 STORE_UNAVAILABLE arm.
    • automation.packaged-flow-subflow-disable-refusal N1: a package-loader-installed second caller.

    Checklist-accuracy findings: listed in the record body under "Checklist-accuracy findings". Highlights:

    Extracted product defects: #26477, #26478, #26479, #26480.

    Supersede: the api/cli/build half of #25817 is re-judged in full (nothing carried forward). #25817 closes when W2-C3b's record lands.


    Generated by Claude Code

  17. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    W2-C1 recorded: #26481 (priority:P0, 23/23 at 756220c4, Console built in-repo from ui/): 20 PASS / 3 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN. Of 204 clauses, 201 pass, 3 are blocked by fixtures, 0 fail. Every pin is green, Playwright smoke 49/49; the served entry chunk matches packages/console/dist byte for byte, so stale-console-bundle is ruled out.

    Posted by the PM session on the runner's behalf (the runner session's own write was refused there).


    Generated by Claude Code

  18. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    From #26468 (release-18.2.0-w2-tier1-a, 73 items at 756220c4): checklist-accuracy findings. These come from the four mapping passes, which re-derived every clause from the pin source, and from the three live legs. Each line is a ledger edit for the lane owning docs/qa/platform-checklist/**; many duplicate or refine lines already on the wave-1 cards #25835–#25841. Clause labels: aK = acceptance[K], nK = negative[K]. Lines that read "ref accurate" are kept as confirmations.

    • access-security.rls-both-sides: ref names showcase-private-owd only; its PATCH/GET assertions are not<300 / not 200 (a1's 'non-200' is satisfied; a2 needs >=400 + re-read). The row-unchanged re-read exists for rls_note in rls-fixture.dogfood.test.ts (fixture, not showcase) — ref states this honestly. rls-fixture/rls-multitenant are named in prose but are not pins for any clause; listed for completeness.
    • access-security.write-path-guards: Accurate ref. All three dogfood pins are http-in-process over the shared showcase; showcase-readonly-when-parent drives as admin (not member). n1's objectql pins run on own test objects, not showcase_contact.lead_score (ref says so).
    • access-security.record-access-explain: Ref accurate. The zoo explain case calls security.explain() in-process under {isSystem:true, tenantId: defaultOrg} — engine layer. Explain response shape (rest/src/security-routes.ts): GET|POST /api/v1/security/explain, body {object, operation, userId?, recordId?|recordIds?}; 401 UNAUTHORIZED anon; ExplainDecision {allowed, object, operation, principal, layers[{layer,contributors[]}], record?:{recordId,visible,decidedBy?}} (spec security/explain.zod.ts). Related HTTP explain pins exist for other fixtures (explain-write-door-parity.dogfood, cbp-explain-master-write.dogfood on write verbs/cpg_board) — not this item's read/showcase oracle.
      • live: Probe-side note, not a defect: the auditor's depth layer reads 'org' with no contributors, so the VAMA-implied depth is not attributed to any set. Cosmetic attribution gap only.
      • live: No step names who owns the probe record. The fixture says 'owned by a third user'; a member can create one directly because showcase_member_default grants allowCreate on showcase_private_note, so no admin system write is needed. Worth stating in steps[0].
    • access-security.crud-permission-matrix: Ref accurate (41 showcase_* rows, 87 allow / 77 deny, 9 baseline flips match the pin). It also names showcase-permission-zoo as context. The objectstack verify --rls half is a CLI proof (otherPins), not a pin. The matrix pin boots its own showcase (bootShowcase with showcaseAppDefaultSecurity), http-in-process.
    • access-security.owd-sharing-matrix: Ref understates: acceptance[2] and acceptance[3] ARE pinned at HTTP by showcase-crud-persona-matrix.dogfood.test.ts (modifyAllRecords case; contributor/member_default × showcase_project cells) — ref says 'no pin'. controlled-by-parent.dogfood.test.ts runs a synthetic cbp_account/cbp_note fixture (ref says so) and scores no clause here.
    • access-security.fls-mask-and-strip: Ref accurate (a0 re-read leg, a2 admin side, a3 and the UI half of a4 manual). a4's API half is fully pinned at HTTP; scored partial only for the UI (browser) half.
    • access-security.anonymous-deny-surfaces: Ref says acceptance[5] has 'no case in any pin' — overclaims the gap: anonymous-door-sweep.dogfood.test.ts class-1 case drives anon GET /api/v1/forms/contact-us → 200 on the showcase (http-in-process).
    • access-security.public-form-withdrawal-layers: Ref accurate. Dogfood pin boots its own showcase with orgContext:true and the stock SecurityPlugin; doors probed anonymously via stack.api. rest pin drives RestServer over a mocked protocol (unit); metadata-protocol pin is in-process over stub registry.
    • access-security.activation-write-operator-gate: Ref accurate and candid. All runtime pins are domain handlers over fakes (unit). The only HTTP pin (packaged-activation-ledger-reach) drives as the dev admin.
    • access-security.platform-owner-email-anchor: Ref accurate. All three pins are in-process derivations over fakes; a0–a3 need restarts per variant (memoized per raw string).
    • access-security.me-permissions-aggregation-parity: Ref accurate. hono-current-user-endpoints pins run on a bare Hono app with no auth service/gate; dogfood anonymous /me/apps asserts body only (no status). Extra HTTP observation of /auth/me/permissions exists in organization-update-door.dogfood.test.ts.
      • live: steps[4]: a showcase_project create needs the required lookup 'account' (400 VALIDATION_FAILED 'Account is required' without it). The step says 'create a showcase_project as W' with no body hint; add account:‹a showcase_account id›.
      • live: acceptance[5].verify says to 'configure localization.currency and localization.timezone' without naming the door. It is PUT /api/settings/localization {currency,timezone} as admin (note: /api/settings, not /api/v1). Worth naming, plus a revert step, since it mutates tenant settings.
      • live: W's objects map also carries a literal '*' key (the plain wildcard entry, allowEdit:true). Clause a6 does not mention it; a consumer that enumerates objects will see a non-object key. Not scored.
    • access-security.record-view-read-audit: Ref accurate (sys_job not probed; install line unobserved). read-audit.test.ts runs a real engine (in-process) with installReadAuditWriter; audit-plugin.test.ts is provisioning/plumbing and scores no clause directly.
    • access-security.share-link-landing-page: Stale knownGaps[0]/ref: 'objectui-repo-only, not runnable from this checkout' is no longer true — ui/ is imported in this tree (pnpm-workspace includes ui/apps/*), shared-record-shape.test.ts and SharedRecordPage-11649.test.tsx exist at ui/apps/console/src/pages/ and run with the @object-ui/console vitest project. SharedRecordPage-11649.test.tsx (jsdom over stubbed fetch) partially pins a1 and a3 and is missing from the ref.
      • live: knownGaps[0] / automated.ref still call the objectui pins 'objectui-repo-only / not runnable'. Per RUNNER they resolve under ui/apps/console/src/pages/ (shared-record-shape.test.ts, SharedRecordPage-11649.test.tsx) and are runnable from this checkout. Stale wording (RUNNER already flags this class).
      • live: Steps use /s/‹token›; the live route is /_console/s/‹token› (App.tsx mounts it inside the console basename). The Sign-in href is /_console/login?redirect=%2Fs%2F‹token›, so the redirect carries the router path without the /_console basename, as the source comment says. Worth stating, so a runner does not misread the redirect value as wrong.
      • live: Step 1 'the API item's step shapes' works: POST /api/v1/share-links {object,recordId,password|audience|expiresAt|redactFields}; revoke is DELETE /api/v1/share-links/‹token›. The liaison has to create a status:'published' brief first (eligibility).
    • access-security.anonymous-floor-v18-doors: Ref accurate. a4: the showcase sweep asserts 2xx + keys ['id'] (not exact 201, no forged owner_id/status sent); exact 201 is from public-form-submit-answer over the real Hono transport and a protocol double — scored pass on the pair. a2 has an extra HTTP pin outside the ref (member, not admin). share-link-routes / notifications-every-verb / api-key-lifecycle are named in ref prose as outside-ref corroboration.
    • access-security.walled-environment-metadata-operator-only: Ref accurate. Walled dogfood pins boot bootStack with multiTenant 'posture-only' (isolated/group) — a purpose-built fixture, not the showcase; http-in-process.
    • access-security.meta-authoring-trail-and-audience-gates: Ref accurate.
    • access-security.security-catalog-activation-and-clone-doors: Ref accurate on which arms are unit-only. Doors: POST /api/v1/security/_activation/:type/:name {enabled?} and POST /api/v1/security/permission-sets/:name/clone {name,label}.
    • access-security.security-catalog-one-holder-and-boot-report: Ref accurate.
    • access-security.grant-table-write-contract: Ref accurate.
    • access-security.parent-and-organization-write-guards: Ref accurate (in-process pins for a1/a2/n0; the 18.0 PASS predates the layer rule).
    • access-security.deployment-tables-platform-only: Ref accurate. sys-presence.object.test.ts asserts no tenant column and requiredPermissions [manage_platform_settings] (lines ~88-103).
    • access-security.share-link-combined-gates: Ref accurate: the runtime pins are route entries over a minimal IHttpServer stand-in + real engine (no Hono/HTTP).
    • access-security.org-admin-assignment-boundary: Ref accurate: n2's full set list is unit-only (no posture dimension); per posture only admin_full_access is exercised. App 'none' — the pin boots ObjectQL over SQLite with SecurityPlugin per posture.
    • ai.mcp-http-surface: Ref accurate on halves. Divergence: a2 scored pass — mcp-skill-method-not-allowed.hono.integration.test.ts asserts status, Allow: GET and the exact envelope message over a real Hono socket with the real dispatcher; the faked services are never reached for a 405 (ref claims no file scores alone). Missing from ref: packages/cli/test/serve-mcp-capability-collision.e2e.test.ts (spawned live server, osk_ key, initialize+tools/list>0, /mcp/skill 200 — nightly tier). scopes test's READ_TOOLS omits resume_run (11 tools vs clause's 12). hono-mcp-skill-raw-body.conformance.test.ts asserts content-disposition only on a stubbed dispatcher response, so it does not pin a1.
    • ai.mcp-stdio-fail-closed: Ref accurate: no API_KEY_REVOKED pin in packages/mcp (grep). Missing from ref (corroborating only): plugin-execution-context.test.ts (per-call identity re-resolution; generic 'no longer valid' refusal — the pre-[Decision] API key 的生命周期与存放:到期上限与不活动失效取多长,key 继续放自有 sys_api_key 还是迁到 @better-auth/api-key(#23287 裁决 C′ 的留项) #23367 arm, not the coded one) and plugin.test.ts's own 'Transport not auto-started' assertions for a7. stdio-api-key-account-posture.pin.test.ts / stdio-tenancy-posture-api-key-matrix.test.ts cover adjacent posture arms, not these clauses.
    • ai.mcp-validate-expression: Ref accurate. Pin's 'accepts a sound formula and reports its inferred type' case asserts ok/errors/warnings/inScope only — inferredType is never checked, so a0's inferredType half has no pin even at unit. Fixture fields (estimate_hours/title on showcase task) verified present in examples/app-showcase.
      • live: variants[2] says flow_condition 'fields bound BARE — a record.-prefixed ref is the error here'; live 'record.estimate_hours > 8' under flow_condition → ok:true, errors []. The flattened scope binds the record root as well as bare fields (packages/formula/src/validate.ts scope docblock; VALIDATE_SITE_MAP flow_condition = predicate/flattened). The variant text is wrong, no clause depends on it
      • live: flow_condition responses carry no inferredType (only formula/value role does); fine, but no clause says so
    • ai.skill-instructions-mcp-prompts: Ref accurate; all named cases exist.
    • ai.mcp-oauth-private-host-transport: Ref accurate (both files plugin units). Base URL is set via OS_AUTH_URL (also BETTER_AUTH_URL / OS_BASE_URL; packages/cli/src/commands/serve.ts AUTH_BASE_URL_ENV_NAMES). Log sentences live in packages/plugins/plugin-auth/src/auth-plugin.ts (~4427/4437/4540). https re-boot leg needs a TLS terminator in front (OS_AUTH_URL=https://$LAN:8443); no pin. oidc-discovery-sync-mount.test.ts mounts discovery over a stub origin, not a private one — not a pin here.
      • live: fixtures (a) needs 'a PRIVATE address the host actually holds'; this container holds only 127.0.0.1 and 192.0.2.2. 192.0.2.2 (TEST-NET-1) is PUBLIC to the rule, so it is a reachable boot-(b) fixture here. Worth recording in fixtures.knownGaps
      • live: the item never names how to set the deployment base URL: OS_AUTH_URL (or BETTER_AUTH_URL / OS_BASE_URL — packages/cli/src/commands/serve.ts AUTH_BASE_URL_ENV_NAMES); the https re-boot can use OS_AUTH_URL=https://… or os dev --cert/--key
      • live: missing clause: nothing asserts that the AS metadata issuer equals the protected-resource authorization_servers[0]. On boots a/a2/b they disagree (probe finding F1)
    • ai.mcp-coded-refusals-and-runtime-exposure: Item revision moved 2→3: ref now also names mcp-coded-refusal.test.ts and mcp-stdio-runtime-object-exposure.test.ts (both exist). Layers as ref states.
    • approvals.email-action-token-door: Ref accurate per clause; all named cases exist. action-page-member harness is a real ObjectKernel (ObjectQLPlugin + ApprovalsServicePlugin + SqlDriver in-memory) with the plugin's own Hono mount — http-in-process, so a4/n2 page bytes are asserted at HTTP, but not on the showcase boot.
    • approvals.status-mirror-field: Missing from ref (corroborating, lower layer): record-lock-multi-update.integration.test.ts 'exempts a status-mirror write (only the approvalStatusField changes)' (a1 at engine — contradicts the item's 'no pin binds the record lock'), status-mirror-declared-values.integration.test.ts (engine mirror values), approval-service.test.ts mirror cases incl. sendBack 'returned' (unit). Item revision 3→4.
    • approvals.request-page-reply-and-reader-visibility: Ref accurate. Item revision 2→3. approval-service.test.ts comment cases (service unit) corroborate a1, not in ref.
    • approvals.act-door-and-admin-rescue-slate: Ref accurate. approvals-act.test.ts asserts PUT → 404 ROUTE_NOT_FOUND through the real dispatcher (unit); the self-hosted ENDPOINT_NOT_FOUND arm has no pin.
    • cli.scaffold-first-run: automated.ref is a CI workflow, not a test (otherPins). Subject versions are 18.1.0 (create-objectstack/cli/spec), so the scaffolded template's @objectstack/* range resolves to the published 18.1.x line — the repo-bin path measures the template against the registry, not this tree's packages; measuring this tree requires the pre-release local-registry variant. Corroborating unit tests not in ref: packages/create-objectstack/src/scaffold-skills-single-copy.test.ts, scaffold-e2e-boot-probe.test.ts. Local equivalent of scaffold-e2e.yml job scaffold-local (repo-built scaffolder, registry deps): (1) pnpm install --frozen-lockfile; pnpm --filter create-objectstack build. (2) cd $SCRATCH && node /home/user/objectstack/packages/create-objectstack/bin/create-objectstack.js e2e-app --skip-install --skip-skills. (3) cd e2e-app && npm install --no-fund --no-audit; on failure (repo version 18.1.0 unpublished) rewrite every @objectstack/* dep to 'latest', npm install again, and re-stamp objectstack.config.ts engines.protocol to ^‹installed @objectstack/spec major› (record this fallback). (4) npm run validate && npm run build && npm test (each exit 0). (5) refuse if :8080 already answers /api/v1/health; npx os start --artifact ./dist/objectstack.json --port 8080 > server.log 2>&1 &; poll curl -fsS http://localhost:8080/api/v1/health every 2s ×30 (fail with server.log if the PID dies or never healthy); curl -fsS http://localhost:8080/api/v1/ready; kill PID. (6) skills boundary: scaffold skills-probe --skip-install --skip-skills; expected = sorted basenames of /home/user/objectstack/skills// holding SKILL.md; npx -y skills add /home/user/objectstack/skills --all --copy; installed = find . -name SKILL.md -not -path '/node_modules/' → dirname basenames sort -u; assert installed == expected; npx -y skills add /home/user/objectstack --list → must not contain 'dogfood-verification' and must say 'Found ‹expected_count› skill'. (7) pinned shape: scaffold pinned-probe (no --skip-install); if node_modules/@objectstack/cli exists, Dockerfile 'FROM ghcr.io/objectstack-ai/objectstack:‹tag›' tag == installed cli version; else if registry has no cli matching the range, tag must be 'latest'. (8) skills catalog: in pinned-probe, .claude/skills/ (real dirs with SKILL.md, no symlinks, no .agents) names == node_modules/@objectstack/skills/dist/skills/* names. (9) docker (optional locally): docker build -t ghcr.io/objectstack-ai/objectstack:‹tag› --build-arg OS_CLI_VERSION=‹cli ver› /home/user/objectstack/docker; docker build e2e-app; docker run -p 18080:8080 with OS_SECRET_KEY/OS_AUTH_SECRET; poll /api/v1/health. Job registry-canary (nightly): npx -y create-objectstack@latest canary-app -t blank --skip-skills; validate/build/test if scripts exist; same boot+health+ready probe. Pre-release variant (item fixtures): pack all public workspace packages, publish to a localhost registry with no upstream for @objectstack/* + create-objectstack, npm_config_registry=‹it› node packages/create-objectstack/bin/create-objectstack.js qa-first-run -t blank --skip-skills, verify lockfile integrity == local tarballs.
      • live: steps[0]: 'its exit code and its install output are the install step's evidence' — the exit code alone is NOT evidence: probed at 756220c with an unreachable registry, the scaffolder printed 'ERR_PNPM_META_FETCH_FAIL … ⚠ Dependency installation failed. Run pnpm install manually.' then '✓ Environment created!' and exited 0 with no node_modules (index.ts catch arm, deliberate). The step should require node_modules/@objectstack/cli present / no 'Dependency installation failed' line, not exit 0.
      • live: history rev 6 says 'all seven clauses stayed not-run' — the item has five acceptance clauses.
      • live: published path (create-objectstack@latest = 18.1.0) is not the subject: the tree carries 208 pending changesets and its skills/ catalog has 11 skills (adds objectui) vs the published @objectstack/skills 18.1.0's 10 — a verdict 'valid for this subject' needs the pre-release variant, which the item lists only as an alternative; worth saying in knownGaps[1] that during a sweep of an unreleased commit the pre-release variant is the required path.
      • live: steps[4] wording 'compare that set … with node_modules/@objectstack/skills/dist/skills by name and count': dist/skills also contains README.md — a naive ls count is 11 vs 10 on the published package; say 'directories holding SKILL.md' for both sides (the workflow does).
    • cli.dev-automigrate-policy: Ref under-claims: packages/cli/test/dev-standalone-self-heal.integration.test.ts spawns the built CLI (dev --no-watch ×2, serve) over a blank scaffold and asserts the auto-reconciled line on a keyless dev restart and its absence on a production serve — scores a5 pass and halves of a0/a1/n1 at live-boot; packages/drivers/driver-sql/src/sql-driver-14902-plain-unique-duplicate-preflight.test.ts pins the 'safe boot over a blocked create' half the item says is hand-staged; packages/runtime/src/dev-auto-migrate.test.ts pins the injection decision. Revision 6→7: a4 text now matches ADR-0131 D1 pins (wave-1 'stale' finding resolved). The self-heal spawner needs packages/cli dist built (requireBuiltCli).
    • cli.migrate-meta-write-stored-and-all: Divergence from wave-1: a3 scored partial (meta.report-order.test.ts drives printMigrationReport directly, not the command). Revision 2→3.
    • cli.organization-ownership-ceremony: Ref files all exist. Revision 4→5.
    • cli.meta-package-flags-and-explain: Ref accurate. Revision 2→3.
    • cli.validate-v18-authoring-verdicts: Ref accurate (states a1/a2 unpinned).
    • cli.verify-derived-proof-families: Ref accurate.
    • api-backend.query-contract-matrix: Ref accurate at rev 6: no ref'd pin reaches HTTP. engine.test.ts [Security: $expand bypasses RLS/FLS on the referenced object (data leak on lookups) #2850] runs on a mocked driver (scores a4 partial alone). Missing from ref: packages/qa/dogfood/test/showcase-expand-crud-gate.dogfood.test.ts ([security] $expand bypasses the CRUD gate and OWD row scope — a contributor reads records they are 403'd from, because the #2850 expand waiver keys on the wrong axis #7626) drives the contributor/admin expand pair over the in-process HTTP stack through all three expand doors — it scores a4 at HTTP and should be named in automated.ref. request-schema-gate.conformance.test.ts has no $nin scalar case (only the {limit:'ten'} / null / array bodies) so it does not touch a5 at all. engine-filter-array-lowering asserts code INVALID_FILTER, which the POST door no longer answers (VALIDATION_FAILED since spec: FilterConditionSchema (the save-time door) admits a non-boolean $null / $exists flag, so a stored dataset or widget filter carrying one saves clean and is refused 400 on every query face #20116) — a lower-layer pin with a different code.
      • live: variants list omits operators AST_OPERATOR_MAP serves: icontains→$icontains, ilike→$ilike, is_empty/is_not_empty→$empty, before/after (date $lt/$gt). Coverage gap, not a defect (packages/spec/src/data/filter.zod.ts AST_OPERATOR_MAP)
      • live: AST is_null / is_not_null work with NO comparand (['churn_reason','is_not_null'] → 2 rows); step 2 could name that spelling
    • api-backend.bulk-write-contract: Ref accurate at rev 5: owner-anchor-and-bulk-writes bulk cases are ql.update/ql.delete({multi:true}) engine calls (lines ~165-195), never an HTTP bulk door; its single-door cases are HTTP but concern owner anchoring, not this item. rest-batch-size-cap.test.ts is RestServer over a mocked protocol (pins count/max/BATCH_TOO_LARGE). No HTTP-booted pin of createMany/updateMany/deleteMany on showcase_private_note exists. Every clause stays a live leg.
      • live: variants list door:per-object-batch (POST /data/:object/batch) but no step or clause drives it; this run drove it ad hoc (update on foreign id → RECORD_NOT_FOUND, own → success, create x201 → BATCH_TOO_LARGE)
      • live: member deleteMany on a foreign OR nonexistent id answers PERMISSION_DENIED (object-level allowDelete gate fires before lookup) — uniform, so no oracle; step 6 could state this so a runner does not expect RECORD_NOT_FOUND there
    • api-backend.declarative-endpoint-execution: Dogfood files boot the showcase through @objectstack/verify (real Hono app via app.request) — http-in-process. apis-publish-gates gate (a) is a describe block (script /does not execute/, proxy /SSRF|egress/); neither asserts endpoint naming. Ref accurate.
    • api-backend.packaged-action-disabled-dispatch: Ref accurate. The dogfood dispatch probe sends params:{recordId} rather than a top-level recordId. Restart leg, param-ordering contrast, anonymous probe and live MCP transport have no pin.
    • api-backend.action-activation-door-contract: Ref accurate. a7 is test-oracle and both unit cases exist. The 4-segment unit case ('a deeper path under _activation is still GATED') runs under isolated and answers 403, a different claim from a1's router 404. field-error-code-catalog.test.ts ('activation-gate.ts readActivationBody') pins the shared body reader only, not this door.
    • api-backend.rest-crud-config-contract: Ref accurate. discovery-services pin uses dataPrefix '/objects' (the step names '/records'); route-table re-basing has no pin.
    • api-backend.rest-batch-config-contract: Ref accurate. a1's survival of POST /api/v1/batch rides the both-direction diff (baseline lists it; comment at line ~174).
    • api-backend.rest-metadata-config-contract: Ref accurate. meta-object-fls.test.ts runs the shared OBJECT_SCHEMA_MASK_CASES over RestServer exits with a security double (unit). Cache-branch has no pin.
    • api-backend.rest-route-generation-tombstones: Ref accurate (rev 3 already states the per-clause reach). §E's 'the plugin path refuses the same keys' drives batch.defaultAtomic, not routes.
    • api-backend.second-object-exposure-and-internal-fields: Missing from ref: packages/qa/dogfood/test/second-object-exposure.dogfood.test.ts (security(data, analytics): a lookup target's exposure declaration is not judged when the data door's $expand, or the dataset door's dimension-label pass, reads it — detail withheld pending maintainer #22661/security(data): a nested-relation filter condition on a lookup target is evaluated without asking the target's exposure (census row 4 of #22661) #22737, real stack) and packages/qa/dogfood/test/internal-field-data-door-positions.dogfood.test.ts (security(data): the data door's filter and group-by positions do not honour a field's internal: true the way its row read does — detail withheld pending maintainer #22646, showcase sys_api_key.key) — both HTTP-in-process and they lift a2, a3, n0. No pin asserts the filter.t_ref location (a1).
    • api-backend.data-request-shape-and-query-arity: Ref accurate (rev 3 states per-file layers). None boots the Hono adapter.
    • api-backend.meta-read-doors-v18: Ref accurate. a0's oracle (files green) includes the dogfood file. The data-sort 403 dogfood uses a scratch readable:false set on showcase_project.budget, not the client_liaison position the step names.
    • api-backend.error-sentences-and-unique-violation-wire-code: Ref accurate. a1's 'no code' design is pinned through mapDataError only.
    • attachments-storage.presigned-upload-roundtrip: Ref accurate. Extra pin storage-unclaimed-download.dogfood.test.ts follows /url bytes and the 302→Location→bytes for bearer and cookie callers, but on a scope-less file, so a2/a3 stay partial for the attachments-scope fixture. owner_id/status reads in the matrix are engine reads (ql.findOne isSystem) on the HTTP-booted stack.
    • attachments-storage.download-authz-both-sides: Ref accurate for a0–a3. Extra component pin ui/packages/app-shell/src/views/tests/RecordAttachmentsPanel.test.tsx (not in ref) asserts the friendly-copy mapping for both envelope dialects; it lifts a4/n1 from unpinned to partial (component), never pass. a2's admin-owner case is also the parent owner, so it never isolates the uploader bypass.
    • attachments-storage.read-inherits-parent-rls: Ref accurate. a0 nit: the clause/steps scope the list by parent_object+parent_id; the matrix pin lists unscoped and asserts absence — semantically covers it. The probe-warning prefix '[storage] attachment read visibility' is asserted nowhere (unit asserts fragments only), as the clause itself admits.
    • attachments-storage.attach-requires-parent-edit: Ref accurate (rev 8). Unit companion attachment-access-hooks.test.ts 'installAttachmentAccessHooks does not authorize an UNSCOPED multi-delete: no id + no where reads as "nothing to authorize" and deleteMany runs over the whole table #4757 through the wired engine' block confirmed. a5/n2 are engine-only, as the ref states.
    • attachments-storage.sys-file-status-pipeline: Ref accurate. attachment-lifecycle.test.ts (not in this item's ref; it is in orphan-tombstone-reap's) carries unit/engine pins for a5 and n1 — add it to the ref. Matrix reads sys_file through the engine (isSystem), writes through HTTP.
    • attachments-storage.orphan-tombstone-reap: Ref accurate. The dogfood 'abandoned pending uploads' case asserts the row reaped only (not bytes); bytes best-effort is unit-pinned.
    • attachments-storage.upload-session-abort: Ref accurate. storage-chunked-resume-integrity.dogfood.test.ts (extra) drives the chunked round-trip over HTTP but never reads sys_upload_session status, so a0 stays unpinned. storage-routes.test.ts also has "reports 'expired' on progress rather than refusing the poll" and 'leaves a completed session alone once its deadline passes' (unit).
    • attachments-storage.inline-grid-receipt-cells: Ref accurate. Spec navigates /apps/showcase_app/... on the console dev server (LIVE_APP_URL, default :5180); on a showcase boot serve the same under /_console.
    • attachments-storage.upload-limits-scope-and-ownership: Ref accurate. Extras not in ref: packages/qa/dogfood/test/storage-upload-limits.dogfood.test.ts (HTTP 413 + restartless save) and packages/plugins/organizations/src/storage-upload-door-ownership.wall.test.ts (HTTP 403 on complete/progress, walled boot) — consider adding both; the latter makes a3 pass at the HTTP layer.
    • attachments-storage.chunked-upload-integrity: ACCURACY: knownGaps[0] is STALE — packages/plugins/organizations/src/storage-upload-organization-change.wall.test.ts now pins the chunked chunk-PUT 409, chunked-complete 409, progress 200, and progress-with-due-expiry 409 after an organization switch, over a booted wall. Add it to automated.ref and retire the 'unpinned' gap (a0's 'org-switch guard has no chunked-door pin' text is also stale).
    • automation.trigger-type-matrix: Ref accurate (rev 8). inbound-hook-member.test.ts (extra) covers n1's refusal below the showcase; screen-flow.spec.ts carries a4's network half.
    • automation.screen-flow-roundtrip: Ref accurate (rev 6; wave-1 cited rev 5). Extra engine pin packages/services/service-automation/src/builtin/screen-resume-validation.test.ts covers a5/n0 below the door. The spec's launch regex expects the collection form /actions/showcase_task/showcase_bulk_reassign (no /:recordId).
    • automation.durable-suspend-restart: Ref accurate. Fixture packages/qa/dogfood/test/fixtures/flow-durable-suspend-fixture.ts is a non-test support file (otherPins).
    • automation.paused-run-trigger-record-masked: Ref accurate (rev 5).
    • automation.setup-packaged-automation-board: Ref accurate (rev 9). All ui pins are jsdom component tests over stubbed fetch (runnable: cd ui && pnpm --filter @object-ui/app-shell exec vitest run ‹file›, or the package's 'vitest run --root ../..'); framework nav pin runs in packages/platform-objects. Clone dialog now opens PREFILLED (‹source›_copy, '‹label› (copy)', objectui#13344), so step 6's 'submit with name empty' requires clearing the field first. Member toggle sentence confirmed in packages/runtime/src/domains/automation.ts FLOW_ENABLEMENT_DENY_MESSAGE (the actions half uses a different activation-gate sentence). Needs a console bundle built from ui/ (pnpm console:build) served at /_console.
      • live: personas[1] and steps[7] still say 'fresh runtime sign-up' — on stock showcase that is 403 SELF_REGISTRATION_CLOSED; minted via invite-member → sign-up (RUNNER env facts). Spell the invite in fixtures.requires.
      • live: steps[5] says 'try submitting with name empty, label empty' — the dialog now opens PREFILLED (‹source›_copy / '‹label› (copy)', objectui#13344) with submit enabled; the run must clear the fields first. acceptance[6] 'submit control is disabled until both fields are non-empty' still holds but the step should say the fields start filled.
      • live: acceptance[5] verify still frames the member alert as reachable through the page; with knownGaps[2]'s posture re-measured here at 756220c (member 403 at app open), the clause's member cell is structurally unscorable via dom — consider moving the member sentence check to an api oracle (forged toggle) or marking the cell conditional.
      • live: acceptance[7] verify says 'sys_metadata_activation reads are open by ruling' — measured 403 for a member at 756220c (2nd run to see this; also QA run · surface:browser (65/65) · 36b2889c · 2026-10-12 · 50 PASS / 2 PARTIAL / 12 FAIL / 1 BLOCKED / 0 NOT-RUN #23163). The verify text still asserts the opposite.
    • automation.flow-registration-verdict-on-read: Ref accurate.
    • automation.flow-authoring-refusals-v18: Ref accurate; 9 files exist. a1/a3/n0 need the CLI on a scratch app, a2 a boot.
    • automation.flow-run-semantics-v18: Ref accurate. ref string's bare 'flow-cel-current-user.test.ts' token resolves to packages/services/service-automation/src/.
    • automation.inbound-hook-timestamped-signature: Ref accurate.
    • automation.scheduled-work-opt-in: Ref accurate.

    Generated by Claude Code

  19. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    PARTIAL coverage carried · session_012YjcDon6BvR9MN93ZsFq3U · 2026-10-27T08:42Z

    The Parked-on: #25807 lines of wave 2 for three areas are now carried by per-area pin-upgrade cards (maintainer: 「同意」): access-security → #26571 (18 items), api-backend → #26572 (11), records-forms → #26573 (21). The other areas stay parked here.

    Also landed from this wave: #26453 fixed by #26497 (merged); the ledger edit for records-forms.record-discussion-mentions and the checklist-test rule changes ride #26567.


    Generated by Claude Code

  20. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Post-release smoke of the published 18.2.0 (npm), filed as #26629: smoke:npm-18.2.0 (25/25) · 22 PASS / 0 PARTIAL / 3 FAIL / 0 BLOCKED / 0 NOT-RUN.


    Generated by Claude Code

  21. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Re-verification of the wave-2 observations that were seen but not filed, 2026-10-27T11:23Z. Record: #26639, at fb91e979 on showcase, two fresh boots per observation, plus the published create-objectstack 18.2.0.


    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

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:devxpm:queuepriority:p1High: required for production / M2target:v18

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions