Commit e00582b
release: v2.5.0 — audit every shipped surface, then repair what it found
Not a feature release. Twelve agents exercised the six user-facing surfaces
by RUNNING them rather than reading them; four more then attacked the fixes.
~134 defects closed across 41 files. Every number below was measured.
Three surfaces did not work at all:
- MCP could not survive a non-ASCII character under this host's default
codec (writes stored mojibake or failed; a strict codec killed the process
with no response). A 4301-digit int or ~3000 levels of nesting — both
reachable through an advertised tool argument, before validation — escaped
the too-narrow `except json.JSONDecodeError` and killed the server.
`params: null`, which many clients send for "no params", consumed the id
and never answered.
- The web viewer answered ZERO requests: one idle TCP pre-connect wedged a
single-threaded HTTPServer with no handler timeout, and `webbrowser.open`
triggers exactly that. It also sent `Access-Control-Allow-Origin: *`, and
anything POSTed is injected into the next session — a prompt-injection
channel — while POST itself rewrote the WRONG project's MEMORY.md.
- The standalone installer shipped NO user-facing surfaces: `~/.claude` held
`hooks/` and `settings.json` and nothing else. With no plan-refiner agent,
PLAN.md could never be populated — the v2.2 headline feature was dead on
that layout. It also crashed AFTER copying files on any settings.json it
could not parse (6 of 9 realistic shapes), leaving a half-installed tree.
Data integrity:
- Cross-project contamination. `_find_transcript_dir` matched on a SUBSTRING
of the project basename; on this machine `core` matched 131 of 179 slug
directories. A fixture seeded with 5 memories finished with 32 after a
278,700-record foreign transcript was ingested. Path mangling also missed
`_` and `.` (0 of 179 real dirs contain either), so any such path fell into
that branch by construction. Fuzzy matching deleted; ownership now proved
from the transcript's own `cwd`.
- The privacy filter failed OPEN above 100 tags — `<private>` content reached
the API call and the DB. 16,000 unterminated tags took re.sub 9,517 ms and
leaked the tail. Now a linear `str.find` scan, uncapped, failing CLOSED.
- `is_private` was computed after `_truncate_output` replaced a Read body
with "(file content)", so a private file's path reached the API anyway.
- `/cc-mem sql` exited 0 while permanently committing `DROP TABLE`.
Hooks:
- The v2.2 live-plan anchor had never fired through its own hook: PostToolUse
exited on the observation gate before reaching the plan block, and drift
counters varied silently by mode. Plan control is not observation.
- Hooks with hard host timeouts did not bound their LLM wall-clock, though
`call_llm`'s docstring requires it. session_start overran its 15s budget
with the SHIPPED DEFAULT config (2 candidates x 20s); stop.py was measured
being killed at 24.96s against 22s. `call_llm` gains an absolute `deadline`
that clamps each leg to the time remaining — stronger than the arithmetic,
because urlopen(timeout=) covers neither DNS nor the TLS handshake (a
SUCCESSFUL leg measured 1.48x its nominal timeout).
Added:
- tests/test_surfaces.py — first automated coverage for MCP, the web viewer
and the installer's settings.json matrix. All three had none, which is why
these defects shipped. Now a third release gate.
- cc_memory/core/version.py — single source, importable under BOTH the nested
and flat layouts (`import cc_memory` raises under flat, so the obvious
approach could not work). Twelve literals across five files removed.
- excluded_projects now works; config.json stripped to keys code reads.
Gates: compileall - tomllib 2.5.0 - smoke 79 [OK] rc=0 - carryover 14 passed
- surfaces PASSED - i18n 3 in-sync - 6 version sites agree. Both exes rebuilt;
installer PE subsystem verified 2 (GUI) -> 3 (CONSOLE), so --cli is visible
and returns an exit code.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>1 parent 5cfcd4d commit e00582b
41 files changed
Lines changed: 9059 additions & 1348 deletions
File tree
- .claude-plugin
- cc_memory
- cli
- core
- hooks
- llm
- mcp
- ui
- docs
- memory
- tests
- tools
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
13 | 19 | | |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | | - | |
| 6 | + | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
12 | | - | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
13 | 28 | | |
| 29 | + | |
14 | 30 | | |
15 | 31 | | |
16 | 32 | | |
| |||
27 | 43 | | |
28 | 44 | | |
29 | 45 | | |
30 | | - | |
| 46 | + | |
| 47 | + | |
31 | 48 | | |
32 | 49 | | |
33 | 50 | | |
| |||
36 | 53 | | |
37 | 54 | | |
38 | 55 | | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
39 | 81 | | |
40 | 82 | | |
41 | 83 | | |
| |||
49 | 91 | | |
50 | 92 | | |
51 | 93 | | |
52 | | - | |
53 | | - | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
54 | 109 | | |
55 | 110 | | |
56 | 111 | | |
57 | 112 | | |
58 | 113 | | |
59 | 114 | | |
60 | 115 | | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
61 | 137 | | |
62 | 138 | | |
63 | | - | |
| 139 | + | |
64 | 140 | | |
65 | 141 | | |
66 | | - | |
67 | | - | |
68 | | - | |
69 | | - | |
70 | | - | |
71 | | - | |
72 | | - | |
| 142 | + | |
| 143 | + | |
73 | 144 | | |
74 | 145 | | |
75 | 146 | | |
76 | 147 | | |
77 | | - | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
78 | 151 | | |
79 | 152 | | |
80 | 153 | | |
81 | 154 | | |
82 | 155 | | |
83 | | - | |
| 156 | + | |
84 | 157 | | |
85 | 158 | | |
86 | | - | |
87 | | - | |
88 | | - | |
89 | | - | |
90 | | - | |
91 | | - | |
92 | | - | |
93 | | - | |
94 | | - | |
95 | | - | |
96 | | - | |
| 159 | + | |
97 | 160 | | |
98 | 161 | | |
99 | 162 | | |
100 | 163 | | |
101 | | - | |
| 164 | + | |
102 | 165 | | |
103 | 166 | | |
104 | | - | |
105 | | - | |
106 | | - | |
107 | | - | |
108 | | - | |
109 | | - | |
110 | | - | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
111 | 171 | | |
112 | 172 | | |
113 | 173 | | |
114 | 174 | | |
115 | | - | |
| 175 | + | |
116 | 176 | | |
117 | 177 | | |
118 | 178 | | |
119 | 179 | | |
120 | 180 | | |
121 | | - | |
| 181 | + | |
122 | 182 | | |
123 | 183 | | |
124 | | - | |
125 | | - | |
126 | | - | |
127 | | - | |
128 | | - | |
129 | | - | |
130 | | - | |
131 | | - | |
132 | | - | |
133 | | - | |
134 | | - | |
| 184 | + | |
135 | 185 | | |
136 | 186 | | |
137 | 187 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
4 | 28 | | |
5 | 29 | | |
6 | 30 | | |
| |||
61 | 85 | | |
62 | 86 | | |
63 | 87 | | |
64 | | - | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
0 commit comments