Discovery final review fixes: lean publish, robust scoring, cheap prune (BL-0051)
- Cache prune counts directory entries first and only reads files when over the cap; tests for cross-kind prune, schema-mismatch and corrupt entries. - Scoring tolerates malformed manga.json and cached records (non-list tags, object or null relations, non-object items); a tag without a rank no longer passes the top-tag filter; authors without an integer AniList id are dropped. - discovery.json publishes only candidates some feed shows; examined/clipped still describe the pool. Tests that asserted the published count equals the pool size now check the pool via candidatePool() and the published set against the feeds. - The post-harvest rescore failure test now breaks discovery.json right before the publish (via a scraper stand-in) instead of relying on tags: 5, and a following successful harvest clears the stale lastError. - Consent text names everything sent to AniList; paused label mentions admin harvests; the UI test asserts the XSS seed instead of skipping it. - Slot-mix test proves the fresh/outside reservations matter. - Docs: privacy note, fresh fallback reason, per-period cap, dry-run wording, published-candidate rule; plan/spec hygiene and spec status. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
613db96355
commit
cd6a30a76b
18 files changed
+250
-65
No files matched your search
+6
-2
@@ -71,10 +71,14 @@ class DiscoveryCache {
|
||||
}
|
||||
return { files, bytes };
|
||||
}
|
||||
// Oldest entries go first so the cache never grows past maxFiles.
|
||||
// Oldest entries go first so the cache never grows past maxFiles. Every put() calls this, so
|
||||
// under the cap it only counts directory entries; files are read only when something must go.
|
||||
prune() {
|
||||
const byKind = KINDS.map(kind => [kind, this.files(kind)]);
|
||||
if (byKind.reduce((sum, [, files]) => sum + files.length, 0) <= this.maxFiles) return;
|
||||
const all = [];
|
||||
for (const kind of KINDS) for (const file of this.files(kind)) {
|
||||
for (const [kind, files] of byKind) for (const file of files) {
|
||||
// readFile drops corrupt and schema-mismatched files itself.
|
||||
const entry = this.readFile(file, kind);
|
||||
if (entry) all.push({ file, at: Date.parse(entry.fetchedAt) });
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user