Skip to content

docs(qa): 18.0 sweep round 12 — QA round 3's api and build checklist-accuracy findings outside cli.json: refs narrowed per clause, stale steps and wording corrected - #24824

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

objectstack-fleet[bot] merged 10 commits into
mainfrom
claude/issue-24579-v18-sweep-round12

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Refs #24579
Clause-②: no

Round 12 of the 18.0 sweep's wave anchor (claim 6286008102). It applies QA round 3's surface:api findings (#24779) and surface:build findings B1–B4 (#24787) outside cli.json, #24786's C8, round 11's carried finding 3, and the draft-read spelling sweep.

Checklist text only. 18 items in 8 area files, each with one revision bump and one history row. No product code, test, pin, changeset text or RUNNER.md changed. cli.json and the three items PR #24811 edits are untouched.

  • Base 307ce4c4b4. origin/main c56115bf96 is merged in 0f2f4de9f1, which touches no docs/qa/** file.
  • Every finding was re-read in the code at base before it was written.
  • Each area file was edited by a script that re-parses it and asserts against base: only the target items changed, and only at the declared fields, plus revision +1 and one appended history row. Every other item stays deep-equal.
  • The new history rows' ref is written as this branch's name. The commit after this body fills it with this PR's number.

Findings applied

# record · finding item field old → new read at base
1 #24779 integration-system.connector-declarative-boot automated.ref listed partial-clause coverage → negative[0] ONLY; names the mcp-variant and state-only halves; acceptance[0]–[5] and negative[1] are driven by hand showcase-declarative-mcp.dogfood.test.ts: two cases, showcase_erp_catalog absent (n0); a0–a2 asserted as halves only
2 #24779 approvals.email-action-token-door automated.ref claimed acceptance[4]'s pages and acceptance[5]'s converse → "Full clauses: acceptance[0]–[3] only"; [4] pinned in halves (no page-level pin for the not_pending / not_approver summary rows); [5] has no pin remind() mints no token and attaches no link; issueActionTokens has test callers only; no step harvests a token from sys_notification.payload.actions (the three ledger hits state its absence). The token source is already named in fixtures.requires[1]: the pins' in-process mint
3 #24779 attachments-storage.field-accept-maxsize-server-enforced automated.ref clauses 0/1/4/5/6 → 0/1/3/4/5/6, adding clause 3 by test name file-reference-lifecycle.test.ts › 'accept / maxSize enforcement' › 'refuses an UPDATE onto an oversize file with the same envelope, leaving the record and both files as they were' (refusal envelope; record and both files unchanged)
4 #24779 attachments-storage.read-inherits-parent-rls acceptance[3] clause, verify, evidence "a pre-scan past the 2000-candidate cap … the cap logs a warning" → no pre-scan for an ordinary parent, every visible row served with a true total and no cap warning; the bounded 2000-row probe and its warning only for ADR-0139 D5's three classes and the two whole-read states ADR-0139 D4/D5 (E7); attachment-access-hooks.ts installAttachmentReadVisibility docblock, READ_SCAN_LIMIT; the scan-cap pin asserts no -row cap line
5 #24779 access-security.sharing-rules-widen steps[0] "boot showcase isolated" → own port and file DB (dogfood §0) in the stock single posture; no clause needs OS_TENANCY_POSTURE=isolated resolveTenancyPosture defaults to single; RUNNER's "isolated boot" is the own-port, own-DB boot
6 #24779 identity-auth.self-service-password-reset fixtures.requires[0], knownGaps[0], steps[1], acceptance[0] verify and evidence sys_email → sys_identity_email ADR-0131 D7; auth-manager.ts (the auth.password_reset send passes identityMail: true), email-service.ts emailLogObjectOf, email-log-objects.ts; the object reads get/list for the platform admin
7 #24779 automation.trigger-status-contract steps[5], steps[2], acceptance[0] clause and verify INVALID_SIGNAL body {"output":{"$x":1}} → {"inputs":{"new_assignee":"…"},"output":{"$x":1}}; "404 (no such flow)" → "404 RESOURCE_NOT_FOUND" engine.ts: refuseInvalidScreenInput runs before applyResumeSignal; the wizard's collect screen requires new_assignee; flow-dispatch-status.ts 404 row carries no code, so buildApiError takes HttpStatusErrorCodeMap[404] (packages/spec/src/api/errors.zod.ts)
8 #24779 integration-system.connector-degraded-recovery steps[6] adds the current view-item body: { name: 'OBJECT.NAME', object, viewKind: 'list', config: { type: 'grid', data, columns } }; a flat body answers 422 ViewItemSchema (view.zod.ts): discriminated on viewKind, dotted name required
9 #24779 platform-core.marketplace-install-local-lifecycle fixtures.requires[1], steps[2], steps[6], steps[7], acceptance[4].verify "pnpm -C examples/app-crm build" → use the existing artifact the tree's pnpm build writes, and rebuild only when it is absent; "sampleDataPurged persisted on the ledger entry" → the listing reads withSampleData:false, and sampleDataPurged:true is in the ledger file handleList serves withSampleData from sampleDataInScope (#21775), with no sampleDataPurged; local-manifest-source.ts keeps both in STORAGEDIR/MANIFESTID.json; @objectstack/example-crm has build: objectstack build, and examples/*/dist/ is gitignored
10 #24779 platform-core.docs-audience-gate fixtures.knownGaps[2] (new) no pin for "unknown future audience shape → deny" book.test.ts audienceAllows cases drive three shapes only; book.zod.ts final return false. The item has no automated.ref, so there is nothing to narrow
11 #24779 platform-core.seed-mode-matrix fixtures.knownGaps[2] (new) after an insert-mode duplicate, upsert binds one duplicate silently seed-loader.ts loadExistingRecords: map.set(key, record) over an unordered find, so the last row wins
12 #24787 B1 api-backend.retired-def-refusal steps[0], acceptance[3].clause "the current major and the next" / "staged for the NEXT major" → previous (17) + current (18) 224 retired-defs/ entries: 53 at prefix 17, 171 at prefix 18; PROTOCOL_VERSION = '18.0.0'
13 #24787 B2 api-backend.enforce-or-remove-authoring-gates steps[1] "locate the filter-regex-options-retired advisory" → locate it by its headline ⚠ [protocol 17] data.filter $regex / $options — …; the id appears only in --json todos[].id migrate/meta.ts printNotice prints [protocol N] surface → replacement; the entry declares no relevantWhen, so it is always listed
14 #24787 B3 api-backend.formula-gates acceptance[3].clause "like due_date == today()" → the showcase's one today() use, a less-than comparison of record.f_date against today() predicate-matrix.action.ts is the only today() call under examples/app-showcase/src
15 #24787 B4 api-backend.rest-route-generation-tombstones automated.ref one file, no qualifier → per clause: a1 in full (§B); a0 for one value per key (nameTransform: 'plural' by hand); a4's empty-block half (§E), the routes strip unpinned; no pin for a2 or a3 rest-sub-config-parse-not-cast.test.ts §B, §C and §E case names
16 #24786 C8 automation.flow-authoring-refusals-v18 automated.ref nine files, no qualifier → acceptance[0] ONLY; a1–a3 are driven by hand with the CLI and a boot the nine files are spec and lint units; none runs os validate or PUT /api/v1/meta/flow
17 round 11 report 6285435593, finding 3 access-security.grant-table-write-contract, access-security.parent-and-organization-write-guards fixtures.knownGaps[0] "each one absent refuses the boot naming itself." → PR #24801's sentence, byte for byte serve.ts "AuthPlugin skipped — set OS_AUTH_SECRET" branch, unchanged after the merge; the ledger now holds 6 of the new sentence and 0 of the old

Narrower than the record, said out loud (finding 15). The record reads "§E covers a0, a1 and a4". At base:

  • acceptance[1]'s routes leg is §B's case. §E's own plugin-path case drives batch.defaultAtomic.
  • §E drives nameTransform with 'none' only, while acceptance[0] names both former values.
  • The unknown-key strip control (§C) drives batch and metadata.endpoints, never routes.

The draft-read spelling sweep (finding 18)

How the routes read the query at base, in both the RestServer and the runtime-dispatcher transports:

  • GET /meta/:type/:name admits layers, state, preview, package, locale, member (META_ITEM_READ_PARAMS, meta-item-read-gate.ts). A GET carrying mode answers 400 VALIDATION_ERROR, and a draft read is ?state=draft.
  • PUT /meta/:type/:name admits force, package, mode, surface (META_ITEM_SAVE_PARAMS). metaSaveRequestOptions (meta-save-request.ts) reads ?mode=draft as a draft save.
  • DELETE admits state (META_ITEM_RESET_PARAMS), and /publish admits package, member.

So the route that takes mode=draft is the save door, not a view or page preview.

Each hit judged by its route and its role:

  • 45 are save-door spellings (a PUT …?mode=draft, or "a ?mode=draft save").
  • 3 are sentences stating the GET's 400 (ai.agent-tool-skill-metadata-roundtrip acceptance[3].verify).
  • 12 sit in history rows.
  • None tells a runner to read a draft with ?mode=draft, so none is corrected. None of the hits is inside the three excluded items.
file before (lines / occurrences) after
access-security.json 6 / 6 6 / 6
ai.json 5 / 13 5 / 13
api-backend.json 2 / 4 2 / 4
dashboards.json 7 / 7 7 / 7
integration-system.json 1 / 1 1 / 1
platform-core.json 2 / 3 2 / 3
records-forms.json 8 / 8 8 / 8
studio-authoring.json 17 / 18 17 / 18
total 48 / 60 48 / 60

Left alone, and why

Acceptance notes

These are noted, not filed.

Gates

Local subset at 0f2f4de9f1, from node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (13 commands). Each exit code was 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 (after a locked turbo run build --filter=@objectstack/lint... --filter=@objectstack/formula... --concurrency=2, VERDICT command-exit 0) 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
  • --ran reconciliation: "13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN", a derived zero, since every line carries its exit code.
  • check:platform-checklist runs in no per-PR CI, so this local reading is its evidence. At base 307ce4c4b4: line citations 0, symbol anchors 954/964 resolved, 10 on the named residual. At 0f2f4de9f1: the same, line citations 0 and symbol anchors 954/964.
  • git merge-tree --write-tree 0f2f4de9f1 2a799d9c1f (PR qa(checklist): clauses for three round-3 defects outside the ledger, plus two RUNNER rules — a pin scores only the layer it drives, and an off-clause probe budget #24811's head, fetched from pull/24811/head): exit 0, tree bbdaf1d5b2. The two shared files, access-security.json and api-backend.json, are not merge=os-regen paths.
  • 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

…d to negative[0], degraded-recovery view body

QA run #24779 checklist-accuracy findings 1 and 8 (wave anchor #24579
round 12, claim 6286008102).

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

QA run #24779 checklist-accuracy finding 2 (wave anchor #24579 round 12,
claim 6286008102): acceptance[4] and [5] have no full-clause pin.

Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp
Co-authored-by: Claude <noreply@anthropic.com>
…e scan-cap clause per ADR-0139

