Size-band scoring #63

Merged
naps62-yolo merged 2 commits from issue/13-size-scoring into main 2026-08-22 21:15:26 +01:00
5 changed files with 494 additions and 8 deletions
+12
View File
@@ -6,8 +6,10 @@ use std::{collections::BTreeMap, path::PathBuf, time::SystemTime};
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub mod lang;
pub mod policy;
pub mod score;
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub use arr_parse::NameClaims as ParsedRelease;
pub use score::{Score, ScoreWeights};
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
macro_rules! id_type {
($name:ident) => {
@@ -124,10 +126,19 @@ pub struct HdrRules {
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub rejected_dolby_vision_profiles: Vec<DolbyVisionProfile>,
}
/// One resolution's size band (`DESIGN.md` §5.5). Below the floor is a hard
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// filter; the target is where the score peaks; above it the penalty grows
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// with every gibibyte.
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct SizeBand {
pub floor_bytes: u64,
pub target_bytes: u64,
/// Points lost per gibibyte above `target_bytes`, on the scale set by
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// [`ScoreWeights::size_at_target`] — 1000 points at target means one
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// point is a tenth of a percent, fine enough to tune by hand without a
naps62-yolo marked this conversation as resolved Outdated
Outdated
Review

penalty_per_gb_over: i32 cannot represent the existing seeded policy value 0.5; retain a fractional or explicitly scaled representation so a policy row can round-trip without changing its penalty.

`penalty_per_gb_over: i32` cannot represent the existing seeded policy value `0.5`; retain a fractional or explicitly scaled representation so a policy row can round-trip without changing its penalty. <!-- agent-meta: {"model":"gpt-5","session":"01a02b16"} -->
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// fractional type. Applied per byte over, so a partial gibibyte costs
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// its fraction.
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub penalty_points_per_gib_over: i32,
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
#[derive(Clone, Debug, Eq, PartialEq)]
@@ -140,6 +151,7 @@ pub struct Policy {
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub size_bands: BTreeMap<Resolution, SizeBand>,
pub resolution_preference: Vec<Resolution>,
pub source_weights: BTreeMap<Source, i32>,
pub score_weights: ScoreWeights,
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Fixed, though not by making the field fractional.

0.5 was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip to. Migration 0004 restates both bands in the scorer's own units: penalty_points_per_gib_over: 60, against size_at_target: 1000. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at.

The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means.

Fixed, though not by making the field fractional. `0.5` was on no scale — the seed predates any scoring code, so there was nothing for it to round-trip *to*. Migration 0004 restates both bands in the scorer's own units: `penalty_points_per_gib_over: 60`, against `size_at_target: 1000`. One point is a tenth of a percent of the target score and the penalty is applied per byte over, so a partial gibibyte still costs its fraction — the granularity a fractional type would buy is below what anyone tunes at. The field is now named for its unit, so a row and the type it loads into cannot disagree about what the number means. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
+68 -8
View File
@@ -25,14 +25,18 @@ impl Candidate<'_> {
}
}
fn resolution(&self) -> Option<Resolution> {
/// The candidate's resolution, from whichever evidence it carries.
#[must_use]
pub fn resolution(&self) -> Option<Resolution> {
match self {
Self::PreGrab(claims) => claims.resolution.map(Resolution::from),
Self::PostDownload(media) => Some(media.resolution),
}
}
fn source(&self) -> Option<Source> {
/// The candidate's source tier, from whichever evidence it carries.
#[must_use]
pub fn source(&self) -> Option<Source> {
match self {
Self::PreGrab(claims) => claims.source.map(Source::from),
Self::PostDownload(media) => media.source,
@@ -56,6 +60,10 @@ pub struct EvaluationContext<'a> {
/// distinct input from any track's language.
pub original_language: &'a Language,
pub candidate: Candidate<'a>,
/// The release's size pre-grab, the file's size post-download. `None`
/// when the caller has no size to offer, which abstains rather than
/// rejects.
pub size_bytes: Option<u64>,
}
/// A rule's identity when no violation exists to carry concrete evidence.
@@ -98,16 +106,19 @@ pub fn evaluate(
overrides: &MovieOverrides,
original_language: &Language,
candidate: Candidate<'_>,
size_bytes: Option<u64>,
) -> Evaluation {
let context = EvaluationContext {
policy,
overrides,
original_language,
candidate,
size_bytes,
};
let rules: [&dyn PolicyRule; 5] = [
let rules: [&dyn PolicyRule; 6] = [
&ResolutionRule,
&SourceRule,
&SizeRule,
&HdrRule,
&DubBlacklistRule,
&RequiredAudioRule,
@@ -201,6 +212,29 @@ impl PolicyRule for SourceRule {
}
}
/// Rejects anything below its size band's floor (`DESIGN.md` §5.5).
///
/// The floor is a hard filter rather than a low score, because unbounded
/// "smaller is better" selects a 3 GB 4K encode that looks like mud. How far
/// a candidate sits from the band's *target* is [`crate::score`]'s question,
/// not this rule's.
#[derive(Clone, Copy, Debug, Default)]
pub struct SizeRule;
impl PolicyRule for SizeRule {
fn evaluate(&self, context: &EvaluationContext<'_>) -> RuleEvaluation {
let (Some(resolution), Some(size)) = (context.candidate.resolution(), context.size_bytes)
else {
return RuleEvaluation::Unknown(RuleKind::Size);
};
match crate::score::is_below_floor(context.policy, resolution, size) {
None => RuleEvaluation::Unknown(RuleKind::Size),
Some(true) => RuleEvaluation::HardFail(Rule::Size),
Some(false) => RuleEvaluation::Pass(RuleKind::Size),
}
}
}
/// Applies Dolby Vision profile policy using post-download probe evidence.
#[derive(Clone, Copy, Debug, Default)]
pub struct HdrRule;
@@ -427,6 +461,7 @@ mod tests {
size_bands: BTreeMap::new(),
resolution_preference: vec![Resolution::R2160p, Resolution::R1080p],
source_weights: BTreeMap::new(),
score_weights: crate::ScoreWeights::default(),
}
}
@@ -480,7 +515,7 @@ mod tests {
}
fn verdict(policy: &Policy, overrides: &MovieOverrides, candidate: Candidate<'_>) -> Verdict {
evaluate(policy, overrides, &en(), candidate).verdict
evaluate(policy, overrides, &en(), candidate, None).verdict
}
fn verdict_for(
@@ -493,6 +528,7 @@ mod tests {
&MovieOverrides::default(),
original_language,
candidate,
None,
)
.verdict
}
@@ -506,6 +542,7 @@ mod tests {
&MovieOverrides::default(),
&en(),
Candidate::PreGrab(&claims),
None,
);
assert_eq!(report.verdict, Verdict::Eligible);
@@ -514,6 +551,7 @@ mod tests {
vec![
RuleEvaluation::Unknown(RuleKind::Resolution),
RuleEvaluation::Unknown(RuleKind::Source),
RuleEvaluation::Unknown(RuleKind::Size),
RuleEvaluation::Unknown(RuleKind::DolbyVisionProfile),
RuleEvaluation::Unknown(RuleKind::DubBlacklist),
RuleEvaluation::Unknown(RuleKind::RequiredAudio),
@@ -686,6 +724,7 @@ mod tests {
&MovieOverrides::default(),
&en(),
Candidate::PostDownload(&media),
None,
);
assert_eq!(report.verdict, Verdict::Eligible);
@@ -741,6 +780,7 @@ mod tests {
&MovieOverrides::default(),
&en(),
Candidate::PostDownload(&media),
None,
);
let expected = if rejected {
Verdict::Rejected(Rule::DolbyVisionProfile(profile))
@@ -759,11 +799,12 @@ mod tests {
&MovieOverrides::default(),
&en(),
Candidate::PreGrab(&claims),
None,
);
assert_eq!(report.verdict, Verdict::Eligible);
assert_eq!(
report.rules[2],
report.rules[3],
RuleEvaluation::Unknown(RuleKind::DolbyVisionProfile)
);
}
@@ -790,6 +831,7 @@ mod tests {
overrides: &overrides,
original_language: &original,
candidate: Candidate::PreGrab(&claims),
size_bytes: None,
};
let soft = FixedRule {
evaluation: RuleEvaluation::SoftFail(Rule::Other("soft".to_owned())),
@@ -817,6 +859,7 @@ mod tests {
overrides: &overrides,
original_language: &original,
candidate: Candidate::PreGrab(&claims),
size_bytes: None,
};
let first = FixedRule {
evaluation: RuleEvaluation::HardFail(Rule::Other("first".to_owned())),
@@ -947,13 +990,27 @@ mod tests {
};
let claims = name_claims(&[LanguageMarker::English]);
assert_eq!(
evaluate(&policy, &overrides, &en(), Candidate::PreGrab(&claims)).verdict,
evaluate(
&policy,
&overrides,
&en(),
Candidate::PreGrab(&claims),
None
)
.verdict,
Verdict::Eligible
);
let media = probed_audio(vec![track(en())]);
assert_eq!(
evaluate(&policy, &overrides, &en(), Candidate::PostDownload(&media)).verdict,
evaluate(
&policy,
&overrides,
&en(),
Candidate::PostDownload(&media),
None
)
.verdict,
Verdict::Waived(Rule::RequiredAudio)
);
}
@@ -1024,6 +1081,7 @@ mod tests {
&MovieOverrides::default(),
&en(),
Candidate::PostDownload(&media),
None,
);
assert_eq!(report.verdict, Verdict::Waived(Rule::PortugueseUnverified));
@@ -1034,6 +1092,7 @@ mod tests {
&MovieOverrides::default(),
&Language::PortugueseBrazil,
Candidate::PostDownload(&media),
None,
);
assert_eq!(report.verdict, Verdict::Waived(Rule::PortugueseUnverified));
}
@@ -1046,10 +1105,11 @@ mod tests {
&MovieOverrides::default(),
&en(),
Candidate::PreGrab(&claims),
None,
);
assert_eq!(report.verdict, Verdict::Eligible);
assert_eq!(
report.rules[4],
report.rules[5],
RuleEvaluation::Unknown(RuleKind::RequiredAudio)
);
}
+365
View File
@@ -0,0 +1,365 @@
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! Scoring by distance from a target size (`DESIGN.md` §5.5).
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//!
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! Source tier is not the dominant term. Per resolution the policy carries a
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! floor, a target and a penalty for every gigabyte above target, so a 20 GB
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! WEB-DL at target beats a 60 GB remux while the remux keeps a score and
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! stays eligible — it wins when nothing smaller exists.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//!
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! Below the floor is a hard filter rather than a low score, and lives in
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! [`crate::policy::SizeRule`]: unbounded "smaller is better" would otherwise
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! select a 3 GB 4K encode that looks like mud.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//!
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! Every number here comes from the policy row. The placeholders in
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! [`ScoreWeights::default`] and in the seeded size bands are pending the
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! remux playback test in `DESIGN.md` §14; the model is the decision, not the
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
//! constants.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
use crate::{policy::Candidate, Policy, Release, Resolution, SizeBand, Source};
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
const BYTES_PER_GIB: i64 = 1 << 30;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// How much each scoring term is worth. Policy data, not constants in the
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// code, for the same reason the size bands are.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub struct ScoreWeights {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// Points awarded to a release sitting exactly at its band's target. The
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// top of the size term, and the scale every other term is small against.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub size_at_target: i32,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// Points per step of the policy's `source_weights`. Small: the source
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// tier is a tiebreaker.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub source_tier: i32,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// Points per doubling of the seeder count. Log-scaled and small —
naps62-yolo marked this conversation as resolved
Review

The new score scales remain Default constants while the policies schema stores no score-weight data; persist them with each policy (and migrate/seed them) so the ranking remains tunable per policy row.

The new score scales remain `Default` constants while the `policies` schema stores no score-weight data; persist them with each policy (and migrate/seed them) so the ranking remains tunable per policy row. <!-- agent-meta: {"model":"gpt-5","session":"01a02b16"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// enough seeders to complete matters, past that it does not.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub seeder_doubling: i32,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
impl Default for ScoreWeights {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn default() -> Self {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Self {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
size_at_target: 1000,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
source_tier: 25,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
seeder_doubling: 8,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// One candidate's score, kept as its terms so the UI can explain a ranking.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub struct Score {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub total: i64,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// Distance from the band's target. Zero when no band applies, which is
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// also what an unknown resolution scores.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub size: i64,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// The source-tier tiebreaker.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub source: i64,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// The log-scaled seeder term.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub seeders: i64,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// Score a candidate against a policy.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
///
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// A candidate with no applicable size band — unknown resolution, or a
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// resolution the policy carries no band for — scores zero on the dominant
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// term rather than being penalised for what the release name failed to say.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[must_use]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub fn score(policy: &Policy, candidate: Candidate<'_>, size_bytes: u64, seeders: u32) -> Score {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let weights = &policy.score_weights;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let size = candidate
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.resolution()
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.and_then(|resolution| policy.size_bands.get(&resolution))
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.map_or(0, |band| size_points(band, weights, size_bytes));
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let source = candidate
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.source()
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.map_or(0, |source| source_points(policy, source));
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let seeders = seeder_points(weights, seeders);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Score {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
total: size.saturating_add(source).saturating_add(seeders),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
size,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
source,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
seeders,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// Score a stored release from the claims parsed out of its name.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
///
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// Pre-grab, the name is all there is (`DESIGN.md` §5.6).
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[must_use]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub fn score_release(policy: &Policy, release: &Release) -> Score {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
score(
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
policy,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Candidate::PreGrab(&release.parsed),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
release.size,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
release.seeders,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
)
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// Whether a size falls below its band's floor, which is a hard filter.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
///
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// `None` when the policy carries no band for that resolution: no band is no
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// opinion, not a rejection.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[must_use]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
pub fn is_below_floor(policy: &Policy, resolution: Resolution, size_bytes: u64) -> Option<bool> {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
policy
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.size_bands
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.get(&resolution)
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.map(|band| size_bytes < band.floor_bytes)
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// The size term: a ramp from the floor up to the target, then a penalty that
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// grows with every gigabyte above it.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn size_points(band: &SizeBand, weights: &ScoreWeights, size_bytes: u64) -> i64 {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let at_target = i64::from(weights.size_at_target);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let size = as_i64(size_bytes);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let floor = as_i64(band.floor_bytes);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let target = as_i64(band.target_bytes);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
if size > target {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let over = size.saturating_sub(target);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let penalty =
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
i64::from(band.penalty_points_per_gib_over).saturating_mul(over) / BYTES_PER_GIB;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
return at_target.saturating_sub(penalty);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let span = target.saturating_sub(floor);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
if span <= 0 {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
// A degenerate band, floor at or above target: nothing to interpolate.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
return if size >= target { at_target } else { 0 };
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
at_target.saturating_mul(size.saturating_sub(floor)) / span
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// The source tiebreaker. A source the policy does not weight is worth
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// nothing rather than being penalised.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn source_points(policy: &Policy, source: Source) -> i64 {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let tier = policy.source_weights.get(&source).copied().unwrap_or(0);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
i64::from(policy.score_weights.source_tier).saturating_mul(i64::from(tier))
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// The seeder term, log-scaled: one step per doubling, and nothing at all for
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// a release nobody is seeding.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn seeder_points(weights: &ScoreWeights, seeders: u32) -> i64 {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let doublings = seeders.checked_ilog2().map_or(0, |log| i64::from(log) + 1);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
i64::from(weights.seeder_doubling).saturating_mul(doublings)
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn as_i64(value: u64) -> i64 {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
i64::try_from(value).unwrap_or(i64::MAX)
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[cfg(test)]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
mod tests {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
use std::collections::BTreeMap;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
use arr_parse::{NameClaims, Resolution as ClaimedResolution, Source as ClaimedSource};
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
use super::*;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
use crate::{
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
policy::{evaluate, EvaluationContext, PolicyRule, RuleEvaluation, SizeRule},
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
HdrRules, Language, MovieOverrides, PolicyId, RequiredAudio, Rule, Verdict,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
};
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
const GIB: u64 = 1 << 30;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn gib(n: u64) -> u64 {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
n * GIB
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// The seeded `main` policy from `DESIGN.md` §5.5: 4K floor 8 GB, target
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// 22 GB; 1080p floor 3 GB, target 8 GB.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn policy() -> Policy {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Policy {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
id: PolicyId(1),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
name: "test".to_owned(),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
required_audio: RequiredAudio::OriginalLanguage,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
dub_blacklist: vec![Language::PortugueseBrazil],
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
hdr_rules: HdrRules {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
rejected_dolby_vision_profiles: Vec::new(),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
},
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
size_bands: BTreeMap::from([
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
(
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Resolution::R2160p,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
SizeBand {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
floor_bytes: gib(8),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
target_bytes: gib(22),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
penalty_points_per_gib_over: 60,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
},
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
(
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Resolution::R1080p,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
SizeBand {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
floor_bytes: gib(3),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
target_bytes: gib(8),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
penalty_points_per_gib_over: 60,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
},
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
]),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
resolution_preference: vec![Resolution::R2160p, Resolution::R1080p],
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
source_weights: BTreeMap::from([
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
(Source::Remux, 4),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
(Source::BluRay, 3),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
(Source::WebDl, 2),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
(Source::WebRip, 1),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
(Source::Hdtv, 0),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
]),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
score_weights: ScoreWeights::default(),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn claims(source: ClaimedSource) -> NameClaims {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
NameClaims {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
resolution: Some(ClaimedResolution::P2160),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
source: Some(source),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
..NameClaims::default()
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn scored(source: ClaimedSource, size_bytes: u64, seeders: u32) -> Score {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let claims = claims(source);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
score(&policy(), Candidate::PreGrab(&claims), size_bytes, seeders)
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn size_rule(size_bytes: u64) -> RuleEvaluation {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let policy = policy();
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let overrides = MovieOverrides::default();
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let language = Language::Other("en".to_owned());
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let claims = claims(ClaimedSource::WebDl);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
SizeRule.evaluate(&EvaluationContext {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
policy: &policy,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
overrides: &overrides,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
original_language: &language,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
candidate: Candidate::PreGrab(&claims),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
size_bytes: Some(size_bytes),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
})
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
/// The acceptance case from issue #13, over a realistic candidate set.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn twenty_gigabyte_web_dl_beats_a_sixty_gigabyte_remux() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let candidates = [
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
("web-dl 20 GB", scored(ClaimedSource::WebDl, gib(20), 40)),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
("remux 60 GB", scored(ClaimedSource::Remux, gib(60), 12)),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
("bluray 34 GB", scored(ClaimedSource::BluRay, gib(34), 25)),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
("web-dl 12 GB", scored(ClaimedSource::WebDl, gib(12), 90)),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
];
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let best = candidates
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.iter()
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.max_by_key(|(_, score)| score.total)
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
.map(|(name, _)| *name);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(best, Some("web-dl 20 GB"));
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn the_remux_still_wins_when_it_is_the_only_candidate() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let policy = policy();
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let claims = claims(ClaimedSource::Remux);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let evaluation = evaluate(
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
&policy,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
&MovieOverrides::default(),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
&Language::Other("en".to_owned()),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Candidate::PreGrab(&claims),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Some(gib(60)),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
// A bad score, but a score: nothing filters it out, so a selection
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
// with one candidate takes it.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert!(scored(ClaimedSource::Remux, gib(60), 12).total < 0);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(evaluation.verdict, Verdict::Eligible);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn size_beats_source_tier() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let at_target = scored(ClaimedSource::WebRip, gib(22), 10);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let far_over = scored(ClaimedSource::Remux, gib(40), 10);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert!(at_target.total > far_over.total);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert!(at_target.source < far_over.source);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn source_tier_breaks_a_tie_between_equal_sizes() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let web = scored(ClaimedSource::WebDl, gib(20), 10);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let bluray = scored(ClaimedSource::BluRay, gib(20), 10);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(web.size, bluray.size);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert!(bluray.total > web.total);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn the_size_term_peaks_at_target() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let below = scored(ClaimedSource::WebDl, gib(15), 10).size;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let at = scored(ClaimedSource::WebDl, gib(22), 10).size;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let above = scored(ClaimedSource::WebDl, gib(30), 10).size;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(at, i64::from(ScoreWeights::default().size_at_target));
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert!(below < at);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert!(above < at);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn the_penalty_grows_with_every_gigabyte_over_target() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let over_by_ten = scored(ClaimedSource::WebDl, gib(32), 10).size;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let over_by_twenty = scored(ClaimedSource::WebDl, gib(42), 10).size;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let over_by_thirty = scored(ClaimedSource::WebDl, gib(52), 10).size;
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert!(over_by_ten > over_by_twenty);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
over_by_ten - over_by_twenty,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
over_by_twenty - over_by_thirty
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn seeders_are_log_scaled_and_small() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let few = scored(ClaimedSource::WebDl, gib(20), 8);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let many = scored(ClaimedSource::WebDl, gib(20), 4096);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
// Nine doublings apart, and still worth less than one source tier.
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(many.seeders - few.seeders, 9 * 8);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert!(many.seeders - few.seeders < few.size);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(scored(ClaimedSource::WebDl, gib(20), 0).seeders, 0);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn below_the_floor_is_a_hard_filter_not_a_low_score() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(size_rule(gib(3)), RuleEvaluation::HardFail(Rule::Size));
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert!(matches!(size_rule(gib(9)), RuleEvaluation::Pass(_)));
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
is_below_floor(&policy(), Resolution::R2160p, gib(3)),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Some(true)
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(is_below_floor(&policy(), Resolution::R720p, gib(3)), None);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn an_unknown_resolution_scores_no_size_term() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let claims = NameClaims {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
source: Some(ClaimedSource::WebDl),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
..NameClaims::default()
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
};
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let score = score(&policy(), Candidate::PreGrab(&claims), gib(20), 10);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(score.size, 0);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(score.total, score.source + score.seeders);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
#[test]
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
fn a_degenerate_band_does_not_divide_by_zero() {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let mut policy = policy();
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
policy.size_bands.insert(
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Resolution::R2160p,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
SizeBand {
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
floor_bytes: gib(10),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
target_bytes: gib(10),
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
penalty_points_per_gib_over: 60,
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
},
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let claims = claims(ClaimedSource::WebDl);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let at = score(&policy, Candidate::PreGrab(&claims), gib(10), 10);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
let under = score(&policy, Candidate::PreGrab(&claims), gib(9), 10);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(at.size, i64::from(ScoreWeights::default().size_at_target));
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
assert_eq!(under.size, 0);
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
}
Review

Done. Migration 0004 adds a score_weights column to policies and seeds {"size_at_target":1000,"source_tier":25,"seeder_doubling":8}; arr-db asserts every policy row carries all three, alongside the band's floor, target and penalty.

ScoreWeights::default() stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist.

Done. Migration 0004 adds a `score_weights` column to `policies` and seeds `{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}`; `arr-db` asserts every policy row carries all three, alongside the band's floor, target and penalty. `ScoreWeights::default()` stays as the value tests construct and as the documented placeholder, but it is no longer the only place the numbers exist. <!-- agent-meta: {"model":"claude-opus-5","session":"7fd6d1b5"} -->
@@ -0,0 +1,20 @@
-- §5.5 scoring. The size bands seeded in 0002 predate the scoring model and
-- carry a penalty on no particular scale; the weights that make the terms
-- comparable had nowhere to live at all. Both are policy rows, tuned by hand,
-- so both belong here rather than in code.
--
-- Points are the unit. A release at its band's target scores `size_at_target`;
-- every other term is small against that. Numbers stay placeholders pending
-- the remux playback test in §14.
ALTER TABLE policies ADD COLUMN score_weights TEXT NOT NULL
DEFAULT '{"size_at_target":1000,"source_tier":25,"seeder_doubling":8}'
CHECK (json_valid(score_weights));
-- Sizes in gibibytes, matching the bytes the scorer compares, and the penalty
-- restated in points: 60 points per gibibyte over target puts a 60 GiB remux
Review

This unconditionally replaces size_bands for every existing policy, erasing any hand-tuned floors, targets, and penalties; migrate each existing JSON value to the renamed/scaled fields instead of replacing it with the defaults.

This unconditionally replaces `size_bands` for every existing policy, erasing any hand-tuned floors, targets, and penalties; migrate each existing JSON value to the renamed/scaled fields instead of replacing it with the defaults. <!-- agent-meta: {"model":"gpt-5","session":"01a02b16"} -->
-- far below a 20 GiB WEB-DL while leaving it eligible.
UPDATE policies SET size_bands = json('{
"2160p": {"floor_gib": 8, "target_gib": 22, "penalty_points_per_gib_over": 60},
"1080p": {"floor_gib": 3, "target_gib": 8, "penalty_points_per_gib_over": 60}
}');
+29
View File
@@ -191,6 +191,35 @@ mod tests {
);
}
#[tokio::test]
async fn every_policy_carries_its_scoring_numbers() {
let (_dir, db) = fresh().await;
let rows = sqlx::query("SELECT size_bands, score_weights FROM policies")
.fetch_all(db.pool())
.await
.expect("policies");
assert_eq!(rows.len(), 2);
for row in rows {
let size_bands: String = row.get(0);
let score_weights: String = row.get(1);
// §5.5: floor, target and the penalty above target, per resolution.
assert!(size_bands.contains("floor_gib"), "{size_bands}");
assert!(size_bands.contains("target_gib"), "{size_bands}");
assert!(
size_bands.contains("penalty_points_per_gib_over"),
"{size_bands}"
);
// §5.5: the weights that keep source tier and seeders small
// against the size term are tuned by hand too.
assert!(score_weights.contains("size_at_target"), "{score_weights}");
assert!(score_weights.contains("source_tier"), "{score_weights}");
assert!(score_weights.contains("seeder_doubling"), "{score_weights}");
}
}
#[tokio::test]
async fn foreign_keys_are_enforced() {
let (_dir, db) = fresh().await;