Complete task002 through task016 across cache correctness, editor lifecycle, C boundaries, build and release governance, dictionary provenance, performance, interactive workflows, tests, documentation, and final cleanup.
1.9 KiB
1.9 KiB
Change Log: Complete DP Cache Signature 2026-07-28
task002
-
Modify —
ekp.el- Replaced the width/looseness special-case key with one flat signature
containing every runtime DP input not frozen into
ekp-para. - Changed each paragraph's DP cache from
eqlto structuralequalcomparison. - Result: parameter changes cannot alias stale results, and structurally identical non-zero-looseness signatures now hit the cache.
- Replaced the width/looseness special-case key with one flat signature
containing every runtime DP input not frozen into
-
Modify —
tests/ekp-tests.el- Added six parameter-by-parameter cached-vs-fresh regressions through
ekp-dp-cache. - Added an identity/count assertion proving the fix preserves real cache hits instead of merely forcing recomputation.
- Added six parameter-by-parameter cached-vs-fresh regressions through
-
Modify — public and developer documentation
- Removed the temporary manual-cache-clear workaround.
- Documented the complete signature and added an Unreleased changelog entry.
- Preserved the dated audit evidence while recording the follow-up status.
-
Add —
postmortem/20260728-dp-cache-signature.md- Recorded why a complete structural key was chosen over watchers, collision-prone hashes, or another mutable signature owner.
Validation
- Focused red: 0/2 expected tests passed on the old key.
- Focused green: 2/2 passed on the complete signature.
- Full source ERT: 96/96.
- Full compiled ERT: 96/96.
- C/Elisp fuzz: 300/300.
- Byte compilation with warnings as errors: clean.
- checkdoc: clean.
- Public rendered-output probe: cached and fresh results match in both Elisp and C modes after a penalty change.
- 100,000 cache-hit microbenchmark: approximately 0.37 seconds versus 0.17 seconds for the old scalar key (about 2 microseconds per lookup).
Risk
- Cache keys are small structural lists instead of scalar/cons
eqlkeys. - Deliberately sweeping many parameter combinations retains one result per signature until the paragraph cache is cleared.
- No public API, C ABI, paragraph format, or saved-file format changed.