Repository navigation
Commit 50169dc
docs(qa): 18.0 sweep anchor round 20 — the area fixture recipes name the own-port boot by its port and file DB (#25043)
Refs #24579
Clause-②: no
Round 20 of the 18.0 sweep's wave anchor (claim `6307282355`, PM loop
round 35). It applies round 19's carried finding, PR #25027's
out-of-scope finding as its ACCEPT `6306169987` and landing record
`6306857223` carry it.
Only checklist text changes: 11 strings in the area-level `fixtures`
recipes of four area files, five recipes in all. No item changes, no
top-level key other than those recipe strings moves, and there is no
product code, test, pin, changeset text or `RUNNER.md` edit.
- Base `d68aab6fde` (`origin/main` when the branch was cut).
`origin/main` has since moved one commit to `dfe60e3a0c`, which touches
only `packages/core` and a changeset, none of it cited by the ledger.
- Head `60fccd21ef`, one commit.
## The recording rule, as read
`docs/qa/platform-checklist/README.md` gives a recipe no revision or
history of its own. The recipe shape ("Half 1 — the recipe") lists
`$comment`, `title`, `why`, `provenance`, `app`, `requires`, `sequence`,
`teardown` and `knownGaps`. `revision` and `history` are item fields:
the Lifecycle section's "Change" rule ("edit the fields, bump
`revision`, append a `history` entry") is about items. The validator's
own comment says the same ("recipes carry no `revision`/`history` of
their own", `scripts/check-platform-checklist.mjs`), and none of the
five recipes on disk carries either key. So only the strings are edited
here. No revision field is added, and no item's `revision` or `history`
moves.
## What changed
The respelling uses the voice rounds 17–19 landed: "an isolated boot
(own port + file DB, …)" becomes "a boot on its own port and file DB
(…)", matching `access-security`'s round-17 rows. "discard the isolated
file DB … an isolated boot makes free" becomes "discard the run's own
file DB … a boot on its own port and DB makes free", matching
`platform-core.manifest-install-contract` `steps[9]`, round 17. Each
parenthetical keeps the dogfood section-0 pointer as its file spelled it
("dogfood skill §0" or "dogfood §0"). Only the fragments below change;
the rest of each string is byte-identical.
| file | recipe | field | old → new |
|:--|:--|:--|:--|
| `attachments-storage.json` | `qa-scratch-authz` | `requires[2]` | `an
isolated boot (own port + file DB, dogfood skill §0)` → `a boot on its
own port and file DB (dogfood skill §0)` |
| `attachments-storage.json` | `qa-scratch-authz` | `teardown` |
`discard the isolated file DB, … the one an isolated boot makes free` →
`discard the run's own file DB, … the one a boot on its own port and DB
makes free` |
| `attachments-storage.json` | `qa-media-constraints` | `requires[1]` |
`an isolated boot (own port + file DB, dogfood skill §0)` → `a boot on
its own port and file DB (dogfood skill §0)` |
| `attachments-storage.json` | `qa-media-constraints` | `teardown` |
`discard the isolated file DB, the cheaper path an isolated boot makes
free` → `discard the run's own file DB, the cheaper path a boot on its
own port and DB makes free` |
| `automation.json` | `qa-flow-status-doors` | `requires[1]` | `an
isolated boot (own port + file DB, dogfood §0)` → `a boot on its own
port and file DB (dogfood §0)` |
| `automation.json` | `qa-flow-status-doors` | `requires[2]` |
`(RUNNER.md, the isolated-boot/OS_PORT standing fact)` → `(RUNNER.md,
the own-port/OS_PORT connector standing fact)` |
| `automation.json` | `qa-flow-status-doors` | `teardown` | `discard the
isolated file DB, the cheaper path an isolated boot makes free` →
`discard the run's own file DB, the cheaper path a boot on its own port
and DB makes free` |
| `records-forms.json` | `qa-feeds-disabled` | `requires[1]` | `an
isolated boot (own port + file DB, dogfood skill §0)` → `a boot on its
own port and file DB (dogfood skill §0)` |
| `records-forms.json` | `qa-feeds-disabled` | `teardown` | `discard the
isolated file DB, … the one an isolated boot makes free` → `discard the
run's own file DB, … the one a boot on its own port and DB makes free` |
| `search.json` | `qa-contributor-bound-member` | `requires[2]` | `an
isolated boot (own port + file DB, dogfood §0)` → `a boot on its own
port and file DB (dogfood §0)` |
| `search.json` | `qa-contributor-bound-member` | `teardown` | `discard
the isolated file DB — the cheaper path an isolated boot makes free` →
`discard the run's own file DB — the cheaper path a boot on its own port
and DB makes free` |
`git diff --stat`: 4 files, 11 insertions, 11 deletions.
**The re-pointed pointer (`qa-flow-status-doors.requires[2]`).**
RUNNER.md's connector entry is now titled "A boot on its own non-3000
port breaks the showcase's self-pinging connectors unless you export
`OS_PORT` …". The new pointer names it by words that title carries: own,
port, `OS_PORT` and connector. "standing fact" is kept, because it is
the section's own word: the entry sits under "Environment facts the
runner should not re-derive", whose intro calls them "Standing facts
about the stock showcase environment". The sibling item text
`automation.json` already uses the same form ("RUNNER.md's connector
self-URL standing fact").
## `isolated` left in the four files' recipes
Read over every string under each file's top-level `fixtures` block, the
`$comment` annotations included, at the head:
| file | recipe · field | text | sense | verdict |
|:--|:--|:--|:--|:--|
| all four | every recipe string | the word `isolated` | — | none left:
16 at the base, all inside the 11 strings above; 0 at the head |
| `records-forms.json` | `qa-feeds-disabled` · `sequence[1].expect` | "a
caller who can read and edit this parent isolates FEEDS_DISABLED from
the sibling RECORD_NOT_ACCESSIBLE refusal" | the verb: tells one refusal
apart from another | kept (names neither the boot nor the posture) |
No posture text was in any of the five recipes, so none was touched.
**Items citing a changed recipe string verbatim: none.** Every area
file's items were searched for each old fragment. Three history rows
carry the same phrasing: `access-security.rls-both-sides` and
`access-security.record-share-grant-revoke` `history[6]`, and
`platform-core.manifest-install-contract` `history[5]`. Each quotes its
OWN item's old step text, not a recipe string, so nothing is reported
under that rule. Outside `areas/`, `git grep` finds no file quoting any
old fragment.
## How the edits were made and checked
A one-off script (sha256 `52f33dacca5c…`, kept out of the tree)
tokenizes each file to the byte span of every string value by JSON path.
It edits only the 11 named spans and re-encodes each new value in the
file's own style. It never re-serialises a file. Its assertions, all run
in a dry run and again on the bytes re-read from disk after `--write`:
- each span round-trips (decoding the span equals the parsed value, and
re-encoding reproduces the span);
- each phrase replacement hits exactly its expected count, and no edited
string keeps `isolat`;
- the new file parses, with the same set of string-value paths;
- the new document equals the old one with only the 11 paths replaced:
`items` equal, every other top-level key equal, every other recipe
equal, and every other field of an edited recipe equal;
- every byte outside the edited spans is identical, the head, the gaps
and the tail included (trailing-newline state too);
- each file's `isolat` count drops by exactly the named strings' hits
(6, 4, 3, 3).
The assertions were shown to fire first: three faults injected into the
in-memory result (an item title edit, a whitespace-only change outside
the spans, an edit to an unnamed recipe field) were each caught by the
intended assertion. A separate per-file count against the base agrees:
each old fragment goes from N to 0 and each new one from 0 to N, in the
same files.
## Gates
`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives 13 commands on the 4 paths, against
merge base `d68aab6fd` of `origin/main`. At head `60fccd21ef` each was
run with its exit code captured before any pipe, and each exited 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`
The first run of `check:doc-formula-expressions` refused with exit 3, a
prerequisite: `@objectstack/formula` and `@objectstack/lint` were not
built in this worktree. Both were built under the shared verify lock
(`VERDICT command-exit 0`, a full turbo cache replay, held 1 s, waited 0
s), and the rerun exited 0. `--ran`, with an exit code on every line,
reads "13 derived, 13 run, 0 NOT-MEASURED, 0 UNRUN", a derived zero.
No per-PR CI job runs `pnpm check:platform-checklist`, so this local
reading is its evidence. The base column was taken in this worktree at
the base, before any edit:
| reading | base `d68aab6fde` | head `60fccd21ef` |
|:--|:--|:--|
| exit | 0 | 0 |
| items | 16 areas, 328 items (323 active, 1 planned) | 16 areas, 328
items (323 active, 1 planned) |
| provisioning | 5 area recipes, 10 item references resolved (2
area-qualified), 5/5 recipes referenced | 5 area recipes, 10 item
references resolved (2 area-qualified), 5/5 recipes referenced |
| line citations | 0 survive across 21 swept documents | 0 survive
across 21 swept documents |
| symbol anchors | 979/989 against 434 cited sources, 10 on the named
residual (#16898), 18 file floors held | 979/989 against 434 cited
sources, 10 on the named residual (#16898), 18 file floors held |
No anchor, citation or recipe key is added or removed. `main`'s one
later commit touches no file the ledger cites.
`git merge-tree --write-tree` exited 0 against each of:
- `origin/main` `dfe60e3a0c`;
- PR #25024's head `356172a1f9` (its only `docs/qa/` file is
`FOLLOW-UPS.md`).
None of these paths is routed to the `os-regen` merge driver (`merge:
unspecified`).
There is no ablation, because no tested behaviour changed.
`skip-changeset` was re-measured. No `files[]` entry of the 73
non-private manifests (86 tracked `package.json` files) reaches outside
its own package or names `docs/qa`, and the repo root is private. The
two `docs/qa` mentions under `packages/` (`service-settings`
`config-change-audit.ts`, and `packages/lint`'s gate script) are
comments, not copies. A grep of the built dists on disk for the edited
recipe keys finds none, with a positive control hit in
`packages/spec/dist`.
## Acceptance notes
- **`automation.flow-error-handling` `fixtures.requires[0]`** (an item,
not on this round's surface) says `api.example.com` is "unroutable from
the isolated env, so the failure is deterministic". That `isolated`
means the network-isolated (no-egress) environment. It is a third sense:
neither the own-port boot nor the tenancy posture. Noted, not filed; no
carrier.
- **`qa-contributor-bound-member.requires[2]`'s pointer** "(RUNNER.md's
connector self-URL fact)" is left as it was. "connector" is a word of
the entry's title and "self-URL" names its resolver, and the ruling
named only `qa-flow-status-doors`'s pointer for re-pointing.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent e939357 commit 50169dc
4 files changed
Lines changed: 11 additions & 11 deletions
File tree
- docs/qa/platform-checklist/areas
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| |||
126 | 126 | | |
127 | 127 | | |
128 | 128 | | |
129 | | - | |
| 129 | + | |
130 | 130 | | |
131 | 131 | | |
132 | 132 | | |
| |||
139 | 139 | | |
140 | 140 | | |
141 | 141 | | |
142 | | - | |
| 142 | + | |
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
| |||
157 | 157 | | |
158 | 158 | | |
159 | 159 | | |
160 | | - | |
| 160 | + | |
161 | 161 | | |
162 | 162 | | |
163 | 163 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
16 | | - | |
| 15 | + | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| |||
65 | 65 | | |
66 | 66 | | |
67 | 67 | | |
68 | | - | |
| 68 | + | |
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
56 | | - | |
| 56 | + | |
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| |||
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
52 | | - | |
| 52 | + | |
53 | 53 | | |
54 | 54 | | |
55 | 55 | | |
| |||
0 commit comments