Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 19 additions & 5 deletions packages/spec/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2862,11 +2862,25 @@
milliseconds where its `resetTimeoutSeconds` sibling is seconds, so the two must
not be migrated as if they were one unit. `MetricExportConfig.batch.size` is a
record count and `QueueConfig.rateLimit.max` is a task count: neither is a
duration, so neither has a unit to carry. `ServiceLevelObjective.errorBudget`'s
burn-rate `window` and the OpenTelemetry exporter `timeout` name no unit
anywhere in their prose, so both are outside the gate's population entirely.
Pin tests assert each of these, so a later sweep cannot read this card as
"every duration-shaped number on these files".
duration, so neither has a unit to carry. As published, this entry continued:
"`ServiceLevelObjective.errorBudget`'s burn-rate `window` and the
OpenTelemetry exporter `timeout` name no unit anywhere in their prose, so
both are outside the gate's population entirely. Pin tests assert each of
these, so a later sweep cannot read this card as 'every duration-shaped
number on these files'." Both keys were renamed in the same major: #17783
renamed the burn-rate `window`
(`ServiceLevelObjective.errorBudget.burnRateWindows[].window`) to
`durationSeconds`, and #17785 renamed the OpenTelemetry exporter `timeout`
(`OpenTelemetryCompatibility.exporter.timeout`) to `timeoutMs`, with its
`batch.exportTimeout` sibling moving to `exportTimeoutMs` the same way.
Both are inside the gate's population now, each tombstoned with
`retiredKey()` naming the new spelling, and the pin tests that held the
bare names were rewritten by the same two PRs into rename-refusal pins.

*Erratum, 2026-09-13 — #17783 and #17785 renamed the two keys this entry
named as gate-exempt; both are tombstoned and inside the gate's
population as of `@objectstack/spec` 17. (Corrected after publication,
#18077.)*
- fb77aa5: feat(spec)!: a `tree` field's `reference`, when present, must name the declaring object — any other target is refused at parse (#14892)

<!-- adr-0087: not-required (no-migration-prescription) No authorable key is renamed, retired or re-typed: `reference` keeps its name, its type and its optionality on a `tree` field, and every self-referencing or reference-less `tree` parses byte-identically to before. What is newly refused is a `tree` whose `reference` names a different object — a shape no prose surface ever documented, that no runtime reader consumed as a cross-object link, and whose one in-repo author (the showcase field zoo) hedged in its own label. The remedy is authoring intent, not a mechanical rewrite: the author decides whether the field is this object's own hierarchy (a self-reference, or no `reference` at all) or a link to another object (a `lookup`), so `objectstack migrate meta` has nothing to rewrite and this changeset carries no rewrite instructions. -->
Expand Down
Loading