@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77
88## [ Unreleased]
99
10+ ## [ 1.9.16] - 2026-07-14
11+
1012### Added
1113
1214- ** Domain-Driven Design paradigm and the ceremony-audit review
@@ -34,8 +36,58 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3436 - ` .claude/rules/ceremony-requires-need.md ` : no DTO, mapper, command
3537 object, or layer boundary without a named, current need.
3638
39+ - ** ` select! ` orchestration rule and memory-allocation review
40+ lenses (pensive).** Two review capabilities landed as new modules
41+ inside existing skills (Fixes #598 , #599 ):
42+ - ` rust-review ` ` concurrency-patterns ` module: a rule flagging
43+ hand-rolled multi-task orchestration (2+ ` tokio::spawn ` handles
44+ torn down with consecutive ` abort() ` calls around an
45+ mpsc-shared sink) that a single ` select! ` loop expresses more
46+ safely, carrying the cancel-safety and head-of-line-blocking
47+ caveats the rewrite introduces. Wired into ` /rust-review ` and
48+ the ` rust-auditor ` agent.
49+ - ` performance-review ` ` memory-allocation-lenses ` module: three
50+ manual lenses for allocation blow-ups that keep unit tests
51+ green: unbounded collections fed from an external source,
52+ hot-path recompute that should be memoized behind a generation
53+ counter, and serial blocking I/O over an unbounded set. Written
54+ as review lenses, not AST detectors, so the performance-review
55+ detector-test rule visibly does not apply to them.
56+
3757### Fixed
3858
59+ - ** Two URLs with identical content desynced the capture index
60+ (memory-palace).** The web-capture guard was ` is_known(url=...) ` ,
61+ which consults URLs only, so a new URL serving bytes already on disk
62+ (an empty API result, a mirror, a redirect target) fell through to
63+ ` update_index ` . That overwrote ` hashes[content_hash] ` with the second
64+ capture's path and left the * first* entry pointing at a file the hash
65+ map no longer agreed with, plus a duplicate copy of the content on
66+ disk. ` update_index ` is now content-addressed: an entry whose bytes
67+ are already stored adopts the canonical location, so ` entries ` and
68+ ` hashes ` cannot disagree by construction. The capture hook checks
69+ ` get_stored_at ` first and indexes the new URL against the existing
70+ file rather than storing a second copy.
71+
72+ - ** Pruning one of two entries sharing a capture destroyed the
73+ survivor's dedup memory (memory-palace).** ` apply_orphan_prunes `
74+ popped the hash mapping unconditionally (its comment claimed a
75+ ` stored_at ` check the code never made). When two URLs shared one
76+ piece of content and only one was orphaned, the survivor's
77+ ` content_hash ` was left dangling, ` is_known ` reported its content
78+ unseen, and the next fetch re-captured a file already on disk.
79+ Removal is now refcount-aware: a mapping is dropped only when no
80+ surviving entry references it.
81+
82+ - ** The committed capture index was guarded by no test
83+ (memory-palace).** The index invariants were pinned only against
84+ synthesized ` tmp_path ` fixtures, and those fixtures derived each hash
85+ from the URL, so no two entries could ever collide and the bugs above
86+ were unreachable from the suite. ` tests/test_capture_index_artifact.py `
87+ now runs the same invariants against the artifact that actually ships:
88+ no dangling hashes, no orphan mappings, ` entries ` and ` hashes ` agreeing
89+ on ` stored_at ` , and required fields present.
90+
3991- ** Paradigm test harness could silently skip a new paradigm
4092 (archetypes).** ` EXPECTED_COMPONENTS ` was the only thing driving the
4193 parametrize, so a fourteenth paradigm could land on disk untested. The
@@ -90,30 +142,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
90142 trigger now matches ` pyproject.toml ` as well, which is what
91143 ` typecheck.yml ` already watched.
92144
93- ## [ 1.9.16] - 2026-07-05
94-
95- ### Added
96-
97- - ** ` select! ` orchestration rule and memory-allocation review
98- lenses (pensive).** Two review capabilities landed as new modules
99- inside existing skills (Fixes #598 , #599 ):
100- - ` rust-review ` ` concurrency-patterns ` module: a rule flagging
101- hand-rolled multi-task orchestration (2+ ` tokio::spawn ` handles
102- torn down with consecutive ` abort() ` calls around an
103- mpsc-shared sink) that a single ` select! ` loop expresses more
104- safely, carrying the cancel-safety and head-of-line-blocking
105- caveats the rewrite introduces. Wired into ` /rust-review ` and
106- the ` rust-auditor ` agent.
107- - ` performance-review ` ` memory-allocation-lenses ` module: three
108- manual lenses for allocation blow-ups that keep unit tests
109- green: unbounded collections fed from an external source,
110- hot-path recompute that should be memoized behind a generation
111- counter, and serial blocking I/O over an unbounded set. Written
112- as review lenses, not AST detectors, so the performance-review
113- detector-test rule visibly does not apply to them.
114-
115- ### Fixed
116-
117145- ** Leaked git environment in the plugin test runner (scripts).**
118146 Every test invocation now runs behind ` scripts/without-git-env.sh ` ,
119147 which unsets the whole ` GIT_* ` prefix before handing off to the
0 commit comments