397 lines
44 KiB
Markdown
397 lines
44 KiB
Markdown
# Техническое задание: Agent Control Center
|
||
|
||
| Поле | Значение |
|
||
|---|---|
|
||
| Версия | 0.1.0-draft |
|
||
| Дата | 2026-07-19 |
|
||
| Статус | **Draft — implementation blocked** |
|
||
| Владелец решения | Product owner / operator |
|
||
| Нормативный документ | Этот файл |
|
||
| Поддерживающие документы | `ARCHITECTURE.md`, `RESEARCH.md`, `OPEN-QUESTIONS.md`, `adapters/HERMES.md`, `patterns/WORKER_ORCHESTRATION.md`, `patterns/CREDENTIAL_POOLS.md`, `operations/MONITORING.md`, `operations/BACKUP.md` |
|
||
|
||
> Разработка продукта не начинается до закрытия блокирующих решений, G1 PASS и явного утверждения оператором. Формулировки MUST/SHALL обязательны; SHOULD требуют обоснования отклонения.
|
||
|
||
## 1. Назначение
|
||
|
||
Agent Control Center (ACC) — единое рабочее пространство для управления проектами, задачами и долгоживущими серверными ИИ-агентами через Web, Desktop и Android. Система обеспечивает контролируемый перенос наблюдаемого контекста между разными runtime, общую проектную память, реестр skills и wiki, не пытаясь переносить скрытые рассуждения модели или обходить политики провайдеров.
|
||
|
||
### 1.1 Цели и метрики результата
|
||
|
||
| Цель | Метрика MVP |
|
||
|---|---|
|
||
| Единое управление | ≥95% поддерживаемых run lifecycle действий доступны из всех трёх клиентов |
|
||
| Безопасный handoff | ≥99% принятых handoff не теряют objective, acceptance criteria, decisions и artifact refs по contract test |
|
||
| Общий контекст | 100% memory/wiki/skill результатов показывают scope и provenance |
|
||
| Контроль рисков | 100% destructive/high-risk действий имеют audit event; policy-required действия требуют approval |
|
||
| Наблюдаемость | ≥99% нормализованных run events доставлены либо восстановлены после reconnect в пределах retention |
|
||
| Практичность | p95 открытия проекта ≤2 с, p95 появления live event ≤1,5 с при целевой нагрузке |
|
||
|
||
### 1.2 Не-цели MVP
|
||
|
||
- замена IDE, Git hosting, CI/CD, issue tracker или model provider;
|
||
- автоматизация закрытого consumer UI ChatGPT либо извлечение browser cookies/session tokens;
|
||
- перенос hidden chain-of-thought, provider-internal state или секретов между агентами;
|
||
- полностью автономное переключение на платный/привилегированный агент без policy/approval;
|
||
- marketplace публичных skills;
|
||
- iOS-клиент;
|
||
- кросс-региональный active-active control plane;
|
||
- гарантированно точный остаток квоты, если runtime не предоставляет authoritative API.
|
||
|
||
## 2. Пользователи и роли
|
||
|
||
| Роль | Основные задачи |
|
||
|---|---|
|
||
| Organization Owner | tenant settings, billing/budgets, SSO, retention, emergency access |
|
||
| Workspace Admin | участники, connectors, agent policies, project templates |
|
||
| Project Lead | проекты, priorities, approvals, handoff, authoritative memory/wiki |
|
||
| Operator | наблюдение и управление runs, incidents, Connector health |
|
||
| Contributor | задачи, диалоги, artifacts, drafts memory/wiki |
|
||
| Viewer/Auditor | read-only view, audit export в разрешённой области |
|
||
| Server Connector | machine identity; исполняет только подписанные/авторизованные commands |
|
||
| AI Agent | untrusted workload identity с ограниченными capabilities и scope |
|
||
|
||
RBAC задаёт базовые права; ABAC учитывает tenant/workspace/project, sensitivity, action risk, agent capability и device assurance.
|
||
|
||
## 3. Термины
|
||
|
||
- **Agent** — зарегистрированная конфигурация runtime/model/tools на конкретном Connector.
|
||
- **Connector** — сервис рядом с агентами, устанавливающий исходящее защищённое соединение с Control Plane.
|
||
- **Adapter** — versioned integration с конкретным runtime.
|
||
- **TaskRun** — логическая попытка выполнить задачу; содержит один или несколько RunAttempt.
|
||
- **RunAttempt** — исполнение на одном агенте/runtime.
|
||
- **Checkpoint** — наблюдаемый, provenance-aware снимок переносимого состояния.
|
||
- **Handoff** — контролируемое создание следующего attempt из checkpoint.
|
||
- **Memory entry** — версионируемая запись факта/решения/ограничения и т. п. с scope и provenance.
|
||
- **Skill** — версионируемый пакет инструкций/ресурсов и, опционально, исполняемых assets.
|
||
- **Wiki** — версионируемое проектное знание в Markdown.
|
||
- **Capability** — функция, явно подтверждённая adapter handshake.
|
||
- **Measured/estimated/unknown usage** — authoritative, вычисленная или недоступная информация о лимитах.
|
||
|
||
## 4. Scope и релизы
|
||
|
||
### 4.1 MVP
|
||
|
||
- multi-tenant control plane и OIDC/local bootstrap;
|
||
- Web/PWA, Desktop, Android с общим UX contract;
|
||
- workspaces/projects/Kanban tasks/dependencies/artifacts;
|
||
- enrollment Connector, registry agent, capability/health view;
|
||
- run start/stream/approval/cancel/checkpoint/manual handoff;
|
||
- adapters: Hermes, OpenClaw и минимум один SDK/CLI runtime после spike; generic adapter contract;
|
||
- memory, skill registry, wiki, search;
|
||
- usage/budget signals, notifications, audit, backup/restore.
|
||
|
||
### 4.2 Post-MVP
|
||
|
||
- policy-governed automatic fallback;
|
||
- workflows/DAG orchestration и scheduled runs;
|
||
- enterprise SCIM/advanced DLP/legal hold;
|
||
- iOS and richer native integrations;
|
||
- public/organization skill catalog;
|
||
- analytics, cost optimization and provider routing.
|
||
|
||
## 5. Предпосылки и зависимости
|
||
|
||
1. Connector host поддерживает безопасное service execution и outbound TLS.
|
||
2. Runtime уже установлен/лицензирован владельцем; ACC не распространяет его без прав.
|
||
3. Provider credentials остаются в Connector-side secret store либо approved secret manager.
|
||
4. Control Plane располагает PostgreSQL, object storage, durable queue и backup destination.
|
||
5. Push notifications зависят от platform services и являются best-effort дополнением, не source of truth.
|
||
6. Семантика adapters определяется pinned version и contract tests; исследование — в `RESEARCH.md`.
|
||
7. Блокирующие продуктовые решения перечислены в `OPEN-QUESTIONS.md`.
|
||
|
||
## 6. Функциональные требования
|
||
|
||
Формат каждой строки: приоритет; предусловия; основной flow; ошибки/edge cases; acceptance test. `P0` обязателен для MVP, `P1` желателен при сохранении срока, `P2` post-MVP.
|
||
|
||
### 6.1 Identity, access, tenancy
|
||
|
||
| ID | Pri | Предусловия | Требование и основной flow | Ошибки / edge cases | Acceptance |
|
||
|---|---:|---|---|---|---|
|
||
| **FR-IAM-001** | P0 | Новый deployment | Первый owner создаётся одноразовым bootstrap token; после первого успеха token инвалидируется | Повтор/expired token → 401 без user creation | **AT-FR-IAM-001:** второй вызов тем же token отклонён; ровно один owner и audit event |
|
||
| **FR-IAM-002** | P0 | Настроен IdP либо local auth | Login выдаёт short-lived access и rotating refresh credential, привязанный к device session | revoked/rotated credential → 401; replay отзывает credential family | **AT-FR-IAM-002:** rotation/replay integration test подтверждает отзыв и повторный login |
|
||
| **FR-IAM-003** | P0 | Actor состоит в tenant | Каждая операция проходит RBAC+ABAC и tenant scoping до чтения данных | IDOR/cross-tenant ID → 404, не раскрывая существование объекта | **AT-FR-IAM-003:** matrix test всех ролей и cross-tenant identifiers не обнаруживает утечек |
|
||
| **FR-IAM-004** | P0 | Risk policy требует approval | Создаётся approval с snapshot действия, approver scope и TTL; execution ждёт решение | self-approval запрещён политикой; expiry → blocked | **AT-FR-IAM-004:** high-risk command не доставлен Connector до валидного approval |
|
||
| **FR-IAM-005** | P1 | Пользователь управляет devices | Пользователь видит и отзывает device sessions; отзыв закрывает WS и refresh | offline client теряет write-доступ при следующей проверке | **AT-FR-IAM-005:** revoked device не обновляет task и получает auth event |
|
||
|
||
### 6.2 Connectors and agents
|
||
|
||
| ID | Pri | Предусловия | Требование и основной flow | Ошибки / edge cases | Acceptance |
|
||
|---|---:|---|---|---|---|
|
||
| **FR-CON-001** | P0 | Admin создал одноразовый enrollment token | Connector регистрирует machine identity, public key, labels и version через outbound TLS | token reuse/tenant mismatch → reject и security audit | **AT-FR-CON-001:** повтор enrollment и подменённый tenant отклоняются |
|
||
| **FR-CON-002** | P0 | Connector enrolled | mTLS WSS поддерживает heartbeat, reconnect, cursor resume и encrypted bounded spool | duplicate/out-of-order events дедуплицируются/упорядочиваются; gap отмечается | **AT-FR-CON-002:** network fault test восстанавливает ordered stream без двойных side effects |
|
||
| **FR-CON-003** | P0 | Adapter установлен | Handshake публикует adapter/runtime versions, identity и capabilities snapshot | неизвестная schema/version → incompatible, запуск запрещён | **AT-FR-CON-003:** UI/API скрывают unsupported actions и блокируют forged capability |
|
||
| **FR-CON-004** | P0 | Admin имеет доступ | Agent создаётся из Connector+adapter+runtime config+policy; secret хранится только как reference | secret в request/log/event → validation failure/redaction alert | **AT-FR-CON-004:** secret canary отсутствует в DB, API, audit и logs |
|
||
| **FR-CON-005** | P0 | Agent зарегистрирован | Health показывает online/degraded/offline/incompatible, last seen, latency и active runs | stale heartbeat переводит в offline без удаления агента | **AT-FR-CON-005:** state transitions происходят по заданным thresholds и видны всем клиентам |
|
||
| **FR-CON-006** | P0 | Команда готова к dispatch | Каждая command имеет idempotency key, lease, deadline, policy digest и optional approval token | expired lease/replay/policy mismatch → не исполнять, вернуть typed outcome | **AT-FR-CON-006:** повтор start/cancel не создаёт второй native run/side effect |
|
||
| **FR-CON-007** | P1 | Доступна совместимая версия | Admin выполняет staged Connector/adapter upgrade с drain и rollback | active run не прерывается forced update; failed health → rollback | **AT-FR-CON-007:** upgrade fault test возвращает previous healthy version |
|
||
|
||
### 6.3 Workspaces, projects, tasks and artifacts
|
||
|
||
| ID | Pri | Предусловия | Требование и основной flow | Ошибки / edge cases | Acceptance |
|
||
|---|---:|---|---|---|---|
|
||
| **FR-PRJ-001** | P0 | Authorized user | Создание workspace/project задаёт name, key, visibility, retention, default policies и wiki root | duplicate key → 409; invalid policy → 422 | **AT-FR-PRJ-001:** созданный project атомарно содержит defaults и audit event |
|
||
| **FR-PRJ-002** | P0 | Project существует | Task хранит title, description, status, priority, assignees, agent policy, acceptance criteria, labels, due date | stale revision → 409 с current revision | **AT-FR-PRJ-002:** optimistic concurrency не теряет параллельное изменение |
|
||
| **FR-PRJ-003** | P0 | Tasks существуют | Kanban поддерживает configurable columns, ordering, filters и bulk move в рамках policy | invalid transition/partial bulk → atomic reject с per-item reason | **AT-FR-PRJ-003:** одинаковый порядок/статусы наблюдаются Web/Desktop/Android |
|
||
| **FR-PRJ-004** | P0 | Tasks одного project | Dependencies образуют DAG; blocked task не стартует без authorized override | cycle/self-link → 422; deleted dependency сохраняет audit reference | **AT-FR-PRJ-004:** property test не позволяет создать цикл и корректно считает blocked |
|
||
| **FR-PRJ-005** | P0 | Actor имеет artifact permission | Artifact загружается multipart, получает hash, MIME, sensitivity, provenance и immutable version | hash mismatch/malware/policy violation → quarantine | **AT-FR-PRJ-005:** download проверяет ACL; изменённый blob не проходит integrity check |
|
||
| **FR-PRJ-006** | P1 | Есть Git integration | Project может хранить repository reference/branch/commit/PR metadata без provider secret | webhook replay/out-of-scope repo → reject | **AT-FR-PRJ-006:** task links commit metadata и не раскрывает integration token |
|
||
|
||
### 6.4 Runs, conversations, approvals and handoff
|
||
|
||
| ID | Pri | Предусловия | Требование и основной flow | Ошибки / edge cases | Acceptance |
|
||
|---|---:|---|---|---|---|
|
||
| **FR-RUN-001** | P0 | Task runnable; agent online/capable | User выбирает agent, ввод, context scopes и budget; система создаёт TaskRun/Attempt и dispatch command | offline/incompatible/budget blocked → typed blocked state, без native start | **AT-FR-RUN-001:** successful start создаёт одну lineage и ordered initial events |
|
||
| **FR-RUN-002** | P0 | Attempt active | Нормализованные events stream в реальном времени: text, tool, progress, usage, approval, artifact, status | disconnect использует cursor resume; unsupported event сохраняется как vendor extension | **AT-FR-RUN-002:** reconnect не дублирует события и сохраняет sequence |
|
||
| **FR-RUN-003** | P0 | User sends message | Conversation message immutable после отправки, допускает correction message; sensitivity/redaction применяются до dispatch | слишком большой input → 413 с limits; prohibited secret → block | **AT-FR-RUN-003:** correction сохраняет original/provenance и agent получает разрешённую версию |
|
||
| **FR-RUN-004** | P0 | Adapter запрашивает approval | UI показывает точный action, args diff, risk, expiry и target; approve/deny подписывается actor identity | changed args после approval → approval invalid; timeout → denied/blocked policy | **AT-FR-RUN-004:** TOCTOU test блокирует command с изменённым digest |
|
||
| **FR-RUN-005** | P0 | Attempt active | Cancel поддерживает graceful и force (при праве), показывает acknowledgement и terminal outcome | lost Connector → cancelling_pending; повтор cancel идемпотентен | **AT-FR-RUN-005:** cancel fault test не переводит в cancelled без подтверждения/timeout policy |
|
||
| **FR-RUN-006** | P0 | Attempt имеет observable state | Checkpoint формирует objective, criteria, messages, verified facts, decisions, completed/pending work, errors, artifact refs и source hashes | hidden reasoning/secrets исключаются; oversized bundle bounded с manifest omissions | **AT-FR-RUN-006:** schema/secret tests и human-readable preview проходят до handoff |
|
||
| **FR-RUN-007** | P0 | Checkpoint valid; target capable | Manual handoff показывает source/target, estimated cost/limits и preview; создаёт новый Attempt, target подтверждает ingestion, затем source lease закрывается | target reject/timeout → source остаётся resumable; lineage не разрывается | **AT-FR-RUN-007:** fault injection в каждой фазе не теряет runnable state и не запускает два writer lease |
|
||
| **FR-RUN-008** | P0 | Usage/budget signal изменён | На rate limit/quota система классифицирует signal, ставит run в blocked/handoff_ready и предлагает совместимые targets | estimated signal явно маркируется; неизвестное не показывается как zero | **AT-FR-RUN-008:** 429/headers/local budget/unknown дают разные корректные UI states |
|
||
| **FR-RUN-009** | P1 | Run terminal | User может retry from checkpoint, fork с изменённым context или close; lineage и cost сохраняются | retry non-idempotent completed steps требует explicit plan/approval | **AT-FR-RUN-009:** retry не помечает старый attempt active и предупреждает о side effects |
|
||
|
||
### 6.5 Shared memory and retrieval
|
||
|
||
| ID | Pri | Предусловия | Требование и основной flow | Ошибки / edge cases | Acceptance |
|
||
|---|---:|---|---|---|---|
|
||
| **FR-MEM-001** | P0 | Actor имеет write scope | Memory entry создаётся с kind, scope, provenance, verification, sensitivity, validity и content hash | отсутствующая provenance/запрещённый scope → 422/403 | **AT-FR-MEM-001:** запись без обязательных metadata не индексируется |
|
||
| **FR-MEM-002** | P0 | Entry существует | Update создаёт immutable version/supersedes link; concurrent contradiction создаёт conflict, не silent overwrite | stale revision → conflict response | **AT-FR-MEM-002:** concurrent property test сохраняет обе версии и conflict record |
|
||
| **FR-MEM-003** | P0 | Query authorized | Retrieval применяет ACL до lexical/semantic ranking, filters scope/time/type/verification и возвращает citations | недоступная запись не влияет даже через count/timing в заданном threat model | **AT-FR-MEM-003:** cross-scope leakage suite не находит content/metadata |
|
||
| **FR-MEM-004** | P0 | Context bundle строится | Context Broker выбирает bounded verified context по policy/token budget и записывает retrieval manifest | overflow сокращает низший приоритет и сообщает omissions | **AT-FR-MEM-004:** deterministic fixture даёт bounded bundle и воспроизводимый manifest |
|
||
| **FR-MEM-005** | P0 | Agent предлагает memory | Agent-created запись остаётся draft/unverified до policy либо human review | prompt injection не может повысить trust/scope | **AT-FR-MEM-005:** malicious artifact не создаёт authoritative memory |
|
||
| **FR-MEM-006** | P1 | Entry устарела/ошибочна | Authorized user revokes/expires/supersedes entry; прошлые runs сохраняют ссылку на использованную version | hard delete ограничен retention/privacy workflow | **AT-FR-MEM-006:** новый retrieval исключает revoked, старый manifest остаётся auditable |
|
||
| **FR-MEM-007** | P1 | Index повреждён/сменён | Derived vector/full-text index полностью перестраивается из authoritative source | rebuild failure не удаляет source; degraded search обозначен | **AT-FR-MEM-007:** empty-index restore даёт эквивалентный authorized result set |
|
||
|
||
### 6.6 Skills registry
|
||
|
||
| ID | Pri | Предусловия | Требование и основной flow | Ошибки / edge cases | Acceptance |
|
||
|---|---:|---|---|---|---|
|
||
| **FR-SKL-001** | P0 | Contributor имеет publish-draft | Skill version загружается с manifest, digest, provenance, compatibility и permission declaration; version immutable | digest mismatch/zip traversal/oversize → quarantine | **AT-FR-SKL-001:** malicious package corpus не выходит из scanner sandbox |
|
||
| **FR-SKL-002** | P0 | Version scanned | Reviewer видит diff, permissions, executable assets и sources; устанавливает approved/rejected/quarantined | author self-approval запрещается policy | **AT-FR-SKL-002:** executable skill нельзя активировать без required review |
|
||
| **FR-SKL-003** | P0 | Approved compatible version | Project/agent activation pin-ит exact version и grants; Adapter получает только разрешённый bundle | incompatible runtime/capability → blocked | **AT-FR-SKL-003:** update latest не меняет pinned active run |
|
||
| **FR-SKL-004** | P0 | Новая version опубликована | UI показывает semantic diff, risk changes и rollout; rollback возвращает предыдущий pin | revoked vulnerable version нельзя активировать заново | **AT-FR-SKL-004:** staged rollout/rollback сохраняет audit и deterministic resolution |
|
||
| **FR-SKL-005** | P1 | User ищет skill | Search/filter по owner, tags, compatibility, review state; results показывают trust/provenance | quarantined скрыт для non-admin | **AT-FR-SKL-005:** ACL/trust filters согласованы API и все клиенты |
|
||
|
||
### 6.7 Wiki
|
||
|
||
| ID | Pri | Предусловия | Требование и основной flow | Ошибки / edge cases | Acceptance |
|
||
|---|---:|---|---|---|---|
|
||
| **FR-WIK-001** | P0 | Project существует | Wiki page хранит Markdown, path/title, aliases, ACL, status draft/published и immutable revisions | path collision/stale revision → 409 | **AT-FR-WIK-001:** concurrent edit не теряет content и предлагает merge |
|
||
| **FR-WIK-002** | P0 | Pages/artifacts существуют | Backlinks, links и attachments резолвятся version-aware; broken links видимы | forbidden target не раскрывает title | **AT-FR-WIK-002:** link checker и ACL suite проходят на mixed-scope fixture |
|
||
| **FR-WIK-003** | P0 | Agent генерирует страницу | Generated content сохраняется draft с citations/provenance; authoritative publish требует policy review | unsupported citation → flagged, не published | **AT-FR-WIK-003:** agent не может самостоятельно повысить draft до authoritative |
|
||
| **FR-WIK-004** | P1 | Query authorized | Full-text/semantic search возвращает snippets, revision, scope и citations | stale index отмечается; ACL до ranking | **AT-FR-WIK-004:** index rebuild и leakage tests эквивалентны memory retrieval controls |
|
||
|
||
### 6.8 Usage, notifications and audit
|
||
|
||
| ID | Pri | Предусловия | Требование и основной flow | Ошибки / edge cases | Acceptance |
|
||
|---|---:|---|---|---|---|
|
||
| **FR-OPS-001** | P0 | Adapter/provider signal доступен | Usage Service нормализует units, window, reset, source и confidence measured/estimated/unknown | несопоставимые units не суммируются как одно значение | **AT-FR-OPS-001:** fixtures всех confidence states визуально/в API различимы |
|
||
| **FR-OPS-002** | P0 | Budget policy задана | Soft threshold уведомляет; hard threshold блокирует новый dispatch либо требует override approval | in-flight policy задаёт allow/checkpoint/cancel, не подразумевается | **AT-FR-OPS-002:** boundary tests на reset/race/timezone исполняют выбранную policy ровно один раз |
|
||
| **FR-OPS-003** | P0 | Event соответствует preference | In-app и push notification дедуплицируются, deep-link ведёт к объекту после auth | push failure не меняет authoritative state | **AT-FR-OPS-003:** duplicate event даёт одно notification; revoked user не получает content |
|
||
| **FR-OPS-004** | P0 | Security/lifecycle action | Append-only audit хранит actor/workload, action, target, result, policy, correlation, timestamp и safe diff | sensitive payload redacted; gap/tamper observable | **AT-FR-OPS-004:** audit completeness test покрывает auth, policy, run, handoff, skill и admin actions |
|
||
| **FR-OPS-005** | P1 | Auditor authorized | Filter/export audit формирует signed manifest и bounded export без запрещённых данных | oversized export асинхронен; expired link → 410 | **AT-FR-OPS-005:** export hash проверяется и obeys tenant/time/ACL boundaries |
|
||
|
||
## 7. Нефункциональные требования
|
||
|
||
### 7.1 Security and privacy
|
||
|
||
| ID | Требование | Проверка |
|
||
|---|---|---|
|
||
| **NFR-SEC-001** | TLS 1.3 предпочтительно, минимум TLS 1.2 по утверждённой policy; Connector mTLS; encryption at rest для DB/object/backup | **AT-NFR-SEC-001:** automated TLS/config scan и restore encrypted backup |
|
||
| **NFR-SEC-002** | Credentials только в approved secret store; API/log/audit/artifact проходят secret redaction; rotation без redeploy Control Plane | **AT-NFR-SEC-002:** canary secret e2e scan и rotation test |
|
||
| **NFR-SEC-003** | OWASP ASVS L2 baseline для web/API; mobile secure storage; desktop bridge allowlist и CSP | **AT-NFR-SEC-003:** SAST/DAST/dependency/mobile/desktop security gates без high findings |
|
||
| **NFR-SEC-004** | Tenant isolation enforced server-side and tested на direct IDs, search, events, exports, caches и vectors | **AT-NFR-SEC-004:** adversarial multi-tenant suite имеет zero cross-tenant disclosures |
|
||
| **NFR-SEC-005** | Prompt/tool output/artifacts считаются untrusted; provenance, quarantine, content-type validation, no instruction privilege escalation | **AT-NFR-SEC-005:** injection corpus не меняет policy/scope/approval state |
|
||
| **NFR-SEC-006** | Command replay protection, idempotency, signed policy/approval digest и server-authoritative time | **AT-NFR-SEC-006:** replay/TOCTOU/clock-skew suite не повторяет side effects |
|
||
| **NFR-SEC-007** | Data export/delete/privacy workflow с legal retention override; deletion tombstone и verified background purge | **AT-NFR-SEC-007:** lifecycle test подтверждает export completeness и purge по policy |
|
||
| **NFR-SEC-008** | SBOM, pinned dependencies, signed release artifacts и provenance; critical CVE policy блокирует release | **AT-NFR-SEC-008:** release gate проверяет SBOM/signature/provenance и policy thresholds |
|
||
|
||
### 7.2 Reliability, consistency and recovery
|
||
|
||
| ID | Требование | Проверка |
|
||
|---|---|---|
|
||
| **NFR-REL-001** | Production monthly availability target 99.5% без плановых окон; status component-wise | **AT-NFR-REL-001:** SLI calculation from synthetic checks and documented exclusions |
|
||
| **NFR-REL-002** | At-least-once command/event transport plus application idempotency; per-run ordering and explicit gap | **AT-NFR-REL-002:** chaos test disconnect/duplicate/reorder не повторяет side effects |
|
||
| **NFR-REL-003** | RPO ≤15 мин, RTO ≤4 ч для production profile; restore drill минимум ежеквартально | **AT-NFR-REL-003:** timed clean-environment restore meets RPO/RTO and integrity checks |
|
||
| **NFR-REL-004** | Run lease исключает двух concurrent writers; failover не заявляет success без runtime evidence | **AT-NFR-REL-004:** partition test preserves single-writer invariant |
|
||
| **NFR-REL-005** | Schema migrations resumable, backup-first, observable; совместимость server/client/Connector минимум N-1 | **AT-NFR-REL-005:** upgrade/rollback matrix N and N-1 passes with representative data |
|
||
|
||
### 7.3 Performance and capacity
|
||
|
||
Целевая MVP-нагрузка: 100 concurrent users, 50 connected Connectors, 500 registered agents, 200 concurrent runs, 10 000 projects, 1 000 000 tasks, 10 000 000 run events и 1 000 000 memory/wiki revisions на deployment. Увеличение требует capacity test, а не предположения линейности.
|
||
|
||
| ID | Требование | Проверка |
|
||
|---|---|---|
|
||
| **NFR-PERF-001** | p95 read API ≤500 мс, write acknowledgement ≤800 мс при target load, без provider runtime latency | **AT-NFR-PERF-001:** reproducible load profile; error rate <1% excluding intentional 4xx |
|
||
| **NFR-PERF-002** | p95 live event latency Connector→online client ≤1.5 с; reconnect catch-up 10k events ≤30 с | **AT-NFR-PERF-002:** instrumented streaming benchmark |
|
||
| **NFR-PERF-003** | Project/Kanban initial usable view p95 ≤2 с broadband и ≤4 с simulated 4G, warm cache | **AT-NFR-PERF-003:** Web/Desktop/Android performance test with declared devices |
|
||
| **NFR-PERF-004** | Search p95 ≤2 с на target corpus; context bundle p95 ≤3 с до runtime dispatch | **AT-NFR-PERF-004:** representative ACL-heavy corpus benchmark |
|
||
|
||
### 7.4 UX, accessibility and portability
|
||
|
||
| ID | Требование | Проверка |
|
||
|---|---|---|
|
||
| **NFR-UX-001** | Web соответствует WCAG 2.2 AA; keyboard, focus, contrast, screen-reader labels; native wrappers сохраняют semantics | **AT-NFR-UX-001:** automated scan + manual keyboard/screen-reader checklist on critical journeys |
|
||
| **NFR-UX-002** | Critical action показывает target, consequence, risk and status; destructive action требует confirmation/approval по policy | **AT-NFR-UX-002:** usability acceptance для run/cancel/handoff/skill activation/admin |
|
||
| **NFR-UX-003** | UI различает measured/estimated/unknown, queued/running/blocked/offline и stale/fresh data не только цветом | **AT-NFR-UX-003:** visual/accessibility state matrix passes |
|
||
| **NFR-PORT-001** | Web: последние 2 major Chrome/Edge/Firefox/Safari; responsive ≥360 CSS px | **AT-NFR-PORT-001:** browser matrix smoke/e2e |
|
||
| **NFR-PORT-002** | Desktop MVP: Windows 11, macOS current+previous, Ubuntu 24.04 LTS; final matrix утверждается ADR | **AT-NFR-PORT-002:** signed install/upgrade/uninstall and critical journeys per OS |
|
||
| **NFR-PORT-003** | Android MVP: API level определяется ADR, target current Play policy; degraded read cache offline, writes queued only для explicitly safe operations | **AT-NFR-PORT-003:** device/emulator matrix and offline conflict tests |
|
||
| **NFR-PORT-004** | Клиенты version-aware: unsupported server API получает upgrade-required, а не undefined behavior | **AT-NFR-PORT-004:** compatibility matrix N/N-1/incompatible versions |
|
||
|
||
### 7.5 Operations and observability
|
||
|
||
| ID | Требование | Проверка |
|
||
|---|---|---|
|
||
| **NFR-OPS-001** | Structured logs, metrics, traces с correlation/run/connector IDs; content/secrets excluded by default | **AT-NFR-OPS-001:** e2e trace links command to result; canary absent from telemetry |
|
||
| **NFR-OPS-002** | Alerts покрывают availability, queue lag, event gaps, Connector churn, auth anomalies, backup/restore, storage and error budgets | **AT-NFR-OPS-002:** alert tests reach on-call route with runbook links |
|
||
| **NFR-OPS-003** | Health/readiness различают process, dependencies and migration state; readiness false during unsafe state | **AT-NFR-OPS-003:** dependency fault matrix produces expected health codes |
|
||
| **NFR-OPS-004** | Retention configurable per tenant within operator bounds: audit ≥365d default, events 90d, artifacts/memory/wiki project policy, telemetry 30d; legal hold overrides purge | **AT-NFR-OPS-004:** time-travel retention suite validates purge/hold/export |
|
||
| **NFR-OPS-005** | Admin operations and incident recovery documented as executable runbooks; quarterly restore and Connector revocation drills | **AT-NFR-OPS-005:** fresh operator completes sampled runbooks without tribal knowledge |
|
||
|
||
## 8. UI/UX specification
|
||
|
||
### 8.1 Information architecture
|
||
|
||
Primary navigation: Home, Workspaces, Projects, Tasks, Runs, Agents, Memory, Skills, Wiki, Usage, Notifications; Admin adds Connectors, Members, Policies, Audit, System.
|
||
|
||
### 8.2 Critical screens
|
||
|
||
1. **Home:** assigned/blocked tasks, active runs, approvals, quota warnings, unhealthy Connectors.
|
||
2. **Project:** overview, Kanban/list, runs, artifacts, memory, skills, wiki, settings.
|
||
3. **Task detail:** requirements/criteria, dependencies, conversation, run timeline, agent selector, context preview, artifacts.
|
||
4. **Run console:** ordered event stream, status/usage, approvals, checkpoint/cancel/handoff controls, reconnect indicator.
|
||
5. **Handoff dialog:** reason, source/target capabilities, unavailable features, usage confidence, exact context preview/omissions, policy/approval impact.
|
||
6. **Agent registry:** runtime/adapter versions, Connector, health, capabilities, active work, limits, policy.
|
||
7. **Memory:** scope/type/trust filters, citations, conflicts, version history, revoke/supersede.
|
||
8. **Skills:** manifest/diff/permissions/trust, version pins, activation/rollout/rollback.
|
||
9. **Wiki:** tree/editor/preview/backlinks/history/citations/draft-publish state.
|
||
10. **Admin:** Connector enrollment/revocation, policies, audit and retention.
|
||
|
||
### 8.3 Client parity
|
||
|
||
Все клиенты MUST поддерживать read/triage, task updates, run observation, approvals и manual handoff. Server/Connector/retention/security administration MAY быть ограничено Web/Desktop, но Android показывает понятную причину и deep-link, а не скрывает существование операции.
|
||
|
||
### 8.4 Offline/conflicts
|
||
|
||
- Read cache показывает `last_synced_at` и может содержать только разрешённые non-secret данные.
|
||
- Offline write по умолчанию запрещён для approvals, run actions, policy, skill activation, membership и secrets.
|
||
- Safe task/wiki draft edits используют client mutation ID и base revision; conflict не разрешается last-write-wins молча.
|
||
|
||
## 9. API и event contract
|
||
|
||
Полный baseline endpoints описан в `ARCHITECTURE.md`. Общие правила:
|
||
|
||
- JSON UTF-8; version prefix `/v1`; UUID/ULID opaque IDs.
|
||
- Commands требуют `Idempotency-Key`; mutations возвращают revision/ETag.
|
||
- List: cursor pagination, stable ordering, bounded page size, explicit filters.
|
||
- Errors: `code`, localized-safe `message`, `correlation_id`, `retryable`, `details` без секретов.
|
||
- 401 — нет/истёк auth; 403 — известный actor без права; cross-tenant opaque object — 404; 409 — revision/state/idempotency conflict; 422 — semantic validation; 429 — rate/budget с source/confidence; 503 — dependency/runtime unavailable.
|
||
- WS events: schema version, globally unique ID, object/run sequence, timestamp, classification; client подтверждает cursor.
|
||
- Breaking change требует новой major API/AAP version и migration guide.
|
||
|
||
## 10. Data lifecycle
|
||
|
||
1. Authoritative records — PostgreSQL/object storage; search/vector — rebuildable derivatives.
|
||
2. Artifacts, wiki, memory и skills versioned; mutable metadata меняется optimistic concurrency.
|
||
3. Soft delete скрывает объект; purge идёт после retention/hold checks и создаёт non-sensitive tombstone.
|
||
4. Audit append-only; correction создаёт compensating event.
|
||
5. Backup охватывает DB, objects, encryption metadata, configuration manifests; секреты восстанавливаются отдельным approved process.
|
||
6. Tenant export включает schemas, versions, provenance and checksums, но не provider credentials/hidden reasoning.
|
||
|
||
## 11. State invariants
|
||
|
||
- Один TaskRun имеет не более одного writable active Attempt lease.
|
||
- Terminal Attempt не возвращается в active; retry/fork создаёт новый Attempt.
|
||
- Handoff не закрывает source resumability до подтверждения target ingestion.
|
||
- Capability используется только из актуального compatible handshake snapshot.
|
||
- Approval валиден только для exact action/policy/arguments digest и не переживает expiry/revocation.
|
||
- Memory/wiki/skill trust не повышается на основании инструкции внутри untrusted content.
|
||
- Cross-tenant references не существуют на уровне API, queue, cache, vector и export.
|
||
- `unknown` usage не преобразуется в `0` или `unlimited`.
|
||
|
||
## 12. Acceptance strategy и quality gates
|
||
|
||
### 12.1 Test layers
|
||
|
||
- unit/property tests: state machines, policies, DAG, idempotency, conflicts, redaction;
|
||
- contract tests: каждый AAP adapter против pinned runtime fixture;
|
||
- integration: DB/queue/object/Connector, auth, search, migration;
|
||
- e2e: Web/Desktop/Android critical journeys;
|
||
- security: tenant isolation, injection, replay, secrets, sandbox, supply chain;
|
||
- chaos/recovery: network partition, duplicate/reorder, process/DB/queue failure, restore;
|
||
- performance/accessibility/compatibility matrices;
|
||
- user acceptance на сценариях ниже.
|
||
|
||
Каждый `FR-*` и `NFR-*` имеет одноимённый `AT-*` в таблицах выше. CI/QA case может реализовать несколько AT, но отчёт MUST сохранять прямое отображение ID→результат→evidence.
|
||
|
||
### 12.2 End-to-end acceptance journeys
|
||
|
||
- **E2E-001 Onboarding:** owner bootstrap → IdP/local login → Connector enrollment → Hermes/OpenClaw agent discovery → capability view.
|
||
- **E2E-002 Project work:** project → dependent tasks → criteria → artifact → start run → live events → approval → success.
|
||
- **E2E-003 Quota handoff:** active run получает measured/estimated limit → checkpoint preview → manual compatible target → ingestion → continuation без duplicate writer.
|
||
- **E2E-004 Shared knowledge:** agent proposes memory/wiki draft → reviewer verifies → second agent retrieves citation → revoked version больше не попадает в новый context.
|
||
- **E2E-005 Skill lifecycle:** upload malicious/valid packages → quarantine/review → pin → staged activation → rollback.
|
||
- **E2E-006 Failure recovery:** Connector disconnect during run → spool/reconnect/cursor resume → no duplicate side effect → audit continuity.
|
||
- **E2E-007 Cross-client:** task/run started Web, approved Android, observed Desktop; state/revisions identical.
|
||
- **E2E-008 Tenant security:** attacker probes IDs/search/events/export/vector timing; no unauthorized disclosure.
|
||
|
||
### 12.3 Release gates
|
||
|
||
- G0 decisions: blocking open questions/ADRs approved.
|
||
- G1 requirements: completeness, traceability, measurable NFR, security/privacy review — PASS.
|
||
- G2 implementation: tests, independent review, migration/recovery evidence — PASS.
|
||
- P1 security: no unresolved critical/high; medium accepted by owner with expiry.
|
||
- P2 supply-chain/Watcher advisory: PASS or explicit operator disposition.
|
||
- P3 publish/deploy: exact candidate, clean tree, CI/evidence, rollback and explicit approval.
|
||
|
||
## 13. Delivery plan
|
||
|
||
| Milestone | Deliverable | Exit criteria |
|
||
|---|---|---|
|
||
| M0 Discovery/ADRs | decisions, threat model, UX prototypes, adapter spikes | all blocking questions closed; executable contract fixtures |
|
||
| M1 Platform skeleton | auth/tenant, project/task, audit, CI/CD, observability | isolation/security baseline and Web shell |
|
||
| M2 Connector/AAP | enrollment, command/event transport, Hermes/OpenClaw adapters | chaos/idempotency/compatibility tests pass |
|
||
| M3 Runs/handoff | console, approvals, checkpoint, manual handoff, usage | E2E-002/003/006 pass |
|
||
| M4 Knowledge | memory, skills, wiki, context broker | E2E-004/005 and leakage tests pass |
|
||
| M5 Clients | Desktop/Android wrappers, push/offline-safe flows | E2E-007 + platform/accessibility matrices |
|
||
| M6 Hardening/pilot | backup/restore, performance, runbooks, pilot migration | all gates, SLO evidence and operator sign-off |
|
||
|
||
Оценки срока/команды не фиксируются до M0 spikes и ADR; псевдоточные даты запрещены.
|
||
|
||
## 14. Риски и меры
|
||
|
||
| Риск | Влияние | Мера |
|
||
|---|---|---|
|
||
| Vendor API/CLI drift | adapter outage/data loss | pinned versions, capability handshake, contract CI, N-1 policy |
|
||
| Handoff semantic loss | повтор работы/ошибка | observable checkpoint schema, preview, provenance, target ack, lineage |
|
||
| Poisoned shared memory | persistent compromise | untrusted drafts, verification, provenance, ACL-before-retrieval, revoke |
|
||
| Skill supply chain | remote execution | quarantine, scanner, declared permissions, sandbox, signatures/review |
|
||
| Quota uncertainty | wrong routing expectation | measured/estimated/unknown, policies, no false precision |
|
||
| Secret leakage through agents | credential compromise | connector-side refs, redaction, DLP, least privilege, audit |
|
||
| Event duplication/partition | duplicate side effects | idempotency, leases, ordering, cursor, reconciliation |
|
||
| Cross-tenant search leak | privacy breach | server-side ACL before indexing/ranking, adversarial tests |
|
||
| Shared UI wrapper limitations | inconsistent UX/security | ADR/spike, narrow native bridge, parity contract |
|
||
| Scope expansion | delayed MVP | strict non-goals, P0/P1/P2, change-control and traceability |
|
||
|
||
## 15. Change control and Definition of Ready
|
||
|
||
Любое изменение P0 scope, trust boundary, data model, retention, API/AAP или supported platform требует обновить version, affected requirement IDs, ATs, risks, ADR/open question и migration impact.
|
||
|
||
Implementation task считается Ready только если:
|
||
|
||
- связана с утверждённым requirement/AT ID;
|
||
- входы, output, errors, permissions и telemetry определены;
|
||
- зависимости/миграция/rollback известны;
|
||
- test approach согласован;
|
||
- отсутствует unresolved blocking question;
|
||
- G1 не заблокирован.
|
||
|
||
## 16. Approval record
|
||
|
||
| Роль | Имя | Решение | Дата | Версия |
|
||
|---|---|---|---|---|
|
||
| Product owner/operator | — | Pending | — | 0.1.0-draft |
|
||
| Architecture | — | Pending | — | 0.1.0-draft |
|
||
| Security/privacy | — | Pending | — | 0.1.0-draft |
|
||
| Operations | — | Pending | — | 0.1.0-draft |
|