Curation v2 step 7: cleanup, prune paths, implementation notes

Dead code and stale v1 comments removed (clippy -W dead_code clean, the
three world.rs warnings fixed), the Brief chapter's TOC title renamed from
"From the Editor", features prune now also sweeps article_assessments and
generate runs the sweep once after publishing, the example config is
tested key-for-key against Config::default(), README commands match
--help, and docs/plans/2026-08-15-implementation-notes.md records the
Anthropic and Voyage facts, the new tables, the budget-day rule and the
lock.

Implemented by a Claude agent from docs/plans/curation-v2-briefs/step7.md.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A1rCLQeKBgnBo3oTgHuTMe
This commit is contained in:
2026-09-02 16:32:18 +00:00
co-authored by Claude Fable 5.1
parent d261cd485d
commit d403c51edf
18 changed files with 288 additions and 88 deletions
+16 -4
View File
@@ -150,28 +150,36 @@ impl RatingSetLabel {
#[derive(Debug, clap::Args)]
struct RatingsListArgs {
/// How many days of verdicts to list.
#[arg(long, default_value_t = 90)]
days: i64,
/// Only verdicts with this label.
#[arg(long, value_enum)]
label: Option<RatingListLabel>,
}
#[derive(Debug, clap::Args)]
struct RatingsSetArgs {
/// Article id, as printed by `ratings list` or `explain`.
#[arg(long, required_unless_present = "url", conflicts_with = "url")]
article: Option<ArticleId>,
/// Article URL; canonicalized before lookup.
#[arg(long, required_unless_present = "article", conflicts_with = "article")]
url: Option<String>,
/// The verdict to record.
#[arg(long, value_enum)]
label: RatingSetLabel,
/// Free-text note shown to the weekly profile rebuild.
#[arg(long)]
note: Option<String>,
}
#[derive(Debug, clap::Args)]
struct RatingsClearArgs {
/// Article id, as printed by `ratings list` or `explain`.
#[arg(long, required_unless_present = "url", conflicts_with = "url")]
article: Option<ArticleId>,
/// Article URL; canonicalized before lookup.
#[arg(long, required_unless_present = "article", conflicts_with = "article")]
url: Option<String>,
}
@@ -213,7 +221,7 @@ struct StatsArgs {
enum FeaturesCommand {
/// Embed rated and published articles, then interests, into the cache.
Backfill(BackfillArgs),
/// Drop stale embeddings and old candidate telemetry per the retention config.
/// Drop stale embeddings, old candidate telemetry and old assessments per the retention config.
Prune,
}
@@ -668,7 +676,7 @@ async fn cmd_features(config: &Config, db: &Db, command: FeaturesCommand) -> Res
}
FeaturesCommand::Prune => {
let ranking = &config.curation.ranking;
let (embeddings, rows) = telemetry::prune(
let pruned = telemetry::prune(
db,
ranking.embedding_retention_days,
ranking.telemetry_retention_days,
@@ -676,8 +684,12 @@ async fn cmd_features(config: &Config, db: &Db, command: FeaturesCommand) -> Res
)
.await?;
println!(
"pruned {embeddings} embeddings older than {} days and {rows} candidate rows older than {} days",
ranking.embedding_retention_days, ranking.telemetry_retention_days
"pruned {} embeddings older than {} days, {} candidate rows and {} assessments older than {} days",
pruned.embeddings,
ranking.embedding_retention_days,
pruned.telemetry,
pruned.assessments,
ranking.telemetry_retention_days
);
}
}