QA run #24779 checklist-accuracy findings 3 and 4 (wave anchor #24579
round 12, claim 6286008102).

Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp
Co-authored-by: Claude <noreply@anthropic.com>
… the os dev walled sentence in two more items

QA run #24779 checklist-accuracy finding 5 and round 11's carried finding
3 (wave anchor #24579 round 12, claim 6286008102).

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

QA run #24779 checklist-accuracy finding 6 (wave anchor #24579 round 12,
claim 6286008102); ADR-0131 D7.

Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp
Co-authored-by: Claude <noreply@anthropic.com>
…GNAL body and 404 code, flow-authoring ref narrowed

QA run #24779 checklist-accuracy finding 7 and QA run #24786 C8 (wave
anchor #24579 round 12, claim 6286008102).

Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp
Co-authored-by: Claude <noreply@anthropic.com>
…, two knownGaps lines

QA run #24779 checklist-accuracy findings 9, 10 and 11 (wave anchor
#24579 round 12, claim 6286008102).

Claude-Session: https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp
Co-authored-by: Claude <noreply@anthropic.com>
retired-def-refusal's prefixes, the migrate advisory's headline, the
showcase's one today() use, and the routes tombstone ref per clause
(wave anchor #24579 round 12, claim 6286008102).

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
Fills the 18 history rows written with the branch name before the PR
existed (wave anchor #24579 round 12, claim 6286008102).

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-20T08:39Z · head e44bbdfc84 · card #24579, round 12 (claim 6286008102)

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/m 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