Files

17 KiB
Executable File
Raw Permalink Blame History

title, tags, created, updated, status
title tags created updated status
Personal OS v2 — план перезапуска
personal-os
plan
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:

  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.