Add the building blocks for Phase A scoring without yet wiring them
into parse_release. Nothing changes at runtime — parse_release still
returns a single ParsedRelease — but the pieces needed to upgrade it
in a follow-up commit are now in place.
- alfred/knowledge/release/scoring.yaml: weights / penalties /
thresholds. Title and media_type are heavy (30 / 20), structural
fields medium (year 15, season 10), tech fields light (5 each).
Unknown-token penalty 5 capped at -30. SHITTY/PoP cutoff at 60.
- load_scoring() loader with safe defaults baked in: a missing or
partial YAML only de-tunes, never breaks.
- ReleaseKnowledge port grows a 'scoring: dict' field. YamlReleaseKnowledge
populates it from load_scoring().
- New parser/scoring.py module with Road enum (EASY / SHITTY /
PATH_OF_PAIN, distinct from ParsePath which records the tokenization
route), and pure functions: compute_score, decide_road,
collect_unknown_tokens, collect_missing_critical.
- ParseReport frozen VO in value_objects.py — exported alongside
ParsedRelease.