workspace-cli AINative 研发平台实施步骤
本文档用于指导后续代码实现。每一步都应独立提交,保持现有 v1 命令和测试通过。
当前实施和验收同时覆盖 Codex 与 Claude Code。协议、主 Agent 和 Worker 流程测试是固定门槛;真实 smoke 在对应 CLI 已安装时执行。
推荐验证命令:
env GOCACHE=/private/tmp/workspace-cli-gocache \
GOMODCACHE=/private/tmp/workspace-cli-gomodcache \
GOSUMDB=off \
go test -count=1 ./...
env GOCACHE=/private/tmp/workspace-cli-gocache \
GOMODCACHE=/private/tmp/workspace-cli-gomodcache \
GOSUMDB=off \
go vet ./...
git diff --check
Step 1: 文档和范围冻结
目标:把 AINative 需求方案、技术方案和实施步骤作为后续实现的依据。
涉及文件:
docs/ai-native-requirements.mddocs/ai-native-technical-implementation-plan.mddocs/ai-native-implementation-steps.mdREADME.mddocs/index.html
实施:
- 确认三份 AINative 文档已在
/docs目录。 - README 的设计文档区加入三份文档入口。
- GitHub Pages 首页的设计区加入 AINative 规划入口。
- 运行
git diff --check。
验收:
rg -n "AINative|ai-native" README.md docs能找到文档和入口。git diff --check通过。
Step 2: SQLite migration 和 store 类型
目标:新增 AINative schema,不破坏旧库。
涉及文件:
internal/store/store.gointernal/store/store_test.go
实施:
- 增加 migration 常量
MigrationAINativeWorkflow = "0003_ai_native_workflow"。 - 在
Migratemigration 列表中追加 0003。 - 对
requirements增加 AINative 列:description、workflow_status、analysis_agent_id、coding_agent_id、test_agent_id、analysis_final_artifact_id、technical_final_artifact_id。 - 对
releases增加workflow_status、test_agent_id、active_test_run_id、default_test_command。 - 创建新表:
agents、worker_pools、worker_instances、review_policies、artifacts、requirement_status_events、release_status_events、agent_jobs、agent_runs、agent_run_events、human_approval_requests、provider_permission_grants、requirement_bugs、release_test_runs、release_test_run_requirements;artifacts使用entity_type + entity_id支持 requirement、release 和 release test run 级产物;human_approval_requests包含release_test_run_id;release_test_runs包含test_command、test_command_source、working_dir和summary_artifact_id。 - 插入默认 review policies。
- 对旧表新增的 agent/artifact/test_run ID 字段使用 service 层引用校验,并增加查询索引;不要假设 SQLite
ALTER TABLE ADD COLUMN能补外键。 - 增加 Go struct 和 CRUD 参数类型。
测试:
- 新库 migration 创建所有表和索引。
- 旧 v0.1/v0.2 数据库升级后,旧 requirements 的
workflow_status为manual_active或兼容默认值。 - 默认 review policy 重复 migration 不重复插入。
artifacts同一entity_type + entity_id + artifact_type只能有一个 final。release_test_runs.summary_artifact_id只能引用同一 test run 的test_reportartifact。release_test_runs可以保存稳定test_command_source、工作目录和waiting_user_input状态;来源取值为explicit、release_default、agent_default、inferred、user_supplied。release_status_events可以记录 release test、stale、pending_release、publish-in-progress 和 released 状态变化。release_test_run_requirements保存 test run 覆盖的 requirement+repo+commit 快照,唯一约束为同一 test run 下的requirement_id + repo_name。provider_permission_grants保存 grant scope、sandbox、approval policy、expires_at、used_at 和状态,sandbox 和 approval policy 为空时创建失败。agent_run_events同一 run 内 event_seq 唯一。human_approval_requests可以保存release_test_run_id、payload_json、结构化response_json和 pending/approved/rejected/cancelled 状态。
验收:
go test ./internal/store -run 'TestMigrate.*AINative|TestReviewPolicies|TestArtifactFinal|TestReleaseTestRunSummaryArtifact|TestReleaseStatusEvents|TestReleaseTestRunRequirements|TestProviderPermissionGrant'通过。- 全量
go test -count=1 ./...通过。
Step 3: Artifact service
目标:实现 artifact 文件写入、版本管理、hash 和 final 标记。
涉及文件:
internal/artifact/artifact.gointernal/artifact/artifact_test.gointernal/workspace/service.gointernal/store/store.go
实施:
- 新增
internal/artifact包。 - 实现 artifact path 生成:
- requirement artifact:
work/artifacts/requirements/<req-slug>/<stage>/<artifact-type>-v<n>.md - release artifact:
work/artifacts/releases/<release-slug>/<stage>/<artifact-type>-v<n>.md - release test run artifact:
work/artifacts/releases/<release-slug>/test-runs/<test-run-id>/<artifact-type>-v<n>.md
- requirement artifact:
- 实现 sha256 计算。
- 在 service 层新增通用 artifact 方法:
CreateArtifact、ListArtifacts、GetArtifact、FinalizeArtifact;保留需求侧便捷包装CreateRequirementArtifact、ListRequirementArtifacts、FinalizeRequirementArtifact。 - finalize 必须使用 DB 事务,保证同一 entity 同类 artifact 只有一个 final。
测试:
- 创建 artifact 自动生成 version 1。
- 同一 entity 下同类 artifact 再次创建生成 version 2。
- finalize version 2 后 version 1 的 final 被清除。
- 文件 hash 与 DB sha256 一致。
- release entity artifact 可以生成 version、写入 hash,并在 entity type 或 entity id 不匹配时被 service 拒绝。
- release test run 的
test_reportartifact 可以被summary_artifact_id引用;错误 entity 或错误 artifact type 会被 service 拒绝。
验收:
go test ./internal/artifact ./internal/workspace -run Artifact通过。
Step 4: Agent 配置命令
目标:支持配置主 Agent、分析 Agent、Coding Agent、测试 Agent。
涉及文件:
internal/cli/root.gointernal/workspace/service.gointernal/store/store.gointernal/agent/agent.gointernal/cli/cli_test.go
实施:
- 新增
workspace agent add <name>。 - 支持 flags:
--provider、--role、--model、--system-prompt、--system-prompt-file、--sandbox、--approval-policy、--command、--disabled。 - 新增
agent list/show/update/remove/health。 - Health check:
- Codex:执行
codex --help。 - Claude:执行
claude --help。
- Codex:执行
- Health 失败只更新
health_status=unavailable,不删除配置。
测试:
- 添加 Codex analysis Agent。
- 添加 Claude testing Agent,在本机没有
claude时 health 显示 unavailable。 - provider/role 非法时报错。
- agent 被 worker pool 引用时禁止 remove。
验收:
go test ./internal/cli ./internal/workspace -run Agent通过。
Step 5: Worker pool 命令
目标:支持配置 Worker 并行度和最大数量。
涉及文件:
internal/cli/root.gointernal/workspace/service.gointernal/store/store.gointernal/cli/cli_test.go
实施:
- 新增
workspace worker add <name> --role analysis|coding|testing --agent <agent>。 - 支持
--parallelism、--max-workers、--poll-interval-ms、--lease-seconds。 - 新增
worker list/show/update/enable/disable。 - 校验 parallelism 和 max_workers 都必须大于 0,且 parallelism 不大于 max_workers;文档和帮助说明 parallelism 限制 active job 数,max_workers 限制存活 worker instance 数。
测试:
- 创建 analysis worker。
- 更新 parallelism/max_workers。
- disable 后 list 显示 disabled。
- 引用不存在 agent 时报错。
worker show展示 active job 数、live worker 数、parallelism 和 max_workers。
验收:
go test ./internal/cli ./internal/workspace -run Worker通过。
Step 6: Job queue 和 run 记录
目标:实现可重试、可租约恢复的 SQLite job queue。
涉及文件:
internal/store/store.gointernal/workspace/service.gointernal/workspace/service_test.go
实施:
- 新增
CreateAgentJob、ClaimAgentJob、StartAgentJob、CompleteAgentJob、FailAgentJob、RetryAgentJob、CancelAgentJob。 ClaimAgentJob使用事务原子选择 queued job 并写 lease。- 新增
CreateAgentRun、CompleteAgentRun。 - 新增
AppendAgentRunEvent、ListRunEventsAfter、ListJobEventsAfter;AppendAgentRunEvent使用BEGIN IMMEDIATE或等价写锁事务为同一 run 生成event_seq=max+1,调用方不传序号。 - 新增
CreateHumanApprovalRequest、ListHumanApprovals、RespondHumanApproval。 - 新增
CreateProviderPermissionGrant、GetActiveProviderPermissionGrant、MarkProviderPermissionGrantUsed、ExpireProviderPermissionGrants。 - 支持 job status
waiting_user_input,该状态不被 worker claim,用户响应后由 service 恢复为queued、取消或保持 blocked。 - 实现 lease 过期恢复:
RecoverExpiredJobs(now)。 - job_key 采用
<type>-<requirement-or-release>-<timestamp-or-counter>。
测试:
- 同一 job 只能被一个 worker claim。
- lease 未过期不能被第二个 worker claim。
- lease 过期后恢复为 queued。
- attempts 达到 max_attempts 后标记 failed。
- cancel 后不能 claim。
- waiting_user_input 不会被 claim。
- 并发追加同一 run event 时
event_seq不重复、不跳过已提交事件。 - approval request 重复创建时复用同一个 pending approval。
- approval request 按业务 scope 去重:需求类按 requirement,测试命令类按 release test run,发布确认按 release + 当前通过的 release test run,provider 权限按 job/run。
- respond approval 后写结构化
response_json、responded_at、run event 和状态事件。 artifact_finalizationapproval respond 会在同一事务里 finalize 需求设计和技术方案 artifact。provider_permissionapproval payload 包含 requested_scope、requested_sandbox、requested_approval_policy 和 reason;approve response 必须包含 scope、expires_at、sandbox、approval_policy,创建 grant 并恢复 job queued;reject 后不创建 grant,job 保持 blocked 或 failed。
验收:
go test ./internal/store ./internal/workspace -run 'Job|Lease|Run'通过。
Step 7: Provider runner
目标:统一 Codex 和 Claude Code 非交互执行。
涉及文件:
internal/agent/agent.gointernal/agent/provider.gointernal/agent/provider_test.go
实施:
- 定义
ProviderRunner、RunRequest、RunResult。 - 实现
CodexRunner.BuildCommand:- 默认
codex exec --json --cd <cwd> --skip-git-repo-check --sandbox workspace-write -c approval_policy="never" --output-last-message <output.json> <prompt>。
- 默认
- Codex runner 启动前创建
work/runtime/mcp/<job-key>/codex/config.toml,配置[mcp_servers.workspace_cli]指向workspace mcp serve --home <home> --capability-token <job-token>;启动时通过-c mcp_servers.workspace_cli.command=...和-c mcp_servers.workspace_cli.args=[...]注入该 MCP server,保留用户默认CODEX_HOME以复用真实 Codex 登录态。 - 实现
ClaudeRunner.BuildCommand:- 默认
claude -p --output-format stream-json --mcp-config <path> --permission-mode acceptEdits <prompt>。
- 默认
- Claude runner 使用 job-scoped
--mcp-configJSON;不要把 Codex 当成支持--mcp-config。 - runner 输出写到
work/runtime/jobs/<job-key>/<attempt>/。 - runner 启动前读取同一 job 的 active
provider_permission_grants;grant 未过期、scope 匹配且包含 sandbox/approval policy 时才覆盖 provider 参数,并在使用后标记 used。 - runner 边读取 provider stdout/stderr 边调用
AppendAgentRunEvent,至少写run_started、provider_output、tool_call、artifact_created、approval_requested、blocked、run_completed;写入 DB event 前必须做 secret redaction。单条 provider 输出超过摘要上限时,DB event 只写摘要、原始字节数和 stdout/stderr 文件路径,完整输出只保留在 runtime raw 文件中。 - provider 实际启动参数保留 job token,但写入
agent_runs.command和 provider event 前必须对 exact job token 做[REDACTED]替换,包含 Codex-c内嵌 token、JSON argv 和 standalone signed capability;MCP raw tail 使用同一通用 redactor。 - runner 发现 provider 请求澄清或人工确认时,创建
human_approval_requests,写approval_requestedevent,并把 job 标记为waiting_user_input。 - 支持 fake runner,用于 daemon、watch 和 workflow 测试。
- daemon 把 worker Agent 的 model 传给 Codex/Claude
--model,并按 inline system prompt、system prompt file、job input 顺序构造最终 prompt;文件不可读时不启动 provider。 - provider 启动前校验 artifact 目录和 job input 指定的 requirement/release workspace;无
workspace_pathjob 使用 job-attempt scoped runtime CWD,避免把包含workspace.db的 home 作为 workspace-write 根目录。
测试:
- Codex command builder 输出包含
exec、--json、--cd。 - Codex tool config 生成 job-scoped
config.toml,命令参数包含-c mcp_servers.workspace_cli.*、workspace mcp serve、--home和 job token,且不覆盖CODEX_HOME。 - Claude command builder 输出包含
-p、--output-format stream-json、--mcp-config。 - Codex 和 Claude worker command 都使用 Agent 配置的
--model;worker prompt 同时包含内联、文件和 job input,缺失文件返回错误。 - worker/coordinator prompt 文件读取失败时 provider 不启动,job 保存路径错误并 retry,worker 返回 idle。
- workspace/artifact 前置目录缺失时 provider 不启动,job 保存路径错误并 retry,worker 返回 idle。
- 没有业务 workspace 的 analysis/coordinator job 使用
work/runtime/agent-workspaces/job-<id>/attempt-<n>,不使用 workspace home 根目录。 - fake runner 多段输出会按顺序写 run events。
- fake runner 多路输出通过
AppendAgentRunEvent后按event_seq稳定排序。 - fake runner 请求澄清时创建 pending approval,job 进入 waiting_user_input。
- fake runner 使用有效 provider permission grant 时应用授权参数;grant 过期、scope 不匹配或缺少 sandbox/approval policy 时不提升权限。
- process runner 对超大 provider output event 只保存摘要和 raw 文件路径,不把完整输出写进 DB message。
- fake runner 成功时写 run succeeded。
- fake runner 失败时写 run failed。
验收:
go test ./internal/agent通过。
Step 8: Coordinator daemon
目标:启动本地 Worker pool,调度 job,并处理 heartbeat/retry。
涉及文件:
internal/coordinator/daemon.gointernal/coordinator/daemon_test.gointernal/cli/root.go
实施:
- 新增
workspace agent daemon start/status/stop命令。 - V1 的
start为前台运行;后台 supervisor 不在 V1 范围内。 - daemon 周期性读取 enabled worker pools。
- 按 pool parallelism claim job,且 active job 数不得超过 parallelism。
- 按 pool max_workers 创建或复用 worker instance,live worker 数不得超过 max_workers。
- 启动 provider runner,并写 worker instance heartbeat。
- 增加 coordinator lane:使用
agent_default_main_agent串行 claimrole=coordinatorjob,复用 job lease、run 记录和 retry 逻辑,但不要求用户创建 coordinator worker pool。 - 增加 workflow watch loop:扫描
pending_acceptance、pending_analysis、pending_development、release test bug、release stale 和 publish-in-progress,幂等创建 coordinator/analysis/development/bugfix/test rerun job。 - coordinator watch 覆盖
analysis_completed、development_completed、open test bug、releasestale、releasepublish_in_progress和非 coordinator blocked job;需求/release 按最新 status event ID、bug 按 bug ID、blocked job 按 source job ID + attempt 隔离观察代次,legacy 无事件数据使用实体+状态 fallback key。 publish_in_progress先写幂等 manual-recovery diagnostic 再生成 coordinator job;coordinator input 写入触发类型、状态事件/错误原因和不可绕过的 workflow gate,并排除 coordinator 自身 blocked job。- 捕获 context cancel,优雅停止。
- 一轮调度串行 claim worker slot 后并发运行 provider;SQLite 状态短事务使用单一共享连接,requirement-workspace job 按 requirement 串行,release-only job 按 release 串行。
测试:
- fake runner 下,一个 queued job 被执行为 succeeded。
- parallelism=1 时两个 job 串行。
parallelism=4,max_workers=2时最多两个 live worker instance。parallelism=2,max_workers=2时两个不同 scope 的 provider 在任一释放前都已启动。parallelism=1,max_workers=3时最多一个 active job。- 同一 requirement 或 release scope 的第二个 job 在首个 job 仍为 leased/running 时不能 claim。
- 同一 release 内不同 requirement 的 bugfix 可以同时 claim;release-only job 仍按 release 串行。
- 已有 idle instance 多于更新后的
max_workers时,本轮 claim 数仍不能超过新上限。 - daemon-generated worker 变 lost/stopped 后,replacement 使用 distinct pool-qualified key,历史行保留且容量恢复。
- disabled pool 不 claim job。
- runner 失败时 job retry。
pending_acceptance有默认主 Agent 时创建一个role=coordinator、job_type=coordinator_decidejob,并由 coordinator lane 执行,不重复创建。analysis_completed、development_completed、open bug、release stale、publish-in-progress 和 blocked source job 都能创建带完整触发上下文的 coordinator job。- 同一 status event、bug 或 blocked attempt 重复扫描不重复创建;同一实体出现新 status event 或 source job retry 后再次 blocked 时创建新一代 coordinator job。
- publish-in-progress coordinator input 使用最新 manual-recovery diagnostic;blocked coordinator job 不递归创建 coordinator job。
pending_development终稿齐全时先准备 workspace,再把需求推进到developing,然后创建implementation_planjob。
验收:
go test ./internal/coordinator ./internal/cli -run Daemon通过。
Step 9: MCP server
目标:提供 Agent 可用的结构化 workspace-cli 控制面。
涉及文件:
internal/mcp/server.gointernal/mcp/tools.gointernal/mcp/auth.gointernal/mcp/server_test.gointernal/cli/root.go
实施:
- 新增
workspace mcp serve --capability-token <token>。 - 实现 stdio JSON-RPC 基础协议和 tools/list、tools/call。
- 注册工具:
req_submit、req_list、req_show、req_watch、req_assign_agents、req_update_workflow_status、req_prepare_workspace、artifact_create、artifact_list、artifact_show、artifact_finalize、job_create、job_list、job_show、job_update、job_watch、run_tail、approval_list、approval_show、approval_respond、bug_create、bug_list、bug_update、release_create、release_test_start、release_test_status、release_status、release_watch、release_integrate、release_publish。 - 实现 capability token 校验,token 可先采用 HMAC JSON payload。
- 所有工具只调用 service 层。
- 新增
workspace mcp health:生成短期 coordinator capability,通过同一 stdio Serve 边界调用tools/list,校验非空结果并展示 transport/tool count/tool names;mcp serve使用cmd.InOrStdin(),保证 CLI 和测试共享输入边界。
测试:
- tools/list 返回工具。
- coordinator token 可以 assign agents。
- coding scoped token 可以为本需求调用 req_prepare_workspace,analysis/testing token 不可以。
- scoped token 只能 watch 自己关联的 req/release/job/run。
- coordinator token 可以 respond approval,worker token 不能代表用户确认。
- analysis token 不能调用 release_publish。
- worker token 不能调用 job_update 修改 job 状态。
- artifact tools 输入必须包含
entity_type和entity_id,并按 token scope 校验 entity 类型。 - coding token 只能操作本需求的 requirement artifact;testing token 只能操作 scoped requirement、release 或 release test run artifact。
- testing scoped token 可以 list/show 当前 release test run 的
test_reportartifact,不能读取无关 release 的 artifact。 - testing token 缺少
release_test_run_id且无法通过release_id归属校验时,不能读取 release test run artifact。 - testing token 只能 update scoped bug,不能更新无关 release 或 requirement 的 bug;analysis/coding token 不能调用 bug_update。
- testing token 读取 requirement artifact 或创建 bug 时必须命中 scoped test-run snapshot;没有 test-run scope 时必须命中 active release membership。
- MCP
bug_create默认把 capabilityjob_id写为created_by_job_id;service 只接受 scope 匹配的 requirement job 或 release-test job。 - MCP
bug_create在 capability 带 test-run scope 时默认绑定该release_test_run_id,并拒绝显式指定同 release 的其他 test run。 - testing token 的 bug list/update/job-create 同样优先按
release_test_run_id隔离,不能读取或修改同 release 其他 test run 的 bug。 - mixed release/test-run token 的 requirement/job/run/approval/artifact/watch 都必须以 test run 为准;新增双 test-run regression,覆盖 list/show/watch/raw tail/fixed-by 和 release mutation guards。
- run-scoped child job 省略 input 时仍默认绑定当前 test run;req list/show/watch 的 status events 只返回 scoped job 可证明属于当前 run 的事件。
- coordinator token 可以调用 release_create,worker token 不能调用 release_create。
- coordinator token 可以调用 release_test_start/status;testing token 只能调用 scoped release 的 release_test_start/status;analysis/coding token 被拒绝。
- invalid token 被拒绝。
workspace mcp serveCLI 可以从 stdin 处理tools/list;workspace mcp health返回 available/stdio 和已注册工具摘要。- stdio request 超过 Scanner 默认 64 KiB 仍可处理,V1 使用 4 MiB 有界上限;invalid health capability 返回 authorization error。
验收:
go test ./internal/mcp ./internal/cli -run MCP通过。
Step 10: AI 主 Agent 启动
目标:让用户通过主 Agent 聊天操作 workspace-cli。
涉及文件:
internal/cli/root.gointernal/workspace/service.gointernal/agent/provider.go
实施:
- 新增
workspace ai start [--agent <name>]。 - 默认读取
agent_default_main_agent。 - 生成 coordinator capability token。
- 生成 provider 工具配置文件。
- 启动 Codex 或 Claude 交互会话:
- Codex 先生成 session-scoped
config.toml审计文件,其中[mcp_servers.workspace_cli]指向workspace mcp serve --home <home> --capability-token <coordinator-token>;再执行codex --cd <session-runtime>/workspace --sandbox workspace-write --ask-for-approval on-request -c mcp_servers.workspace_cli.command=... -c mcp_servers.workspace_cli.args=[...],不覆盖用户CODEX_HOME,也不把包含workspace.db的 home 作为可写 CWD。 - Claude 推荐
claude --mcp-config <path> --append-system-prompt-file <prompt-file>。
- Codex 先生成 session-scoped
- 主 Agent system prompt 明确:用户询问进展时优先调用
req_show、req_watch、release_watch、job_watch、run_tail、approval_list;出现 pending approval 时必须向用户展示问题和可选项。 - 注入
WORKSPACE_CLI_HOME和 workspace 二进制路径。
测试:
- 使用 fake command 捕获启动参数。
- Codex 主 Agent 启动参数包含
-c mcp_servers.workspace_cli.*,配置文件包含 workspace-cli MCP server,且不会把CODEX_HOME指向临时目录。 - Codex/Claude 主 Agent process CWD 使用 session runtime workspace;
WORKSPACE_CLI_HOME和 MCP--home仍指向真实控制面 home。 - 主 Agent prompt 包含实时查看和人工确认处理规则。
- 未配置主 Agent 时给出清晰错误。
- provider 不可用时拒绝启动并提示 health。
验收:
go test ./internal/cli -run AIStart通过。
Step 11: AINative 需求提交和 Agent 分配
目标:实现新需求进入 pending_acceptance,并支持主 Agent 分配三类 Agent。
涉及文件:
internal/cli/root.gointernal/workspace/service.gointernal/store/store.gointernal/workspace/service_test.go
实施:
- 新增
workspace req submit <title>。 - 支持
--description、--description-file、--repo、--key。 - 新增
SubmitRequirementservice 方法:创建 requirement row、保存 description/repo scope、设置workflow_status=pending_acceptance,但不创建 worktree。 - 新增
req assign-agents。 - 新增
PrepareRequirementWorkspace(ctx, req)service 方法:对已存在 requirement 读取绑定 repo,fetch base branch,按feature/<req-slug>创建缺失 worktree 和 requirement repo relation;该方法不得调用会再次 insert requirement row 的CreateRequirement。 PrepareRequirementWorkspace幂等处理:已存在干净 worktree 时复用;缺失时创建;脏 worktree、路径冲突、feature 分支被其他 worktree 占用时返回 blocked/error,并保持 workflow_status 不变。- 新增
req prepare-workspace,供主 Agent/MCP/调试使用。 - 分配后可推进到
pending_analysis。 - 每次状态变化写
requirement_status_events。
测试:
- submit 后状态为 pending_acceptance。
- assign-agents 校验 role 匹配。
- pending_acceptance -> pending_analysis 写 event。
- prepare-workspace 不创建第二条 requirement row。
- prepare-workspace 对缺失 worktree 创建 relation,对已有干净 worktree 幂等成功。
- 非法状态转换被拒绝。
验收:
go test ./internal/workspace ./internal/cli -run 'Submit|AssignAgents|WorkflowStatus'通过。
Step 12: 分析阶段 Loop
目标:生成需求设计方案、技术方案和 Review,支持终稿标记。
涉及文件:
internal/workspace/ai_analysis.gointernal/coordinator/analysis.gointernal/cli/root.go
实施:
- 当需求进入
pending_analysis,workflow watch loop 创建analysis_generatejob。 - analysis job prompt 包含需求描述、repo 范围、输出 artifact 要求。
- Review job prompt 包含最新方案和 review policy。
- Review 通过时需求进入
analysis_completed;该状态不要求用户已 finalize 终稿。 - Review 通过并把需求推进到
analysis_completed后,coordinator 必须创建artifact_finalizationapproval;用户选择两类终稿 artifact 后,service 在同一事务中 finalize。 - 新增 CLI:
req artifact create/list/show/finalizereq advance <req> pending_development
- 用户可以通过 approval respond 完成终稿选择,也可以先编辑 artifact 生成新版本,再用 CLI finalize 两类 artifact。
- 用户 finalize
requirement_design和technical_design后才能进入pending_development。
测试:
- fake analysis runner 生成两个 artifact。
- fake review runner high risk 时创建 revise job。
- no_high_risk policy 下 high risk 不通过,medium 通过。
- analysis_completed 时允许两类方案未 finalize。
- artifact_finalization approval respond 后两类 artifact 被 finalize。
- 未 finalize 两类终稿时不能进入 pending_development。
验收:
go test ./internal/workspace ./internal/coordinator ./internal/cli -run Analysis通过。
Step 13: 开发阶段 Loop
目标:Coding Agent 按终稿技术方案逐步开发、逐步 Review,并复用 req finish。
涉及文件:
internal/workspace/ai_development.gointernal/coordinator/development.gointernal/workspace/service_integration_test.go
实施:
pending_development且两类终稿齐全时,coordinator 先调用PrepareRequirementWorkspace。- workspace 准备成功后,把需求推进到
developing并创建implementation_planjob。 - plan artifact 生成后拆分 step job。
- 每个 step job 在 requirement workspace 执行。
- 每步完成后创建
implementation_step_reviewjob。 - Review 失败时创建 step fix job。
- 所有步骤完成后创建
implementation_report和implementation_review。 - 调用现有
FinishRequirement。 - stage ready 后设置
workflow_status=development_completed。 implementation_blockerreplan 定稿后,以新 technical design 创建独立 plan job,并让 step、Review、fix、report 全部按新 plan artifact 隔离;报告只聚合当前周期。- step 或 fix result 返回
implementation_blocker.reason时,自动创建 blocker artifact,并原子创建 continue/replan/block approval、阻塞 source job;同一次 run 重试保持幂等。
测试:
- fake runner 三个步骤全部通过,需求进入 development_completed。
- development job 创建前 requirement workspace 已存在。
- step review 失败时重复同一步,不进入下一步。
FinishRequirementcleanup-pending 时不误标 development_completed。- replan 后旧开发周期已存在同名 plan/step/review/report 时,仍能完成新周期并生成只引用新周期作业的报告。
- step 和 fix 两条路径都能自动进入 implementation blocker 人工决策,且不会提前创建 Review/rereview。
- 同一需求内两个不同 source job 同时产生 blocker 时,各自创建 job/run-scoped pending approval 并分别进入 blocked。
验收:
go test ./internal/workspace ./internal/coordinator -run Development通过。
Step 14: Release 测试和 bugfix Loop
目标:测试 Agent 对 release 整体 Review 和单测,发现 bug 后回 feature 分支修复。
涉及文件:
internal/workspace/ai_testing.gointernal/coordinator/testing.gointernal/cli/root.gointernal/workspace/service_integration_test.go
实施:
- 新增共用 service 方法用于启动和查询 release test;CLI
workspace release test start/status与 MCPrelease_test_start/release_test_status必须调用同一 service 方法,start支持--test-command <cmd>。 - release create 支持
--test-command <cmd>并保存为releases.default_test_command。 - release integrated 后在一个 transaction 中创建
release_test_runs与完整release_test_run_requirementsrequirement+repo+commit 快照,再创建release_testjob;有命令和缺命令路径都遵守该原子边界。test command 解析顺序为release test start --test-command、releases.default_test_command、agent_default_test_command,并分别写入test_command_source=explicit、release_default、agent_default。 - 测试 Agent 生成
entity_type=release_test_run的test_reportartifact,并写入release_test_runs.summary_artifact_id。 - 测试 Agent 必须在
test_report中记录执行过的测试命令、命令来源、工作目录、退出码和关键输出摘要;Agent 推断并实际执行的命令写入test_command_source=inferred。没有任何可执行测试命令时,创建关联当前release_test_run_id的test_command_missingapproval,test run 进入waiting_user_input,用户补充命令后更新该 test run 的test_command/test_command_source=user_supplied并恢复为queued,用户选择block后才标记 blocked,不能把需求推进到testing_completed。 - 发现问题时先把 Agent 输出的 requirement ID/key 和 repo ID/name 解析到当前 immutable test-run snapshot;daemon 和 service/MCP 写边界都只允许单 repo 推断,多 repo 必须显式指定。MCP 必须把 created-by job 固定为 capability job 并解析它的 active run,service/store 直接路径也必须提供 matching job/run。再原子创建
requirement_bugs、把需求从testing退回pending_development、写 requirement status event 和bug_createdrun event;任一 event failure 回滚 bug 和 workflow。任何 provider result 解析/schema 错误都在一个 transaction 中阻塞 job/test run、失败 run 并写实时/release 诊断。 - Coding Agent 执行 bugfix job:
- 调用
ReopenRequirement。 - 修改 feature worktree。
- 调用
FinishRequirement。
- 调用
- bug 关闭后 release 重新 integrate,重新 test。
req reopen必须原子写 AINative release stale workflow/event;retest coordinator 以 stale workflow 为权威扫描入口,并兼容旧数据中仅 legacy status stale 的 release。
- 无 open bug 且测试通过后,相关需求进入
testing_completed;release 先进入testing_completed,写入active_test_run_id=<当前 passed release_test_run>和release_status_events。随后发布确认流程再把 release 推进到pending_release。 - release test provider 启动前和结束后逐 repo 检查 release worktree;测试前 dirty 或测试过程产生变更时,通过一个 execution-block transaction 阻塞 job/test run、写可用 run event/run failure 和 release 诊断并拒绝测试结果,不自动清理用户文件。
测试:
- release test 通过后需求
workflow_status=testing_completed,releaseworkflow_status=testing_completed,且active_test_run_id指向当前 passed test run。 - release create/test start 可以保存并覆盖 test command,并分别写入
test_command_source=release_default或explicit。 - 全局
agent_default_test_command被使用时写入test_command_source=agent_default;测试 Agent 推断并执行命令时写入test_command_source=inferred。 - release test run 创建时保存 active release 的 requirement+repo+feature commit+release commit 快照。
- test_report artifact 可以作为 release test run summary 保存。
- release test 创建 bug 后需求回 pending_development;MCP bug_create 同时写 status event,强制 event insert failure 时 bug 和 workflow 都回滚。
- release test completion 只接受 testing workflow 和最新 passed test run;同一 completed run 重试幂等,晚到旧 run 不能回退后续状态。
- AINative release scope 或外部 commit 变化标记 stale 时同时写 legacy status、workflow status 和 release event;manual release 兼容路径不进入 AINative workflow。
- requirement submit/repo bindings/初始 event、Agent assignment/status event、pending-development/status event 及 daemon workflow/status event 都必须事务化;测试用 trigger 验证 event 失败时状态回滚。
- 缺少 test command 且无法推断时创建带
release_test_run_id的test_command_missingapproval;用户补充命令后同一 test run 的test_command_source变为user_supplied并重试,用户选择 block 后 test run blocked,不进入 testing_completed。 - bugfix 走 feature 分支,release worktree dirty publish 仍被拒绝。
- release worktree 测试前已 dirty 时 provider 不启动;测试 Agent 产生 dirty 变更时 run/job/test run 被阻塞且不会进入 testing_completed。
- bug 关闭后重新 integrate/test。
验收:
go test ./internal/workspace ./internal/coordinator ./internal/cli -run 'ReleaseTest|Bugfix'通过。
Step 15: 发布状态联动
目标:release publish 成功后,AINative workflow 状态同步为 released。
涉及文件:
internal/workspace/service.gointernal/workspace/ai_release.gointernal/workspace/service_integration_test.go
实施:
- 包装现有
PublishRelease成功路径。 - release 从
testing_completed进入pending_release时,基于active_test_run_id指向的当前 passed test run 创建 release/test-run scopedpublish_confirmationapproval;payload 包含 test run 的 requirement+repo+commit 快照摘要;choice=confirm自动携带confirm=true,缺少 true confirmation 的 approve 保持 pending;approve/cancel/reject response 与 release status event、可用 run event必须在同一 transaction 中提交;用户拒绝时 release 和需求保持pending_release,daemon 不自动重建同一 release/test run 的确认。 release_publish执行前必须校验同一 release 和当前通过的 release test run 存在 approved 且confirm=true的publish_confirmation,当前 active release 的 requirement 集合、repo 集合和每个 requirement+repo 的提交与release_test_run_requirements快照一致,并重新执行现有 dirty guard、external commit 和测试状态 guard。- active release requirements 发布成功并确认 release 代码已合并到目标默认分支
main或master后,将 AINative 需求状态推进:testing_completed -> pending_releasepending_release -> releasingreleasing -> released
- 如果 publish 失败但进入 publish-in-progress,release 进入
publish_in_progress并写release_status_events,需求保持releasing。 - 如果 publish 因 stale 或 requirement+repo+commit 快照不一致阻塞,release 进入
stale或回到pending_testing并创建 test rerun 提示。
测试:
- publish 成功后需求 workflow_status 为 released。
- release workflow 按
testing -> testing_completed -> pending_release -> releasing -> released推进,并且active_test_run_id在testing_completed -> pending_release期间保持指向当前 passed test run。 - publish 成功后目标默认分支包含 release 代码。
- 当前通过的 release test run 没有 approved
publish_confirmation时release_publish被拒绝,需求保持pending_release。 - 当前 active release 的 requirement+repo+commit 快照与 passed test run 快照不一致时
release_publish被拒绝,release 进入 stale 或 pending_testing。 pending_release后如果 release scope 变化、某需求 bugfix 更新 feature commit,或目标默认分支出现外部 commit,release 进入 stale,旧 publish confirmation 不能继续发布。- 用户 reject
publish_confirmation后 release 保持pending_release。 - 用户 reject
publish_confirmation后 daemon 不自动创建重复确认。 - 部分 publish 成功时 release publish-in-progress,需求不标 released。
- stale publish 不覆盖测试状态。
验收:
go test ./internal/workspace -run AINativeRelease通过。
Step 16: 状态展示、实时 watch 和人工确认
目标:让用户和主 Agent 能实时看到进度、阻塞、执行输出摘要和等待确认项。
涉及文件:
internal/cli/root.gointernal/workspace/service.goREADME.mddocs/index.html
实施:
req list/show增加 AINative workflow 状态展示。job list/show展示 attempts、lease、last_error、run 文件。- 新增
job watch <job-key> [--follow],展示 run events、heartbeat、pending approval 和最新 artifact。 - 新增
run tail <run-id> [--follow] [--raw] [--unsafe-unredacted],默认展示结构化 event,--raw读取 stdout/stderr 脱敏尾部,--unsafe-unredacted只允许本地 CLI 显式读取未脱敏尾部。 - 新增
req watch <req> [--follow],聚合需求 workflow、active jobs、最新 run event、pending approvals。 - 新增通用
artifact list --entity-type <requirement|release|release_test_run> --entity-id <id>和artifact show <artifact-id>;保留req artifact create/list/show/finalize作为 requirement entity 的便捷包装。 - 新增
approval list/show/respond,用户可以查看并响应需求澄清、发布确认、测试命令缺失等请求;respond支持--response-json,并提供--final-requirement-design-artifact、--final-technical-design-artifact、--test-command、--confirm、--scope、--expires-at、--sandbox、--approval-policy等 typed shortcut flags。 - 新增
release watch <release> [--follow],聚合 release workflow、release_status_events、test run、requirement+repo+commit 快照、open bug、关联需求状态、pending approvals、最近 run events 和 test_report artifact id/path。 - 新增
release status <release>,展示 release workflow、test run、test_report artifact id/path、open bug 和 pending approval 摘要。 - README 增加 AINative 高级模式示例。
- docs 首页增加高级模式入口。
测试:
- CLI 输出包含 workflow status。
- failed job show 包含 last_error。
- job watch 按 event_seq 展示新增事件。
- req watch 展示 active job 和 pending approval。
- release watch 展示测试 run、
test_command_source、test_report artifact id/path、open bug 和 pending approval。 - release watch 展示 release status event 和 test run requirement+repo+commit 摘要。
workspace artifact list/show可以读取 requirement、release 和 release test run artifact,并拒绝不存在或 entity 不匹配的 artifact。- run tail –raw 默认脱敏,MCP run_tail 不支持未脱敏输出。
- approval respond 会关闭 pending approval 并写结构化响应;方案定稿、测试命令、发布确认和 provider permission 的 typed flags 会写入对应 response 字段,其中 provider permission 必须包含 scope、expires_at、sandbox 和 approval_policy。
- release status 展示 open bug。
- release status 展示 test_report artifact id/path 和
test_command_source。
验收:
go test ./internal/cli -run 'WorkflowStatusOutput|JobShow|JobWatch|ReqWatch|ReleaseWatch|RunTail|Approval|ReleaseTestStatus'通过。
Step 17: 端到端 fake provider 验证
目标:在不依赖真实 Codex/Claude 的测试中跑完整 AINative 流程。
涉及文件:
internal/workspace/service_integration_test.gointernal/coordinator/daemon_test.go
实施:
- 建立临时 bare repo。
req submit。- assign fake analysis/coding/testing agents。
- analysis fake runner 先触发一次需求澄清 approval,job 进入
waiting_user_input。 - 用户 respond 澄清后,service 将原 analysis job 恢复为
queued,下一次 fake analysis run 使用补充后的需求上下文继续。 - analysis fake runner 生成需求设计、技术方案和 Review。
- 创建
artifact_finalizationapproval,用户选择两份终稿 artifact。 - service 关闭 approval 并 finalize 两类 artifact。
PrepareRequirementWorkspace创建 feature worktree,并把需求推进到developing。- development fake runner 修改 repo 文件并完成
req finish。 - development fake runner 输出多条 run event,
job watch可以读到执行过程。 - release integrate。
- testing fake runner 先创建 bug。
- bugfix fake runner reopen 并修复。
- release test 通过。
- 创建
publish_confirmationapproval。 - 用户用
--confirm响应发布确认。 - release publish。
验收:
- 最终 requirement
workflow_status=released。 - 需求底层 completion 为 released。
- E2E 过程中需求经过
analysis_completed、pending_development、developing、development_completed、testing_completed、pending_release、releasing、released。 - E2E 过程中 release workflow 经过
testing_completed、pending_release、releasing、released。 - artifacts 包含分析、开发、测试、bugfix 报告。
- run events 包含分析、开发、测试和 bugfix 的执行过程。
- release test run 包含当前 active release 的 requirement+repo+commit 快照;publish 使用的 test run 等于
active_test_run_id,且该 test run 快照与发布时 requirement 集合、repo 集合和提交一致。 - approval request 曾进入 pending 并被用户响应。
- publish_confirmation 曾进入 pending 并以
confirm=true响应。 - 所有 jobs 为 succeeded 或被后续 retry 成功。
Step 18: 真实 provider smoke
目标:在本机 Codex 可用时验证真实 provider 最小路径。
实施:
- 检查
codex --help。 - 创建临时 workspace home 和简单 repo。
- 配置 Codex analysis Agent。
- 运行一个只读 analysis job,要求只创建 artifact,不改代码。
- 验证 run stdout 和 artifact。
注意:
- 该测试默认不进入常规
go test,使用手动 smoke 命令或环境变量启用。 - Claude smoke 仅在
claude --help可用时执行。
验收:
workspace agent health main-codex可用。- smoke job succeeded。
Step 19: 文档、帮助和兼容性审计
目标:实现完成前确认旧流程和新流程边界清楚。
实施:
- README 明确普通本地流程和 AINative 高级模式。
docs/requirements-planning.md不改写为已实现 AINative,避免误导 v1 用户。- 新增 AINative 文档保持规划或已实现状态同步。
- 所有新增 CLI help 不承诺未完成能力。
- 核对 release publish dirty guard、external commit guard、publish confirmation、active release test snapshot freshness 和 publish-in-progress 重试优先级。
- 全量测试、vet、diff check 通过。
验收:
go test -count=1 ./...通过。go vet ./...通过。git diff --check通过。- 文档中没有占位符、互相矛盾的状态描述或把规划能力写成当前已完成能力的表述。
- publish-in-progress release 的 snapshot mismatch 不会被自动降级为 stale,只返回 manual handling 并等待人工处理。
Step 20: 全面 Review 加固
目标:修复需求元数据、Review 策略、调度、provider 生命周期和本地安全边界的完成度缺口。
实施:
- 新增 migration 0005,保存验收标准、优先级及分析/开发 Review policy 绑定。
- 增加 Review policy CLI/MCP CRUD,并在需求分配 Agent 时校验和绑定策略。
- 将需求澄清中的字段和 repo 更新纳入 approval 原子事务。
- 允许独立配置 parallelism/max_workers,按两者最小值调度;生产 daemon 在 provider run 期间继续轮询其他 pool。
- heartbeat 原子刷新 worker 和 job lease,daemon 使用当前 workspace 二进制绝对路径启动 MCP。
- provider 成功启动后才消费 grant;所有启动后失败路径终止进程并收敛 run/job。
- capability 强制到期;敏感目录和文件使用 0700/0600;raw tail 严格限制单次读取字节数。
- 为每个批次写 Review 记录,并完成全量 test/race/vet/build、built-binary MCP 和真实 Codex smoke。
验收:
- 自定义策略影响分析和开发 Review loop,
no_findings规范化存储。 - clarification 更新要么全部成功,要么全部回滚。
- 长任务运行时其他 pool 的新任务仍能被调度,lease 持续刷新。
- 启动失败不消费 grant,启动后失败不遗留 running run/job。
mcp health返回 33 个工具,capability 无到期时间时拒绝。
Step 21: 长期运行与双 Provider 完整性
- 增加 daemon 单实例持久化 lease、后台 start、真实 status/stop 和实例级 Worker 回收。
- 将 provider 启动后失败的 event/run/job 收敛合并为单一 store 事务,Worker 局部错误不终止 daemon。
- 主 Agent 改用短期 capability file,定时轮换;会话完成后撤销并删除 token。
- requirement priority 参与 job 排序,同时保留阶段内部步骤和 Review 顺序。
- 将 Claude Code 主 Agent、MCP 和 stream-json Worker 纳入正式测试与完成度 gate。
Step 22: Sandbox、Lease 与孤儿 Run 收敛
- daemon 和 CodexRunner 将 Worker 的所有可写 sandbox 配置规范化为当前登记 worktree 内的
workspace-write,permission grant 只读取workspace_policy。 - heartbeat 同时校验未过期 lease、lease owner、Worker current job 和未过期 run-bound token;所有权丢失后取消 Provider 并由 reconciliation 收敛。
- migration 0010 回填历史 workspace policy,并按 job 状态收敛 orphan running run 后建立唯一索引。
- Block、Cancel、resume、retry、approval resume 和新 run 创建复用单 job reconciliation,原子写 run 终态事件、撤销 token 并回收 Worker。
- Provider workspace 逐级拒绝业务 symlink,只允许 macOS 三个固定系统路径别名,并在 Provider 请求启动前复查。
验收:
danger-full-accessAgent 配置或 grant 生成的 Codex 参数只能是workspace-write。- 等于或晚于 lease expiry 的 heartbeat 返回
ErrWorkerOwnershipLost,且 job/Worker/token 均不更新。 - queued、blocked、waiting、succeeded、failed、cancelled 和 lease-expired job 的 running run 都有确定终态和用户可见事件。
- Block/Cancel 任一步失败整体回滚;外部父级、内部和最终组件 symlink 全部拒绝。
Step 23: Lease Capability 与残留所有权收敛
- capability 签发必须与数据库中的 active lease 在同一事务校验,expiry 严格等于 lease expiry;过期、owner 不匹配或已有 active token 时拒绝。
- Retry、Requeue 和 Resume 在更新前断言不存在有效 lease 或 running run;live Job 返回稳定所有权冲突错误。
- heartbeat 必须恰好续期一个当前 run-bound token;Provider 创建 run 前允许唯一 unbound token,其他 token 基数均整体回滚。
- migration 0011 与 daemon recovery 清理 queued/terminal Job 的残留 Worker/token,以及引用不存在 Job 的执行记录。
- active 状态聚合要求 lease 未过期,succeeded run 不写 error,reconciliation 原因只进入 terminal event。
验收:
- lease 过期边界不能签发或续期 capability。
- 对 live Job 的 Retry/Requeue/Resume 不改变 Job、run、Worker 或 token。
- queued Job 即使没有 running run,其残留 Worker/token 也会被收敛。
- heartbeat token 为零个或多个时,lease 和 Worker heartbeat 均保持原值。
- succeeded orphan run 收敛后
error为 NULL。
Step 24: AI Native 开发流程文档与 GitHub Pages 专章
目标:让用户不需要阅读内部实现日志,也能从公开文档完成 AI Native 平台配置,并理解从需求提交到发布的完整运行和恢复流程。
实施:
- 新增
docs/ai-native-development-workflow.md,覆盖角色职责、Agent/Worker/Review policy 配置、完整状态机、分析与开发 Review Loop、release test/bugfix Loop、发布确认、实时观察、artifact、安全边界和故障恢复。 - 为流程指南增加 GitHub Pages layout 和文档页样式,确保 Markdown 生成可直接访问的
ai-native-development-workflow.html。 - 在
docs/index.html新增独立 AI Native workflow 章节,展示角色、六阶段研发闭环、状态链、人工门禁、实时命令和安全恢复约束。 - README、需求方案、首页设计卡和 footer 增加流程指南入口。
- 对 GitHub Pages 首页执行桌面端和移动端响应式检查,修复 sticky header 下的锚点遮挡。
验收:
- 首页 AI Native 章节不是单一链接或能力摘要,包含从
pending_acceptance到released的完整流程。 - 用户能找到需求、release、Job、Run 四层实时观察命令及 approval 响应方式。
- 完整指南明确 release 分支不可直接修复、测试快照漂移、capability/lease 和孤儿 Run 收敛规则。
- 1440px 和 390px viewport 均无页面级横向溢出,移动端锚点标题不被 sticky header 遮挡。
- HTML 标签平衡、Markdown fence 和
git diff --check通过。