Skip to content

docs(qa): re-point five 18.0 sweep red-row clauses to the shipped contract - #24622

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-24579-v18-sweep-red-row-repoints
Oct 19, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-24579-v18-sweep-red-row-repoints

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Refs #24579 (§1)
Clause-②: no

Part of #24579: this PR lands §1 of that wave anchor, the five red-row re-points. §2 (wave-wide themes), §3 (checklist-accuracy findings), §4 (fixture gaps, partials, not-run handover), §6 and §7 stay on the card.

What

The 18.0 release sweep (subject 5b14b7f3) scored five checklist clauses fail. Each run record disposed its row as a stale spec or an assertion defect against a documented contract: the product is right and the clause is wrong. This PR re-points those five clauses. Each item bumps revision 1 → 2 and gains one history row that names its run record and has this PR as its ref.

Ledger only. No product code, test or pin changes. Diff: 5 files under docs/qa/platform-checklist/areas/, one item per file, and no other item or area-level key moves (checked by parse against the base).

item · clause run record disposition edited fields revision
cli.organization-ownership-ceremony acceptance[1]–[4] #24551 (verdict word reconciled with #24556) stale spec title, fixtures.knownGaps (new), steps, acceptance[0]–[3] (old [4] removed), automated.ref, source 1 → 2
automation.flow-authoring-refusals-v18 acceptance[2] #24545 (and #24558's "PUT 422 too broad") stale spec title, steps[1], acceptance[2] 1 → 2
api-backend.error-sentences-and-unique-violation-wire-code acceptance[2] #24541 assertion defect acceptance[2] (acceptance[1] untouched: product defect #24561) 1 → 2
access-security.share-link-combined-gates acceptance[3] #24559 assertion defect title, acceptance[3] 1 → 2
attachments-storage.chunked-upload-integrity acceptance[3] #24560 stale spec title, steps (renumbered from 0), acceptance[1] (index), acceptance[3] 1 → 2

Each re-point, against main 5a871e4e41

