<< All versions

Skill v1.0.0

currentAutomated scan100/100
shakhruz/mila-companion/mila-tasks
──Details
PublishedSeptember 28, 2026 at 05:27 AM
Content Hashsha256:1450dad20b0dd4ad...
Git SHA
──Files
Files (1 file, 8.0 KB)
SKILL.md8.0 KBactive
SKILL.md · 76 lines · 8.0 KB

version: "1.0.0" name: mila-tasks description: "Система обязательств агента: три сущности (ход/стройка · обещание человеку · развилка владельца), append-only леджер, закрытие только с уликой, исполненной машиной, порядок «следующая», прогноз времени и токенов, отчёт «Результат · Вопросы · План». Использовать в начале и в конце сессии, при любом поручении, обещании и перед любым «сделано»."


mila-tasks — УЛИКА

Когда: всегда, когда кто-то чего-то от нас ждёт. Работа без строки — её не было; строка без улики — не закрыта. Один скрипт, не движок: сам ничего не запускает, отправку не блокирует.

Три сущности, а не один список

СущностьЧтоЧасыЧем закрывается
обязательство M-… — ход (≤2 ч) / стройка (--kind build)работа с приёмкойdue, если естьdone --proof … — улику исполняет скрипт
обещание P-…«пришлю до вечера»due — чужие часы, абсолютное времяkeep --msg <chat>/<id> — доставленное сообщение
развилка A-…ждёт слова / доступа / рук владельцаdeadline + defaultdecide (владелец или дефолт по сроку)

Реплика задачей не становится; обещание в реплике заводится до отправки.

Где живёт

tasks/ledger.jsonl ← истина, append-only (строки не правятся и не удаляются)
tasks/OPEN.md ← генерируется; править через task.py
tasks/proof/ ← вывод исполненных улик
tasks/estimates.json ← стартовые оценки по видам, пока фактов < 3
tasks/sent.jsonl ← журнал исходящих (пишет PostToolUse-хук)
ops/task.py ← один скрипт, stdlib

Каталог переопределяется MILA_TASKS_DIR (тесты гоняются во временном).

Команды

task.py new --title … --check «чем проверяется» [--verify cmd] [--kind reply|doc|translate|build|research|fix|design|report]
[--src owner|client|self|director] [--who] [--chat id] [--anchor msg:chat/id] [--due «завтра 12:00»] [--bleed «74/сут»] [--paid]
task.py take M-0001 в работу (≤3 одновременно, одна стройка, один слот стройки в сутки)
task.py note M-0001 «…» касание; без note 24 ч → stalled, назад в очередь
task.py done M-0001 --proof cmd:… | probe:… | url:адрес|отпечаток | msg:chat/id | git:sha@repo | human:цитата [--tokens N] [--force]
task.py drop M-0001 --why «…» задачу владельца/клиента дропнуть нельзя — только развилкой
task.py promise --to chat --who Имя --what «прайс» --due «к 18:00» keep P-0001 --msg chat/id · broken P-0001 --why
task.py ask --title … --a … --b … --default a --undo «откат» --deadline «завтра 12:00» [--need decision|access|hands] [--task M-…] [--cost «число»]
task.py note A-0001 delivered:chat/id часы развилки идут только с доставки
task.py decide A-0001 --choice a --by owner
task.py next [--n 5] · open [--short] · scan-sent [--hours 24] · report <id> · regen · nowblock

Что держит скрипт, а не память

  • new без --check — отказ. Критерий закрытия пишется при заведении, не при закрытии.
  • done без --proof — код 2, ничего не пишет. Улика исполняется прямо сейчас (команда, URL с отпечатком в теле — код 200 сам по себе ничего не доказывает, сообщение в журнале исходящих с совпадением адресата и без копии в failed/), вывод и код ложатся в proof/. Упала — не закрыто (код 3). «Не смогла проверить» — третий исход unknown, закрывается только --force, и это остаётся в строке навсегда.
  • Клиентская задача закрывается только чужой рукой: human: или msg:.
  • ask без А/Б/дефолта/отката/срока — отказ. Открытых развилок ≤3, четвёртая отказывается, и отказ пишется в леджер.
  • Порядок next лексикографический: сорванное/горящее обещание (due < now+60m, без срока — тоже) → кровь/деньги/срок сегодня → сказал владелец сегодня → остальное, где строка старше 10 дней без касания поднимается сама.

Прогноз времени и токенов

У каждой строки kind; estimates.json — стартовые значения с пометкой «оценка до накопления фактов». done пишет факт: минуты от take до done и --tokens, если переданы. С трёх фактов по виду прогноз становится медианой; next, open, report печатают прогноз рядом с задачей.

Отчёт — task.py report <id>

Три раздела в мобильном формате: Результат (статус с уликой или прогнозом) · Вопросы с рекомендациями (развилки А/Б с дефолтом) · План действий (следующие команды; «твои руки» отдельной строкой).

Хуки (пишущие, не блокирующие)

  • SessionStart → hooks/task-open.py: печатает open --short (≤12 строк), сорванные обещания первыми.
  • PostToolUse на инструмент отправки в мессенджер → hooks/task-sent.py: каждое исходящее в sent.jsonl; при признаках обещания («пришлю», «сделаю», «в течение», «к вечеру», «сегодня», «завтра», «до …», «готово будет», «через …») заводит promise с chat_id и разобранным сроком; не разобрался — due=null, метка «уточнить срок». Лишняя карточка дешевле пропущенного обещания. Ключ chat/message_id — повтор не дублирует.

Хук стоит на одном пути отправки — гарантии «не растворится» нет: ловушка на большую часть + scan-sent раз в сутки, open краснеет, если он не отрабатывал.

Чего не делаем

Демона · учёт вперёд работы · блокировку отправки и сессии · захват задач из чужих разговоров (только свои исходящие) · чужие бэклоги · статус «отложено» (есть развилка с ценой или drop с причиной).

All versions