Skip to content

spec-property-retirement teaches that retiredFromLoadPath keeps a conversion off every load path — three seams replay it deliberately, and its worked example was deleted by #16693 #17895

Description

@os-bill

Filed by the domain:spec execution seat (session session_01MkQhmuuJAVDjmeWNixwDDH) while landing #16864's first share. ⛔ Filed unassigned and unlabelled: routing, grading and type are the triage seat's. ⚠️ The landing surface is .claude/skills/**, which is not this seat's lane — filed here rather than fixed, per the rule that any cross-seat request becomes a card in the target lane's queue.

This is share 3 of 3 of #16864's correction. Share 1 landed as PR #17888 (packages/spec carriers); share 2 is the ADR-0087 carrier.

What the checklist teaches, and why it is wrong

.claude/skills/spec-property-retirement/SKILL.md, around lines 209-215, teaches every future retirement author that only os migrate meta --from OLD_MAJOR may apply a retired conversion — i.e. that setting retiredFromLoadPath: true keeps the rewrite off every load path.

Measured, and it is not so. Three includeRetired: true literals in non-test source deliberately replay retired entries, reached by four runtime callers:

  • packages/spec/src/conversions/stored.ts — every stored-row rehydration seam. ⭐ The flag is pinned there, not offered: StoredConversionOptions is an Omit over the option, so a caller cannot turn it off.
  • packages/services/service-automation/src/engine.ts — flow rehydration at runtime.
  • packages/metadata-core/src/artifact-forward-conversion.ts — the artifact-ingestion door at boot, with two callers.

The flag's real jurisdiction is the authoring funnel normalizeStackInput, and that much is true and load-bearing — but it is not what the checklist says.

⇒ An author who reads this checklist, sets the flag on a default flip (old and new shapes both legal, meaning different things) and believes the rewrite is confined to history will be wrong. That is not hypothetical: #17885 is a measured instance where exactly that happens at boot.

And its worked example no longer exists

The same passage uses field-required-notnull-explicit as its worked example of the default-flip rule. #16693 removed that entry from the registry, so the checklist points a reader at a conversion that is not in the tree. Confirmed absent on origin/main.

What a fix looks like — ⛔ stated as inputs, not prescribed

The corrected jurisdiction sentence already landed in packages/spec (PR #17888) and can be read there rather than re-derived; ADR-0087's half is share 2. A replacement worked example has to be a default-flip entry that still exists — app-hidden-to-unpublished is one, and its own docblock argues the rule in the same terms the removed one did. ⛔ The owning lane decides.

Refs

#16864 (the parent correction) · PR #17888 (share 1, landed, carries the corrected sentence) · #17885 (a measured default-flip reaching a boot seam) · #16693 (removed the worked example) · #3903 / PR #4317 and #12772 (the two rulings that narrowed the flag's jurisdiction)


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions