Skip to content

Commit a5ec0be

Browse files
os-billclaude
andauthored
docs(changeset): drop the migration framing from the EvalContext.api removal note (#18905)
Fixes #18842 Clause-②: no One line of prose in one pending changeset. No code, no package, no export, no published surface moves. ## What was contradicting what `.changeset/18318-evalcontext-no-query-api.md` carries an `adr-0087` disposition marker — an HTML comment, spelled out here in words because the platform rewrites that shape — declaring `not-required`, category `runtime-interface-only`, naming the symbol reference `packages/formula/src/types.ts` hash `EvalContext`. That disposition inherits the `no-migration-prescription` refusal (#8299). After PR #18834 landed the RETIREMENT arm in `scripts/check-adr-0087-registration.mjs`, the body's own lead line reads as a framed migration prescription: ``` **Migration — `api: { … }` → delete the property.** ``` So the changeset's head and its foot now say opposite things, and the gate refuses the claim the moment a diff makes it judge the file. **The refusal is right on its own terms and the detector is untouched here.** What is wrong is the disposition surface, so that is the only thing this PR moves. **In fairness to the author of #18318 / PR #18736: they did nothing wrong.** All four `runtime-interface-only` predicates were verified positively, and that author handed the detector miss up rather than letting it carry their claim. The defect was in the detector, closed by #18745 / PR #18834; what is left is that the new reading contradicts this one changeset's framing. That is why this diff edits somebody else's release note. ## The edit ``` - **Migration — `api: { … }` → delete the property.** + **Your fix — delete the `api: { … }` property.** ``` Five sentences follow it in the same paragraph and are byte-identical. ## Why the two sentences say the same thing to a consumer Token for token: | element | before | after | |:---|:---|:---| | the operand | `api: { … }` | `api: { … }` — unchanged, still a code span | | the verb | delete | delete | | the object | the property | the property | | the arrow | `→` | dropped | | the label | Migration | Your fix | The arrow is this repo's FROM/TO pair notation, and a pair notation reserves its right-hand place for a replacement NAME. There is no replacement name here — which is exactly why the author had to write an instruction in that position. Dropping a two-place notation that only ever had one place filled removes no information; the instruction that stood in the second place is still there, as the sentence's own verb. The label is the substantive half. In this repository "migration" names what the ADR-0087 ledger carries and what `objectstack migrate meta` performs, and the disposition two lines below states in writing that no such thing exists here: no Zod schema, no `packages/spec` declaration, no stored representation, nothing to rewrite. The paragraph was never a metadata migration; it is the one-line fix for a TypeScript consumer, delivered by the compiler at their own call site. AGENTS.md calls that element "the one-line fix", and the new label names it. Everything a consumer needs is still on the page and unchanged: what to delete, that there is no replacement key, that nothing is re-pointed, that no predicate result changes, that TypeScript is where they hear about it, that reading a related record's field stays unexpressible, and that no schedule is implied. ## LIT — the refusal was live before, and the claim is positively verified after Both legs run the shipping gate's own `scan()`, with base set to the parent of the commit that ADDED this changeset (`09e16a5745`, parent of `9be2b594af` / PR #18736), so the row arrives as `A` and is judged instead of inherited as stock. ``` BEFORE (84ba4a8) LIT-TARGET-PROBLEMS 1 LIT-TARGET-JUDGED-OK 0 `not-required (runtime-interface-only)` contradicts the changeset's own body, which carries a migration prescription. Evidence (framed-removal): **Migration — `api: { … }` → delete the property.** ... AFTER (66f12e4) LIT-TARGET-PROBLEMS 0 LIT-TARGET-JUDGED-OK 1 verdict: not-required, category: runtime-interface-only, ids: packages/formula/src/types.ts#EvalContext, detail: packages/formula/src/types.ts#EvalContext (interface) ``` The after leg is not silence: the gate judges the changeset and verifies the four `runtime-interface-only` predicates at HEAD. ## DARK — the whole stock, classified before and after `findMigrationPrescription` imported from the gate and run over every `.changeset/*.md` in the tree, both legs: ``` stock 428 BEFORE {framed-line:1, framed-removal:1, from-to-label:26, header-framed-table:2, null:398} AFTER {framed-line:1, from-to-label:26, header-framed-table:2, null:399} ``` A row-by-row diff of all 428 rows shows exactly one line changed: ``` < 18318-evalcontext-no-query-api.md framed-removal **Migration — `api: { … }` → delete the property.** ... > 18318-evalcontext-no-query-api.md null ``` The other 427 rows are byte-identical, branch and evidence line included. ## Gates All 18 families derived by `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` were run and reconciled with `--ran` (18 derived, 18 run, 0 NOT-MEASURED), plus `node scripts/check-changeset-fixed.mjs`, whose roster sits under `.changeset/` and which the derivation flags as neither-evidence for a path in that directory. Green, exit 0, except the one below. `node scripts/check-empty-changeset.mjs --base origin/main` — **exit 1, and it cannot be made green by this PR.** That gate refuses any diff that CHANGES a changeset it did not ADD, and it names the two shapes that produce the refusal. This is the second one: > DELIBERATE CORRECTION -- your change may have made this PENDING release note false, > and you rewrote it in the same stroke. Remedy: do NOT restore it -- say so on the PR > and get it confirmed; restoring it from the base would put the false sentence back. > ... this gate stays red either way, and staying red is what puts the decision in > front of a person instead of routing around it. So, saying so, as the gate asks: the note is `.changeset/18318-evalcontext-no-query-api.md`; what changed under it is its own ADR-0087 disposition reading, not any behaviour; and the rewrite is the lead line quoted above. Restoring it from the base would put back the contradiction this PR exists to remove. `Check Changeset` will therefore be red on two of its steps: this one, and "Require a changeset (or the skip-changeset label)", which counts `--diff-filter=A` rows and sees none. It is not one of the seven required contexts. **The `skip-changeset` label is deliberately NOT applied**, and that is a decision worth a second pair of eyes rather than a default: the label exempts the WHOLE job, so it would clear the deliberate-correction refusal along with the missing-changeset one — the routing-around the gate's own text forbids. Leaving it off keeps the decision visible. If the maintainer or the dispatching seat judges otherwise, the label is one additive write away. ## Acceptance notes Noted, not filed. - The card frames the future refusal as arriving when "any PR touches `packages/formula/src/types.ts`". That is not how the gate selects rows: `scan()` reads `git diff --name-status --diff-filter=AMR merge-base HEAD -- .changeset/*.md`, so the source file a PR touches never enters the selection. The reachable trigger is a PR whose merge base predates `9be2b594af` and which has since merged `main` — the changeset then arrives as an `A` row and is judged, which is precisely the leg this PR uses as its LIT probe. The direction of the card is right and its consequence is real; only the stated trigger is. - `runtime-interface-only` inherits a refusal written for metadata prescriptions, while the class it serves delivers through the compiler. #13080 recorded the same mismatch for `type-surface-only` and bought an exemption with predicate 4. No card is filed: this is an observation about a boundary, not a reproducible defect, not a violation of a declared contract, and not a trap that makes an author write metadata the runtime rejects. Prospective carrier: none — no open PR or queued issue touches this seam. --- _Generated by [Claude Code](https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent e3ca74e commit a5ec0be

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

‎.changeset/18318-evalcontext-no-query-api.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
The member's docblock said it was "implemented opportunistically by call sites that have a query engine", and no call site ever could: `ctx.api` was read **zero** times in this package — control in the same sweep, `ctx.user`, three reads in `stdlib.ts` — so the three functions reached no evaluation scope however completely a caller populated the member. An author who wrote a predicate to the declaration got `runtime: found no matching overload for 'dyn.lookup(string, dyn)'` instead, and because an unevaluable predicate refuses the write it guards, a validation rule authored that way locked **every** write on its object. The harm came from the declaration existing, not from the implementation missing, so it is removed rather than implemented — with the reason written at the deletion site, and with no shim, alias or reserved spelling left behind.
1010

11-
**Migration — `api: { … }` → delete the property.** There is no replacement key and nothing to re-point: every implementation ever passed there was discarded before evaluation, so removing the property changes no result your predicates produce. TypeScript is where you will hear about it: an `EvalContext` literal carrying `api` now fails to compile, which is the whole of the break. Reading a related record's field from inside a predicate remains unexpressible in any spelling — that capability is tracked as its own card, relationship traversal (`record.crm_account.type`), and deliberately not as `os.lookup` queries; no schedule is implied by this removal.
11+
**Your fix — delete the `api: { … }` property.** There is no replacement key and nothing to re-point: every implementation ever passed there was discarded before evaluation, so removing the property changes no result your predicates produce. TypeScript is where you will hear about it: an `EvalContext` literal carrying `api` now fails to compile, which is the whole of the break. Reading a related record's field from inside a predicate remains unexpressible in any spelling — that capability is tracked as its own card, relationship traversal (`record.crm_account.type`), and deliberately not as `os.lookup` queries; no schedule is implied by this removal.
1212

1313
<!-- adr-0087: not-required (runtime-interface-only packages/formula/src/types.ts#EvalContext) `EvalContext` is a published runtime TypeScript interface with no metadata surface — no Zod schema, no `packages/spec` declaration, no stored representation — so `objectstack migrate meta` has nothing to rewrite and the ledger has no channel to carry. The compiler at the consumer's own call site reaches every affected caller instead. Nothing is re-pointed either: `buildScope()` never read `ctx.api`, so the whole remedy is deleting a property that was already inert. -->
1414

0 commit comments

Comments
 (0)