Skip to content

Commit ca84387

Browse files
committed
fix(spec): the remaining migration-entry families state each lesson in words, not tracker numbers (stage 9)
Each ADR-0087 semantic entry that still cited a tracker, pull-request, decision-batch or cross-repository number in its replacement / reason / acceptanceCriteria prose now says what the cited ruling, measurement or fix decided. Verbatim quotes that carried a card or batch number keep only their operative words. ADR ids and contributor-guide rule references stay; the address entry's dangling AGENTS.md rule number is stated as the rule. Text only: no entry id, surface, conversion or matcher changes. Claude-Session: https://claude.ai/code/session_014EJ1ED8X4MMrT18BhVx4tx Co-authored-by: Claude <noreply@anthropic.com>
1 parent 682873f commit ca84387

45 files changed

Lines changed: 143 additions & 85 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎packages/spec/src/migrations/entries/semantic/17.approval-escalation-enabled-default-flip.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ export const entry: SemanticMigration = {
1616
+ 'the escalation sweep actually reads',
1717
reason:
1818
'A DECLARED-DEFAULT CORRECTION plus the enforcement that makes the key real '
19-
+ "(#12278, maintainer ruling 2026-08-27) — the same category as protocol 17's "
19+
+ "(maintainer ruling 2026-08-27, which moved the declared default to what the sweep had "
20+
+ "always done) — the same category as protocol 17's "
2021
+ '`import-run-automations-declared-default-corrected`: the schema promised '
2122
+ '`enabled` defaults to `false` (SLA off) while the plugin-approvals sweep never '
2223
+ 'read the key at all — any escalation block with a positive `timeoutHours` '

‎packages/spec/src/migrations/entries/semantic/17.auth-config-unadvertised-reserved-features.ts‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,16 @@ export const entry: SemanticMigration = {
1111
+ 'client: no login UI anywhere renders a passkey or magic-link affordance off them, so '
1212
+ 'the payload advertised two sign-in methods a user could never reach, and a deployer '
1313
+ 'setting `plugins.passkeys` / `plugins.magicLink` flipped a switch with no observable '
14-
+ 'effect (ADR-0049 enforce-or-remove; maintainer ruling 2026-08-11 on #7481 chose remove '
15-
+ 'over keep-as-reserved). The two are not equally empty: nothing at all is wired behind '
14+
+ 'effect (ADR-0049 enforce-or-remove; the maintainer ruling of 2026-08-11 chose remove '
15+
+ 'over keep-as-reserved, so that a deployer cannot flip a flag that does nothing '
16+
+ 'anywhere). The two are not equally empty: nothing at all is wired behind '
1617
+ '`passkeys`, whereas `magicLink`\'s better-auth endpoints are live and only their '
1718
+ 'advertisement was withdrawn. This is a RESPONSE surface — nobody authors or persists '
1819
+ 'an `AuthFeaturesConfig` — so there is no source for the chain to rewrite; the schema '
1920
+ 'tombstones both keys via retiredKey() and consumers drop their read. The withdrawal is '
2021
+ 'conditional: both return to the payload in the change that ships the login UI '
21-
+ '(objectui#4179). ADR-0049, #7481.',
22+
+ '(flag-gated passkey and magic-link entry points, which objectui defers until the '
23+
+ 'maintainer schedules them). ADR-0049.',
2224
acceptanceCriteria:
2325
'No client reads `features.passkeys` or `features.magicLink` off `/api/v1/auth/config`; '
2426
+ 'a client that gated UI on either now treats the capability as absent rather than '

‎packages/spec/src/migrations/entries/semantic/17.batch-row-result-schema-shape.ts‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,18 @@ export const entry: SemanticMigration = {
2020
+ 'validated and read `undefined` at runtime — the declared-but-not-delivered shape this '
2121
+ 'registry exists to close, on the response envelope (ADR-0119 D4 deferred the '
2222
+ 'reconciliation off a bug fix; this is that tracked change, shipped in the 17 major '
23-
+ 'window). The ADR-0119/#4620 rollback marking is structured in the same move: the '
23+
+ 'window). The ADR-0119 rollback marking, which the fix making `deleteManyData` and '
24+
+ '`updateManyData` honour `atomic` carried to those two endpoints, is structured in the '
25+
+ 'same move: the '
2426
+ '`ROLLED_BACK:` / `NOT_ATTEMPTED:` message-string prefixes become registered '
2527
+ '`ApiError.code` values (message keeps the human-readable cause and causal row index), '
2628
+ 'so "attempted and undone" vs "never ran" is machine-readable instead of a regex '
2729
+ 'convention. A RESPONSE surface — nothing stored in stack metadata carries a batch '
2830
+ 'row, so there is no source for the chain to rewrite; consumers of the legacy keys '
2931
+ 'move their reads themselves. Off-contract readers only: the legacy keys were never '
30-
+ 'in the schema or the SDK types, so a typed consumer needs no change. #4793.',
32+
+ 'in the schema or the SDK types, so a typed consumer needs no change. Ruled 2026-08-03: '
33+
+ 'the implementation moves to the schema\'s shape as a hard cut in the 17 major, with no '
34+
+ 'dual-emit transition.',
3135
acceptanceCriteria:
3236
'No consumer reads `row.error` or `row.record` on a batch result row; failures are read '
3337
+ 'from `row.errors` (message via `errors[0].message`, rollback state via '

‎packages/spec/src/migrations/entries/semantic/17.connector-inline-authentication-publish-refused.ts‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ export const entry: SemanticMigration = {
1414
'still carries resolved secrets inline.',
1515
reason:
1616
'A published connector row lands whole in `sys_metadata`, so an inline `token` / `key` ' +
17-
'/ `password` / `clientSecret` is cleartext at rest, readable through the data API ' +
18-
'(#7990). No mechanical rewrite exists: whether the entry should become a `none` ' +
19-
'descriptor or a provider-bound instance with a `credentialRef` — and which secret ' +
17+
'/ `password` / `clientSecret` is cleartext at rest, readable through the data API (the ' +
18+
'class a credential-persistence survey measured: any authored artefact whose schema ' +
19+
'permits an inline credential lands it there). No mechanical rewrite exists: whether ' +
20+
'the entry should become a `none` descriptor or a provider-bound instance with a ' +
21+
'`credentialRef` — and which secret ' +
2022
'store receives the credential — is a judgment about the connector, not a rename.',
2123
acceptanceCriteria:
2224
'Every authored connector entry parses through `DeclarativeConnectorEntrySchema`; no ' +

‎packages/spec/src/migrations/entries/semantic/17.enhanced-api-error-field-errors-renamed.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ export const entry: SemanticMigration = {
1313
'was reading a field no server sent (ADR-0078\'s silently-inert declaration, on the ' +
1414
'error envelope). This is a RESPONSE surface: no stack, example or template carries ' +
1515
'the key, so there is no source for the chain to rewrite — the schema tombstones it ' +
16-
'via retiredKey() and consumers move their read themselves. ADR-0114 D4, #3977.',
16+
'via retiredKey() and consumers move their read themselves. ADR-0114 D4 (the ' +
17+
'field-level error code catalog).',
1718
acceptanceCriteria:
1819
'No consumer reads `error.fieldErrors`; per-field validation detail is read from ' +
1920
'`error.fields`, and constructing an EnhancedApiError with `fieldErrors` fails to parse ' +

‎packages/spec/src/migrations/entries/semantic/17.job-retry-policy-constraints-tightened.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ export const entry: SemanticMigration = {
77
surface: 'job.retryPolicy.maxRetries (> 10) / job.retryPolicy.backoffMultiplier (< 1)',
88
replacement: 'maxRetries <= 10, and backoffMultiplier >= 1',
99
reason:
10-
'The converged RetryPolicy (#4661) keeps the automation side\'s bounds, which the job '
10+
'The RetryPolicy converged onto one declaration from its automation and system copies '
11+
+ 'keeps the automation side\'s bounds, which the job '
1112
+ 'side never had: `maxRetries` is capped at 10 and `backoffMultiplier` floored at 1. '
1213
+ 'Neither has a lossless rewrite. Clamping `maxRetries: 20` to 10 would halve a '
1314
+ 'retry budget its author chose, and a `backoffMultiplier` below 1 describes a delay '

‎packages/spec/src/migrations/entries/semantic/17.position-permissions-column-retired.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ export const entry: SemanticMigration = {
2121
+ 'A value that was recording intent as documentation belongs in `description`, '
2222
+ 'which remains declared',
2323
reason:
24-
'Maintainer ruling 2026-08-20 (#9885), ADR-0049 enforce-or-remove: REMOVE. The '
24+
'Maintainer ruling 2026-08-20 on the finding that nothing writes or reads this column, '
25+
+ 'ADR-0049 enforce-or-remove: REMOVE. The '
2526
+ 'object-scoped census (all sys_position-naming files, with same-object positive '
2627
+ 'controls resolving `active` / `delegatable` / `is_default` / `name` to real '
2728
+ 'readers) measured the column at zero on both sides: the only row writers — the '

‎packages/spec/src/migrations/entries/semantic/17.ups-delegated-from-column-retired.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ export const entry: SemanticMigration = {
2020
+ 'until Y". A permission-set grant that needs a provenance note keeps `reason` '
2121
+ '(free text), which remains declared on both grant tables',
2222
reason:
23-
'Maintainer ruling 2026-08-18 (#9730), ADR-0049 enforce-or-remove: REMOVE. The '
23+
'Maintainer ruling 2026-08-18 on the finding that the delegation gate never reads this '
24+
+ 'column on this object, ADR-0049 enforce-or-remove: REMOVE. The '
2425
+ 'runtime delegation gate is structurally scoped to sys_user_position '
2526
+ '(`isDelegationWrite` returns false for every other object, so '
2627
+ '`assertSelfDelegation` is unreachable for this table), and the explain engine '

‎packages/spec/src/migrations/entries/semantic/17.workflow-service-slot-retired.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ export const entry: SemanticMigration = {
1717
+ 'repository ever registered or resolved it (ADR-0115 Evidence 5 — the only touches '
1818
+ 'were plugin-dev\'s retired stub probe and the generic discovery walk), no '
1919
+ 'implementation of any WorkflowProtocol method ever existed, and no host ever '
20-
+ 'mounted `/api/v1/workflow` (the pre-#3586 DEFAULT_DISPATCHER_ROUTES listed it among '
20+
+ 'mounted `/api/v1/workflow` (DEFAULT_DISPATCHER_ROUTES, before it was retired as a '
21+
+ 'stale list, named it among '
2122
+ 'routes that never existed). Every part of it was ADR-0078\'s silently-inert '
2223
+ 'declaration: a CoreServiceName nothing filled, a contract nothing implemented, a '
2324
+ 'protocol nothing served, a discovery route field no builder could truthfully '
2425
+ 'populate. These are TS/API surfaces and a discovery RESPONSE field — never stored '
2526
+ 'in stack metadata, so there is no source for the chain to rewrite; consumers of the '
26-
+ 'deleted types move their imports themselves. ADR-0049 / ADR-0078, #4451.',
27+
+ 'deleted types move their imports themselves. ADR-0049 / ADR-0078.',
2728
acceptanceCriteria:
2829
'No import of IWorkflowService, WorkflowProtocol or the Get/WorkflowState/Config/'
2930
+ 'Transition types resolves; no code calls getService(\'workflow\') or reads '

‎packages/spec/src/migrations/entries/semantic/18.address-location-value-unknown-keys-refused.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ export const entry: SemanticMigration = {
1313
+ 'exactly `lat`, `lng`, `altitude`, `accuracy`. Every rejection carries the surface, the '
1414
+ 'offending key and a rename (`postal_code` / `zipCode` / `zip` / `postcode` → `postalCode`, '
1515
+ '`latitude` → `lat`, `longitude` → `lng`). A key that names no declared member is removed '
16-
+ 'at the producer — never tolerated at a consumer (AGENTS.md #0.1)',
16+
+ 'at the producer — never tolerated at a consumer: an alias for an off-spec key in a '
17+
+ 'consumer stays forbidden (contract-first — fix the metadata, not the runtime)',
1718
reason:
1819
'Maintainer ruling 2026-09-01, option A: both value classes refuse undeclared keys. Both '
1920
+ 'value classes were all-optional '

0 commit comments

Comments
 (0)