Compare commits
35
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a7f8755ce | ||
|
|
9e9856f652 | ||
|
|
77f906ed8f | ||
|
|
ec8a39b39d | ||
|
|
51f82d5d4f | ||
|
|
dad5556181 | ||
|
|
1f2f3d6a58 | ||
|
|
47c57eee6b | ||
|
|
1165b28d5f | ||
|
|
bf1b592071 | ||
|
|
d8ba8dba3c | ||
|
|
d7e0a683c9 | ||
|
|
de3bff6d6d | ||
|
|
63e66c6fb3 | ||
|
|
2b5bcffcef | ||
|
|
f9f09a5440 | ||
|
|
90b0a6498d | ||
|
|
c60ccfe285 | ||
|
|
db3ec5d6e3 | ||
|
|
2ee2b495ca | ||
|
|
1950ab2cb1 | ||
|
|
68be691e13 | ||
|
|
306836006f | ||
|
|
ee66bd009a | ||
|
|
54955c9d1a | ||
|
|
10f9a8b9c3 | ||
|
|
9f7658515c | ||
|
|
e217929ccd | ||
|
|
5ab034eb53 | ||
|
|
20290d0379 | ||
|
|
457bea8591 | ||
|
|
b6965eb0f3 | ||
|
|
2b901a61de | ||
|
|
7440ded8f4 | ||
|
|
83c6a12aaf |
@@ -18,6 +18,8 @@
|
||||
|
||||
| owner | task | branch | worktree | mutex | status |
|
||||
|---|---|---|---|---|---|
|
||||
| Cursor | coordination-db-daemon-impl-plan-2026-09-23 | feature/coordination-db-daemon-impl-plan-2026-09-23 | .worktrees/coordination-db-daemon-impl-plan-2026-09-23 | coordination-db-daemon-impl-plan | done |
|
||||
| Cursor | coordination-db-daemon-2026-09-23 | feature/coordination-db-daemon-2026-09-23 | .worktrees/coordination-db-daemon-2026-09-23 | coordination-db-daemon | done |
|
||||
| Cursor | integrate-pi-runner-response-size-r2-2026-09-23 | feature/integrate-pi-runner-response-size-2026-09-23 | .worktrees/integrate-pi-runner-response-size-2026-09-23 | git:dev | done |
|
||||
| Cursor | modular-decouple-residual-b-2026-09-23 | feature/modular-decouple-residual-2026-09-23 | .worktrees/modular-decouple-residual-2026-09-23 | modular-decouple-residual | done |
|
||||
| Cursor | modular-refactor-impl-plan-2026-09-23 | feature/modular-refactor-impl-plan-2026-09-23 | .worktrees/modular-refactor-impl-plan-2026-09-23 | docs-remediation-modular-impl-plan | done |
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
---
|
||||
title: "协调库与 daemon:现状核查与边界核对"
|
||||
created: 2026-09-23
|
||||
owner: Cursor
|
||||
task_id: coordination-db-daemon-2026-09-23
|
||||
policy_revision: "agent-governance-2026-09-21-r1 @ 63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344"
|
||||
review_state: pending
|
||||
integration_state: pending
|
||||
deployment: not_required
|
||||
cleanup: pending
|
||||
remote_sync: not_requested
|
||||
status: done
|
||||
confidence: high
|
||||
---
|
||||
|
||||
# 调研:协调库与 daemon 现状核查
|
||||
|
||||
## 范围与授权
|
||||
|
||||
- 用户目标:在本仓库重新落地「协调库 + daemon」方案与研究记录;L1 保持单宿主机,跨机 PostgreSQL 仅登记为 planned 的 L2(需二次授权与 ADR)。并行授权修掉 `agentctl queue` 子解析器重复注册缺陷。
|
||||
- 允许写路径(本调研):`.doc`(只读采样代码与 `.locks` 运行态)。
|
||||
- 交付终点:可审的研究记录 + 配套方案;不实施 daemon/PostgreSQL,不改产品业务代码。
|
||||
- 非目标:跨机 HA 实施、OS 沙箱、产品容器依赖式协调。
|
||||
|
||||
## 结论
|
||||
|
||||
1. `.locks/state.sqlite` 已是本机协调权威库(11 表;采样时 tasks≈105、runs≈653、events≈1406),不是「部分状态」;`scripts/agentctl.py` 已 enforced scope / lease / CAS / 收据 / 候选准入 / `--ff-only`。
|
||||
2. 真正缺口是:显式长期 claim、常驻监管入口、策略外部化、CURRENT/MATRIX 稳定 record id;`queue`/`jobs` 在修复前因 CLI 缺陷恒为 0 行(已由 `63e66c6f` 修复 parser)。
|
||||
3. 跨机 + 独立 PostgreSQL + systemd 与 [2026-09-21 锁方案](../../remediation/2026-09-21-agent-lock-coordination-plan.md) §3.2 及 [平台深化方案](../../remediation/2026-09-23-platform-deepening-reliability-ha-concurrency-plan.md) §0 冲突,只能作为 L2 planned,开工前另立 ADR。
|
||||
|
||||
## 证据
|
||||
|
||||
| 项 | 路径/命令 | 结果 |
|
||||
|----|-----------|------|
|
||||
| 权威库存在 | `.locks/state.sqlite`(gitignore:33;dockerignore:24) | 存在;`sqlite3 -readonly … ".tables"` → deployments/documents/events/freezes/jobs/projections/queue_items/receipts/runs/tasks/validations |
|
||||
| 行数采样(2026-09-23) | `sqlite3 -readonly .locks/state.sqlite` 计数 | tasks 105;runs 653;events 1406;queue_items 0;jobs 0 |
|
||||
| 无 Go agentctl | `cmd/` 列表 | 无 `cmd/agentctl`;协调 100% Python |
|
||||
| scope/lease | `scripts/agentctl.py:27` `SHARED_DOCS`;`:589` `class Lease`;`:554+` `check_resources` | 已实现;header 声明 cooperative/advisory |
|
||||
| 文档 CAS | `docs apply` `:856`;收据 `:954`;hook `:1057-1064` | 已 enforced(相对受控入口) |
|
||||
| 候选准入 | `admit_candidate` `:1066`;`integrate` `--ff-only` | 已 enforced |
|
||||
| queue 缺陷(修复前) | 曾于 `:1613` 与 `:1629` 双重 `add_parser('queue')` | 后注册覆盖先注册;handler 读 `args.head`/`args.drain`/`args.task` |
|
||||
| queue 修复 | 合入 `63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344` | 仅保留一处注册(现 `:1613`);回归测试 3 例;全套 unittest 103/2 skipped PASS |
|
||||
| 策略 YAML | `configs/agent-governance.yaml` | **不存在**;策略硬编码于 `agentctl.py` / `agentctl_w4.py` |
|
||||
| 常驻服务 | `find` `*.service`/`*.plist`;compose 无 agentctl | **0 个**;`queue schedule`/`deploy run-loop` 均为前台调用 |
|
||||
| 主机 | `uname -s` | Darwin(macOS);systemd 不能作为本机 L1 默认 |
|
||||
| 孤儿实现 | `scripts/agentctl_automation.py` | 零导入;schema 含 `operations`/`doc_registry`,活库无这两表 |
|
||||
| 孤儿文件 | `.locks/state.db` | 0 字节;代码无引用 |
|
||||
| 既有方案 | `.doc/remediation/2026-09-21-agent-lock-coordination-plan.md` | planned;推荐本机 SQLite,明确拒绝产品 PG/跨机锁服务(本期) |
|
||||
| INDEX 缺口 | `.doc/remediation/INDEX.md` | 未索引 2026-09-21 锁方案 |
|
||||
| CURRENT 矛盾 | `.doc/ops/CURRENT.md:5` vs `:15` | 分别写 macOS 租约可用 / 不可用 |
|
||||
| 操作规范过时 | `.doc/ops/2026-09-21-agent-worktree-workflow.md:3` | 仍写「Linux 本机」;W1-B macOS 已 done |
|
||||
| 不存在的摘要产物 | `3f14d7fa`;`2026-09-23-coordination-db-daemon-*.md`(合入前) | 对象名无效;路径不存在;本轮为重新落地 |
|
||||
|
||||
## 边界冲突核对
|
||||
|
||||
| 主张 | 权威来源 | 处置 |
|
||||
|---|---|---|
|
||||
| 跨机锁服务 / 产品 PG 协调 | 锁方案 §3.2「当前不采用」 | L2 planned;另立 ADR 前不开工 |
|
||||
| HA=单宿主机 | 平台深化方案 §0(用户确认) | L1 遵守;跨机不在深化方案范围内 |
|
||||
| L1 不宣称 OS 沙箱 | 操作规范 `:5`;`agentctl.py:2` | 方案全文保持 advisory |
|
||||
| systemd 作为非容器运行方式 | 仓库无 unit;主机 Darwin | L1=launchd;systemd 仅 L2 Linux 中央主机 |
|
||||
|
||||
## 机制核验(官方语义,推论)
|
||||
|
||||
- SQLite 短事务可原子完成多资源冲突检查,但不能装入多小时开发。
|
||||
- flock 与打开 fd 绑定;TTL 到期不等于进程已停写。
|
||||
- 两次 Markdown rename + SQLite 不是跨介质原子事务;发布边界仍是 Git 提交。
|
||||
- argparse 同名子解析器后注册覆盖先注册(本轮缺陷根因)。
|
||||
|
||||
## 开放问题
|
||||
|
||||
- L2 ADR 的 RPO/RTO、中央主机拓扑与凭证边界待二次授权。
|
||||
- `agentctl_automation.py` 收敛或删除的独立实施批次尚未认领。
|
||||
- FEATURE-MATRIX 27 行稳定 record id 迁移策略(additive vs 一次性改表)待 U6 开工前确认。
|
||||
|
||||
## 建议动作
|
||||
|
||||
1. 合入本调研与配套方案(docs-only)。
|
||||
2. 按方案 U1–U7 另立实施 short-term;U1 剩余项(automation 归一、state.db 清理)在 queue 修复之后继续。
|
||||
3. L2 仅登记,不排期。
|
||||
|
||||
## 状态与交接
|
||||
|
||||
- 被审 SHA:`63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344`(含 queue 修复)。
|
||||
- 本文件状态 `done` 指调研可审,不代表方案已实施。
|
||||
- 配套方案:[协调库与 daemon 方案](../../remediation/2026-09-23-coordination-db-daemon-plan.md)。
|
||||
- 任务主记录:[short-term](../short-term/2026-09-23-coordination-db-daemon.md)。
|
||||
@@ -64,7 +64,5 @@ prelim 常 `author_id=0`(unmanaged duties → 无认领/编辑)。冲突用
|
||||
|
||||
## CURRENT 同步说明
|
||||
|
||||
- `docs(@document)` 收记录在 closeout tip `e9a9ce97`(含 DOCREV PASS 焦点行)。
|
||||
- 合入 local_dev 的 merge `437cee84` 以第二父带上该 tip,但 merge 树未带上 CURRENT 正文(曾误用 ours)。
|
||||
- **cleanup_pending**:持 `docs:admin` 的执行者对 local_dev 基线再跑一次 `@document` apply 后 `--no-ff` 合入,或从 `e9a9ce97` 重放 CURRENT。
|
||||
- audit/remediation/账本已在 local_dev `ddcb63cd`/`437cee84`。
|
||||
- 曾误用 ours merge 丢掉 CURRENT 焦点;后由 closeout `docs:admin` 重放并合入 local_dev(`c24e1548` → MATRIX 收口 `8f0e31e5`)。
|
||||
- audit/remediation/密封账本与 DOCREV PASS 焦点已在 local_dev;本 worktree 仅保留短文备忘。
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: "freeform project_id BIGINT 对齐 projects.id"
|
||||
task_id: "freeform-project-id-bigint-2026-09-22"
|
||||
status: done
|
||||
created: 2026-09-22
|
||||
owner: Cursor
|
||||
task_type: implementation
|
||||
branch: feature/freeform-project-id-bigint-2026-09-22
|
||||
worktree: .worktrees/freeform-project-id-bigint-2026-09-22
|
||||
write_scope: ["deploy/postgres/goose", "internal/freedoc", "internal/server", ".doc"]
|
||||
allowed_environments: ["dev"]
|
||||
mutex: "deploy/postgres/goose + freeform"
|
||||
---
|
||||
|
||||
# freeform project_id BIGINT
|
||||
|
||||
## 问题
|
||||
`POST /api/v1/freeform-documents` 在雪花 `project_id`(>int4 max)时 pgx 编码失败(OID 23),阻塞 UI-11 附件注册。
|
||||
|
||||
## 修复
|
||||
- goose `00063`:`freeform_documents.project_id` → BIGINT
|
||||
- Go `ProjectID`/`ListDocuments` → int64;list query 用 `ParseInt`
|
||||
- 活库已手工 ALTER(schema 仍报 61);合入后 goose 幂等加固
|
||||
|
||||
## 验证
|
||||
- `go test ./internal/freedoc/ -short` PASS(含 snowflake 回归)
|
||||
- 活库 column = bigint
|
||||
@@ -0,0 +1,89 @@
|
||||
---
|
||||
title: "Worktree 收口:docs 增量合入与清理"
|
||||
task_id: "closeout-worktrees-2026-09-23"
|
||||
status: done
|
||||
created: 2026-09-23
|
||||
updated: 2026-09-23
|
||||
owner: Cursor
|
||||
task_type: ops
|
||||
task_tier: medium
|
||||
policy_revision: "agent-governance-2026-09-21-r1 @ cc91c217e7c0e4732de3923d0fa229fd4bd65798"
|
||||
branch: feature/closeout-worktrees-2026-09-23
|
||||
worktree: .worktrees/closeout-worktrees-2026-09-23
|
||||
base_dev_sha: "cc91c217e7c0e4732de3923d0fa229fd4bd65798"
|
||||
head_sha: "de3bff6d6d40376b1a248393e3f2c3e8b1ddb1d9"
|
||||
write_scope: [".doc"]
|
||||
allowed_environments: []
|
||||
mutex: "git:dev+worktree-cleanup"
|
||||
review_state: done
|
||||
integration_state: merged_to_local_dev
|
||||
deployment: n/a
|
||||
cleanup: pending
|
||||
cleanup_owner: "独立维护者(Cursor extension-host 仍占用若干 cwd)"
|
||||
cleanup_trigger: "占用进程退出后按 agent-worktree remove 复查"
|
||||
remote_sync: not_requested
|
||||
---
|
||||
|
||||
# Worktree 收口:docs 增量合入与清理
|
||||
|
||||
## 用户目标
|
||||
|
||||
检查所有 worktree 分支;推进并完成可合入的 docs 增量;验证通过后合入 `dev` 并清理 worktree。避开并行 `task-bubble-bind` 系列;不 push。
|
||||
|
||||
## 结果摘要
|
||||
|
||||
| 项 | 值 |
|
||||
|---|---|
|
||||
| 合入 tip | `de3bff6d`(随后 local_dev 由并行会话前进到含本 tip 的祖先链) |
|
||||
| 验证 | `EMPTY_NON_DOC=OK`;freedoc `go vet`/`go test -short` PASS;parent1=冻结 D |
|
||||
| agentctl close | 47 个 active→done;1 失败(`integrate-intent-smalltalk` WORKTREE_MISMATCH/detached) |
|
||||
| worktree | 约 78 → 22;本任务成功 remove ≥67;其余 cleanup_pending |
|
||||
| remote_sync | pending(用户未授权 push;local_dev 领先 origin/dev) |
|
||||
|
||||
## 合入内容(相对冻结 D=`63e66c6f` 后重建候选)
|
||||
|
||||
仅 `.doc` 增量(代码树与 D 逐 blob 一致):
|
||||
|
||||
- short-term:closeout 任务文、freeform BIGINT 任务文、docrev 备忘、promote-fix-latest-upload 证据
|
||||
- test-reports:promote-fix-latest-upload 报告 + promotion-receipts `30fa4e88…`
|
||||
|
||||
冲突策略执行记录:
|
||||
|
||||
- CURRENT / FEATURE-MATRIX:取 ours(保留并行会话 local_dev 现状;user-profile CURRENT 行未写入)
|
||||
- freeform 三处 Go 冲突:取 ours(等价功能已在 `3bdd53ae`)
|
||||
|
||||
## 特殊残留处置
|
||||
|
||||
| 项 | 处置 |
|
||||
|---|---|
|
||||
| docrev 锁文件 | 已删 |
|
||||
| `canonical-ui00-13a-pass.json` sha256=`dd83d656…f287` | 报告未引用;已删 |
|
||||
| `sealed-ledger-main-20260922T195858Z.json` sha256=`31ed8a36…44be` | 正式密封账本已在 dev;已删 |
|
||||
| integrate-user-profile-display-current 脏 CURRENT | 与 20290d03 行等价;checkout 丢弃后 worktree 已 remove |
|
||||
|
||||
## cleanup_pending(不强制)
|
||||
|
||||
进程仍占用 cwd(Cursor extension-host 等):
|
||||
|
||||
- `2026-09-23-user-profile-display`、`agentctl-macos-2026-09-22`、`dialogue-current-time-2026-09-23`、`engine-split-2026-09-22`、`fix-latest-upload-summary-2026-09-23`、`g1-exception-clearance-2026-09-22`、`intent-smalltalk-routing-2026-09-23`、`loading-perf-closeout-2026-09-22`、`modular-decouple-residual-2026-09-23`、`pi-runner-response-size-2026-09-23`、`integrate-pi-runner-response-size-2026-09-23`、`promote-fix-latest-upload-test-2026-09-23`
|
||||
|
||||
非 dev 祖先 / 并行会话保留:
|
||||
|
||||
- `promote-dialogue-current-time-test-2026-09-23`(test 祖先,脚本仅认 dev)
|
||||
- `task-bubble-bind` / `integrate-task-bubble-bind` / `promote-task-bubble-bind-test`(用户要求避开)
|
||||
- `coordination-db-daemon*`(并行会话现场)
|
||||
- 本任务 `closeout-worktrees` / `integrate-closeout-worktrees`(收口文档提交后再清)
|
||||
|
||||
## 明确未做
|
||||
|
||||
- 未 push;未晋升 test/main;未强制 `--force`/`-D`;未改 task-bubble 现场。
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 创建 worktree + 登记任务
|
||||
2. [x] 写本任务文档并提交
|
||||
3. [x] integrate 候选:串行 merge 六分支 + 单次 `--no-ff` 重建(dev 被并行推进后重验)
|
||||
4. [x] validate + integrate → `de3bff6d`
|
||||
5. [x] agentctl task close(跳过 task-bubble / coordination)
|
||||
6. [x] 分批清理;ignored 可再生现场清后重试;进程占用记 pending
|
||||
7. [x] 特殊残留处理 + 本收口更新
|
||||
@@ -0,0 +1,68 @@
|
||||
---
|
||||
title: "协调库与 daemon:实施承接计划落地"
|
||||
task_id: coordination-db-daemon-impl-plan-2026-09-23
|
||||
status: done
|
||||
created: 2026-09-23
|
||||
updated: 2026-09-23
|
||||
owner: Cursor
|
||||
task_type: research
|
||||
task_tier: multi_stage
|
||||
policy_revision: "agent-governance-2026-09-21-r1 @ 1f2f3d6a58d153e6a7809943d2f3383b9c620085"
|
||||
branch: feature/coordination-db-daemon-impl-plan-2026-09-23
|
||||
worktree: .worktrees/coordination-db-daemon-impl-plan-2026-09-23
|
||||
base_dev_sha: "1f2f3d6a58d153e6a7809943d2f3383b9c620085"
|
||||
write_scope: [".doc"]
|
||||
allowed_environments: []
|
||||
head_sha: "dad5556181e3e0bf87f4e3c0471dc06635f293d2"
|
||||
mutex: coordination-db-daemon-impl-plan
|
||||
review_state: approved
|
||||
integration_state: merged
|
||||
deployment: not_required
|
||||
cleanup: pending
|
||||
cleanup_owner: "独立维护者"
|
||||
cleanup_trigger: "合入 local_dev 且无进程占用后复查"
|
||||
remote_sync: not_requested
|
||||
---
|
||||
|
||||
# 协调库与 daemon:实施承接计划落地
|
||||
|
||||
## 用户目标与授权
|
||||
|
||||
- 用户目标:为协调库/daemon 设计方案制定可直接开工的实施承接计划(工作包预填)。
|
||||
- 授权:docs-only;不实施 U1r–U6 代码;不 push。
|
||||
- 交付终点:承接计划 + 本任务文 + INDEX;合入 local_dev。
|
||||
- 禁止:装载 daemon、改 FEATURE-MATRIX 状态值、跨机实施、晋升 test/main。
|
||||
|
||||
## 范围与非目标
|
||||
|
||||
- 允许写入:`.doc`(remediation / ops/short-term / INDEX / CURRENT 本人行)。
|
||||
- 非目标:七包代码实施(各包另立 short-term 并满足承接计划开工准入)。
|
||||
|
||||
## 步骤与验收
|
||||
|
||||
1. [x] 创建 worktree 并登记 — `base_dev_sha=1f2f3d6a…`
|
||||
2. [x] CURRENT 认领 — `docs apply` request `…-claim-1`
|
||||
3. [x] 写承接计划 — [2026-09-23-coordination-db-daemon-implementation-undertaking-plan.md](../../remediation/2026-09-23-coordination-db-daemon-implementation-undertaking-plan.md)
|
||||
4. [x] 更新 remediation INDEX
|
||||
5. [x] docs-only 验收(链接/锚点抽查/frontmatter)
|
||||
6. [x] 候选 validate + integrate — merge tip `51f82d5d…`(expected_dev `1f2f3d6a…`)
|
||||
|
||||
## 验证与证据
|
||||
|
||||
| 范围 / 被测 SHA | 命令与环境 | 预期 | 实际 / 判定 | 证据 |
|
||||
|---|---|---|---|---|
|
||||
| 承接计划 `dad55561` / 候选 `51f82d5d` | 相对链接 + 锚点行号抽查 | PASS | PASS | 候选 validate |
|
||||
| INDEX / CURRENT | 行存在且回链设计方案 | PASS | PASS | 合入 diff |
|
||||
|
||||
## 收口与交接
|
||||
|
||||
- review_state=approved;integration_state=merged(local_dev `51f82d5d`);deployment=not_required;remote_sync=not_requested;cleanup=pending。
|
||||
- cleanup_owner=独立维护者;复查触发=无进程占用且 tip 为 local_dev 祖先后 remove。
|
||||
- 后续按承接计划 W1-U1r / W1-U2 / W1-U3 另立 short-term 实施(需满足 §5–§6 开工准入)。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- [实施承接计划](../../remediation/2026-09-23-coordination-db-daemon-implementation-undertaking-plan.md)
|
||||
- [设计方案](../../remediation/2026-09-23-coordination-db-daemon-plan.md)
|
||||
- [研究](../research/2026-09-23-coordination-db-daemon-research.md)
|
||||
- 本承接计划合入 tip:`51f82d5d4ff482574d6b3b1f54682c87999433ae`
|
||||
@@ -0,0 +1,70 @@
|
||||
---
|
||||
title: "协调库与 daemon:方案与研究落地"
|
||||
task_id: coordination-db-daemon-2026-09-23
|
||||
status: done
|
||||
created: 2026-09-23
|
||||
updated: 2026-09-23
|
||||
owner: Cursor
|
||||
task_type: research
|
||||
task_tier: multi_stage
|
||||
policy_revision: "agent-governance-2026-09-21-r1 @ 63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344"
|
||||
branch: feature/coordination-db-daemon-2026-09-23
|
||||
worktree: .worktrees/coordination-db-daemon-2026-09-23
|
||||
base_dev_sha: "63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344"
|
||||
write_scope: [".doc"]
|
||||
allowed_environments: []
|
||||
head_sha: "d7e0a683c9b4af304d5ed8352e5abce3d35c6bef"
|
||||
mutex: coordination-db-daemon
|
||||
review_state: approved
|
||||
integration_state: merged
|
||||
deployment: not_required
|
||||
cleanup: pending
|
||||
cleanup_owner: "独立维护者"
|
||||
cleanup_trigger: "合入 local_dev 且无进程占用后复查"
|
||||
remote_sync: not_requested
|
||||
---
|
||||
|
||||
# 协调库与 daemon:方案与研究落地
|
||||
|
||||
## 用户目标与授权
|
||||
|
||||
- 用户目标:统一认领/状态/执行入口;文档状态化;为多主机预留结构;先落地方案文档。
|
||||
- 授权:docs-only 重新落地方案+研究;L1 单宿主机、L2 跨机仅 planned;并行修掉 queue 子解析器缺陷(已合入 `63e66c6f`)。
|
||||
- 交付终点:可审的 remediation + research + 本任务文;合入 local_dev;不 push。
|
||||
- 禁止:实施 daemon/PostgreSQL;改产品代码;操作未授权环境;晋升 test/main。
|
||||
|
||||
## 范围与非目标
|
||||
|
||||
- 允许写入:`.doc`(remediation / ops/research / ops/short-term / remediation INDEX / CURRENT 本人行)。
|
||||
- 非目标:U2–U7 代码实施;L2 ADR 以外的跨机工程;FEATURE-MATRIX 状态值变更。
|
||||
|
||||
## 步骤与验收
|
||||
|
||||
1. [x] 创建 worktree 并登记 — `base_dev_sha=63e66c6f…`
|
||||
2. [x] CURRENT 认领行 — `docs apply` request `coordination-db-daemon-2026-09-23-claim-1`
|
||||
3. [x] 写 research — [2026-09-23-coordination-db-daemon-research.md](../research/2026-09-23-coordination-db-daemon-research.md)
|
||||
4. [x] 写 plan(U1 回填 queue 修复 SHA)— [2026-09-23-coordination-db-daemon-plan.md](../../remediation/2026-09-23-coordination-db-daemon-plan.md)
|
||||
5. [x] 更新 remediation INDEX(含补登 2026-09-21 锁方案)
|
||||
6. [x] docs-only 验收(链接/taxonomy/frontmatter)
|
||||
7. [x] 候选 validate + integrate 合入 local_dev — merge tip `d8ba8dba…`(expected_dev `de3bff6d…`)
|
||||
|
||||
## 验证与证据
|
||||
|
||||
| 范围 / 被测 SHA | 命令与环境 | 预期 | 实际 / 判定 | 证据 / 脱敏说明 |
|
||||
|---|---|---|---|---|
|
||||
| queue 修复 `63e66c6f` | `python3 -B -m unittest discover -s scripts/tests -p 'test_*.py' -v` | 全绿 | 103 ran / 2 skipped / OK | 任务 A 候选 validate |
|
||||
| 本任务文档 `d7e0a683` / 候选 `d8ba8dba` | 相对链接 + taxonomy + INDEX | PASS | PASS | 候选 validate 脚本 |
|
||||
|
||||
## 收口与交接
|
||||
|
||||
- review_state=approved;integration_state=merged(local_dev `d8ba8dba`);deployment=not_required;remote_sync=not_requested;cleanup=pending。
|
||||
- cleanup_owner=独立维护者;复查触发=无进程占用且 tip 为 local_dev 祖先后 remove。
|
||||
- 后续实施按方案 U1 剩余项 / U2–U7 另立 short-term;L2 需二次授权与 ADR。
|
||||
|
||||
## 相关链接
|
||||
|
||||
- [方案](../../remediation/2026-09-23-coordination-db-daemon-plan.md)
|
||||
- [研究](../research/2026-09-23-coordination-db-daemon-research.md)
|
||||
- [既有锁方案](../../remediation/2026-09-21-agent-lock-coordination-plan.md)
|
||||
- queue 修复合入 tip:`63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344`
|
||||
- 本方案合入 tip:`d8ba8dba3c068ee948a84c742918710924b08e74`
|
||||
@@ -0,0 +1,57 @@
|
||||
---
|
||||
title: "晋升 latest-upload summary + parse-wait 至 test"
|
||||
task_id: promote-fix-latest-upload-test-2026-09-23
|
||||
status: done
|
||||
created: 2026-09-23
|
||||
updated: 2026-09-23
|
||||
owner: Cursor
|
||||
task_type: ops
|
||||
task_tier: multi_stage
|
||||
policy_revision: "AGENTS+worktree-ops @ 30fa4e88"
|
||||
branch: feature/promote-fix-latest-upload-test-2026-09-23
|
||||
worktree: .worktrees/promote-fix-latest-upload-test-2026-09-23
|
||||
base_dev_sha: "30fa4e88b21ddc918a4f408a13ef4d2c2d5acd6e"
|
||||
head_sha: "54955c9d1a61f671556508ab7c89db088aaef7d7"
|
||||
write_scope: [".", ".doc/"]
|
||||
allowed_environments: ["test"]
|
||||
mutex: git:test+env:test
|
||||
review_state: not_required
|
||||
integration_state: merged_local_test
|
||||
deployment: test_ok
|
||||
cleanup: pending
|
||||
cleanup_owner: 独立维护者
|
||||
cleanup_trigger: tip 为 local_dev/origin 祖先且无进程占用后 remove
|
||||
remote_sync: not_requested
|
||||
---
|
||||
|
||||
# 晋升 latest-upload summary + parse-wait 至 test
|
||||
|
||||
## 用户目标与授权
|
||||
|
||||
- 用户目标:合入 test,便于人工实测「总结刚刚上传的文档」与 MinerU 解析等待。
|
||||
- 授权来源:用户明确「合入 test,我来进行实际测试」(dev→local test;未要求 push/main)。
|
||||
- 交付终点:local `test` 含功能祖先、rc tag、pinned 镜像 recreate、`:8081` health。
|
||||
- 禁止:不晋升 main;不 push;不删 Volumes。
|
||||
|
||||
## 结果
|
||||
|
||||
- local `test@54955c9d` + `rc-v1.1.0-beta.3`
|
||||
- 含 `30fa4e88`(local_dev tip)与实现祖先 `f6e14f97`
|
||||
- test `:8081` schema_version=65;ready ok;pinned app digest `ba834cb1…`
|
||||
- 报告:[../../test-reports/2026-09-23-promote-fix-latest-upload-test-report.md](../../test-reports/2026-09-23-promote-fix-latest-upload-test-report.md)
|
||||
|
||||
## 步骤
|
||||
|
||||
1. [x] 登记 promote 任务 / worktree(基线 test@e217929c)
|
||||
2. [x] candidate images + PASS receipt(`30fa4e88` suite=`scoped-latest-upload-summary`)
|
||||
3. [x] merge local_dev → promote tip(CURRENT/FEATURE-MATRIX 保留 test 侧,走 docs apply 通道外)
|
||||
4. [x] `agentctl validate` 聚焦 go test + arch-check
|
||||
5. [x] 推进 local `test` + `rc-v1.1.0-beta.3`;apply pin;`env-service.sh test rebuild`
|
||||
6. [x] health/ready 冒烟
|
||||
|
||||
## 验收标准
|
||||
|
||||
- [x] `test` 含 latest-upload summary / parse-wait 祖先
|
||||
- [x] `:8081` `/health` `/ready` ok,schema_version≥64
|
||||
- [x] 运行镜像 digest 与 receipt pin 一致
|
||||
- [ ] 人工:上传 PDF →「总结我刚刚上传的文档」可见 `document_parsing` / 总结结果(用户实测)
|
||||
+200
@@ -0,0 +1,200 @@
|
||||
---
|
||||
title: "协调库与 daemon · 实施承接计划(工作包预填)"
|
||||
status: planned
|
||||
created: 2026-09-23
|
||||
updated: 2026-09-23
|
||||
owner: Cursor
|
||||
task_id: coordination-db-daemon-impl-plan-2026-09-23
|
||||
task_type: research
|
||||
task_tier: multi_stage
|
||||
policy_revision: "agent-governance-2026-09-21-r1 @ 1f2f3d6a58d153e6a7809943d2f3383b9c620085"
|
||||
branch: feature/coordination-db-daemon-impl-plan-2026-09-23
|
||||
worktree: .worktrees/coordination-db-daemon-impl-plan-2026-09-23
|
||||
base_dev_sha: "1f2f3d6a58d153e6a7809943d2f3383b9c620085"
|
||||
write_scope: [".doc"]
|
||||
allowed_environments: []
|
||||
mutex: coordination-db-daemon-impl-plan
|
||||
review_state: pending
|
||||
integration_state: pending
|
||||
deployment: not_required
|
||||
cleanup: pending
|
||||
cleanup_owner: "独立维护者"
|
||||
remote_sync: not_requested
|
||||
---
|
||||
|
||||
# 协调库与 daemon · 实施承接计划(工作包预填)
|
||||
|
||||
## 1. 目的、输入依赖与非目标
|
||||
|
||||
### 1.1 目的
|
||||
|
||||
为 [协调库与 daemon 方案](./2026-09-23-coordination-db-daemon-plan.md) 的 L1 七单元提供**可直接开工的承接框架**:三波次门禁、七个工作包预填登记(符号级锚点 + 真实并发验收)、防重复施工、开工准入、集成与收口分项。每包另立 short-term 实施时复制本表字段,不得缺项编码。
|
||||
|
||||
### 1.2 输入依赖(本机均可见)
|
||||
|
||||
| 输入 | 路径 | 状态 |
|
||||
|---|---|---|
|
||||
| 设计方案 | [./2026-09-23-coordination-db-daemon-plan.md](./2026-09-23-coordination-db-daemon-plan.md) | planned;已合入 local_dev |
|
||||
| 研究依据 | [../ops/research/2026-09-23-coordination-db-daemon-research.md](../ops/research/2026-09-23-coordination-db-daemon-research.md) | done(调研可审) |
|
||||
| 既有锁方案 | [./2026-09-21-agent-lock-coordination-plan.md](./2026-09-21-agent-lock-coordination-plan.md) | planned;本机 SQLite 权威 |
|
||||
| 操作规范 | [../ops/2026-09-21-agent-worktree-workflow.md](../ops/2026-09-21-agent-worktree-workflow.md) | active |
|
||||
| 验证契约 | [../ops/2026-09-21-validation-contract.md](../ops/2026-09-21-validation-contract.md) | active;本批适用「治理脚本」行 |
|
||||
| 平台深化 HA 边界 | [./2026-09-23-platform-deepening-reliability-ha-concurrency-plan.md](./2026-09-23-platform-deepening-reliability-ha-concurrency-plan.md) §0 | 单宿主机;跨机需 ADR |
|
||||
|
||||
### 1.3 非目标
|
||||
|
||||
- 本文件**不实施** U1r–U6 任何代码、不装载 launchd/systemd、不改 FEATURE-MATRIX 状态值。
|
||||
- L2 跨机 PostgreSQL / 中央 daemon **不入波次**;无 ADR + 二次授权不得开跨机代码。
|
||||
- 不把 L1 宣称为 OS 沙箱;协调不依赖产品容器;不接触业务数据库。
|
||||
- 不 push、不操作 test/main(除非另获授权)。
|
||||
|
||||
## 2. 已落地基线盘点(本机实测)
|
||||
|
||||
编制日:**2026-09-23**。基线 tip:`1f2f3d6a58d153e6a7809943d2f3383b9c620085`(本任务 `base_dev_sha`;各包开工时以当时 `dev` tip 重测)。
|
||||
|
||||
| 检查项 | 依据 | 结果 |
|
||||
|---|---|---|
|
||||
| queue 子解析器重复注册 | 合入 `63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344` | **已修复**;`scripts/agentctl.py` 仅一处 `add_parser('queue')`(`:1613`) |
|
||||
| 权威库 | `.locks/state.sqlite` | 11 表;scope/lease/CAS/收据/候选准入/`--ff-only` 已 enforced(相对受控入口) |
|
||||
| queue/jobs 行数 | 活库采样 | `queue_items`/`jobs` 仍可为 0(运维闭环待用);parser 已可用 |
|
||||
| 策略 YAML | `configs/agent-governance.yaml` | **不存在** |
|
||||
| automation 分叉 | `scripts/agentctl_automation.py` | 零导入;schema 含活库无的 `operations`/`doc_registry` |
|
||||
| 常驻服务 | `*.service` / `*.plist` / compose 协调服务 | **0 个** |
|
||||
| FEATURE-MATRIX 治理行 | 「Agent worktree 治理自动化」 | `partial`;W4 landed;仍 deferred:PI 源码镜像、跨机隔离、automation/w4 收敛 |
|
||||
| CURRENT 矛盾 | `:5` vs `:15` | macOS 租约可用/不可用并存;操作规范 `:3` 仍写「Linux 本机」 |
|
||||
|
||||
**含义**:方案 U1 的 queue 缺陷已落地;剩余工作包默认 `incremental` 或 `net_new`(有检索证据),禁止重复施工覆盖已 PASS 的 L1/W4 证据。
|
||||
|
||||
## 3. 波次 → 门禁表
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
subgraph W1 [W1 认领与策略基础]
|
||||
U1R[U1r automation归一]
|
||||
U2[U2 governance.yaml]
|
||||
U3[U3 长期claim]
|
||||
end
|
||||
subgraph W2 [W2 执行代理与CURRENT]
|
||||
U7[U7 quarantine交接]
|
||||
U4[U4 常驻入口]
|
||||
U5[U5 CURRENT投影]
|
||||
end
|
||||
subgraph W3 [W3 矩阵迁移]
|
||||
U6[U6 MATRIX record id]
|
||||
end
|
||||
U2 --> U4
|
||||
U3 --> U4
|
||||
U3 --> U5
|
||||
U4 --> U5
|
||||
U5 --> U6
|
||||
U7 --> U4
|
||||
```
|
||||
|
||||
| 波次 | 包 | 准入 | 完成判据 | 验证契约适用行 |
|
||||
|---|---|---|---|---|
|
||||
| W1 | U1r, U2, U3 | 本承接计划已合入;mutex 无冲突 | 三包各自 short-term 验收 PASS 并合入 | 治理脚本 |
|
||||
| W2 | U7, U4, U5 | W1-U2/U3 done;U7 可与 U4 并行编码 | daemon 单实例 + CURRENT 投影 PASS;操作规范/CURRENT 矛盾已修正 | 治理脚本;涉文档追加纯文档核对 |
|
||||
| W3 | U6 | W2-U5 done | MATRIX 稳定 ID + done 证据门禁不回退 | 治理脚本 + 纯文档 |
|
||||
|
||||
编码/隔离测试可并行(mutex 不重叠);**dev 集成串行**(`git:dev`)。
|
||||
|
||||
## 4. 工作包登记表(全部预填)
|
||||
|
||||
### 4.1 必填字段约定
|
||||
|
||||
| 字段 | 要求 |
|
||||
|---|---|
|
||||
| `wp_id` | 唯一;与 short-term `task_id` 可映射 |
|
||||
| `phase` | W1 / W2 / W3 |
|
||||
| `relation_to_baseline` | `incremental` / `regression_gate` / `net_new`(须检索证据) |
|
||||
| `code_anchors` | 文件路径 + 符号;禁止只写包名 |
|
||||
| `deps` | 依赖 `wp_id` / 已合入 tip / ADR |
|
||||
| `mutex` | 与 CURRENT 认领一致 |
|
||||
| `write_scope` | 允许写路径 |
|
||||
| `test_scenarios` | Given/When/Then;临时 Git 仓库真实并发/拒绝;stub/SKIP 不算 PASS |
|
||||
| `rollback` | 单批 revert;迁移 additive |
|
||||
|
||||
### 4.2 登记表
|
||||
|
||||
| wp_id | phase | title | relation_to_baseline | code_anchors | deps | mutex | write_scope | test_scenarios | rollback |
|
||||
|---|---|---|---|---|---|---|---|---|---|
|
||||
| **W1-U1r** | W1 | automation 归一与 state.db 清理 | `incremental`(MATRIX 已记 deferred automation/w4 收敛) | `scripts/agentctl_automation.py`(整文件);活库无 `operations`/`doc_registry`;`.locks/state.db`(0 字节孤儿,代码无引用) | queue 修复 tip `63e66c6f` | `agentctl-automation-converge` | `scripts` | (1) `rg` 无导入引用后删除或合并到 `agentctl_w4`;(2) `unittest discover` 全绿;(3) 确认无代码引用后清理运行态 `state.db`(不入 Git) | 单批 revert;若已删文件则恢复提交 |
|
||||
| **W1-U2** | W1 | 治理策略外部化 | `net_new`(检索:`configs/` 无 `agent-governance.yaml`) | `scripts/agentctl.py:27` `SHARED_DOCS`;`scripts/agentctl_w4.py:64` `JOB_KINDS`;`:75` `PROJECTABLE_DOCS`;`:80` `PROJECTABLE_PREFIXES`;新建 `configs/agent-governance.yaml` | — | `agent-governance-config` | `scripts`, `configs` | 临时仓库:(1) 策略缺失拒写;(2) YAML 损坏拒写;(3) protocol 版本过低拒写;(4) 合法加载后 `docs apply`/`with` 行为不变 | revert 配置+加载代码;硬编码常量可作紧急回退 |
|
||||
| **W1-U3** | W1 | 显式长期认领 claim | `incremental`(基于既有 scope/lease) | `scripts/agentctl.py:553` `check_resources`;`:589` `class Lease`;`tasks`/`freezes`/`runs` 表;新 claim 表或等价资源键 | W1-U2 建议先合入(策略版本字段) | `agentctl-claim` | `scripts` | (1) 20 并发抢同一 claim 仅 1 成功;(2) 不同资源并行均成功;(3) 目录/子文件父子重叠冲突;(4) 冻结资源拒写;(5) 重复 `request_id` 幂等;(6) 冲突返回持有者+票据+`retry_after` | additive schema;revert 代码;旧客户端无 claim 列时 fail-closed |
|
||||
| **W2-U7** | W2 | quarantine 与安全交接 | `regression_gate`(`recover` 已有三值存活) | `scripts/agentctl.py:993` `recover`;进程层 `alive_status`/`group_status`/`descent_status`;`runs.generation` | —(可与 W1 并行编码) | `agentctl-handoff` | `scripts` | (1) 杀 supervisor 留子进程不得误抢;(2) `unknown` 不回收;(3) TTL/心跳过期只进 suspect/quarantine;(4) 旧 generation renew/write/release 全拒;(5) env/git 未知结果须核验收据 | 单批 revert;不削弱既有 recover 负例 |
|
||||
| **W2-U4** | W2 | 常驻协调入口 | `net_new`(检索:仓库 0 个 service/plist) | 新 `deploy/agentctl/` 或 `scripts/systemd/`+`scripts/launchd/` 模板;`.locks/os/manager.lock`(锁方案 §3.1 规划、今日不存在);复用 `queue schedule` `:1245`、投影路径 | **W1-U2 done**;**W1-U3 done**;**W2-U7** 建议先合入 | `agentctl-daemon` | `scripts`, `deploy`(若放单元模板) | (1) 双实例争 `manager.lock` 仅一存活;(2) daemon 停后受保护写入 fail-closed(非放行);(3) 前台 CLI 语义不变;(4) daemon 不新增权限(无 register 能力不可越权) | 卸下单元模板;删除 manager.lock 争用代码可 revert;不自动装载本机 |
|
||||
| **W2-U5** | W2 | CURRENT 状态输出化 | `incremental`(`docs_project` 已有) | `scripts/agentctl.py:1308` `docs_project`;行模板约 `:1358-1362`;槽位保护 `:903-908`;`.doc/ops/CURRENT.md`;`.doc/ops/2026-09-21-agent-worktree-workflow.md:3` | **W1-U3 done**;**W2-U4** 建议先合入(投影调度) | `current-projection` | `scripts`, `.doc` | (1) 双任务并行投影不丢行;(2) 同行 CAS → `BASE_CHANGED`;(3) 槽位保护不回退;(4) 人工「焦点/受控约束」区块机器不写;(5) 修正 CURRENT `:5`/`:15` 与操作规范「Linux 本机」过时描述 | revert 投影代码+文档;保留人工段落 |
|
||||
| **W3-U6** | W3 | FEATURE-MATRIX 稳定 ID | `incremental` | `.doc/status/FEATURE-MATRIX.md` 完成度表约 `:52-78`(27 行);`docs apply` done 门禁 `:922-928` | **W2-U5 done** | `matrix-record-id` | `scripts`, `.doc` | (1) 无证据升 `done` 被拒;(2) 未知列/历史段落保留;(3) 整文 rewrite 不能夹带 done;(4) 任务 close ≠ 自动升 done;(5) `production_ready` 仍只由发布门禁判定 | revert;记录 ID 映射表保留在 Git 便于回滚对照 |
|
||||
|
||||
### 4.3 判定列(开工前填)
|
||||
|
||||
每包 short-term 增加列:`判定` = `planned | in_progress | blocked | done | cancelled`。本承接计划合入时全部为 **planned**。
|
||||
|
||||
## 5. 防重复施工前置检查
|
||||
|
||||
每个工作包开工前,owner 在 short-term 勾选并留证据链接:
|
||||
|
||||
1. [ ] 检索 [gap-matrix](./gap-matrix.md):已有 PASS 覆盖同一缺陷 → 默认 `regression_gate`。
|
||||
2. [ ] 检索 FEATURE-MATRIX「Agent worktree 治理自动化」:W4 landed 项不得推倒重来;本包声明与 deferred 项的关系。
|
||||
3. [ ] 对照 [设计方案](./2026-09-23-coordination-db-daemon-plan.md) U1–U7:本包范围不越界到 L2。
|
||||
4. [ ] 声明 `relation_to_baseline`;`net_new` 列出检索路径(至少含 §4.2 锚点)。
|
||||
5. [ ] mutex / write_scope 与 CURRENT / `agentctl task register` 一致。
|
||||
6. [ ] 红线:无 ADR 不开跨机;不宣称 OS 沙箱;不碰业务库/产品容器协调。
|
||||
7. [ ] 验证契约「治理脚本」行:计划中的并发/拒绝路径均在临时真实 Git/SQLite 执行。
|
||||
|
||||
任一项未勾 → 保持 `planned`/`blocked`,不得编码。
|
||||
|
||||
## 6. 开工准入(硬条件)
|
||||
|
||||
同时满足才可 `agentctl task register` 并编码:
|
||||
|
||||
- 本承接计划已为当前 `dev` 祖先;
|
||||
- 该包 §4.2 必填字段齐全且 §5 全部勾选;
|
||||
- 依赖包(§4.2 `deps`)已 `done` 或显式允许并行;
|
||||
- 从**当时 `dev` 完整 SHA** 创建 `feature/<task-id>` / `fix/<task-id>`,不从他人 feature 派生;
|
||||
- L2 相关改动另有 ADR + 用户二次授权(本波次不应触发)。
|
||||
|
||||
## 7. L2 ADR 前置门(不开工)
|
||||
|
||||
跨机 + 独立 PostgreSQL + 中央 daemon + systemd(Linux 中央主机)**仅登记**:
|
||||
|
||||
| 门禁 | 要求 |
|
||||
|---|---|
|
||||
| ADR | 覆盖锁方案 §3.2「跨机锁服务当前不采用」与平台深化 §0「跨机 HA 需先另立 ADR」 |
|
||||
| 用户授权 | 二次明确授权;范围/期限/退出条件写入 short-term |
|
||||
| 验收登记 | 双主机并发、断网、旧进程存活、重复 request_id、备份恢复——**待执行**,不得冒充已测 |
|
||||
|
||||
无上述门禁 → 任何 PR/合入含跨机协调代码一律拒绝。
|
||||
|
||||
## 8. 集成、部署与收口
|
||||
|
||||
### 8.1 集成
|
||||
|
||||
冻结 head → 候选 `merge --no-ff`(第一父 = expected_dev)→ `agentctl validate` → `agentctl integrate --expected-dev <SHA>`(`git:dev` 租约内 `--ff-only`)。CURRENT/MATRIX 变更走 `docs apply` 收据。
|
||||
|
||||
### 8.2 部署判定
|
||||
|
||||
| 变更 | `deployment` |
|
||||
|---|---|
|
||||
| 仅 `.doc` / 本承接计划 / 单元模板入库未装载 | `not_required` |
|
||||
| `scripts/agentctl*` 行为变更 | 临时仓库治理脚本验收即可;**不**要求产品容器 rebuild |
|
||||
| 本机装载 launchd/systemd(若另授权) | 本机装载演练记录;fail-closed 核验 |
|
||||
|
||||
### 8.3 收口分项(每包必报)
|
||||
|
||||
`review_state` / `integration_state` / `deployment` / `cleanup` / `remote_sync`(默认 `not_requested`)。
|
||||
|
||||
## 9. 与本框架任务的关系
|
||||
|
||||
- 本文件 `status=planned`:追踪「七包实施队列」,**不是**业务已开工。
|
||||
- 编制本框架的 short-term:[../ops/short-term/2026-09-23-coordination-db-daemon-impl-plan.md](../ops/short-term/2026-09-23-coordination-db-daemon-impl-plan.md)。
|
||||
- 设计方案保持 planned;各包落地时在方案 U 节回填合入 tip,不代填验收。
|
||||
|
||||
## 10. 相关链接
|
||||
|
||||
- [设计方案](./2026-09-23-coordination-db-daemon-plan.md)
|
||||
- [研究](../ops/research/2026-09-23-coordination-db-daemon-research.md)
|
||||
- [锁方案](./2026-09-21-agent-lock-coordination-plan.md)
|
||||
- [验证契约](../ops/2026-09-21-validation-contract.md)
|
||||
- [操作规范](../ops/2026-09-21-agent-worktree-workflow.md)
|
||||
- queue 修复 tip:`63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344`
|
||||
@@ -0,0 +1,172 @@
|
||||
---
|
||||
title: "协调库与 daemon:分阶段设计与实施方案"
|
||||
status: planned
|
||||
created: 2026-09-23
|
||||
updated: 2026-09-23
|
||||
owner: Cursor
|
||||
task_id: coordination-db-daemon-2026-09-23
|
||||
task_type: research
|
||||
task_tier: multi_stage
|
||||
policy_revision: "agent-governance-2026-09-21-r1 @ 63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344"
|
||||
branch: feature/coordination-db-daemon-2026-09-23
|
||||
worktree: .worktrees/coordination-db-daemon-2026-09-23
|
||||
base_dev_sha: "63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344"
|
||||
write_scope: [".doc"]
|
||||
allowed_environments: []
|
||||
mutex: coordination-db-daemon
|
||||
review_state: pending
|
||||
integration_state: pending
|
||||
deployment: not_required
|
||||
cleanup: pending
|
||||
cleanup_owner: "独立维护者"
|
||||
remote_sync: not_requested
|
||||
---
|
||||
|
||||
# 协调库与 daemon:分阶段设计与实施方案
|
||||
|
||||
> 本文件是**方案文档(planned)**,不含 daemon/PostgreSQL 实施。配套 [研究依据](../ops/research/2026-09-23-coordination-db-daemon-research.md)。上位约束:[锁协调方案](./2026-09-21-agent-lock-coordination-plan.md)、[操作规范](../ops/2026-09-21-agent-worktree-workflow.md)、[平台深化方案](./2026-09-23-platform-deepening-reliability-ha-concurrency-plan.md) §0。
|
||||
|
||||
## 0. 用户目标与授权
|
||||
|
||||
- 用户目标:统一认领、状态与执行入口;文档逐步变为状态输出;为多主机协作预留结构。
|
||||
- 交付形态(已确认):**研究 + 方案**;不实施数据库或 daemon。
|
||||
- 边界(已确认):**分阶段**——L1 单宿主机内(daemon + 现有 SQLite);跨机 PostgreSQL 仅登记为 planned 的 L2,需二次授权与 ADR。
|
||||
- 并行授权:修掉 `agentctl queue` 子解析器重复注册(已合入本地 `63e66c6f`)。
|
||||
|
||||
## 1. 现状基线(纠正摘要偏差)
|
||||
|
||||
| 摘要原说法 | 实测 |
|
||||
|---|---|
|
||||
| SQLite 管理「部分」协调状态 | `.locks/state.sqlite` 已是权威库(11 表;采样 tasks≈105 / runs≈653 / events≈1406) |
|
||||
| 非容器用 systemd | 本机 Darwin;仓库内 systemd/launchd/协调 compose **0 个** |
|
||||
| 任务注册无长期排他认领 | 属实:缺显式 claim;scope/lease 已有 |
|
||||
| 文档 `3f14d7fa` 已合入 | **不存在**;本轮重新落地 |
|
||||
|
||||
已成立能力(不推倒):`scripts/agentctl.py` 的 scope、flock 租约、三值进程存活、docs CAS+收据、候选准入、`--ff-only`、hooks;`.git/agent-control/dev-integration.lock` 与 `.locks/os/dev-integration.lock` 同 inode。
|
||||
|
||||
关键缺口:长期 claim、常驻协调入口、`configs/agent-governance.yaml`、CURRENT/MATRIX 稳定 record id、queue/jobs 运维闭环(parser 已修,行仍为 0)、`agentctl_automation.py` 分叉。
|
||||
|
||||
## 2. 目标架构
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph L1 [L1 单宿主机 本方案设计线]
|
||||
AG1[Agent 与工具调用] --> AC[agentctl CLI 统一入口]
|
||||
AC --> DB[(.locks/state.sqlite 权威库)]
|
||||
AC --> OS[.locks/os flock 稳定锁]
|
||||
CO[常驻协调入口 launchd 本机] --> DB
|
||||
CO --> PUB[docs apply 收据化发布]
|
||||
AC --> GI[git:dev 候选验证与 ff-only]
|
||||
end
|
||||
subgraph L2 [L2 跨机 仅 planned 需 ADR]
|
||||
HA[主机 A 执行代理] --> CD[中央协调 daemon]
|
||||
HB[主机 B 执行代理] --> CD
|
||||
CD --> PG[(独立 PostgreSQL)]
|
||||
CD --> EXH[指定主机执行 Git 集成与部署]
|
||||
end
|
||||
L1 -.->|L1 验收后另立 ADR| L2
|
||||
```
|
||||
|
||||
### 三种关系(协议核心)
|
||||
|
||||
| 机制 | 作用 | 今日状态 |
|
||||
|---|---|---|
|
||||
| scope | 智能体允许修改哪些路径/能力 | `tasks.scopes` + `check_resources`,已 enforced |
|
||||
| claim | 某项工作当前由谁长期负责 | **缺失**;CURRENT 手工行不是原子认领 |
|
||||
| lease | 谁正在操作某资源 | `Lease` + flock + 存活核验,已 enforced |
|
||||
|
||||
认领在短事务中完成:检查权限、冲突、冻结、公平排队、登记归属、写审计——全成或全拒。冲突返回持有者、队列票据与 `retry_after`。
|
||||
|
||||
**执行安全不能只靠数据库锁。** TTL/心跳过期只进入 suspect/quarantine,不立即把资源交给下一个智能体;须核验旧进程与外部操作结果后再交接(见 U7)。
|
||||
|
||||
## 3. L1 七个实施单元
|
||||
|
||||
每单元另建 short-term + mutex + 验收 + 回退;合入 local_dev 串行占 `git:dev`。
|
||||
|
||||
### U1 缺陷收敛与实现归一
|
||||
|
||||
| 项 | 状态 |
|
||||
|---|---|
|
||||
| queue 子解析器重复注册 | **已修复并合入** `63e66c6fb35d6b4dd9f3ed92e15acc9933aeb344`(删后注册块;保留 `--head` / cancel `--task` / schedule `--drain`;回归 3 例;unittest 103/2 skipped PASS) |
|
||||
| `scripts/agentctl_automation.py` 零导入、schema 分叉 | planned:收敛到 W4 或按记录删除 |
|
||||
| `.locks/state.db` 0 字节孤儿 | planned:确认无引用后清理(运行态,不入 Git) |
|
||||
|
||||
### U2 治理策略外部化
|
||||
|
||||
新建 tracked `configs/agent-governance.yaml`(今日不存在),收敛 `SHARED_DOCS`、`PROJECTABLE_DOCS`、`JOB_KINDS`、protocol/policy 版本;fail-closed 加载;旧客户端低于最小协议版本拒写。
|
||||
|
||||
### U3 显式长期认领 claim
|
||||
|
||||
在 SQLite 增加 claim 表/字段(或等价资源键),与 scope/lease 分离。`BEGIN IMMEDIATE` 短事务内:权限、父子路径重叠、冻结、公平排队、审计。不同资源可并行。不把 Markdown `idle` 当作原子锁。
|
||||
|
||||
### U4 常驻协调入口(本机)
|
||||
|
||||
- **macOS**:launchd plist(本机默认)。
|
||||
- **Linux**:systemd unit。
|
||||
- 单实例:`.locks/os/manager.lock`(2026-09-21 方案已规划、今日不存在)。
|
||||
- 职责:驱动 `queue schedule`、文档投影发布、心跳过期扫描;**不新增权限**。
|
||||
- 不可用时:阻止受保护写入,不静默放行。
|
||||
|
||||
### U5 CURRENT 状态输出化
|
||||
|
||||
- `## 并行认领` / 集成槽位:稳定 record id + `docs project` 生成;人工「焦点 / 受控约束」保留。
|
||||
- 同批修正:`CURRENT.md:5` 与 `:15` 自相矛盾;操作规范 `:3`「Linux 本机」过时描述。
|
||||
- 发布仍走 `docs apply` CAS + 收据 + hook。
|
||||
|
||||
### U6 FEATURE-MATRIX 分阶段迁移
|
||||
|
||||
27 模块行加稳定 record id 与结构化状态字段;保留声明范围、审核与证据。`done` 仍需 `docs:approve` + 已提交证据路径;不因任务结束或锁释放自动升 done。`production_ready` 仍只由发布门禁判定。任务完成 ≠ 能力完成 ≠ 发布就绪。
|
||||
|
||||
### U7 执行代理与安全交接
|
||||
|
||||
固化:suspect → quarantine → 核验(supervisor/子进程组消失、物理锁可得、外部结果核对)→ 交接。复用并加强 `recover`;补 fencing generation 与 env/git 收据。Git 集成与共享环境部署集中主目录执行入口(`queue_schedule` 已限主 dev);保留 flock、候选准入、`--ff-only`。数据库管记录与授权,执行入口防实际双写。
|
||||
|
||||
## 4. L2 登记(planned,不开工)
|
||||
|
||||
前置条件:用户二次授权 + ADR 覆盖锁方案 §3.2 与平台深化 §0。
|
||||
|
||||
登记内容:中央独立 PostgreSQL(独立配置/数据目录/备份,不依赖产品容器);中央协调 daemon;各主机执行代理;指定执行主机做 Git 集成与部署;systemd 开机启动与异常重启;单中央节点故障时暂停受保护写入。
|
||||
|
||||
**待执行验收(不得冒充已测)**:真实双主机并发、断网、旧进程存活、重复 `request_id`、备份恢复。systemd 能恢复进程,不能替代主机容灾与数据库备份。
|
||||
|
||||
## 5. 文档与状态模型
|
||||
|
||||
| 内容 | 归属 |
|
||||
|---|---|
|
||||
| 任务归属、进度、队列、执行状态 | 数据库(权威) |
|
||||
| CURRENT 运行表格 | 逐步自动生成;人工焦点/约束保留 |
|
||||
| FEATURE-MATRIX | 分阶段结构化;证据与审核保留 |
|
||||
| 规范、方案、验收报告正文 | 继续 Git 管理 |
|
||||
|
||||
## 6. 全局验收门
|
||||
|
||||
1. 每单元:受影响 `unittest` + 负例(冲突认领、旧 generation、daemon 停写)。
|
||||
2. U3/U5/U6:双任务并行写不丢行、同行 CAS 冲突可见。
|
||||
3. U4/U7:杀 supervisor 留子进程不得误抢;断心跳后须核验再交接。
|
||||
4. L2:未授权不得实施;不得把 planned 写成 enforced。
|
||||
5. 红线:不把 L1 宣称为 OS 沙箱;不依赖产品容器启动协调;不接触业务数据库。
|
||||
|
||||
## 7. 风险与回退
|
||||
|
||||
| 风险 | 控制 |
|
||||
|---|---|
|
||||
| 两套锁各自放行 | 延续 2026-09-21 §10 硬链接/双锁兼容;禁止静默第二锁根 |
|
||||
| daemon 扩大权限 | 只调度已授权操作;能力仍来自 task register |
|
||||
| CURRENT 自动覆盖人工焦点 | 仅受控区块机器写;整文需 docs:admin |
|
||||
| L2 提前开工 | 无 ADR 拒合入跨机代码 |
|
||||
| 文档与运行态漂移 | CURRENT 标明快照时间;以 doctor/status 核验 |
|
||||
|
||||
每单元独立 revert;迁移 additive;部署清单与代码分提交。
|
||||
|
||||
## 8. 与既有文档关系
|
||||
|
||||
- 本方案 = [2026-09-21 锁方案](./2026-09-21-agent-lock-coordination-plan.md) 的**演进版**:L1 补 claim/常驻入口/文档状态化;不推翻 SQLite 权威与 advisory 边界。
|
||||
- 不替代 [平台深化方案](./2026-09-23-platform-deepening-reliability-ha-concurrency-plan.md)(产品可靠性/HA);协调跨机另立 ADR。
|
||||
- gap-matrix / FEATURE-MATRIX 状态不因本方案自动变更。
|
||||
|
||||
## 9. 开工准入(第一批实施前)
|
||||
|
||||
1. 每批 short-term + CURRENT 认领 + mutex。
|
||||
2. 从当时 dev tip 建 worktree;重读 policy_revision。
|
||||
3. L2 / 共享环境须单独授权。
|
||||
4. 本文件保持 planned;首批实施时回填映射,不代填验收。
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
| 文档 | 说明 |
|
||||
|------|------|
|
||||
| [2026-09-23-coordination-db-daemon-implementation-undertaking-plan.md](./2026-09-23-coordination-db-daemon-implementation-undertaking-plan.md) | 协调库与 daemon **实施承接计划**(工作包预填):W1–W3 七包(U1r/U2/U3/U7/U4/U5/U6)含符号级锚点、真实并发验收、mutex、开工准入;L2 仅 ADR 前置门。配套 [设计方案](./2026-09-23-coordination-db-daemon-plan.md) · [任务](../ops/short-term/2026-09-23-coordination-db-daemon-impl-plan.md)。planned,不实施代码 |
|
||||
| [2026-09-23-coordination-db-daemon-plan.md](./2026-09-23-coordination-db-daemon-plan.md) | 协调库与 daemon 分阶段方案:L1 单宿主机(复用 `.locks/state.sqlite` + claim/常驻入口/文档状态化);L2 跨机 PostgreSQL 仅 planned(需 ADR)。配套 [研究](../ops/research/2026-09-23-coordination-db-daemon-research.md) · [任务](../ops/short-term/2026-09-23-coordination-db-daemon.md)。U1 queue 子解析器已合入 `63e66c6f`;本文件 planned,不实施 daemon |
|
||||
| [2026-09-21-agent-lock-coordination-plan.md](./2026-09-21-agent-lock-coordination-plan.md) | Agent `.locks`、共享文档与并行工作流补充方案:本机 SQLite + 会话/租约/CAS;L1a–L1d 设计。配套 [研究](../ops/research/2026-09-21-agent-lock-coordination-research.md)。planned;跨机锁服务本期不采用 |
|
||||
| [2026-09-23-platform-deepening-reliability-ha-concurrency-plan.md](./2026-09-23-platform-deepening-reliability-ha-concurrency-plan.md) | 平台深度完善方案(解耦·通信·总线·可靠性·高可用·高并发):基于 2026-09-23 四路只读调研,六轨 R1–R6 分批(server 收口/chat 解咬合/bizdev 上收/worker 韧性/并行消费/NOTIFY 唤醒/死信闭环/多副本前置去单点化/PG 本机热备/备份自动化/锁重构/长任务异步化/池调优/app metrics)。planned,不实施代码;HA 边界=单宿主机(用户确认) |
|
||||
| [2026-09-23-modular-refactor-implementation-undertaking-plan.md](./2026-09-23-modular-refactor-implementation-undertaking-plan.md) | 系统整改与重构方案的**实施承接计划**(框架+映射回填):阶段门禁、工作包模板、防重复施工(对照 A–G/`exceptions=[]`)、产物机器回填与开工准入。配套 [审核清单](../audit/2026-09-23-modular-refactor-plan-review-checklist.md) · [任务](../ops/short-term/2026-09-23-modular-refactor-impl-plan.md)。不代填 17 工作包、不实施业务代码 |
|
||||
| [../system-design/2026-09-22-t20-hardening-design.md](../system-design/2026-09-22-t20-hardening-design.md) | T20 W4 加固设计决策(XFF、锁拆分、timeout、shutdown、SSE POST、前端 generation/cookie、compose non-root/init、backup 调度文档);F5/I8 见 lowrisk 批。配套 [任务](../ops/short-term/2026-09-22-t20-design-items.md) |
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
---
|
||||
title: "latest-upload summary → test 晋升报告"
|
||||
date: 2026-09-23
|
||||
task_id: promote-fix-latest-upload-test-2026-09-23
|
||||
verdict: PASS
|
||||
---
|
||||
|
||||
# latest-upload summary → test 晋升报告
|
||||
|
||||
## 结论
|
||||
|
||||
local `test@54955c9d` + tag `rc-v1.1.0-beta.3` 已含 latest-upload summary / parse-wait(祖先 `f6e14f97`,dev tip `30fa4e88`);test `:8081` schema_version=65;pinned 镜像 recreate 与 receipt digest 一致。人工聊天回归由用户执行。
|
||||
|
||||
## 版本矩阵
|
||||
|
||||
| 项 | 值 |
|
||||
|---|---|
|
||||
| local test | `54955c9d` |
|
||||
| rc tag | `rc-v1.1.0-beta.3` → `54955c9d` |
|
||||
| local_dev tip(merge 第二父) | `30fa4e88` |
|
||||
| 功能祖先 | `f6e14f97` |
|
||||
| pin commit | `30fa4e88` |
|
||||
| app digest | `sha256:ba834cb1c08f44d615789940115fb7403efb476b7822b2aa3d5caeb85d35a579` |
|
||||
| test health schema | 65 |
|
||||
| ready | ok / kb_ready=true |
|
||||
|
||||
## 验证
|
||||
|
||||
| 项 | 命令/证据 | 结果 |
|
||||
|---|---|---|
|
||||
| candidate validate | `agentctl validate`:intent/coordinator/materialindex + server 聚焦用例 + arch-check | PASS (`7f456e51…`) |
|
||||
| receipt gate | `promotion-receipt-check.sh --commit 30fa4e88 --require-digests` | PASS |
|
||||
| images apply | `candidate-images-apply.sh test --commit 30fa4e88` | PASS |
|
||||
| rebuild | `env-service.sh test rebuild`(pinned,未 docker build) | PASS |
|
||||
| health | `GET :8081/health` schema_version=65 | PASS |
|
||||
| ready | `GET :8081/ready` status=ok | PASS |
|
||||
|
||||
## 状态
|
||||
|
||||
| 字段 | 值 |
|
||||
|---|---|
|
||||
| review_state | not_required |
|
||||
| integration_state | merged_local_test |
|
||||
| deployment | test_ok |
|
||||
| remote_sync | not_requested |
|
||||
| cleanup | pending |
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"commit": "30fa4e88b21ddc918a4f408a13ef4d2c2d5acd6e",
|
||||
"source_tree": "f3558d25f4baa6e69d0cc50455663288069eb927",
|
||||
"source_context": "git-archive",
|
||||
"recorded_at": "2026-09-23T02:26:39Z",
|
||||
"tags": {
|
||||
"app": "shuimu-agent-app:candidate-30fa4e88b21d",
|
||||
"events": "shuimu-agent-events:candidate-30fa4e88b21d",
|
||||
"pi-agent": "shuimu-pi-agent:candidate-30fa4e88b21d"
|
||||
},
|
||||
"image_ids": {
|
||||
"app": "sha256:ba834cb1c08f44d615789940115fb7403efb476b7822b2aa3d5caeb85d35a579",
|
||||
"events": "sha256:ba834cb1c08f44d615789940115fb7403efb476b7822b2aa3d5caeb85d35a579",
|
||||
"pi-agent": "sha256:4482f7e5bc7719fb3ca5d6f4dea45feb02b74336e43822deddebca95e10f7c9b"
|
||||
},
|
||||
"image_digests": {
|
||||
"app": "shuimu-agent-app@sha256:ba834cb1c08f44d615789940115fb7403efb476b7822b2aa3d5caeb85d35a579",
|
||||
"events": "shuimu-agent-app@sha256:ba834cb1c08f44d615789940115fb7403efb476b7822b2aa3d5caeb85d35a579",
|
||||
"pi-agent": "shuimu-pi-agent@sha256:4482f7e5bc7719fb3ca5d6f4dea45feb02b74336e43822deddebca95e10f7c9b"
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"verdict": "pass",
|
||||
"commit": "30fa4e88b21ddc918a4f408a13ef4d2c2d5acd6e",
|
||||
"recorded_at": "2026-09-23T02:26:53Z",
|
||||
"runner_url": "http://127.0.0.1:18865",
|
||||
"model_id": "MiniMax-M2.7-highspeed",
|
||||
"protocol": "typed-result-v1",
|
||||
"image_digests": {
|
||||
"app": "shuimu-agent-app@sha256:ba834cb1c08f44d615789940115fb7403efb476b7822b2aa3d5caeb85d35a579",
|
||||
"events": "shuimu-agent-app@sha256:ba834cb1c08f44d615789940115fb7403efb476b7822b2aa3d5caeb85d35a579",
|
||||
"pi-agent": "shuimu-pi-agent@sha256:4482f7e5bc7719fb3ca5d6f4dea45feb02b74336e43822deddebca95e10f7c9b"
|
||||
},
|
||||
"suite": "scoped-latest-upload-summary",
|
||||
"failure_class": "none",
|
||||
"evidence_refs": [
|
||||
".doc/test-reports/assets/promotion-receipts/30fa4e88b21ddc918a4f408a13ef4d2c2d5acd6e.images.json"
|
||||
]
|
||||
}
|
||||
@@ -1626,11 +1626,6 @@ def parser():
|
||||
hooks.add_parser('install');hc=hooks.add_parser('check');hc.add_argument('--merge',action='store_true');hr=hooks.add_parser('ref');hr.add_argument('state')
|
||||
v=sub.add_parser('validate');v.add_argument('--task',required=True);v.add_argument('command',nargs=argparse.REMAINDER)
|
||||
i=sub.add_parser('integrate');i.add_argument('--task',required=True);i.add_argument('--expected-dev',required=True);i.add_argument('--request-id')
|
||||
q=sub.add_parser('queue').add_subparsers(dest='queue_action',required=True)
|
||||
qe=q.add_parser('enqueue');qe.add_argument('--task',required=True);qe.add_argument('--expected-dev',default='dev');qe.add_argument('--head-sha');qe.add_argument('--priority',type=int,default=0);qe.add_argument('--request-id')
|
||||
ql=q.add_parser('list');ql.add_argument('--all',action='store_true')
|
||||
qc=q.add_parser('cancel');qc.add_argument('--id',required=True);qc.add_argument('--reason',required=True)
|
||||
q.add_parser('schedule')
|
||||
dep=sub.add_parser('deploy').add_subparsers(dest='deploy_action',required=True)
|
||||
dr=dep.add_parser('run-loop')
|
||||
dr.add_argument('--task',required=True);dr.add_argument('--id',required=True)
|
||||
|
||||
@@ -654,6 +654,99 @@ class AgentctlTests(unittest.TestCase):
|
||||
self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
|
||||
self.assertEqual(self.git("status", "--porcelain", cwd=task), "")
|
||||
|
||||
def test_queue_subparser_registered_once(self):
|
||||
"""Duplicate queue registration must not shadow handler-compatible flags."""
|
||||
import importlib.util
|
||||
spec = importlib.util.spec_from_file_location("agentctl_queue_parser", SOURCE)
|
||||
mod = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(mod)
|
||||
parser = mod.parser()
|
||||
enqueue = parser.parse_args(
|
||||
["queue", "enqueue", "--task", "alpha", "--expected-dev", "dev", "--head", "deadbeef"])
|
||||
self.assertEqual(enqueue.head, "deadbeef")
|
||||
self.assertFalse(hasattr(enqueue, "head_sha"))
|
||||
cancel = parser.parse_args(
|
||||
["queue", "cancel", "--task", "alpha", "--id", "item-1", "--reason", "test"])
|
||||
self.assertEqual(cancel.task, "alpha")
|
||||
schedule = parser.parse_args(["queue", "schedule", "--drain"])
|
||||
self.assertTrue(schedule.drain)
|
||||
# A second registration that only exposes --head-sha must not win.
|
||||
with self.assertRaises(SystemExit):
|
||||
parser.parse_args(
|
||||
["queue", "enqueue", "--task", "alpha", "--expected-dev", "dev", "--head-sha", "deadbeef"])
|
||||
|
||||
def test_queue_enqueue_list_cancel_roundtrip(self):
|
||||
task = self.initialized_task(scopes=(".",), capabilities=("git:dev",))
|
||||
baseline = self.git("rev-parse", "dev")
|
||||
(task / "src/a/feature.py").parent.mkdir(parents=True, exist_ok=True)
|
||||
(task / "src/a/feature.py").write_text("feature = True\n", encoding="utf-8")
|
||||
self.git("add", "src/a/feature.py", cwd=task)
|
||||
change = self.run_lease(
|
||||
"alpha", ["git:index", "path:."],
|
||||
"import subprocess,sys;sys.exit(subprocess.run(['git','commit','-m','feature']).returncode)",
|
||||
cwd=task)
|
||||
self.assertEqual(change.returncode, 0, change.stderr)
|
||||
candidate = self.initialized_task("candidate", scopes=(".",), capabilities=("git:dev",))
|
||||
merged = self.run_lease(
|
||||
"candidate", ["git:index", "git:dev", "path:."],
|
||||
"import subprocess,sys;sys.exit(subprocess.run(['git','merge','--no-ff','-m','candidate','feature/alpha']).returncode)",
|
||||
cwd=candidate)
|
||||
self.assertEqual(merged.returncode, 0, merged.stderr)
|
||||
head = self.git("rev-parse", "HEAD", cwd=candidate)
|
||||
self.cli("validate", "--task", "candidate", "--", "git", "diff", "--check", baseline, cwd=candidate)
|
||||
enqueued = json.loads(self.cli(
|
||||
"queue", "enqueue", "--task", "candidate", "--expected-dev", baseline,
|
||||
"--head", head, "--request-id", "q-alpha-1", cwd=candidate).stdout)
|
||||
self.assertEqual(enqueued["status"], "enqueued")
|
||||
self.assertEqual(enqueued["item"]["state"], "pending")
|
||||
listed = json.loads(self.cli("queue", "list").stdout)
|
||||
self.assertEqual(len(listed["items"]), 1)
|
||||
self.assertEqual(listed["items"][0]["id"], "q-alpha-1")
|
||||
foreign = self.cli(
|
||||
"queue", "cancel", "--task", "alpha", "--id", "q-alpha-1", "--reason", "wrong owner",
|
||||
cwd=task, check=False)
|
||||
self.assertNotEqual(foreign.returncode, 0)
|
||||
self.assertIn("PATH_OUT_OF_SCOPE", foreign.stderr)
|
||||
cancelled = json.loads(self.cli(
|
||||
"queue", "cancel", "--task", "candidate", "--id", "q-alpha-1", "--reason", "abort",
|
||||
cwd=candidate).stdout)
|
||||
self.assertEqual(cancelled["status"], "cancelled")
|
||||
self.assertEqual(cancelled["item"]["state"], "cancelled")
|
||||
|
||||
def test_queue_schedule_promotes_validated_candidate(self):
|
||||
task = self.initialized_task(scopes=(".",), capabilities=("git:dev",))
|
||||
(task / "src/a/feature.py").parent.mkdir(parents=True, exist_ok=True)
|
||||
(task / "src/a/feature.py").write_text("feature = True\n", encoding="utf-8")
|
||||
self.git("add", "src/a/feature.py", cwd=task)
|
||||
change = self.run_lease(
|
||||
"alpha", ["git:index", "path:."],
|
||||
"import subprocess,sys;sys.exit(subprocess.run(['git','commit','-m','feature']).returncode)",
|
||||
cwd=task)
|
||||
self.assertEqual(change.returncode, 0, change.stderr)
|
||||
baseline = self.git("rev-parse", "dev")
|
||||
candidate = self.initialized_task("candidate", scopes=(".",), capabilities=("git:dev",))
|
||||
merged = self.run_lease(
|
||||
"candidate", ["git:index", "git:dev", "path:."],
|
||||
"import subprocess,sys;sys.exit(subprocess.run(['git','merge','--no-ff','-m','candidate','feature/alpha']).returncode)",
|
||||
cwd=candidate)
|
||||
self.assertEqual(merged.returncode, 0, merged.stderr)
|
||||
head = self.git("rev-parse", "HEAD", cwd=candidate)
|
||||
self.cli("validate", "--task", "candidate", "--", "git", "diff", "--check", baseline, cwd=candidate)
|
||||
self.cli("queue", "enqueue", "--task", "candidate", "--expected-dev", baseline,
|
||||
"--head", head, "--request-id", "q-sched-1", cwd=candidate)
|
||||
denied = self.cli("queue", "schedule", cwd=candidate, check=False)
|
||||
self.assertNotEqual(denied.returncode, 0)
|
||||
self.assertIn("MAIN_WORKTREE_REQUIRED", denied.stderr)
|
||||
scheduled_raw = self.cli("queue", "schedule", cwd=self.root)
|
||||
scheduled = json.loads([line for line in scheduled_raw.stdout.splitlines() if line.startswith("{")][-1])
|
||||
self.assertEqual(scheduled["status"], "ok")
|
||||
self.assertEqual(scheduled["processed"], 1)
|
||||
self.assertEqual(scheduled["results"][0]["status"], "completed")
|
||||
self.assertEqual(self.git("rev-parse", "dev"), head)
|
||||
listed = json.loads(self.cli("queue", "list", "--all").stdout)
|
||||
item = next(i for i in listed["items"] if i["id"] == "q-sched-1")
|
||||
self.assertEqual(item["state"], "completed")
|
||||
|
||||
|
||||
class ProcessPlatformTests(unittest.TestCase):
|
||||
@classmethod
|
||||
|
||||
Reference in New Issue
Block a user