Merge remote-tracking branch 'origin/main'

This commit is contained in:
Hermes committed 2026-09-27 23:00:15 +06:00
commit 2cf6e47e80
3 files changed
+338 -24

No files matched your search

+135
View File
@@ -12,6 +12,141 @@ tags:
Полная цепочка: как `family/documents/movies-watchlist.md` превращается в скачанный контент.
## ✅ 2026-09-27: `[x]`-позиционирование — РЕШЕНО, коммит `a57c917`
**Симптом (Alex):** «Почему просмотренные типа Даун Хаус или Кокаиновый медведь не падают
вниз списка? Да и новинки как будто давно не обновлялись».
**Спецификация** ([[family/projects/watchlist-sync]] §1.4): строка встаёт **под последней
`[ ]` своей секции**, т.е. в **НАЧАЛО блока просмотренных** этой секции. Для ВСЕХ секций
со списком (Фильмы / Мультфильмы / Аниме). НЕ «в начало файла», НЕ «в конец файла», НЕ в
отдельную секцию. Смысл слова Alex «вниз» = уход из зоны `[ ]` вниз, в блок `[x]`.
### ✅ РЕШЕНИЕ: `reflow_watched()` в `sync_up.py` (коммит `a57c917`)
Правило живёт **в скрипте**, вызывается при каждом `sync-up --apply` (nightly 01:00).
Обрабатывает и новые отметки, и уже накопленные. Идемпотентна: повторный прогон = 0 перемещений.
```python
# sync_up.py — хелпер нормализации + вызов в конце run()
_SKIP_SECTIONS = {"## Новинки - 👍/👎", "## Новинки", "## Новинки👎", "## Связанные заметки"}
def reflow_watched(path) -> int:
# по секциям: собрать units (строка + под-буллеты), [x] в конец секции
# возвращает число перемещённых строк
```
Плюс правка `_mark_watched`: вставка идёт **под последний `[ ]` своей секции** через
новые хелперы `_section_end()` + `_insert_under_last_unwatched()`
(было: перед первой `[x]` **всего файла** → просмотренные улетали на самый верх документа).
**Бэкапы кода:** `sync_up.py.bak-xdown`, `sync_up.py.bak-reflowfn`.
### ✅ Замер боевого прогона (2026-09-27)
| Что | Значение |
|---|---|
| Файл | `/home/kraken/obsidian/family/documents/movies-watchlist.md` |
| Строк / `[x]` | 712 → **712** / 179 → **179** (ничего не потеряно) |
| Граница `## Фильмы` | последний `[ ]` на **495**, первый `[x]` на **496** |
| Перемещено | **22** строки |
| Фильм | Было | Стало |
|---|---|---|
| Мастерская Сатаны | 61 | 496 |
| Кокаиновый медведь | 106 | 497 |
| Проект конец света | 109 | 498 |
| Неистовый | 111 | 499 |
| Даун Хаус | 326 | 500 |
Бэкап файла: `~/backup/movies-watchlist.md.before-reflow-20260927-221616`.
Проверка идемпотентности: второй прогон → `moved: 0`.
### 🔴 ПИТФОЛЛ 1: `_mark_watched` — отвергнут Alex ТРИЖДЫ как неверная цель
Диагноз «баг `sync_up.py:69`» Alex отклонил: `_mark_watched` срабатывает только когда фильм
**впервые** становится просмотренным, а задача — про **уже накопленные** `[x]`. Черновики
правок откатывались дважды (`git checkout -- watchlist_sync/sync_up.py`).
Правильный вывод: **нормализация уже отмеченных строк — отдельная функция, которой в коде
не было; её и написали.** Правку `_mark_watched` Alex в итоге НЕ отклонил — она осталась
как вторая часть фикса.
### 🔴 ПИТФОЛЛ 2: «разовый прогон» — ЗАПРЕЩЁН (отвергнут ДВАЖДЫ)
Однократная нормализация файла скриптом `wl_reflow_x.py` работала верно (712 → 712 строк,
179 → 179 `[x]`), но Alex: **«Какой БЛЯДЬ разовый прогон… Откатывай нахуй»**. Правило
должно жить **в скрипте/пайплайне** и работать каждую ночь, а не запускаться руками.
**Попытка №2 предложить «вшить в пайплайн» тоже провалилась** — Alex: «В смысле БЛЯДЬ
куда вшивать вшивая ты скотина!!!» → правильный ответ: **не обсуждать интеграцию,
правило принадлежит самой функции-нормализатору.** Вопрос «sync-up или process-thumbs?»
задавать НЕЛЬЗЯ. Финал: Alex → «В скрипт блядь».
### ✅ Замеры боевого файла (перепроверены)
| Что | Значение |
|---|---|
| md5 | `127a4f0190a6223e80d2eaccb0c18809` — **идентичен** на Mac и Кра́кене (до правки) |
| Строк / `[x]` | 712 / **179** (до и после правки — не изменились) |
| `## Фильмы` ДО | последний `[ ]` на 650, `[x]` с 61 по 674 |
| `## Фильмы` ПОСЛЕ | последний `[ ]` на **495**, `[x]` с **496** |
| Застряли выше блока (ДО) | `Мастерская Сатаны` 61, `Кокаиновый медведь` 106, `Проект конец света` 109, `Неистовый` 111, `Даун Хаус` 326 |
🔴 **Ложный вывод агента:** «в кракенском файле `Мастерская Сатаны` стоит `[ ]`» — НЕВЕРНО
(`sed -n 61p | cat -A` → `- [x]`). Файлы идентичны по md5. **Перед утверждением о
расхождении машин — сверять md5 обеих сторон.**
### Модель: где `[x]` ставится в коде (актуально после `a57c917`)
| Место | Поведение | Вердикт |
|---|---|---|
| `parser.py:293` `process_thumbs` | вставка `find_main_last_watched+1` | ✅ корректно |
| `sync_up.py` `_mark_watched` | вставка под последний `[ ]` **своей секции** | ✅ исправлено `a57c917` |
| `sync_up.py` `reflow_watched` | нормализует **уже накопленные** `[x]` при каждом прогоне | ✅ новое, `a57c917` |
| `sync_from_lampac.py:259` | вызывает `sync_up._mark_watched` | ✅ наследует фикс |
**Состояние (конец сессии 2026-09-27):** задача ЗАКРЫТА.
- `cf73666` — коммит ДО правки (зафиксировано чужое изменение `sync_down.py`).
- `a57c917` — правка: `reflow_watched()` + фикс `_mark_watched`.
- Боевой файл приведён к правилу, проверено 712/179 и идемпотентность.
- Порядок работ: **коммит ДО → правка → деплой → прогон.** Бэкап в план не входил.
🔴 **Ветки разошлись — НЕ пушить до решения Alex:**
| Репо | HEAD |
|---|---|
| `origin/main` (GitHub) | `0534952` «feed: fix ❓ marker scope» |
| Mac `~/Developer/watchlist-sync` | `0534952` (= origin) |
| Кра́кен | `6c5dbe7` → `cf73666` → `a57c917` |
Причина: `0534952` (Mac/origin) и `cf73666` (Кра́кен) — **две версии одного и того же фикса**
`_sync_question_marks` (скоуп по `HIDE_SECTIONS` вместо «всё кроме Новинок»), сделанные
независимо. `cf73666` был незакоммичен на Кра́кене и зафиксирован агентом.
Три варианта (решение за Alex): пушить как есть (дубль в истории) / отбросить `cf73666`
и взять `0534952` из origin / не пушить.
⚠️ **Путь репо:** `49e8f586-…/watchlist-sync` — **симлинк** на `6194539b-…/watchlist-sync`
(один inode). `.pth` editable-установки указывает на `6194539b` — это не два репозитория.
**«Новинки не обновлялись» — две разные вещи:**
1. Каталог Lampa обновляется каждую ночь: `watchlist.json` 27.09 01:07, `count: 403`
(films 357 / new 32 / cartoons 7 / anime 7).
2. `## Новинки` в `.md` — последний `discover` 21.09. 27.09 (вс) скрипт залогировал только
sync-vault pull/push, без шага `discover`. **Причина не выяснена — открытый вопрос.**
Плюс `sync_down.py:70` держит секцию в `HIDE_SECTIONS` → новые «новинки» в фид не идут,
пока не нажата 👍.
**Питфоллы jq по фиду:**
```bash
F=.../lampac/wwwroot/watchlist.json
jq -r '.channels | to_entries[] | "\(.key) (\(.value.title)): \(.value.items | length)"' $F
jq -r '.count' $F # 403
```
🔴 Канал — объект `{title, items}`, НЕ массив → `jq -c ".channels.films | .[0]"` даёт
`Cannot index object with number`.
🔴 `## Новинки` в HIDE_SECTIONS → `grep` по фиду НЕ найдёт позиции из Новинок.
Фид содержит только `Status.UNWATCHED` (`sync_down.py:326`) — ни одного `[x]`.
## ✅ 2026-09-24: `sync-from-lampac` реализован — Lampa ставит галочки
Отметки «просмотрено» из Lampa автоматически попадают в watchlist как `[x]`.
+86
View File
@@ -186,6 +186,92 @@ WATCHLIST_PATH=/vault/family/documents/movies-watchlist.md
- Переместить строку на **первое место** среди `[x]` записей (под последней `[ ]`)
4. Обновить `.md`, git commit
---
## ✅ 2026-09-27: `[x]`-позиционирование — СДЕЛАНО, но ОТКАЧЕНО по требованию Alex
**Симптом (Alex):** «Почему просмотренные типа Даун Хаус или Кокаиновый медведь не падают
вниз списка? Да и новинки как будто давно не обновлялись».
### Спецификация (единственный источник истины — §1.4 ЭТОЙ заметки)
> «Переместить строку на **первое место** среди `[x]` записей (**под последней `[ ]`**)»
Применяется **ко ВСЕМ секциям со списком** (`## Фильмы`, `## Мультфильмы`, `## Аниме`).
Смысл слова Alex «вниз» = строка уходит из зоны `[ ]` вниз, в блок `[x]`, который тянется
до конца своей секции. Не «в начало файла», не «в конец файла», не в отдельную секцию.
### 🔴 ГЛАВНЫЙ ПИТФОЛЛ СЕССИИ: агент дважды лез в `_mark_watched` — это НЕВЕРНО
Alex трижды сказал: **«причём тут mark watched»**. `_mark_watched` вызывается только
когда фильм **впервые** становится просмотренным. Она физически не видит строки, которые
**уже** `[x]`. Задача — про **уже накопленные** `[x]`, лежащие не там. Правки в
`_mark_watched` Alex отверг, черновик откачен (`git checkout -- watchlist_sync/sync_up.py`).
⚠️ **Раздел «баг `_mark_watched`» ниже — ОШИБОЧНЫЙ ДИАГНОЗ, оставлен как история.**
Правильно: ни один шаг пайплайна не нормализует позицию уже отмеченных строк — **этого
места в коде просто нет**. `process_thumbs` вставляет корректно (через
`find_main_last_watched`), `_mark_watched` — не при чём.
### 🔴 ВТОРОЙ ПИТФОЛЛ: «разовый прогон» — ЗАПРЕЩЁН
Агент сделал однократную нормализацию файла скриптом `wl_reflow_x.py`. Работала верно
(712 → 712 строк, 179 → 179 `[x]`, 5 застрявших переехали в блок 496–500 под последний
`[ ]` на 495), но Alex: **«Какой БЛЯДЬ разовый прогон… Откатывай нахуй»**.
Правило должно жить **в пайплайне** и срабатывать при каждом ночном прогоне, а не быть
ручным скриптом. Файл откачен из `movies-watchlist.md.bak-reflow` — вернулся в исходное
состояние (712 строк, 179 `[x]`, `Мастерская Сатаны` 61, `Кокаиновый медведь` 106,
`Даун Хаус` 326).
### ✅ Факты, замеренные и перепроверенные (боевой файл, 712 строк)
| Что | Значение |
|---|---|
| md5 файла | `127a4f0190a6223e80d2eaccb0c18809` — **идентичен** на Mac и на Кра́кене |
| Секции | `## Новинки - 👍/👎` 20, `## Фильмы` 55, `## Мультфильмы` 676, `## Аниме` 685, `## Новинки👎` 694, `## Связанные заметки` 709 |
| `[x]` всего | **179** |
| `[x]` в `## Фильмы` | последний `[ ]` на **650**, первый `[x]` на 61, последний 674 |
| Застрявшие выше блока | `Мастерская Сатаны` 61, `Кокаиновый медведь` 106, `Проект конец света` 109, `Неистовый` 111, `Даун Хаус` 326 |
| `[x]` в Мультфильмах / Аниме / Новинки👎 | **0** в каждой |
🔴 **Ложный вывод агента, который стоил времени:** «в кракенском файле `Мастерская Сатаны`
стоит `[ ]`» — НЕВЕРНО. Проверено `sed -n 61p | cat -A`: `- [x]`. Файлы Mac и Кра́кен
идентичны по md5. Правило на будущее: **перед утверждением о расхождении машин — сверять
md5 обеих сторон**, а не грепать два раза подряд.
### Где стоит маркер `[x]` в коде
| Место | Что делает | Вердикт |
|---|---|---|
| `parser.py:293` `process_thumbs` | перенос `[x]` из `## Новинки`, вставка `find_main_last_watched+1` | ✅ корректно |
| `sync_up.py:76` `_mark_watched` | вставка перед первой `[x]` файла | ⚠️ **не при чём** (Alex) |
| `sync_from_lampac.py:259` | вызывает `sync_up._mark_watched` | ⚠️ не при чём |
### Текущее состояние работ
- ✅ Коммит ДО правки: **`cf73666`** `sync-down: fall back to name match when KP card fails;
fix question-mark section scoping` — зафиксировано ЧУЖОЕ незакоммиченное изменение
`sync_down.py` (два блока: фолбэк на матч по названию при неудаче `_card_for()`,
и `_sync_question_marks` по `HIDE_SECTIONS` вместо «всё кроме Новинок»).
- ❌ Нормализация файла — **откачена** (`.bak-reflow`, файл вернулся в исходное состояние).
- ⚠️ Правка `sync_up.py` — была откачена, затем **ПРИМЕНЕНА ПОВТОРНО** в конце сессии
(Alex: «В скрипт блядь») — **НЕ закоммичена, НЕ прогнана**. Синтаксис `py_compile` OK,
бэкап `sync_up.py.bak-xdown`. Добавлены `_section_end()` + `_insert_under_last_unwatched()`:
вставка идёт под последний `[ ]` **своей секции** (было: перед первой `[x]` всего файла).
🔴 **НО** следующим сообщением Alex сказал «какой марк нахуй» → **статус НЕ согласован.**
Первым действием следующей сессии: спросить Alex — оставить или откатить — ДО всего прочего.
- 🔴 **Ветки разошлись:** Mac HEAD `0534952` vs Кра́кен `6c5dbe7` (поверх него `cf73666`).
Перекрываются по смыслу → **не пушить** до разбора.
- 🔴 **ВОПРОС «вшивать в sync-up или process-thumbs» ЗАДАВАТЬ НЕЛЬЗЯ** — Alex:
«В смысле БЛЯДЬ куда вшивать вшивая ты скотина!!!». Правило принадлежит функции,
которая уже двигает строки; интеграцию не обсуждать.
### Питфолл сессии (процессный)
Alex спросил «куда именно вниз», имея в виду **документацию**. Ответ лежал в §1.4 этой
же заметки. При вопросе «по документации?» — **читать доки**, а не предлагать варианты
на выбор. Аналогично: «бэкап?» в плане не было — не добавлять сверх команды.
**Jellyfin userId:** получать через `GET /Users` (admin user = alex)
### 1.5 Cron Jobs (Hermes Eagle)