You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 947d4f9
Browse filesBrowse the repository at this point in the historyBrowse files
* fix(spec): resolve a shadowed ADR-0087 alias by VALUE, not by always keeping it (#4923)
`renameKey` / `renameConfigKey` did nothing whenever the canonical key was
already present, so every D2 rename left the retired spelling sitting in the
converted metadata — the conversion had not finished converting. Invisible
while the flow-node config contracts were `.strip`; an execute-time guard
refusal once #4001 batch 9 made them strict.
Per the maintainer ruling recorded on the issue, the case now splits on whether
the two values disagree:
- equal (structural equality) -> the alias carries nothing the canonical key
does not, so it is deleted and the usual notice fires. Lossless hygiene,
inside the D2 contract, and idempotent in both shape and notices.
- different -> both keys survive and nothing is emitted. Two spellings with
two values is genuine author ambiguity; picking one would edit a config the
customer never agreed to. The surviving pair is what lets the strict gates
refuse with a prescription naming BOTH keys.
`renameConfigKey` now delegates to `renameKey` so the rule has one definition,
and the structural-equality predicate is the one the composer already used for
"same value composes fine" (#5005), extracted to `shared/deep-equal.ts` so the
two surfaces cannot disagree about what "the same" means.
`liftNotifySourceShape` follows the same rule: a nested part repeating its flat
counterpart is redundant (and `source` is dropped), a part that disagrees leaves
the node entirely untouched so `source` reaches the strict contract. The `wait`
node's loose-key lift is deliberately NOT covered and says so — it moves keys
between locations rather than resolving two spellings of one slot.
Batch-9 guidance reworded: a surviving twin is no longer "dead", it holds a
value the canonical key does not, so each prescription names both keys and asks
for a decision.
Also adopts `mapPageComponents` (#5509) for protocol-15
`page-component-visibility-to-visibleWhen` per #5511 — its existing fixture is
unchanged and stays green, which is the equivalence acceptance.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D
* fix(spec): guard the new equal-value branch against a self-rename, and finish the guidance sweep (#4923)
Follow-up on the same ruling.
`renameKey(dict, k, k)` would have reached the new equal-value branch, compared
the value against itself, called it a redundant twin and deleted the only copy.
No registry pair is written that way today (all 40 literal pairs scanned), so
this is a guard rather than a fix: one added later now converts nothing instead
of erasing data. Pinned by a test on both `renameKey` and `renameConfigKey`.
Also completes the batch-9 wording sweep the ruling asked for: the notify
guidance test still asserted the old "dead twin" reading, and the `source`
prescription said DISAGREES where the rest of the family says DIFFERENT. Both
now speak one vocabulary, and the test additionally requires each prescription
to say the two values differ — not just that one of them should be deleted.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018fxLGQdatPbBUvCgiVxg6D
---------
Co-authored-by: Claude <noreply@anthropic.com>
0 commit comments