2026-05-16 media-toolbox: classification fix + torrent case rename documented

This commit is contained in:
Alexey Martemyanov
2026-05-15 14:48:43 +06:00
parent 4f4358d76b
commit 653d2bf056
9 changed files with 131 additions and 23 deletions
+2
View File
@@ -7,6 +7,8 @@
**MAC:** `B0:6E:BF:60:6D:64`
> ⚠️ HTPC агрессивно уходит в сон — SSH таймаутит через ~10-15 мин простоя. Перед каждой SSH-сессией отправлять WoL и ждать **~70 сек** (не 30) до появления SSH.
### Скрипты (~/Automation/)
```bash
+6 -4
View File
@@ -31,7 +31,7 @@ ip: 192.168.1.14
| 11 — Hermes агент Кракен | ✅ | Запущен, Telegram @kraken_htpc_bot живой, mcpvault ✅, obsidian RW, SOUL.md, browser/Playwright ✅, Spotify ✅ |
| 11а — Docker на HDD | ✅ | data-root + containerd перенесены на HDD через symlink, SD освободилась до 22% |
| 12 — Obsidian sync (Taiga↔Kraken↔Eagle) | ✅ | Все 3 узла работают, кроны активны, двусторонний sync протестирован |
| 13 — Vault wiki (llm-wiki) | 🔲 | Eagle: scheduled wiki-curation job, Karpathy-style |
|| 13 — Vault wiki (llm-wiki) | | Eagle: scheduled wiki-curation job, Karpathy-style. Active 2026-05-13. |
---
@@ -323,6 +323,8 @@ Hermes маскирует секреты как `***` в terminal output. `$TOKE
| `gemini-2.5-flash` | ✅ primary |
| openrouter fallbacks | ✅ |
> ⚠️ **Gemini prepaid кредиты исчерпаны (2026-05-14)** — HTTP 429 RESOURCE_EXHAUSTED. Пока не пополнено, Кракен работает на OpenRouter free fallback (не поддерживает vision — изображения из Telegram не обрабатываются). Пополнить: https://aistudio.google.com/projects
### Telegram бот
- Имя: Кракен / Bot: [@kraken_htpc_bot](https://t.me/kraken_htpc_bot)
@@ -434,9 +436,9 @@ Eagle-only: scheduled Hermes job раз в сутки запускает wiki-cu
- Lint: orphans, broken links, stale content
**TODO:**
- [ ] Создать `wiki/SCHEMA.md`, `wiki/index.md`, `wiki/log.md`
- [ ] Добавить cron job на Eagle: ежедневно 02:00, skill `llm-wiki`
- [ ] Настроить `WIKI_PATH=~/obsidian/wiki` в Eagle `.env`
- [x] ~~Создать `wiki/SCHEMA.md`, `wiki/index.md`, `wiki/log.md`~~ ✅ 2026-05-13
- [x] ~~Добавить cron job на Eagle: ежедневно 02:00, skill `llm-wiki`~~ ✅ 2026-05-13
- [x] ~~Настроить `WIKI_PATH=~/obsidian/wiki` в Eagle `.env`~~ ✅ 2026-05-13
---
+8 -3
View File
@@ -94,11 +94,14 @@ media-pipeline (~/Developer/media_files_db, ветка kraken-agent)
#### 6. 🔴 Мультфильмы в library/movies (классификационный баг)
**Проблема:** `library/cartoons = 0 items`, `library/movies = 202 items` из которых **106 — мультфильмы** (симлинки ведут в `/media/cartoons/`). Pipeline при `apply` не учитывает source directory для определения выходной категории — всё льётся в `movies`.
**Проблема:** `library/cartoons = 0 items`, `library/movies = 202 items` из которых **106 — мультфильмы**. `MediaFinalizer.OutputConfig` содержал только `moviesDirectories` + `seriesDirectories``buildMovieActions` всегда писал в movies.
**Примеры неправильно классифицированных:** Despicable Me, Encanto, Luca, Умка, Чебурашка, Бременские музыканты, Ёжик в тумане, и ещё ~100 советских мультиков.
**Фикс (задеплоен):**
1. `Config.OutputConfig` + `MediaFinalizer.OutputConfig` расширены: добавлены `cartoonsDirectories` + `documentariesDirectories`.
2. `movieOutputDir(forGenres:)` — роутинг по resolved жанрам (Animation→cartoons, Documentary→documentaries). Source path не используется.
3. `ProviderSearchStrategy.facts()` теперь эмитит `NFOMetadataFact` с жанрами провайдера (раньше genres терялись, в граф не писались).
**Нужно:** в `MediaFinalizer`/`apply` логике использовать source dir (`/media/cartoons/``output.cartoons`, `/media/documentaries/``output.documentaries`) вместо TMDb genre для определения выходной папки.
**После деплоя:** нужно переместить существующие 106 неправильных entries из `library/movies` в `library/cartoons` (отдельный скрипт). Новые sync'и будут класть правильно.
- Настроить библиотеки в Jellyfin (http://192.168.1.14:8096)
- NFO файлы готовы (716 шт.), Jellyfin должен их подхватить
@@ -203,6 +206,8 @@ docker run --rm ... media-pipeline:kraken \
| Исходники | `~/Developer/media_files_db/`, ветка `kraken-agent` |
| Docker образ | `media-pipeline:kraken` (arm64, Colima 24GB) |
| kraken-ssh | `ssh kraken-ssh` → 10.99.1.2:22 через WireGuard (обновлено 2026-05-14) |
| docker deploy | `docker save \| ssh` зависает для образов >500MB. Деплоить только через Portainer API или scp+base64. После деплоя: `docker run --rm ... sync > /tmp/sync.log 2>&1 &` (background SSH) |
| Transmission RPC | Токен: `curl -D /tmp/hdrs ... > /dev/null`, затем `grep X-Transmission-Session-Id /tmp/hdrs \| awk '{print $2}' \| tr -d '\r\n'`. Payload с base64 торрента — писать в файл (`-d @file`), не аргументом (иначе "Argument list too long") |
---
@@ -0,0 +1,27 @@
---
date: 2026-05-15
status: complete
---
# Wiki Curation — 2026-05-15
## Done
- **Conflict scan:** Scanned all .md files under ~/obsidian/ — no git conflict markers found ✅
- **Previous run:** No incomplete run to resume (directory was empty, first run file created today)
- **Orientation:** Read SCHEMA.md, index.md, log.md — all current; 15 pages in wiki
- **Change detection:** Checked personal/ and family/ for recent changes; identified two actionable items in personal/projects/personal-os/
- **Architecture update — Executor Orchestrator Pattern:** Added to `personal-os-architecture.md` — Hermes Profiles mechanism confirmed as spawn approach; Eagle 2-min cron monitors `#executor`; auto-approval rules documented; structured message protocol (`[REQUEST:*]`, `[ESCALATE:*]`) defined. Source: `executor-spawning-research.md` (2026-05-14)
- **Architecture update — Kraken image routing:** Added open issue to `personal-os-architecture.md` — Gemini API credits depleted on Kraken; OpenRouter fallback models lack vision; `save_to_fs` mode proposed for Hermes image_routing. Source: `kraken-obsidian-write-bug.md` (2026-05-14)
- **Inbox:** `raw/inbox/` empty — nothing to process
- **Vault root triage:** No .md files in ~/obsidian/ root — all previously handled
- **Lint:** All 15 pages have frontmatter ✅; all 15 have wikilinks ✅; no orphans ✅; no broken links ✅; no pages over 200 lines ✅
- **Index:** No new pages created — no index update needed (still 15 pages)
- **Log:** Appended run 3 entry to wiki/log.md
## Unfinished
## Stats
- Conflicts resolved: 0
- Inbox processed: 0
- Root files triaged: 0
- Pages updated: 1 (personal-os-architecture.md)
- Lint issues found: 0
@@ -0,0 +1,27 @@
---
date: 2026-05-16
status: complete
---
# Wiki Curation — 2026-05-16
## Done
- **Conflict scan:** Scanned all .md files under ~/obsidian/ — no git conflict markers found ✅
- **Previous run (2026-05-15):** Status = complete, no Unfinished section — nothing to resume
- **Orientation:** Read SCHEMA.md, index.md, log.md — 15 pages in wiki, all in good shape
- **Change detection:** Most recently modified files: `family/projects/media-toolbox-kraken.md` (session 7+8 updates — KP API domain fix, torrent work), `family/how-to/openmediavault-rpi5.md`, `family/how-to/htpc.md`
- **Stale content fix:** `family/how-to/openmediavault-rpi5.md` — Step 13 (llm-wiki/Karpathy wiki) TODOs updated to ✅ (was showing 🔲, but wiki has been active since 2026-05-13); table row formatting also corrected (double `|` at start)
- **Architecture check:** `personal-os-architecture.md` — current; Kraken image routing open issue already documented; media-pipeline project is family scope (not wiki scope per SCHEMA)
- **Inbox:** `raw/inbox/` empty — nothing to process ✅
- **Vault root triage:** No .md files in ~/obsidian/ root ✅
- **Lint:** All 15 pages have frontmatter ✅; all 15 have wikilinks ✅; no orphans ✅; no broken links ✅; no pages over 200 lines ✅; no tags outside taxonomy ✅
- **Index:** Bumped "Last updated" to 2026-05-16; page count unchanged at 15
- **Log:** Appended 2026-05-16 entry to wiki/log.md
## Unfinished
## Stats
- Conflicts resolved: 0
- Inbox processed: 0
- Root files triaged: 0/0 (root is clean)
- Pages updated: 1 (family/how-to/openmediavault-rpi5.md — stale TODOs fixed)
- Lint issues found: 0
+1 -1
View File
@@ -9,7 +9,7 @@ updated: '2026-05-15'
# Wiki Index
Auto-maintained catalog of all pages in `wiki/`. Updated by the daily curation cron.
> Last updated: 2026-05-15 | Total pages: 15
> Last updated: 2026-05-16 | Total pages: 15
## Core Architecture
+21 -1
View File
@@ -43,7 +43,27 @@ Activity log for the daily Eagle wiki-curation cron job.
- Page size: all pages under 200 lines ✅
- New pages created: none
## 2026-05-15 (run 2)
## 2026-05-16
- **Conflict scan:** No git conflict markers found across all of ~/obsidian/ ✅
- **Inbox:** `raw/inbox/` empty ✅
- **Vault root triage:** No .md files in ~/obsidian/ root ✅
- **Stale content fix:** `family/how-to/openmediavault-rpi5.md` — Step 13 (llm-wiki) TODO items marked complete (active since 2026-05-13); table formatting corrected
- **Architecture check:** `personal-os-architecture.md` is current — no updates needed
- **Lint:** 15 pages, all frontmatter ✅, all wikilinks ✅, no orphans ✅, no broken links ✅, no pages over 200 lines ✅
- **Index:** bumped last updated to 2026-05-16; page count unchanged at 15
- **New pages created:** none
- **Conflict scan:** No git conflict markers found across all of ~/obsidian/ ✅
- **Inbox:** `raw/inbox/` empty ✅
- **Vault root:** No .md files in ~/obsidian/ root (all previously triaged) ✅
- **Architecture update:** `personal-os-architecture.md` — added Executor Orchestrator Pattern note (Hermes Profiles mechanism, 2-min Eagle monitoring cron, auto-approval rules); added Kraken image routing open issue (Gemini credits + vision fallback gap)
- **Stale check:** architecture page current; no other pages require updates from recent personal/ changes
- **Lint:** all 15 pages have frontmatter ✅; all 15 have wikilinks ✅; no orphans ✅; no broken links detected ✅; no pages over 200 lines ✅
- **New pages created:** none
- **Conflict scan:** No git conflict markers found across all of ~/obsidian/ ✅
- **Architecture update:** `personal-os-architecture.md` — added Mattermost migration notice (work channels moving Zulip→MM, blocked on IT Ops), added Zulip topic-routing plugin note (✅ done 2026-05-14); bumped `last_updated` to 2026-05-15
+8 -1
View File
@@ -49,6 +49,11 @@ See: `personal-os-purpose.md`
- Worker prompts in `~/Developer/personal-os/agent/prompts/executor-worker-*.md`
- Queue state in `executor_queue` table; live plan: `~/Developer/personal-os/briefs/executor-queue.md`
**Orchestrator Pattern (Planning — 2026-05-14):**
> Research phase complete. Executor will become a separate Hermes profile with its own Zulip bot identity ("Исполнитель"), spawned by Eagle as orchestrator. Eagle monitors `#executor` via 2-min cron, auto-approves safe actions (`[REQUEST:create_worktree]`, `[REQUEST:run_tests]`, etc.), escalates ambiguous/risky ones to Alex. See `personal/projects/personal-os/executor-spawning-research.md` for full protocol and auto-approval rules.
>
> Key mechanism: **Hermes Profiles** — `~/.hermes/profiles/executor/` with its own SOUL.md, Zulip bot token, and gateway. `hermes profile create executor --clone`.
**Shared**:
- Worktree at `~/DuckDuckGo/apple-browsers.git/.claude/worktrees/executor-{gid}-{slug}/`
- Always `git fetch origin main` + branch from `origin/main`
@@ -136,9 +141,11 @@ Executor runs
**Kraken (RPi5) — Hermes agent (`hermes-kraken` container):**
| Name | Command | Used for |
|------|---------|---------||
|------|---------|---------|
| obsidian | `/opt/data/.local/bin/mcpvault /vault` | Vault access (sparse: personal/ + family/). Tavily search enabled. |
> ⚠️ **Kraken image routing (open issue, 2026-05-14):** Gemini API credits depleted → fallback to OpenRouter models (gpt-oss-120b, minimax-m2) → these lack vision → image inbox messages fail. Desired fix: add `save_to_fs` mode to Hermes `image_routing` (save image locally, pass path to agent instead of bytes). Workaround: top up Gemini API credits on Kraken. Tracked in `personal/projects/personal-os/kraken-obsidian-write-bug.md`.
> All three nodes run Hermes with obsidian/mcpvault MCP. Eagle uses obsidian-mcp-wrapper.js (fixes ZodError+race); Taiga and Kraken use mcpvault directly.
**Claude Code / `claude -p` sessions (Eagle only):**
@@ -211,6 +211,18 @@ This is the same bug as **PR #4544 — Bugbot r3234645543** below. Fix is in `di
---
### 🔴 PR #4855 — Alessandro (line 450): Add `!restorePromptHandler.isEligibleForRestorePrompt()` to the returning-user guard
**Source:** [Alessandro May 15 review on PR #4855](https://github.com/duckduckgo/apple-browsers/pull/4855), `OnboardingIntroViewModel.swift:450`. Also referenced in [Alessandros May 15 Asana comment](https://app.asana.com/1/137249556945/task/1214348462471176/comment/1214794564106665).
**Issue:** The current guard `guard case .introDialog(isReturningUser: false) = introSteps.first` excludes returning users and those eligible to restore data during onboarding. But if the experiment is later remotely enrolled for all users (e.g. post-experiment analysis phase), returning users who are eligible for restore will bypass the guard and still see the Duck.ai experiment step.
**Fix:** Add `!restorePromptHandler.isEligibleForRestorePrompt()` as an additional condition to the guard.
**State:** 🔴 NOT yet implemented. Needs to be added to the uncommitted working-tree change in `OnboardingIntroViewModel.swift`. GitHub thread NOT resolved.
---
### 🟠 PR #4855 — Bugbot: Returning-user guard commented out in `insertExperimentStepIfNeeded`
**Source:** Bugbot on PR #4855, `OnboardingIntroViewModel.swift:451`. Also: [Alessandro May 7 review on #4544](https://github.com/duckduckgo/apple-browsers/pull/4544), Asana task [1214682678629767](https://app.asana.com/1/137249556945/task/1214682678629767).
@@ -286,11 +298,11 @@ This is the same bug as **PR #4544 — Bugbot r3234645543** below. Fix is in `di
---
### ⚠️ GJ8 / Copy: "Ask AI" vs "Ask.ai"
### GJ8 / Copy: "Ask.ai" confirmed (with dot)
**Source:** [GJ8 ship review](https://app.asana.com/1/137249556945/task/1214147157456478) says *"Ask AI"* (no dot). [Alessandro's #4855 review comment](https://github.com/duckduckgo/apple-browsers/pull/4855) says *"Ask.ai"* (with dot).
**Source:** GJ8 said "Ask AI". [Alessandro's May 14 Asana comment](https://app.asana.com/1/137249556945/task/1214348462471176/comment/1214794310099718) explicitly says **"Ask.ai"** (with dot) — resolves the conflict.
**State:** Implemented as "Ask AI" (no dot) per GJ8. ⚠️ Needs explicit confirmation from product/design before shipping.
**State:** 🟠 Currently implemented as "Ask AI" (no dot) in working tree. Needs to be changed to "Ask.ai" before committing.
---
@@ -306,14 +318,16 @@ This is the same bug as **PR #4544 — Bugbot r3234645543** below. Fix is in `di
### 🔴 PRE-SHIP-2 — Privacy config: rename the experiment
**Source:** [Task 1214682678629768](https://app.asana.com/1/137249556945/task/1214682678629768). Internal testers already enrolled under `onboardingDuckAIQueryExperiment`; new name ensures clean production enrollment.
**Source:** [Task 1214682678629768](https://app.asana.com/1/137249556945/task/1214682678629768). Internal testers already enrolled under `onboardingDuckAIQueryExperiment`; reusing it would complete NA analysis immediately (already at sample size).
**Name decided:** [Alessandro May 15](https://app.asana.com/1/137249556945/task/1214348462471176/comment/1214794564106665): use **`onboardingDuckAIQueryTrackersDemoExperiment`** as the new `AIChatSubfeature` case.
**What (three parts):**
1. **BSK** — new case in `AIChatSubfeature` enum with the new name string
2. **App** — update `FeatureFlag.onboardingDuckAIQueryExperiment` to reference the new subfeature case
3. **`privacy-configuration` repo** — add new experiment entry with `targets`; set old entry to `"state": "disabled"`
1. **BSK** — new case `onboardingDuckAIQueryTrackersDemoExperiment` in `AIChatSubfeature` enum
2. **App** — update `FeatureFlag.onboardingDuckAIQueryExperiment` to reference the new subfeature case; update experiment pixel names accordingly
3. **`privacy-configuration` repo** — add new entry `onboardingDuckAIQueryTrackersDemoExperiment` with `targets`; set old `onboardingDuckAIQueryExperiment` to `"state": "disabled"`
**State:** 🔴 Blocked — new experiment name not decided.
**State:** 🔴 Name decided, NOT yet implemented.
---
@@ -321,9 +335,9 @@ This is the same bug as **PR #4544 — Bugbot r3234645543** below. Fix is in `di
**Source:** [Pete Apr 30 comment](https://app.asana.com/1/137249556945/task/1214147157456478/1214600831548835). Pete's team needs the name to exclude enrolled users from the UTI feature rollout.
**What:** Fill the name into [O-J <> O-N Coordination](https://app.asana.com/1/137249556945/project/1214157224317277/task/1214288645859692) and [O-N Live Onboarding Experiment Details](https://app.asana.com/1/137249556945/task/1214601039604921).
**What:** Fill `onboardingDuckAIQueryTrackersDemoExperiment` into [O-J <> O-N Coordination](https://app.asana.com/1/137249556945/project/1214157224317277/task/1214288645859692) and [O-N Live Onboarding Experiment Details](https://app.asana.com/1/137249556945/task/1214601039604921).
**State:** 🔴 Blocked on PRE-SHIP-2 (name not decided).
**State:** 🔴 Name now known — can be filled in once PRE-SHIP-2 is done.
---
@@ -337,13 +351,17 @@ This is the same bug as **PR #4544 — Bugbot r3234645543** below. Fix is in `di
**GJ3/ Hide address bar + toolbar** 🟠 Implemented via `chromeDelegate?.setBarsHidden(true/false)`, not yet committed. Replaces earlier `setNavigationBarHidden` + `setChatPathVisitSiteControlsLocked` approach.
**GJ8/ "Ask AI" toggle label** 🟠 Implemented in `OnboardingView+DuckAIExperimentSearchContent.swift`, not yet committed. ⚠️ Pending copy confirmation ("Ask AI" vs "Ask.ai").
**GJ8/ "Ask.ai" toggle label** 🟠 Copy confirmed as **"Ask.ai"** (with dot) by [Alessandro May 14](https://app.asana.com/1/137249556945/task/1214348462471176/comment/1214794310099718). Currently implemented as "Ask AI" (no dot) in working tree — needs correction to "Ask.ai" before committing.
**Experiment rename in privacy config** 🔴 TBD. Need to create a new experiment name, add new `AIChatSubfeature` case in BSK, update `FeatureFlag`, and add new entry in `privacy-configuration/overrides/ios-override.json` (disabling old one). Blocked — new name not decided.
**Experiment rename in privacy config** 🔴 Name decided: **`onboardingDuckAIQueryTrackersDemoExperiment`** ([Alessandro May 15](https://app.asana.com/1/137249556945/task/1214348462471176/comment/1214794564106665)). Reason: reusing the old name would complete NA analysis immediately (already at sample size). Still needs implementing: new `AIChatSubfeature` case in BSK, update `FeatureFlag`, new entry in `privacy-configuration/overrides/ios-override.json` (disable old one).
**Privacy config `targets` payload** 🔴 TBD. `"targets": [{ "localeLanguage": "en", "localeCountry": "US" }]` must be added to the experiment entry. Local edit exists on wrong branch in `privacy-configuration` repo. Do together with rename above.
**O-N Live Onboarding Experiment Details ([task 1214601039604921](https://app.asana.com/1/137249556945/task/1214601039604921))** 🔴 TBD. Provide Pete with final experiment name once rename is decided. Also fill into [O-J <> O-N Coordination](https://app.asana.com/1/137249556945/project/1214157224317277/task/1214288645859692).
**O-N Live Onboarding Experiment Details ([task 1214601039604921](https://app.asana.com/1/137249556945/task/1214601039604921))** 🔴 Name now known (`onboardingDuckAIQueryTrackersDemoExperiment`). Fill into [O-N Live Onboarding Experiment Details](https://app.asana.com/1/137249556945/task/1214601039604921) and [O-J <> O-N Coordination](https://app.asana.com/1/137249556945/project/1214157224317277/task/1214288645859692) once PRE-SHIP-2 is implemented.
**Alessandros May 15 QA** — Tested PR #4855 against test cases in [task 1214683268207880](https://app.asana.com/1/137249556945/task/1214683268207880). Test run: [task 1214794564106677](https://app.asana.com/1/137249556945/project/1206329551987282/task/1214794564106677). Left notes in test run and new comments in PR (see PR #4855 — Alessandro line 450 item above).
**Merge approved PRs** — Alessandro recommends merging #4591 and #4664 (both approved) into the main feature branch (#4544) to avoid propagating main-branch merges through each PR separately.
---