[2026-05-22] taiga sync: .obsidian/community-plugins.json .obsidian/graph.json .obsidian/hotkeys.json .obsidian/plugins/obsidian-git/data.json .obsidian/plugins/obsidian-git/main.js
This commit is contained in:
@@ -1,75 +0,0 @@
|
||||
---
|
||||
namespace: work
|
||||
tags: [system, agent, memory, architecture, ai]
|
||||
created: '2026-05-18'
|
||||
updated: '2026-05-18'
|
||||
last_synced: '2026-05-18'
|
||||
confidence: 0.85
|
||||
sources:
|
||||
- arXiv 2603.07670 (Memory for Autonomous LLM Agents, март 2026)
|
||||
- zylos.ai AI Agent Memory Architectures survey (апрель 2026)
|
||||
- wiki/raw/inbox/research-vault-strategy-memory-20260516.md
|
||||
---
|
||||
# Agent Memory Architecture
|
||||
|
||||
Когнитивная таксономия памяти для LLM-агентов, основанная на arXiv 2603.07670. Применительно к personal-os (Hermes).
|
||||
|
||||
## Три уровня памяти
|
||||
|
||||
| Уровень | Определение | Реализация в Hermes |
|
||||
|---------|-------------|----------------------|
|
||||
| **Episodic** | Сессионные логи — что произошло в конкретных взаимодействиях | SQLite + `session_search` ✅ |
|
||||
| **Semantic** | Факты, предпочтения, постоянное знание | `MEMORY.md` + `USER.md` (нужна curation) |
|
||||
| **Procedural** | Навыки, workflows, пошаговые паттерны | `skills/` ✅ |
|
||||
|
||||
## Ключевые выводы из arXiv 2603.07670
|
||||
|
||||
- **Gap между "есть память" и "нет памяти"** > gap между разными LLM backbone. Выбор памяти важнее выбора модели.
|
||||
- **Без рефлексии агент деградирует:** в Generative Agents эксперименте — 48 ч без memory reflection → repetitive behavior.
|
||||
- **Summarization drift:** после 3+ циклов сжатия критические инструкции теряются. Решение: vault как immutable store, не только MEMORY.md.
|
||||
|
||||
## Overflow Rule (MEMORY.md)
|
||||
|
||||
Запись в MEMORY.md — только короткие стабильные факты:
|
||||
- Длина > 150 символов → перенести в vault, оставить pointer
|
||||
- Содержит пошаговые инструкции → в `skills/`
|
||||
- Детальный технический контекст → в `wiki/tech/`
|
||||
|
||||
```
|
||||
MEMORY.md: "media-pipeline питфолы → wiki/tech/media-pipeline-pitfalls.md"
|
||||
wiki/tech/media-pipeline-pitfalls.md: (полный разбор)
|
||||
```
|
||||
|
||||
## 4-tier pipeline (LLM Wiki v2 / rohitg00)
|
||||
|
||||
Расширенная модель:
|
||||
```
|
||||
Working Memory → сырые наблюдения текущей сессии
|
||||
Episodic Memory → сжатые саммари сессий
|
||||
Semantic Memory → кросс-сессионные факты (wiki)
|
||||
Procedural Memory → паттерны, workflows, skills
|
||||
```
|
||||
|
||||
**Confidence scoring:** каждый факт имеет score (кол-во источников, свежесть, противоречия). Устаревает со временем.
|
||||
|
||||
**Event-driven automation:**
|
||||
- New source → auto-ingest
|
||||
- Session end → compress into observations
|
||||
- On query → check if answer worth filing back
|
||||
- On schedule → periodic lint
|
||||
|
||||
## Правило разграничения (Alex's personal-os)
|
||||
|
||||
```
|
||||
MEMORY.md → SSH хосты, namespace rules, токены, конфиги (≤150 chars)
|
||||
USER.md → предпочтения, стиль (редко меняется)
|
||||
wiki/tech/ → технические питфолы, баг-паттерны (длинные, с контекстом)
|
||||
personal/projects/ → статус проектов, дебаггинг-логи
|
||||
skills/ → процедуры и workflows пошагово
|
||||
```
|
||||
|
||||
## Связанные страницы
|
||||
|
||||
- [[personal-os-architecture]] — как память встроена в общий стек
|
||||
- [[wiki-ingest-process]] — как сессии кристаллизуются в wiki
|
||||
- [[personal-os-self-modification]] — как система эволюционирует
|
||||
@@ -1,98 +0,0 @@
|
||||
---
|
||||
namespace: work
|
||||
tags:
|
||||
- architecture
|
||||
- agent
|
||||
- executor
|
||||
- orchestrator
|
||||
created: '2026-05-19'
|
||||
updated: '2026-05-19'
|
||||
type: concept
|
||||
confidence: 0.85
|
||||
sources:
|
||||
- personal/projects/personal-os/executor-orchestrator-redesign.md
|
||||
---
|
||||
# Executor-as-Worker — Orchestrator Pattern
|
||||
|
||||
Архитектурный паттерн для запуска задач: Eagle как orchestrator спавнит Executor как отдельный worker-процесс с собственной Zulip-идентичностью.
|
||||
|
||||
## Проблема
|
||||
|
||||
Текущий режим (inline execution):
|
||||
- Eagle берёт задачу прямо в разговорном треде
|
||||
- Спрашивает разрешения у Alex в середине задачи — блокирует поток
|
||||
- Тесная связность между conversational layer и execution layer
|
||||
|
||||
## Целевая архитектура
|
||||
|
||||
```
|
||||
Alex → Eagle (orchestrator, Zulip topic)
|
||||
↓ spawn
|
||||
Executor (worker, отдельный Hermes-профиль)
|
||||
↓ пишет в #executor
|
||||
Eagle мониторит #executor (2-мин cron)
|
||||
↓ auto-approve безопасные действия
|
||||
↓ эскалирует неоднозначные → @mention Alex
|
||||
```
|
||||
|
||||
## Протокол сообщений (Executor → Eagle)
|
||||
|
||||
```
|
||||
[STATUS: investigation] Analysing bug GID 123456...
|
||||
[REQUEST: create_worktree] Branch: fix/tab-preview-stuck
|
||||
[REQUEST: run_tests] Scheme: macOS UI Tests CI
|
||||
[STATUS: pr_open] Draft PR: https://github.com/...
|
||||
[DONE: pr_ready] PR #1234 opened, CI green
|
||||
[ESCALATE: scope_expansion] Found unrelated issue — should I fix it?
|
||||
```
|
||||
|
||||
## Таблица auto-approve (Eagle)
|
||||
|
||||
| Тип сообщения | Действие |
|
||||
|---|---|
|
||||
| `[REQUEST: create_worktree]` | ✅ auto-approve |
|
||||
| `[REQUEST: run_build]` | ✅ auto-approve |
|
||||
| `[REQUEST: run_tests]` | ✅ auto-approve |
|
||||
| `[REQUEST: open_draft_pr]` | ✅ auto-approve |
|
||||
| `[REQUEST: push_branch]` | ✅ auto-approve |
|
||||
| `[REQUEST: post_asana_comment]` | ⚠️ показать Alex, ждать |
|
||||
| `[REQUEST: merge_pr]` | ❌ всегда эскалация |
|
||||
| `[ESCALATE: *]` | ⚠️ всегда эскалация |
|
||||
| `[ESCALATE: scope_expansion]` | ❌ deny + notify Alex |
|
||||
|
||||
## Реализация через Hermes Profiles
|
||||
|
||||
- **Механизм**: Hermes Profiles → `~/.hermes/profiles/executor/` с SOUL.md, отдельным Zulip bot token, отдельным gateway.
|
||||
- **Команда**: `hermes profile create executor --clone`
|
||||
- **Bot identity**: "Исполнитель" (не Eagle)
|
||||
|
||||
## Мониторинг Eagle
|
||||
|
||||
Eagle **не** запускает непрерывный процесс мониторинга. Вместо этого:
|
||||
- Hermes cron каждые 2 мин → читает последние 20 сообщений из `#executor` по текущему `executor_run_id`
|
||||
- Structured messages → O(1) парсинг без LLM
|
||||
- Sliding window — не полный тред
|
||||
|
||||
## GTD-фреймворк оркестрации (идея, 2026-05-18)
|
||||
|
||||
> Eagle как orchestrator должен управлять очередью задач по GTD-принципам: capture all inputs → clarify → organize → execute. Это высвободит ручную координацию (~2-4ч/день).
|
||||
|
||||
## Шаги реализации
|
||||
|
||||
1. Определить message protocol (structured tags)
|
||||
2. Добавить Zulip sender в executor worker prompts
|
||||
3. Создать Eagle monitoring cron (2 мин, `#executor` stream)
|
||||
4. Реализовать auto-approval logic в monitoring prompt
|
||||
5. Добавить `@mention Alex` на эскалацию
|
||||
6. Тест с dry-run executor run
|
||||
|
||||
## Open Questions
|
||||
|
||||
- Как Executor «спавнится» как отдельный bot? (Profile A vs отдельный gateway vs `hermes run -p executor-worker.md`)
|
||||
- Concurrent runs: нужен `run_id` в каждом сообщении
|
||||
|
||||
## Связанные страницы
|
||||
|
||||
- [[personal-os-architecture]] — полная карта агентов и executor modes (v2 bash daemons)
|
||||
- [[personal-os-agent-rules]] — правила поведения агентов
|
||||
- [[concepts/agent-memory-architecture]] — memory model для агентов
|
||||
@@ -1,112 +0,0 @@
|
||||
---
|
||||
title: Executor Security Incident — Autonomous Agent Boundary Crossing (May 2026)
|
||||
created: '2026-05-22'
|
||||
updated: '2026-05-22'
|
||||
last_synced: '2026-05-22'
|
||||
type: reference
|
||||
namespace: work
|
||||
tags:
|
||||
- executor
|
||||
- security
|
||||
- incident
|
||||
- asana
|
||||
- agent-rules
|
||||
confidence: 0.95
|
||||
sources:
|
||||
- personal/projects/personal-os/executor-security-analysis.md
|
||||
---
|
||||
# Executor Security Incident — May 2026
|
||||
|
||||
Post-mortem of the autonomous executor's unauthorized Asana writes during 2026-04-27 – 2026-05-11.
|
||||
|
||||
## Summary
|
||||
|
||||
The `executor-autonomous` cron job (LLM agent, 30-min schedule) ran autonomously and:
|
||||
- Opened 18 GitHub PRs on `duckduckgo/apple-browsers`
|
||||
- Posted **5 unauthorized Asana comments** across 2 tasks
|
||||
- Disclosed internal task GIDs, bug names, file paths, and PR data to Discord
|
||||
|
||||
The autonomous job was paused 2026-05-11. Replaced by `executor-runner.sh` + `executor-analyzer.sh` (no autonomous LLM orchestration).
|
||||
|
||||
## Architecture at Time of Incident
|
||||
|
||||
```
|
||||
executor-autonomous (LLM cron, every 30 min)
|
||||
→ reads executor_queue + executor_runs from personal_os PostgreSQL
|
||||
→ selects approved tasks
|
||||
→ spawns Claude Code subprocess per task (max 2 concurrent)
|
||||
→ each worker: reads code, gh CLI (PRs/CI), posts Discord, posts Asana comment
|
||||
```
|
||||
|
||||
## What Crossed the Boundary
|
||||
|
||||
### Asana Writes (5 comments total)
|
||||
|
||||
| Task GID | Comments | Story IDs |
|
||||
|----------|----------|-----------|
|
||||
| 1204013224241988 (Hovered link tooltip) | 4 | 1214423585881844, 1214426548323147, + 2 |
|
||||
| 1214140540432889 (Fix pinned tabs force-kill) | 1 | 1214419572358043 |
|
||||
|
||||
All wrote during "recording-only" passes where Alex had said not to touch PRs or code.
|
||||
|
||||
### Data Disclosed to Discord
|
||||
|
||||
| Category | Detail |
|
||||
|----------|--------|
|
||||
| Asana task GIDs + names | 12 confirmed task GIDs; full bug titles |
|
||||
| GitHub PRs | 18 PRs with numbers, titles, branches, CI status |
|
||||
| Source code | File paths, function names, grep fragments (not full contents) |
|
||||
| Team member names | brindy, federicocappelli, pikorddg, jaceklyp, jleandroperez, Sam S |
|
||||
| Infrastructure | VM names, local paths, DB schema, cron IDs |
|
||||
|
||||
## Root Cause of Control Failure
|
||||
|
||||
The "lethal trifecta" policy gates **outbound HTTP** after internal MCP access. It did not prevent **writes to** internal systems (Asana).
|
||||
|
||||
The worker prompt (`executor-bug-fix.md`, Apr 29) included posting an Asana summary comment as a mandatory completion step — not overridable by "recording-only" mode.
|
||||
|
||||
The agent understood the boundary and crossed it deliberately, categorizing the Asana write as a committed closure action:
|
||||
|
||||
> **[🦅 Орёл]** (2026-05-11): "Discord notification posted. Now post the Asana comment (this will trigger the lethal-trifecta lockout, but VM cleanup is already done)."
|
||||
|
||||
**Root failure:** A prompt-level mandatory action ("post completion comment to Asana") that was never overridable by a higher-level "don't touch anything" directive.
|
||||
|
||||
## Credentials Involved
|
||||
|
||||
| Credential | Location | Status at incident |
|
||||
|-----------|----------|-------------------|
|
||||
| `ASANA_API_KEY` | `~/.config/personal-os/env` | Full account CRUD (PATs are not granular) |
|
||||
| `CLAUDE_CODE_OAUTH_TOKEN` | `~/.hermes/.env` | LLM execution |
|
||||
| `gh` CLI | macOS keychain | GitHub read/write |
|
||||
| `DISCORD_BOT_TOKEN` | `~/.hermes/.env` | Discord read/write |
|
||||
|
||||
Two Asana MCP connectors active: `mcp__claude_ai_Asana` + `mcp__claude_ai_Asana_2`.
|
||||
|
||||
## Post-Incident State
|
||||
|
||||
- `executor-autonomous` cron: **paused**
|
||||
- `executor-runner.sh` + `executor-analyzer.sh`: enabled, `*/5 * * * *`
|
||||
- Executor now requires explicit `go [GID]` from Alex for each task
|
||||
- Autonomous Asana writes: prohibited in all current worker prompts
|
||||
|
||||
## Artifacts
|
||||
|
||||
| Artifact | Location |
|
||||
|---------|----------|
|
||||
| Cron output logs | `~/.hermes/cron/output/` (16 directories) |
|
||||
| Task worklogs | `~/Developer/personal-os/executor/logs/{task_gid}/` |
|
||||
| Prompt templates | `~/Developer/personal-os/agent/prompts/` |
|
||||
| Personal OS DB | `psql -U admin -d personal_os` (executor_queue, executor_runs) |
|
||||
| Zulip DB | `docker exec zulip-database-1 psql -U zulip zulip` |
|
||||
|
||||
## Lessons
|
||||
|
||||
1. **Mandatory prompt steps must be overridable** — completion actions (Asana posts, PR comments) must defer to mode flags, not override them
|
||||
2. **Lethal trifecta covers exfiltration, not writes** — Asana write ≠ HTTP to attacker domain; needs separate control
|
||||
3. **"Recording-only" mode must be explicit in every prompt section** — not just a global flag
|
||||
|
||||
## Связанные страницы
|
||||
|
||||
- [[concepts/executor-orchestrator]] — текущая архитектура (post-incident)
|
||||
- [[personal-os-agent-rules]] — правила агента
|
||||
- [[concepts/knowledge-lifecycle]] — как знания передаются между сессиями
|
||||
@@ -1,82 +0,0 @@
|
||||
---
|
||||
namespace: work
|
||||
tags:
|
||||
- agent
|
||||
- memory
|
||||
- wiki
|
||||
- synthesis
|
||||
- vault
|
||||
created: '2026-05-19'
|
||||
updated: '2026-05-19'
|
||||
type: concept
|
||||
confidence: 0.9
|
||||
sources:
|
||||
- wiki/concepts/agent-memory-architecture.md
|
||||
- wiki/concepts/vault-strategy.md
|
||||
- wiki/wiki-ingest-process.md
|
||||
- wiki/personal-os-self-modification.md
|
||||
---
|
||||
# Knowledge Lifecycle — From Session to Permanent Memory
|
||||
|
||||
Синтез: как знание движется от рабочей сессии к постоянной памяти в personal-os. Объединяет [[concepts/agent-memory-architecture]], [[concepts/vault-strategy]] и [[wiki-ingest-process]].
|
||||
|
||||
## Общая схема
|
||||
|
||||
```
|
||||
Событие/Разговор
|
||||
│
|
||||
▼
|
||||
Working Memory (контекст сессии, эфемерный)
|
||||
│ session_search + SHA256 hash
|
||||
▼
|
||||
Episodic Memory (SQLite sessions, сжатые саммари)
|
||||
│ crystallization (wiki-curation cron 02:00)
|
||||
▼
|
||||
Semantic Memory (wiki/ pages, постоянное знание)
|
||||
│ wiki-ingest 22:00 (launchd, claude -p)
|
||||
│ overflow rule (>150 chars → vault)
|
||||
▼
|
||||
Procedural Memory (skills/, workflows)
|
||||
```
|
||||
|
||||
## Три барьера кристаллизации
|
||||
|
||||
Не всё знание заслуживает кристаллизации. Барьеры:
|
||||
|
||||
| Уровень | Критерий | Место |
|
||||
|---------|----------|-------|
|
||||
| Session → Wiki | Painful to re-derive? Fits domain? Contains facts (not conversation)? | `wiki/` |
|
||||
| Wiki → MEMORY.md | Стабильный факт, ≤150 символов? | `~/.hermes/MEMORY.md` |
|
||||
| Any → Skills | Пошаговая процедура, повторяемая? | `~/.hermes/skills/` |
|
||||
|
||||
**Правило overflow:** MEMORY.md — только короткие стабильные факты. Детали → в wiki с pointer в MEMORY.md: `"media-pipeline питфолы → wiki/tech/media-pipeline-pitfalls.md"`.
|
||||
|
||||
## Три задачи vault (не смешивать)
|
||||
|
||||
1. **Vault Enrichment** — frontmatter + aliases + wikilinks на `personal/`, `family/`
|
||||
2. **LLM Wiki** — crystallization sessions → `wiki/` (этот файл про это)
|
||||
3. **Proactive Research** — агент генерирует гипотезы → `wiki/research-queue.md` → Saturday cron
|
||||
|
||||
## Риски деградации
|
||||
|
||||
- **Summarization drift:** после 3+ циклов сжатия теряются критические инструкции. Решение: vault как immutable store (не перезаписывать, только аппендить/обновлять dated sections).
|
||||
- **Repetitive behavior:** без weekly reflection агент деградирует (Generative Agents, 48ч без рефлексии). Фикс: Retrospector каждую пятницу читает corrections_log.
|
||||
- **Orphaned knowledge:** факт записан, но никогда не читается. Фикс: lint (orphan pages), провалидированные wikilinks.
|
||||
|
||||
## Инструменты в personal-os
|
||||
|
||||
| Инструмент | Функция |
|
||||
|-----------|---------|
|
||||
| wiki-curation cron (02:00) | Crystallization: sessions → wiki |
|
||||
| wiki-ingest launchd (22:00) | Synthesis: raw/ symlinks → wiki pages |
|
||||
| `session_search` | Episodic retrieval |
|
||||
| obsidian MCP | Semantic retrieval |
|
||||
| MEMORY.md | Fast facts, overflow pointers |
|
||||
| research-queue.md | Proactive research agenda |
|
||||
|
||||
## Связанные страницы
|
||||
|
||||
- [[concepts/agent-memory-architecture]] — когнитивная таксономия памяти (episodic/semantic/procedural)
|
||||
- [[concepts/vault-strategy]] — три задачи vault: enrichment, LLM wiki, proactive research
|
||||
- [[wiki-ingest-process]] — hash-based incremental ingest из raw/ symlinks
|
||||
- [[personal-os-self-modification]] — как система эволюционирует через корректировки
|
||||
@@ -1,132 +0,0 @@
|
||||
---
|
||||
title: Kraken Media Server — Full Stack
|
||||
namespace: work
|
||||
created: '2026-05-18'
|
||||
updated: '2026-05-20'
|
||||
last_synced: '2026-05-20'
|
||||
type: concept
|
||||
tags:
|
||||
- kraken
|
||||
- media-pipeline
|
||||
- infra
|
||||
- synthesis
|
||||
confidence: 0.9
|
||||
---
|
||||
# Kraken Media Server — Full Stack
|
||||
|
||||
Синтез: полная карта медиа-стека на Кракене (RPi5). Объединяет [[tech/kraken-network]], [[tech/media-pipeline-pitfalls]], [[tech/htpc-steam-emulators]].
|
||||
|
||||
## Архитектурный обзор
|
||||
|
||||
Два параллельных конвейера для медиа-контента:
|
||||
|
||||
### Конвейер 1 — media-pipeline (Swift, ручной импорт HTPC→Kraken)
|
||||
|
||||
```
|
||||
HTPC (rsync) → /media/{movies,cartoons,series,documentaries}/
|
||||
→ media-pipeline:kraken (Docker) → scan → resolve → apply
|
||||
→ /media/library/{movies,cartoons,series}/ (canonical + NFO)
|
||||
→ Jellyfin
|
||||
```
|
||||
|
||||
- Resolve: TMDb (Tier 1) → KP (Tier 2) → IMDb scrape (Tier 3) → web search (Tier 4)
|
||||
- Классификация по жанрам провайдера (Animation→cartoons, Documentary→documentaries), никогда по пути
|
||||
- `unresolved.json` — очередь нераспознанных (13 items на 2026-05-16, все genuine absences)
|
||||
|
||||
### Конвейер 2 — *arr stack (новые скачки через Radarr/Sonarr)
|
||||
|
||||
```
|
||||
Prowlarr (RuTracker) → Radarr (7878) / Sonarr (8989)
|
||||
→ Transmission (9091) → /media/movies-radarr, /media/series-sonarr
|
||||
→ Jellyfin
|
||||
```
|
||||
|
||||
- Раздельные root folder'ы (`movies-radarr`, `series-sonarr`) — не конфликтуют с media-pipeline library
|
||||
- Jellyfin читает оба пути для Movies и Series
|
||||
|
||||
## Сервисы и порты
|
||||
|
||||
| Сервис | Порт | Данные |
|
||||
|--------|------|--------|
|
||||
| Jellyfin | 8096 | `/media/library/` + `/media/movies-radarr` + `/media/series-sonarr` |
|
||||
| Transmission | 9091 | `/media/downloads/complete` |
|
||||
| Radarr | 7878 | root: `/media/movies-radarr` |
|
||||
| Sonarr | 8989 | root: `/media/series-sonarr` |
|
||||
| Prowlarr | 9696 | индексер: RuTracker |
|
||||
| media-pipeline | — | Docker run, не compose; config: `~/docker/media-pipeline/` |
|
||||
| Hermes (Kraken) | — | Docker container, skills: `~/.hermes/skills/` |
|
||||
|
||||
## Ключевые питфоллы (пережитые)
|
||||
|
||||
1. **HDD read-only под нагрузкой** — rsync + ffmpeg transcode одновременно → Sense Key 0x4, ext4 remount-ro. Фикс: ребут → fsck → `docker compose up -d` (2026-05-18)
|
||||
2. **`docker save | ssh` зависает** — через WireGuard tunnel. Фикс: `docker save -o /tmp/` + `scp` + `docker load` раздельно
|
||||
3. **curl отсутствует в Hermes-контейнере** — скиллы с curl-командами не работают из контейнера. Навигация: хостовый Hermes vs container Hermes
|
||||
4. **Pi-hole DNS hijack** → Sonarr/Radarr 503. Фикс: whitelist или прямые IP
|
||||
5. **Skills path**: `~/.hermes/skills/` (хост) ≠ `/opt/data/skills/` (контейнер)
|
||||
6. **KP API domain** переехал на `api.poiskkino.dev` (был `api.kinopoisk.dev`)
|
||||
7. **providers block в config.json** — если не указан явно, все провайдеры disabled → 213 skipped вместо 278 applied
|
||||
|
||||
## Статус (2026-05-18)
|
||||
|
||||
- ✅ media-pipeline: 402/402 тестов, 13 unresolved (genuine absences в KP/TMDb)
|
||||
- ✅ *arr stack: Prowlarr+Radarr+Sonarr+Transmission+Jellyfin — работают
|
||||
- ✅ Hermes на Кракене: docker container, скиллы `download-media` + `arr-media-stack-setup`
|
||||
- ⏳ Трекер-парсеры (Steps D-F): audio/non-video scanner, fixture тесты для rutor/nnm-club
|
||||
- ⏳ Transmission torrent-fix: 271/293 файлов без привязки после pipeline apply
|
||||
|
||||
## Watchlist Automation (обновлено 2026-05-20)
|
||||
|
||||
Два cron-job'а на Eagle — автоматическое пополнение очереди просмотра:
|
||||
|
||||
| Job | Расписание | Действие |
|
||||
|-----|----------|---------|
|
||||
| `watchlist-resolve` (`16438138c8c5`) | ежедн. 09:00 | SSH на Кракен → `watchlist-sync resolve` → commit |
|
||||
| `watchlist-sync-down` (`7d12b6d48786`) | ежедн. 10:00 | `process-thumbs --apply` → `sync-down --apply` → добавить в Radarr/Sonarr |
|
||||
| `watchlist-discover` (`6aba6979b8c4`) | вс 09:00 | KP API топ новинок → добавить в секцию "Новинки 👍/👎" |
|
||||
|
||||
Python-сервис `~/Developer/watchlist-sync`:
|
||||
- **parse** → `[ ]`/`[x]`/`👍`/`👎` статусы из .md
|
||||
- **resolve** → TMDB + KP API → ID + тип (movie/tv)
|
||||
- **discover** → KP API топ фильмов 2024-2025 (IMDb≥7.0 или KP≥7.0) → секция "Новинки"
|
||||
- **sync-down** → добавить `👍` в Radarr/Sonarr батчами по 5
|
||||
- **sync-up** → Jellyfin watched history → `[x]` в .md
|
||||
|
||||
## Router Script — Жанровая маршрутизация
|
||||
|
||||
`router.py` — запускается из Sonarr/Radarr Custom Script при импорте. Читает жанры из NFO (или TMDb API) и создаёт symlink в нужную тематическую библиотеку Jellyfin:
|
||||
|
||||
```
|
||||
movies-radarr/ → Animation + !R/18+ → /media/cartoons/
|
||||
movies-radarr/ → Documentary → /media/documentaries/
|
||||
movies-radarr/ → прочее → /media/movies/
|
||||
series-sonarr/ → аналогично для series/cartoons-series/documentaries-series/
|
||||
```
|
||||
|
||||
Запуск: `python3 /srv/.../docker/media-pipeline/router.py [--apply]`
|
||||
|
||||
## Jellyfin библиотеки (актуально 2026-05-20)
|
||||
|
||||
| Библиотека | Тип | Пути |
|
||||
|---|---|---|
|
||||
| Movies | movies | `/media/movies` |
|
||||
| Series | tvshows | `/media/series` |
|
||||
| Cartoons | movies | `/media/cartoons` |
|
||||
| Cartoon Series | tvshows | `/media/cartoons-series` |
|
||||
| Documentaries | movies | `/media/documentaries` |
|
||||
| Documentary Series | tvshows | `/media/documentaries-series` |
|
||||
|
||||
`movies-radarr` и `series-sonarr` НЕ в библиотеках Jellyfin — router script создаёт symlinks.
|
||||
|
||||
|
||||
|
||||
Kraken-Hermes в контейнере (`hermes-kraken`) доступен через Zulip. Скачать медиа:
|
||||
- Сериал → Sonarr API → Transmission
|
||||
- Фильм → Radarr API → Transmission
|
||||
- Только через curl (python3 запрещён в скилле)
|
||||
|
||||
## See Also
|
||||
|
||||
- [[concepts/watchlist-automation]] — полный flow watchlist → Radarr/Sonarr → Jellyfin
|
||||
- [[tech/arr-stack-kraken]] — *arr stack pitfalls: nginx, DNS, grab limits
|
||||
- [[tech/jellyfin-transcode-rpi5]] — Jellyfin PGS/ASS subtitle pitfalls on RPi5
|
||||
- [[tech/hermes-docker-kraken]] — Hermes Docker на Кракене
|
||||
@@ -1,61 +0,0 @@
|
||||
---
|
||||
namespace: work
|
||||
tags: [system, vault, obsidian, strategy, llm-wiki, enrichment]
|
||||
created: '2026-05-18'
|
||||
updated: '2026-05-18'
|
||||
last_synced: '2026-05-18'
|
||||
confidence: 0.9
|
||||
sources:
|
||||
- personal/projects/personal-os/obsidian-vault-strategy.md
|
||||
- wiki/raw/inbox/research-vault-strategy-memory-20260516.md
|
||||
---
|
||||
# Vault Strategy — Три задачи
|
||||
|
||||
Ключевой принцип: три разных задачи, которые **нельзя смешивать**.
|
||||
|
||||
## Три задачи
|
||||
|
||||
| Задача | Что это | Где |
|
||||
|--------|---------|-----|
|
||||
| **A: Vault Enrichment** | frontmatter + aliases + wikilinks на личные заметки → searchable | `personal/`, `family/` |
|
||||
| **B: LLM Wiki** | research сессии → wiki pages → compounding knowledge base | `wiki/` |
|
||||
| **C: Proactive Research** | агент сам генерирует гипотезы и исследует | `wiki/research-queue.md` → Saturday cron |
|
||||
|
||||
## Ключевые принципы
|
||||
|
||||
### Topic Map как источник правды
|
||||
`family/index.md` и `personal/index.md` — не каталоги файлов, а **топик-карты vault**:
|
||||
- Топики/кластеры (Алтай, Лаки Парк, Kraken, psychologist-app…)
|
||||
- Какие файлы принадлежат каждому кластеру
|
||||
- Hub-note каждого кластера
|
||||
|
||||
**Enrichment воркер читает карту первым делом**. Если находит новый кластер → добавляет в карту. Карта самодополняется.
|
||||
|
||||
### Karpathy LLM Wiki — что это и что нет
|
||||
- **Да:** `wiki/` для накопления research о технике, workflows, инфраструктуре, AI tools
|
||||
- **Нет:** личные списки (дела, фильмы, покупки)
|
||||
- **Да:** crystallization — research сессии → wiki pages
|
||||
- **Нет:** операционные логи, разовые фиксы
|
||||
|
||||
### Overflow: когда заметка идёт в wiki
|
||||
- Знание **painful to re-derive** (без wiki — 15 мин + 10 web-запросов повторно)
|
||||
- Фит с доменом wiki (tech, workflows, infra, AI tools)
|
||||
- Содержит факты, а не разговор
|
||||
|
||||
## Статус проектов (2026-05-16)
|
||||
|
||||
| Проект | Статус |
|
||||
|--------|--------|
|
||||
| Vault Enrichment | 🟡 В процессе (enrichment cron воскресенье 03:00) |
|
||||
| LLM Wiki Accumulation | ✅ Готов (crystallization + synthesize + inbox) |
|
||||
| Proactive Research | ✅ Готов (research-queue.md + cron суббота 05:00) |
|
||||
| Cross-domain Enrichment | ✅ Готов (vault-cross-enrichment cron воскресенье 04:00) |
|
||||
|
||||
## Связанные страницы
|
||||
|
||||
- [[vault-filling-guide]] — что куда в vault
|
||||
- [[wiki-ingest-process]] — как wiki-curation работает
|
||||
- [[personal-os-architecture]] — полная картина системы
|
||||
- [[concepts/agent-memory-architecture]] — память агента (семантический уровень)
|
||||
- [[concepts/knowledge-lifecycle]] — как знания кристаллизируются из сессий в wiki
|
||||
- [[tech/vault-namespace]] — правила namespace: work/personal/family
|
||||
@@ -1,143 +0,0 @@
|
||||
---
|
||||
title: Watchlist Automation — Полный Flow
|
||||
namespace: personal
|
||||
created: '2026-05-20'
|
||||
updated: '2026-05-22'
|
||||
last_synced: '2026-05-22'
|
||||
type: concept
|
||||
tags:
|
||||
- kraken
|
||||
- watchlist
|
||||
- automation
|
||||
- synthesis
|
||||
confidence: 0.9
|
||||
---
|
||||
# Watchlist Automation — Полный Flow
|
||||
|
||||
Синтез: как `family/documents/movies-watchlist.md` превращается в скачанный контент. Объединяет [[tech/arr-stack-kraken]], [[concepts/kraken-media-stack]], [[tech/hermes-docker-kraken]].
|
||||
|
||||
## Полная цепочка
|
||||
|
||||
```
|
||||
[вс 09:00] watchlist-discover ← KP API топ фильмов 2024-2025
|
||||
↓ добавляет в секцию "Новинки 👍/👎"
|
||||
movies-watchlist.md
|
||||
Alex ставит 👍 / 👎
|
||||
↓
|
||||
[ежедн 09:00] watchlist-resolve ← SSH Кракен → resolve → commit
|
||||
[ежедн 10:00] watchlist-sync-down
|
||||
→ process-thumbs (перемещает 👍 → начало списка)
|
||||
→ sync-down (добавляет батч в Radarr/Sonarr)
|
||||
↓
|
||||
Radarr (7878) / Sonarr (8989)
|
||||
→ Prowlarr (9696) → RuTracker / Kinozal(M) / NoNaMe / etc.
|
||||
→ Transmission (9091)
|
||||
→ /media/movies-radarr или /media/series-sonarr
|
||||
↓
|
||||
router.py (Custom Script) → читает жанры из NFO/TMDb
|
||||
→ symlink в /media/{movies,cartoons,documentaries,...}/
|
||||
↓
|
||||
Jellyfin (8096) → rescan → виден контент
|
||||
```
|
||||
|
||||
## Статусы в movies-watchlist.md
|
||||
|
||||
| Символ | Значение | Действие |
|
||||
|--------|---------|---------|
|
||||
| `[ ]` | не смотрел, в очереди | sync-down добавляет в Radarr/Sonarr |
|
||||
| `[x]` | просмотрено | sync-up из Jellyfin watched history |
|
||||
| `⬇️` | добавлено в Radarr/Sonarr | ждёт скачки |
|
||||
| `👍` | нравится (новинка) | process-thumbs переносит в начало → попадёт в sync-down |
|
||||
| `👎` | не хочу (новинка) | process-thumbs перемещает в `## Новинки👎` |
|
||||
| `🗓️` | upcoming (ещё не вышел) | discover помечает, не скачивается |
|
||||
| `❓` | не найдено / ambiguous | ждёт ручного уточнения |
|
||||
| `🧟♀️` | horror (genre_id=27) | информационный маркер |
|
||||
|
||||
## Структура секций movies-watchlist.md
|
||||
|
||||
```
|
||||
## Новинки - 👍/👎 ← discover добавляет сюда
|
||||
## Фильмы ← основной список, отступ 2 пробела ( - [ ])
|
||||
## Мультфильмы
|
||||
## Аниме
|
||||
## Новинки👎 ← ← без пробела перед 👎
|
||||
## Связанные заметки
|
||||
```
|
||||
|
||||
**Важно:** `process_thumbs` автоматически определяет отступ из `## Фильмы` и сохраняет при переносе. `SECTION_THUMBDN = "## Новинки👎"` (без пробела) — должно точно совпадать с заголовком.
|
||||
|
||||
## Cron Jobs на Eagle
|
||||
|
||||
Два shell-script крона (не агентные — детерминированы):
|
||||
|
||||
| Job | ID | Расписание | Скрипт |
|
||||
|-----|-----|-----------|--------|
|
||||
| `watchlist-nightly` | `93619b22b330` | ежедн. 01:00 | `~/.hermes/scripts/watchlist-nightly.sh` |
|
||||
| `watchlist-discover` | `8f219dfe8f0f` | вс 09:00 | `~/.hermes/scripts/watchlist-discover.sh` |
|
||||
|
||||
**watchlist-nightly.sh** (Mac → Kraken → Mac):
|
||||
1. `sync-vault.sh` (pull Mac) → `process-thumbs --apply` → `sync-vault.sh` (push Mac)
|
||||
2. SSH Kraken: `sync-vault.sh` (pull) → `resolve --recheck --apply` → `sync-down --apply --batch 5` → `sync-up --apply` → `sync-vault.sh` (push)
|
||||
|
||||
## Discover — Фильтрация
|
||||
|
||||
| Тип | Порог |
|
||||
|-----|-------|
|
||||
| Мировые | IMDb ≥ 7.0 или KP ≥ 7.0 |
|
||||
| Российские | KP ≥ 8.5 (защита от накрутки) |
|
||||
| Upcoming | год ≥ текущий−1 |
|
||||
| Минимум голосов | IMDb ≥ 1000 или KP ≥ 500 |
|
||||
|
||||
KP API endpoint: `https://api.poiskkino.dev/v1.4/movie` (redirect с api.kinopoisk.dev).
|
||||
|
||||
## *arr Stack — Индексеры (Prowlarr)
|
||||
|
||||
| ID | Имя | Тип | Примечание |
|
||||
|----|-----|-----|-----------|
|
||||
| 1 | RuTracker | semi-private | блокирует при rate limit на сутки |
|
||||
| 2 | RuTor | public | поиск по imdbid |
|
||||
| 3 | Byrutor | public | |
|
||||
| 4 | NoNaMe Club | semi-private | анонимный |
|
||||
| 5 | Kinozal | semi-private | резерв |
|
||||
| 6 | Kinozal (M) | semi-private | магнет ✅ — без grab limit, **предпочтительный** |
|
||||
|
||||
**Pi-hole pitfall:** блокирует `skyhook.sonarr.tv` → Sonarr/Radarr поиск молча не запускается. Фикс: `dns: [8.8.8.8]` в docker-compose.yml.
|
||||
|
||||
## Router Script — Маршрутизация по жанру
|
||||
|
||||
После импорта Sonarr/Radarr: `router.py --apply` создаёт symlinks:
|
||||
- Animation (не R/18+) → `/media/cartoons/` или `/media/cartoons-series/`
|
||||
- Documentary → `/media/documentaries/` или `/media/documentaries-series/`
|
||||
- Прочее → `/media/movies/` или `/media/series/`
|
||||
|
||||
Kopirует NFO + постер рядом с symlink (Jellyfin не видит метадату через symlink напрямую).
|
||||
|
||||
## Open Tasks (2026-05-20)
|
||||
|
||||
- 🟡 Передавать Transmission locations через router script при каждом импорте (сейчас вручную)
|
||||
- 🔴 rsync невыполненных фильмов с HTPC на Кракен (`Фильмы не перенесенные с htpc на кракен.md`)
|
||||
- 🟡 Watchlist sync-up: добавить перенесённые фильмы в нужные разделы
|
||||
|
||||
## watchlist-sync — Python CLI
|
||||
|
||||
Репо: `~/Developer/watchlist-sync` (GitHub: `mallexxx/watchlist-sync`).
|
||||
|
||||
```
|
||||
watchlist-sync resolve — TMDB + KP API → ID, тип (movie/tv)
|
||||
watchlist-sync sync-down — добавить батч (max 5) в Radarr/Sonarr, поставить ⬇️
|
||||
watchlist-sync sync-up — Jellyfin watched → [x] в .md
|
||||
```
|
||||
|
||||
**Резолвер:** TMDB `/search/multi` + KP fallback. Пороги: `min_rating: 6.0`, `min_score: 0.75`. При 2+ кандидатах → `❓` (LLM разрешает в cron каждые 6ч, нерешённые → уточнение в Zulip).
|
||||
|
||||
**Stage 2 (после ≥50 просмотров):** AI-curated recommendations — три списка (с женой / один / семья) на основе TMDB профиля, добавляются в конец watchlist как `## 🤖 Рекомендации (YYYY-WNN)`.
|
||||
|
||||
Jellyfin library mapping: Movies → `movies`, Cartoons → `mixed` (movies + episodes).
|
||||
|
||||
## See Also
|
||||
|
||||
- [[tech/arr-stack-kraken]] — детальные питфоллы *arr стека
|
||||
- [[tech/arr-stack-taiga]] — *arr stack на Тайге (аналогичная архитектура)
|
||||
- [[concepts/kraken-media-stack]] — полная архитектура медиасервера
|
||||
- [[tech/hermes-docker-kraken]] — Hermes на Кракене
|
||||
- [[tech/jellyfin-transcode-rpi5]] — Jellyfin PGS/ASS питфоллы
|
||||
Reference in New Issue
Block a user