24 KiB
24 — Access Keys & Capabilities System (MicroDAO)
Універсальна система ключів доступу та capability-механіка
Цей документ описує універсальну систему ключів доступу (access keys) та capability-механіку для платформи microdao / DAARION.city:
- як видаються й перевіряються ключі;
- як описуються та застосовуються capabilities;
- як працюють Wallet Agent і Embassy Module;
- як система вбудовується в існуючі RBAC/Entitlements/Mode (public|confidential) та Governance.
Ціль: єдиний шар авторизації для веб-клієнта, приватних агентів, API, інтеграцій та зовнішніх платформ.
1. Purpose & Scope
Цей документ описує універсальну систему ключів доступу (access keys) та capability-механіку для платформи microdao / DAARION.city:
- як видаються й перевіряються ключі;
- як описуються та застосовуються capabilities;
- як працюють Wallet Agent і Embassy Module;
- як система вбудовується в існуючі RBAC/Entitlements/Mode (public|confidential) та Governance.
Ціль: єдиний шар авторизації для веб-клієнта, приватних агентів, API, інтеграцій та зовнішніх платформ.
2. Основні поняття
2.1 Access Key
Access Key — це матеріалізований «токен доступу» до певної області системи:
- має унікальний
key_id; - прив'язаний до суб'єкта (user / team / agent / external platform);
- має набір capabilities;
- має строк дії та статус (active / revoked / expired).
Приклади:
- ключ API для інтеграції з GreenFood;
- ключ приватного агента до Co-Memory та Projects;
- ключ Embassy для міжплатформенної взаємодії.
2.2 Capability
Capability — атомарне право на дію над ресурсом.
Формат (концептуально):
<domain>.<resource>.<action>[:<scope>]
Приклади:
chat.message.sendchat.channel.managecomemory.item.read:teamprojects.task.writewallet.balance.viewwallet.stake.ringkgovernance.proposal.createenergy.asset.readplatform.greenfood.inventory.update
2.3 Capability Bundle (role / plan / template)
Capability-набір:
- набір capabilities, який прив'язується до:
- ролі (
Owner,Guardian,Member,Visitor); - тарифного плану (Freemium / Casual / Premium / Platformium);
- конкретного access key (API-ключ, агент, інтеграція).
- ролі (
3. Модель доступу (оновлена формула allow)
Базова формула авторизації:
allow =
RBAC(role, action, resource)
∧ Entitlement(plan, RINGK_staked)
∧ Capability(key, action, resource)
∧ ACL(resource)
∧ Mode(public|confidential)
Тобто:
- Роль дозволяє дію (Owner/Guardian/Member/Visitor).
- План + стейк RINGK дають достатні ліміти/право (ентайтли).
- Ключ (user/agent/API) має відповідну capability.
- ACL ресурсу не забороняє (список дозволених/заборонених).
- Режим каналу/команди (public/confidential) не блокує дію.
4. Типи ключів
4.1 User Session Key
- Прив'язаний до користувача (
user_id) і сесії (JWT / cookie). - Використовується веб-клієнтом.
- Capabilities виводяться з ролі, ентайтлів і контексту (team, mode).
4.2 Agent Access Key
- Прив'язаний до приватного агента (
ag_…). - Використовується при викликах Agent Mesh / Tooling API.
- Має обмежений набір capabilities:
chat.message.read:scopedcomemory.item.read:scopedfollowups.createprojects.task.read/write(за необхідності)
- Має обмеження за:
- токенами/хв;
- кількістю викликів;
- бюджетом 1T / KWT.
4.3 API Key / Integration Key
- Прив'язаний до інтеграції (
integrations). - Наприклад: Notion, Slack, GreenFood, Energy Union, Water Union.
- Capabilities для зовнішнього сервісу:
webhook.events.receive:teamprojects.task.syncrwa.energy.updateplatform.greenfood.sync
4.4 Embassy Key
- Ключ для Embassy Module — шлюз між DAARION.city та зовнішньою платформою/мережею.
- Додаткові властивості:
- mapping зовнішніх ідентичностей (external_id ↔ DID/user_id);
- whitelist дозволених типів актів (
intent.created,offer.published,gift.ack,rwa.claimтощо); - окремий журнал дій для аудиту.
4.5 Wallet Capability Key
- Спеціальний ключ для Wallet Agent:
wallet.balance.viewwallet.tx.initiatewallet.tx.signwallet.stake.ringkwallet.claim.rwa
- Може бути:
- нон-кастодіальний (підпис у клієнта, key лише для маршрутизації);
- кастодіальний (wallet service з 4-eyes контролем).
5. Wallet Agent: специфікація
5.1 Призначення
Wallet Agent — це агент, який:
- показує баланси токенів (RINGK, 1T, KWT, DAAR, DAARION тощо);
- ініціює й перевіряє дії стейкінгу/unstake RINGK;
- показує історію payouts (1T/KWT);
- працює з RWA-сертифікатами (Energy, GREENFOOD тощо) через Embassy.
5.2 Основні флоу
- View balances
- Виклик:
/wallet/balances. - Перевірка:
- RBAC: будь-який Member+ / Owner/Guardian.
- Capability:
wallet.balance.view. - Mode: не залежить від public/confidential.
- Stake RINGK
- Виклик:
/staking/ringk(amount). - Перевірка:
- RBAC: Member+.
- Capability:
wallet.stake.ringk. - Entitlements: перевірка мінімального стейку, lock-параметрів.
- Governance: параметри стейку (lock_until, min_amount) беруться з onchain/DAO-конфігів.
- Claim payouts (1T/KWT/RWA)
- Флоу:
- Wallet Agent читає
payouts/rwa_claimsз backend; - ініціює підпис транзакції користувачем;
- виконує через onchain gateway/Embassy.
- Wallet Agent читає
- Capabilities:
wallet.payout.viewwallet.payout.claimrwa.claim
5.3 Дані (мінімум)
wallets(user_id ↔ address)staking_ringkpayoutsrwa_certificates/rwa_claims(через Embassy)
6. Embassy Module: специфікація
6.1 Призначення
Embassy Module — шар інтеграції між:
- DAARION.city (місто агентів, microdao);
- зовнішніми платформами (GreenFood, Energy Union, інші RWA-ініціативи);
- публічними мережами (L2, marketplace, вузли взаємообміну).
Він відповідає за:
- мапінг ідентичностей;
- валідацію актів взаємодії;
- трансформацію подій і capability-рівнів.
6.2 Ідентичності
resident_id↔user_id/DID.district_id↔ team/microDAO.agent_id↔ citizen-agent.rwa_id↔ сертифікат дару/актив RWA.
Embassy Key має capability-набори:
embassy.intent.read/writeembassy.rwa.claimembassy.energy.updateembassy.audit.view
6.3 Події (канонічні акти)
intent.createdoffer.publishedgift.ackmemory.updaterwa.claimenergy.update
Embassy:
- приймає подію через webhook / шину (NATS);
- перевіряє capability Embassy Key;
- трансформує в внутрішні події (
reward.*,oracle.*,payout.*).
7. Runtime capability-check
7.1 Компоненти
- PDP (Policy Decision Point) — сервіс, який:
- приймає контекст запиту:
user_id / agent_id,team_id,resource,action,mode,key_id; - повертає
allow/deny+ причину.
- приймає контекст запиту:
- PEP (Policy Enforcement Point):
- live у API-gateway і сервісах (Messaging, Projects, Wallet, Governance).
7.2 Кеш і формат токена
- Для кожного access key формується компактний «capability token»:
sub(user/agent/integration);team_scope;caps(список capability кодів або bitmap);exp.
- Токен зберігається в Redis / in-memory кеші для швидкої перевірки.
7.3 Приклади перевірок
- Агент хоче прочитати Co-Memory:
action = comemory.item.read
resource = chat: c_123
mode = confidential
subject = ag_456
key_id = ak_789
→ RBAC: owner of agent = Member в team t_1
→ Entitlements: план дозволяє приватні агенти
→ Capability(ak_789): містить comemory.item.read:scoped
→ ACL: чат дозволяє агентів
→ Mode: confidential → E2EE, агент отримує лише векторні ознаки/summary
→ allow
- Зовнішній RWA-хаб оновлює енергетичний актив:
action = energy.update
subject = embassy_key ek_001
→ Capability(ek_001): енергетичні оновлення дозволені для конкретного district_id
→ Governance: політика для цього district_id активна
→ allow
8. Інтеграція з Governance Agent
Governance Agent:
- має capability
governance.policy.manage(тільки Owner/Guardian через DAO-процес); - може:
- створювати/оновлювати capability bundles;
- прив'язувати bundles до ролей/планів/ключів;
- змінювати пороги доступу (напр. min RINGK stake для Premium/Platformium).
Флоу:
- Створюється пропозиція (onchain / в DAO Service):
- змінити набір capabilities для
Platformiumплану; - додати capability
platform.greenfood.inventory.update.
- змінити набір capabilities для
- Пропозиція голосується токеном DAARION.
- Після прийняття Governance Agent:
- оновлює конфіг у Capability Registry;
- виконує міграцію активних access keys;
- логуються події
governance.policy.updated.
9. Дані та моделі (мінімальна схема)
Таблиці (спрощений вигляд):
create table access_keys (
id text primary key, -- ak_...
subject_kind text not null, -- user|agent|integration|embassy
subject_id text not null,
team_id text null,
name text not null,
status text not null check (status in ('active','revoked','expired')),
created_at timestamptz not null default now(),
expires_at timestamptz null
);
create table capabilities (
id text primary key, -- cap_...
code text not null, -- chat.message.send, wallet.stake.ringk
description text not null
);
create table access_key_caps (
key_id text references access_keys(id) on delete cascade,
cap_id text references capabilities(id) on delete cascade,
primary key (key_id, cap_id)
);
create table bundles (
id text primary key, -- bundle_...
name text not null, -- e.g. "role.Member", "plan.Premium", "agent.default"
created_at timestamptz not null default now()
);
create table bundle_caps (
bundle_id text references bundles(id) on delete cascade,
cap_id text references capabilities(id) on delete cascade,
primary key (bundle_id, cap_id)
);
Access key може наслідувати capabilities з одного чи кількох bundles.
10. Безпека
- Мінімізований набір capabilities за замовчуванням (principle of least privilege).
- Для confidential-контенту:
- агенти не отримують plaintext без явної згоди;
- Embassy не передає контент, тільки агреговані/векторні дані.
- Всі access keys:
- зберігаються у зашифрованому вигляді (KMS);
- мають короткий час життя, періодичну ротацію;
- мають аудит використання (audit_log).
11. Інтеграція з RBAC & Entitlements
Посилання на документ: microdao — RBAC і Entitlements (MVP).docx
- Розширена формула доступу (оновлює пункт 2 у RBAC-документі):
allow =
RBAC(role, action, resource)
∧ Entitlement(plan, RINGK_staked)
∧ Capability(key, action, resource)
∧ ACL(resource)
∧ Mode(public|confidential)
- Мапінг ролей з RBAC → capability bundles:
- з таблиць
team_members.role(Owner,Guardian,Member) та viewer-type (reader,commenter,contributor) формуються стартові bundles:bundle.role.Ownerbundle.role.Guardianbundle.role.Memberbundle.role.Visitor(для гостя в public-каналах).
- кожен bundle включає capabilities, що відповідають матрицям з розділу «4) Ресурси → дії (матриці)» RBAC-документу (Community, Channels, Messages, Follow-ups, Projects, Tasks, Docs, Meetings).
- Мапінг Entitlements (плани + стейк RINGK):
- таблиці з Data Model:
walletsstaking_ringk
- плани з RBAC-документу (
Freemium,Casual,Premium,Platformium) задаються як:bundle.plan.Freemiumbundle.plan.Casualbundle.plan.Premiumbundle.plan.Platformium
- формула з RBAC → в capability-рівень:
effective_quota = min(plan_quota × multiplier(RINGK_staked), hard_limit)
- ліміти прив'язуються до capabilities на кшталт:
chat.message.sendagent.run.invokerouter.invokewallet.payout.claim
12. Інтеграція з Security Architecture & Threat Model
Посилання: microdao — Security Architecture & Threat Model (MVP).docx
- Зберігання ключів:
- метадані ключа — в таблиці
access_keys(див. розділ 13 нижче); - сам секрет (
secret) зберігається зашифрованим (KMS/HSM), згідно з розділами про secrets у Security Architecture; - one-time reveal: після створення ключ не показується повторно.
- Транспорт і токени:
- веб-клієнт:
- використовує сесію (
users+ сесійні токени на рівні Auth); - capability-набір інкапсульовано в «capability token» (JWT/opaque), який несе:
sub(u_/ag_/integr),team_id,- стиснений список
caps.
- використовує сесію (
- API/Webhooks/Embassy:
- ключ передається в
Authorization: Bearer <access_key_secret>або в окремому заголовку; - підпис вебхуків (Embassy) — HMAC, як у Security Architecture.
- ключ передається в
- Confidential-режим:
teams.mode∈ (public,confidential);- для
mode='confidential':- агенти з Agent Access Key не бачать
chat_message.bodyу plaintext, - доступ дається до:
- агрегованих структур (
comemory_items), - embeddings/summary, сформованих локально або в E2EE-шарі;
- агрегованих структур (
- агенти з Agent Access Key не бачать
- це наслідує E2EE-модель з Security-документу (сервер бачить мінімум метаданих).
- Threat model для access keys:
- нові активи:
access_keys,bundles, capability-кеш;
- загрози:
- компрометація ключа, зловживання Embassy-ключем, масовий abuse agent-ключів;
- мітiгації:
- короткий
expires_at, обов'язкова ротація; - strict capabilities (least privilege);
- обов'язковий аудит через події
audit.eventі новіaccess_key.*(див. нижче).
- короткий
13. Інтеграція з Data Model & Event Catalog
Посилання: microdao — Data Model & Event Catalog.docx
- Нові таблиці (додати в розділ DB-схеми, поруч із Wallet / Governance):
create table access_keys (
id text primary key, -- ak_...
subject_kind text not null, -- 'user' | 'agent' | 'integration' | 'embassy'
subject_id text not null, -- u_/ag_/...
team_id text null, -- t_..., якщо scoped до команди
name text not null,
status text not null check (status in ('active','revoked','expired')),
created_at timestamptz not null default now(),
expires_at timestamptz null,
last_used_at timestamptz null
);
create table capabilities (
id text primary key, -- cap_...
code text not null unique, -- chat.message.send, wallet.stake.ringk, ...
description text not null
);
create table access_key_caps (
key_id text references access_keys(id) on delete cascade,
cap_id text references capabilities(id) on delete cascade,
primary key (key_id, cap_id)
);
create table bundles (
id text primary key, -- bundle_...
name text not null unique, -- role.Member / plan.Premium / agent.default
created_at timestamptz not null default now()
);
create table bundle_caps (
bundle_id text references bundles(id) on delete cascade,
cap_id text references capabilities(id) on delete cascade,
primary key (bundle_id, cap_id)
);
- конвенції ID узгоджуються з розділом «2) Конвенції»:
ak_…для access keys;cap_…для capabilities;bundle_…для bundle-ів.
- Прив'язка до існуючих таблиць:
access_keys.subject_id→users.id/agents.id/integrations.id/ Embassy-ідентифікатори (згідно з Data Model);access_keys.team_id→teams.id(team як microDAO/платформа).
- Нові події для Event Catalog (розширення enum
topic):
Додати в список topic.enum:
"access_key.created",
"access_key.revoked",
"access_key.used"
та окремі allOf-entry з $defs:
// envelope.topic = "access_key.created"
"access_key_created": {
"type": "object",
"properties": {
"key_id": { "type": "string" },
"subject_kind": { "type": "string" },
"subject_id": { "type": "string" },
"team_id": { "type": ["string","null"] }
},
"required": ["key_id","subject_kind","subject_id"]
}
аналогічні схеми для access_key.revoked і access_key.used
(з полями revoked_by, action, resource_kind).
- Зв'язок з уже наявними подіями:
staking_ringk+payoutsвже мають події:"staking.locked""payout.generated""rwa.inventory.updated"
- Wallet Agent та Embassy в sequence-діаграмах нижче використовують саме ці topic-и; capability-check визначає, хто має право ініціювати або читати ці події.
14. Sequence-діаграми (ключові флоу)
14.1 Wallet Agent: login → access key → capability-check → stake RINGK
sequenceDiagram
participant U as User (browser)
participant Auth as Auth Service
participant API as API Gateway
participant PDP as Policy Service
participant W as Wallet Service
participant BUS as NATS JetStream
U->>Auth: 1) POST /login (email+code)
Auth-->>U: 2) Session (JWT/cookie з user_id + capability token)
U->>API: 3) POST /wallet/stake {amount}
API->>PDP: 4) authorize(user_id, action=wallet.stake.ringk)
PDP-->>API: 5) allow / deny
API->>W: 6) create_stake_request(user_id, amount)
W->>BUS: 7) publish topic="staking.locked" (payload.staking_id)
API-->>U: 8) 200 OK (stake pending)
W->>BUS: 9) (після ончейн-обробки) publish topic="payout.generated"
BUS-->>U: 10) notification → Wallet Agent (claim available)
14.2 Embassy Module: external RWA → Embassy → capability-check → internal events
sequenceDiagram
participant Ext as External RWA Hub
participant GW as Embassy Gateway (HTTP/Webhook)
participant PDP as Policy Service
participant BUS as NATS JetStream
Ext->>GW: 1) POST /embassy/rwa {inventory_update} + access_key
GW->>PDP: 2) authorize(embassy_key, action=rwa.inventory.update)
PDP-->>GW: 3) allow / deny
GW->>BUS: 4) publish topic="rwa.inventory.updated" (payload.rwa_id, delta)
BUS-->>BUS: 5) downstream services (Wallet/Gift Fabric) слухають подію
14.3 Energy Union: meter → Energy Union → Embassy → payouts
sequenceDiagram
participant M as Metering Agent
participant EU as Energy Union Backend
participant Emb as Embassy Module
participant PDP as Policy Service
participant BUS as NATS JetStream
participant W as Wallet Service
M->>EU: 1) send meter data (kWh)
EU->>EU: 2) aggregate & validate
EU->>Emb: 3) POST /embassy/oracle {site, period, kWh} + access_key
Emb->>PDP: 4) authorize(embassy_key, action=oracle.reading.publish)
PDP-->>Emb: 5) allow
Emb->>BUS: 6) publish topic="oracle.reading.published"
BUS->>W: 7) consume oracle → compute payouts
W->>BUS: 8) publish topic="payout.generated" (symbol="KWT"/"1T")
BUS-->>Users: 9) Wallet Agent показує доступні виплати
15. Завдання для Cursor
You are a senior backend engineer. Implement the Access Keys & Capabilities System using:
- 24_access_keys_capabilities_system.md
- 18_governance_access_agent.md
- 23_domains_wallet_dao_deepdive.md
- 05_coding_standards.md
Tasks:
1) Create database schema: access_keys, capabilities, access_key_caps, bundles, bundle_caps.
2) Implement PDP (Policy Decision Point) service.
3) Integrate PEP (Policy Enforcement Point) into API Gateway.
4) Implement Wallet Agent endpoints with capability checks.
5) Create Embassy Module stub with capability validation.
6) Add capability-check middleware for all API endpoints.
Output:
- list of modified files
- diff
- summary
16. Результат
Після впровадження цієї системи:
- єдиний шар авторизації для всіх типів доступу (users, agents, integrations, platforms);
- чіткий контроль прав через capabilities;
- інтеграція з Wallet Agent та Embassy Module;
- підготовка до масштабування та додавання нових платформ.