Repository navigation
qa(checklist): records-forms — 60 ledger edits from the 18.2.0 release sweep (#25807) #25846
Description
Filing gate: maintainer-directed task. Filed by the 18.2.0 release-assessment thread · session_01G3h9iZTpL8aCiXbfsp8H5u. ⛔ Not a claim, ⛔ not dispatched.
Maintainer's words (project thread, 2026-10-25, verbatim): 22:54Z 「约 300 条清单准确性问题:是不是应该开卡?」, then 22:55Z 「写issue,不派发」.
Parent: wave anchor #25807 (18.2.0 release test sweep). RUNNER's extraction obligation parks checklist-accuracy findings on the anchor; the maintainer asked for them as issues, so the wave's findings are split into one card per ledger file and the anchor links each card. This is not a release blocker, so it carries no target:v18.
Reader who acts: the lane owning docs/qa/platform-checklist/** (domain:devx). Dedupe (open and closed): no card holds these lines; the 18.0 precedent closed its accuracy rows on its anchor #24579.
Wanted
For each line below, edit docs/qa/platform-checklist/areas/records-forms.json: revise the item's text, bump its revision, and append a history entry citing the run record the line comes from. Keep pnpm check:platform-checklist green. A line that turns out to describe a product defect rather than stale text gets its own card instead of a ledger edit.
Findings (60)
From #25812 — priority:P0, 23 items, at 6679644a, pin b41ed7f68956
records-forms.crud-roundtrip: the owner half of acc[6] says "not yet run" — it was replayed this run.
From #25815 — release-18.2.0-tier1, 156 items, at 6679644a, pin b41ed7f68956 (clause labels: aK = acceptance[K], nK = negative[K])
records-forms.action-param-widgetsref-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-buildera4: 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-builderref-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-matchinga1/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 levelrecords-forms.bulk-select-all-matchinga3/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 browserrecords-forms.cascading-multilevel-and-cleara1: 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-clearref: 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-optionsa1/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-stampsa1/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-conflicta3: 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-conflicta1: 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 pinrecords-forms.concurrent-edit-conflictpins: 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 clauserecords-forms.conditional-rules-gridref-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 itemrecords-forms.conditional-rules-gridall 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 onlyrecords-forms.conditional-rules-headera2: 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 paidtaxRatetoBeEnabled() and the read-only group toHaveCount(0) (objectui#13436 — INSERT is exempt from readonlyWhen); no pin drives an edit form of a paid invoicerecords-forms.conditional-rules-headerpins: 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 clauserecords-forms.conditional-rules-headera0/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 visibilityrecords-forms.delete-behavior-matrixa0–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-matrixa5: packages/spec/src/data/field.test.ts ('deleteBehavior: set_null on master_detail is a parse-time rejection') pins the FieldSchema acceptsdeleteBehavior: 'set_null'on amaster_detail, and the engine silently resolves it tocascade#9689 parse seam at schema level and is not in the ref; the verify's PUT refusal has no pin.records-forms.encrypted-field-behaviora0: 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-trackinga2: 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 pinrecords-forms.field-type-constraintsa5/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 namesrecords-forms.field-type-constraintsref names field-zoo.matrix.ts — a data module, not a test file (correctly absent from pins)records-forms.field-type-constraintsa0-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 refrecords-forms.field-type-matrixref 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-matrixa5/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 assertedrecords-forms.field-type-matrixa4: f_autonumber is a 'present' check (non-null) — 'server-assigned' is inferred from it not being writtenrecords-forms.field-unique-enforcementa4: 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 writtenrecords-forms.field-unique-enforcementa0-a3/n0-n2: ref correctly says no pin drives a REST doorrecords-forms.form-dirty-guarda0/n0: discardGuard.test.tsx covers the X close + Cancel + pristine paths for ModalForm/DrawerForm, but no Escape or backdrop-click caserecords-forms.form-dirty-guarda2: 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 countrecords-forms.gantt-interactionsa1/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 themrecords-forms.gantt-interactionsref 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-cancela3: 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/jobsrecords-forms.import-job-undo-cancela1/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 nothingrecords-forms.import-wizard-encoding-and-hintspins are objectui files (repo objectui → /home/claude/ou-pin); they score a0–a2 only when the objectui pin worktree's vitest runs themrecords-forms.list-view-capabilitiesa1: 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 capturedrecords-forms.list-view-capabilitiesshowcase-search.dogfood.test.ts is in the ref but, as the ref itself says, scores no clause of this itemrecords-forms.master-detail-atomic-savepins 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-savea0: 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'srecords-forms.object-hook-lifecyclea0: 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 undrivenrecords-forms.object-hook-lifecyclea6/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 POSTrecords-forms.object-hook-lifecycleref 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 filerecords-forms.predicate-relationship-traversala3 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 oraclerecords-forms.record-clone-contractref 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 enginerecords-forms.record-clone-contracta3: the verify names 'the Check whethersys_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 refrecords-forms.record-clone-contractref 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 themrecords-forms.record-discussion-mentionsa5: 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 refusalrecords-forms.record-discussion-mentionsa6/n3: capability-gate-update-verb.test.ts is engine-level (ObjectQL + installAuditWriters), as the clause itself saysrecords-forms.record-discussion-mentionsa8: 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 itrecords-forms.record-discussion-mentionsa9: mention-recipient-gate.integration.test.ts is engine-level; the ref itself says partial at mostrecords-forms.record-edit-undoUndoManager.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 explicitlyrecords-forms.view-type-gallerya5: 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-deletea1: advisory-write-answer.test.ts calls ObjectStackProtocolImplementation createData/updateData in-process — the REST PATCH body is not observedrecords-forms.write-answer-advisories-rollback-and-tree-deletea2/n0: engine-after-hook-abort-unit.test.ts drives ObjectQL directly; no HTTP pin for the aborting afterInsertrecords-forms.write-answer-advisories-rollback-and-tree-deletea3: scored on the referenceless tree fixture (rtl_*), not a showcase object — acceptable since the clause names no carrier
From #25817 — release-18.2.0-manual-set, 29 items, at 6679644a, pin b41ed7f68956
- records-forms.action-location-matrix:
- The related-list header renders the list_toolbar Reassign…, as in 18.1.
- The sidebar "More actions" shares its accessible name with the header ⋯, a click trap; scope the click to
main. - The quick bar names its actions explicitly, so recalc_estimate is absent there by page authoring.
Acceptance
- Every line above is either applied (item revised,
revisionbumped,historycites the record) or answered on this card with the reason it was not. pnpm check:platform-checklistis green.- The PR links this card and [sweep] v18.2.0 release test sweep #25807.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1 · 2026-10-26T12:26Z
Session:
session_01Q4MDXRbEJCNdPAP4SiXwp9(devx seat 2) · card threadsession_01RtaemQoSDLDAyNK1TyVh2PAccount:
os-steveBranch:
claude/project-thread-na4l37(the harness-pinned branch of the card thread; it names no issue, so this claim is the identity record)Worktree:
objectstack-issue-25846Domain:
domain:devxSeat:
domain:devx#2(seat post #20163)File surface:
docs/qa/platform-checklist/areas/records-forms.jsononly (stop on breach; explain in the report)Container & model: M,
mode:thread,model: default tier (TIER_DEFAULT, from dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: none
Premise: holds (action surface
git log origin/mainon the file since filing: main touched the file after filing: #26028 (2026-10-26T10:03Z), re-read every line against current main; the dev re-reads each line against main first)Serial constraints cleared: own ledger file only; seat 1 holds #25835 / #25836 on other files; #26035 left the retired objectui pin wording in these files to these cards; no other
Claim:names this fileGenerated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25846, "status": "done", "branch": "claude/project-thread-na4l37", "pr": "https://github.com/objectstack-ai/objectstack/pull/26125", "head": "82952908", "session": "session_01RtaemQoSDLDAyNK1TyVh2P", "premise_still_valid": true, "summary": "34 records-forms items revised, one revision bump and one history row each (ref #25846, citing #25812 / #25815 / #25817). 55 of the 60 card lines applied; 5 answered without an edit (below). The retired pin wording (.objectui-sha, pnpm objectui:build) and the 13 objectui-pinned-automation knownGaps copies in this file now point at ui/ and pnpm console:build. No line was a product defect.", "not_applied": [ "field-unique-enforcement a0-a3/n0-n2: confirms the ref as written", "object-hook-lifecycle '83 tests' vs 79: refuted, 79 it() call sites include a four-row it.each in hook-binder.test.ts, so 83 tests run", "record-discussion-mentions a6/n3: confirms clause and ref text (engine-level pin)", "record-discussion-mentions a9: confirms the ref's 'partial at most'", "write-answer-advisories-rollback-and-tree-delete a3: the line itself rules the rtl_* fixture acceptable (clause names no carrier)" ], "files_changed": ["docs/qa/platform-checklist/areas/records-forms.json"], "line_budget": "400 changed lines (+302 / -98) in 1 file, against the 3000 human-merge threshold: under", "tests": "n/a: docs-only, no package touched, so no build closure or package test is owed", "gates": "at 82952908: pnpm check:platform-checklist exit 0 (OK, 16 areas, 329 items, symbol anchors 986/996, 18 file floors held); dispatch-gates --commands derived 13 families, all 13 exit 0 (check:doc-formula-expressions first exit 3 on an unbuilt prerequisite, then exit 0 after turbo build of @objectstack/formula + @objectstack/lint under os-verify-lock, VERDICT command-exit 0); --ran: 13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN (derived zero, every line carries its exit code); check-platform-checklist --changed-from origin/main exit 0. CI check-runs: in_progress at report time", "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "mcp_calls": "5: GitHub MCP issue_read x5 (get #25846, get_comments #25846 x2, get #26052, get #26035); no MCP write", "api_writes": "2 relay strokes: pr_create (POST /repos/objectstack-ai/objectstack/pulls draft, POST issues/26125/assignees, POST issues/26125/labels skip-changeset), comment (POST issues/25846/comments, this report); plus 2 git pushes (not REST)", "deviations": [ "two git pushes, not one: the second commit (82952908) carries devx seat 2's mid-run direction to rewrite the 13 objectui-pinned-automation knownGaps copies, folded into each item's single revision bump", "no reviewer request on the PR: the session asks for one through a GitHub MCP write, and the dispatch forbids MCP writes; assignee os-steve was set through pr_create" ], "open_questions": [], "out_of_scope_findings": [ "carrier: #26035 · RUNNER.md's objectui-pinned-automation standing fact still says this checkout holds none of the objectui specs and sends runs to an objectui checkout at the pinned revision; the same knownGaps copy remains on items in attachments-storage.json (1), automation.json (2) and studio-authoring.json (4). Noted in the PR's Acceptance notes, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
devx seat 2 · review: ACCEPT → PR #26125 comment 6417003079. Landing: ready + merge queue once every check on the reviewed head is green or skipped.
Generated by Claude Code