17 KiB
Executable File
title, tags, created, updated, status
| title | tags | created | updated | status | |||
|---|---|---|---|---|---|---|---|
| Personal OS v2 — план перезапуска |
|
2026-10-03 | 2026-10-04 | 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:
- Data-слой: Asana + GitHub + ActivityWatch → локальная БД (как было, read-only).
- Desk — дашборд на старом iPad (iOS 9.3.5).
- Иконки для задач Asana (уникальные, ночная генерация).
- ActivityWatch++: точная привязка активности к worktree → задаче Asana / личному проекту.
- Трекинг GitHub PR.
- Трекинг фокуса + Ретроспектор.
- Переезд с Node.js на натив.
- Постоянные AI-сессии ревью (что работает, что нет).
1. Guidelines (обязательны для всех компонентов)
- Read-only во внешние системы. Asana/GitHub — только GET. Обёртка API в коде разрешает только чтение (Asana PAT не скоупится на read-only — ⚠️ проверить, значит контроль в коде).
- Рабочие данные не покидают Mac/LAN. Никаких чатов/облачных сервисов как транспорта для данных задач. iPad получает данные только по LAN.
- Redaction до любой модели и до iPad: стоп-слова SILO, ACP, attorney-client, PIP, termination, M&A, audit, performance, compensation → задача показывается как «🔒 скрыто», в LLM не уходит.
- Защита фокуса: дашборд пассивный — без звуков, без всплывающих алертов во время focus-блока.
- Человек решает: AI-сессии пишут только в Obsidian (отчёты/предложения), ничего не применяют сами.
- Детерминизм по умолчанию, LLM — для суждений (классификация, выбор иконки, ревью).
- Один статус-документ обновляется при каждом повороте.
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)
- Сейчас — текущий проект/задача (из AW) vs план дня; таймер focus-блока.
- Сегодня — 3–7 задач дня с иконками, статус, дедлайны.
- Ждут меня — комментарии без ответа, review requests, CI failures моих PR.
- День — полоса времени по проектам, focus-score, переключения. Тап по задаче = только просмотр деталей (без действий во внешних системах).
4. Иконки для задач Asana
Задача: у каждой активной задачи — узнаваемая иконка, уникальная среди видимых на дашборде, стабильная во времени (не меняется, пока задача жива).
Пайплайн (ночная задача планера дня):
- Новые/изменённые активные задачи → LLM извлекает 3–5 концептов (на redacted-тексте).
- Поиск по каталогу иконок (keyword + embedding по тегам/категориям).
- Выбор первой иконки, не занятой другой видимой задачей; в рамках проекта — общий цветовой акцент.
- Нет подходящей → генерация (LLM → SVG по стилю набора, 24×24 stroke) → валидация (рендер, размер, контраст) → в библиотеку как переиспользуемую.
- Рендер 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):
- GID в имени ветки (
fix-1234567890-..., executor-конвенция). - Ссылка на Asana в теле PR этой ветки.
- Ручное правило (
aw-projects.json/ таблицаbindings). - 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 (иначе «кратчайшие сроки» не выполнимы):
- Запускаем v2 на существующем Node-пайплайне (работал стабильно).
- Swift-модули пишутся по одному и идут в shadow-режиме (тот же вход → сравнение выхода с Node).
- Порядок: 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 -pvs Balda (Balda пока NO-GO → старт с launchd). - Calendar-источник для режима MEETING (EventKit локально?).
- Иконки: результаты проверки Lucide/Grida/NeedIcons/Damask.