AGENTS.md: variant B slim-down + sec07 file-count fixes (20 files, 88 MB)

- Goal: running-log → компактная таблица status 01–07 + next (история в git/SUMMARY)
- Conventions: one-shot migration-история → по строке (скрипты помечены done)
- EN sweep: удалены Result-блоки sec01/sec05 (в git/MANIFEST), метод сохранён;
  'Table 3' → 'at a glance'
- Content audit: лог находок sec01-06 → операционные правила триажа (4)
- Lessons: lesson 3/8/9 сжаты (dubль precheck-логики убран), queue-паттерн сохранён
- Download conventions: 'gitignored' → 'в git LFS' (устаревшая строка)
- Jung CW special case: + АСТ Неоклассик-серия (CW3 2025, CW2 нет, калка-ловушка)
- FIX: sec07 = 20 файлов (88 MB), не 21 (CW3-1960 ia double-counted); SUMMARY/MANIFEST
  синхронизированы
This commit is contained in:
Dmitry Kokorin 2026-09-26 16:06:31 +03:00
parent 2400201ebf
commit 8bcd745039
3 changed files with 77 additions and 109 deletions

172
AGENTS.md
View file

@ -6,26 +6,20 @@ For every book in the ISAP Zurich reading list (https://isapzurich.com/en/librar
find the **Russian edition(s)**: correct Russian title, publisher, year, translator, ISBN, find the **Russian edition(s)**: correct Russian title, publisher, year, translator, ISBN,
libgen download page (if exists), and РГБ (RSL) bibliographic record (if exists). libgen download page (if exists), and РГБ (RSL) bibliographic record (if exists).
We work **section by section**. Sections **01–05 are COMPLETE** (01: 38✅/2🔶/15❌; 02: 23✅/5🔶/29❌; We work **section by section**. Status (детали — в SUMMARY.md/MANIFEST.md секции + git log):
03: 38✅/30❌; 04: 12✅/1🔶/26❌; **05: 17✅/12❌**). Section 05: research + RU downloads
2026-09-22 (7 rescues from user tips — see Lessons), **EN downloads COMPLETE 2026-09-23** | sec | name | items | RU ✅/🔶/❌ | files (EN+RU) | state |
(30 files, 362 MB; 5 EN gaps unavailable + 2 ia-restricted; SUMMARY.md at-a-glance table done). |-----|------|-------|-----------|----------|-------|
Section 06: research + user oracle DONE 2026-09-24 (28 карточек: **19 ✅ / 1 🔶 / 8 ❌**; | 01 | fundamentals | 55 | 38/2/15 | 113 | FINAL 2026-09-25 |
7 rescues; каталог Касталии 1285 в data/catalogs + rule в gate v3); **downloads FINAL | 02 | dreams | 57 | 23/5/29 | 37 | FINAL 2026-09-25 |
2026-09-25** (34 файла, 608 MB: RU 12 + EN 21 + DE 1 бонус; 6 кросс-рефов на sec01-03; | 03 | myths & fairy tales | 68 | 38/0/30 | 129 | FINAL 2026-09-25 |
EN: 9 с ia open-uploads + 12 с libgen после находки key-vs-f_id — rescues 09-t1, 13, 14, 17, 19, 20, 23; | 04 | pictures | 39 | 12/1/26 | 28 | FINAL 2026-09-25 |
RU платные castalia-PDF не скачивались; sec03#20 RU-дыра пометка в MANIFEST). **2026-09-25: | 05 | ethnology | 29 | 17/0/12 | 38 | FINAL 2026-09-25 |
wiki-anchor audit (1 wrong QID fixed), cross-section FILE dedup (17 md5-дублей удалено, | 06 | religion | 28 | 19/1/8 | 38 | FINAL 2026-09-25 |
файл = только в первой секции), `data/MASTER-LIST.md` + `tools/xref.py` (все 12 секций, | 07 | complexes | 27 | 4/0/23 | 20 (EN only) | FINAL 2026-09-26 |
каждая книга ищется один раз), RAW 07–12 скачан (sections/07/RAW.md + data/isap-raw/).**
Section 07 **COMPLETE 2026-09-26** (27 items: **4 ✅ / 0 🔶 / 23 ❌** RU; 20 EN files, 87 MB. **Next:** scope decision for sections 08–12 (RAW в data/isap-raw/; MASTER-LIST просчитал:
Rescue wave: CW3-РУ «Психогенез душевных болезней» АСТ 2025 (flibusta.**su** b/390112 — .su ≠ .is!) 08=47 NEW/5 xref, 09=25/12, 10=38/4, 11=9/14, 12=35/5).
+ 7 EN rescues via file-level libgen (objects[]=f, подсказки пользователя): CW2×2, CW3×2, Bovensiepen,
Krieger JAP 2019, Meier I JAP 2019 — статьи контент-верифицированы (не рецензии). Новый tool
`tools/doi.py` (Crossref→DOI→libgen) для article-items; 09 Hill pre-DOI не ищется). 08–12 scope
decision pending
(RAW в data/isap-raw/, MASTER-LIST уже просчитал: 08=47 NEW/5 xref, 09=25/12, 10=38/4,
11=9/14, 12=35/5).
## Repository layout ## Repository layout
@ -98,16 +92,12 @@ sections/0N-<name>/ # one .md per BOOK (chapter-level list items are merged int
(f) EN-каталогами: полные записи не ведутся (WorldCat мёртв) — строка `EN refs` по данным (f) EN-каталогами: полные записи не ведутся (WorldCat мёртв) — строка `EN refs` по данным
isbnval/OL/ia; (g) ✅-карточка: РГБ обязателен + ≥1 второй каталог если sweep его трогал; isbnval/OL/ia; (g) ✅-карточка: РГБ обязателен + ≥1 второй каталог если sweep его трогал;
(h) старое поле Status-формулировок: единая «маркер + одна фраза». (h) старое поле Status-формулировок: единая «маркер + одна фраза».
**Migration DONE 2026-09-21** (219/219 cards, `tools/migrate_cards_v3.py`, linter Все карточки мигрированы на v3 (2026-09-21, one-shot `tools/migrate_cards_v3.py`);
`tools/check-md.py` = 0 issues; Downloads tables rebuilt from MANIFESTs; sec04 #22 = ES section). linter `tools/check-md.py` = 0 issues. New cards start on v3.
New cards (sec05+) start on v3. - **Section files unified 2026-09-21** (CANONs ниже; one-shot скрипты `tools/migrate_*.py`,
- **SECTION FILES UNIFICATION DONE 2026-09-21** (order: MANIFEST → INDEX → MISSING → SUMMARY → `make_authors_table.py`, `restructure_summary.py` — done, не для повторного запуска).
dossiers; scripts: `tools/migrate_manifests.py`, `migrate_indexes.py`, `make_authors_table.py`, Living authors keep open-ended dates `[1951-]`.
`restructure_summary.py`, `migrate_dossiers.py`). Findings baked in: sec01 +4 missing EN files - **Section file CANONS v1 (agreed 2026-09-21):**
(ia byte-verified), sec04 Red Book +4 files, libgen f_ids recovered from queue logs,
136 card DL sources normalized, MISSING anchors = card gate refs (17+34+30+27), living authors
keep open-ended dates `[1951-]`.
- **Section file CANONS v1 (agreed 2026-09-21, migration in order: MANIFEST → INDEX → MISSING → SUMMARY → dossiers):**
**SUMMARY.md:** H1 `# Section NN — <Name>: summary (<date>)` → `## Final counts` (одна строка: **SUMMARY.md:** H1 `# Section NN — <Name>: summary (<date>)` → `## Final counts` (одна строка:
статусы + файлы) → `## Publication status at a glance` (ОБЯЗАТЕЛЬНЫЙ, колонки `# | EN book | EN ISBN статусы + файлы) → `## Publication status at a glance` (ОБЯЗАТЕЛЬНЫЙ, колонки `# | EN book | EN ISBN
| RU book | RU ISBN | DL EN | DL RU` + totals-строка + legend ✅/⚠/❌) → `## Authors — EN → RU` | RU book | RU ISBN | DL EN | DL RU` + totals-строка + legend ✅/⚠/❌) → `## Authors — EN → RU`
@ -510,10 +500,9 @@ sections/0N-<name>/ # one .md per BOOK (chapter-level list items are merged int
Reality*), «Модели культуры» (not «Узоры/Образцы культуры»), «Потерянный мир Калахари» (the Reality*), «Модели культуры» (not «Узоры/Образцы культуры»), «Потерянный мир Калахари» (the
«Затерянный» variant is a DIFFERENT book — Bjerrre). Always probe 2–3 RU title variants; «Затерянный» variant is a DIFFERENT book — Bjerrre). Always probe 2–3 RU title variants;
for authors with FR/DE originals (Eliade, van Gennep) also try the FR/DE-based RU title. for authors with FR/DE originals (Eliade, van Gennep) also try the FR/DE-based RU title.
3. **rutitles diff was SKIPPED for sec05 and would have caught 3/7 rescues** («Аспекты мифа», 3. **rutitles diff MANDATORY before ❌:** sec05 пропустил его и потерял бы 3/7 rescues
«Культурный комплекс», «На пороге инициации» were all in data/ru-titles.jsonl from the cogito (все были в data/ru-titles.jsonl). `tools/rutitles.py both "<EN title>"` по каждому item
crawl). **Mandatory: `tools/rutitles.py both "<EN title>"` for every item before ❌** (added to (в negatives gate ниже).
the negatives gate below).
4. **flib authorall for prolific RU authors** (Элиаде a/2943 = 49 books) caught «Тайные общества» 4. **flib authorall for prolific RU authors** (Элиаде a/2943 = 49 books) caught «Тайные общества»
(sec05 #13) that libgen title search missed. Always run flib author sweep for authors with (sec05 #13) that libgen title search missed. Always run flib author sweep for authors with
>5 RU books. >5 RU books.
@ -527,65 +516,47 @@ sections/0N-<name>/ # one .md per BOOK (chapter-level list items are merged int
`static.flibusta.is` URL. `static.flibusta.is` URL.
(b) **KEY vs f_id (системная ловушка, наш баг, не libgen):** в JSON-карточке издания (b) **KEY vs f_id (системная ловушка, наш баг, не libgen):** в JSON-карточке издания
`files` = `{public_key: {f_id: X, md5: Y}}` — КЕЙ и f_id-ЗНАЧЕНИЕ = РАЗНЫЕ файловые записи. `files` = `{public_key: {f_id: X, md5: Y}}` — КЕЙ и f_id-ЗНАЧЕНИЕ = РАЗНЫЕ файловые записи.
`object=f&ids=<key>` возвращает устаревший/чужой файл (Solomon: key 92709688 = 20MB рус. антология; `object=f&ids=<key>` возвращает устаревший/чужой файл (Solomon: key 92709688 = 20MB рус.
f_id 93253044 = настоящая 2MB-книга). Утром 2026-09-25 «24 mislinked EN» = качали по key; антология; f_id 93253044 = настоящая 2MB-книга).
скачав по f_id-значениям — rescues 06-й секции: 09-t1, 13, 14, 17, 19, 20, 23 + бэкапы. **Правило: качать и пречекать ТОЛЬКО по f_id-значению из files-мапы (md5 для контроля)** —
**Правило: качать и пречекать ТОЛЬКО по f_id-значению из files-мапы (md5 для контроля).** утренний «24 mislinked EN» 2026-09-25 = качали по key; по f_id — rescues sec06.
Файл-уровневый поиск (`objects[]=f` в lg.py) находит файлы, не привязанные к «нашему» изданию Файл-уровневый поиск (`objects[]=f` в lg.py) находит файлы, не привязанные к «нашему» изданию.
(так найден md5 Solomon, когда editions-поиск его не показывал).
6. **Collection-inclusion questions** (#27/#28): download the smallest fb2, parse the TOC 6. **Collection-inclusion questions** (#27/#28): download the smallest fb2, parse the TOC
(`<section name="title">`), grep for the EN book title + RU calque. «Символ и ритуал» (Наука (`<section name="title">`), grep for the EN book title + RU calque. «Символ и ритуал» (Наука
1983) CONTAINS «Ритуальный процесс» (full text, core section) but NOT «Лес символов» 1983) CONTAINS «Ритуальный процесс» (full text, core section) but NOT «Лес символов»
(citations only). (citations only).
7. **flib pdf download**: `/b/<id>/pdf` may return an HTML stub; `/b/<id>/download` → 302 → 7. **flib pdf download**: `/b/<id>/pdf` may return an HTML stub; `/b/<id>/download` → 302 →
direct `static.flibusta.is:443/b.usr/<File>.<ext>` URL — curl that directly. direct `static.flibusta.is:443/b.usr/<File>.<ext>` URL — curl that directly.
8. **Content-verify gate (2026-09-22, после sec05 mislinked batch; precheck дообучен 2026-09-25):** 8. **Content-verify gate (MANDATORY):** после КАЖДОГО даунлоуда — magic bytes + `pdfinfo` pages
every downloaded file gets a two-second check — magic bytes + `pdfinfo` pages + first-page/head + first-page/head text = ожидаемый title/author; для статей — автор+журнал+страницы = RAW и
text containing the expected RU title/author. A file that fails is discarded and re-sourced это статья, НЕ рецензия. Прошёл = discard + re-source (flib/lg другой ed). **Pre-download:
(usually flib). **Pre-download gate: `tools/lgdl.py precheck <f_id> <edition_id> [pages]`** `tools/lgdl.py precheck <f_id> <edition_id>`** (0 OK / 1 SUSPECT / 2 BAD; `dl … <edition_id>`
(exit 0 OK / 1 SUSPECT / 2 BAD). Логика (2026-09-25): (1) reverse-map file-записи: значения запускает precheck автоматически). Mislink = next f_id → next edition → flib; отклонённые
= PUBLIC edition ids — совпадение с целью = сильный OK-сигнал (для записи настоящего f_id); f_id в MANIFEST notes. (Логика precheck v2: reverse-map + locator, см. докстринг скрипта.)
(2) locator: ≥2 общих слова с целью = OK; слова есть, но 0 общих = BAD (именует другую книгу); 9. **EN-queue infra (переиспользуемый паттерн):** `queue.sh` = per-file
хэш/ISBN/пустой locator = без сигнала (SUSPECT) — digit-содержащие runs маскируются до `[ -f out ] && skip || timeout 1500 python3 -u lgdl.py dl ... >> "$LOG" 2>&1` + **watchdog**
токенизации (иначе hex даёт фейк-токены вроде «aaae»). Контент-верификация после даунлоуда — (рестарт если очередь умерла без DONE-маркера; skip-existing делает рестарт безопасным) +
всегда конечный гейт. Mislink = skip → next f_id of same edition → next edition → flib; `setsid nohup`. Ловушки: (a) `bash -n` на сгенерированный скрипт ОБЯЗАТЕЛЕН (one-liner
отклонённые f_id логируются в MANIFEST notes. `dl <f_id> <dir> <name> <edition_id>` запускает `dl() { … }` без `;` перед `}` = тихая смерть);
precheck автоматически. (b) python stdout блок-буферизуется в файл — всегда `-u`;
9. **EN-queue infra (2026-09-23, sec05 EN sweep)**: the libgen bottleneck is (a) `ads.php` (c) `ads.php` throttle под sustained load — пауза 30–60 мин, НЕ долбить;
card-page IP-throttling under sustained load — pause 30–60 min, do NOT hammer (deepens the (d) NEVER `pkill -f lgdl.py` (убьёт и саму очередь) — kill worker по comm;
block); (b) wedged CDN edges — each `get.php` 302s to a different storage host, so (e) dual-queue corrupt cookie jar. AA (annas-archive.gl) = 403 anon отсюда; i2p not worth it.
`lgdl.py` now speed-probes (6 s range fetch) and re-draws the link on slow edges. Queue
pattern that survived the day: `queue.sh` = per-file `[ -f out ] && skip || timeout 1500
python3 -u lgdl.py dl ... >> "$LOG" 2>&1` + a **watchdog** bash loop (restart the queue if it
dies without a DONE marker — skip-existing makes restarts safe). Traps hit: python stdout
block-buffers to a file (use `-u` or logs look dead); generated-script typos (`>> LOG` vs
`>> $LOG`) — always `bash -n` a generated queue; killing a worker does NOT kill the parent
queue bash (dual-queue downloads corrupt the cookie jar). AA (annas-archive.gl) = 403 bot-wall
for anon downloads from this box; i2p not worth the router setup.
## Content audit (2026-09-25) — what the full-file vs item-title sweep found ## Content audit (method; ran on sec01–07, 2026-09-25/26)
Tool: `tools/audit_content.py <sec>...` (samples first/mid pages of every file, scores title Tool: `tools/audit_content.py <sec>...` (samples first/mid pages of every file, scores title
overlap, flags SUSPECT/SMALL/NO-TEXT/NO-CYR). Ran on all sections 01–06 (sec05: fix the overlap, flags SUSPECT/SMALL/NO-TEXT/NO-CYR). Run at section end. Триажа флагов:
per-item header parse first — sec05 uses «— ✅» not «— N files»). Findings (commits 1. **Mislinked file** (файл = другая книга/рецензия/фрагмент) → удалить, re-source (flib/lg),
`85c41ac` + follow-ups): записать в MANIFEST Notes. Превью/фрагменты (2–14 pp, chapter previews) = не издание.
1. **Mislinked whole files caught:** sec01 #29 RU fb2 = fantasy novel; sec01 #47 two review 2. **Foreign OCR layer** (файл OK, текстовый слой на чужом языке/мусор) → keep + пометка,
clippings (1950 «About Books»); sec03 #11 `-b` epub = Spanish von Franz (Paidós 1983) with чистая twin-копия в приоритете.
forged EN OPF title; sec03 #42 «КАРО 2012» = English reader (Irish Tales), not the listed 3. **False positives (не чинить):** windows-1251/UTF-16/KOI8 fb2/txt (декодирование, не
book and not a RU translation; sec02 #16 bosnak .txt = double-encoded mojibake (replaced by порча), image-сканы без OCR (проверить рендером: pdftoppm/ddjvu), spaced-out OCR titles
clean flib fb2 b/844509). («T H C T F»), library stamps, VeryPDF-водяные знаки.
2. **Foreign OCR layer (file OK, text layer wrong):** sec06 #28 ia Zimmer = all-Devanagari OCR 4. **Bonus rule:** related-but-different книга = bonus-файл с пометкой `Бонус: ДРУГАЯ книга
(Lal Bahadur Shastri Academy stamp); images verified = RKP «Philosophies of India» (p.100 (...)`, status не менять; переименовать файл, если false lang/year в имени.
«PART II Philosophies of Time»). Keep; the twin lg file is the clean copy. 5. Контент-верификация после КАЖДОГО даунлоуда — см. Lessons (gate).
3. **Previews/fragments labeled as editions:** sec03 #56 Onians b/c/d/e = Cambridge 24–87 KB
chapter previews (marked ПРЕВЬЮ in MANIFEST); sec01 #12 was a 23-pp PagePlace preview (→ full).
4. **False positives to expect:** windows-1251/UTF-16/KOI8 fb2/txt (decoding, not corruption),
image scans without OCR (NO-TEXT/NO-CYR — verify by rendering pages: pdftoppm/ddjvu +
imagemagick), spaced-out OCR titles («T H C T F»), library stamps (Cornell/India/Claremont),
VeryPDF watermark pages (sec04 #30 buksmart — watermark + FR part, legit 2020 ed.).
5. **Bonus rule in practice:** different-but-related books stay as bonus files with
`Бонус: ДРУГАЯ книга (...)` note, status unchanged; rename file to drop the false lang/year
label. Same for wrong-year filename (sec06 #18 «1981» → 1989, Perera had two «Descent…» books).
## Catalog caching convention ## Catalog caching convention
@ -736,8 +707,11 @@ Before downloading from libgen: verify file locator/title (mislinked-file trap).
Special cases: Special cases:
- **Jung's CW volumes:** translated and widely available — don't deep-search; note the RU - **Jung's CW volumes:** translated and widely available — don't deep-search; note the RU
volume for the item (CW15 = «Дух в человеке, искусстве и литературе», Харвест 2003; volume for the item. Факты: АСТ сер. «Философия – Neoclassic» публикует CW последовательно
Red Book = «Красная книга (Liber Novus)», Касталия 2025, trans. О. Комков). (CW3 = «Психогенез душевных болезней» 2025, пер. Чечина, 978-5-17-139315-1; CW2 пока нет —
ре-проб). CW15 = «Дух в человеке, искусстве и литературе» (Харвест 2003); Red Book =
«Красная книга (Liber Novus)» (Касталия 2025, пер. О. Комков). Калка-ловушка: «Психогенез
**душевных**» ≠ «…психических».
- **Essays/chapters** (e.g. Jaffé in *Man and his Symbols*): mark 🔶 if only the parent - **Essays/chapters** (e.g. Jaffé in *Man and his Symbols*): mark 🔶 if only the parent
book/anthology is available in RU. book/anthology is available in RU.
@ -746,13 +720,13 @@ Special cases:
- ~4s between libgen requests, ~3s between RSL pages, ~2s between shop requests. - ~4s between libgen requests, ~3s between RSL pages, ~2s between shop requests.
- All tools cache nothing by default; reruns are fine but avoid duplicate queries in a batch. - All tools cache nothing by default; reruns are fine but avoid duplicate queries in a batch.
## EN original sweep (soft libgen queries) — validated 2026-09-20 (sec01: +50 files) ## EN original sweep (soft libgen queries) — method (validated 2026-09-20, reused sec05/06/07)
Exact full-title libgen queries miss a lot (indexed titles vary: reprints, e-books, variants). Exact full-title libgen queries miss a lot (indexed titles vary: reprints, e-books, variants).
The validated approach for closing the EN download gap of a section: The validated approach for closing the EN download gap of a section:
1. **Build the gap list** from `downloads/0N-*/MANIFEST.md` («EN full text unavailable / 1. **Build the gap list** from `downloads/0N-*/MANIFEST.md` («Not downloadable» block) +
not present» block) + SUMMARY Table 3 DL EN column (rows with «— (restricted)» / «—»). SUMMARY «at a glance» DL EN column (rows with «— (restricted)» / «—»).
2. **Soft libgen queries, 2–3 rounds** (author-centric, not title-guessing): 2. **Soft libgen queries, 2–3 rounds** (author-centric, not title-guessing):
- round 1: `<author surname> <1–2 distinctive title words>`; - round 1: `<author surname> <1–2 distinctive title words>`;
- round 2 (0-hit items): `<author surname>` alone, filter results by title/first name; - round 2 (0-hit items): `<author surname>` alone, filter results by title/first name;
@ -777,16 +751,9 @@ The validated approach for closing the EN download gap of a section:
7. **archive.org (ia) as complement** for trade-restricted items: `tools/ia.py search "…"` → 7. **archive.org (ia) as complement** for trade-restricted items: `tools/ia.py search "…"` →
open items only (`RESTRICTED` = borrow-only). Jung CW: single open item `CarlJungCollectedWorks` open items only (`RESTRICTED` = borrow-only). Jung CW: single open item `CarlJungCollectedWorks`
(vols 1–18 + seminars, PDF+EPUB, direct `/download/<item>/<file>`). (vols 1–18 + seminars, PDF+EPUB, direct `/download/<item>/<file>`).
8. **Docs to update after:** SUMMARY Table 3 DL EN + totals row, MANIFEST (EN section with lg f_id / 8. **Docs to update after:** SUMMARY at-a-glance DL EN + totals row, MANIFEST (per-item rows with
ia item per file; «not downloadable» list), per-card line «EN downloaded (date): <source> — <edition>» lg f_id / ia item; «Not downloadable»), per-card Downloads table + Notes line.
(or «EN full text: NOT FOUND (date, 3 rounds)» for the true gaps), CONTEXT.md note. One commit per section. One commit per section. (Результаты прошлых секций — в их MANIFEST/Summary + git log.)
Result sec01: 50 files from 58 missing (8 genuinely absent: 13, 16, 38, 42, 48, 50, 52, 54 +
643 MB 24a replaced by 1991 twin).
Result sec05 (2026-09-23): 30 files from 31 candidates (08b 37-pp fragment discarded); 5 truly
unavailable (04 Chiron 1993, 05 1981, 15 SUNY 1997, 16 SUNY 1997, 23 Southern Book 1988) + 2
ia-restricted (03, 14). Queue infra: watchdog + speed-probe + `timeout 1500` per file +
unbuffered logs; ads.php throttle → pause, don't hammer.
## Dedup rules (user, 2026-09-25) — КАЖДАЯ КНИГА ИЩЕТСЯ/СКАЧИВАЕТСЯ ОДИН РАЗ ## Dedup rules (user, 2026-09-25) — КАЖДАЯ КНИГА ИЩЕТСЯ/СКАЧИВАЕТСЯ ОДИН РАЗ
@ -798,8 +765,8 @@ unbuffered logs; ads.php throttle → pause, don't hammer.
манифестов (см. правило ниже). RAW новой секции кладётся в sections/0N/RAW.md (или манифестов (см. правило ниже). RAW новой секции кладётся в sections/0N/RAW.md (или
data/isap-raw/), xref.py подхватывает автоматически. Скрипт локальный, ~1 c. data/isap-raw/), xref.py подхватывает автоматически. Скрипт локальный, ~1 c.
- **File level:** файл хранится ТОЛЬКО в первой секции, где книга появилась; поздние секции — - **File level:** файл хранится ТОЛЬКО в первой секции, где книга появилась; поздние секции —
cross-ref «secNN: <file>» в MANIFEST/карточке. 2026-09-25: 17 md5-дублей удалено cross-ref «secNN: <file>» в MANIFEST/карточке. (2026-09-25: 17 md5-дублей удалено
(`tools/dedup_files.py`), в каждом MANIFEST — датированная Notes-строка. `tools/dedup_files.py`.)
- **Профилактика дублей:** перед скачиванием в новой секции — md5-scan downloads/ по книге - **Профилактика дублей:** перед скачиванием в новой секции — md5-scan downloads/ по книге
(или по MASTER-LIST: если каноническая секция уже скачала — не скачивать). (или по MASTER-LIST: если каноническая секция уже скачала — не скачивать).
- **MANIFEST «Not downloadable»** — не источник истины по кросс-секционным книгам: - **MANIFEST «Not downloadable»** — не источник истины по кросс-секционным книгам:
@ -819,4 +786,5 @@ unbuffered logs; ads.php throttle → pause, don't hammer.
Cyrillic pages); a one-shot exact-title probe is cheap, don't plan on it. Cyrillic pages); a one-shot exact-title probe is cheap, don't plan on it.
- **RU translations: libgen.vg + flibusta.is** (flib = fb2/epub when libgen has only scan-pdf or nothing). - **RU translations: libgen.vg + flibusta.is** (flib = fb2/epub when libgen has only scan-pdf or nothing).
- Per language, format priority: ALL pdfs if any pdf exists; else all fb2; else all epub; else all doc. - Per language, format priority: ALL pdfs if any pdf exists; else all fb2; else all epub; else all doc.
- File naming `NN-<slug>-<lang>-<edition>.<ext>`; `downloads/0N-<name>/` gitignored, only `MANIFEST.md` committed. - File naming `NN-<slug>-<lang>-<edition>.<ext>`; **downloads в git LFS** (.gitattributes per sec),
MANIFEST.md — обычный текст.

View file

@ -2,7 +2,7 @@
## Totals ## Totals
21 files, 89 MB — RU 0 / EN 21 (16 libgen + 3 OA + 1 ia + 1 файл от пользователя). 20 files, 88 MB — RU 0 / EN 20 (15 libgen + 3 OA + 1 ia + 1 файл от пользователя).
## Files (per item) ## Files (per item)
@ -184,7 +184,7 @@ RU: нет файлов по 23 ❌-item'ам (gate: MISSING.md §NN); #02 = ✅
downloaded by f_id (KEY vs f_id rule); precheck v2 before each download. downloaded by f_id (KEY vs f_id rule); precheck v2 before each download.
- 2026-09-26: libgen CDN throttled at start (0 KB/s all edges); queue + watchdog 6×30 min, - 2026-09-26: libgen CDN throttled at start (0 KB/s all edges); queue + watchdog 6×30 min,
resolved within ~1 h. resolved within ~1 h.
- 2026-09-26 (rescue wave 2): +7 EN files (CW2×2, CW3×2, Bovensiepen, Krieger, Meier I) — - 2026-09-26 (rescue wave 2): +6 EN files (CW2×2, CW3-1982, Bovensiepen, Krieger, Meier I) —
file-level libgen-поиск (objects[]=f, подсказки пользователя). Все верифицированы: file-level libgen-поиск (objects[]=f, подсказки пользователя). Все верифицированы:
книги по page count + title; статьи по first page (автор+журнал+страницы=RAW, abstract = книги по page count + title; статьи по first page (автор+журнал+страницы=RAW, abstract =
не рецензия). Удалены ALD trial-фрагменты CW3 (ald-epub, ald-fb2.zip) и .su HTML-заглушки. не рецензия). Удалены ALD trial-фрагменты CW3 (ald-epub, ald-fb2.zip) и .su HTML-заглушки.

View file

@ -2,7 +2,7 @@
## Final counts ## Final counts
27 items: **4 ✅ / 0 🔶 / 23 ❌** (RU). Files: 21 (89 MB) — EN 21, RU 0; xref: 3 (sec01 ×2, sec04 ×1). 27 items: **4 ✅ / 0 🔶 / 23 ❌** (RU). Files: 20 (88 MB) — EN 20, RU 0; xref: 3 (sec01 ×2, sec04 ×1).
Section = mostly 2003–2021 academic Jungian books + JAP/Spring/Chiron papers: RU market Section = mostly 2003–2021 academic Jungian books + JAP/Spring/Chiron papers: RU market
has no editions except CW3 (АСТ 2025, rescue 2026-09-26 via flibusta.su). has no editions except CW3 (АСТ 2025, rescue 2026-09-26 via flibusta.su).
@ -37,7 +37,7 @@ has no editions except CW3 (АСТ 2025, rescue 2026-09-26 via flibusta.su).
| 25 | Solms & Panksepp, The Id Knows More (Brain Sciences 2012, OA) | — (paper) | — | ❌ | 1 pdf | — (absent) | | 25 | Solms & Panksepp, The Id Knows More (Brain Sciences 2012, OA) | — (paper) | — | ❌ | 1 pdf | — (absent) |
| 26 | Alcaro & Carta, The Affective Core of the Self (Frontiers 2017, OA) | — (paper) | — | ❌ | 1 pdf (OA) | — (absent) | | 26 | Alcaro & Carta, The Affective Core of the Self (Frontiers 2017, OA) | — (paper) | — | ❌ | 1 pdf (OA) | — (absent) |
| 27 | Panksepp & Biven, The Archaeology of Mind (Norton 2012) | ⚠ (Norton) | — | ❌ | 1 epub (Norton 2012) | — (absent) | | 27 | Panksepp & Biven, The Archaeology of Mind (Norton 2012) | ⚠ (Norton) | — | ❌ | 1 epub (Norton 2012) | — (absent) |
| | **totals** | | | | **21 files** | **0 files** | | | **totals** | | | | **20 files** | **0 files** |
Legend (ISBN columns): ✅ ISBN found · ⚠ published but no ISBN (TBC/new/CW vol) · ❌ no such edition (verified absent) · — no such edition type (paper/CW vol/pre-ISBN). Legend (ISBN columns): ✅ ISBN found · ⚠ published but no ISBN (TBC/new/CW vol) · ❌ no such edition (verified absent) · — no such edition type (paper/CW vol/pre-ISBN).
@ -92,15 +92,15 @@ Legend (ISBN columns): ✅ ISBN found · ⚠ published but no ISBN (TBC/new/CW v
(1) **CW3 RU FOUND** — «Психогенез душевных болезней» АСТ 2025 (flibusta.su b/390112, не на .is; (1) **CW3 RU FOUND** — «Психогенез душевных болезней» АСТ 2025 (flibusta.su b/390112, не на .is;
калка «психических» вела в тупик; найден браузерным поиском пользователя). #02 = ✅. калка «психических» вела в тупик; найден браузерным поиском пользователя). #02 = ✅.
(2) **EN rescues (file-level libgen, objects[]=f, подсказки пользователя)**: CW2×2 (1981 pdf 662 pp + (2) **EN rescues (file-level libgen, objects[]=f, подсказки пользователя)**: CW2×2 (1981 pdf 662 pp +
1973 epub), CW3×2 (1960 pdf 325 pp + 1982 epub), Bovensiepen JAP 2006, Krieger JAP 2019 1973 epub), CW3-1982 epub (1960 pdf уже был с ia), Bovensiepen JAP 2006, Krieger JAP 2019
(ed 84462696, ссылка пользователя), Meier I JAP 2019 (ed 84462697) — все 7 файлов (ed 84462696, ссылка пользователя), Meier I JAP 2019 (ed 84462697) — все 6 новых файлов
контент-верифицированы (статьи: автор+журнал+abstract = RAW, не рецензии). контент-верифицированы (статьи: автор+журнал+abstract = RAW, не рецензии).
(3) **Новый инструмент tools/doi.py**: Crossref author+title → DOI → libgen req=DOI (3) **Новый инструмент tools/doi.py**: Crossref author+title → DOI → libgen req=DOI
(контроли: 3/3 верные ed). Для статьи-items секций 08–12 — основной маршрут. (контроли: 3/3 верные ed). Для статьи-items секций 08–12 — основной маршрут.
(4) CW2-РУ: доп. свип (ast.ru server-side search, litres, Yandex Books, АСТ серия «Neoclassic») (4) CW2-РУ: доп. свип (ast.ru server-side search, litres, Yandex Books, АСТ серия «Neoclassic»)
— отсутствует (серия «Neoclassic» публикует CW последовательно; CW3 = 2025). — отсутствует (серия «Neoclassic» публикует CW последовательно; CW3 = 2025).
(5) **Dieckmann (#08) EN rescued** — файл от пользователя (Chiron 1999, 242 pp; libgen/ia (5) **Dieckmann (#08) EN rescued** — файл от пользователя (Chiron 1999, 242 pp; libgen/ia
не индексировали small-press Chiron). Итог секции: 21 EN файл. не индексировали small-press Chiron). Итог секции: 20 EN файлов.
- 2026-09-26: система .su ≠ .is (flibusta): у .su свой уникальный контент (CW3 там, на .is нет); - 2026-09-26: система .su ≠ .is (flibusta): у .su свой уникальный контент (CW3 там, на .is нет);
.su book/author-страницы curl-ятся, даунлоуд = JS POST /lang/?b=<id> (partner-locked litres .su book/author-страницы curl-ятся, даунлоуд = JS POST /lang/?b=<id> (partner-locked litres
при b=0). Для .su-книг искать файл в libgen/RSL по ISBN, не на самом .su. при b=0). Для .su-книг искать файл в libgen/RSL по ISBN, не на самом .su.