Task 14 evidence: NewsConfig TOML loader with SIGHUP hot-reload Generated: 2026-09-01 === Files changed === - /home/connor/docs/projects/news/crates/news-server/src/config.rs (new) - /home/connor/docs/projects/news/crates/news-server/src/lib.rs (+pub mod config;) - /home/connor/docs/projects/news/crates/news-server/src/error.rs (+Io, +Toml variants) - /home/connor/docs/projects/news/crates/news-server/Cargo.toml (tokio promoted, +toml/tracing deps, +tracing-test/tempfile dev-deps) - /home/connor/docs/projects/news/Cargo.toml (+toml/tracing/tracing-test/tempfile workspace deps) === config.rs pure LOC === 135 (ceiling: 250) === Verification 1: cargo test -p news-server === $ cargo test -p news-server (...compiling...) running 16 tests test config::tests::happy_path_loads_notify_opinions_true ... ok test config::tests::bad_reload_keeps_last_good_config ... ok test gate::tests::happy_path_notifies_when_relevance_and_budget_allow ... ok test gate::tests::quiet_hours_suppresses_high_relevance ... ok test gate::tests::already_notified_suppresses_when_delta_not_reached ... ok test gate::tests::below_band_suppresses_below_threshold ... ok test api::feedback::tests::malformed_kind_returns_422 ... ok test api::feedback::tests::unknown_cluster_id_returns_400 ... ok test gate::tests::material_update_notifies_again_when_delta_reached ... ok test gate::tests::digest_band_returns_digest ... ok test scoring::tests::trained_model_persists_and_reloads_with_same_total_samples ... ok test gate::tests::bypass_ceiling_is_independent_of_normal_budget ... ok test scoring::tests::matching_item_scores_higher_than_non_matching ... ok test api::feedback::tests::valid_feedback_records_row_and_trains_model ... ok test scoring::tests::importance_scorer_matches_direct_formula ... ok test scoring::tests::blocklist_veto_returns_neg_infinity ... ok test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s === QA scenario: happy path (notify_opinions = true) === $ cargo test -p news-server -- --nocapture config::tests::happy_path_loads_notify_opinions_true running 1 test test config::tests::happy_path_loads_notify_opinions_true ... ok Result: loaded config has notify.notify_opinions == true, 2 sources, 3 interests. === QA scenario: bad reload keeps last good config === $ cargo test -p news-server -- --nocapture config::tests::bad_reload_keeps_last_good_config running 2 tests test config::tests::happy_path_loads_notify_opinions_true ... ok 2026-09-01T17:49:46.159239Z ERROR bad_reload_keeps_last_good_config: news_server::config::tests: config reload failed: toml parse error: TOML parse error at line 1, column 8 | 1 | [notify | ^ invalid table header expected `.`, `]` test config::tests::bad_reload_keeps_last_good_config ... ok Result: in-memory config unchanged after invalid TOML reload; parse error captured in tracing logs. === Verification 2: cargo fmt --all --check === $ cargo fmt --all --check (no output) Exit 0. === Verification 3: cargo clippy --workspace --all-targets -- -D warnings === $ cargo clippy --workspace --all-targets -- -D warnings Checking news-server v0.1.0 (/home/connor/docs/projects/news/crates/news-server) Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.62s Exit 0.