Skip to content

Commit 81120ca

Browse files
docs(qa): 18.0 sweep anchor round 14 — drop the eleven automated.stale markers objectui 0b36ffa repaired, re-read at the console pin 616df65 (#24857)
Refs #24579 Clause-②: no Round 14 of the 18.0 sweep's wave anchor. Round 6 (PR #24697) marked eleven checklist items `automated.stale` because their objectui live specs were red or skipped at the console pin. objectui#13132 repaired those specs, and it landed as objectui `0b36ffa` (pointer `6284006658` on the anchor). PR #24829 then moved `.objectui-sha` to `616df6598b42`, which contains `0b36ffa`. This PR removes the eleven markers. Only ledger text changes, in `platform-core.json` (1 item), `records-forms.json` (8) and `studio-authoring.json` (2). Each edited item gets one `revision` bump and one `history` row. Each row names the pointer `6284006658`, objectui `0b36ffa` and the pin `616df6598b42`. There is no product code, test, pin, objectui spec, changeset or `RUNNER.md` change. After this PR, no item in any area file carries `automated.stale` (11 before, 0 after). The history rows were committed with the placeholder `#PENDING-24579R14`, because a row's `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. ## How each verdict was read Every verdict comes from the spec's bytes, not from the pointer's wording. - **objectui history.** I used a full, non-shallow read-only clone of objectui; the local checkout is shallow. - `merge-base --is-ancestor 0b36ffa 616df65` → exit 0. - Control: `12dc7b47c340` is an ancestor of `0b36ffa` → exit 0. - Reverse: `616df6598b42` is an ancestor of `0b36ffa` → exit 1. - **The pin at BASE.** `.objectui-sha` at BASE `41646a5788` is `616df6598b429d2b3687301a2041198928e68971`. - **What changed in `e2e/live/`.** - Between the old pin `12dc7b47c340` and the new pin `616df6598b42`: 11 specs modified, all by objectui#13132, plus one new spec (`declared-sharing-rules-reach-13091.spec.ts`) that no item here cites. - Between `0b36ffa` and `616df6598b42` (10 commits): nothing in `e2e/live/`. So each repaired spec has the same blob at `0b36ffa` and at the new pin. Each also has the same blob at the old pin and at `0b36ffa`'s parent, so the only change is #13132's. - **Live evidence.** The only live reading is objectui's own: the whole live suite measured 61 passed (11.0m) at `0b36ffa`, on the shipped showcase. That is objectui's measurement at `0b36ffa`, not a run at `616df6598b42`. No live run exists at the new pin, so the verdict there is **NOT MEASURED**. Ten objectui commits between `0b36ffa` and the pin touch product source, `app-shell`, `plugin-list` and `plugin-grid` among it, so green at `0b36ffa` does not carry over to the pin. - **Rule applied.** A spec that loses its stale marker keeps only the clauses its ref (or the stale record's `runnerRule`) already claimed for it. I re-read each one against what it asserts at the new pin. Where it asserts less, the ref narrows and says so. Nothing widens. ## Per item Blob ids are the spec at `12dc7b47c340` / `0b36ffa` / `616df6598b42`. Every spec below changed between the old pin and the new one, and objectui#13132 touched it, so every one is **repaired** and its marker goes. Every `stale.partial` named only repaired specs, so each whole `stale` block goes. | item | rev | spec | blobs | ref change | other fields | |:--|:--|:--|:--|:--|:--| | `platform-core.metadata-authoring-roundtrip` | 4 → 5 | `studio-record-page` | `181b2562c18d` / `3844a60ccd79` / `3844a60ccd79` | scoped to acceptance[2] (the PUT the Studio create issues: type, object, seeded `record:highlights`) | `acceptance[2].verify` | | | | `studio-object-designer` (F1, F4) | `5967807df335` / `58a7f1cbf024` / `58a7f1cbf024` | now says it scores no clause of this item | | | `studio-authoring.object-designer-roundtrip` | 6 → 7 | `studio-object-designer` (F1, F4) | `5967807df335` / `58a7f1cbf024` / `58a7f1cbf024` | scoped per case, as the old `runnerRule` had it: F3 → acceptance[1]'s designer half, F2 → acceptance[2]. **Narrowed:** F4 → acceptance[3]'s banner half only (one real option, not three; no publish, no meta read). F1 asserts no clause | `steps[3]` (its note that F4 collides with the no-option banner is no longer true) | | `studio-authoring.record-page-roundtrip` | 6 → 7 | `studio-record-page` | `181b2562c18d` / `3844a60ccd79` / `3844a60ccd79` | scoped to acceptance[0], carrier-neutrally (the spec binds `showcase_invoice`, the item `showcase_contact`) | `acceptance[0].verify`, `acceptance[1].verify`, `steps[3]`, `source[0]`, `source[1]` | | | | `studio-editor` (named in the stale `why`, never in the ref) | `e442b4c1a29e` / `19f9cc131654` / `19f9cc131654` | **not added**: the ref never named it, so acceptance[1] stays driven by hand rather than widening the ref | | | `records-forms.list-view-capabilities` | 5 → 6 | `user-filters` (4 of 6 cases) | `aa52b2b8de2a` / `ab50146bcfd0` / `ab50146bcfd0` | **narrowed:** acceptance[7]'s whitelist half only. The switcher case reads the six entries, switches only to Kanban and reads no records. The lookup quick-filter case is named as retired | | | | | `inline-edit-polish-2572` | `84e0677df02e` / `4cc1557d475f` / `4cc1557d475f` | **narrowed:** acceptance[5]'s PATCH half only, on a Project record page's inline edit. It never re-reads the row. `saved-view-filter` (`94a201c63a0a` at all three) keeps acceptance[1] | `acceptance[5].verify` (it said "same contract … pins") | | `records-forms.conditional-rules-header` | 3 → 4 | `field-conditional-rules` | `c37a93cdc839` / `4e8c3d6ebec3` / `4e8c3d6ebec3` | kept: acceptance[0]'s required marker, acceptance[2]'s client lock and acceptance[3], all asserted at the new pin; only the stale note goes | | | `records-forms.cascading-options` | 4 → 5 | `cascading-options` (re-filter case) | `648d5c917d19` / `5f65228948b7` / `5f65228948b7` | **narrowed:** acceptance[0]'s re-filter and clear halves only. The case never reads the province before a country is chosen. The server case keeps acceptance[1] | `acceptance[0].verify` | | `records-forms.master-detail-atomic-save` | 6 → 7 | `form-view-subforms` | `4f2a95b529f3` / `9485f378abd7` / `9485f378abd7` | scoped to acceptance[4], the clause the stale record sent to hand-driving | | | `records-forms.related-list-server-pagination` | 6 → 7 | `detail-related-list` | `48a1d10e59da` / `f12f7237fd6f` / `f12f7237fd6f` | kept: acceptance[2]; only the stale note goes | | | `records-forms.adhoc-filter-sort-builder` | 5 → 6 | `user-filters` (4 of 6 cases) | `aa52b2b8de2a` / `ab50146bcfd0` / `ab50146bcfd0` | kept: acceptance[4]. The `uf__tab` half now rests on the filter-tabs case on the Task Triage page, the `uf_FIELD` half on the dropdown case | | | `records-forms.cascading-multilevel-and-clear` | 4 → 5 | `cascading-options` (re-filter case) | `648d5c917d19` / `5f65228948b7` / `5f65228948b7` | **narrowed:** acceptance[0] without its submit half (the case never submits). The objectql pin's scope (acceptance[1] and [2]), which only the old `runnerRule` carried, moves into the ref unchanged | | | `records-forms.field-history-tracking` | 4 → 5 | `record-history-display` | `2c4d8a674f81` / `7ebc45106cff` / `7ebc45106cff` | now says it claims no clause of this item. It pins the History tab's display contract, which `negative[3]` assigns to `crud-roundtrip` | | Every edited item loses `automated.stale` and gains one `history` row; the table names every other field changed. **The retired case.** `user-filters`' lookup quick-filter case was deleted at `0b36ffa` because the shipped showcase declares no lookup user filter. The one item whose record cited it, `list-view-capabilities` (its stale `why`), no longer cites it, and its ref names the case as retired. No clause in any item rested on it. `adhoc-filter-sort-builder` counted it only inside "4 of 6 cases". **`screen-flow` (named "unchanged" in the pointer).** Its blob is `6713a1875a8e` at all three shas. No item in these three files cites it, so there is no marker to judge. ## Items left alone In the three claimed files: - `studio-authoring.custom-page-render-and-blocks` mentions "user-filters" as a product feature (`acceptance[4]`), not the spec or its retired case. - `records-forms.crud-roundtrip`, `form-view-gallery`, `concurrent-edit-conflict` and `conditional-rules-grid`, and `studio-authoring.first-run-loop`, cite a repaired spec but carry no `automated.stale`, so they are outside the claim (see Acceptance notes for two of them). Outside the three files: - `attachments-storage.inline-grid-receipt-cells` (`grid-file-upload`) and `automation.screen-flow-roundtrip` (`screen-flow`) carry no `automated.stale`. - `cli.json`, `access-security.json`, `approvals.json` and `RUNNER.md` are excluded by the claim. ## Mechanism hypotheses 1. **"Every item's stale specs are among the pointer's repaired specs, so every `stale` block goes." Holds.** The stale records name 10 distinct specs, and all 10 are in the pointer's repaired list. All 11 blocks go. 2. **"The pointer's spec names map one-to-one onto the specs the stale records cite, `studio-editor` a twelfth row that may appear in no item." Partly falsified.** - Of the pointer's 11 repaired specs, 10 appear in a stale record here. - `grid-file-upload` appears in none: `conditional-rules-grid` dropped its record at revision 8 (#24752). - `studio-editor` does appear in an item, though in no `automated.ref`: `record-page-roundtrip`'s stale `why`, `acceptance[1].verify` and `source[1]`. ## Acceptance notes - `records-forms.crud-roundtrip` `acceptance[4].verify` still says `record-history-display.spec.ts` pins the contract "on showcase Project". At `0b36ffa` the spec drives `showcase_account`, and it no longer exercises booleans or datetimes, which `auditHistoryDisplay.test.ts` pins (objectui#13132 R5). The item is outside this claim, so this is noted here and not edited. Carrier: #24579. - `studio-authoring.first-run-loop` `acceptance[0].verify` still says F1 "targets testids package-id-input / package-name-input that no source file declares". At `0b36ffa`, F1 creates the package through the Studio surface's switcher (`package-form-id-input`, `studio-pkg-chip`), so that note no longer describes the spec. The item is outside this claim. Carrier: #24579. - `studio-authoring.record-page-roundtrip` acceptance[1]: `studio-editor.spec.ts` asserts the clause's picker (Card, Section, Record details) carrier-neutrally, on a copy of `showcase_project_workspace`. Adding it to the ref would widen the ref, which this round's ruling forbids, so it is left for a later theme-B pass. Carrier: #24579. - `records-forms.master-detail-atomic-save`: `form-view-subforms.spec.ts` also asserts the batch's parent op with a `{$ref: 0}` child and the computed amount in the payload. The ref keeps only acceptance[4], as the ruling requires. Carrier: #24579. - Neither the README nor `check-platform-checklist.mjs` gives `stale` any schema; the validator checks only `automated.ref`. ## Verification **Editing.** 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 its declared fields, plus `revision` and the one new history row; - the text outside the edited items' spans is byte-identical. All three files passed, against 18 + 33 + 39 unedited items. **Merge.** `origin/main` `b3fc122f07` was merged at `647dfb355c`, cleanly. PR #24850 had merged by then (10:48:41Z) and touched only `cli.json`, `access-security.json` and `approvals.json`; `git merge-tree --write-tree HEAD 19eb546` (its head) → exit 0. No open PR touches the three files: I read all 12 open PRs' file lists, including all 1285 files of the Version Packages PR. **Gates.** Derived by `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at `647dfb355c`: 13 families for the 3 changed paths, against merge base `b3fc122f0`. All 13 ran at `647dfb355c`, each exit captured before any pipe: | command | exit | |:--|:--| | `node scripts/check-ci-filter-parity.mjs` | 0 | | `node scripts/check-closing-keyword-parity.mjs` | 0 | | `node scripts/check-closing-keyword-parity.mjs --self-test` | 0 | | `node scripts/check-comment-mask-corpus.mjs` | 0 | | `pnpm --filter @objectstack/lint run check:doc-formula-expressions` | 0 | | `pnpm check:cross-package-test-inputs` | 0 | | `pnpm check:doc-authoring` | 0 | | `pnpm check:driver-memory-census` | 0 | | `pnpm check:gitlink-declared` | 0 | | `pnpm check:nul-bytes` | 0 | | `pnpm check:platform-checklist` | 0 | | `pnpm check:refd-timer-probe` | 0 | | `pnpm check:watch-hint-literal` | 0 | - `check:doc-formula-expressions` first refused with exit 3, `PREREQUISITE NOT MET`, because `@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. - `--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)". - The rerun of the union on the placeholder-swap head is recorded in this round's report on #24579. **`check:platform-checklist`** runs in no per-PR CI, so this local reading is its evidence. "OK — 16 areas, 328 items (323 active, 1 planned)" at every reading: | tree | line citations | symbol anchors | |:--|:--|:--| | BASE `41646a5788` | 0 survive / 21 swept documents | 954/964, 428 cited sources, 18 file floors held | | this diff on BASE (`6cf48cdc7b`) | 0 / 21 | 954/964, 428 | | merged `main` `b3fc122f07` (these files at main) | 0 / 21 | 965/975, 430 | | head `647dfb355c` | 0 / 21 | 965/975, 430 | So this diff loses no anchor and adds none. There is no ablation, because no tested behaviour changed. **`skip-changeset`, re-measured.** None of the 73 non-private `package.json` manifests (of 86 tracked) has a directory containing `docs/qa`, and no `files[]` entry names it. The root package is private. Positive control: the same probe maps `packages/spec/src/index.ts` to `packages/spec/package.json`. --- _Generated by [Claude Code](https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent e5b3de0 commit 81120ca

3 files changed

Lines changed: 93 additions & 130 deletions

File tree

‎docs/qa/platform-checklist/areas/platform-core.json‎

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@
416416
"title": "Metadata authoring round-trip: draft → publish on a WRITABLE package; read-only packages and locked types are server-side refused",
417417
"since": "v16",
418418
"status": "active",
419-
"revision": 4,
419+
"revision": 5,
420420
"priority": "P1",
421421
"surface": "mixed",
422422
"personas": ["seeded admin (admin@objectos.ai / admin123)"],
@@ -452,7 +452,7 @@
452452
{
453453
"clause": "Studio's designer authors through the same pipeline: creating a record page issues PUT /api/v1/meta/page/<name> bound to its object and seeded from the default layout",
454454
"oracle": "network",
455-
"verify": "capture the PUT during Studio create. ⚠ Drive it by hand: the pin (objectui e2e/live/studio-record-page.spec.ts, which waits on exactly that request) is STALE against the current surface — it fills the Object control as an input when it is now a role=combobox button — see automated.stale",
455+
"verify": "capture the PUT during Studio create (pinned by objectui e2e/live/studio-record-page.spec.ts, which waits on exactly that request and asserts its body — see automated.ref)",
456456
"evidence": "the captured PUT"
457457
},
458458
{
@@ -482,16 +482,7 @@
482482
"traps": ["dispatcher-vs-hono-route", "stale-console-bundle"],
483483
"automated": {
484484
"kind": "api",
485-
"ref": "packages/qa/dogfood/test/package-first-authoring.dogfood.test.ts; objectui: e2e/live/studio-record-page.spec.ts, e2e/live/studio-object-designer.spec.ts",
486-
"stale": {
487-
"since": "2026-08-11",
488-
"observedIn": "#24598",
489-
"ref": "#7753 item 6",
490-
"partial": "objectui: e2e/live/studio-record-page.spec.ts (whole), and e2e/live/studio-object-designer.spec.ts cases F1 and F4 (no clause here rests on them)",
491-
"why": "STALE, NOT RED — studio-record-page.spec.ts fills the Object control as an input when it is now a `role=combobox` button, so it fails against the CURRENT surface rather than against a product defect. Re-measured at the 18.0 sweep: Tier 1 run #24598 ran it at the sweep's console pin 4016370af3c9, 0 passed / 1 failed; at the shipped pin 12dc7b47c340 the spec is byte-identical (the same blob at both pins), so it is still stale there. First observed by #7695 on 2026-08-11. The dogfood pin (package-first-authoring) is unaffected. studio-object-designer.spec.ts is NOT unaffected, as this marker used to say: #24598 ran it with F2 and F3 passing and F1 and F4 failing as stale cases (F1 opens an app no stock boot loads; F4 expects no banner for a picklist with no option source), and it is byte-identical at 12dc7b47c340 too. No clause here cites it. object-designer-roundtrip's 4th ref, from the same class, was already repaired (package-create moved to /_console/studio).",
492-
"runnerRule": "The Studio-designer clause here (clause 3, 'creating a record page issues PUT /api/v1/meta/page/<name>') must be driven by hand — capture the PUT in the browser — until the spec is re-pointed; do not cite its output and do not score its failure as this item's FAIL. Every other clause keeps its own oracle.",
493-
"ownedBy": "objectui — re-pointing the two specs is objectstack-ai/objectui#13104 (the family card for the eleven live specs that are stale or red at the console pin, both of these among them), the cross-repo half of #7753; reported, not edited from this repo"
494-
}
485+
"ref": "packages/qa/dogfood/test/package-first-authoring.dogfood.test.ts; objectui: e2e/live/studio-record-page.spec.ts (acceptance[2] ONLY: it creates a record page bound to showcase_invoice and asserts the captured PUT /meta/page body's type 'record', its object, and regions seeded with a record:highlights block), e2e/live/studio-object-designer.spec.ts (scores NO clause of this item: its cases drive the object designer and the Studio package switcher, and no clause here scores either)"
495486
},
496487
"source": [
497488
"packages/runtime/src/route-ledger.ts (PUT /meta/:type/:name, GET /meta/_drafts, GET /meta/:type/:name/published, POST /packages/:id/publish-drafts)",
@@ -503,7 +494,8 @@
503494
{ "revision": 1, "date": "2026-08-07", "change": "initial — grounds the Studio authoring pipeline end-to-end with both deny gates as first-class clauses", "ref": "claude/platform-test-checklist-ocwugl" },
504495
{ "revision": 2, "date": "2026-08-11", "change": "annotated the objectui e2e/live/studio-record-page.spec.ts half of this item's automated.ref as STALE (run #7695): it fills the Object control as an input when it is now a role=combobox button, so it fails against the current surface, not against a defect. The Studio-designer clause now says drive it by hand until the spec is re-pointed; the dogfood pin and studio-object-designer.spec.ts are unaffected. Re-pointing lives in objectui (cross-repo half of #7753 item 6)", "ref": "#7753" },
505496
{ "revision": 3, "date": "2026-10-16", "change": "steps[1], [3] and [7] and acceptance[0].verify and [5].verify re-pointed (checklist-accuracy findings of QA run #23939, wave #23878). A plain PUT /meta/view/NAME saves state=active, so the draft never appeared in /meta/_drafts — ?mode=draft is required — and a view's name must be qualified OBJECT.view (#23939 used showcase_task.os_qa_view_RUNID). The Studio half now names the create form (/_console/apps/showcase_app/metadata/page/new) and its 'list' default, which has to be set to 'record' for a record page. Not loosened: every clause still scores the same server reads", "ref": "#24036" },
506-
{ "revision": 4, "date": "2026-10-20", "change": "automated.stale.observedIn, partial, why and ownedBy refreshed — the carried note from round 6 of wave anchor #24579 (its report, comment 6280484387), the refresh round 6 made on studio-authoring.record-page-roundtrip in PR #24697. Tier 1 run #24598 re-measured studio-record-page.spec.ts red at the sweep's console pin 4016370af3c9 (0 passed / 1 failed), and the spec is byte-identical at the shipped pin 12dc7b47c340, so the marker first written from #7695 still holds; ownedBy names the family card objectstack-ai/objectui#13104. The why also said studio-object-designer.spec.ts was unaffected; #24598 ran its F1 and F4 red (F2 and F3 passed), and partial now says so. No clause changed", "ref": "#24717" }
497+
{ "revision": 4, "date": "2026-10-20", "change": "automated.stale.observedIn, partial, why and ownedBy refreshed — the carried note from round 6 of wave anchor #24579 (its report, comment 6280484387), the refresh round 6 made on studio-authoring.record-page-roundtrip in PR #24697. Tier 1 run #24598 re-measured studio-record-page.spec.ts red at the sweep's console pin 4016370af3c9 (0 passed / 1 failed), and the spec is byte-identical at the shipped pin 12dc7b47c340, so the marker first written from #7695 still holds; ownedBy names the family card objectstack-ai/objectui#13104. The why also said studio-object-designer.spec.ts was unaffected; #24598 ran its F1 and F4 red (F2 and F3 passed), and partial now says so. No clause changed", "ref": "#24717" },
498+
{ "revision": 5, "date": "2026-10-20", "change": "automated.stale removed, automated.ref scoped per objectui spec, and acceptance[2].verify's stale note rewritten — round 14 of wave anchor #24579 (18.0 sweep), on the objectui pointer 6284006658. objectui#13132 (objectui 0b36ffa) repaired both specs the stale record named, and the console pin moved to 616df6598b42 (PR #24829), which contains 0b36ffa. studio-record-page.spec.ts: blob 181b2562c18d at the old pin 12dc7b47c340, 3844a60ccd79 at both 0b36ffa and 616df6598b42; it now sets Page type to record and picks the object from the Object combobox. studio-object-designer.spec.ts: blob 5967807df335, then 58a7f1cbf024 at both; F1 and F4 repaired. objectui measured its whole live suite at 0b36ffa as 61 passed (11.0m) on the shipped showcase; no live run exists at 616df6598b42, so the verdict there is NOT MEASURED. Re-read at the new pin, the ref keeps only what this record claimed: studio-record-page.spec.ts asserts acceptance[2], the clause the stale record sent to hand-driving, and studio-object-designer.spec.ts, on which no clause here rests, now says so. The dogfood pin is unchanged. No clause changed", "ref": "#24857" }
507499
]
508500
},
509501
{

0 commit comments

Comments
 (0)