Repository navigation
Commit c67f244
Fixes #25054
Clause-②: no
Two items in `docs/qa/platform-checklist/areas/` and nothing else: no
product code, test, pin, changeset or `RUNNER.md`.
`areas/integration-system.json` (open in PR #25045) is untouched.
## 1. New item `cli.fresh-install-migrate-apply-first`
(`areas/cli.json`, revision 1)
- **What it drives:** an empty file database, `os migrate apply --yes`
first, then the first `os serve`, in one environment, as a deploy script
runs them.
- **Oracle:** the boot (acceptance[1]). The serve reaches `✓ Server is
ready` (not DEGRADED), `/api/v1/health` answers 200, and the output has
no organization-ownership refusal. The marker is read at its own layer
(acceptance[0]): the `sys_migration` row
`adr-0131-organization-ownership`, read through SQLite after the apply
and before any boot, then again after the boot, where it must be
unchanged.
- **Release:** `since: "v18.1"`. The change for #24827 is
`.changeset/24827-migrate-apply-birth-marker.md`, a `minor` changeset
pending on `main`, so it ships in 18.1.0. `fixtures.knownGaps[0]` says a
run against 18.0.0 records the refusal as 18.0.0's known behaviour, not
as a FAIL of the item. Measured: the fix commit `19484af538` is not an
ancestor of the `@objectstack/cli@18.0.0` tag commit `06cab4849a` (exit
1). Control leg, the commit 50 behind that tag: exit 0. The checkout is
not shallow.
- **Pins:** `fixtures.knownGaps[1]` says why the fix's two pins score no
clause (RUNNER rule 6).
`apply.organization-ownership-birth.integration.test.ts` runs
`MigrateApply` in-process, and
`schema-migrate.birth-after-flush.test.ts` runs with no kernel. Neither
spawns the CLI or boots `os serve`. So the item has no `automated` ref,
and both clauses are driven live.
- **Why a new item.** No existing item's scope covers this order. I read
the titles and scopes of `platform-core.json` and `cli.json` at
`688052e147`:
| item | its scope | why the order does not belong there |
|---|---|---|
| `platform-core.v18-boot-refusals` | a 17.x-shaped database | its
revision 6 says the order "is not added here" |
| `cli.organization-ownership-ceremony` | upgrading a database that 17.x
or an 18.0 pre-release created | it never uses an empty database |
| `cli.migrate-plan-apply-json` | plan and apply on a database a prior
`os dev` boot synced (its `fixtures.requires[0]`) | it never uses an
empty database and never boots after the apply |
| `platform-core.boot-health`, `cli.dev-boot-contract` | the `os dev`
boot | that boot creates the tables and writes the birth marker itself,
so the order cannot arise |
| `cli.scaffold-first-run` | the published scaffold, booted by `os start
--artifact` | it has no `os migrate apply` |
## 2. `records-forms.validation-rule-type-matrix`
(`areas/records-forms.json`, revision 6 to 7)
- `fixtures.knownGaps[1]` is removed, and the closing "Red until #24782
lands" is removed from `acceptance[5].clause`. `knownGaps[1]` itself
asked for both edits once the change for #24782 merged. It merged as PR
#25051 (`72518d20f5`), per the `domain:engine` pointer 6308955528 on
seat post #6023. No other field changed.
Each edited item gets one `revision` bump and one `history` row. The new
item starts at revision 1 with one row. A scripted editor made the
edits: text edits inside each target item's own span, then a re-parse
asserting that every other item, every top-level key, and the bytes
outside the spans are unchanged, and that the target matches the
intended edit exactly. The history rows carry the placeholder ref
`#PENDING-25054`, because this PR had no number yet. The next commit on
this branch replaces it with this PR's number and changes nothing else.
## Live readings on `main` (base `688052e147`, CLI built from this
worktree)
### Fresh-install order: first evidence for the new item
The showcase was run from this PR's worktree. Run directory under the
session scratchpad: `fresh.db` absent before the run (`test ! -e` on it
and on its `-wal` and `-shm`). Environment for both commands:
`OS_DATABASE_URL=file:RUN/fresh.db`, `OS_HOME=RUN/home`, and
`OS_AUTH_SECRET` and `OS_SECRET_KEY` set to fresh random values. The
boot also had `OS_PORT=41873`.
1. `os migrate apply --yes`: exit **0**. It printed `✓ Created/extended
107 table(s): 107 table(s) to create, 0 column(s) to add.` and
`[organization-ownership] a datastore created from empty: birth marker
written (shape generation 1, platform 18.0.0).`
2. The marker row, read through `node:sqlite` before any boot: `id
adr-0131-organization-ownership`, `verified_at
2026-10-21T06:54:23.840Z`, `applied_at null`, `blocking 0`, `advisory
0`, `details
{"birth":{"shapeGeneration":1,"platformVersion":"18.0.0","createdAt":"2026-10-21T06:54:23.840Z"}}`.
This is the only row with that id.
3. `os serve -p 41873` (started with `setsid`): it printed `✓ Server is
ready` with `Mode: production` and `OrganizationOwnershipBootGuard`
among the plugins. `GET /api/v1/health` answered 200 10 s after the
start, and `GET /api/v1/ready` answered 200. Refusal greps over the
output: `carries no organization-ownership marker` 0, `refuses to start`
0, `os migrate organization-ownership` 0.
4. The marker row after the boot: one row, identical to step 2. The
process group was stopped and port 41873 is free.
| item (revision) | clause | verdict | evidence |
|---|---|---|---|
| `cli.fresh-install-migrate-apply-first` (1) | acceptance[0] | pass |
apply exit 0, created-tables line, the row in steps 2 and 4 |
| `cli.fresh-install-migrate-apply-first` (1) | acceptance[1] | pass |
`✓ Server is ready`, health 200, 0/0/0 refusal greps |
Item verdict: **pass**.
### Verification re-run of `records-forms.validation-rule-type-matrix`
acceptance[5]
The boot was the canonical checklist boot: `pnpm -C
WORKTREE/examples/app-showcase exec objectstack dev --ui --seed-admin -p
41874 -d file:SCRATCH/data.db` with `OS_PORT=41874` exported. The run
signed in as the seeded admin and authored the two scratch objects of
`fixtures.requires[2]` with `PUT /api/v1/meta/object/qa_vr_probe` and
`PUT /api/v1/meta/object/qa_vr_probe_err`, which both answered 200. Then
it followed steps[6]:
- `POST /api/v1/data/qa_vr_probe {"title":"abc"}` answered **201**, and
the re-read found 1 row (`title abc`).
- Exactly **one** server-log line names `qa_unevaluable_warn`, across
the whole log: `Validation rule 'qa_unevaluable_warn' (warning): the
rule could not be evaluated (runtime: int() type error: cannot convert
to int) — write proceeded: the rule is advisory, so it was not applied
to this write`. Lines naming the rule that contain `write rejected`: 0.
Lines that contain `fails closed`: 0.
- Control: `POST /api/v1/data/qa_vr_probe_err {"title":"abc"}` answered
**400** `VALIDATION_FAILED`, with `fields[0].constraint` `{rule:
qa_unevaluable_err, reason: unevaluable}`. The re-read found 0 rows. Its
log lines say `— write rejected: a rule that cannot be evaluated fails
closed, it is never skipped`, which is true here.
| item (revision run) | clause | verdict | evidence |
|---|---|---|---|
| `records-forms.validation-rule-type-matrix` (6) | acceptance[5] | pass
| 201 + re-read, the single log line quoted above, control 400 + empty
re-read |
| `records-forms.validation-rule-type-matrix` (6) | acceptance[0] to [4]
| skipped | outside this verification re-run |
This is a verification re-run, so it files no run record (RUNNER, Run
records). Both servers were stopped by process group, and
`examples/app-showcase/.objectstack`, which the boots wrote into the
worktree, was deleted.
## Gates
Local, derived by `node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` from the merge base. All 13 ran at
`7b35265616`, and 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` |
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: `✓ dispatch-gates --ran: 13 derived famil(ies)
accounted for — 13 run, 0 NOT-MEASURED`.
- `pnpm check:platform-checklist` runs in no per-PR CI.
- At BASE `688052e147`: `OK — 16 areas, 328 items (323 active, 1
planned); coverage: 39 kinds mapped, 2 waived; … symbol anchors: 979/989
resolved … 18 file floors held`.
- At `7b35265616`: `OK — 16 areas, 329 items (324 active, 1 planned);
coverage: 39 kinds mapped, 2 waived; … symbol anchors: 985/995 resolved
… 18 file floors held`.
- `scripts/checklist-select.mjs`: `since:v18.1` and
`file:packages/cli/src/utils/schema-migrate.ts` each resolve the new
item.
- `git merge-tree --write-tree` against `origin/main` (`2b1382a5b3`) and
against PR #25045's head (`4a595ed439`): both exit 0 with a tree id and
no conflicts. The one commit that landed on `main` since BASE touches
nothing under `docs/qa/platform-checklist/`.
- No package is touched, so no package build or test is owed.
`skip-changeset` was re-measured: the changed paths sit in the private
repo root, outside every package directory. No public package's
`files[]` names `docs`, `qa` or a parent path. Positive control: 73
public packages name `dist`.
- CI families: the PR's check-runs are cited in the report on #25054.
## Acceptance notes
- Observed, not in scope: the stock showcase's `os migrate apply` prints
an ERROR-level line, `2 federated (external) object(s) are NOT bound to
their remote table, yet stay registered and served: …` (from
`packages/objectql/src/plugin.ts`). It comes right after the same boot's
`datasource 'showcase_external': connect denied by policy (schemaMode
'external': …)`. A migrate run serves nothing, so the line's consequence
does not describe this run. This is passed to the seat through the
report on #25054.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01FM29ZqLTrnPNXxijioZwMp)_
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent d96f618 commit c67f244
2 files changed
Lines changed: 79 additions & 4 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2273 | 2273 | | |
2274 | 2274 | | |
2275 | 2275 | | |
| 2276 | + | |
| 2277 | + | |
| 2278 | + | |
| 2279 | + | |
| 2280 | + | |
| 2281 | + | |
| 2282 | + | |
| 2283 | + | |
| 2284 | + | |
| 2285 | + | |
| 2286 | + | |
| 2287 | + | |
| 2288 | + | |
| 2289 | + | |
| 2290 | + | |
| 2291 | + | |
| 2292 | + | |
| 2293 | + | |
| 2294 | + | |
| 2295 | + | |
| 2296 | + | |
| 2297 | + | |
| 2298 | + | |
| 2299 | + | |
| 2300 | + | |
| 2301 | + | |
| 2302 | + | |
| 2303 | + | |
| 2304 | + | |
| 2305 | + | |
| 2306 | + | |
| 2307 | + | |
| 2308 | + | |
| 2309 | + | |
| 2310 | + | |
| 2311 | + | |
| 2312 | + | |
| 2313 | + | |
| 2314 | + | |
| 2315 | + | |
| 2316 | + | |
| 2317 | + | |
| 2318 | + | |
| 2319 | + | |
| 2320 | + | |
| 2321 | + | |
| 2322 | + | |
| 2323 | + | |
| 2324 | + | |
| 2325 | + | |
| 2326 | + | |
| 2327 | + | |
| 2328 | + | |
| 2329 | + | |
| 2330 | + | |
| 2331 | + | |
| 2332 | + | |
| 2333 | + | |
| 2334 | + | |
| 2335 | + | |
| 2336 | + | |
| 2337 | + | |
| 2338 | + | |
| 2339 | + | |
| 2340 | + | |
| 2341 | + | |
| 2342 | + | |
| 2343 | + | |
| 2344 | + | |
| 2345 | + | |
2276 | 2346 | | |
2277 | 2347 | | |
2278 | 2348 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1919 | 1919 | | |
1920 | 1920 | | |
1921 | 1921 | | |
1922 | | - | |
| 1922 | + | |
1923 | 1923 | | |
1924 | 1924 | | |
1925 | 1925 | | |
| |||
1933 | 1933 | | |
1934 | 1934 | | |
1935 | 1935 | | |
1936 | | - | |
1937 | | - | |
| 1936 | + | |
1938 | 1937 | | |
1939 | 1938 | | |
1940 | 1939 | | |
| |||
1987 | 1986 | | |
1988 | 1987 | | |
1989 | 1988 | | |
1990 | | - | |
| 1989 | + | |
1991 | 1990 | | |
1992 | 1991 | | |
1993 | 1992 | | |
| |||
2045 | 2044 | | |
2046 | 2045 | | |
2047 | 2046 | | |
| 2047 | + | |
| 2048 | + | |
| 2049 | + | |
| 2050 | + | |
| 2051 | + | |
| 2052 | + | |
2048 | 2053 | | |
2049 | 2054 | | |
2050 | 2055 | | |
| |||
0 commit comments