Files
obsidian-vault/personal/plans/personal-os-v2-plan.md
T

191 lines
17 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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/<cwd>/*.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.