Commit a5ec0be
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
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
| 11 | + | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| |||
0 commit comments