## ADDED Requirements ### Requirement: Git branch as task execution unit 每个任务 SHALL 关联一个 Git 分支。Agent 在该分支上工作,通过 PR 提交结果。分支命名约定:`task/{task_id}`(例如 `task/org%2Frepo%2342`)。 #### Scenario: Agent creates branch for task - **WHEN** Agent 领取任务 org/repo#42 - **THEN** Agent SHALL 在目标仓库创建分支 `task/org%2Frepo%2342`(基于 master/main) #### Scenario: Agent pushes commits to task branch - **WHEN** Agent 执行过程中产生代码变更 - **THEN** Agent SHALL 推送 commit 到对应的 task 分支 ### Requirement: PR webhook as completion notification Agent 完成任务后 SHALL 在 Forgejo 创建 Pull Request。Forgejo 的 PR webhook 触发 Orchestrator 状态更新,替代不可靠的直接通知。 #### Scenario: Agent creates PR → Orchestrator receives webhook - **WHEN** Agent 为任务 org/repo#42 创建 PR - **AND** Forgejo 触发 `pull_request.opened` webhook - **THEN** Orchestrator SHALL 收到 webhook,识别 PR 标题或分支名中的 task_id - **AND** 将任务状态更新为 `review_pending`(等待 receipt 验证) #### Scenario: PR merged → receipt auto-validated - **WHEN** PR 被 merge - **AND** Forgejo 触发 `pull_request.merged` webhook - **THEN** Orchestrator SHALL 自动将任务状态转为 `completed`,生成 receipt - **AND** 在对应 Issue 添加评论:`✅ Task completed — PR #15 merged` ### Requirement: Task branch and PR naming convention Orchestrator SHALL 在任务详情中返回预期的分支名和 PR 标题格式,供 Agent 使用。 #### Scenario: Task detail includes branch info - **WHEN** Agent 查询 `GET /api/v1/tasks/org/repo#42` - **THEN** 返回 JSON SHALL 包含 `branch_name` 和 `pr_title` 字段 - **AND** `branch_name` 格式为 `task/{url_encoded_task_id}` - **AND** `pr_title` 格式为 `feat: {issue_title} (#{issue_number})` ### Requirement: Push events as progress tracking Forgejo push webhook SHALL 作为 Agent 工作进度的间接信号。 #### Scenario: Agent pushes to task branch - **WHEN** Forgejo 触发 `push` webhook,目标分支匹配 `task/*` 模式 - **THEN** Orchestrator SHALL 记录该 push 事件作为任务进度信号 - **AND** 更新任务的 `last_activity_at` 时间戳