Files
news/.omo/evidence/task-13-news-triage.txt
T
connor 20a6c26f7c
Check / check (push) Failing after 1m27s
Check / guardrails (push) Failing after 39s
Check / bundle (push) Successful in 1m4s
Initial commit -- did OMO do a good job?
2026-09-01 18:29:46 -04:00

78 lines
4.0 KiB
Plaintext

Task 13 — POST /api/feedback endpoint + FeedbackRepo + incremental Naive Bayes retraining
Date: 2026-09-01
What was built:
- crates/news-store/src/feedback.rs (NEW)
- FeedbackRepo(SqlitePool)
- insert(&Feedback) -> Result<(), StoreError>
- cluster_exists(Uuid) -> Result<bool, StoreError>
- canonical_item_text(Uuid) -> Result<Option<(String, String)>, StoreError>
- tests: insert_round_trips_feedback_row, cluster_exists_true_for_existing_cluster,
cluster_exists_false_for_unknown_cluster, canonical_item_text_returns_title_and_summary_for_cluster,
canonical_item_text_returns_none_for_unknown_cluster
- crates/news-store/src/lib.rs: pub mod feedback + pub use feedback::FeedbackRepo
- crates/news-server/src/api/mod.rs (NEW): pub mod feedback
- crates/news-server/src/api/feedback.rs (NEW)
- FeedbackState { pool: SqlitePool }
- FeedbackRequest { story_cluster_id: Uuid, kind: FeedbackKind }
- router(pool) -> Router with POST /api/feedback
- post_feedback handler: cluster existence check (400), canonical text lookup,
feedback row insert, incremental RelevanceScorer::load(...).train(tokens, kind),
returns 200 {"status":"recorded"}
- tests: unknown_cluster_id_returns_400, malformed_kind_returns_422,
valid_feedback_records_row_and_trains_model (oneshot, no listener)
- crates/news-server/src/lib.rs: pub mod api
- root Cargo.toml [workspace.dependencies]: axum = "0.8", tower = { version = "0.4", features = ["util"] }
- crates/news-server/Cargo.toml: axum = { workspace = true }, tower = { workspace = true } (dev-dependencies)
Verification commands:
--- cargo fmt --all --check ---
(no output, exit 0)
--- cargo clippy --workspace --all-targets -- -D warnings ---
Finished `dev` profile [unoptimized+debuginfo] target(s) in 0.25s
(exit 0)
--- cargo test -p news-server ---
running 14 tests
test api::feedback::tests::unknown_cluster_id_returns_400 ... ok
test api::feedback::tests::malformed_kind_returns_422 ... ok
test api::feedback::tests::valid_feedback_records_row_and_trains_model ... ok
test gate::tests::below_band_suppresses_below_threshold ... ok
test gate::tests::digest_band_returns_digest ... ok
test gate::tests::already_notified_suppresses_when_delta_not_reached ... ok
test gate::tests::quiet_hours_suppresses_high_relevance ... ok
test gate::tests::happy_path_notifies_when_relevance_and_budget_allow ... ok
test gate::tests::material_update_notifies_again_when_delta_reached ... ok
test gate::tests::bypass_ceiling_is_independent_of_normal_budget ... ok
test scoring::trained_model_persists_and_reloads_with_same_total_samples ... ok
test scoring::matching_item_scores_higher_than_non_matching ... ok
test scoring::importance_scorer_matches_direct_formula ... ok
test scoring::blocklist_veto_returns_neg_infinity ... ok
test result: ok. 14 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
(exit 0)
--- cargo test -p news-store ---
running 22 tests
test feedback::tests::insert_round_trips_feedback_row ... ok
test feedback::tests::cluster_exists_true_for_existing_cluster ... ok
test feedback::tests::cluster_exists_false_for_unknown_cluster ... ok
test feedback::tests::canonical_item_text_returns_title_and_summary_for_cluster ... ok
test feedback::tests::canonical_item_text_returns_none_for_unknown_cluster ... ok
... (other existing tests) ...
test result: ok. 22 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s
(exit 0)
New test names:
- news-store::feedback::tests::insert_round_trips_feedback_row
- news-store::feedback::tests::cluster_exists_true_for_existing_cluster
- news-store::feedback::tests::cluster_exists_false_for_unknown_cluster
- news-store::feedback::tests::canonical_item_text_returns_title_and_summary_for_cluster
- news-store::feedback::tests::canonical_item_text_returns_none_for_unknown_cluster
- news-server::api::feedback::tests::unknown_cluster_id_returns_400
- news-server::api::feedback::tests::malformed_kind_returns_422
- news-server::api::feedback::tests::valid_feedback_records_row_and_trains_model