Skip to content

Commit a27f889

Browse files
fix(spec): re-anchor the authorable-surface anchor so an offline, tagless spec build passes (#27015) (#27020)
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/data-nested-object-door.test.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,8 @@ for (const cell of CELLS) {
309309
await engine.delete(OBJECT, { where: { id: 'd_cap' } } as any);
310310
await engine.delete(OWNER, { where: { region: { $in: ['CAP', 'CAP_EXTRA'] } }, multi: true } as any);
311311
}
312-
});
312+
// Budget for the 1,000-row seed and its 1,001-row delete on a loaded full-suite shard (#27037); the slowdown itself is #27004's.
313+
}, 30_000);
313314

314315
it('CONTROL the routes still answer the rows, and a file field\'s object reaches the driver unjudged', async () => {
315316
const na = await query({ where: { region: 'NA' } }, OWNER);

0 commit comments

Comments
 (0)