|
1 | 1 | # Changelog |
2 | 2 |
|
| 3 | +## 0.5.2 |
| 4 | + |
| 5 | +Security hardening, bug fixes, and UX polish. |
| 6 | + |
| 7 | +### Security |
| 8 | + |
| 9 | +- **EDN read-eval disabled** — `*read-eval*` bound to false in introspect code verification; `{:readers {}}` added to all `edn/read-string` calls parsing LLM responses, checkpoints, and external data |
| 10 | +- **CORS restricted** — `file://` origins now require explicit `NOUMENON_ALLOW_FILE_ORIGIN` env var |
| 11 | +- **Admin-only endpoints** — `/api/query-raw` and `/api/ask/sessions` added to admin-only prefixes |
| 12 | +- **SSRF hardening** — CGN range `100.64.0.0/10` added to blocked IP patterns; `--` separator in git clone commands; proxy host URL validation |
| 13 | +- **Subprocess timeouts** — Python, Node, C, and Elixir import extractors now timeout after 30 seconds |
| 14 | +- **Hook state directory** — Moved from world-writable `/tmp` to user-private `~/.noumenon/tmp/` |
| 15 | +- **CI tag validation** — `GITHUB_REF_NAME` validated as semver before shell substitution in release workflow |
| 16 | +- **Credential handling** — Directory permissions set before writing config; warning on `--token` + `--insecure` |
| 17 | +- **MCP proxy** — Admin tool forwarding logged; read-only flag respected for `git_commit`; SSRF check on proxy host |
| 18 | +- **Electron navigation** — Restricted to exact daemon port instead of any localhost port |
| 19 | + |
| 20 | +### Fixes |
| 21 | + |
| 22 | +- **MCP digest skip flag** — Synthesize step was gated on `skip_analyze` instead of `skip_synthesize` |
| 23 | +- **Merge retry usage** — `invoke-merge` now accumulates LLM token usage from both attempts |
| 24 | +- **Agent nil dispatch** — Guard against nil tool dispatch when LLM sends only `:reflect` |
| 25 | +- **Benchmark stop-flag** — `run-benchmark!` accepts external stop-flag for HTTP introspect sessions |
| 26 | +- **Database deletion** — Removed post-Datomic filesystem deletion that could corrupt shared storage |
| 27 | +- **Session limit race** — `register-ask-session!` enforced atomically via single `swap!` |
| 28 | +- **Leaf file re-enrichment** — Files with no imports now get empty `[]` for `:file/imports` to prevent redundant re-processing |
| 29 | +- **Test speed** — 429 retry test binds `*max-retries*` to avoid 6-second sleep |
| 30 | +- **Limit param coercion** — HTTP query endpoints coerce string `:limit` to long |
| 31 | +- **History help text** — Replaced hardcoded prompt names with dynamic hint |
| 32 | + |
| 33 | +### UX Improvements |
| 34 | + |
| 35 | +- **CLI** — Spinner cleanup on API errors; actionable watch failure messages; dynamic prompt listing; post-setup instructions; upgrade progress spinner; explicit "Daemon: not running" message |
| 36 | +- **TUI** — Non-interactive auto-select warns to stderr; confirm defaults to false for safety |
| 37 | +- **UI** — Feedback polarity from event data; in-app delete confirmation; active nav indicator; flex layout for ask results; theme cached in localStorage; graph loading skeleton; empty table/history states; truncation with tooltips; formatted introspect deltas; error state on network failure |
| 38 | +- **MCP** — Digest description lists all pipeline steps; `skip_synthesize` in schema; search clarifies embed prerequisite; list_queries mentions required parameters |
| 39 | +- **Sidebar** — Unicode icons replace ambiguous single letters |
| 40 | +- **Benchmark** — "Select 2 runs to compare" hint text |
| 41 | + |
3 | 42 | ## 0.5.1 |
4 | 43 |
|
5 | 44 | TUI hotfix. |
|
0 commit comments