--- title: Personal OS v2 — план перезапуска tags: - personal-os - plan - v2 created: '2026-10-03' updated: '2026-10-04' status: draft --- # Personal OS v2 — план перезапуска > **Текущий план R2:** [[personal/projects/personal-os/personal-os-system-review-index]]. Целевая архитектура и порядок реализации ниже заменены R2; исторические решения и описание прототипа сохранены для происхождения требований. > Исторический черновик: предложение полного Swift-порта и расписаний ниже не утверждено как текущая реализация. Сопоставление с работающим Node-контуром и решение на ревью: [[personal/projects/personal-os/personal-os-system-review-index]]. > Исторический черновик 2026-10-03: заменён утверждённым [[personal/plans/personal-os-operating-plan-2026-10-03]]. iPad-идея здесь описывает старый тестовый проект, не новое приложение, создание которого запущено через Balda 4 октября. Текущий статус: [[personal/projects/personal-os/personal-os-status-2026-10]]. > > Исходный вход: [[personal/projects/personal-os/personal-os-status-2026-10]] · > уроки: [[personal/projects/personal-os/personal-os-failed-approaches]]. > Пометка **⚠️ проверить** = моё допущение, не подтверждено фактом. ## 0. Цель и рамки Быстро вернуть работающий контур «что происходит / что дальше / как я на самом деле работаю», **без автономных действий**. v2 = наблюдение + отображение + ревью. Никакого Executor, пока не закрыты контроли из [[personal/projects/personal-os/executor-security-analysis]]. Состав v2: 1. Data-слой: Asana + GitHub + ActivityWatch → локальная БД (как было, read-only). 2. **Desk** — дашборд на старом iPad (iOS 9.3.5). 3. Иконки для задач Asana (уникальные, ночная генерация). 4. ActivityWatch++: точная привязка активности к worktree → задаче Asana / личному проекту. 5. Трекинг GitHub PR. 6. Трекинг фокуса + Ретроспектор. 7. Переезд с Node.js на натив. 8. Постоянные AI-сессии ревью (что работает, что нет). ## 1. Guidelines (обязательны для всех компонентов) 1. **Read-only во внешние системы.** Asana/GitHub — только GET. Обёртка API в коде разрешает только чтение (Asana PAT не скоупится на read-only — ⚠️ проверить, значит контроль в коде). 2. **Рабочие данные не покидают Mac/LAN.** Никаких чатов/облачных сервисов как транспорта для данных задач. iPad получает данные только по LAN. 3. **Redaction до любой модели и до iPad:** стоп-слова SILO, ACP, attorney-client, PIP, termination, M&A, audit, performance, compensation → задача показывается как «🔒 скрыто», в LLM не уходит. 4. **Защита фокуса:** дашборд пассивный — без звуков, без всплывающих алертов во время focus-блока. 5. **Человек решает:** AI-сессии пишут только в Obsidian (отчёты/предложения), ничего не применяют сами. 6. **Детерминизм по умолчанию, LLM — для суждений** (классификация, выбор иконки, ревью). 7. **Один статус-документ** обновляется при каждом повороте. ## 2. Целевая архитектура ``` Asana API (GET) ─┐ GitHub (gh/GraphQL, GET) ─┤ ActivityWatch + новые watchers ─┼─► posd (macOS daemon, launchd) ─► PostgreSQL (как сейчас) Claude/Codex session logs ─┤ │ reducer + redaction Calendar (EventKit, позже) ─┘ ├─► dashboard.json + icons/*.png ─► HTTP (LAN) ─► iPad Desk ├─► status.md / Obsidian daily note └─► AI-сессии (claude -p, read-only) ─► Obsidian reviews/ ``` - БД остаётся **PostgreSQL** — схема и данные уже есть, менять незачем. ## 3. Desk — дашборд на iPad (iOS 9.3.5) Лёгкое приложение, следует guidelines §1: пассивный экран, только чтение, данные по LAN, redaction на стороне Mac. ### Экран (4 зоны из исходного Desk-дизайна + PR) 1. **Сейчас** — текущий проект/задача (из AW) vs план дня; таймер focus-блока. 2. **Сегодня** — 3–7 задач дня с иконками, статус, дедлайны. 3. **Ждут меня** — комментарии без ответа, review requests, CI failures моих PR. 4. **День** — полоса времени по проектам, focus-score, переключения. Тап по задаче = только просмотр деталей (без действий во внешних системах). ## 4. Иконки для задач Asana **Задача:** у каждой активной задачи — узнаваемая иконка, **уникальная среди видимых на дашборде**, стабильная во времени (не меняется, пока задача жива). Пайплайн (ночная задача планера дня): 1. Новые/изменённые активные задачи → LLM извлекает 3–5 концептов (на redacted-тексте). 2. Поиск по каталогу иконок (keyword + embedding по тегам/категориям). 3. Выбор первой иконки, **не занятой** другой видимой задачей; в рамках проекта — общий цветовой акцент. 4. Нет подходящей → генерация (LLM → SVG по стилю набора, 24×24 stroke) → валидация (рендер, размер, контраст) → в библиотеку как переиспользуемую. 5. Рендер SVG → PNG @1x/@2x на Mac; кэш по `task_gid` в Postgres (`task_icons`: gid, icon_id, source, created_at). **Каталоги — исследовать (не проверено, web в этой сессии не использовался):** - [ ] **Lucide** — metadata JSON на иконку (tags, categories); лицензия ISC — основной кандидат. - [ ] **Grida icons** — заявлен как icons database — проверить формат метаданных и лицензии. - [ ] **NeedIcons** — проверить, что это и есть ли API/датасет. - [ ] **Damask** — проверить, что это (набор/генератор?). - Критерии: машиночитаемые теги, SVG, единый стиль, лицензия для личного использования, размер каталога. ## 5. ActivityWatch++ — привязка активности к задачам **Сейчас есть:** aw-watcher-ddg (URL), aw-watcher-xcode (worktree), aw-watcher-vscode (Cursor: файл/проект), window. **Добавить:** | Источник | Как получить worktree | ⚠️ | |---|---|---| | **Claude Code CLI / Claude desktop (Code-сессии)** | транскрипты `~/.claude/projects//*.jsonl` — `cwd`, `gitBranch` у сообщений; активность = mtime + последние записи | проверить поля | | **Codex CLI/desktop** | `~/.codex/sessions/**/rollout-*.jsonl` — `cwd` в session meta | проверить формат | | **Claude desktop (чат/Cowork)** | только заголовок окна + проект Cowork-сессии; нет cwd → AI-классификация | | | **VS Code / Cursor** | файл из aw-watcher-vscode → `git rev-parse --show-toplevel` + ветка | | | **Terminal** | zsh `precmd` hook → heartbeat в AW-бакет (`cwd`, branch) | | | **Браузер** | URL GitHub PR → ветка; URL Asana → GID напрямую | | **Цепочка привязки (детерминированно → AI):** 1. GID в имени ветки (`fix-1234567890-...`, executor-конвенция). 2. Ссылка на Asana в теле PR этой ветки. 3. Ручное правило (`aw-projects.json` / таблица `bindings`). 4. **AI-классификатор** (фоллбек): окно активности + коммиты + заголовки → кандидаты из активных задач Asana **или личных проектов** (список из Obsidian `personal/projects/`) с confidence. < порога → «не привязано», вопрос в вечернем ревью; подтверждение → правило (не спрашивать дважды). ## 6. Трекинг GitHub PR База уже есть: `gh-snapshot.js` (мои PR + CI через `statusCheckRollup`, review requests через notifications). Доработать: - [ ] Мои открытые PR: draft/ready, CI (какой job упал + ссылка), **неразрешённые review threads** (GraphQL `reviewThreads.isResolved`), возраст, ждёт ли меня ответ. - [ ] **Для меня на ревью:** `search: is:open review-requested:@me` (надёжнее notifications) + возраст запроса. - [ ] Связь PR ↔ задача Asana (§5) → в «Ждут меня» и в дневной картине. - [ ] Метрики для ретро: cycle time PR, время до первого ответа на review, число CI-перезапусков. ## 7. Фокус и Ретроспектор **Фокус (детерминированно из AW):** - focus-блок = непрерывная работа над одним проектом ≥ 25 мин, переключения < N, AFK < 3 мин. - метрики дня: deep-work минуты, число блоков, переключения/час, фрагментация, доля «план vs факт». - источники прерываний: открытия чатов/Asana/почты во время блока. - Отображение: пассивно на iPad. **Никаких интервенций** во время блока (урок ADHD-профиля); подсказки — только в паузах/вечером. **Ретроспектор (еженедельно, AI-сессия, §9):** - план недели vs факт по проектам; переносы задач; latency ответов на комментарии; PR cycle time; тренды фокуса; повторяющиеся коррекции. - Формат: факты с цифрами → 3 паттерна → **один вопрос-решение**. Пишет в Obsidian. ## 8. Переезд с Node.js на натив **Рекомендация: Swift** (SwiftPM, `posd` как launchd-демон). - Нужны macOS-API: AX (URL браузера), NSWorkspace, EventKit (календарь) — нативно в Swift. - aw-watcher-ddg уже на Swift; watchers можно влить в один процесс. - Общие модели с iPad-клиентом. - Альтернатива **Go** (как Balda: один бинарь, проще сервер) — хуже по macOS-API. Python — только для прототипов. **Стратегия «strangler», не big-bang** (иначе «кратчайшие сроки» не выполнимы): 1. Запускаем v2 на **существующем Node-пайплайне** (работал стабильно). 2. Swift-модули пишутся по одному и идут в **shadow-режиме** (тот же вход → сравнение выхода с Node). 3. Порядок: HTTP/dashboard-сервер → AW-агрегатор + watchers → GitHub → Asana sync → отключение Node. ## 9. Постоянные AI-сессии (ревью, паттерны, что работает) Запуск: launchd + `claude -p` (подписка, официальный путь, без прокси) или scheduled tasks; **без сетевых инструментов записи**, вход — redacted-снимки из БД/файлов, выход — заметки в Obsidian. | Сессия | Когда | Что делает | Выход | |---|---|---|---| | **Утро / планер дня** | 07:30 будни | план дня из Asana + PR + вчерашнего факта; **генерация иконок** (§4) | `dashboard.json`, daily note | | **Вечернее ревью** | 18:30 будни | план vs факт, непривязанная активность (вопросы), фокус | `work/reviews/YYYY-MM-DD.md` | | **Ретроспектор** | Пт 17:30 | недельные паттерны (§7) | `work/reviews/week-YYYY-WW.md` | | **Мета-ревью системы** | раз в 2 недели | здоровье пайплайна (падения, задержки), какие сигналы я реально использовал/игнорировал, ложные срабатывания; гипотеза → метрика → вердикт | `personal/projects/personal-os/experiments.md` + предложения изменений (не применяются сами) | Health-check: каждый запуск пишет heartbeat в БД; дашборд показывает «данные устарели», если > 2 ч. ## 10. Кратчайший путь к работающей системе | Шаг | Срок | Готово, когда | |---|---|---| | **S0. Data-слой оживить** — sync.js + generate-status.js через launchd (не Hermes), read-only, проверить status.md | 1 день | свежий status.md каждые 30 мин в рабочие часы | | **S1. `dashboard.json` + мини HTTP-сервер** (сначала любой: Node/Python, потом Swift) | 1 день | JSON отдаётся по LAN, redaction применён | | **S2. iPad-приложение: каркас** | 1–2 дня | приложение запускается на iPad и тянет `dashboard.json` | | **S3. Desk MVP** — 4 зоны, polling, иконки = детерминированный матч по Lucide-тегам | 3 дня | дашборд живёт весь день без ручных действий | | **S4. PR-трекинг** (§6) + «Ждут меня» | 2 дня | review requests / CI failures видны на iPad | | **S5. AW++** (Claude/Codex/terminal watchers, цепочка привязки шаги 1–3) | 3–4 дня | ≥ 80% рабочего времени привязано к задаче/проекту | | **S6. Вечернее ревью + Ретроспектор** (§9) | 2 дня | две недели отчётов в Obsidian | | **S7. Иконки v2** (уникальность, генерация, ночной прогон) + AI-классификатор (§5 шаг 4) | 1 нед | новые задачи утром уже с иконками | | **S8. Swift-порт в shadow** (§8) | параллельно, 3–4 нед | Node выключен | | **S9. Мета-ревью** каждые 2 недели | постоянно | решения о том, что выкинуть/усилить | MVP (S0–S3) ≈ **1 неделя**. ## 11. Открытые решения - [ ] Swift vs Go для `posd` (рекомендация — Swift). - [ ] Где хостить AI-сессии: launchd `claude -p` vs Balda (Balda пока NO-GO → старт с launchd). - [ ] Calendar-источник для режима MEETING (EventKit локально?). - [ ] Иконки: результаты проверки Lucide/Grida/NeedIcons/Damask.