[2026-10-03] eagle: personal/index.md personal/plans/personal-os-v2-plan.md personal/projects/personal-os/personal-os-status-2026-10.md

This commit is contained in:
Alexey Martemyanov committed 2026-10-03 18:37:57 +06:00
1 parent d204037419
commit a323f50eea
3 files changed
+187

No files matched your search

+183
View File
@@ -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/<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.