当前治理 ownership 边界
#2743 保留最终 member-scoped frontend writer 角色;#2676 仅作 umbrella 与 acceptance tracking,二者不认领同一 writer surface。
本项保持 crnd:phase:blocked dependency wait;不丢弃任何 product work。
背景
Parent / umbrella: #2676
本 issue 承接 #2676 中真实后端 API 接入的部分。当前必须保持 blocked,直到后端完成 Team Automation dedicated AgentKey contract。不能用 generic /api/schedules、Account raw-key 管理页、一次性 full_key 展示或 senderNyxId schedule auth 替代。
Blocked by
等待的后端 contract
前端以 #2739 最终 contract 为准,预期至少需要 scoped endpoints:
GET /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations
POST /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations:preflight
POST /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations
GET /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations/{scheduleId}
PATCH /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations/{scheduleId}
DELETE /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations/{scheduleId}
POST /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations/{scheduleId}:reauthorize
POST /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations/{scheduleId}:pause
POST /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations/{scheduleId}:resume
POST /api/scopes/{scopeId}/teams/{teamId}/members/{memberId}/automations/{scheduleId}:run-now
Read model / DTO 至少需要:
- typed owner
(scopeId, memberId),teamId 仅作为当前 containment 验证路径;
authorizationStatus;
credentialSourceKind;
keyExpiresAt;
lastAuthorizationErrorCode;
permissionDigest;
policyVersion;
- typed
invocationTarget;
- typed
nyxIdServiceGrants 与 nyxIdNodeGrants;
- typed disclosure facts/codes。
前端接入范围
- 将
TeamAutomationsTab 从 generic scheduledDispatchApi.listAll/create/update/delete/enable/disable/runNow 迁移到 scoped teamAutomationApi。
- Team UI 不再全局 list schedules 后按
serviceKey / publishedServiceId 过滤。
- preflight 后展示后端 typed authorization plan,不在前端推导 service/node grants。
- create/update/reauthorize 只提交 schedule config、typed authorization intent、
permissionDigest、policyVersion、idempotency/operation key;不提交 secret 或 credential IDs。
- 根据 readmodel 显示
Authorizing / Active / Needs authorization / Revocation pending / Failed 等状态。
- pause/resume/run-now/delete 全部走 scoped API,并验证错误状态不会泄漏跨 scope/team/member 资源存在性。
明确不做
- 不调用 generic
/api/schedules 访问 Team-owned automation;后端 generic route 会排除/拒绝 Team records。
- 不调用 NyxID create-key。
- 不展示、缓存、提交或测试快照保存
fullKey、OAuth token、SecretReference、apiKeyId。
- 不把 accepted ACK 当 provisioning committed;UI 必须等待 readmodel/operation 状态。
验收
⟦AI:AUTO-LOOP⟧
当前治理 ownership 边界
#2743 保留最终 member-scoped frontend writer 角色;#2676 仅作 umbrella 与 acceptance tracking,二者不认领同一 writer surface。
本项保持
crnd:phase:blockeddependency wait;不丢弃任何 product work。背景
Parent / umbrella: #2676
本 issue 承接 #2676 中真实后端 API 接入的部分。当前必须保持 blocked,直到后端完成 Team Automation dedicated AgentKey contract。不能用 generic
/api/schedules、Account raw-key 管理页、一次性full_key展示或senderNyxIdschedule auth 替代。Blocked by
DurableCallerCredentialRef,raw key 不进入LlmControl/ Envelope / state / event / readmodel。permissionDigest/policyVersion/ disclosure facts。等待的后端 contract
前端以 #2739 最终 contract 为准,预期至少需要 scoped endpoints:
Read model / DTO 至少需要:
(scopeId, memberId),teamId仅作为当前 containment 验证路径;authorizationStatus;credentialSourceKind;keyExpiresAt;lastAuthorizationErrorCode;permissionDigest;policyVersion;invocationTarget;nyxIdServiceGrants与nyxIdNodeGrants;前端接入范围
TeamAutomationsTab从 genericscheduledDispatchApi.listAll/create/update/delete/enable/disable/runNow迁移到 scopedteamAutomationApi。serviceKey/publishedServiceId过滤。permissionDigest、policyVersion、idempotency/operation key;不提交 secret 或 credential IDs。Authorizing/Active/Needs authorization/Revocation pending/Failed等状态。明确不做
/api/schedules访问 Team-owned automation;后端 generic route 会排除/拒绝 Team records。fullKey、OAuth token、SecretReference、apiKeyId。验收
authorization_plan_changed会刷新 plan 并要求重新 consent。Needs authorization可原地 reauthorize 且表单内容不丢失。Revocation pending不被显示成凭证已删除。m-alpha/wf-alpha/svc-alpha/sch-alpha/ak-alpha。/api/schedules访问 Team-owned records。fullKey、OAuth token、SecretReference、apiKeyId。⟦AI:AUTO-LOOP⟧