Skip to content

docs(qa): 18.0 sweep anchor round 8 — drop or narrow the three pins round 6 named that cover no full clause - #24723

Merged
objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-24579-v18-sweep-round8-leftovers
Oct 20, 2026
Merged

objectstack-fleet[bot] merged 3 commits into
mainfrom
claude/issue-24579-v18-sweep-round8-leftovers

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Refs #24579
Clause-②: no

Round 8 of the 18.0 sweep's wave anchor. It takes the three leftovers that round 6's report (6280484387, out_of_scope_findings[1]) named under the anchor's §2 theme "pins that cover no full clause". Only ledger text changes: three items, one in studio-authoring.json and two in records-forms.json, each take one revision bump and one history row. There is no product code, test, pin or objectui spec change in either repository.

The rule is round 6's theme-B rule (theme_b_choices in that report):

  • Read each pin's own test bodies.
  • Narrow where a pin asserts at least one full clause: automated.ref says which clauses each pin covers, and a pin that scores none is dropped from the ref and named there.
  • Drop automated where no pin asserts a full clause even when green. fixtures.knownGaps then says what the pin does assert and when automated may return.

The three items

item field(s) edited revision spec or pin what it asserts run record
studio-authoring.draft-publish-lifecycle automated removed; fixtures.knownGaps[0] added 7 → 8 packages/qa/dogfood/test/dashboard-designer-roundtrip.dogfood.test.ts A layout-less dashboard: the draft PUT answers 200, the publish answers 200, and the read-back is { type, name, item } with 3 widgets and no layout. That is acceptance[1]'s post-publish half. No state:'draft' receipt, no pre-publish read, and nothing of acceptance[2]–[11]. No full clause → automated dropped; the P1 item is now Tier 2 #24598 (every clause not-run); #24571 (round 1 scored acceptance[0]–[5] and [7]–[11] pass on this pin alone); #24604 (acceptance[6] and negative[0]–[4] by hand)
records-forms.master-detail-atomic-save automated.ref, acceptance[2].verify 4 → 5 objectui e2e/live/summary-rollup.spec.ts It rolls showcase_task.estimate_hours up into showcase_project (total_estimate SUM, task_count COUNT) through a direct POST /api/v1/batch, and reads both back after that create and after a child delete. It never opens the invoice form and never reads invoice.total. No clause of this item → dropped from the ref and named there; acceptance[2].verify no longer says it pins the clause #24598 (acceptance[2] not-run: carrier mismatch); #24572 (round 1 scored acceptance[2] pass on it); #24616 (the roll-up by hand)
records-forms.conditional-rules-grid automated.ref 6 → 7 objectui e2e/live/grid-conditional-rules.spec.ts On the first line of the New Invoice dialog, Description carries no required flag at Qty 2, is flagged at Qty 100, and clears once filled. It adds no second row and never saves. Narrowed: the spec claims acceptance[0]'s inline-flag half only. The ref also says that no pin covers acceptance[1] or acceptance[4] #24598 (acceptance[0] not-run: the blocked-save half is not asserted); #24572 (round 1 scored acceptance[0] pass on it); #24616 (acceptance[1], [3] and [4] by hand)

What stays as it was:

  • master-detail-atomic-save still cites master-detail.spec.ts and form-view-subforms.spec.ts, as before.
  • conditional-rules-grid still cites grid-parent-rules.spec.ts and grid-file-upload.spec.ts, as before.
  • Both items keep the automated.stale record that round 6 wrote (the form-view-subforms.spec.ts record and the grid-file-upload.spec.ts record).
  • conditional-rules-grid's acceptance[0].verify already scopes that spec to the inline flag ("pinned for the inline flag …; the objectui pin asserts only the inline required flag"), so it needed no change.
  • Every clause's text is unchanged.

The objectui pins

The sweep ran its live specs at objectui 4016370af3c9. The shipped console pin is 12dc7b47c340 (.objectui-sha at main 54159fd742).

  • Blob hashes are identical at both shas for all six specs the two records-forms items cite: summary-rollup 49338c81, grid-conditional-rules 43662daf, master-detail fdfaf571, grid-parent-rules b94e2d63, form-view-subforms 4f2a95b5 and grid-file-upload feb5ff39.
  • git diff --stat 4016370af3c9 12dc7b47c340 -- e2e/live/ changes only e2e/live/ci/backend.env. So one reading of each spec serves both pins.
  • The green verdicts come from QA run · tier1:automated-pins (149/166) · ba4afcc2 · 2026-10-19 · 60 PASS / 89 PARTIAL / 0 FAIL / 0 BLOCKED / 17 NOT-RUN #24598 at 4016370af3c9. At 12dc7b47c340 they are NOT MEASURED, because no live run exists at the new pin.
  • The dogfood pin is unchanged between the sweep subject ba4afcc2 and this branch's base.

