Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changes/260809-0820.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
bump: patch
section: Added
---
docs: фреймворк «Дельта» — ADR сесії та інтеграція в vision.md і mandates.md (директорська модель відповідальності, квіз-гейти, ШІ-мандати)
10 changes: 10 additions & 0 deletions .cspell.json
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,12 @@
"викликач",
"викликача",
"викликачів",
"вироджує",
"Високоважільні",
"відкатом",
"відкату",
"відповідається",
"відповідальнісний",
"відправкою",
"відправці",
"воркспейс",
Expand Down Expand Up @@ -262,6 +264,11 @@
"кворумні",
"Кворумні",
"кворумної",
"квіз",
"квізи",
"квізом",
"квізу",
"квізів",
"коміт",
"коміта",
"коміти",
Expand Down Expand Up @@ -333,6 +340,7 @@
"незакомічених",
"незакомічені",
"незастейдженими",
"незданий",
"незастейджено",
"незмердженим",
"незнайшли",
Expand Down Expand Up @@ -471,6 +479,8 @@
"Санітизує",
"серіалізатором",
"сесійність",
"сикофантність",
"сикофантський",
"синхр",
"сіву",
"сідинг",
Expand Down
2 changes: 2 additions & 0 deletions docs/adr/20260809-081009-delta-ai-human-orchestration.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ Chosen option: **«Дельта як розрив легітимності й в

## More Information

Нормативний зміст інтегровано в канон: [vision.md](../vision.md) — розділ «Дельта: розрив легітимності, не когнітивності» (директорська модель, зухвалість як контракт агента); [mandates.md](../architecture/mandates.md) — ШІ-мандати (`kind: model`, `audacity`, остання константа), квіз-гейт, двонапрямна ескалація, детектор соціального дрейфу. Цей ADR — запис рішення сесії; каталог нижче — трасування.

Повний каталог сесії — 66 ідей у 10 кластерах. Авторство позначено: (U) — користувач, решта — фасилітатор. Ідеї 39–41, 66 — (U); добудови й role-storming — фасилітатор.

### Кластер 1: Природа Дельти — що залишається людям
Expand Down
25 changes: 24 additions & 1 deletion docs/architecture/mandates.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ mandates:
decision_types: [architecture, ux]
thresholds: { budget_eur: 2000, risk: medium, irreversible: false }
escalates_to: vitalii
- owner: fable-5 # модель — першокласний власник мандата
kind: model
scope:
refs: ["refs/mt/tasks/routine/**"]
decision_types: [ops]
thresholds: { budget_eur: 200, risk: low, irreversible: false, audacity: medium }
escalates_to: olena
- owner: vitalii
scope: { refs: ["refs/mt/**"], decision_types: ["*"] }
thresholds: {} # порожньо = кореневий мандат
Expand All @@ -33,6 +40,7 @@ mandates:

- **Явність меж** — агент детерміновано обчислює «своє vs чуже» рішення; зникає функція «попросити дозволу».
- **Зміна мандата = підписаний акт делегування** — розширення `scope`/`thresholds` лише commit-ом з Ed25519-підписом делегатора рівня вище; CI перевіряє підпис тим самим патерном, що boundary-enforcement `agent-core` ([stack.md](stack.md)).
- **ШІ-мандат (`kind: model`)** — модель володіє мандатом за тими самими правилами (scope, thresholds, escalates_to); `audacity` — бюджет зухвалості: скільки соціального капіталу/конфлікту агент може спалити заради мети ([vision.md](../vision.md), «Дельта»). **Остання константа:** розширення ШІ-мандата підписує лише людина, завжди — аналізатор ескалацій пропонує draft-PR, але цей клас підпису система ніколи не автоматизує, інакше межа «Дельти» рухає сама себе.
- **Generation fencing** — кожна зміна файлу інкрементує generation; `decision-request` за застарілим generation фенситься й перераховується (той самий механізм, що claim generation — [git.md](git.md)).

## Профіль людини: досьє підтверджень в org-репо
Expand Down Expand Up @@ -103,6 +111,15 @@ deadline_cost: "затримка блокує 3 залежні задачі"

**Інваріант:** до людини не доходить «run failed» — це вже покриває retry ladder ([graph.md](graph.md)); `decision-request` доповзає лише як нерозв'язана *розвилка*, коли ladder вичерпано (`unresolvable`) **і** причина — не баг, а вибір, що виходить за автономію агента. Відповідь власника — існуючий Ed25519-підписаний `ApprovalResponse` ([access.md](access.md)), розширений полем `chosen_option`; аудит-трейл = git log по `decisions/`.

## Квіз-гейт: підпис із доведеним розумінням

Підпис без розуміння — механічний акт: він вироджує гейт у rubber-stamping і знімає з підписанта відчуття відповідальності («система порадила»). Тому `ApprovalResponse` на розвилку валідний лише разом із пройденим **квізом** — гейт стає когнітивною задачею, а не кліком:

- **Питання генеруються з самого `decision-request`** («що станеться з X, якщо обереш B?»), не з шаблону; квіз і відповіді зберігаються поруч у `decisions/` і входять в аудит-трейл.
- **Глибина масштабується за leverage-фасетами:** reversible + низькі фасети → одне контрольне питання; `irreversible` + широкий `blast_radius` → **teach-back**: власник переказує рішення і наслідки своїми словами, агент оцінює переказ.
- **Фейл ≠ покарання:** незданий квіз повертає розвилку з роз'ясненням; метрика — «час до розуміння», не «здав/не здав» (інакше квіз стає екзаменом, який обходять, — Гудхарт).
- **Побічні продукти:** квіз-логи — доказ «людина довела розуміння», сильніший комплаєнс-артефакт, ніж сам підпис; регулярні гейти тренують підписантів проти атрофії доменного розуміння (той самий механізм, що й anti-rubber-stamping у process watcher-а).

