Repository navigation
Commit 407f870
docs(qa): re-point five 18.0 sweep red-row clauses to the shipped contract (#24622)
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:
- acceptance[1] scores the bare-run refusal: no plan file, DB checksum
unchanged.
- acceptance[2] scores every `--apply` arm refusing the same way.
- acceptance[3] keeps the drop-gate half
(`refused_organization_ownership_unmigrated` with `tables`). The
sys_migration checkpoint half is dropped.
- Revision 1's acceptance[4] (the migrated copy boots) is removed.
- `automated.ref` gains
`organization-ownership.release-refusal.test.ts`, the pin of the
registered command. The other seven pins drive the ceremony class
beneath it.
- **The mechanism (PM hypothesis 1, falsified):** the ledger has no
clause-level skip. 1788 clauses across 16 areas carry only
`clause`/`oracle`/`verify`/`evidence` (one `$comment`).
`check-platform-checklist.mjs` reads no such key, and RUNNER's `skipped`
is a run verdict, not an item field. The nearest legal shape is the one
the ledger already uses for a half an item does not score: a
`fixtures.knownGaps` line saying the half is deliberately not scored
here. Precedents are `cli.plugin-manifest-build-contract` knownGaps[1]
and `platform-core.manifest-install-contract` knownGaps[0].
- **The knownGaps line:** `knownGaps[0]` lists the ceremony's withdrawn
arms with the ruling quoted from #24551 ("ruling records 6259608309
(item 1) and 6259698357 then cut 18.0 to fresh installs on the single
posture…"). It tells a runner to score those arms neither `fail`
(#24551's reading of revision 1) nor `skipped` (#24556's, c1/c2/c4),
because they are not on the item. That is the single reading for both
runs: each run captured the refusal that each re-pointed clause now
asserts.
- `knownGaps[1]` says acceptance[3] scores the drop gate's exit,
`message` and `tables`, not its prose. That prose still prescribes the
withdrawn command, which is row 3 of #24567.
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:
```text
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 #24579.
## Acceptance notes
Noted, not filed. Each item is already parked on #24579 by its run
record unless another carrier is named.
- `access-security.share-link-combined-gates` `automated.ref` does not
name
`packages/runtime/src/domains/share-links-messages-audience.test.ts`,
the pin of the parity acceptance[3] now asserts. Carrier: #24579 §3. Not
added here, because §1 changes `automated.ref` for the cli row only.
- `attachments-storage.chunked-upload-integrity` acceptance[3] still
needs a second organization, and stock 18.0 refuses one with 403
`ORGANIZATION_CREATION_DISABLED`. Carrier: #24579 §2, the "no second
organization" theme. Separately, none of its three pins asserts the
door-level org-switch 409. Carrier: #24579 §3, from #24560.
- `automation.flow-authoring-refusals-v18` has three steps-level
accuracy findings. Carrier: #24579 §3, from #24545 and #24558.
- The anonymous-endpoint arm needs an armed `rateLimit`.
- "A REST-triggered flow reading record.x" is ambiguous.
- acceptance[1]'s schema-layer arms surface as `STACK_SCHEMA_INVALID`
with a contract sentence, not as a rule id.
- `api-backend.error-sentences-and-unique-violation-wire-code`: a
package cannot author a hook on `sys_sharing_rule`, so the fixture line
and step 1 are unrunnable as written. Carrier: #24579 §3, from #24541
and #24558. acceptance[1] is the product defect #24561.
- `cli.organization-ownership-ceremony`: there is no v17-shaped SQLite
fixture in the tree. Carrier: #24579 §4. The drop-gate prose naming the
withdrawn command is row 3 of #24567.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 23dae89 commit 407f870
5 files changed
Lines changed: 73 additions & 45 deletions
File tree
- docs/qa/platform-checklist/areas
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3805 | 3805 | | |
3806 | 3806 | | |
3807 | 3807 | | |
3808 | | - | |
| 3808 | + | |
3809 | 3809 | | |
3810 | 3810 | | |
3811 | | - | |
| 3811 | + | |
3812 | 3812 | | |
3813 | 3813 | | |
3814 | 3814 | | |
| |||
3847 | 3847 | | |
3848 | 3848 | | |
3849 | 3849 | | |
3850 | | - | |
| 3850 | + | |
3851 | 3851 | | |
3852 | | - | |
| 3852 | + | |
3853 | 3853 | | |
3854 | 3854 | | |
3855 | 3855 | | |
| |||
3871 | 3871 | | |
3872 | 3872 | | |
3873 | 3873 | | |
| 3874 | + | |
| 3875 | + | |
| 3876 | + | |
| 3877 | + | |
| 3878 | + | |
| 3879 | + | |
3874 | 3880 | | |
3875 | 3881 | | |
3876 | 3882 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2823 | 2823 | | |
2824 | 2824 | | |
2825 | 2825 | | |
2826 | | - | |
| 2826 | + | |
2827 | 2827 | | |
2828 | 2828 | | |
2829 | 2829 | | |
| |||
2856 | 2856 | | |
2857 | 2857 | | |
2858 | 2858 | | |
2859 | | - | |
| 2859 | + | |
2860 | 2860 | | |
2861 | | - | |
| 2861 | + | |
2862 | 2862 | | |
2863 | 2863 | | |
2864 | 2864 | | |
| |||
2885 | 2885 | | |
2886 | 2886 | | |
2887 | 2887 | | |
| 2888 | + | |
| 2889 | + | |
| 2890 | + | |
| 2891 | + | |
| 2892 | + | |
| 2893 | + | |
2888 | 2894 | | |
2889 | 2895 | | |
2890 | 2896 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1077 | 1077 | | |
1078 | 1078 | | |
1079 | 1079 | | |
1080 | | - | |
| 1080 | + | |
1081 | 1081 | | |
1082 | 1082 | | |
1083 | | - | |
| 1083 | + | |
1084 | 1084 | | |
1085 | 1085 | | |
1086 | 1086 | | |
| |||
1093 | 1093 | | |
1094 | 1094 | | |
1095 | 1095 | | |
1096 | | - | |
1097 | | - | |
1098 | | - | |
1099 | | - | |
| 1096 | + | |
| 1097 | + | |
| 1098 | + | |
| 1099 | + | |
1100 | 1100 | | |
1101 | 1101 | | |
1102 | 1102 | | |
| |||
1106 | 1106 | | |
1107 | 1107 | | |
1108 | 1108 | | |
1109 | | - | |
| 1109 | + | |
1110 | 1110 | | |
1111 | 1111 | | |
1112 | 1112 | | |
| |||
1118 | 1118 | | |
1119 | 1119 | | |
1120 | 1120 | | |
1121 | | - | |
| 1121 | + | |
1122 | 1122 | | |
1123 | | - | |
| 1123 | + | |
1124 | 1124 | | |
1125 | 1125 | | |
1126 | 1126 | | |
| |||
1138 | 1138 | | |
1139 | 1139 | | |
1140 | 1140 | | |
| 1141 | + | |
| 1142 | + | |
| 1143 | + | |
| 1144 | + | |
| 1145 | + | |
| 1146 | + | |
1141 | 1147 | | |
1142 | 1148 | | |
1143 | 1149 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1987 | 1987 | | |
1988 | 1988 | | |
1989 | 1989 | | |
1990 | | - | |
| 1990 | + | |
1991 | 1991 | | |
1992 | 1992 | | |
1993 | | - | |
| 1993 | + | |
1994 | 1994 | | |
1995 | 1995 | | |
1996 | 1996 | | |
| |||
2006 | 2006 | | |
2007 | 2007 | | |
2008 | 2008 | | |
2009 | | - | |
| 2009 | + | |
2010 | 2010 | | |
2011 | 2011 | | |
2012 | 2012 | | |
| |||
2023 | 2023 | | |
2024 | 2024 | | |
2025 | 2025 | | |
2026 | | - | |
| 2026 | + | |
2027 | 2027 | | |
2028 | | - | |
| 2028 | + | |
2029 | 2029 | | |
2030 | 2030 | | |
2031 | 2031 | | |
| |||
2055 | 2055 | | |
2056 | 2056 | | |
2057 | 2057 | | |
| 2058 | + | |
| 2059 | + | |
| 2060 | + | |
| 2061 | + | |
| 2062 | + | |
| 2063 | + | |
2058 | 2064 | | |
2059 | 2065 | | |
2060 | 2066 | | |
| |||
0 commit comments