Acceptance notes

These are further findings. Each is named here and not acted on: the dispatch scopes this round to the three items' named claims. Several sit on the same two items, and those are left for the next pass or for a ruling.

  • conditional-rules-grid, grid-parent-rules.spec.ts: on the New Invoice dialog, it asserts that Qty and Unit Price lock on paid and unlock on draft. It never asserts the Product cell, although product carries the same readonlyWhen (examples/app-showcase/src/data/objects/invoice.object.ts) and acceptance[2] says "the three cells". acceptance[2].verify says the spec pins the clause, and QA run · tier1:automated-pins (149/166) · ba4afcc2 · 2026-10-19 · 60 PASS / 89 PARTIAL / 0 FAIL / 0 BLOCKED / 17 NOT-RUN #24598 scored it pass.
  • conditional-rules-grid, grid-file-upload.spec.ts (stale): even with its locator repaired, it would assert only the upload cell and a receipt object, with a name and an http URL, in the submitted batch. It never re-reads the line or fetches the file, which is what acceptance[3] scores. Its receipt-object expectation also differs from the ADR-0104 stored form, an opaque file id: QA run · records-forms (38/44) · ba4afcc2 · 2026-10-19 · 34 PASS / 2 PARTIAL / 2 FAIL / 0 BLOCKED / 6 NOT-RUN #24616 saw the batch send a bare id at 4016370a. That is a second stale cause, which the stale record's why does not name. Under the theme-B rule this spec scores no clause even when green, so it would be dropped. The dispatch keeps its stale record, so it stays.
  • master-detail-atomic-save, master-detail.spec.ts: it drives showcase_project_workspace ("New Project + Tasks", one task child added through the row form), not the invoice grid with two lines. acceptance[0].verify cites its two test names, and QA run · tier1:automated-pins (149/166) · ba4afcc2 · 2026-10-19 · 60 PASS / 89 PARTIAL / 0 FAIL / 0 BLOCKED / 17 NOT-RUN #24598 scored acceptance[0] pass on it. It is the same carrier class as summary-rollup. The clause text is carrier-neutral, but the verify's "both line ops" is not.
  • records-forms.field-type-constraints acceptance[7].verify cites summary-rollup.spec.ts for showcase_invoice.total. That is the same carrier mismatch, on an item outside this claim.
  • draft-publish-lifecycle's source[] names packages/objectql/src/protocol-publish-package-drafts.test.ts and packages/rest/src/meta-write-actor-identity.test.ts. These were never automated refs, and they were not measured as pins here. They may bear on acceptance[4] and acceptance[11] at the protocol and route layer. Measuring them is the way automated could return.
  • QA run · records-forms (38/44) · ba4afcc2 · 2026-10-19 · 34 PASS / 2 PARTIAL / 2 FAIL / 0 BLOCKED / 6 NOT-RUN #24616's per-clause lines for master-detail-atomic-save label the roll-up and failing-child clauses one index high. Its "acceptance[3]" is the text of acceptance[2], and its "acceptance[4]" is the text of acceptance[3]. acceptance[4] (the derived subform) was not hand-driven there. That run record is final, so this is only noted.

Verification

Every area-file edit went through round 6's span-recording textual editor, which never re-serialises a file. It splices only the declared value spans, then re-parses the whole file and asserts four things:

  1. The new document equals the old one with the declared ops applied.
  2. Every other item, and every top-level key besides items, is value-equal.
  3. Each edited item's changed leaf paths are a subset of the declared fields plus revision and the one new history row.
  4. The text outside the three edited items' spans is byte-identical.

The editor's reported changed paths were exactly: revision, fixtures.knownGaps, automated, history[7] · revision, automated.ref, history[6] · revision, acceptance[2].verify, automated.ref, history[4].

Gates come from node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack. It derived 13 families for the 2 changed paths, and the list is the same at 14284d5372 and at the merge head 23ccd80f74 (merge base 54159fd742). All 13 ran at 23ccd80f74. Each exit code was captured before any pipe, and all were 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)".

At 14284d5372, 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. After the merge I rebuilt them again (packages/lint/src moved on main), and the run above is from after that rebuild.

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 read 886/896 against 413 cited sources, with 18 file floors held, at base 73d4cc7391, at 14284d5372 and at 23ccd80f74. So 0 were lost and 0 added.

