Repository navigation
Commit a27f889
Fixes #27015
## What changes
- `packages/spec/authorable-surface.base.json` is re-anchored from
`85c6d76ec42a` to `7eb613c39f` (7,982 keys), with `pnpm --filter
@objectstack/spec gen:authorable-surface-base`, in a commit of its own.
- New pin
`packages/spec/scripts/authorable-surface-base.currency.pin.test.ts`:
reading only committed files, as an offline build does, every
`[RETIRED]` line the anchor records that the live surface has dropped
(in a def still on the surface) must be dated by
`RETIRED_KEYS_BY_MAJOR`. A line only the
`@objectstack/spec@<major-1>.0.0` tag can date fails the pin, with the
re-anchor command, and the in-PR alternative (an exact retired-key
entry), in the message.
- `scripts/docs-audit/affected-docs.mjs` self-test: the live-ratchet
tombstone specimen `ui/PageCardProps:body` aged out in #26599 and was
passing only through the stale anchor; it is now
`ui/Dashboard:refreshInterval`, a 18.x tombstone (`Flag docs affected by
code changes` was red on the first head).
- **Ported fix for #27037** (own commit `6674ba8e09`):
`packages/rest/src/data-nested-object-door.test.ts`, "the cap" case gets
an explicit `30_000` ms budget. It seeds 1,000 rows and deletes 1,001;
that takes 2.3 s alone, and twice ran past the default 5 s on a loaded
full-suite queue shard, ejecting this PR (queue runs 40619952219,
40621681807). The slowdown itself stays with #27004. Budget only, no
behaviour change.
## Why
#26599 (`dbf7e04adf`) aged the 16.x-and-older kits out and deleted their
tombstone lines. Online, the deletion gate (#4650) dates 38 of them
through the `@objectstack/spec@17.0.0` release tag (#25767). A build
with no route to origin/main anchors on the committed
`authorable-surface.base.json` instead, which still sat at
`85c6d76ec42a`, before that deletion. It cannot read or fetch the tag
either, so it refused all 38 lines and `@objectstack/spec#build` failed.
That is the cloud EE image check (`verify-objectos-ee-image.yml` builds
the framework layer offline), which blocks cloud's pin round on
cloud#3340.
Reproduced at `7eb613c39f` in a depth-1 clone with no tags and no remote
(`pnpm --filter @objectstack/spec gen:schema`):
| State | Result |
|:---|:---|
| committed anchor `85c6d76ec42a`, no tag | exit 1, "38 authorable
baseline line(s) were deleted without proof (#4650)" |
| same, with `@objectstack/spec@17.0.0` fetched | exit 0 |
| re-anchored file from this PR, no tag | exit 0 |
**Option 2 (date a tombstone offline without the tag) is not in this PR;
it needs a design call.** The 17.0.0 tag (`56724c5005`) is older than
the old anchor, so a `[RETIRED]` mark in the anchor does not by itself
prove the line predates the cut. An offline dating source would mean
committing the tag's retired set in-tree (a field the re-anchor writes,
or a separate snapshot) and verifying it against the tag wherever origin
is reachable, the way the anchor itself is verified (#5235). That
changes the gate's trust model, which today trusts the tag because a PR
cannot write it.
The pin is deliberately stricter than the gate on one shape: a tombstone
in a def still on the surface but unreachable from the metadata roots
(proof 2) also counts, since only the generator's Zod graph can tell
reachability. At the old anchor the pin reports 45 lines: the 38 the
offline gate refused plus 7 it proves unreachable. It errs toward a
re-anchor, never toward a broken offline build. A PR that ages out
tag-dated tombstones will now see this pin red on its own diff; its
remedy there is an exact `src/migrations/entries/retired-keys/` entry
per key (check (b2) accepts a row for an aged-out key), or a re-anchor
once the deletion is on main.
## Verification
- Offline repro table above (depth-1, tagless, remote-less clone at
`7eb613c39f`).
- New pin: green at `7eb613c39f`; red at the previous anchor (45 lines
listed).
- `pnpm --filter @objectstack/spec check:authorable-surface`: exit 0
online.
- `node scripts/docs-audit/check-affected-docs.mjs`: exit 0; the spec
tests that read the anchor (7 retirement tests, `renamed-defs`,
`check-generated-ledger`, the new pin): 142/142.
- `check:scripts-typecheck`, `check:test-typecheck`,
`check:cross-package-test-inputs`, `check:test-source-alias`,
`check:agent-test-spelling`, `check:shard-attestation`: all exit 0.
ESLint on the new file: clean.
- No changeset: neither file ships in the `@objectstack/spec` tarball
(`files` holds neither), so this PR publishes nothing; `skip-changeset`.
Clause-②: no
Metadata-protocol: none
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
- [x] 2. Every name I added uses the casing for its kind.
- [x] 3. No formatter ran; `pnpm lint` passes.
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. A change that publishes carries a changeset, and both
declaration lines are filled in here and in the changeset. (Publishes
nothing.)
- [x] 6. `packages/spec` touched: its generated artifacts are
regenerated and committed.
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English.
- [x] The *Before Submitting* list in CONTRIBUTING.md is done.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01QUs3Bshfmr8srPY21BVS4u
---------
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 5fe0b96 commit a27f889
4 files changed
Lines changed: 724 additions & 442 deletions
File tree
- packages
- rest/src
- spec
- scripts
- scripts/docs-audit
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
309 | 309 | | |
310 | 310 | | |
311 | 311 | | |
312 | | - | |
| 312 | + | |
| 313 | + | |
313 | 314 | | |
314 | 315 | | |
315 | 316 | | |
| |||
0 commit comments