Repository navigation
Description
domain:devx#1 · os-warren · session_01JQwxbZtZMhQkARKJtViA9U
Part of #27377 (the 18.3.0 sweep anchor; wave 5, card W5-FAIL)
QA run record for the 18.3.0 pre-cut re-check, wave 5 card W5-FAIL: every item wave 4 judged FAIL (20 items) re-judged live and in full (every acceptance and negative clause, not only the failed ones) at one subject, plus the two release blockers: records-forms.list-view-capabilities A8 (#29173) and the #29015 path as an off-clause re-check. Item verdicts are derived from clause verdicts, never hand-assigned. Run under .claude/skills/checklist-test/SKILL.md and docs/qa/platform-checklist/RUNNER.md; a QA run, not a lane card. Warren dispatched the four wave-5 cards on 2026-11-03 08:21Z.
Result: 20/20 judged · 15 PASS / 0 PARTIAL / 5 FAIL / 0 BLOCKED / 0 NOT-RUN. No item is planned. 181 clause rows, all driven live: 169 pass, 12 fail. Wave 4 had all 20 at FAIL; 15 move to PASS. Of the 5 still failing, 2 are stale spec (one carried by an open card, one carded now) and 3 are product defects (one is the same clause still failing after its fix, two are new rows or surfaces). Blockers: #29173 A8 PASS; #29015 re-check FAIL (the fix is incomplete, confirmed by an independent verify pass, carded). One off-clause security finding was reported privately to the dispatching PM session (one line below).
Environment fingerprint
- Framework:
objectstack-ai/objectstack@589049b023d82c94508bf9fce752ea19069279e5(main, the merge of fix(metadata-protocol)!: an object saved back from a translated /meta read stores its source labels, and one the registry would refuse is refused at save and at publish #29790), detached; it never followedmainor the Version PR chore: version packages #26517.ui/is the same commit; the Console was built in-repo from it. - CI on the subject: push run 41600797636 (CI) re-read before posting:
completed / success. - Build:
pnpm install --frozen-lockfile(30 s),pnpm exec turbo run build --concurrency=2(118/118 tasks, exit 0, 15m13s),pnpm console:build(71/72 cached plus the copy).check-dev-prereqs: 106 build artifacts present. Node v22.23.4, pnpm 10.31.0, Playwright Chromium 1243 from/opt/pw-browsers, 4 CPUs, ~15 GiB. - Boot, one or more per runner: a scratch copy of
examples/app-showcase(tar withoutnode_modulesand.objectstack,node_modulessymlinked), started from the copy withOS_PORT=PORT OS_HOME=RUN/home OS_STORAGE_LOCAL_ROOT=RUN/uploads setsid node packages/cli/bin/run.js dev --ui --seed-admin --no-watch -p PORT -d file:RUN/data.db. A canary boot answered/api/v1/health200 in 16 s and served/_console/200 before any runner started. Ports 41710–41819. Seed:--seed-admin(admin@objectos.ai), the stock showcase seed and demo personas; members minted by invite + sign-up or admin create-user + change-password, each persona's identity proved server-side before its cells. - Execution: 8 item runners + 2 blocker runners + 1 independent verify runner (Agent subagents, opus, effort high), at most 3 browser scripts at once (flock semaphore) and at most 2 vitest pins at once (
--maxWorkers=1). Chromium was OOM-killed a few times under the 8-boot load; every affected run was repeated, none is scored on a crashed page. - Hygiene: the tree stayed clean (
git statusempty),examples/app-showcase/.objectstackdoes not exist, no listener remains on any run port. - Time: setup 08:25–08:42Z (17 min, build-bound); testing 08:42–09:57Z (75 min wall, ~420 runner-minutes); probes 160 runner-minutes inside that.
Scope
Selector release-18.3.0-w5-fail: W5-FAIL-items.txt (computed from the ledger at main 55dca466, whose ledger equals the subject's). Every revision matches the subject:
ai.mcp-run-action-exposure-gate r6 · api-backend.rest-metadata-config-contract r9 · api-backend.error-sentences-and-unique-violation-wire-code r6 · automation.packaged-flow-clone-contract r11 · automation.setup-packaged-automation-board r11 · i18n.notification-localized-and-clears r6 · i18n.surface-matrix r13 · integration-system.email-template-render r13 · integration-system.connector-auth-kind-application r6 · platform-core.home-admin-cluster-links r6 · records-forms.list-view-capabilities r8 · records-forms.adhoc-filter-sort-builder r8 · studio-authoring.draft-publish-lifecycle r11 · studio-authoring.expression-editors r8 · studio-authoring.packaged-automation-studio-lock r7 · studio-authoring.dashboard-widget-and-filter-types r5 · studio-authoring.access-permission-set-lifecycle r7 · studio-authoring.no-entry-property-matrix r5 · ux-conventions.write-feedback r10 · ux-conventions.disabled-control-reason r4
Off-clause, not an item of this selector and not counted in the title: the #29015 re-check, recorded under studio-authoring.api-written-keys-survive-studio-save (r4).
The per-clause verdict table is in the three comments below this body.
Derived item verdicts
15 PASS / 0 PARTIAL / 5 FAIL / 0 BLOCKED / 0 NOT-RUN (20 of 20 judged).
- FAIL (5):
ai.mcp-run-action-exposure-gate: A4 (stale spec, R-1)integration-system.email-template-render: A7 (product defect, R-2)studio-authoring.expression-editors: A2, A4, A6, N0 (stale spec against the Studio: an expression field that says "Valid CEL" should read the draft's server verdict at its own path (RLS predicate, flow edge condition) #26858 ruling, carried by open Studio: an expression the engine refuses (RLS USING on a formula field, a null-unsafe validation predicate) keeps autosaving — the server verdict is shown on the field but never holds the save #27482, R-3)studio-authoring.no-entry-property-matrix: A1, A2, N0 (product defect on thefield.sortablerow, R-4)ux-conventions.disabled-control-reason: A0, A1, A2 (product defect on the All-metadata item page, R-5)
- PASS (15): every other item.
Delta against wave 4 (per item, each item's own wave-4 record)
| item | wave-4 record | w4 | w5 | what moved it |
|---|---|---|---|---|
| ai.mcp-run-action-exposure-gate | #28942 | FAIL | FAIL | N1 fail→pass (#28943 → PR #29036, af8448f: revoke_api_key listed unavailable: PERMISSION_DENIED to an osk_ caller, 36/36 unavailable entries refuse with their listed code, 0 side effects). A4 fail→fail: never re-pointed (it was parked on the anchor, which closed) |
| api-backend.rest-metadata-config-contract | #28929 | FAIL | PASS | A2: #28934 → #28996 (18e4ac1) + r9; describe() and clause both name 13 routes, measured 13 |
| api-backend.error-sentences-and-unique-violation-wire-code | #28929 | FAIL | PASS | A1: re-point #28936 → #28980 (ab085a0) to HOOK_ABORTED; holds live on 2 fresh boots |
| automation.packaged-flow-clone-contract | #29002 | FAIL | PASS | A1, A2, A6: re-pointed r10→r11 under #28579 (#29438) to ADR-0146 D4; the new A7 (four package arms) holds |
| automation.setup-packaged-automation-board | #29124 | FAIL | PASS | A0, A1, A2, A3, A5, A6: re-pointed to r11 under #28579; A5 also #29139 → #29224 (role="alert" on the refusal strip) |
| i18n.notification-localized-and-clears | #28981 | FAIL | PASS | A1: #28982 → #29104 (692e0dc), the zh-CN review banner is translated |
| i18n.surface-matrix | #29151 | FAIL | PASS | N1: #29153 → #29217 (20f052d) + #29280 (6dd6a53), translated field help shows |
| integration-system.email-template-render | #29151 | FAIL | FAIL | A7 fail→fail: #29152 → #29250 (5cdaf9a) fixed malformed address strings; a non-string display name still answers 500 (R-2) |
| integration-system.connector-auth-kind-application | #29151 | FAIL | PASS | A3, N1: re-point #29154 → #29214 (22d0710) to ADR-0143 D1 |
| platform-core.home-admin-cluster-links | #28981 | FAIL | PASS | A2: re-pointed r5→r6 under #28579 (ADR-0146 D1, #28818) |
| records-forms.list-view-capabilities | #29172 | FAIL | PASS | A8: #29173 → PR #29231 (e7d3ada); one aggregate POST for the selection, 200, 3/3 |
| records-forms.adhoc-filter-sort-builder | #29172 | FAIL | PASS | A3, N2: #29174 → #29305 (62e2d07), the sign-out redirect no longer carries uf_* state |
| studio-authoring.draft-publish-lifecycle | #29002 | FAIL | PASS | A10: re-point #29013 → #29169 (fa31010) |
| studio-authoring.expression-editors | #29002 | FAIL | FAIL | A2, A4, A6, N0 fail→fail: #27482 still open, no ruling (R-3); N1 holds |
| studio-authoring.packaged-automation-studio-lock | #29002 | FAIL | PASS | A0 (New half), A2: re-pointed r6→r7 under #28579 (ADR-0146 D3/D4) |
| studio-authoring.dashboard-widget-and-filter-types | #29002 | FAIL | PASS | A4: #29006 → #29300 (3ec2647), a partly filled Options From is held, not saved |
| studio-authoring.access-permission-set-lifecycle | #29002 | FAIL | PASS | A3: re-pointed under #28579 (ADR-0146 D3) |
| studio-authoring.no-entry-property-matrix | #29002 | FAIL | FAIL | all 5 wave-4 rows now pass (#29008/#29385, #29009/#29312, #29010/#29334; titleFormat and drawerSide/drawerWidth judged as refusal rows after #29499 and #29287). A1, A2, N0 still fail on a row wave 4 recorded passing, field.sortable (R-4) |
| ux-conventions.write-feedback | #28981 | FAIL | PASS | A0, A1: #28984 → #29310 (bbfccbd), the autosave toasts what it saved |
| ux-conventions.disabled-control-reason | #28981 | FAIL | FAIL | the field inspector (#28986 → #29081) and flow node/edge inspectors (#28985 → #29206, #29203) now pass; A0–A2 fail on the All-metadata item page's default inspector, which wave 4 did not read (R-5) |
Counts: FAIL→PASS 15 · FAIL→FAIL 5 (of which 2 moved surface: no-entry, disabled-control) · PASS→FAIL 0.
Reproduction rule for every fail
R-1 · ai.mcp-run-action-exposure-gate · A4 · stale spec (2/2 fresh boots)
- Stock boot. As admin (session):
POST /api/v1/keys {"name":"k"}→ key K. - MCP Streamable HTTP
POST /api/v1/mcp,Authorization: Bearer K:initialize,notifications/initialized. tools/call list_actions {}. Clause expects 0sys_*actions; actualtotalCount37, 36sys_*, allaiExposed: true, allunavailablefor an osk_ caller.run_action {"actionName":"create_api_key","objectName":"sys_api_key","params":{"name":"x"}}. Clause expects 'Object "sys_api_key" is a system object and its actions are not exposed via MCP'; actual 'Action "create_api_key" on system object "sys_api_key" is not exposed via MCP: …'. Without objectName, likewise a new spelling.- With the admin's session bearer,
run_action revoke_api_key(confirm: true) →ok: true, keyrevoked: true. Clause expects a wholesale refusal.
Rulings: 6513869839 (mcp: run_action refuses every action on a sys_* object, so an agent cannot reach the identity actions (ban_user, impersonate_user, set_user_password) that REST POST /actions serves #27681), 6523087116 ([Decision] sys_* kernel objects, assessed as one set: which of the 58 platform identity actions may an agent ever reach (plain declaration / declaration + confirmation / human-only), executing #27681 B parameter 2 in one ruling #27900), amended by 6540309323. Code:systemObjectActionExposureError(packages/runtime/src/action-execution.ts),isListableAction(packages/mcp/src/mcp-http-tools.ts).
R-2 · integration-system.email-template-render · A7 · product defect (2 fresh boots, 3 runs; dist equals source)
- Stock boot, admin bearer.
POST /api/v1/email/send{"to":{"address":"ok@example.com","name":42},"subject":"x","text":"x"}.
Expected 400 VALIDATION_FAILED naming the display name; actual 500{"code":"EMAIL_SEND_FAILED","error":"a.name?.trim is not a function"}(log:rawAddressText … recordRejectedMessage). Same forccname 42,replyToname true, atolist entry with an object name. Every other A7 bound holds (200 admin; 401 anonymous; 400 non-object body; 403 member, foreign from, sentBy, bad headers, other organizationId, identityMail; malformed address strings 400 since fix(plugin-email): a malformed recipient address answers 400 VALIDATION_FAILED, not 500 #29250).
R-3 · studio-authoring.expression-editors · A2, A4, A6, N0 · stale spec against the #26858 ruling (3/3 fresh loads)
- Stock boot, admin form sign-in; a permission set on an object with a virtual formula field
f_formula. - Studio › Access › RLS, type the USING
record.f_formula > 5.
Clause expects the editor to refuse and hold with no PUT; actual "Valid CEL" for ~1.6 s, autosavePUT200, then the error after the server re-read; editing to> 7PUTs again; the engine refuses the text at publish (422rls-predicate-unenforceable). This is the fix(app-shell): a server error at an RLS clause's path holds the permission-set autosave #27612 design (held once the server verdict on that text is read back); the Studio: an expression field that says "Valid CEL" should read the draft's server verdict at its own path (RLS predicate, flow edge condition) #26858 ruling forbids a client copy of the publish rule. Owner: open Studio: an expression the engine refuses (RLS USING on a formula field, a null-unsafe validation predicate) keeps autosaving — the server verdict is shown on the field but never holds the save #27482 (a ruling: re-point to "held from the server re-read on", or keep "no PUT" and fund a validate-only door). Control: the same fill holds the other probe tiers with 0 PUTs.
R-4 · studio-authoring.no-entry-property-matrix · A1, A2, N0 (the field.sortable row) · product defect (4/4 fresh loads)
- Writable package, object
qar8_fzwithnosort: {type:'text', sortable:false}, published, a few rows. GET /api/v1/meta/object/qar8_fz→fields.nosort.sortable: false; served sortability projection →fields.nosort = {sortable:true}.GET /api/v1/data/qar8_fz?sort=nosort→ 200.- Console list (default tab and an explicit-columns view): click the "No Sort" header → request
sort=nosort; the Sort picker offers "No Sort".
Expected: not sortable in list views (field.zod.ts, liveness grade "grid"); actual: sortable everywhere. Control: the Name header sendssort=name.
R-5 · ux-conventions.disabled-control-reason · A0, A1, A2 · product defect (3/3 and 2/2 fresh loads)
- Stock boot, admin form sign-in.
- Open
/_console/studio/~all/metadata/object/showcase_taskor/_console/studio/~all/metadata/flow/showcase_task_completed(banner: "This item is locked and cannot be edited or deleted."). - With nothing selected, the Properties panel's controls are disabled (object: Name, Label, Plural label, Icon, Description, Exposure posture, Required capabilities; flow:
button#mdf-type).
Expected: tooltip on hover, a Tab-reachable wrapper witharia-describedbycarrying the reason; actual: none of the three. Control: a writable item renders the panel enabled; the node inspector on the same page explains itself since fix(app-shell): the metadata editor page tells its scoped inspector why it is read-only #29203.
Release blockers
- action door: a record-less aggregate api action that declares recordIdParam is refused 400 ("identifies its record by id"), so bulk "Recalculate Selection" never runs #29173 ·
records-forms.list-view-capabilitiesA8: PASS (two runners independently, 2 + 1 fresh boots). Recalculate Selection over 3 rows onshowcase_task› Bulk Actions sends ONEPOST /api/v1/actions/showcase_task/showcase_recalc_selection {"params":{"_selectedIds":[3 ids]}}→ 200; dialog "Succeeded 3 / 3"; the 3 rows'estimate_hourschange server-side, the other 7 do not. Mark Done over 2 rows = 2 per-record POSTs 200. Forged POST 200. Gate both sides: a member without task edit is refused, withshowcase_contributorallowed. - Studio: a dashboard draft whose requiredPermissions the author does not hold reads 403, Studio treats that as "no draft", and the next autosave overwrites the draft without the key #29015 re-check (off-clause, under
studio-authoring.api-written-keys-survive-studio-save): FAIL, independently verified (RUNNER rule 7). R-6:- Writable package PKG, published dashboard D (one metric widget), an app whose nav names D.
- As admin (no set grants
showcase.export_data):PUT /api/v1/meta/dashboard/D?mode=draft&package=PKGwith the published body +"requiredPermissions":["showcase.export_data"]→ 200. Draft read: admin 403, an entitled reader 200 with the key. - Fresh browser, form sign-in as admin, open
/_console/studio/PKG/interfaces(or the metadata deep link): fix(app-shell): Studio opens no buffer over a dashboard draft the server refuses to read #29132's refusal strip shows, and under it an editable{}buffer (Properties inspector, item tools; Source reads{}) on 10 of 11 loads (first runner 7 of 9). - Source tool: replace
{}with the published body → autosavePUT …?mode=draft&package=PKG&surface=studio, no If-Match → 200; the reader's draft has norequiredPermissions, its draft-only label is gone, admin's read flips 403→200 (2/2 per runner). An inspector-only edit sends{"label":…}→ 422 (the inspector cannot supplyname).
Mechanism: dynamic preview registration makes the first render non-editable; the!isEditablearm installsdraft={}for the leaf; the later 403 branch (StudioDesignSurface.tsx~L5284–5290) never clears it. The list-view editor (fix(app-shell): four Studio editors open no buffer over a draft the server refuses to read #29275) holds (no buffer, no PUT, 2/2). Not a security finding (the author holds metadata write on the package). Card in the close-out.
Off-clause probes (RULE 8)
160 runner-minutes over all 20 items (2–10 min each), as admin, members, demo personas and anonymous; boundary classes empty string, missing/unknown id, wrong type, posture opposites (osk_ vs session bearer; member vs admin) and readers outside the asserted scope. Findings that passed the filing gate are extracted (close-out): the per-object batch door's row code for an undeclared hook refusal (beside api-backend.error-sentences-and-unique-violation-wire-code) and a mis-cased sys_user.locale (beside i18n.notification-localized-and-clears). Kept in notes, not carded: the clone refusal "is not shipped by a package" for a copy already in the .custom pair (wording only, the refusal is right); the send door keeping a CRLF subject while refusing multi-line custom headers (admin-only door, transports fold header line breaks; hardening note); the send door accepting unknown body keys; a member reaching the Setup Applications page by typed URL (UI-only, server refuses the writes, same family as #28988 and parked upstream as objectui#12706).
records-forms.adhoc-filter-sort-builder· observed beside the clauses · security finding — detail withheld, reported to PM
Fixture gaps and partial coverage
studio-authoring.no-entry-property-matrix: knownGaps[1] keys not judgeable at the subject (mailAssociation, ackPlaintextMasking, lifecycle.ttl, dimensions) were not run, as the item says; form defaults measured on the named form page only (knownGaps[0]). The item verdict is FAIL on R-4 regardless.i18n.surface-matrixA5 confirm half: pin-only on stock as the item says (2 ui pins, 7/7).objectuilive e2e pins for list-view/adhoc were run from a byte-identical scratch copy ofui/e2e/live; one case neither item cites ("Workbench: grid renders data columns even when the source view is hollow") failed 2/2 under memory pressure and was not investigated.
Checklist-accuracy findings for #27377
records-forms.list-view-capabilitiesA8 / steps[8] (andrecords-forms.bulk-select-all-matchingsteps[5]): still namePOST /api/v1/apps/showcase/recalcwith top-level_selectedIds; the console posts to the action door{params:{_selectedIds}}since Console: send a same-origintype: 'api'action click throughPOST /actions/:object/:actioninstead of fetching itstargetdirectly (ruling on #27506, step 3 of 3) #27611 (the door forwards flat). The re-point parked in wave 4 "once action door: a record-less aggregate api action that declares recordIdParam is refused 400 ("identifies its record by id"), so bulk "Recalculate Selection" never runs #29173 lands" is now owed.- RUNNER environment fact "
viewis overlay-allowed, a view PUT answers 2xx on stock showcase with no?package=" no longer holds (ADR-0146 D11): a bare view/email_template PUT answers 403 NOT_OVERRIDABLE; the working recipe isPOST /packages/com.example.showcase/ensure-customization, then PUT?package=com.example.showcase.customwithoverrides:{package,basedOn}. Affects list-view N0/N1 staging and email-template-render's admin-edit steps. ai.mcp-run-action-exposure-gate: A1.verify "the snapshot is the one exposed action" is stale (entries markedunavailableare part of the contract); step 6 should name a non-exposed action.api-backend.error-sentences-and-unique-violation-wire-codestep 0 offers/data/:object/batchas an equivalent door; it cannot answer the 400 the clause asserts.integration-system.connector-auth-kind-applicationstep 1:outputVariableis retired, bind with a flow variable; a reflecting echo writes secrets into flow run output, so runners should not grep run records.integration-system.email-template-render: steps 9(c) should add a non-string display-name probe; each rejected send writes asys_emailrowfailed; the "no locale" branch is unreachable from the HTTP door (notify gives the deployment defaulten); the by-name read ignores?locale=.automation.packaged-flow-clone-contract: the dropped-key list is 11 (overridesadded); the "In com.example.showcase.custom" text is on the designer header, the list row carries an "Added" mark (Studio: an item header keeps the item name readable; chips and tools collapse first #29693).automation.setup-packaged-automation-board: switch text is "Switched on/off for this deployment"; a copy opens on the base pillar's URL.studio-authoring.packaged-automation-studio-lockstep 3: the New dialog names no target, so it is provable only by creating a flow.platform-core.home-admin-cluster-links: an extra app-id canonicalisation hop from/apps/setup; "Keyboard shortcuts" is in the Help menu only inside an app.i18n.notification-localized-and-clearssteps[4]: a member's popover has no Activity tab.i18n.surface-matrix:automated.refstill says--maxWorkers=2; no field-help variant (N1 reached only incidentally); knownGaps[3] (live confirm specimen) is stale.records-forms.adhoc-filter-sort-builder: steps[5], A3 and N2 should name the account-menu sign-out path; A2's verify reads filter and sort but not search.studio-authoring.dashboard-widget-and-filter-typesA4 / steps[5]: add the wave-4 shape (Field filled, Options From begun) as its own case; sankey with two dimensions draws no root node.studio-authoring.draft-publish-lifecycleA3:GET ?mode=draftanswers 400; the no-overwrite proof is the next publish serving REV2.studio-authoring.no-entry-property-matrix: knownGaps[0] still says lockedBy "is never shown" (stale since fix(plugin-list): a list view locked by lockedBy alone shows its lock indicator #29312); thesortablevariant line should name its observable (header and Sort picker); compactToolbar/showRecordCount/resizable probe only at a non-default value; modalSize acts only on theisDefaultform; conditionalFormatting is stored as a CEL envelope, so A0's byte-equal compare must accept it.studio-authoring.expression-editorsfixture: a new object needssharingModelor publish refusessecurity-owd-unset.ux-conventions.disabled-control-reason: knownGaps[0] stale (Archive declares its own reason,record_headerplacement only); the automation Enabled toggle is enabled on read-only packages; variants 4 and 5 have no stock instance; variants[2] should name the ~all item page.ux-conventions.write-feedback: the Invite text is theoutcomeMessages.link_onlycopy; the per-group approval stays pending after one approval (readsys_approval_action).studio-authoring.access-permission-set-lifecycle: the samemanage_metadatarefusal answers PERMISSION_DENIED on clone and FORBIDDEN on the metadata PUT.- fix(app-shell): Studio opens no buffer over a dashboard draft the server refuses to read #29132's test
StudioDesignSurface.draftUnreadable-29015.test.tsxpre-registers the dashboard preview, so it cannot reach the ordering in R-6. - Environment: a fresh DB shows a "Set the default currency" / timezone prompt over the admin's first page (
workspace-timezone-prompt-decline).
Generated by Claude Code
Activity
objectstack-fleet commentedon Nov 3, 2026
domain:devx#1 · os-warren · session_01JQwxbZtZMhQkARKJtViA9U
Per-clause verdicts (1/3): ai · api-backend · automation · i18n.notification.
w4is the clause's verdict in the item's wave-4 record (named per item);w5is this run's verdict, every clause driven live at589049b0(pins were run as well where an item has one, and score only the layer they drive).ai.mcp-run-action-exposure-gate (wave 4: #28942)
ai: { exposed: true, description: … }"; REST re-read status/done/progress/updated_at unchangedobjectName): snapshot present, mark_done absent, all 37 aiExposed:true. Staged qa_ai_gated (manage_metadata): admin total 38 incl. it, Mei (osk_) 37 without it, snapshot in both; teardown DELETE 200 / GET 404api-backend.rest-metadata-config-contract (wave 4: #28929)
api-backend.error-sentences-and-unique-violation-wire-code (wave 4: #28929)
automation.packaged-flow-clone-contract (wave 4: #29002)
manage_metadatacapability.'; GET qa_anon/qa_aud → 404automation.setup-packaged-automation-board (wave 4: #29124)
manage_metadatacapability.' (exact)i18n.notification-localized-and-clears (wave 4: #28981)
notifications… retired object-first dialect'; GET after -› 404 (nothing stored)i18n.surface-matrix (wave 4: #29151)
objectstack-fleet commentedon Nov 3, 2026
domain:devx#1 · os-warren · session_01JQwxbZtZMhQkARKJtViA9U
Per-clause verdicts (2/3): i18n.surface-matrix · integration-system · platform-core · records-forms.
w4is the clause's verdict in the item's wave-4 record (named per item);w5is this run's verdict, every clause driven live at589049b0(pins were run as well where an item has one, and score only the layer they drive).integration-system.email-template-render (wave 4: #29151)
content. Did you meancontent→bodyHtml?'; {body} → unrecognized_keys namingbody(no prescription; not an alias) + bodyHtml required; name 'BadName' → invalid_format 'name must be dotted snake_case'integration-system.connector-auth-kind-application (wave 4: #29151)
platform-core.home-admin-cluster-links (wave 4: #28981)
records-forms.list-view-capabilities (wave 4: #29172)
records-forms.adhoc-filter-sort-builder (wave 4: #29172)
studio-authoring.draft-publish-lifecycle (wave 4: #29002)
object-› 422 INVALID_METADATA 'widgets.0 [unrecognized_keys]'; publish -› 404 NO_DRAFT; live GET still 'REV2 Tasks by Status'objectstack-fleet commentedon Nov 3, 2026
domain:devx#1 · os-warren · session_01JQwxbZtZMhQkARKJtViA9U
Per-clause verdicts (3/3): studio-authoring · ux-conventions.
w4is the clause's verdict in the item's wave-4 record (named per item);w5is this run's verdict, every clause driven live at589049b0(pins were run as well where an item has one, and score only the layer they drive).studio-authoring.expression-editors (wave 4: #29002)
record.est_hours * 1.1-› 'Valid CEL · Result type: Number';record.a + record.b-› 'Result type: Unknown — the engine cannot prove a single type. Wrap operands in double() / int() / string()…'. Engine validate_expression formula: inferredType number / unknown.record.est_hours * 1.2-› autosave PUT /meta/object/qrx_job 200 with returnType number; draft + live (after publish-drafts) f_formula returnType number (was text); f_line opened in inspector, not edited, keeps returnType text in the PUT body, draft and live; the unprovable a+b edit PUT carried no returnType.record.f_formula › 5reads 'Valid CEL' (aria-invalid null) and autosaves PUT 200 at ~1.6 s, error tier only after the re-read (~1.9 s), while the engine refuses it (publish 422 rls-predicate-unenforceable, INVALID_FIELD virtual formula field). 3/3 fresh loads.previous./record.-› 8 field options (organization_id…queue, cap 8);record.est-› [est_hours];previous.s-› [status];current_user./parent.-› none; bareest-› none; accepting insertedrecord.est_hours; bareest_hours › 5-› aria-invalid true + 'Writerecord.est_hours.' (engine validation: bare-reference).record.est_hours * 2 › 10, parse-fault USINGrecord.status ==and CHECKrecord.est_hours *: error finding + perm-autosave-held, 0 PUTs in 7 s. Formula-field USING: no held status, PUT /meta/permission/qrx_job_editor?mode=draft…&surface=studio 200 carrying the using;› 7PUTs again (200); a sibling CHECK edit is then held (0 PUTs). 3/3 fresh loads.record.status == 'open'+ {status:open} -› Allowed, + {status:closed} -› Denied;record.est_hours * 2+ {est_hours:4} -› 'Non-boolean result 8';record.owner_id == current_user.id+ owner u1/u2, user u1 -› Allowed / Denied. Direct @objectstack/formula ExpressionEngine.evaluate of same pairs: true/false/8/true/false.record.est_hours *aria-invalid, 0 PUTs; parse-fault rulerecord.est_hours ›banner 'Not saved yet: an expression on the field “Notes” has an error to fix…', 0 PUTs in 5 s; draft f_formula unchanged.current_user./parent.list none of qrx_job's fields; bareestwithheld from completion; bareest_hoursflagged error in formula and rule.studio-authoring.packaged-automation-studio-lock (wave 4: #29002)
studio-authoring.dashboard-widget-and-filter-types (wave 4: #29002)
studio-authoring.access-permission-set-lifecycle (wave 4: #29002)
studio-authoring.no-entry-property-matrix (wave 4: #29002)
ux-conventions.write-feedback (wave 4: #28981)
{ { record.title | default:'Task' }} marked done.and showed 'Build homepage marked done.' (exact interpolation). Invite User: the server answered link_only, so the action's declared outcomeMessages.link_only was shown verbatim with result.email: 'Invitation created for qa.r7.4482@example.com. Mail is not configured on this server, so no email went out. Use Copy Invite Link on the invitation to share it.' (successMessage 'Invitation sent to { { result.email }}' is the fallback since #27843)ux-conventions.disabled-control-reason (wave 4: #28981)
objectstack-fleet commentedon Nov 3, 2026
domain:devx#1 · os-warren · session_01JQwxbZtZMhQkARKJtViA9U
Close-out (RUNNER extraction obligation, checklist-test §5). Every FAIL has a disposition; each probe finding that passed the pm-dispatch filing gate (class ①, dedupe incl. closed) is extracted with a
QA-source:line.Extracted: #29892 · ai.mcp-run-action-exposure-gate · acceptance[4]
Extracted: #29891 · integration-system.email-template-render · acceptance[7]
Extracted: #29896 · studio-authoring.no-entry-property-matrix · acceptance[1], acceptance[2], negative[0]
Extracted: #29897 · ux-conventions.disabled-control-reason · acceptance[0], acceptance[1], acceptance[2]
Extracted: #29884 · studio-authoring.api-written-keys-survive-studio-save · observed beside the clauses (#29015 re-check)
Extracted: #29894 · api-backend.error-sentences-and-unique-violation-wire-code · observed beside the clauses
Extracted: #29895 · i18n.notification-localized-and-clears · observed beside the clauses
Parked-on: #27482 · studio-authoring.expression-editors · acceptance[2], acceptance[4], acceptance[6], negative[0] stale spec against the #26858 ruling; open card awaits a ruling (re-point vs a validate-only door)
Parked-on: #27377 · checklist-accuracy findings and fixture gaps (record body sections of those names)
Dispositions: R-1 stale spec (re-point card #29892; wave 4 parked it on #27377, which closed without the re-point). R-2 product defect, the #29152 clause still failing on the non-string display-name case #29250 did not reach. R-3 stale spec carried by open #27482, no new card (one existing card carries it). R-4 product defect on a row wave 4 recorded passing. R-5 product defect on a surface wave 4 did not read. R-6 (#29015 re-check, off-clause) product defect, independently verified, triaged p1 on #29884. The off-clause security finding has no card and no detail here; it went privately to the dispatching PM session.
Generated by Claude Code
docs(qa): re-point the wave-5 ledger lines and add the package export…