35 KiB
Executable File
namespace, tags, date, status, mission
| namespace | tags | date | status | mission | ||||
|---|---|---|---|---|---|---|---|---|
| personal |
|
2026-10-03 | proposed-for-approval | personal/projects/personal-os/personal-os-purpose |
Personal OS — аудит и план запуска вокруг фокуса
Решение, которое предлагается согласовать: сначала запустить контур управления самочувствием, фокусом и посильной нагрузкой Алекса. Asana, GitHub, ActivityWatch, встречи, Zoom и агенты дают этому контуру данные и возможности. Кодинговые агенты — второй контур, ограниченный человеческим временем ревью и токенами. Этот документ заменяет прежнюю версию плана от 2026-10-03, где на первое место ошибочно поставлена техническая надёжность feed.
Выполнение: этот документ описывает правки, но не включает автозапуск, старый Executor или запись в Asana/GitHub. Миссия: personal/projects/personal-os/personal-os-purpose. Состояние до этого аудита: personal/projects/personal-os/personal-os-status-2026-10.
1. Системная задача и критерий пользы
В каждый момент система поддерживает состояние: мой текущий фокус, энергия/настроение (если я их указал), нагрузка и граница рабочего дня, реальные обязательства, ближайшие встречи, накопившиеся изменения, цена переключения, очередь ревью агентной работы и бюджет агентов. На основе этого она предлагает выполнимый фокус дня, защищает его, помогает вернуться после встречи/перерыва, пересобирает план при изменениях и сохраняет карьерные факты с доказательствами. Пользователь может в один шаг сменить фокус, снизить нагрузку или отложить предложение.
Приоритеты строго такие: (1) хорошо себя чувствовать, (2) эффективно распределять нагрузку и фокус, (3) сохранять баланс жизни/работы, (4) выполнять и улучшать рабочие и карьерные результаты. Больший объём работы не компенсирует ухудшение первых трёх целей. ActivityWatch — наблюдение за поведением компьютера, не датчик самочувствия и не оценка продуктивности человека.
Целевой цикл
- Наблюдение: локальные источники сообщают о фактической работе, обязанностях, встречах и агентных результатах с временем/достоверностью.
- Оценка ёмкости дня: система вычитает встречи, перерывы, переключения, завершение рабочего дня и ожидаемое ревью агентов; учитывает добровольную отметку энергии/настроения.
- Выбор фокуса: предлагает одну основную работу и ограниченное число обязательств, объясняет перенос остальных; карьерные дела не исчезают за срочным шумом.
- Защита и восстановление: в фокусе обычные изменения копятся молча, при естественном переходе приходит короткая карточка «где остановился → что изменилось → что дальше». Критическое исключение имеет явное правило и ссылку.
- Обратная связь: Алекс одним действием отмечает полезность/ошибку/перегрузку или меняет план; система измеряет последствия и корректирует правила. Агенты развивают систему только в пределах бюджета внимания и токенов.
2. Что действительно есть 2026-10-03
| Слой | Проверенный факт | Граница факта |
|---|---|---|
| Asana | sync.js читает задачи/комментарии в локальную PostgreSQL; разовый прогон 3 октября дал свежие данные. generate-status.js создал ~/context/status.md (402 строки), пробный generate-attention.js — 28-строчный список. |
Фоновый com.personalos.readonly после остановки не загружен; разовый прогон не означает работающую Personal OS. Список не учитывает энергию, встречи, перерывы и контекст возврата. |
| ActivityWatch | Локальный aw-server слушает 127.0.0.1:5600. 3 октября в 14:13 UTC у bucket window и afk были свежие записи. aw-query.js считает активное время, приложения, проекты, сессии и worktrees. |
Xcode bucket обновлён последний раз 1 октября, Cursor — 2 октября, DDG URL — 8 июня. Эти дополнительные привязки нельзя считать текущими без проверки причин. currentFocus берёт первый bucket по приоритету xcode→vscode→ddg→window за 20 минут, а не фактически переднее окно; status.md в последнем снимке написал Now: loginwindow (18m ago). |
| GitHub и связь с работой | gh-snapshot.js получает мои PR/CI и некоторые review requests; aw-projects.json умеет сопоставлять отдельные worktree/URL с проектом. |
Связь worktree ↔ ветка ↔ PR ↔ Asana task и Codex/Claude sessions не собрана в единую историю дня. Review requests зависят от unread notifications. |
| Встречи/Zoom | В старых промптах есть расписание и попытка MS365-проверки; записи бесед Zoom существуют по сообщению Алекса. | Подтверждённого текущего календарного канала и импорта этих записей в рабочий/карьерный профиль нет. Папка ~/Documents/Zoom не указывает место всех записей. |
| Агенты | Старый Executor и Hermes-briefs выключены после инцидента. В executor_worker_runner.py задано max_turns=200, а executor-runner.sh допускает двух workers. |
В видимом runner нет учёта токенов/денег и оценки минут ревью Алекса. Логи одного задания содержат повторные respawn без прогресса. Balda/Broker/Virfield развиваются отдельно; их приёмка не пройдена как условие для P0. |
| Карьера и день | generate-status.js показывает Advisor opportunities и visibility gaps; activity_daily хранит агрегаты времени по проектам. |
Нет единого проверенного дневного состояния с балансом, энергией, встречами, ревью агентов и доказательствами вклада; карьерные сигналы оказываются внизу большого статуса. |
3. Почему старая версия не стала полезной
Алекс сообщил, что быстро перестал читать сгенерированные daily statuses. Точную причинную долю каждого фактора телеметрия не измеряла; ниже — подтверждённые дефекты дизайна и вывод о вероятном эффекте.
| Что было | Подтверждение | Почему это мешало | Что меняем в парадигме |
|---|---|---|---|
| Daily brief = большой отчёт. | В briefs/daily/ 32 сохранившихся файла: медиана 115,5 строк, 30 из 32 длиннее 80; 2026-05-15.md — 110 строк, с повторными просрочками и исторической trivia. daily-brief.md предписывает trivia и все разделы. |
Высокая цена чтения в начале дня; сигналов больше, чем решений. Формат не был подстроен под то, открыл ли Алекс предыдущий выпуск. | Живое состояние и короткая карточка в нужный момент; подробности по запросу. Публикация не считается успехом без полезности для Алекса. |
| План дня строился от Asana-очереди и фиксированных правил. | daily-brief.md требует первым «1 Must» или самую лёгкую задачу, затем overdue/urgent; в нём нет запроса энергии и расчёта ёмкости дня. |
Предлагаемый объём мог превышать доступное после встреч и перерывов; «первое лёгкое дело» могло вытеснять лучший фокус. | Сначала вместимость, энергия и фокус, затем выбор посильной работы. Перегрузка приводит к явному переносу. |
| Система не знала реальный момент для вмешательства. | inbox-triage.md проверяет Now из 30-минутного status; aw-query.js может выбрать старое Xcode событие или loginwindow как текущий фокус. |
Даже верный сигнал мог появиться во время deep work или пропасть из-за ошибочной оценки фокуса. | Временная модель focused / meeting / break / available / unknown, с отдельной свежестью источников и ручным override. |
| Генерация не замыкала обратную связь. | heartbeat.sh проверяет существование файла brief, а не открытие, действие, отложение или неверность; в schema.sql нет принятия/полезности карточки. |
Система не замечала, что документы перестали помогать, и продолжала производить их по графику. | Измерять добровольное использование и коррекции; прекращать неиспользуемые формы. |
| Автономия агентов создавала долг ревью и расход без ограничителя. | История инцидента в personal/projects/personal-os/executor-security-analysis; max_turns=200, MAX_WORKERS=2, нет ledger токенов; в executor/logs/1214071796247142/ есть многократные conflict_no_action respawns. |
Агентный throughput мог расти быстрее, чем Алекс способен проверять; повторы сжигали токены и внимание. | Планировать агентную работу как нагрузку на человека и бюджет; admission control, WIP, stop rules, пакетное ревью. |
4. Очерёдность правок — было → станет → проверка
P0.1. Вернуть достоверное «что происходит сейчас» без модели и без новых уведомлений
Было: aw-query.js называет текущим первый недавний Xcode/Cursor/DDG bucket даже при другом переднем приложении; loginwindow попадает в Now; дополнительные watchers частично устарели. Сводка говорит «сколько минут», но не связывает фокус с достоверностью наблюдения.
Станет: переднее aw-watcher-window + AFK определяют focused / meeting / break / available / unknown; Xcode/Cursor/DDG только уточняют совпадающий во времени передний app. У каждой привязки есть время наблюдения, источник и confidence; старые данные не превращаются в «сейчас». Нет ActivityWatch или свежего window bucket → unknown, без автоматического вывода о готовности к работе.
Правки: aw-query.js — исправить currentFocus, окна перекрытия, фильтр lock/AFK и freshness; aw-projects.json — привести правила к реально активным worktrees; generate-status.js — показывать качество наблюдения. Добавить небольшие fixture-тесты для Xcode→браузер, заблокированного экрана, устаревшего bucket и break.
Приёмка: в 4 заданных сценариях состояние совпадает с frontmost app и AFK; locked/старые события дают unknown или break, никогда «активно в Xcode». Никаких новых прерываний на этом этапе.
P0.2. Собрать рабочий контекст и посильную ёмкость дня
Было: Asana, PR, worktree, активное время и встречи лежат в отдельных снимках; день = список urgent/overdue без энергии, перерывов, стоимости переключений и ревью агентной работы. Calendar/Zoom не подтверждены как надёжные каналы.
Станет: локальное day_state содержит: выбранный Алексом фокус, добровольную энергию/настроение (например 1–5 или «не знаю»), границу рабочего дня, встречи с источником/уверенностью, доступные окна, перерывы, обязательства, карьерные дела, ожидаемые минуты ревью и явно отложенные пункты. work_context связывает AW block → worktree/ветку → PR → Asana task только по детерминированному ID/ссылке или подтверждённому правилу; для неясных случаев — unlinked. Время Codex/Claude помечается как работа агента, а не активность Алекса.
Правки: новая миграция migrations/003_focus_core.sql (day_state, activity_bindings, focus_blocks, feedback); новый context-links.js связывает worktree/ветку с PR и Asana по идентификаторам/ссылкам; новый session-observer.js читает только метаданные фактических Codex/Claude sessions (возможные пути ~/.codex/sessions/**/rollout-*.jsonl и ~/.claude/projects/<cwd>/*.jsonl сначала проверить на этой машине): cwd, ветка, время, роль human/agent, usage при наличии — без текста бесед. aw-query.js отдаёт интервалы и freshness; gh-snapshot.js отдаёт текущие review obligations; sync.js и GitHub snapshot отмечают fetched_at/ok/stale/failed, чтобы сбой не означал «нет работы»; новый day-coordinator.js считает ёмкость и причины выбора. Добавить минимальный локальный ввод focus-input.js: сменить фокус/энергию/конец работы/«сегодня легче», все поля кроме фокуса необязательны. Для встреч сначала проверить существующий календарный read-path; при отсутствии обозначать meeting_schedule_unknown, а не придумывать окна из Asana-задачи.
Правило выбора: рабочая ёмкость = время до границы работы − подтверждённые встречи − переходы − защищённые перерывы − резерв на непредвиденное − согласованное время человеческого ревью. Сложность предлагаемой задачи соотносится с явно указанной энергией; при unknown используется консервативный объём, а не вывод «полный ресурс». Если обязательств больше ёмкости, система показывает что переносится/делегируется и почему, вместо невыполнимого списка.
Приёмка: на fixture-дне с двумя встречами, низкой энергией, PR-review и тремя Asana-задачами план не превышает доступные окна, включает перерыв и reviewer slot, объясняет один перенос. На fixture-дне без календаря не выдаёт уверенное время встречи. Личное время не считается рабочим резервом.
P0.3. Управлять моментом и формой обращения к Алексу
Было: scripts/heartbeat.sh выпускал daily brief по часам и inbox каждые 30 минут; daily-brief.md требует длинный фиксированный формат. Пробный attention.md короче, но всё ещё список событий без плана нагрузки и состояния фокуса.
Станет: один короткий focus_state с текущим фокусом, доступной ёмкостью, не более трёх ближайших осмысленных действий, одной причиной сменить приоритет, временем следующего перехода/перерыва, reviewer load и ссылками. Подробный контекст открывается по желанию. Во время focus/meeting обычные изменения остаются в локальной очереди; после перехода — одна карточка восстановления. Критическое прерывание требует подтверждённого владельца, последствий ожидания и указанного deadline; возраст комментария или красная иконка недостаточны. Старое «3 часа» из миссии — кандидат на калибровку, не автоматическое правило для всех задач.
Правки: новый focus-policy.js (классы состояний, quiet hours, исключения); day-coordinator.js (динамический выбор после перехода); generate-attention.js заменить секции «Ответить/Ревью/Текущая работа» на компактный объект focus_state + фоновые обязательства и связи с источниками; agent/prompts/daily-brief.md заменить обязательные trivia, overdue dump и «easiest first» правилом краткой карточки с capacity/reason; scripts/heartbeat.sh оставить старые brief jobs выключенными, позже вызвать только согласованный новый рендер. Выходы ~/context/focus.json и ~/context/focus.md атомарны; iPad позже читает тот же контракт в ограниченном виде.
Приёмка: обычный комментарий Asana во время 45-минутного Xcode-блока не создаёт прерывание; после блока доступна одна карточка с ссылкой, ответственной стороной и посильным следующим действием. После встречи видно, к какой работе вернуться без поиска по нескольким приложениям. После границы рабочего дня обычных рабочих сигналов нет.
P0.4. Замкнуть цикл на ощущении пользы, а не на числе сгенерированных файлов
Было: файл существует → job считает успех; невозможно узнать, пригодился ли план, был ли он слишком длинным, насколько посильным оказался день. Старые brief-форматы могли копиться, даже когда Алекс перестал их читать.
Станет: у карточки есть одношаговые ответы полезно / неверно / слишком много / отложить и необязательная оценка энергии/самочувствия 1–5. Система хранит correction с причиной и меняет следующий план: неверный сигнал удаляет ложное правило, «слишком много» уменьшает объём, пропуск карточки не порождает дополнительных напоминаний. Личные оценки остаются локальными и не становятся performance-метрикой.
Правки: migrations/003_focus_core.sql для focus_feedback; новый focus-feedback.js; agent/prompts/weekly-review.md заменить обзор backlog на оценку: самочувствие (если добровольно указано), восстановление контекста, защищённые focus/break blocks, пропущенные обязательства, reviewer load, ложные прерывания. Отчёт не чаще раза в неделю и с одним предложением изменения правила.
Приёмка 5 рабочих дней: каждый день можно открыть состояние за один экран; ноль обычных прерываний во время подтверждённых focus blocks, ноль рабочих push после установленной границы, ни одно критическое сообщение без ссылки/причины. Алекс может за ≤10 секунд отметить ошибку или перегрузку; его коррекция меняет следующий расчёт. Полезность и самочувствие проверяются его ответом, а не количеством активных минут. Если он снова не читает карточку, формат пересматривается, а не размножается.
P1. Допустить кодинговых агентов только через два бюджета
Было: MAX_WORKERS=2, max_turns=200, повторные respawn и подробные сообщения в чат; очередь ревью Алекса и токены не учитываются в плане дня.
Станет: перед запуском есть два независимых лимита: (A) человеческий — ожидаемые минуты ревью, уже ожидающие результаты, доступный reviewer slot с учётом энергии/фокуса; (B) агентный — токены/стоимость, время, число попыток и параллельность. Ledger хранит provider/model, input/output/cache tokens, оценку денег по фактическому тарифу, длительность, retries, прогноз и факт минут ревью. Агентная задача получает прогноз пользы и затрат; admission разрешён, только если оба остатка достаточны. На 80% дневного/недельного лимита новые coding jobs не стартуют, на 100% текущий job завершает безопасную точку и останавливается с артефактом/блокером. После двух попыток без нового проверяемого прогресса — stop без самоперезапуска. Готовый результат сверх reviewer capacity остаётся в очереди без уведомления Алекса.
Правки: migrations/004_agent_capacity.sql (agent_runs, agent_usage, review_queue, лимиты, прогноз/факт); новый agent-budget.js как admission/stop policy; agent/executor_worker_runner.py логирует usage из ResultMessage/провайдера и прерывает по budget, не выдаёт max_turns за успех; executor/executor-runner.sh в будущей замене/адаптере ограничивает WIP и запрещает бесконечный respawn; правила в agent/prompts/executor-*.md требуют одного проверяемого артефакта и оценки времени ревью, без полного trace в чат. Balda/Broker/Virfield остаются своим параллельным проектом; Personal OS пользуется их зрелым интерфейсом после приёмки.
Предлагаемые стартовые лимиты для пилота, не включены: одновременно 1 coding worker; 1 результат, ожидающий Алекса; до 20 минут ревью в рабочий день; максимум 1 автоматическая повторная попытка; 30 000 суммарных input+output токенов на задачу, 60 000 в день, 120 000 в неделю (cache tokens хранить отдельно для расчёта стоимости). После 3 измеренных задач пересчитать лимиты по реальной стоимости и времени ревью; стоимость в деньгах считать по фактическому провайдеру/плану, без выдуманной цены за токен. Если провайдер не отдаёт usage, пометить unmetered и не запускать следующий unattended loop. В день с низкой энергией reviewer slot можно обнулить без накопления срочных запросов.
Приёмка: два законченных агентных результата не вызывают два одновременных запроса к Алексу; второй ждёт свободного slot. Задача с повтором без diff/test progress останавливается; ledger показывает токены, время, оценку и факт человеческого ревью. Агентная работа не съедает защищённый focus block и не делает вечер новым рабочим временем.
Параллельно: Zoom и iPad, но по контракту P0
- Zoom: существующие записи найти через фактический источник учётной записи; импортировать одну прошлую встречу в
meeting_contextс участниками, решениями, обещаниями, сроками и ссылкой/фрагментом. Обязательства попадают в рабочий контекст, подтверждённый вклад — в карьерный; это влияет на план после встречи, а не создаёт ещё один длинный brief. Затем идемпотентный импорт новых. Новый адаптерzoom-import.jsи миграцияmeeting_context; метод доступа выбирается после проверки аккаунта, старую заметку personal/projects/personal-os/zoom-ai-transcript-export считать вариантами, не доказанным текущим доступом. Приёмка: одна существующая встреча даёт проверяемое обязательство и/или факт вклада со ссылкой, повторный импорт не создаёт дубль. - iPad Desk: установка на физический iPad уже подтверждена. Передать агенту ограниченное приложение «фокус сейчас / вместимость дня / когда вернуться / одно ожидание меня / свежесть», читающее
focus.jsonпо LAN с минимальными полями. iPad — пассивный интерфейс того же контура; не проект по повторной проверке установки. Приёмка: на iPad виден тот же focus state, после отключения сети ясно показана устаревшая версия; нет лишних алертов.
5. Последовательность, зависимости, участие Алекса
- Сейчас — утверждена миссия, план предложен. Уточнить только границы: желаемое окончание рабочего дня, начальные лимиты reviewer/tokens, допустимый канал короткой карточки. Предлагаемые настройки в P1 позволяют принять их одним решением; добровольная энергия/настроение не обязательны.
- P0.1 → P0.2: исправить достоверность текущего состояния и собрать ёмкость дня на локальных источниках. Проверить на сохранённых сценариях до включения schedule.
- P0.3 → P0.4: показать один короткий живой focus state, провести 5 рабочих дней измеряемого пилота с возможностью исправить перегрузку. Только после этого решать о регулярной доставке.
- P1 и параллельные ветки: включить ограниченный coding loop с учётом review/tokens; импортировать Zoom; отдать тот же focus state на iPad. Balda/Broker/Virfield не дублировать.
Необходимое участие Алекса в пилоте: одно согласование границ; затем по желанию один короткий сигнал «полезно/неверно/слишком много» и ручная смена энергии/фокуса, когда захочется. Система не требует ежедневного ведения журнала. Внешние записи и старый автономный Executor этим планом не разрешены.