Skip to content

Commit 73d4cc7

Browse files
docs(qa): 18.0 sweep anchor round 6 — mark the objectui live specs stale at the console pin, and narrow or drop the pins that cover no full clause, in the UI-facing areas (#24697)
Refs #24579 Clause-②: no Round 6 of the 18.0 sweep's wave anchor. This PR covers the anchor's §2 themes "objectui live e2e is not green at its own pin" and "pins that cover no full clause", for the items round 4's report (`6278788942`) names in the four UI-facing area files. Only ledger text changes: 18 items in `studio-authoring.json` (2) and `records-forms.json` (16) take one `revision` bump each and one `history` row. There is no product code, test, pin or objectui spec change in either repository. `dashboards.json` and `search.json` hold no item in either theme, so they are unchanged. Each history row cites its run records: Tier 1 run #24598, and the area records #24572 / #24616 (records-forms) or #24571 / #24604 (studio-authoring). The rows were committed with the placeholder `#PENDING-24579R6`, because a history `ref` names this PR and the PR had no number yet. A follow-up commit on this branch swaps in this PR's number and changes nothing else. ## The console pin moved after the sweep The sweep ran its live specs at objectui `4016370af3c9`, the `.objectui-sha` of the sweep subjects `5b14b7f3` and `ba4afcc2`. Before this branch was cut, #24660 moved the pin to `12dc7b47c340`, so that is the shipped pin at `main` `92ce3af404` and at `045dae8f23`, which this branch merges. I re-read every spec at the new pin: - `git diff 4016370 12dc7b4 -- e2e/live/` changes only `e2e/live/ci/backend.env` (`OBJECTSTACK_VERSION` next.3 → next.5). No spec byte changed. Nothing in `e2e/live/` changed between `12dc7b47c340` and objectui `main` `90518cdb84` either. - So a red spec could have turned green at the new pin only through a change on the surface it drives. For each red spec I checked the cause the round-1 records name against objectui source at `12dc7b47c340` (and at `90518cdb84`), and against the showcase metadata at objectstack `92ce3af404`. The metadata is unchanged since `ba4afcc2`. **Every cause still holds, and no spec is green at `12dc7b47c340` that was red at `4016370af3c9`.** So each red spec gets a `stale` record. Its `why` cites the run at `4016370af3c9` and the re-reading at `12dc7b47c340`. - Specs that were green at `4016370af3c9` stay cited. Their bytes are identical at `12dc7b47c340`, but their verdict there is **NOT MEASURED**, because no live run exists at the new pin. | spec (objectui `e2e/live/`) | at `4016370af3c9` (#24598) | at `12dc7b47c340` (re-read) | cause (round-1 record) | |---|---|---|---| | `studio-object-designer.spec.ts` | 2 pass / 2 fail (F1, F4) | F1, F4 still stale | F4 expects no banner for a picklist that has no option source, which the spec choice-source rule refuses (`packages/spec/src/data/field.zod.ts` is unchanged between the objectstack builds the two pins consume, `2c9bf9430a11` and `f4755a68a797`). F1 opens `/apps/com.objectstack.studio`, which no stock boot loads (#24571) | | `studio-record-page.spec.ts` | 0 / 1 | still stale | fills the Object control as an input. On the page create path, the only change between the pins is ResourceEditPage's declaration-only gate for sharing rules (already marked stale from #7695) | | `user-filters.spec.ts` | 2 / 4 | 4 cases still stale | it expects pre-ADR-0053 showcase metadata: in-view tabs, four visualizations, `userFilters` on `tabular`. It also expects a `cell` role where the grid exposes `gridcell` (#24572) | | `inline-edit-polish-2572.spec.ts` | 0 / 1 | still stale | it expects an approval lock, but `manager_review` is deliberately `lockRecord: false`. The spec also consumes its own fixture (#24572) | | `field-conditional-rules.spec.ts` | 0 / 1 | still stale | it expects a disabled input. The UI renders read-only text instead. objectui `packages/fields` is unchanged, and the form renderer's only change is objectui#13055's hide-on-fault group gate (#24572) | | `grid-file-upload.spec.ts`, `form-view-subforms.spec.ts` | 0 / 1 each | still stale | the `'Line Items'` locator collides in strict mode with the dialog's screen-reader-only description, "Enter the record and its line items, then save." That text is unchanged at both shas (#24572) | | `cascading-options.spec.ts` | 1 / 1 (re-filter case red) | re-filter case still stale | it waits for `md-form-submit`, which only MasterDetailForm renders, on `showcase_cascade`. That object has no child object, so its form is a flat ModalForm (#24572) | | `detail-related-list.spec.ts` | 0 / 1 | still stale | it waits for `?recordId=`, but a row click opens `/record/ID`. The navigation code and `packages/spec/src/data/record-surface.ts` are unchanged (#24572) | | `record-history-display.spec.ts` | 0 / 0 / 1 skipped | still skips | it runs only against app-todo, on the premise that the showcase has no `enable.trackHistory` object. That premise is stale: `showcase_account` has one | | `saved-view-filter`, `required-when-submit`, `grid-conditional-rules`, `grid-parent-rules`, `master-detail`, `summary-rollup`, `list-row-action-cel`, `action-modal` | pass | NOT MEASURED (bytes identical) | — | `screen-flow.spec.ts` (red at `4016370af3c9`) belongs to `automation.json`, which is not in this claim. ## Theme A — objectui live e2e is not green at its own pin I used the shape `studio-authoring.record-page-roundtrip` already carries: `automated.stale` with `since` / `observedIn` / `ref` / `why` / `runnerRule` / `ownedBy`. Where green refs sit beside the stale one, the record also takes `stale.partial`, which is `platform-core.metadata-authoring-roundtrip`'s precedent. Each `runnerRule` says which green specs a runner may still cite, and which clauses must be driven by hand. | item | field(s) edited | revision | run record | spec | verdict at pin | |---|---|---|---|---|---| | `studio-authoring.object-designer-roundtrip` | `automated.stale` | 5 → 6 | #24598; #24571 / #24604 | `studio-object-designer.spec.ts` F1, F4 | red at `4016370af3c9`, stale at `12dc7b47c340`; F2 / F3 green | | `studio-authoring.record-page-roundtrip` | `automated.stale.observedIn`, `automated.stale.why` | 5 → 6 | #24598; #24571 / #24604 | `studio-record-page.spec.ts` | red / stale at both (`observedIn` #7695 → #24598) | | `records-forms.list-view-capabilities` | `automated.stale` | 4 → 5 | #24598; #24572 / #24616 | `user-filters.spec.ts` (4 of 6), `inline-edit-polish-2572.spec.ts` | red / stale at both; `saved-view-filter` green | | `records-forms.conditional-rules-grid` | `automated.stale` | 5 → 6 | #24598; #24572 / #24616 | `grid-file-upload.spec.ts` | red / stale at both; the other two green | | `records-forms.cascading-options` | `automated.stale` | 3 → 4 | #24598; #24572 / #24616 | `cascading-options.spec.ts` re-filter case | red / stale at both; server case green | | `records-forms.cascading-multilevel-and-clear` | `automated.stale` | 3 → 4 | #24598; #24572 / #24616 | `cascading-options.spec.ts` re-filter case | red / stale at both; objectql pin green | | `records-forms.master-detail-atomic-save` | `automated.stale` | 3 → 4 | #24598; #24572 / #24616 | `form-view-subforms.spec.ts` | red / stale at both; the other two green | | `records-forms.field-history-tracking` | `automated.stale` | 2 → 3 | #24598; #24572 / #24616 | `record-history-display.spec.ts` | skipped at both; the plugin-audit pins green | ## Theme B — pins that cover no full clause I applied one rule to each item round 4 named. The test is what the pin's own test bodies assert, read at `4016370af3c9`. Every one of these pins is byte-identical at `12dc7b47c340`. - **Narrow** where a pin asserts at least one full clause. In that case `automated.ref` says which clauses each pin covers, in the round-2 `scope-depth-asymmetry` shape. A pin that scores none of the item's clauses is dropped from the ref, and the ref names it. - **Drop `automated`** where no pin asserts a full clause, even when green. The item's `fixtures.knownGaps` line that said "AUTOMATION IS PINNED IN THE objectui REPO" now says that no pin covers a full clause, what each adjacent pin does assert, and when `automated` may come back. | item | field(s) edited | revision | run record | pin | verdict at pin | choice | |---|---|---|---|---|---|---| | `records-forms.adhoc-filter-sort-builder` | `automated.ref`, `automated.stale` | 4 → 5 | #24598; #24572 / #24616 | `user-filters.spec.ts`; `saved-view-filter.spec.ts` | user-filters 2 / 4 (stale at both), saved-view-filter green | narrow: user-filters → acceptance[4] only (the uf_FIELD half green, the uf__tab half stale). saved-view-filter pins a saved filter alone, not the merge in acceptance[0], so it is dropped | | `records-forms.conditional-rules-header` | `automated.ref`, `automated.stale`, `acceptance[4].verify` | 2 → 3 | #24598; #24572 / #24616 | `list-row-action-cel.spec.ts` (+ theme A `field-conditional-rules`) | green; field-conditional-rules stale at both | narrow: required-when-submit → acceptance[0]. list-row-action-cel gates the task list's Mark Done, not the invoice's Edit / Delete, so it is dropped, and acceptance[4].verify no longer says it pins the clause | | `records-forms.related-list-server-pagination` | `automated.ref`, `automated.stale` | 5 → 6 | #24598; #24572 / #24616 | `detail-related-list.spec.ts` | stale at both | narrow + stale: when green it pins acceptance[2] alone | | `records-forms.concurrent-edit-conflict` | `automated.ref`, `acceptance[4].verify` | 3 → 4 | #24598; #24572 / #24616 | `occSave.test.tsx`; `inline-edit-polish-2572.spec.ts` | occSave green; inline-edit-polish stale | narrow: occSave → acceptance[3] and acceptance[1]'s modal half. inline-edit-polish saves one field with no If-Match and no conflict, so it scores no clause here even when green. It is dropped, not marked stale | | `records-forms.import-job-undo-cancel` | `automated.ref`, `acceptance[0].verify` | 5 → 6 | #24598 (not run); #24572 / #24616 | `import-console-undo.spec.ts`, `import-undo.spec.ts` | not run (self-gated, own configs) | narrow: acceptance[1], acceptance[3] and acceptance[0]'s undoable-job half. Neither spec reads the per-row results, and nothing covers acceptance[2] (cancel) | | `records-forms.action-param-widgets` | `automated.ref` | 2 → 3 | #24598; #24572 / #24616 | `action-modal.spec.ts` (objectui half) | green | narrow: the objectui half only opens a task's Edit modal and dismisses it, so it is dropped. The dogfood pin → acceptance[2] | | `records-forms.action-location-matrix` | `automated` removed, `fixtures.knownGaps[0]` | 12 → 13 | #24598; #24572 / #24616 | `list-row-action-cel.spec.ts`, `action-modal.spec.ts` | green, adjacent | drop → Tier 2 (P1) | | `records-forms.calendar-interactions` | `automated` removed, `fixtures.knownGaps[0]` | 3 → 4 | #24598; #24572 / #24616 | `CalendarView.dnd.test.tsx` | green, geometry only | drop → Tier 2 (P1) | | `records-forms.grid-personalization` | `automated` removed, `fixtures.knownGaps[0]` | 5 → 6 | #24598; #24572 / #24616 | `groupedPagination`, `groupedBooleanLabel`, `inlineEditPersistence` tests | green, adjacent | drop → **Tier 3** (P2) | | `records-forms.lookup-picker-create-new` | `automated` removed, `fixtures.knownGaps[0]` | 3 → 4 | #24598; #24572 / #24616 | `LookupField.dependsOn`, `RecordPickerDialog.filterOptions` tests | green, adjacent | drop → **Tier 3** (P2) | Why this rule, on the four axes: - **Business need.** The reader is the next sweep. #24598 measured these pins and they produced no clause verdict: every clause was not-run. #24616 then had to drive the same items by hand. - **Long-term fit.** The ledger claims only what a pin asserts. Extending a pin is objectui's test change and is outside this claim. When a pin is extended, re-adding `automated` is the reverse edit. - **AI-error prevention.** A Tier 1 label on a pin that proves nothing is declared-but-not-enforced coverage. Naming the clause per pin makes an over-claim visible. Dropping the label removes the claim instead of tolerating it. - **No scope creep.** No new key, gate or pin was added. Both shapes already exist in the ledger. One consequence differs from the dispatch's hypothesis. A dropped P2 item becomes Tier 3 (deferred unless a change touches it, checklist-test skill §1), not Tier 2. That applies to `grid-personalization` and `lookup-picker-create-new`. ## Items left alone - `dashboards.json`, `search.json`: no item in either theme. They cite no objectui live spec, and #24598 names none of their pins as clause-free. - `platform-core.metadata-authoring-roundtrip` cites the same stale `studio-record-page.spec.ts`. It is in round 5's file (landed in #24687) and still reads `observedIn` #7695. - `attachments-storage.inline-grid-receipt-cells` (`grid-file-upload.spec.ts`) and `automation.screen-flow-roundtrip` (`screen-flow.spec.ts`) are in the same theme, but they are in round 5's files. - `studio-authoring.draft-publish-lifecycle`: #24598 scores it NOT-RUN because its pins cover no full clause, but round 4's §2 list does not name it, so it is outside this claim. - Green specs that cover a clause only in part, or on another carrier, stay cited in theme-A-only items, per the ruling that a spec green at the pin stays cited: `summary-rollup.spec.ts` on `master-detail-atomic-save` (it rolls up `showcase_project`, not `invoice.total`, though acceptance[2].verify says it pins the clause), and `grid-conditional-rules.spec.ts` on `conditional-rules-grid` (the inline flag only). These are candidates for the next theme-B pass. - `list-view-capabilities`' dogfood half keeps round 4's "scores NO clause" annotation as it landed. - `integration-system.json` (open PRs) is excluded. §4 fixture gaps are not this round's work. ## Acceptance notes - `RUNNER.md` says "23 items carry an `automated.ref` that lives ENTIRELY in the `objectui` repo". I measured 28 on `main` before this PR, and 24 after it. `RUNNER.md` is outside this claim, so the count is recorded here and not edited. - `grid-parent-rules.spec.ts` stays cited as green. The surface it drives, MasterDetailForm's header-record read, was rewritten between the pins (objectui#13062's repair, `bc98626e`), so its verdict at `12dc7b47c340` is NOT MEASURED. - No objectui card tracks any of the stale specs. I scanned all 5257 objectui issues (numbers 7–13097, every state) for each spec name and for the causes above, and found none that covers them. The anchor carries the finding for the PM to file. ## Verification Every area-file edit went through a scripted span editor that never re-serialises a file. It splices only the declared value spans, then re-parses and asserts four things: the document equals the old one with the declared ops applied; every other item and every top-level key is value-equal; each edited item's changed leaf paths are a subset of the declared fields plus `revision` and the one new history row; and the text outside the 18 edited items' spans is byte-identical. Gates come from `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, which derived 13 families for the 2 changed paths, against merge base `045dae8f2`. All 13 ran at head `70963fb0c2`, each exit captured before any pipe, all exit 0: - `node scripts/check-ci-filter-parity.mjs` - `node scripts/check-closing-keyword-parity.mjs` - `node scripts/check-closing-keyword-parity.mjs --self-test` - `node scripts/check-comment-mask-corpus.mjs` - `pnpm --filter @objectstack/lint run check:doc-formula-expressions` - `pnpm check:cross-package-test-inputs` - `pnpm check:doc-authoring` - `pnpm check:driver-memory-census` - `pnpm check:gitlink-declared` - `pnpm check:nul-bytes` - `pnpm check:platform-checklist` - `pnpm check:refd-timer-probe` - `pnpm check:watch-hint-literal` `--ran` reconciles: "13 derived famil(ies) accounted for — 13 run, 0 NOT-MEASURED (a DERIVED zero — all 13 recorded an exit code and none of them is 3)". `check:doc-formula-expressions` first refused with exit 3, a prerequisite: `@objectstack/formula` and `@objectstack/lint` were not built. I built both under the shared verify lock (VERDICT command-exit 0) and the rerun exited 0. `check:platform-checklist` runs in no per-PR CI, so this local reading is its evidence: > check-platform-checklist: OK — 16 areas, 327 items (322 active, 1 planned) Symbol anchors are 886/896 at `045dae8f23` and 886/896 at head, against 413 cited sources, with 18 file floors held both times. At the original base `92ce3af404` they were 875/885 before and after this diff. So 0 anchors were lost and 0 added. There is no ablation, because no tested behaviour changed. `skip-changeset`: `docs/qa/**` ships in none of the 86 package manifests' `files[]`, and the repo root is private. --- _Generated by [Claude Code](https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1c1144f commit 73d4cc7

2 files changed

Lines changed: 237 additions & 56 deletions

File tree

0 commit comments

Comments
 (0)