docs/solutions/workflow-issues/2026-04-09-slate-history-deleted-test-closure-must-follow-live-contract-width.md
packages/slate-history/test/** had 17 deleted legacy fixtures, but they did
not all mean the same thing anymore.
Some still matched the live slate-history contract. Others depended on wider
legacy behavior that the current package no longer claims.
Without classifying that split first, the closure would either:
The deleted family mixed three different buckets:
The tricky part was that the live package already advertises a narrower history model:
If you treat the deleted file list as one undifferentiated “restore it all” queue, you lose that distinction immediately.
Close the deleted family against the live contract, not the raw legacy file count.
For slate-history, that meant:
The recovered proof landed in history-contract.ts and now directly covers:
History.isHistory(...) across edit, undo, and redo lifecycleinsertText(...) undoinsertBreak() undoThe deleted rows that were wider than the live contract were cut explicitly:
The closure note for the family lives in 2026-04-09-slate-v2-slate-history-deleted-test-family-closure.md.
The closure becomes honest because it follows the same thing the release claim is supposed to follow: the current proved surface.
That avoids two bad failure modes:
It also keeps parent-package truth clean.
In this batch, packages/slate-history/test/** could close, but
packages/slate-history/** had to stay open because sibling deleted residue
still exists in:
packages/slate-history/src/history.tspackages/slate-history/CHANGELOG.mdslate-history specifically, treat these as the live contract anchors: