|
8 | 8 |
|
9 | 9 | ## Current Tasks |
10 | 10 |
|
11 | | -### MemoryGuard: fix underflow in `release()` |
12 | | - |
13 | | -`MemoryGuard::release()` uses `AtomicU64::fetch_sub` which wraps on underflow. |
14 | | -Releasing more bytes than were added produces `u64::MAX - N` instead of saturating |
15 | | -at zero. Found by dfe-loader resilience tests. |
16 | | - |
17 | | -- [ ] Change `fetch_sub` to saturating subtraction (`fetch_update` with `saturating_sub`) |
18 | | -- [ ] Add unit test for over-release scenario |
19 | | -- [ ] Publish patch release |
20 | | - |
21 | | -### CEL Expression Module — CI Fix Required `[IN PROGRESS]` |
22 | | - |
23 | | -**Goal:** Publish v1.13.0 with `expression` feature to JFrog |
24 | | - |
25 | | -Code is committed (`83713e6`), 425/426 tests pass. CI fails on pre-existing flaky test. |
26 | | - |
27 | | -1. [x] Create `src/expression/` module (evaluator, profile, error) |
28 | | -2. [x] Add `expression` feature flag with `cel-interpreter` dependency |
29 | | -3. [x] 70 integration tests + 7 unit tests passing |
30 | | -4. [x] Clippy pedantic clean (`#[must_use]`, `implicit_hasher`) |
31 | | -5. [ ] Fix `test_instance_id_stable` flaky test (race condition on `~/.config/hyperi/instance_id`) |
32 | | -6. [ ] CI green → Semantic Release → v1.13.0 → Publish to JFrog |
| 11 | +### Gap Analysis P2 — HTTP Client, Database URLs, Cache `[NEXT]` |
| 12 | + |
| 13 | +- [ ] HTTP client module with retry middleware (reqwest + reqwest-middleware + reqwest-retry) |
| 14 | + - Wrap reqwest with exponential backoff, configurable timeouts |
| 15 | + - Auto-register config via `unmarshal_key_registered` |
| 16 | + - Metrics integration (request count, duration, errors) |
| 17 | +- [ ] Database URL builders (PostgreSQL, ClickHouse, Redis) |
| 18 | + - Build connection strings from env vars with standard prefixes |
| 19 | + - `SensitiveString` for password fields |
| 20 | +- [ ] Cache module with disk/memory backends |
| 21 | + - Consolidate secrets cache pattern into reusable module |
| 22 | + - TTL, stale-while-revalidate, size bounds |
33 | 23 |
|
34 | 24 | ### Completed Recent |
35 | 25 |
|
| 26 | +- [x] **Config registry** (v1.19.3-v1.19.5) — auto-registering reflectable config, `/config` admin endpoint, `SensitiveString`, heuristic redaction, change notification, `ConfigReloader` hook |
| 27 | +- [x] **CEL expression profile** (v1.19.2) — `matches()` blocked by default, `ProfileConfig` with per-category overrides, string literal false-positive prevention |
| 28 | +- [x] **Config cascade wiring** (v1.19.2) — expression, memory, version_check, scaling, grpc, secrets auto-read from figment cascade |
| 29 | +- [x] **MemoryGuard underflow fix** (v1.19.1) — `fetch_sub` replaced with `fetch_update` + `saturating_sub` |
| 30 | +- [x] **Test restructure** (v1.19.1) — `tests/integration/`, `tests/e2e/`, `tests/common/` per testing standard |
| 31 | +- [x] **hyperi-ci release-merge** — CLI command replaces per-project workflow files |
36 | 32 | - [x] **Rust edition 2024** — migrated from 2021; `temp-env` replaces unsafe `set_var`/`remove_var` in tests across 6 files |
37 | 33 | - [x] **async-trait removal** — public traits (`Sink`, `Transport`, `SecretProvider`) now use `fn ... -> impl Future + Send` (Rust 1.75+ native) |
38 | 34 | - [x] **kafka_config module** — `config_from_file`, 7 named profiles, `merge_with_overrides`; librdkafka settings loaded from config git dir (only cascade exception) |
@@ -110,7 +106,9 @@ what config keys exist, their types, defaults, or descriptions. |
110 | 106 | - [x] `/config` admin endpoint (opt-in via `enable_config_endpoint`) — returns redacted effective + defaults JSON |
111 | 107 | - [x] Change notification (opt-in) — `registry::on_change(key, callback)` + `registry::update()` |
112 | 108 | - Modules that need hot-reload subscribe; others keep `OnceLock` (init-once) |
113 | | -- [ ] Wire `ConfigReloader` to call `registry::update()` on reload (connect the plumbing) |
| 109 | +- [x] `ConfigReloader.with_registry_update(key)` connects hot-reload to registry |
| 110 | +- [x] `SensitiveString` type — compile-time safe, `Serialize` always redacts |
| 111 | +- [x] 19 registry + 12 sensitive string tests covering all redaction guarantees |
114 | 112 | - [ ] Migrate all dfe-* and hyperi-* apps to `unmarshal_key_registered` pattern |
115 | 113 | - [ ] Align hyperi-pylib with same registry pattern |
116 | 114 |
|
|
0 commit comments