# Техническое задание: 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 |