dc6c25f582
A failed season-pack grab held the season off the pack lane forever: pack_hard_failed was a bare EXISTS over failed grabs, so one bad torrent disabled pack search for good, against §6.2's "it never gives up entirely, it goes quiet". The guard now rides the shared backoff curve (backoff_elapsed, 1h → 6h → 1d → 3d, capped 7d), counting failed pack grabs as attempts and anchoring on the latest one's grabbed_at. Both the targeted and RSS lanes agree. A manual season search waives the window outright — the season deck is §6.2's escape hatch. Closes #181. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
29 lines
747 B
JSON
29 lines
747 B
JSON
{
|
|
"db_name": "SQLite",
|
|
"query": "SELECT count(*) AS \"failures!: i64\",\n max(grabbed_at) AS \"last_failed_at?: String\"\n FROM grabs\n WHERE target_kind = 'season' AND target_id = ? AND state = 'failed'",
|
|
"describe": {
|
|
"columns": [
|
|
{
|
|
"name": "failures!: i64",
|
|
"ordinal": 0,
|
|
"type_info": "Integer",
|
|
"origin": "Expression"
|
|
},
|
|
{
|
|
"name": "last_failed_at?: String",
|
|
"ordinal": 1,
|
|
"type_info": "Text",
|
|
"origin": "Expression"
|
|
}
|
|
],
|
|
"parameters": {
|
|
"Right": 1
|
|
},
|
|
"nullable": [
|
|
false,
|
|
true
|
|
]
|
|
},
|
|
"hash": "ea21a91634b441e4cacf693f767549ae5075a56a668e0bf836d85e22d9202019"
|
|
}
|