Repository navigation
Commit 045dae8
docs(qa): 18.0 sweep anchor round 5 — the walled-posture and second-organization themes, runner environment facts, and two carried notes (#24687)
Refs #24579
Clause-②: no
Round 5 of the 18.0 release sweep's wave anchor (#24579), one PR in four
parts. Rounds 1–4 landed as #24622, #24632, #24649 and #24671. This is a
partial landing: the card keeps §2's other two themes and §4 for later
rounds.
The diff is the checklist ledger and its runner docs only: four area
files, `RUNNER.md` and `FOLLOW-UPS.md`. No product code, test or pin
changes. Every edited area item takes one `revision` bump and one
`history` row (ref: this PR). Every finding was re-derived from source
before it was edited. The base is `bfc1539fe0`, merged with
`origin/main` `92ce3af404` before this PR opened. Main's 8 new commits
touched none of the cited sources except `.objectui-sha` (#24660 moved
the pin `4016370a` → `12dc7b47c340`), and the one fact that reads it,
the map-tile entry, was re-checked at the new pin. Findings that did not
hold are left alone and listed at the end, each with the reading that
refutes it.
## Part (a) — §2's two wave themes
**What the ledger allows.** `planned` is an item-level status only.
`statusFieldProblems` in `scripts/check-platform-checklist.mjs` judges
`status` per item; a planned item must carry no `steps`; no clause
carries a status of its own; and `checklist-select.mjs` drops a planned
item from every runnable set. So a walled leg on an otherwise runnable
item can only be recorded in `knownGaps`. The gate validates the
`planned` shape and does not read `knownGaps` at all (PM H3).
**Where 18.0 refuses (PM H1 holds).** The walled refusal lives in one
place: `walledPostureRefusal()` in `packages/cli/src/commands/serve.ts`.
`Serve.run` asks it right after the posture gate, before a config is
read, a plugin is mounted or the HTTP server starts. `os dev` and `os
start` boot through `serve`. The organizations-runtime load and
`OS_ALLOW_DEGRADED_TENANCY` come later in the same method, so nothing
skips the refusal. Kernel-level boots (`bootStack`, the dogfood wall
suites) never pass through `serve`, which is why the pins still prove
walled behaviour.
Measured live at `bfc1539fe0` with the built CLI:
- `os serve`, `OS_TENANCY_POSTURE=isolated`: exit 1, `✖ FATAL: tenancy
posture 'isolated' is not supported in 18.0 (NOT_IMPLEMENTED).`
- `group`: the same, naming `group`.
- `OS_MULTI_ORG_ENABLED=true`: the same, naming `isolated`.
- `single` (the control): passes the gate and stops later, on "Nothing
to serve".
- `os start` under `isolated`: the same FATAL.
The refusal names no release ("an 18.x release"), so the knownGaps say
"a later 18.x release".
**Where the second organization is refused (PM H2).** The door is
`beforeCreateOrganization` in
`packages/plugins/plugin-auth/src/auth-manager.ts`. It answers 403
`ORGANIZATION_CREATION_DISABLED` wherever the effective posture enforces
no wall, and on 18.0 that is every boot. Two more facts close the other
routes: `sys_organization` declares `apiMethods: ['get', 'list',
'update']`, so the data API has no create, and 18.0 serves fresh
installs only. Per-item decision: an org-switch clause is the §2 theme
("not scored on a stock 18.0 boot"). A planted second organization is a
fixture route. QA run #24560 used one, a system write, and the knownGap
says such a run must declare it. That route itself stays with §4.
**Shape.** The ledger has no area-level or README-level slot for a wave
theme. An area file carries `$comment` and provisioning recipes, and a
recipe must have a `provisioning.use` consumer. The README has no such
section. `RUNNER.md`'s "Environment facts the runner should not
re-derive" is the standing-facts slot runners read first. So each theme
is stated once there, as the entries "18.0 boots the single tenancy
posture only" and "A stock 18.0 boot holds exactly one organization".
Each item's knownGap points at the entry and restates the refusal in one
sentence with its anchor. That keeps the item readable on its own
through `checklist-select.mjs`, and lets the anchor gate resolve each
citation (a `RUNNER.md` anchor would red: the anchor floor file declares
no floor for `RUNNER.md`). The entry also settles the verdict word. The
live leg is recorded `skipped` with the entry cited, as the withdrawn
ownership command's clauses are, and never `blocked(fixture)`. The
sweep's records had scored it both `blocked(environment)` (QA runs
#24557, #24559) and `blocked(fixture)` (QA run #24558).
**knownGaps vs planned, per item, on the four axes.** Every item below
takes `knownGaps`. The common reason on each axis:
- *Business need.* Each item has runnable 18.0 clauses: its pin clause,
plus single-posture clauses. The walled capability is built and
pin-verified in-process. 18.0 refuses it at the CLI boot by ruling.
- *Long-term.* The clause stays where it is and returns when the refusal
lifts. A planned split would duplicate clause text across two ids,
delete the steps a planned item may not carry, and need a passing run to
promote it back.
- *AI-error.* `planned` would tell the next sweep the capability is
unbuilt, which is the wrong debt (README: "Scoring one as the other
sends the next sweep to fix the wrong thing"). The knownGap names the
exact clauses and the verdict word.
- *Startup scope.* No new ids and no new surface.
| item | fields edited | revision | run record | choice and why |
|:--|:--|:--|:--|:--|
| `platform-core.settings-organization-isolation-and-platform-rung` |
`fixtures.knownGaps` (new, [0]); `acceptance[3].clause` | 1 → 2 | QA
runs #24557, #24558 (c2, c3) | knownGaps. acceptance[0] (pins) and [1]
run on single. acceptance[3] was a second walled leg:
`settings-service.ts#organizationlessTenantKeyError` refuses only under
a walled posture, and the pin asserts single does not refuse. So the
clause is now marked `walled:` |
| `access-security.walled-environment-metadata-operator-only` |
`fixtures.knownGaps` (new, [0]); `steps[0]` | 1 → 2 | QA runs #24556,
#24558, #24559 (c1, c2, N0) | knownGaps. acceptance[0]'s pins are the
18.0 evidence. steps[0] now declares `sharingModel` (round 2's note):
the admitted repeats in steps[2]/[3] reach the save door's authoring
rules, which refuse an object with none 422 `security-owd-unset`
(`validate-security-posture.ts#SECURITY_OWD_UNSET`, error tier). The
walled refusal answers ahead of them (`meta-item-write-routes.ts`) |
| `access-security.activation-write-operator-gate` |
`fixtures.knownGaps[0]`; `steps[8]`; `acceptance[4].clause`;
`acceptance[4].verify`; `variants[1]`; `variants[2]` | 3 → 4 | #24579 §2
| knownGaps (re-grounded). The legs were `blocked(fixture)` on an
"enterprise runtime" gap. On 18.0 the refusal runs ahead of the runtime
load, and the runtime is open code since ADR-0132. Clause 5 keeps its
unit pins as its oracle |
| `access-security.grant-table-write-contract` | `fixtures.knownGaps`
(new, [0]) | 2 → 3 | QA run #24559 (c4, live leg) | knownGaps. Rounds
2–3 named acceptance[4]. 1 parent c663245 commit 045dae8
6 files changed
Lines changed: 213 additions & 25 deletions
File tree
- docs/qa/platform-checklist
- areas
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
612 | 612 | | |
613 | 613 | | |
614 | 614 | | |
615 | | - | |
| 615 | + | |
616 | 616 | | |
617 | 617 | | |
618 | 618 | | |
| |||
0 commit comments