Every source cited below is byte-identical between the run subject 5b14b7f3 and main 5a871e4e41. The one file that moved, metadata-protocol/src/protocol.ts, changed by a perf commit whose hunks are nowhere near the two refusals cited from it.

  1. cli.organization-ownership-ceremony. By ruling, 18.0 is fresh installs only. The registered os migrate organization-ownership (MigrateOrganizationOwnership) refuses plan and apply alike, with NOT_IMPLEMENTED / upgrade-unavailable, before it opens anything. The changes:
  2. automation.flow-authoring-refusals-v18.
    • Root-scope arms: packages/lint/src/flow-cel-root-scope.ts#perWriteSnapshotEntrance stands the CEL root-scope judgment down at the runtime publish gate. This is by design, under rulings 5791822697 (item 3) and 6104584601 (letter B), and the item's own pin validate-expressions.flow-cel-root.test.ts asserts it. So the record.x and user.id arms expect 200 and a stored row at PUT, and os validate (acceptance[1]) still refuses them.
    • Job and endpoint arms: these are not PUT /meta/flow bodies. job and api are code-only types (allowRuntimeCreate: false, so PUT answers 403 NOT_CREATABLE). The clause names the flow-side twins the door does refuse: a try_catch node's retry.maxRetry, and the runAs: "system" flow that a code-declared authRequired: false endpoint names (anonymousElevatedFlowRefusal, 422 at runAs).
  3. api-backend.error-sentences-and-unique-violation-wire-code. On a tenant-scoped object, driver-sql builds a field's unique: true as the (organization, field) composite, so the driver names no single column. dispatcher-unique-violation-wire-code.test.ts pins details keys as exactly developerMessage and object, and adds field only when DuplicateRecordError states a column. The clause now asserts that composite shape.
  4. access-security.share-link-combined-gates. In share-link-routes.ts#registerShareLinkRoutes, /messages passes resolveToken the same audience inputs /resolve does. It answers every refusal with one 404 NOT_FOUND, and a resolved non-ai_conversations link with 400 UNSUPPORTED. runtime/src/domains/share-links-messages-audience.test.ts holds both mounts to one open/refused verdict per audience. The clause becomes "/messages is open iff /resolve is open", where open means the call passed the link's gates. A malformed password header is refused 400 VALIDATION_FAILED by both routes, before either reads the link.
  5. attachments-storage.chunked-upload-integrity.
    • Progress: registerStorageRoutes asks the starting-organization gate on progress only when expiryStampDue holds. So after an org switch, progress answers 200 unless the session's expires_at has passed, and 409 after that. Chunk PUT and complete answer 409 either way.
    • Numbering: the steps numbered chunks from 1 while the API numbers them from 0 (the server answered missingChunks: [1] for the step's "chunk 2"). Steps now number from 0, acceptance[1] expects [1], and the org-switch step names all three calls.

Titles that contradicted a re-pointed clause follow it: cli, automation, access-security and attachments. No file:line citation is written. The new #symbol anchors are MigrateOrganizationOwnership, ORGANIZATION_OWNERSHIP_UPGRADE_UNAVAILABLE, perWriteSnapshotEntrance, registerShareLinkRoutes and registerStorageRoutes, and all five resolve.

Verification (at 1f7239d717)

  • pnpm check:platform-checklist exits 0. This gate 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); coverage: 39 kinds mapped, 2 waived; traps: 19 documented, 19 in use; … line citations: 0 survive across 21 swept documents …; symbol anchors: 860/870 resolved … across 21 swept documents against 406 cited sources, 10 on the named residual, 18 file floors held
    
    The symbol-anchor count was 855/865 against 404 cited sources at base 5a871e4e41. This diff adds +5 resolved anchors and loses none, and the residual is unchanged at 10.
  • node scripts/pm/dispatch-gates.mjs --commands derives 13 commands on this diff (5 paths vs merge base 5a871e4e4, +73 / −45). All 13 exit 0:
    • check-ci-filter-parity
    • check-closing-keyword-parity and its --self-test
    • check-comment-mask-corpus
    • check:doc-formula-expressions (lint). This one first exited 3 (PREREQUISITE: formula and lint unbuilt, nothing measured). It exits 0 after turbo run build --filter=@objectstack/formula --filter=@objectstack/lint.
    • check:cross-package-test-inputs
    • check:doc-authoring
    • check:driver-memory-census
    • check:gitlink-declared
    • check:nul-bytes
    • check:platform-checklist
    • check:refd-timer-probe
    • check:watch-hint-literal
  • --ran reconciliation: "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)".
  • No package is touched, so there is no dependency-closure build, package test or typecheck. The rest of the farm is CI's.
  • skip-changeset, re-measured: the only package.json whose directory contains docs/qa/ is the private repo root (@objectstack/spec-monorepo, private: true), so this diff ships nothing.
  • The PR opens with each new history row's ref set to a placeholder, because the PR number does not exist until the PR does. The next commit replaces those five strings with this PR's number and changes nothing else. The gate re-run on that final head is recorded in the os-dev-report comment on qa(checklist): 18.0 release sweep anchor at 5b14b7f3 — re-point 5 red-row clauses + the wave's checklist-accuracy findings, fixture gaps and not-run handover (18 records) #24579.

Acceptance notes

Noted, not filed. Each item is already parked on #24579 by its run record unless another carrier is named.


Generated by Claude Code

…tract

Five checklist clauses the 18.0 release sweep scored fail were each
disposed as a stale spec or an assertion defect against a documented
contract. Each item is re-pointed, bumps its revision to 2 and records
the run that found it:

- cli.organization-ownership-ceremony: acceptance[1]-[3] score the 18.0
  release refusal and the drop gate; the withdrawn ceremony arms move to
  fixtures.knownGaps as not scored; automated.ref gains the
  release-refusal pin.
- automation.flow-authoring-refusals-v18: acceptance[2] says what the
  PUT door refuses; the CEL root-scope arms expect 200.
- api-backend.error-sentences-and-unique-violation-wire-code:
  acceptance[2] asserts the composite details shape.
- access-security.share-link-combined-gates: acceptance[3] is
  open/refused parity between /messages and /resolve.
- attachments-storage.chunked-upload-integrity: acceptance[3] expects
  progress 200 unless the expiry stamp is due; chunks number from 0.

No product code, test or pin changes.

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 19, 2026
The rows were written before the pull request existed; this replaces
their placeholder ref with its number and changes nothing else.

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-19T16:49Z · head d3ea1a46fd · card #24579 §1 (claim 6271209099)

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