diff --git a/personal/index.md b/personal/index.md index b588984f..c05b7c5e 100755 --- a/personal/index.md +++ b/personal/index.md @@ -37,6 +37,7 @@ tags: Hub: [[personal/projects/personal-os/personal-os-status-2026-10|Personal OS — статус (окт 2026)]] +- [[personal/plans/personal-os-v2-plan|План v2]] — перезапуск (iPad Desk, AW++, PR, фокус, Swift) - [[personal/projects/personal-os/personal-os-failed-approaches|Несработавшие подходы]] — сводка уроков - [[personal/projects/personal-os/personal-os-architecture|Architecture (историческая)]] diff --git a/personal/plans/personal-os-v2-plan.md b/personal/plans/personal-os-v2-plan.md new file mode 100644 index 00000000..8cb18dcf --- /dev/null +++ b/personal/plans/personal-os-v2-plan.md @@ -0,0 +1,183 @@ +--- +title: Personal OS v2 — план перезапуска +tags: + - personal-os + - plan + - v2 +created: '2026-10-03' +updated: '2026-10-03' +status: draft +--- +# Personal OS v2 — план перезапуска + +> Черновик 2026-10-03. Вход: [[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. diff --git a/personal/projects/personal-os/personal-os-status-2026-10.md b/personal/projects/personal-os/personal-os-status-2026-10.md index 97d67077..c47a6147 100755 --- a/personal/projects/personal-os/personal-os-status-2026-10.md +++ b/personal/projects/personal-os/personal-os-status-2026-10.md @@ -46,6 +46,9 @@ confidence: 1 ## Что нужно для перезапуска (вход в перепланирование) +> 📋 **План v2:** [[personal/plans/personal-os-v2-plan]] — iPad Desk, иконки задач, ActivityWatch++, +> PR-трекинг, фокус/ретро, переезд на Swift, постоянные AI-ревью; MVP ≈ 1 неделя. + 1. Пересобрать цели: какие из исходных болей (комментарии без ответа, приоритеты дня, Asana vs реальность, карьерные сигналы) актуальны сейчас — см. [[personal/projects/personal-os/personal-os-purpose]]. 2. Учесть уроки — [[personal/projects/personal-os/personal-os-failed-approaches]].