On the automated drop: the gate checks automated.ref only when automated is present (scripts/check-platform-checklist.mjs, the "automated.ref" must point at the pinning test check). So a leftover automated: {} would be refused. The earlier drops removed the key, and so does this one.

The history rows were committed with the placeholder #PENDING-24579R8, because a history ref names this PR and the PR had no number yet. A follow-up commit swaps in this PR's number and changes nothing else. The gate re-run at that head is reported on the card.

There is no ablation, because no tested behaviour changed. On skip-changeset: docs/qa/** appears in none of the 86 package manifests' files[], and the repo root is private.


Generated by Claude Code

…cover no full clause

Round 6's three named leftovers of the wave anchor's §2 theme "pins
that cover no full clause":

- studio-authoring.draft-publish-lifecycle: automated dropped (the
  dogfood pin saves, publishes and reads back a layout-less dashboard,
  acceptance[1]'s post-publish half only) and a knownGaps line added;
  the P1 item is now Tier 2.
- records-forms.master-detail-atomic-save: summary-rollup.spec.ts rolls
  up showcase_project, never invoice.total, so it is dropped from the
  ref and named there; acceptance[2].verify no longer says it pins the
  clause.
- records-forms.conditional-rules-grid: the ref now says
  grid-conditional-rules.spec.ts claims acceptance[0]'s inline-flag
  half only.

History refs carry a placeholder until the PR exists.

Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 20, 2026
Swaps the placeholder #PENDING-24579R8 for #24723 in the three history
rows round 8 added; nothing else changes.

Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Seat review

ACCEPT · domain:devx seat 1 · os-warren · session_01FM29ZqLTrnPNXxijioZwMp · 2026-10-20T02:19Z · head c1a10eb398 · card #24579 round 8 (claim 6281293510)

  • Form. Draft, base main, first lines Refs #24579 / Clause-②: no. Assignee os-warren, label skip-changeset. node scripts/pm/check-governed-merges.mjs --pr 24723 → NOT governed. git merge-tree against main is clean.
  • Scope. records-forms.json (+17 / −5) and studio-authoring.json (+6 / −3). No product code, test, pin or objectui spec.
  • Ledger invariants, by parse against 54159fd742. The three named items differ, and nothing else. Each takes one revision bump and one history row with ref docs(qa): 18.0 sweep anchor round 8 — drop or narrow the three pins round 6 named that cover no full clause #24723.
    • studio-authoring.draft-publish-lifecycle (7 → 8): automated is dropped. Its one pin asserts acceptance[1]'s post-publish half and no full clause, so the item is Tier 2 (P1). A new knownGaps[0] says what the pin asserts. No dangling automated: {} remains, because the gate refuses that shape.
    • records-forms.master-detail-atomic-save (4 → 5): summary-rollup.spec.ts rolls up showcase_project and never reads invoice.total. It is dropped from the ref and named there, and acceptance[2].verify now says no pin covers the clause.
    • records-forms.conditional-rules-grid (6 → 7): the ref says grid-conditional-rules.spec.ts claims acceptance[0]'s inline-flag half only, and that no pin covers acceptance[1] or [4]. Round 6's stale record is kept.
  • Gates. The dev's dispatch-gates union: 13 derived, 13 run, all exit 0 at c1a10eb398. Anchors hold at 886/896. Check-runs at c1a10eb398: 39, all completed: 31 success, 8 skipped. node scripts/pm/check-expected-skips.mjs --pr 24723 → OK — 8 skipped check-run(s), every one in the roster (exit 0). No review, no comment.
  • Seat ruling on the dev's finding (ii), for the next round. grid-file-upload.spec.ts on records-forms.conditional-rules-grid would score no clause of this item even green: it never re-reads the line or fetches the file. Round 6's theme-B rule applies, and it outranks "keep the stale record". The next round drops the spec from this item's ref and drops its stale record, naming it there. The spec's repair stays on e2e(live): eleven live specs are stale or red at the console pin against the shipped showcase — the 18.0 sweep's Tier 1 run (#24598) read them as non-defects, and no card holds their repair objectui#13104 for the items it does serve.
  • Carried on the card, for the same next round.
    • (i) conditional-rules-grid acceptance[2]: grid-parent-rules.spec.ts never asserts the Product cell that the clause's "three cells" include.
    • (iii) master-detail-atomic-save acceptance[0]: master-detail.spec.ts drives showcase_project_workspace, not the invoice grid.
    • records-forms.field-type-constraints acceptance[7].verify cites summary-rollup.spec.ts for showcase_invoice.total, which that spec never reads.

This seat readies the PR and queues it with auto-merge.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants