init: OpenSpec project scaffolding with proposal, design, specs, tasks

- 7 capabilities: agent-registry, task-router, receipt-protocol,
  forgejo-integration, matrix-chatops, agent-adapter, orchestrator-core
- Tech stack: Rust + axum + zigbuild (single binary)
- Forgejo as task source of truth
- Matrix as real-time ChatOps layer
- Adapter pattern for multi-agent type support
This commit is contained in:
Zer4tul 2026-05-11 14:37:43 +08:00
commit aabd52ed52
19 changed files with 1938 additions and 0 deletions

View file

@ -0,0 +1,52 @@
## ADDED Requirements
### Requirement: Forgejo webhook event ingestion
Orchestrator SHALL 监听 Forgejo webhook 事件Issue 创建/更新/标签变更、PR 创建/更新/合并、Push 等),解析为内部任务事件。
#### Scenario: New issue with agent label
- **WHEN** Forgejo 上创建了新 Issue带有 `agent:code` 标签
- **THEN** Orchestrator SHALL 接收到 `issues` webhook 事件,解析为 `task.created` 事件,提取 Issue 编号、标题、描述、标签、仓库信息
#### Scenario: Issue label changed to trigger assignment
- **WHEN** Issue 的标签从 `agent:code` 变更为 `agent:review`
- **THEN** Orchestrator SHALL 生成 `task.reroute` 事件,重新匹配具备 `review` 能力的 Agent
### Requirement: Task parsing from Issue
Orchestrator SHALL 将 Issue 解析为结构化任务task_id、sourceforgejo issue URL、type由标签推断、priority由 label/milestone 推断、requirementsIssue body、labels。
#### Scenario: Issue with priority label
- **WHEN** Issue 带有 `priority:high` 标签和 `agent:code` 标签
- **THEN** 解析出的任务 SHALL 包含 `priority: "high"``type: "code"`
### Requirement: Agent matching and assignment
Task Router SHALL 根据任务类型、所需能力、Agent 负载和在线状态,将任务分配给最合适的 Agent。
#### Scenario: Match by capability and load
- **WHEN** 一个 `code:typescript` + `review` 类型的任务需要分配
- **THEN** Task Router SHALL 选择声明了对应能力、当前并发任务数未达上限、且状态为 `online` 的 Agent
#### Scenario: No matching agent available
- **WHEN** 没有在线 Agent 满足任务所需能力
- **THEN** 任务 SHALL 进入 `queued` 状态Task Router SHALL 通过 Matrix 通知人工介入
### Requirement: Task lifecycle management
任务 SHALL 具有明确的生命周期状态:`created``assigned``running``completed` / `failed` / `agent_lost`
#### Scenario: Task completes successfully
- **WHEN** Agent 通过 receipt 协议报告任务完成
- **THEN** 任务状态 SHALL 变更为 `completed`Issue 标签 SHALL 更新为 `status:done`
#### Scenario: Task fails with error
- **WHEN** Agent 报告任务失败,附带错误信息
- **THEN** 任务状态 SHALL 变更为 `failed`Issue comment SHALL 写入错误摘要Task Router SHALL 根据策略决定重试或升级
### Requirement: Manual task assignment
人类 SHALL 能通过 Matrix slash command 或 Forgejo Issue comment 手动指定任务分配给特定 Agent。
#### Scenario: Manual assignment via Matrix
- **WHEN** 人类在 Matrix 发送 `/assign @worker-03 issue#42`
- **THEN** Task Router SHALL 将 Issue #42 分配给 agent_id 为 `worker-03` 的 Agent无论自动匹配结果
#### Scenario: Manual assignment via Issue comment
- **WHEN** 人类在 Issue #42 评论 `/assign worker-03`
- **THEN** 效果同上