
FastheiandClaude Opus 4.8
efa865cac4
fix(launcher/#63): 拉起 agent 注入 git 绑定(GIT_REPO_URL + azkv 凭据)— 修 HM #92
现象(HM #92):蜂群"需绑定 git 仓库才能使用",但 agent 实际拿不到仓库。
根因:HM 已在 swarm create 的 resource_grants 下发 git 绑定(resource_type=git +
metadata.repo_url + secret_ref=azkv://),但 swarm 拉起侧只把 grant 用于校验/脱敏/审批,
launcher 从不消费它 → 被拉起 agent 的 env 没有 GIT_REPO_URL/凭据 → 无法 clone。
(agent 侧 agent/main.py + agent/git_operations.py 早已读取这些 env,缺的纯是注入。)
修复(仅 launcher 注入,比照模型 key 的服务端解析路径):
- 新增 resolve_git_grant(body):从 resource_grants(含 per-agent)取首个 git grant,
repo_url(metadata) → GIT_REPO_URL(非密文 inline);secret_ref(azkv) 服务端解析 →
GIT_USERNAME/GIT_PASSWORD。复用 azkv 读取(workload identity;dev/CI 用
HEICODE_SECRET_<name>)。有 repo 无凭据仍注入 GIT_REPO_URL(公有仓可 clone;私有仓
报错,不伪造)。
- plan_launch_specs 增加 git_env 合并;create 路径解析并透传。
- k8s 后端:GIT_PASSWORD 与模型 key 同走 per-swarm Secret 的 secretKeyRef,绝不内联
PodSpec;GIT_REPO_URL/GIT_USERNAME 为非密文 inline。SENSITIVE_ENV_KEYS 统一管控。
- git KV secret 值约定 JSON {"git_username","git_password"}(接受 git_token/token 形式
+ 裸 token),待 HM #92 对齐。
git 凭据不入 create 请求体/回调/日志/argv(_reject_plaintext_secrets 已覆盖
resource_grants)。
文档:runtime-contract §3.3 env 表 + 约束、security-boundary §6 增 git 绑定解析口径。
测试:scripts/test-agent-launcher.py 增 resolve_git_grant/凭据提取/k8s git secret 用例。
影响:仅 agent_swarm(Swarm/Agent + 密钥/secret_ref + 文档);不改 Manager/客户端/release/
契约状态机/计费/审计字段。HM 侧 binding_id(B 路径)解析另在 HM #92 处理,与本 PR 无关。
验收:
python scripts/test-runtime-contract.py
python scripts/test-contract-freeze.py
REDIS_FAKE=1 python scripts/test-key-injection-contract.py
python scripts/test-security-boundary.py
python scripts/test-agent-launcher.py
python scripts/test-git-workflow.py
python scripts/test-merge-smoke.py
python scripts/test-workflow-e2e.py
(全部通过)
Refs HM #92, Closes #63
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 12:17:51 +08:00
..
2026-06-09 16:21:18 +08:00
2026-06-09 16:21:18 +08:00
2026-06-09 16:21:18 +08:00
2026-06-09 16:21:18 +08:00
2026-06-12 17:38:19 +08:00
2026-06-10 16:11:47 +08:00
2026-06-15 12:17:51 +08:00
2026-06-09 16:21:18 +08:00
2026-06-10 21:14:50 +08:00
2026-06-10 16:48:27 +08:00
2026-06-09 16:21:18 +08:00
2026-06-12 17:57:59 +08:00
2026-06-10 12:51:32 +08:00
2026-06-12 18:12:46 +08:00
2026-06-10 12:51:32 +08:00
2026-06-10 17:44:34 +08:00
2026-06-12 17:38:19 +08:00
2026-06-09 16:21:18 +08:00
2026-06-11 17:10:57 +08:00
2026-06-10 16:48:27 +08:00
2026-06-10 16:11:47 +08:00
2026-06-10 13:22:54 +08:00
2026-06-10 14:08:08 +08:00
2026-06-09 16:21:18 +08:00
2026-06-14 17:12:27 +08:00
2026-06-10 22:01:22 +08:00
2026-06-10 16:11:47 +08:00
2026-06-09 16:21:18 +08:00
2026-06-10 13:22:54 +08:00
2026-06-12 17:00:37 +08:00
2026-06-11 17:10:57 +08:00
2026-06-10 17:35:04 +08:00
2026-06-10 13:22:54 +08:00
2026-06-10 18:11:25 +08:00
2026-06-10 16:11:47 +08:00
2026-06-10 16:11:47 +08:00
2026-06-10 16:11:47 +08:00
2026-06-10 16:11:47 +08:00
2026-06-10 16:11:47 +08:00
2026-06-14 16:52:44 +08:00
2026-06-11 16:28:37 +08:00
2026-06-10 16:11:47 +08:00
2026-06-10 16:48:27 +08:00
2026-06-11 14:36:07 +08:00
2026-06-10 17:35:04 +08:00