Skip to content

Commit e50c8c9

Browse files
authored
release: v0.19.1 (#3028)
* release: prepare v0.19.1 * docs: update book for v0.19.1 release Updated mdBook documentation to reflect v0.19.1 changes: - Added v0.19.1 entry to changelog with summary of key features - Added /tasks command to TUI command palette documentation - Added Task Supervision section to Code Indexing page - Added TaskSupervisor Metrics section to Observability page Changes include new TUI task registry panel, TaskSupervisor CPU/wall-time metrics, per-chunk code indexing supervision, and bootstrap memory loop migration. * docs(specs): update specs for v0.19.1 - 039-background-task-supervisor: reflect completed Phase 2 (TaskSupervisor migration to leaf crates, bootstrap memory loops, blocking semaphore, CPU/wall-time metrics, Arc<str> task names, shutdown race fix, exponential backoff, 6 regression tests, BlockingSpawner integration) - 043-zeph-common: add BlockingSpawner trait (FR-011, data model, edge cases, cross-links to 039 and 017) - 017-index: document file watcher debounce (500ms), Qdrant upsert timeout (30s), re-entry guard, BlockingSpawner integration, IndexerConfig safe defaults - 011-tui: add /tasks command and TaskRegistryWidget, log fallback to platform log dir, audit log redirect in TUI mode, per-frame clone elimination - 012-graph-memory: add OOM guard invariant for detect_communities - 001-system-invariants: add RuntimeContext contract (section 16) * fix(deps): update rustls-webpki to 0.103.12, ignore RUSTSEC-2026-0097 via age
1 parent aa67ed2 commit e50c8c9

16 files changed

Lines changed: 446 additions & 443 deletions

File tree

.github/deny.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ db-urls = ["https://github.com/rustsec/advisory-db"]
1313
# rustls-pemfile unmaintained (RUSTSEC-2025-0134, via qdrant-client -> tonic 0.12)
1414
# Blocked on qdrant/rust-client#255 (tonic 0.14 upgrade removes rustls-pemfile)
1515
# number_prefix unmaintained (via indicatif -> hf-hub, candle transitive dep)
16-
# astral-tokio-tar PAX extension validation (RUSTSEC-2026-0066, via testcontainers dev-dep)
17-
# Fix requires astral-tokio-tar >= 0.6.0 but testcontainers 0.27.1 pins 0.5.x (semver break)
18-
ignore = ["RUSTSEC-2025-0134", "RUSTSEC-2024-0436", "RUSTSEC-2026-0066"]
16+
# rand 0.8.5 unsound with custom logger (RUSTSEC-2026-0097, via age v0.11.2)
17+
# Blocked on age upgrading to rand >=0.9.3; we do not use rand::rng() in any logger
18+
ignore = ["RUSTSEC-2025-0134", "RUSTSEC-2024-0436", "RUSTSEC-2026-0097"]
1919

2020
[licenses]
2121
confidence-threshold = 0.93

CHANGELOG.md

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,55 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
66

77
## [Unreleased]
88

9-
### Changed
10-
11-
- **RuntimeContext struct** (`#3016`): introduced `zeph_core::RuntimeContext` (`Copy + Clone + Debug + Default + PartialEq + Eq`) carrying `tui_mode` and `daemon_mode` flags. All subsystem initializers in `runner.rs`, `tracing_init.rs`, and `daemon.rs` now receive a single `RuntimeContext` instead of individual `bool` parameters. The `suppress_stderr()` helper centralizes the TUI/daemon stderr suppression decision.
12-
13-
### Fixed
14-
15-
- **CPU/RAM regression: graph community detection OOM** (`#3007`): `detect_communities` in
16-
`zeph-memory` now guards `edge_chunk_size = 0` by falling back to `10_000` with a `WARN`
17-
log, preventing full edge table load into a single `HashMap` that caused 12 GB RAM spikes.
18-
19-
- **CPU/RAM regression: Qdrant upsert indefinite block** (`#3004`): `upsert_chunks_batch`
20-
in `zeph-index` is now wrapped with a 30-second `tokio::time::timeout`. On expiry, the
21-
batch is skipped with a `WARN` log and indexing continues instead of stalling indefinitely.
22-
23-
- **CPU/RAM regression: `Box::leak` per indexed file** (`#3005`): `BlockingSpawner::spawn_blocking_named`
24-
signature changed from `&'static str` to `Arc<str>` — eliminating the `Box::leak` call in
25-
`CodeIndexer::index_file` that accumulated one heap allocation per file watcher event.
26-
`TaskEntry`, `TaskSnapshot`, and `Completion` name fields are all `Arc<str>`.
27-
28-
- **CPU regression: file watcher debounce** (`#3006`): `zeph-index` watcher now collects
29-
FS events in a 500 ms debounce window (max 5 s cap) and reindexes each changed path
30-
at most once per window, preventing CPU saturation during git operations or editor saves.
31-
32-
- **TUI log silence: fallback to platform log directory** (`#3008`): when TUI mode is
33-
active with no `logging.file` configured and OTLP is disabled, `tracing_init` now
34-
automatically adds a file appender using `default_log_file_path()` (`~/Library/Application Support/Zeph/logs/zeph.log` on macOS) so logs are never silently discarded.
35-
36-
- **`TaskSupervisor` blocking task capacity limit** (`#3009`): a configurable
37-
`tokio::sync::Semaphore` (default capacity 8) now gates `spawn_blocking`, preventing
38-
uncontrolled thread pool saturation when multiple subsystems index concurrently.
39-
40-
- **Concurrent `index_project` re-entry guard** (`#3010`): `CodeIndexer` tracks an
41-
`AtomicBool` flag; a second concurrent call to `index_project` returns
42-
`Ok(IndexReport::default())` immediately with an `INFO` log rather than running a
43-
redundant full-index pass.
44-
45-
- **OTLP circuit breaker on export failure** (`#3011`): a `CircuitBreakerExporter` wrapper
46-
(`src/circuit_breaker_exporter.rs`) opens the circuit after 3 consecutive BSP export
47-
failures and applies exponential backoff (5 s → 30 s → 300 s). `open_count` resets on
48-
successful export after recovery, preventing permanent 300 s stalls.
49-
50-
- **Audit log silently dropped in TUI mode** (`#3012`): `AuditLogger::from_config` now
51-
accepts `tui_mode: bool`; when `destination = stdout` and TUI mode is active, output is
52-
redirected to the configured audit file path with a startup `WARN`.
53-
54-
- **`IndexerConfig` safe defaults** (`#3013`): reduced defaults to prevent resource
55-
saturation on typical developer machines: `memory_batch_size` 32→16,
56-
`embed_concurrency` 2→1, `concurrency` 4→2, `batch_size` (Qdrant) 32→16. All values
57-
remain user-configurable.
9+
## [0.19.1] - 2026-04-15
5810

5911
### Added
6012

@@ -110,8 +62,56 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
11062
`supervisor.shutdown_all(10s)` added to the orderly shutdown sequence.
11163
`start_*` functions in `zeph-memory` now return `impl Future` instead of `JoinHandle`.
11264

65+
### Changed
66+
67+
- **RuntimeContext struct** (`#3016`): introduced `zeph_core::RuntimeContext` (`Copy + Clone + Debug + Default + PartialEq + Eq`) carrying `tui_mode` and `daemon_mode` flags. All subsystem initializers in `runner.rs`, `tracing_init.rs`, and `daemon.rs` now receive a single `RuntimeContext` instead of individual `bool` parameters. The `suppress_stderr()` helper centralizes the TUI/daemon stderr suppression decision.
68+
11369
### Fixed
11470

71+
- **CPU/RAM regression: graph community detection OOM** (`#3007`): `detect_communities` in
72+
`zeph-memory` now guards `edge_chunk_size = 0` by falling back to `10_000` with a `WARN`
73+
log, preventing full edge table load into a single `HashMap` that caused 12 GB RAM spikes.
74+
75+
- **CPU/RAM regression: Qdrant upsert indefinite block** (`#3004`): `upsert_chunks_batch`
76+
in `zeph-index` is now wrapped with a 30-second `tokio::time::timeout`. On expiry, the
77+
batch is skipped with a `WARN` log and indexing continues instead of stalling indefinitely.
78+
79+
- **CPU/RAM regression: `Box::leak` per indexed file** (`#3005`): `BlockingSpawner::spawn_blocking_named`
80+
signature changed from `&'static str` to `Arc<str>` — eliminating the `Box::leak` call in
81+
`CodeIndexer::index_file` that accumulated one heap allocation per file watcher event.
82+
`TaskEntry`, `TaskSnapshot`, and `Completion` name fields are all `Arc<str>`.
83+
84+
- **CPU regression: file watcher debounce** (`#3006`): `zeph-index` watcher now collects
85+
FS events in a 500 ms debounce window (max 5 s cap) and reindexes each changed path
86+
at most once per window, preventing CPU saturation during git operations or editor saves.
87+
88+
- **TUI log silence: fallback to platform log directory** (`#3008`): when TUI mode is
89+
active with no `logging.file` configured and OTLP is disabled, `tracing_init` now
90+
automatically adds a file appender using `default_log_file_path()` (`~/Library/Application Support/Zeph/logs/zeph.log` on macOS) so logs are never silently discarded.
91+
92+
- **`TaskSupervisor` blocking task capacity limit** (`#3009`): a configurable
93+
`tokio::sync::Semaphore` (default capacity 8) now gates `spawn_blocking`, preventing
94+
uncontrolled thread pool saturation when multiple subsystems index concurrently.
95+
96+
- **Concurrent `index_project` re-entry guard** (`#3010`): `CodeIndexer` tracks an
97+
`AtomicBool` flag; a second concurrent call to `index_project` returns
98+
`Ok(IndexReport::default())` immediately with an `INFO` log rather than running a
99+
redundant full-index pass.
100+
101+
- **OTLP circuit breaker on export failure** (`#3011`): a `CircuitBreakerExporter` wrapper
102+
(`src/circuit_breaker_exporter.rs`) opens the circuit after 3 consecutive BSP export
103+
failures and applies exponential backoff (5 s → 30 s → 300 s). `open_count` resets on
104+
successful export after recovery, preventing permanent 300 s stalls.
105+
106+
- **Audit log silently dropped in TUI mode** (`#3012`): `AuditLogger::from_config` now
107+
accepts `tui_mode: bool`; when `destination = stdout` and TUI mode is active, output is
108+
redirected to the configured audit file path with a startup `WARN`.
109+
110+
- **`IndexerConfig` safe defaults** (`#3013`): reduced defaults to prevent resource
111+
saturation on typical developer machines: `memory_batch_size` 32→16,
112+
`embed_concurrency` 2→1, `concurrency` 4→2, `batch_size` (Qdrant) 32→16. All values
113+
remain user-configurable.
114+
115115
- **TUI: remove per-frame message list clone** (`#2955`): `visible_messages().into_owned()` in
116116
`chat.rs` replaced with a borrowed reference; eliminates ~20,000 `ChatMessage` clones/sec at
117117
2000-message history, reducing idle CPU usage proportional to message count.
@@ -3985,7 +3985,8 @@ let agent = Agent::new(provider, channel, &skills_prompt, executor);
39853985
- Agent::run() uses tokio::select! to race channel messages against shutdown signal
39863986

39873987
[0.16.0]: https://github.com/bug-ops/zeph/compare/v0.15.3...v0.16.0
3988-
[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.19.0...HEAD
3988+
[Unreleased]: https://github.com/bug-ops/zeph/compare/v0.19.1...HEAD
3989+
[0.19.1]: https://github.com/bug-ops/zeph/compare/v0.19.0...v0.19.1
39893990
[0.19.0]: https://github.com/bug-ops/zeph/compare/v0.18.6...v0.19.0
39903991
[0.18.6]: https://github.com/bug-ops/zeph/compare/v0.18.5...v0.18.6
39913992
[0.18.5]: https://github.com/bug-ops/zeph/compare/v0.18.4...v0.18.5

Cargo.lock

Lines changed: 27 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)