@cr1992/agentkit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.en.md +107 -0
- package/README.md +103 -0
- package/bin/agentkit.mjs +4 -0
- package/bin/cli.mjs +273 -0
- package/core/atomic-fs.mjs +23 -0
- package/core/cli-help.mjs +54 -0
- package/core/content-digest.mjs +66 -0
- package/core/digest.mjs +67 -0
- package/core/json-schema-lite.mjs +60 -0
- package/core/legacy-entry.mjs +37 -0
- package/core/reflection.mjs +142 -0
- package/core/runtime-bundle.mjs +101 -0
- package/docs/loop/embedded-review-adapter.md +41 -0
- package/docs/loop/loop-state-machine.md +43 -0
- package/docs/loop/recovery-and-fuses.md +34 -0
- package/docs/orchestrate/dispatch-contract.md +92 -0
- package/docs/orchestrate/failure-routing-and-recovery.md +46 -0
- package/docs/orchestrate/host-capability-cache.md +170 -0
- package/docs/orchestrate/isolation-fallback.md +18 -0
- package/docs/orchestrate/model-routing-config.md +186 -0
- package/docs/orchestrate/orchestration-runtime.md +261 -0
- package/docs/orchestrate/review-budget.md +90 -0
- package/docs/orchestrate/task-playbooks.md +85 -0
- package/docs/orchestrate/user-facing-reporting.md +14 -0
- package/docs/verify/evidence-schema.md +167 -0
- package/docs/verify/input-preparation.md +44 -0
- package/docs/verify/verification-protocol.md +76 -0
- package/docs/worktree/batch-integration.md +176 -0
- package/docs/worktree/delivery-identity.md +41 -0
- package/docs/worktree/profile.md +107 -0
- package/docs/worktree/reclaim-and-watch.md +96 -0
- package/docs/worktree/review-lifecycle.md +92 -0
- package/docs/worktree/spawn-and-stack.md +74 -0
- package/domains/loop/loop-runtime.mjs +1056 -0
- package/domains/orchestrate/contract-tool.mjs +169 -0
- package/domains/orchestrate/host_capability_cache.mjs +437 -0
- package/domains/orchestrate/orchestration-ledger.mjs +332 -0
- package/domains/orchestrate/orchestration-metadata.mjs +4 -0
- package/domains/orchestrate/orchestration-reflection.mjs +119 -0
- package/domains/orchestrate/resolve_model_policy.mjs +311 -0
- package/domains/orchestrate/review-budget.mjs +162 -0
- package/domains/orchestrate/worker-capability-preflight.mjs +227 -0
- package/domains/verify/verification-runtime.mjs +1638 -0
- package/domains/worktree/worktree-archive.mjs +135 -0
- package/domains/worktree/worktree-artifact.mjs +123 -0
- package/domains/worktree/worktree-batch-integrate.mjs +713 -0
- package/domains/worktree/worktree-batch-plan.mjs +198 -0
- package/domains/worktree/worktree-batch-result.mjs +241 -0
- package/domains/worktree/worktree-core.mjs +908 -0
- package/domains/worktree/worktree-doctor.mjs +493 -0
- package/domains/worktree/worktree-history.mjs +377 -0
- package/domains/worktree/worktree-learning.mjs +110 -0
- package/domains/worktree/worktree-lifecycle.mjs +786 -0
- package/domains/worktree/worktree-merge-preview.mjs +409 -0
- package/domains/worktree/worktree-mgr.mjs +261 -0
- package/domains/worktree/worktree-process.mjs +55 -0
- package/domains/worktree/worktree-profile.mjs +800 -0
- package/domains/worktree/worktree-provider-gitlab.mjs +59 -0
- package/domains/worktree/worktree-reclaim.mjs +683 -0
- package/domains/worktree/worktree-review-refresh.mjs +574 -0
- package/domains/worktree/worktree-review-watch.mjs +661 -0
- package/domains/worktree/worktree-scan.mjs +510 -0
- package/domains/worktree/worktree-trace-test-worker.mjs +23 -0
- package/domains/worktree/worktree-trace.mjs +478 -0
- package/manage-worktrees/SKILL.md +87 -0
- package/manage-worktrees/agents/openai.yaml +4 -0
- package/manage-worktrees/scripts/worktree-mgr.mjs +10 -0
- package/manage-worktrees/scripts/worktree-scan.mjs +10 -0
- package/orchestrate-subagents/SKILL.md +173 -0
- package/orchestrate-subagents/agents/openai.yaml +4 -0
- package/orchestrate-subagents/scripts/contract-tool.mjs +10 -0
- package/orchestrate-subagents/scripts/host_capability_cache.mjs +10 -0
- package/orchestrate-subagents/scripts/orchestration-ledger.mjs +10 -0
- package/orchestrate-subagents/scripts/orchestration-reflection.mjs +10 -0
- package/orchestrate-subagents/scripts/resolve_model_policy.mjs +10 -0
- package/orchestrate-subagents/scripts/review-budget.mjs +10 -0
- package/orchestrate-subagents/scripts/worker-capability-preflight.mjs +10 -0
- package/package.json +48 -0
- package/run-agent-verify-loop/SKILL.md +127 -0
- package/run-agent-verify-loop/agents/openai.yaml +4 -0
- package/run-agent-verify-loop/scripts/loop-runtime.mjs +10 -0
- package/schemas/artifact-ref-v1.schema.json +23 -0
- package/schemas/batch-result-v1.schema.json +138 -0
- package/schemas/controller-recheck-record-v1.schema.json +22 -0
- package/schemas/convergence-report-v1.schema.json +9 -0
- package/schemas/effective-worker-capability-v1.schema.json +36 -0
- package/schemas/embedded-verification-record-v1.schema.json +32 -0
- package/schemas/evidence-package-v1.schema.json +41 -0
- package/schemas/improvement-proposal-v1.schema.json +18 -0
- package/schemas/loop-state-v1.schema.json +34 -0
- package/schemas/model-policy-resolution-v1.schema.json +41 -0
- package/schemas/orchestration-ledger-v1.schema.json +110 -0
- package/schemas/reflection-record-v1.schema.json +24 -0
- package/schemas/review-result-v1.schema.json +37 -0
- package/schemas/task-contract-v1.schema.json +83 -0
- package/schemas/verification-profile-v1.schema.json +60 -0
- package/schemas/worker-capability-requirements-v1.schema.json +21 -0
- package/schemas/worktree-binding-v1.schema.json +14 -0
- package/shell-manifest.json +79 -0
- package/verify-agent-output/SKILL.md +119 -0
- package/verify-agent-output/agents/openai.yaml +4 -0
- package/verify-agent-output/scripts/verification-runtime.mjs +10 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# 一次性独立 verifier 协议
|
|
2
|
+
|
|
3
|
+
本文件是 reviewer 行为、输入隔离、证伪步骤和三态 verdict 语义的唯一真源。runtime 校验结构与
|
|
4
|
+
绑定;L1 的语义判断仍由新上下文 reviewer 完成。
|
|
5
|
+
|
|
6
|
+
## 输入
|
|
7
|
+
|
|
8
|
+
只给 reviewer 四类信息:
|
|
9
|
+
|
|
10
|
+
1. 冻结 Task Contract;
|
|
11
|
+
2. 冻结 Artifact Ref 与只读产物;
|
|
12
|
+
3. Verification Profile 中的 L0 入口和 L1 lenses;
|
|
13
|
+
4. runtime 生成的 reviewer view:逐条 acceptance、稳定 ID 与必要证据指针。
|
|
14
|
+
|
|
15
|
+
禁止提供实现者对话、思考过程、自述、上一轮完整报告或“预期通过”的暗示。允许为复核修复提供
|
|
16
|
+
上一轮 finding 的结构化事实,但不提供其方法论与叙事。
|
|
17
|
+
|
|
18
|
+
## 证伪任务
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
你是独立验收者。任务不是确认实现已完成,而是寻找冻结 Artifact 不满足 Task Contract 的证据。
|
|
22
|
+
|
|
23
|
+
1. 只审查给定 Artifact,不修改业务产物、合同、Profile 或验证定义。
|
|
24
|
+
2. 对照 reviewer view 的每个 contract_item_id 和 lenses 主动构造边界情况。
|
|
25
|
+
3. 不采信实现者提供的测试结论;L0 由 runtime 负责,L1 只引用可复核产物或复现证据。
|
|
26
|
+
4. protected_verifier_paths 有变化时,逐项确认是否被 allowed_validation_changes 精确授权;
|
|
27
|
+
弱化验收或越权修改属于 verification_definition finding。
|
|
28
|
+
5. 输出 fail、no_defect_found、undecidable 三态之一。无法获得会改变结论的真源或证据时必须
|
|
29
|
+
undecidable,不用低保证结果替代。
|
|
30
|
+
6. safety finding 不能被其他通过项抵消。
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
视觉与主观结果仍须从设计稿、协议、计划等裁决真源独立推导。涉及图层合成时核对整组图层,按
|
|
34
|
+
“参数 < 导出渲染 < 原生渲染”逐级提高证据;最高必要证据不可得且影响结论时输出 `undecidable`。
|
|
35
|
+
|
|
36
|
+
## Review Result v1
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"schema_version": 1,
|
|
41
|
+
"review_result_id": "uuid",
|
|
42
|
+
"contract_digest": "sha256:...",
|
|
43
|
+
"verification_profile_digest": "sha256:...",
|
|
44
|
+
"artifact_ref": {},
|
|
45
|
+
"challenge_nonce": "controller-issued-nonce",
|
|
46
|
+
"verdict": "fail | no_defect_found | undecidable",
|
|
47
|
+
"findings": [
|
|
48
|
+
{
|
|
49
|
+
"contract_item_id": "stable-id",
|
|
50
|
+
"class": "functional | scope | verification_definition | safety",
|
|
51
|
+
"evidence": "artifact or reproduction evidence",
|
|
52
|
+
"expected": "contract requirement",
|
|
53
|
+
"actual": "observed result"
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"forensics": ["实际读取、构造或比对的证据"],
|
|
57
|
+
"review_result_digest": "sha256:..."
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
约束:
|
|
62
|
+
|
|
63
|
+
- `contract_digest`、`verification_profile_digest`、`artifact_ref` 和 `challenge_nonce` 必须从当前
|
|
64
|
+
`review-input` 原样复制,不得由 controller 在 reviewer 输出后补写,也不得复用其他 run 的 Review Result;
|
|
65
|
+
|
|
66
|
+
- `fail` 的 findings 非空,每条字段完整且引用已冻结 acceptance ID;
|
|
67
|
+
- `no_defect_found` 的 findings 为空、forensics 非空;它只表示在取证范围内未发现缺陷;
|
|
68
|
+
- `undecidable` 至少包含一条 finding,说明缺失证据及其对应 acceptance;
|
|
69
|
+
- 任何 safety finding 都使最终 outcome 至少为 `blocked_safety`;
|
|
70
|
+
- reviewer 不填写 L0 exit code,不生成 Evidence,不宣布 Goal 或全局任务完成。
|
|
71
|
+
|
|
72
|
+
## 回传
|
|
73
|
+
|
|
74
|
+
一次性模式将 Review Result 交还 runtime 后停止。若上层 Loop 决定继续,只把 findings 的
|
|
75
|
+
`contract_item_id / class / evidence / expected / actual` 回传 implementer,不回传 reviewer 的隐藏
|
|
76
|
+
推理或完整取证方法论。
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# 批量集成验收契约
|
|
2
|
+
|
|
3
|
+
## 选择模式
|
|
4
|
+
|
|
5
|
+
- **分支矩阵**:各 feature 相互独立,只需批量跑检查。固定每个 SHA 后分别验收,不建集成树。
|
|
6
|
+
- **合成候选**:需验证交叉文件、编译、运行时或用户链路兼容性。每批、每仓创建一棵一次性候选树。
|
|
7
|
+
|
|
8
|
+
选哪个由 SKILL.md 第 8 节的口径决定:同一仓库、同一目标分支的并行输入 ≥3 时默认走合成候选——此时
|
|
9
|
+
"互不触碰"的人工评估视为不可信,不得据它豁免;=2 时按三条判据走,交叉面成立即合成。跨仓或目标
|
|
10
|
+
分支不同的输入不计入同批。
|
|
11
|
+
|
|
12
|
+
不维护长期共享 integration 分支。长期分支会混入旧 feature,无法证明报告对应哪组输入。
|
|
13
|
+
|
|
14
|
+
集成候选也**不作为 change request 载体**。它的产出是一份"这组输入合成后兼容"的验收结论;合入仍按
|
|
15
|
+
可独立评审、合入和回退的交付单元分别进行。用聚合载体代替各自载体会同时失去评审独立性、回退
|
|
16
|
+
粒度,以及各输入自己的合入监听。
|
|
17
|
+
|
|
18
|
+
## 输入契约
|
|
19
|
+
|
|
20
|
+
`plan-batch` 的 selector 只能指向当前 repository identity 的 tracked record。调用者先按项目规则 fetch target,工具本身保持离线只读。
|
|
21
|
+
|
|
22
|
+
计划只接受:
|
|
23
|
+
|
|
24
|
+
1. `task_status` 为 `ready_for_review` 或 `integrating`。
|
|
25
|
+
2. worktree 存在且干净,没有 merge/rebase/cherry-pick/revert 中间态。
|
|
26
|
+
3. live HEAD 等于 trace `last_head`。
|
|
27
|
+
4. upstream 存在且指向同一 HEAD,证明精确产物已推送。
|
|
28
|
+
|
|
29
|
+
工具会先排除 target 已包含的 HEAD,再按 Git 祖先关系折叠重复/父分支。`included` 保留用户给定顺序;顺序参与 fingerprint,不得在合成时重排。
|
|
30
|
+
|
|
31
|
+
fingerprint 只绑定 target SHA 和有序输入 SHA,不纳入本机路径、repository UUID 或平台默认目录,因此同一组 Git 对象在不同宿主上保持一致。验收契约与环境指纹另外记录;它们变化时即使 Git fingerprint 未变,报告也必须标记 `stale`。
|
|
32
|
+
|
|
33
|
+
## 冻结前的冲突预测
|
|
34
|
+
|
|
35
|
+
冲突对和冲突文件如果只在真的合到一半时才暴露,合并排序和"这两支是不是该并成一支"就都成了事后
|
|
36
|
+
补救。`plan-batch --scan-conflicts` 把这份信息提前到规划期。
|
|
37
|
+
|
|
38
|
+
**形态是 `plan-batch` 的附加输出,不是独立子命令。** 理由:矩阵要针对的恰好是这份计划**冻结下来的
|
|
39
|
+
那一组输入**——同一批 selector、同一个 target、同一套折叠与准入规则(dirty / HEAD 漂移 / 未推送的
|
|
40
|
+
输入根本不该进矩阵,否则读到的是不可复现的现场)。独立子命令得把选择器解析、准入和折叠再实现
|
|
41
|
+
一遍,两套口径迟早漂移。因此扫描只挂在 `cmdPlanBatch` 上,**不进 `computeBatchPlan`**:后者同时是
|
|
42
|
+
`batch-integrate` 的新鲜度重算口径,把扫描塞进去会让每次合成都白跑一遍 `merge-tree`,也会把决策
|
|
43
|
+
辅助信息混进"必须逐项比对"的冻结契约。指纹只绑 SHA,加不加 flag 都一样。
|
|
44
|
+
|
|
45
|
+
干跑用 `git merge-tree --write-tree`:合并在**对象库**里算完,只产生未被任何 ref 引用的临时
|
|
46
|
+
tree/blob(随 gc 回收),不动工作区、index、HEAD 和任何 ref,因此可以在 `plan-batch` 的只读语义下
|
|
47
|
+
跑,也不需要先建候选树。
|
|
48
|
+
|
|
49
|
+
**冲突判定只认退出码,不认文件条目数。** git-merge-tree(1) 的 EXIT STATUS 是 0=可自动合并、
|
|
50
|
+
1=有冲突、其他=Git 自身失败;同一页的 MISTAKES TO AVOID 明确写着不得把空的 Conflicted file info
|
|
51
|
+
当成干净合并——有几类目录重命名冲突就是退出码 1 却没有任何 unmerged 文件条目。按条目数判 clean
|
|
52
|
+
会把真冲突报成"没事",这是最坏的一种错。这类格子的信息全在 `conflict_notes` 里,人读输出用
|
|
53
|
+
`[NOTE]` 单独打出来。
|
|
54
|
+
|
|
55
|
+
**Git ≥ 2.39。** `merge-tree --write-tree` 2.38 就有,但本扫描依赖 `-z` 信息段里的结构化 NUL 记录
|
|
56
|
+
(`<路径数>NUL<路径>...NUL<conflict-type>NUL<message>NUL`,其中 `<conflict-type>` 是 man page 明说的
|
|
57
|
+
stable string);2.38 的 `-z` 信息段还是自由文本,按结构化格式去解会把消息当类型,冲突类型粗分
|
|
58
|
+
随之错判。与其写一段本机无法实测的 2.38 兼容分支,不如把线抬到 2.39 并 fail-closed 降级:低版本
|
|
59
|
+
整段回报 `supported: false` 并说明原因,计划本身照常冻结——**宁可没有矩阵,不要一份可能错的矩阵。**
|
|
60
|
+
|
|
61
|
+
输出结构(`conflict_scan`):
|
|
62
|
+
|
|
63
|
+
- `pairs[]`:两两干跑。每对给 `merge_base`、`conflict_files`、`adjacent_files`、`state`、
|
|
64
|
+
`files[]`、`files_total`、`conflict_notes[]`。
|
|
65
|
+
- `state` 五态:`conflict`(退出码 1)、`adjacent`(可自动合但有同文件相邻)、`clean`、
|
|
66
|
+
`incomplete`(能自动合,但相邻面没算出来)、`error`(merge-tree 自身失败)。
|
|
67
|
+
- `adjacent_files` 允许为 `null`,表示相邻面**未知**(merge base 解析不了、`git diff` 失败或超时)。
|
|
68
|
+
未知一律显式标注,绝不退化成 `0`——空集会被读成"确认没有相邻文件",那是静默降级。汇总里
|
|
69
|
+
`incomplete_pairs`、`unknown_adjacency_rows`、`pathless_conflict_pairs` 分别计数,人读输出在存在
|
|
70
|
+
未完成格子时打 `[WARN]`:矩阵不完整就不能据它断言"没有冲突"。
|
|
71
|
+
- `against_target[]`:每个输入各自对 target 干跑一次。它常常全是 `clean`——这恰好说明冲突只在
|
|
72
|
+
"合到一起"时出现,正是矩阵要提前暴露的东西。
|
|
73
|
+
- `files[].class` 三分:`overlapping`(Git 报的内容冲突,同 hunk)、`structural`(改/删、重命名、
|
|
74
|
+
distinct types 这类非内容重叠冲突,处置方式和挑 hunk 完全不同)、`adjacent`(两支相对
|
|
75
|
+
merge base 都改了同一文件,但能自动合)。`adjacent` 单独成类是因为语义冲突只会藏在这一格,
|
|
76
|
+
机器判不了,必须交给人看清单。
|
|
77
|
+
- **截断只发生在展示层。** `files[]` 每对上限 50 项并置 `files_truncated`,但 `files_total`、
|
|
78
|
+
`conflict_files` 和 `summary.regenerated_paths` 都跑在**未截断的全量清单**上——先截断再统计会让
|
|
79
|
+
排在 50 项之后的 lock/golden 从产物类汇总里凭空消失,而那恰恰是最需要被看见的一类。
|
|
80
|
+
- `files[].regenerated`:命中 lock / golden / codegen / dist 这类"只能在合成态重新生成"的产物
|
|
81
|
+
(见 Profile 的 `post_integrate_steps`)。命中只是提示,portable core 不猜也不代跑生成命令。
|
|
82
|
+
- `summary.inputs[]`:按冲突面降序,直接支撑"冲突面大的压轴"这条排序口径。排序主键是
|
|
83
|
+
`conflicting_peers` 而不是 `conflict_files`——没有文件条目的目录重命名类冲突同样是真冲突,
|
|
84
|
+
不能因为 `conflict_files=0` 被排到干净输入后面。
|
|
85
|
+
|
|
86
|
+
**已知边界**:两两干跑预测的是**成对**冲突,实际合成是顺序累积的三方合并,两两干净不等于合成一定
|
|
87
|
+
干净。矩阵是决策输入,不是通过证明,替代不了 `batch-integrate` 的实合与门禁。
|
|
88
|
+
|
|
89
|
+
## 候选树状态
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
collecting -> planned -> composing -> verifying -> passed / failed / stale -> reclaimed
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
- `planned`:保存 fingerprint、target SHA、有序输入 SHA。
|
|
96
|
+
- `composing`:只有一个 controller/integrator 写候选树。
|
|
97
|
+
- `verifying`:候选树已干净,验收器只读候选 SHA。
|
|
98
|
+
- `failed`:区分 composition conflict 和 test failure,不把冲突修复混入候选树。
|
|
99
|
+
- `stale`:target、输入、顺序或验收契约任一变化。
|
|
100
|
+
|
|
101
|
+
## 合成执行
|
|
102
|
+
|
|
103
|
+
`batch-integrate` 负责 `planned -> composing` 这一段,并只负责这一段:
|
|
104
|
+
|
|
105
|
+
- **新鲜度**:按**原始 selector 全集**(计划中的 `requested_selectors`)重算,与冻结计划逐项比对
|
|
106
|
+
repository identity、target ref/SHA、有序输入、被折叠/已合入输入集合和 fingerprint;任一漂移或
|
|
107
|
+
重算出现 blocker 即拒绝,要求重新 `plan-batch`。只回算 `included` 是不够的:被折叠的父分支后来
|
|
108
|
+
前进时,指纹不变的假象会让那部分改动被静默漏出合成结果。不存在"就地放行"的旁路。
|
|
109
|
+
- **候选身份**:同 fingerprint 幂等复用;fingerprint 变化视为新的一次性候选,另起 semantic task
|
|
110
|
+
并双向登记替代关系,旧候选先冻结为 `abandoned`。一次性候选不复用交付身份。跨会话只能读取
|
|
111
|
+
已完成候选的 `already_composed` 结果;任何续合、重置或台账改写前必须先 `handoff` 给当前 controller。
|
|
112
|
+
- **已合成候选不重置**:合成后候选树通常会因执行 `post_integrate_steps` 而前进,HEAD 不再等于
|
|
113
|
+
`composed_sha`。此时同指纹重跑只做幂等回报,不重置候选、不重置步骤状态;HEAD 既不等于也不是
|
|
114
|
+
`composed_sha` 后继时 fail-closed 要求人工核对。只有当前 owner 同时提供 `--recompose` 与
|
|
115
|
+
`--recompose-head <候选当前完整 HEAD>` 才可重合成:工具先记录包含 discarded/authorized HEAD 的
|
|
116
|
+
`batch_candidate_recompose_authorized` event,并在 reset 前再次做 HEAD CAS,防止陈旧授权丢弃新提交。
|
|
117
|
+
- **冲突**:fail-closed 停在冲突处,报告冲突文件、双方来源 SHA 和候选树路径;不自动解、不自动
|
|
118
|
+
abort。人工裁决属于 controller 的职责,工具只保证现场可读、可复现。
|
|
119
|
+
- **rerere**:候选树默认启用 `rerere.enabled` + `rerere.autoUpdate`(worktree 级配置,不写全局)。
|
|
120
|
+
两项必须同时生效:只有 `enabled` 时 rerere 会把已录解法写回工作区却不更新 index,合成循环仍会
|
|
121
|
+
把它判成真冲突,重放形同失效。因此仓库已继承 `rerere.enabled=true` 也不会跳过补齐 `autoUpdate`。
|
|
122
|
+
自动启用共享 `extensions.worktreeConfig` 时会写一条独立审计事件
|
|
123
|
+
(`repository_config_extension_enabled`),如实记录覆盖前值,并可区分"本轮写入"与"原本已启用";
|
|
124
|
+
Git boolean 通过 `git config --bool` 归一化,`yes/on/1` 不会被误判成未启用。
|
|
125
|
+
人工裁决并提交一次后,重跑合成会自动重放同一冲突的解法——多轮候选之间不再重复手解。
|
|
126
|
+
解法缓存位于共享 common dir 的 `rr-cache/`,因此同仓任何 worktree 录下的解法都会被复用;
|
|
127
|
+
一个错误解法同样会跨候选扩散,需要时用 `git rerere forget <path>` 清除。
|
|
128
|
+
worktree 级配置依赖仓库 `extensions.worktreeConfig`;`core.bare` / `core.worktree` 非默认值时
|
|
129
|
+
工具拒绝自动启用并回报原因,不擅自搬动这两个键。
|
|
130
|
+
- **门禁**:`batch-integrate` 不执行任何验收命令。`post_integrate_steps` 只回显、不代跑,执行结果
|
|
131
|
+
由 `batch-step` 登记。这条边界与"portable core 不执行 Profile 中的任意 shell command"是同一条。
|
|
132
|
+
|
|
133
|
+
## 验收报告
|
|
134
|
+
|
|
135
|
+
报告至少记录:
|
|
136
|
+
|
|
137
|
+
- repository identity、target ref/SHA、plan fingerprint。
|
|
138
|
+
- 有序输入的 task、worktree ID、branch、HEAD、upstream。
|
|
139
|
+
- 候选分支与最终 candidate SHA。
|
|
140
|
+
- 验收契约/环境指纹、每项命令、退出码、证据地址。
|
|
141
|
+
- 结论 `passed` / `failed` / `stale` 及失败归因。
|
|
142
|
+
|
|
143
|
+
完成门禁后,用 runtime 冻结终态,而不是只把 task 标成 `done`:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
agentkit worktree batch-result <candidate> \
|
|
147
|
+
--state passed \
|
|
148
|
+
--candidate <exact-live-head> \
|
|
149
|
+
--evidence <evidence.json>
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`passed` / `failed` 必须提供结构化 Evidence,且 `contract_digest` 必须非空;`stale` 必须提供
|
|
153
|
+
`--reason`,Evidence 可选,缺少独立合同文件时其 digest 可以为 null。这里的 null 只表达“候选在形成
|
|
154
|
+
可判定验收结论前已失效”,不能用于通过/失败证明。结果一旦写入
|
|
155
|
+
不可覆盖:target、输入、顺序、候选 SHA 或验收合同变化都另起候选。`passed` 还要求 Profile 声明的
|
|
156
|
+
`post_integrate_steps` 已全部 `done` 或 `skipped`;任何 `pending` / `failed` 都 fail-closed。
|
|
157
|
+
|
|
158
|
+
[`Batch Result schema v1`](../../schemas/batch-result-v1.schema.json) 的 Evidence manifest 只保存有界摘要:
|
|
159
|
+
顶层 `contract_digest` 与 `checks[]`;每项 check 保存稳定 `name`、
|
|
160
|
+
结构化 `environment`、argv 数组、`outcome`、`exit_code` 和带 SHA-256 digest 的 `evidence_refs[]`。不要把
|
|
161
|
+
原始日志、环境变量值、凭证或大块设备输出放入 trace;把它们放在项目认可的证据存储,只登记稳定 ref
|
|
162
|
+
和 digest。environment 键必须是 lowercase 标识符并拒绝 secret/token/password/credential/key 类名称,
|
|
163
|
+
值只接受最长 500 字符的无换行字符串、有限数字或布尔值;这些限制同时写入 schema 与 runtime。
|
|
164
|
+
runtime 绑定 live candidate HEAD、batch fingerprint、target SHA、有序输入 SHA、Evidence
|
|
165
|
+
manifest digest,并把工作完成态收敛为 `task_status=done`;真实验收语义仍只由 `batch_result.outcome`
|
|
166
|
+
表达,`done` 本身不代表通过。
|
|
167
|
+
|
|
168
|
+
已冻结 `passed` / `failed` / `stale` 的候选如不作为 MR 载体,可按
|
|
169
|
+
[reclaim-and-watch.md](reclaim-and-watch.md) 的证据归档通道回收。归档 ref 只保护当前仓库免受 Git GC,
|
|
170
|
+
不提供跨机器、跨 clone 或远端灾备保证;需要长期/跨机保留时再按项目政策推送专用 ref 或保存 bundle。
|
|
171
|
+
|
|
172
|
+
Git worktree 只隔离工作目录和 index,不隔离端口、模拟器/设备、Docker 名、外部数据库、用户级 cache 或凭证。项目 wrapper/Profile 必须为并行候选分配独立运行时资源,或显式串行。
|
|
173
|
+
|
|
174
|
+
## 多仓项目
|
|
175
|
+
|
|
176
|
+
项目目录可能只是包含多个 Git 仓库的容器。先按 repository identity 分组,每仓独立规划/合成/验收;上层批次台账再绑定各仓 candidate SHA 和跨仓环境测试。不得把一个仓的 worktree 冒充整个项目的集成边界。
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Worktree 交付身份
|
|
2
|
+
|
|
3
|
+
仅在同一 Agent 已有未回收树、需要第二棵树、替代旧树,或发现未登记的并存关系时读取。
|
|
4
|
+
|
|
5
|
+
## 三种关系
|
|
6
|
+
|
|
7
|
+
- **复用**:验收结果、目标 ref、写入归属相同且改动面实质重叠。目录或提交历史不够整洁不构成新交付。
|
|
8
|
+
- **并存**:成果能独立评审、合入和回退,依赖确需单独落地,或多个写入者必须物理隔离。不同 MR、
|
|
9
|
+
branch 或命名只是线索,不能单独证明独立。
|
|
10
|
+
- **替代**:旧树因基线、历史、环境、权限或 owner 问题不能继续。先冻结旧写入,记录旧树到新树、
|
|
11
|
+
独有改动保存位置和退出条件;迁移结束立即停止旧 watcher、处理旧 change request 并回收。
|
|
12
|
+
|
|
13
|
+
manager 用真实 `agent-id` 做最小门禁。同一会话已有未回收树时,普通 `spawn` 返回
|
|
14
|
+
`DELIVERY_WORKTREE_EXISTS`。同一交付直接进入旧路径;确属独立并行时说明可独立交付的理由:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
agentkit worktree spawn independent-release-audit \
|
|
18
|
+
--agent codex --agent-id <real-thread-id> \
|
|
19
|
+
--purpose "独立发布审计" \
|
|
20
|
+
--parallel-reason "与现有改动可独立评审、合入和回退"
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
替代旧树前先使旧树 clean,并用 `touch ... --status abandoned --note <迁移边界>` 冻结:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
agentkit worktree spawn current-ios-validation \
|
|
27
|
+
--agent codex --agent-id <real-thread-id> \
|
|
28
|
+
--purpose "迁移到新基线" \
|
|
29
|
+
--supersedes old-ios-validation \
|
|
30
|
+
--replacement-reason "旧基线不可继续,独有提交已保存"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`--parallel-reason` 与 `--supersedes/--replacement-reason` 互斥,都是人工裁决后的审计出口。
|
|
34
|
+
存量替代树用 `supersede` 补双向关系,不伪造新树或手改 trace:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
agentkit worktree supersede old-ios-validation \
|
|
38
|
+
--by current-ios-validation --reason "旧树已被完整替代"
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
该命令只接受同一会话、owner 一致且新树不早于旧树的组合,幂等写入双方关系;冲突关系 fail-closed。
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Repository Profile 与项目适配边界
|
|
2
|
+
|
|
3
|
+
portable runtime 在没有配置时即可运行。仓库若要固定 base、命名模板、任务来源或 change-request provider,可在 Git primary worktree 根放置 `.worktree-trace.json`。
|
|
4
|
+
|
|
5
|
+
## 推荐最小 Profile
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"schema_version": 1,
|
|
10
|
+
"default_base": "origin/main",
|
|
11
|
+
"branch_template": "{host}/{task}",
|
|
12
|
+
"path_template": "{host}-{task}",
|
|
13
|
+
"task_naming": {
|
|
14
|
+
"mode": "semantic",
|
|
15
|
+
"example": "ci-gate-hardening"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
semantic naming 是推荐且默认的安全模式:
|
|
21
|
+
|
|
22
|
+
- task 必须是 lowercase hyphenated semantic slug。
|
|
23
|
+
- task 至少包含两个以字母开头的词。
|
|
24
|
+
- branch/path 模板必须包含完整 `{host}` 和 `{task}`。
|
|
25
|
+
- semantic 模式禁止 `{id8}` 和 `{task_short}`;内部 identity 只进 metadata。
|
|
26
|
+
|
|
27
|
+
如果仓库需要兼容既有命名,可以显式选择 legacy `slug` mode,但这会降低可读性;不要为新仓库使用它。
|
|
28
|
+
|
|
29
|
+
从 legacy `slug` 切换到 `semantic` 时,`doctor` 会把仍活跃但不满足新 DoD 的存量 record 报为 error。这是有意的迁移压力:先完成、handoff 或回收存量树;迁移窗口也可以暂留 `slug`,不要静默改名已有 worktree。
|
|
30
|
+
|
|
31
|
+
## 可配置内容
|
|
32
|
+
|
|
33
|
+
Profile 可声明:
|
|
34
|
+
|
|
35
|
+
- `default_base`:默认基线。primary Profile 启用该字段时必须使用可 fetch 的 `remote/branch` 形式,例如 `origin/main`;本地 `main` 或 `feature/foo` 不属于可刷新配置。
|
|
36
|
+
- `worktree_root`:仓库级集中 worktree 根;CLI `--root` 和 `WORKTREE_ROOT` 优先级更高。显式值不可写时 fail-closed;只有零配置默认 root 才允许 manager 使用安全降级根。
|
|
37
|
+
- `task_naming`、`branch_template`、`path_template`:可见命名约定。
|
|
38
|
+
- collision scan adapter:将仓库自己的任务认领信息并入 dirty/recent-commit 扫描。
|
|
39
|
+
- change-request provider:当前 bundled adapter 支持 GitLab push-options;未配置时走仓库自己的 PR/MR 流程。
|
|
40
|
+
- `post_integrate_steps`:声明"合成之后需要重新生成"的动作(见下)。
|
|
41
|
+
- 无秘密的 prerequisite/doctor 提示。
|
|
42
|
+
|
|
43
|
+
Profile 是数据,不是任意命令执行入口。不要放 shell command、token、cookie、私钥或个人凭证路径。
|
|
44
|
+
|
|
45
|
+
`default_base` 应表达仓库当前实际采用的默认基线。需要在版本线与 main 间切换的仓库,应由自己的发布
|
|
46
|
+
流程显式更新该值(例如 `origin/dev/x.y.z` → `origin/main`)。portable core 不扫描 `dev/*` 猜活跃分支,
|
|
47
|
+
也不引入一个与 `default_base` 竞争优先级的隐式覆盖项。
|
|
48
|
+
|
|
49
|
+
## 合成后再生成步骤
|
|
50
|
+
|
|
51
|
+
golden 基准、代码生成产物、依赖锁文件这类东西被多个分支各自重新生成时,合成必然冲突,且冲突
|
|
52
|
+
无法靠挑一边解决——只有在合成态重新生成一次才是对的。这类动作高度依赖具体仓库,portable core
|
|
53
|
+
不知道该跑什么,也**不允许**替仓库跑任何命令。
|
|
54
|
+
|
|
55
|
+
因此 Profile 只**声明**清单,`batch-integrate` 合成完成后只回显它,由 controller 逐条执行,再用
|
|
56
|
+
`batch-step` 登记结果:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"schema_version": 1,
|
|
61
|
+
"post_integrate_steps": [
|
|
62
|
+
{ "name": "regenerate-golden", "hint": "在候选树重跑 golden 生成命令后提交" },
|
|
63
|
+
{ "name": "recompute-lock", "hint": "重算依赖锁文件并确认无版本漂移" }
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
- 每项只有 `name` 与 `hint` 两个键,**没有也不会有 `command` / `run` / `script`**;未知键一律
|
|
69
|
+
fail-closed,防止有人把 shell 塞进声明位,绕过"portable core 不执行 Profile 内容"这条边界。
|
|
70
|
+
- `name` 是 kebab-case slug、同一 Profile 内唯一,它是 `batch-step` 登记结果的键。
|
|
71
|
+
- `hint` 是给人看的单行说明(≤240 字符),不是可执行内容。
|
|
72
|
+
- 最多 20 项。清单过长通常说明这些动作应当收进仓库自己的一条 wrapper 命令。
|
|
73
|
+
|
|
74
|
+
显式 `--config <path>` 不执行 primary Profile 的 baseline fetch/drift gate,只读取本地 ref;它适合已经人工核对的离线恢复,不等于自动证明配置新鲜。
|
|
75
|
+
|
|
76
|
+
## 通用层与项目层
|
|
77
|
+
|
|
78
|
+
放在本 skill:
|
|
79
|
+
|
|
80
|
+
- worktree 创建、接管、状态机、event/record trace、审计和保守回收。
|
|
81
|
+
- 通用 dirty/recent-commit collision scan。
|
|
82
|
+
- semantic naming DoD 与 fail-closed 校验。
|
|
83
|
+
- provider 协议和 GitLab push-options adapter。
|
|
84
|
+
|
|
85
|
+
留在目标仓库:
|
|
86
|
+
|
|
87
|
+
- `.worktree-trace.json` 与任务系统 adapter 的启用配置。
|
|
88
|
+
- 项目测试、lint、commit gate、构建、签名、视觉验收和部署流程。
|
|
89
|
+
- 特定 app/module 的初始化、凭证 doctor 和 finish wrapper。
|
|
90
|
+
- owner、默认目标分支、MR/PR 审批和 source branch 删除策略。
|
|
91
|
+
|
|
92
|
+
项目 wrapper 可以先调用自己的门禁,再调用 portable manager 的 `submit`、`watch` 或 `reclaim`;不要把项目目录名或业务判断回写进 portable scripts。
|
|
93
|
+
|
|
94
|
+
## Kiro tasks adapter
|
|
95
|
+
|
|
96
|
+
bundled scan 保留一个可选 `kiro_tasks` adapter,用来读取 Profile `glob` 命中的任务文件中实施中的任务及“影响文件或目录”。`glob` 必须是仓库内安全相对路径,支持路径段内 `*` / `?` 和跨目录 `**`,禁止绝对路径、空路径段和 `..`。典型值为 `.kiro/specs/*/tasks.md`。只有 Profile 显式启用时才生效;不使用 Kiro 的仓库不会访问该目录。
|
|
97
|
+
|
|
98
|
+
新增任务系统时应实现独立 adapter,并保持:
|
|
99
|
+
|
|
100
|
+
1. 只读目标仓库。
|
|
101
|
+
2. 输出规范化的 owner/task/path claims。
|
|
102
|
+
3. 解析失败时报可诊断错误,不假装 `CLEAR`。
|
|
103
|
+
4. 不把平台或业务名写进 portable collision 算法。
|
|
104
|
+
|
|
105
|
+
## 同步和分发
|
|
106
|
+
|
|
107
|
+
本目录中的 `scripts/` 是安装后执行的 portable runtime。项目如果 vendoring 一份副本用于 CI 或 clone 后即用,应记录 upstream 版本并做确定性 diff/check;项目专用 wrapper 不参与同步。
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# Watch 与保守回收
|
|
2
|
+
|
|
3
|
+
仅在准备武装、恢复或解除 watcher,以及执行 `reclaim`/`archive` 或诊断 `KEEP/BRANCH_PENDING` 时读取。
|
|
4
|
+
|
|
5
|
+
## 内容监听
|
|
6
|
+
|
|
7
|
+
监听绑定“冻结的 head SHA 已成为目标 ref 祖先”这一事实,不绑定 change request 载体。载体改为他人代推、
|
|
8
|
+
聚合 MR 或其他分支时不解除监听。进入 `ready_for_review` 默认武装;`submit` 只是其中一个入口。电脑重启后
|
|
9
|
+
由 `resume-all` 恢复 stale watcher;change request 已关闭且明确不会合入时用 `unwatch`。
|
|
10
|
+
|
|
11
|
+
## 已推送成果
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
agentkit worktree reclaim <task-or-id> --pushed <sha-or-unique-prefix>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
只有无 stash、树干净、branch/HEAD 已进入给定 SHA,才执行:
|
|
18
|
+
|
|
19
|
+
```text
|
|
20
|
+
final_snapshot -> reclaim_ready -> git worktree remove -> branch cleanup -> reclaimed
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
终态事件将非 `abandoned` 任务收敛为 `done`,并以最终 source HEAD 闭合 ownership epoch。旧版本若留下
|
|
24
|
+
`reclaimed` 但状态或 epoch 未闭合,重复同一命令会追加 reconciliation event 后再对账。
|
|
25
|
+
|
|
26
|
+
给定 SHA 还必须由待回收 branch 以外的持久 ref 保护:local/remote branch、tag 或
|
|
27
|
+
`refs/worktree-archive/*` 均可。`--pushed <当前 HEAD>` 但只有候选 branch 自己引用时会被拒绝,因为删掉
|
|
28
|
+
branch 后对象仍会成为 dangling object;这不是“已推送”证据。
|
|
29
|
+
|
|
30
|
+
`--pushed` 是人体工学例外:接受十六进制唯一短前缀,runtime 用 `rev-parse --verify` 展开后,后续 event、
|
|
31
|
+
可达性和 branch cleanup 全部只使用完整 object ID。`--discard`、Artifact、batch candidate 与 evidence
|
|
32
|
+
archive 仍要求完整 SHA,因为它们承担 CAS 或冻结身份边界。
|
|
33
|
+
|
|
34
|
+
## 固定 SHA 的批次验收候选
|
|
35
|
+
|
|
36
|
+
一次性 batch integration candidate 不作为 MR 载体,且正式分支可能用不同 merge topology 合入各输入,
|
|
37
|
+
因此“代码内容已进入目标分支”不等于“设备证据绑定的精确 candidate SHA 已成为目标分支祖先”。先用
|
|
38
|
+
`batch-result` 冻结 `passed` / `failed` / `stale`,再走独立归档回收:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
agentkit worktree reclaim <candidate> \
|
|
42
|
+
--archive-evidence <exact-candidate-head> \
|
|
43
|
+
--reason "固定验收已结束,输入已按正式交付单元处理"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
manager 校验终态 `batch_result`、live HEAD CAS、clean/stash/Git 中间态/submodule,并创建
|
|
47
|
+
`refs/worktree-archive/evidence/<worktree-id>`。只有回读 ref 精确等于候选 HEAD 后,才进入通用
|
|
48
|
+
`reclaim_ready -> remove -> branch cleanup -> reclaimed`。trace 保留 fingerprint、target SHA、有序输入、
|
|
49
|
+
结果/Evidence digest 和归档原因;`task_status` 保持 `done`,不把已通过候选伪装成 `abandoned`。
|
|
50
|
+
|
|
51
|
+
恢复方式:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
git branch <recovery-branch> refs/worktree-archive/evidence/<worktree-id>
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
该 ref 是**本地 GC 保护**,不是远端备份。归档 ref 已存在但指向别的提交、用户 SHA 与 live HEAD 不同、
|
|
58
|
+
结果未冻结或 ref 创建后回读失败时均不删除。命令可在 worktree remove 或 branch cleanup 中断后用同一
|
|
59
|
+
参数幂等重跑。`doctor` 用 `DONE_BATCH_CANDIDATE_RESULT_UNRECORDED` 提示只标 done 未冻结结果,用
|
|
60
|
+
`DONE_EVIDENCE_WORKTREE_RECLAIM_PENDING` 提示已冻结但仍占目录的候选。
|
|
61
|
+
|
|
62
|
+
## 被替代的未推送成果
|
|
63
|
+
|
|
64
|
+
不得为了清理而推送废弃分支。双向替代关系已经登记后,默认先归档旧 HEAD:
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
agentkit worktree reclaim old-task --superseded-by new-task
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
默认 ref 是 `refs/worktree-archive/superseded/<old-worktree-id>`。manager 验证旧树为 `abandoned`、会话和
|
|
71
|
+
owner 一致、替代关系双向、替代树干净,并继续执行 stash、dirty、submodule 和目录审计。只有归档创建并
|
|
72
|
+
回读到精确旧 HEAD 后,才删除目录和 local branch;恢复方式为:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
git branch <recovery-branch> <archive-ref>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
人工明确裁定无需恢复时,才允许精确 SHA 授权丢弃:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
agentkit worktree reclaim old-task \
|
|
82
|
+
--superseded-by new-task --discard <exact-old-head>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`--discard` 不是布尔开关,SHA 必须与实时旧 HEAD 完全一致;归档和丢弃策略登记后不得互换。
|
|
86
|
+
|
|
87
|
+
## 故障与不变量
|
|
88
|
+
|
|
89
|
+
- `abandoned` 只冻结写入,不等于已回收;`doctor` 持续报告残留树和断裂替代关系。
|
|
90
|
+
- 禁止 `rm -rf`、`git worktree remove --force` 和 `branch -D`。
|
|
91
|
+
- branch cleanup 失败时保留 `BRANCH_PENDING`;修复占用后重跑相同 `reclaim`,工具重新验证 branch tip。
|
|
92
|
+
- `git worktree remove` 失败返回非零 `KEEP` 并记录原始错误。即使 Git 登记已解除,物理目录仍在也不能
|
|
93
|
+
标为 `reclaimed`;先恢复权限或登记关系,不用强删掩盖孤儿目录。
|
|
94
|
+
- 含 submodule 的树逐个验证已初始化工作区干净,再自动 deinit 并清理该树私有元数据。submodule 脏、
|
|
95
|
+
未初始化目录非空或 `.git` 指针悬空均返回 `KEEP`。
|
|
96
|
+
- worktree 在宿主或沙箱写权限之外时,先取得精确目录的写权限,再重试回收。
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# 评审、交接与合入监听
|
|
2
|
+
|
|
3
|
+
进入 `ready_for_review`、handoff、提交 change request 或处理 watcher 漂移时读取。
|
|
4
|
+
|
|
5
|
+
## 状态与 watcher
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
agentkit worktree touch <selector> --status blocked --note "等待环境"
|
|
9
|
+
agentkit worktree touch <selector> --status active
|
|
10
|
+
agentkit worktree touch <selector> --status ready_for_review
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`ready_for_review` 默认按该树登记的 `base_ref` 武装监听,Profile `default_base` 只在 record 没有 base 时
|
|
14
|
+
兜底;显式 target 与既有人工 target 仍然优先。HEAD 前进时同一 event 使旧 watcher 失效,
|
|
15
|
+
再尝试冻结新 HEAD。worktree dirty、HEAD 未推送或远端主干不可刷新时 fail-soft,状态更新成功但明确
|
|
16
|
+
回报未武装原因。补齐前提后重跑,或用 `--no-watch` 明确接受人工回收。
|
|
17
|
+
|
|
18
|
+
人工 `watch --target` 可改默认目标;已经显式武装的 target 不被静默改写,换目标先 `unwatch`。陈旧
|
|
19
|
+
watcher 不能覆盖并发 rearm 或 `merge_detected`。旧 SHA 合入不代表新 HEAD 已完成。
|
|
20
|
+
|
|
21
|
+
### Target 前进与显式评审刷新
|
|
22
|
+
|
|
23
|
+
watcher 发现 target SHA 偏离本次武装时冻结的 target baseline、且冻结 HEAD 尚未合入时,只读记录一次
|
|
24
|
+
`target_advanced` event,并用 `git merge-tree` 给出三档预判:
|
|
25
|
+
|
|
26
|
+
- `clean`:`TARGET_ADVANCED_REFRESH_CLEAN`,三方合并干跑无冲突;逐 commit rebase 仍可能不同。
|
|
27
|
+
- `conflict`:`REBASE_NEEDED`,预留人工解冲突时间。
|
|
28
|
+
- `unknown/diverged`:`TARGET_ADVANCED_PREDICTION_UNKNOWN`,不能可靠预判或 target 非快进。
|
|
29
|
+
|
|
30
|
+
watcher 本身不改写历史、不 push。由人或 controller 显式授权一次刷新:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
agentkit worktree refresh-review <selector>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
命令要求 `ready_for_review`、clean、冻结 HEAD 与远端 upstream 完全一致、target 是登记 base 的快进后继。
|
|
37
|
+
它先登记 `review_refresh` marker,再调用同一 managed rebase 事务;成功后使用绑定旧 upstream SHA 的精确
|
|
38
|
+
`--force-with-lease` 推送,回读新远端 HEAD,更新 change request head 并自动重新武装 watcher。
|
|
39
|
+
|
|
40
|
+
无项目 wrapper 时,显式调用默认完成 push,后续门禁由远端 CI 和 merge human gate 承担。项目要在
|
|
41
|
+
push 前跑本地门禁时:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
agentkit worktree refresh-review <selector> --pause-before-push
|
|
45
|
+
# 项目 wrapper 运行 lint/test/sign 等门禁
|
|
46
|
+
agentkit worktree refresh-review <selector> --continue
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
rebase 冲突时保留 managed intent 与 refresh marker;只编辑冲突并 `git add`,然后运行同一
|
|
50
|
+
`refresh-review <selector> --continue`,它会继续 rebase、push、重冻结和 rearm。仍处于 Git rebase
|
|
51
|
+
冲突态时可用 `--abort` 恢复原 HEAD 与原 watcher。`--pause-before-push` 后项目门禁失败时也可
|
|
52
|
+
`--abort`:manager reset 到 `old_head`,以补偿 event 恢复原 base、ownership 与 change-request 边界,
|
|
53
|
+
重武装原 watcher;已发生的 rebase lineage 保留审计,并追加 rollback 记录。远端 branch 必须仍等于
|
|
54
|
+
冻结旧 HEAD;已经 push、远端被他人更新或分支已删除时拒绝自动回滚。非暂停模式中 rebase 已成功而
|
|
55
|
+
push/凭证/网络失败时用 `--continue` 幂等恢复。远端分支不存在会单独报告,其他 SHA 漂移由精确 lease
|
|
56
|
+
门禁拒绝覆盖。
|
|
57
|
+
|
|
58
|
+
## Handoff
|
|
59
|
+
|
|
60
|
+
交接前使树 clean 并 push:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
agentkit worktree handoff <selector> \
|
|
64
|
+
--to-agent kiro --to-agent-id <real-task-id> \
|
|
65
|
+
--note "已完成什么,下一步是什么"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
handoff 保存 ownership boundary SHA;脏树拒绝,禁止用 stash 搬运未提交内容。
|
|
69
|
+
|
|
70
|
+
## Change request
|
|
71
|
+
|
|
72
|
+
先执行目标仓库自己的测试、commit gate、review 和 push 规则。Profile 已启用 provider 时:
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
agentkit worktree submit <selector> \
|
|
76
|
+
--title "<title>" --description "<summary>" --notify auto
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
若 change request 已由 UI/API 创建,用一个 event 原子登记 URL、目标、冻结 HEAD、状态和 watcher:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
agentkit worktree touch <selector> \
|
|
83
|
+
--status ready_for_review \
|
|
84
|
+
--mr "https://gitlab.example/group/project/-/merge_requests/42" \
|
|
85
|
+
--watch-target origin/main --notify auto
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
未给 target 时使用 record 的 `base_ref`;远端 MR target 不同时先核对 provider/UI,再显式传
|
|
89
|
+
真实目标。`--mr` 只接受 HTTP(S) URL;纯文本载体使用 `--change-ref`。
|
|
90
|
+
|
|
91
|
+
watcher 只在冻结 SHA 成为目标 ref 祖先后回收。重启后 `resume-all` 恢复 stale watcher;change request
|
|
92
|
+
关闭且确定不会合入时 `unwatch`。详细回收见 [reclaim-and-watch.md](reclaim-and-watch.md)。
|