diff --git a/family/how-to/htpc.md b/family/how-to/htpc.md index 0cb2cefd..df5464ec 100644 --- a/family/how-to/htpc.md +++ b/family/how-to/htpc.md @@ -7,6 +7,8 @@ **MAC:** `B0:6E:BF:60:6D:64` +> ⚠️ HTPC агрессивно уходит в сон — SSH таймаутит через ~10-15 мин простоя. Перед каждой SSH-сессией отправлять WoL и ждать **~70 сек** (не 30) до появления SSH. + ### Скрипты (~/Automation/) ```bash diff --git a/family/how-to/openmediavault-rpi5.md b/family/how-to/openmediavault-rpi5.md index 99a1dab6..c8ede30c 100644 --- a/family/how-to/openmediavault-rpi5.md +++ b/family/how-to/openmediavault-rpi5.md @@ -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 --- diff --git a/family/projects/media-toolbox-kraken.md b/family/projects/media-toolbox-kraken.md index b408920c..84ad3f51 100644 --- a/family/projects/media-toolbox-kraken.md +++ b/family/projects/media-toolbox-kraken.md @@ -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") | --- diff --git a/personal/projects/personal-os/wiki-curation-runs/2026-05-15.md b/personal/projects/personal-os/wiki-curation-runs/2026-05-15.md new file mode 100644 index 00000000..91c06d58 --- /dev/null +++ b/personal/projects/personal-os/wiki-curation-runs/2026-05-15.md @@ -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 diff --git a/personal/projects/personal-os/wiki-curation-runs/2026-05-16.md b/personal/projects/personal-os/wiki-curation-runs/2026-05-16.md new file mode 100644 index 00000000..1077582e --- /dev/null +++ b/personal/projects/personal-os/wiki-curation-runs/2026-05-16.md @@ -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 diff --git a/wiki/index.md b/wiki/index.md index 06092e9c..a010ed9d 100644 --- a/wiki/index.md +++ b/wiki/index.md @@ -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 diff --git a/wiki/log.md b/wiki/log.md index bbdc833e..aaf02dc9 100644 --- a/wiki/log.md +++ b/wiki/log.md @@ -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 diff --git a/wiki/personal-os-architecture.md b/wiki/personal-os-architecture.md index 2b837031..7d517279 100644 --- a/wiki/personal-os-architecture.md +++ b/wiki/personal-os-architecture.md @@ -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):** diff --git a/work/wiki/apple-browsers/chat-path-onboarding-tracker-blocking.md b/work/wiki/apple-browsers/chat-path-onboarding-tracker-blocking.md index 04b73f3e..bbdad6e3 100644 --- a/work/wiki/apple-browsers/chat-path-onboarding-tracker-blocking.md +++ b/work/wiki/apple-browsers/chat-path-onboarding-tracker-blocking.md @@ -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 [Alessandro’s 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. + +**Alessandro’s 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. ---