## Escalation-intake

`decision-request` **ніколи не пишеться виконавцем напряму** — його пакує окремий агент, що перед пакуванням збагачує контекст: суміжні run branches, історія `decisions/` (прецеденти), vision/policy/ADR, карта мандатів, leverage-фасети. Та сама роль, що `task-intake → plan-dev` ([graph.md](graph.md)), тільки спрямована вгору: розвилка приходить до вирішувача сформульована на рівні найкращого аналітика системи, незалежно від кваліфікації того, хто в неї впирався.
Expand Down Expand Up @@ -169,6 +186,10 @@ ephemeral_mandate:

Наскрізний ланцюг: `Haiku → Sonnet → Fable/Opus → людина-власник мандата`. Escalation-intake і прецедентний рушій працюють на всіх ярусах — прецедент людини застосовується моделями, розвилка, вирішена Fable в межах порогів, стає прецедентом для Sonnet/Haiku. Модель-оркестратор батьківського вузла отримує той самий `inherit_capped`: не може дозволити підвузлам більше, ніж дозволено їй самій.

**Директорська модель відповідальності.** ШІ-мандат — операційний, не відповідальнісний: як у людських організаціях відповідальність несе директор незалежно від того, хто ухвалив рішення, так і тут — протиправне чи шкідливе рішення моделі лягає на людину-власника ланцюга вище, яка відповідала за *організацію* роботи (пороги, квіз-гейти, інваріант reversible), а не за сам акт рішення ([vision.md](../vision.md), «Дельта»). Тому зухвалість (`audacity`) обмежена інваріантом reversible: goal-driven агресивність дозволена лише там, де найгіршу помилку можна відкотити.

**Двонапрямна ескалація.** З ШІ-мандатами ланцюг працює в обидва боки: людина може ескалювати *власну* розвилку «вгору» до сильнішої моделі як до штабу — зворотний `decision-request` з тим самим escalation-intake, тільки вирішувач — модель. Відповідальність при цьому не рухається (директорська модель): підпис на наслідковому рішенні лишається людським.

## Process watcher

Мікроменеджер **процесу, не людей** — node actor, підписаний на relay-події (`ClaimChanged` — [access.md](access.md)): застряглі claim-и, задачі без комітів N днів, `decision-request` без відповіді біля SLA, run-и, що розповзлись за бюджет. Порядок сигналізації (критично для психології системи): (1) першим пінгується сам виконавець — «у тебе висить X, допомогти?», послуга, не нагляд; (2) тільки після grace period без руху — власник мандата вище, у форматі «X застрягло, Y в курсі з {дата}», завжди паралельно й прозоро — виконавець бачить, що і коли піде вгору.
Expand All @@ -177,12 +198,14 @@ ephemeral_mandate:

- **Агрегатор компетенцій** — не окремий сервіс, а **другий вихід retro-рушія** ([retro.md](retro.md)): один читач run-історії з двома продуктами — приватні пропозиції виконавцю і підтвердження компетенцій. Пише в org-репо профілів власним ключем (єдиний дозволений автор `competencies`, CI-enforced), лише positive-only записи з evidence; людина оскаржує через dispute-шлях (підпис власника мандата). Профілі моделей — звичайним комітом на review. Ніколи не торкається `mandates.yaml`.
- **Аналізатор ескалацій** — щотижневий прогін по git log `decisions/`: `>K%` розвилок scope X злітають вище **і** верх стабільно бере рекомендацію агента/варіант X → сигнал «мандат завузький» → draft-PR на `mandates.yaml`; обернено — часто відкочувані рішення в межах мандата → сигнал завузити. Розширення мандата лишається свідомим підписаним актом людини — система лише показує, де ієрархія тре.
- **Детектор соціального дрейфу** — третій вихід того самого прогону: класи рішень, де людські вибори систематично відхиляються від мети задачі в бік соціального комфорту (відкладені розірвання контрактів, непідняті ціни, не сказана партнеру незручна правда), показуються власнику мандата як дельта «мета vs комфорт» ([vision.md](../vision.md), «зухвалість як контракт агента»). Той самий принцип довіри, що й у retro: адресовано самому власнику, не нагляд згори.

## Зміни в існуючих механізмах

| Механізм | Було | Стає |
| --- | --- | --- |
| `ApprovalResponse` ([access.md](access.md)) | підпис «людини» | підпис *обчисленого власника мандата*; + поле `chosen_option` |
| `ApprovalResponse` ([access.md](access.md)) | підпис «людини» | підпис *обчисленого власника мандата*; + поле `chosen_option`; на розвилках валідний лише з пройденим квіз-гейтом |
| `mandates.yaml` | власники — люди | + моделі як першокласні власники (`kind: model`, `audacity`); розширення ШІ-мандата підписує лише людина |
| Generation fencing ([git.md](git.md)) | фенсить застарілі claim-и | + фенсить `decision-request` за застарілим generation карти мандатів |
| `unresolvable` / push тип 3 ([graph.md](graph.md), [access.md](access.md)) | алерт власнику «streak вичерпано» | збагачується escalation-intake у `decision-request` перед доставкою |
| Run branches | `session.jsonl` | + `decisions/` — аудит-трейл людських рішень |
Expand Down
Loading
Loading