@namewta/speculo 1.0.2 → 1.0.4
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/README.md +8 -3
- package/package.json +2 -2
- package/template/AGENTS.md +3 -1
- package/template/canonical/canonical-specdev-goal-plan.md +757 -225
- package/template/canonical/canonical-specdev-grill-with-docs.md +221 -133
- package/template/canonical/canonical-specdev-spec.md +73 -3
- package/template/canonical/canonical-specdev-tickets.md +681 -252
- package/template/canonical/canonical-specdev-wayfinder.md +330 -113
- package/template/commands/archive-and-consolidate.md +39 -3
- package/template/commands/git-history-squash.md +76 -0
- package/template/commands/git-repository-audit.md +3 -602
- package/template/commands/references/git-repository-audit-procedure.md +608 -0
- package/template/skills/archive-and-consolidate/SKILL.md +1 -1
- package/template/skills/archive-and-consolidate/references/entry-procedure.md +11 -3
- package/template/skills/git-history-squash/SKILL.md +2 -0
- package/template/skills/git-history-squash/references/entry-procedure.md +1 -1
- package/template/skills/writing-great-skills/SKILL.md +2 -0
- package/template/skills/writing-great-skills/references/document-contract.md +23 -0
- package/template/workflows/learning/common/rules/activation-and-memory.md +7 -3
- package/template/workflows/ops/common/rules/activation-and-memory.md +7 -3
- package/template/workflows/person/common/rules/activation-and-memory.md +7 -3
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +13 -136
- package/template/workflows/specdev/G-grill-with-docs/references/interview-procedure.md +134 -0
- package/template/workflows/specdev/I-implement/I-implement.md +15 -189
- package/template/workflows/specdev/I-implement/evidence-template.md +12 -0
- package/template/workflows/specdev/I-implement/execution-preflight.md +1 -1
- package/template/workflows/specdev/I-implement/references/implementation-procedure.md +192 -0
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +28 -143
- package/template/workflows/specdev/P-goal-plan/completion-control.md +1 -1
- package/template/workflows/specdev/P-goal-plan/references/goal-lifecycle.md +35 -0
- package/template/workflows/specdev/P-goal-plan/references/goal-tickets-map-template.md +15 -0
- package/template/workflows/specdev/P-goal-plan/references/map-control.md +28 -0
- package/template/workflows/specdev/{O-orchestrate-implementation/O-orchestrate-implementation.md → P-goal-plan/references/multi-change-plan.md} +21 -33
- package/template/workflows/specdev/P-goal-plan/references/replan-and-recovery.md +21 -0
- package/template/workflows/specdev/P-goal-plan/references/single-change-plan.md +149 -0
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +48 -53
- package/template/workflows/specdev/R-review-architecture/architecture-review-template.md +19 -10
- package/template/workflows/specdev/R-review-architecture/proposal-to-ticket.md +3 -1
- package/template/workflows/specdev/R-review-architecture/review-rubric.md +52 -0
- package/template/workflows/specdev/README.md +36 -216
- package/template/workflows/specdev/T-tickets/T-tickets.md +19 -230
- package/template/workflows/specdev/T-tickets/references/planning-procedure.md +233 -0
- package/template/workflows/specdev/T-tickets/ticket-template.md +16 -0
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +14 -0
- package/template/workflows/specdev/T-triage/T-triage.md +3 -1
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +24 -118
- package/template/workflows/specdev/W-wayfinder/references/initiative-discovery.md +29 -0
- package/template/workflows/specdev/W-wayfinder/references/initiative-template.json +8 -0
- package/template/workflows/specdev/W-wayfinder/references/map-traversal.md +120 -0
- package/template/workflows/specdev/W-wayfinder/wayfinder-map-template.md +4 -0
- package/template/workflows/specdev/common/README.md +1 -1
- package/template/workflows/specdev/common/rules/activation-and-memory.md +7 -3
- package/template/workflows/specdev/common/rules/artifact-contract.md +10 -2
- package/template/workflows/specdev/common/rules/operating-governance.md +38 -0
- package/template/workflows/specdev/common/rules/parent-implementation-orchestration.md +6 -2
- package/template/workflows/specdev/common/rules/skill-invocation.md +27 -0
- package/template/workflows/specdev/common/rules/workflow-routing.md +24 -0
- package/template/workflows/specdev/common/rules/workflow-state-and-lifecycle.md +93 -0
- package/template/workflows/specdev/common/schemas/goal-tickets-map.schema.json +33 -0
- package/template/workflows/specdev/common/schemas/initiative.schema.json +94 -0
- package/template/workflows/specdev/common/schemas/ticket.schema.json +168 -1
- package/template/workflows/specdev/common/schemas/tickets-map.schema.json +74 -6
- package/template/workflows/specdev/common/skills/code-review/SKILL.md +3 -2
- package/template/workflows/specdev/common/skills/code-review/references/risk-review.md +25 -0
- package/template/workflows/specdev/common/skills/plan-quality-review/SKILL.md +10 -0
- package/template/workflows/specdev/common/skills/plan-quality-review/references/checklist.md +13 -0
- package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +5 -83
- package/template/workflows/specdev/common/skills/subagent-delivery/references/dispatch-and-accept.md +87 -0
- package/template/workflows/specdev/common/tools/README.md +14 -2
- package/template/workflows/specdev/common/tools/plan-contract.mjs +256 -0
- package/template/workflows/specdev/common/tools/ticket-control.mjs +251 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +58 -40
- package/template/workflows/specdev/manifest.json +97 -1
- package/template/canonical/canonical-specdev-orchestrate-implementation.md +0 -2839
- package/template/workflows/specdev/O-orchestrate-implementation/implementation-evidence-template.md +0 -39
- package/template/workflows/specdev/O-orchestrate-implementation/implementation-map-template.md +0 -50
- package/template/workflows/specdev/O-orchestrate-implementation/implementation-plan-template.md +0 -61
- package/template/workflows/specdev/R-review-architecture/architecture-report-contract.md +0 -123
- package/template/workflows/specdev/R-review-architecture/architecture-review-report-template.html +0 -106
- /package/template/workflows/specdev/{O-orchestrate-implementation/conflict-and-drift.md → P-goal-plan/references/multi-conflict-and-drift.md} +0 -0
- /package/template/workflows/specdev/{O-orchestrate-implementation/execution-loop.md → P-goal-plan/references/multi-execution-loop.md} +0 -0
- /package/template/workflows/specdev/{O-orchestrate-implementation/input-readiness.md → P-goal-plan/references/multi-input-readiness.md} +0 -0
- /package/template/workflows/specdev/{O-orchestrate-implementation/super-dag.md → P-goal-plan/references/multi-super-dag.md} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 探索大需求与 Change 边界
|
|
2
2
|
|
|
3
3
|
## 网页平台运行约定
|
|
4
4
|
|
|
@@ -11,131 +11,40 @@
|
|
|
11
11
|
- 项目代码与测试始终使用项目根相对路径;不写机器绝对路径。工件之间使用上述逻辑路径,不使用 Speculo 的运行时路径标签。
|
|
12
12
|
- 如果网页平台不能直接写项目文件,则按目标文件名输出完整内容,并在答复中明确应保存的位置;不得把“无法写文件”伪装成已经持久化。
|
|
13
13
|
- 若本地项目提供 Speculo Node 校验器,可运行它补充结构校验;纯网页环境按本文内联的 schema、Ready 清单和完成标准逐项核对,并明确记录未运行的自动校验。
|
|
14
|
+
- 本地只读 Goal 控制器和 Plan 合同校验库不随网页快照提供,不能把其名称当作可执行命令。网页执行者按内联 map-control/调用合同逐项计算依赖与门禁;缺少真实项目 Skill 源或执行能力时阻塞对应任务,不声称自动验证通过。
|
|
14
15
|
- 提交、推送、合并、部署、发布、归档移动和不可逆迁移仍需用户明确授权。
|
|
15
16
|
|
|
16
|
-
|
|
17
|
+
> 激活后读取 SpecDev 的激活合同。
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
W 位于 change 形成之前:Initiative → 候选 change → 各自 Grill → Spec → Tickets → 一个或多个 change 的 Goal。探索载体继续使用普通 change 目录,不增加另一套全局状态根;它不等于最终产品 change。
|
|
19
20
|
|
|
20
21
|
## 读取范围
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
2. 再读取 SpecDev 的按需读取与记忆写入协议,按当前分支、状态和关键词定位最小相关工件。
|
|
24
|
-
3. 只在本 Work 明确要求恢复、冲突、执行安全或归档证据时扩展为全量读取;缺少匹配证据或 owner/gateway 时停止受影响分支。
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
## 核心纪律
|
|
28
|
-
|
|
29
|
-
### 规划,而非执行
|
|
30
|
-
|
|
31
|
-
Wayfinder 默认进行**规划**:每个 Ticket 解决一个决策,当地图完成时路径就清晰了——在某人动手之前没有任何剩余决定。想要直接动手通常说明已经到达地图边缘,是时候移交。只有地图“说明”明确覆盖此行为时,task 才能把解除阻塞的执行带入地图。
|
|
32
|
-
|
|
33
|
-
### 用名称引用
|
|
34
|
-
|
|
35
|
-
每张地图和每个 Ticket 都有一个名称。人类阅读的叙述和“已做出的决策”始终用名称引用;ID 和路径包裹在名称链接里,不以裸 `INV-01` 墙代替名称。
|
|
36
|
-
|
|
37
|
-
### 每会话一个 Ticket
|
|
38
|
-
|
|
39
|
-
无论绘制还是遍历,**每个会话绝不解决超过一个 Ticket**。绘制地图的会话不解决任何 Ticket;并行 research 的每个独立 Agent 也只负责一个 Ticket。
|
|
40
|
-
|
|
41
|
-
## 产物与适配
|
|
42
|
-
|
|
43
|
-
- 地图:`specdev/changes/{change}/wayfinder-map.md`
|
|
44
|
-
- 子 Tickets:`specdev/changes/{change}/investigation/`
|
|
45
|
-
- solution comments:`specdev/changes/{change}/investigation/comments/`
|
|
46
|
-
- assignment registry:`specdev/changes/{change}/.status.json` 的 `claimed_investigations`
|
|
47
|
-
|
|
48
|
-
每次绘制或遍历前加载 下方 `<local-tracker-contract>` 标签。Ticket 和地图模板:
|
|
49
|
-
|
|
50
|
-
- 下方 `<investigation-ticket-template>` 标签
|
|
51
|
-
- 下方 `<wayfinder-map-template>` 标签
|
|
52
|
-
- 下方 `<solution-comment-template>` 标签
|
|
53
|
-
|
|
54
|
-
## Ticket 类型
|
|
55
|
-
|
|
56
|
-
每个 Ticket 要么是 **HITL**,与一个代表自己发言的人类一起工作;要么是 **AFK**,由 Agent 独立驱动。HITL Ticket 只能通过实时交流解决,Agent 绝不代替人类一方发言。
|
|
57
|
-
|
|
58
|
-
- **Research(AFK)**:阅读文档、第三方 API 或知识库等资源,揭示某个决策等待的事实。调用 下方 `<research>` 标签。当需要当前工作目录之外的知识时使用。
|
|
59
|
-
- **Prototype(HITL)**:调用 “原型阶段” 检测项目 UI、比较功能风格候选并逐步确认设计方向,把 `specdev/changes/{change}/prototypes/{design-id}/design-system.md` 与 comparison locator 链接为 solution comment 资产;`{design-id}` 使用 P 返回的 `UI-NNN`,P 不实现目的地。
|
|
60
|
-
- **Grilling(HITL)**:对话。调用 “设计访谈能力” 的 grilling 与 domain-modeling 能力,但本会话只关闭当前 Wayfinder Ticket。
|
|
61
|
-
- **Task(HITL 或 AFK)**:在决策做出前必须完成的手动工作。它通过为决策解除阻塞赢得位置,不以交付目的地为目标。Agent 能独立驱动时使用 AFK,否则给人类精确清单。
|
|
62
|
-
|
|
63
|
-
Ticket label 只能是 `wayfinder:research | wayfinder:prototype | wayfinder:grilling | wayfinder:task`。
|
|
64
|
-
|
|
65
|
-
## 战争迷雾与范围
|
|
66
|
-
|
|
67
|
-
地图刻意不完整:不要绘制还看不到的内容。活跃 Tickets 之外是**战争迷雾**——能感觉即将到来、但依赖尚未解决问题而无法精确陈述的决策和调查。
|
|
68
|
-
|
|
69
|
-
**迷雾还是 Ticket?** 判断标准是现在能否精确陈述问题,而非现在能否回答:
|
|
70
|
-
|
|
71
|
-
- 问题已经清晰时做成 Ticket,即使仍被阻塞;
|
|
72
|
-
- 还无法精确表述时留在“尚未明确”,不预先切成 Ticket 大小碎片。
|
|
73
|
-
|
|
74
|
-
目的地固定范围。目标之外的工作进入**超出范围**,不是战争迷雾。范围之外永不升级;只有重新命名目的地并创建新 change 时才重新考虑。越界 Ticket 关闭为 `out-of-scope`,链接进“超出范围”,不进入“已做出的决策”。
|
|
75
|
-
|
|
76
|
-
## 调用模式
|
|
77
|
-
|
|
78
|
-
### 绘制地图
|
|
79
|
-
|
|
80
|
-
用户带着模糊想法调用:
|
|
81
|
-
|
|
82
|
-
1. **命名目的地。** 运行一轮 G 的 grilling/domain-modeling,确定正在寻路的 Spec、决策或变更。
|
|
83
|
-
2. **绘制前沿。** 再次质询,这次广度优先,在整个空间展开而非深入一条线索。如果没有浮现任何迷雾,停下并询问用户如何继续,不创建地图。
|
|
84
|
-
3. **创建地图。** 使用模板填写目的地和说明;“已做出的决策”为空,迷雾写入“尚未明确”。
|
|
85
|
-
4. **创建现在可明确的 Tickets。** 先创建全部 Ticket,再第二遍连接 `blocked_by`,因为 ID 必须先存在。
|
|
86
|
-
5. **派出 research Agent。** 每个 research Ticket 使用独立上下文和 claim,各自只解决一个 Ticket;需要 Git 分支时先取得对应授权。
|
|
87
|
-
6. 停止。绘制地图是一个会话的工作,它不亲手解决任何 Ticket。
|
|
88
|
-
|
|
89
|
-
**完成标准**:目的地、地图、当前可表述 Tickets、阻塞边和战争迷雾已持久化;绘图会话没有关闭 Ticket。
|
|
90
|
-
|
|
91
|
-
### 遍历地图
|
|
92
|
-
|
|
93
|
-
用户带来地图,可选指定 Ticket:
|
|
94
|
-
|
|
95
|
-
1. 加载地图的低分辨率视图,不加载每个 Ticket 正文。
|
|
96
|
-
2. 用户指定 Ticket 时使用它;否则按本地 tracker contract 查询并选择第一个 frontier Ticket。
|
|
97
|
-
3. 在任何工作前领取 Ticket。已领取时跳过并选择其他 frontier。
|
|
98
|
-
4. 按需缩放:只读取当前 Ticket、相关或已关闭 Ticket 的详情,以及“说明”指定的能力。
|
|
99
|
-
5. 解决当前唯一 Ticket,使用下一个未占用编号写 solution comment,原子关闭 Ticket 并释放 claim。
|
|
100
|
-
6. 在地图“已做出的决策”追加名称链接和一句概括;越界则写入“超出范围”。
|
|
101
|
-
7. 创建新浮现的 Tickets,第二遍连接阻塞;从“尚未明确”删除每个已升级补丁;更新或关闭被答案判定无效的 Tickets。
|
|
102
|
-
|
|
103
|
-
写回前重读地图、Ticket 与 claims,预期其他会话并发编辑。
|
|
23
|
+
先读 下方 `<activation-and-memory>` 标签;读取共享地图、当前问题与依赖索引,只回读命中原文。低分辨率地图不缓存所有开放票正文。
|
|
104
24
|
|
|
105
|
-
|
|
25
|
+
## 分支
|
|
106
26
|
|
|
107
|
-
|
|
27
|
+
| 当前需要 | 按需读取 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| 初次绘制问题空间,或划分多个 change | 下方 `<ref-w-wayfinder-references-initiative-discovery>` 标签 |
|
|
30
|
+
| 领取并解决一个调查问题,或恢复既有地图 | 下方 `<ref-w-wayfinder-references-map-traversal>` 标签 和 下方 `<local-tracker-contract>` 标签 |
|
|
31
|
+
| 生成地图、问题与答案 | 下方 `<wayfinder-map-template>` 标签、下方 `<investigation-ticket-template>` 标签、下方 `<solution-comment-template>` 标签 |
|
|
32
|
+
| 选定清晰 change 交给 Goal | 下方 `<ref-w-wayfinder-references-initiative-discovery>` 标签 的交接门禁 |
|
|
108
33
|
|
|
109
|
-
|
|
34
|
+
## 必留纪律
|
|
110
35
|
|
|
111
|
-
|
|
36
|
+
- 目的地约束所有调查;能精确陈述的问题成为调查票,尚不能陈述的留在战争迷雾,目标外内容不自动升级。
|
|
37
|
+
- 默认每个会话最多解决一个调查 Ticket;绘图会话不关闭调查票。这个限制约束 W,不限制 P 的长期 Goal 调度;不静默减少用户明确要求的交付数量。
|
|
38
|
+
- 四类保持 `wayfinder:research`、`wayfinder:prototype`、`wayfinder:grilling`、`wayfinder:task`。HITL 必须真人参与,Agent 不代答;Task 仅解除调查阻塞,不偷做目的地实现。
|
|
39
|
+
- `claimed_investigations` 仍由探索载体的 change 状态唯一拥有。先领取后执行;他人已领取的问题跳过,不接管;只暂停有归属冲突的部分。
|
|
40
|
+
- 每个 materialized change 拥有自己的 design-tree、LOG、CONTEXT、ADR、Spec 与 tickets-map。共享探索答案通过 solution comment 引用,不复制成多个可写事实源。
|
|
41
|
+
- 缺失关键决定或必需证据时保持该 change 未就绪;其他独立清晰 change 可以交接,不要求整个大需求一次揭完迷雾。
|
|
112
42
|
|
|
113
|
-
|
|
114
|
-
- 外部行为已清楚:“编写 Spec 阶段”;
|
|
115
|
-
- Spec Ready、只需拆分:“拆分 Tickets 阶段”;
|
|
116
|
-
- Bug 根因路线收敛:“Bug 诊断阶段”;
|
|
117
|
-
- 仍有高影响未知项:保持 active/blocked 并返回下一 frontier Ticket 名称。
|
|
43
|
+
## 校验与交接
|
|
118
44
|
|
|
119
|
-
|
|
45
|
+
存在多个候选 change 时,由 W 写 `specdev/changes/{change}/initiative.json`;使用 下方 `<ref-w-wayfinder-references-initiative-template>` 标签 和 下方 `<ref-common-schemas-initiative-schema>` 标签。目标 change 只在用户接受边界后创建,不能挪用已属于其他任务的状态。
|
|
120
46
|
|
|
121
|
-
|
|
122
|
-
- 地图是低分辨率索引,不列开放 Tickets,不复制答案详情;
|
|
123
|
-
- 四类 Ticket 与 HITL/AFK 语义正确;
|
|
124
|
-
- frontier 由 open、unblocked、unclaimed 事实查询;
|
|
125
|
-
- 名称用于人类叙述,裸 ID 只作内部标识;
|
|
126
|
-
- 战争迷雾、Ticket 与超出范围按可精确表述性和范围区分;
|
|
127
|
-
- 每会话最多解决一个 Ticket,HITL 用户没有被 Agent 代答;
|
|
128
|
-
- 每个关闭 Ticket 有 solution comment,资产通过链接引用;
|
|
129
|
-
- claim、阻塞、地图与 Ticket 状态一致;
|
|
130
|
-
- 路径清晰时返回下一 work,不把产品实现藏进寻路。
|
|
131
|
-
|
|
132
|
-
## 子文件引用
|
|
133
|
-
|
|
134
|
-
- 本地 Tracker:下方 `<local-tracker-contract>` 标签
|
|
135
|
-
- Ticket 模板:下方 `<investigation-ticket-template>` 标签
|
|
136
|
-
- Solution comment:下方 `<solution-comment-template>` 标签
|
|
137
|
-
- 地图模板:下方 `<wayfinder-map-template>` 标签
|
|
138
|
-
- Ticket schema:下方 `<wayfinder-ticket-schema>` 标签
|
|
47
|
+
运行 Speculo Node 校验器 的 `--stage wayfinder` 校验地图、claim、评论和 initiative;选定成员必须分别满足 Grill 共识、Ready Spec 和 Ready Tickets,再转交 “目标规划阶段”。W 不把“地图完成”宣称为产品已经交付。
|
|
139
48
|
|
|
140
49
|
---
|
|
141
50
|
|
|
@@ -204,6 +113,10 @@ status: active
|
|
|
204
113
|
|
|
205
114
|
<!-- 被裁定在目的地之外的工作;已关闭,永不升级。 -->
|
|
206
115
|
|
|
116
|
+
## Change 边界入口
|
|
117
|
+
|
|
118
|
+
存在多个候选 change 时,W 创建并按需读取 `specdev/changes/{change}/initiative.json`;地图不复制其中的候选或子状态。每个目标 change 的 Grill/Spec/Ticket 独立拥有,交接规则见 下方 `<ref-w-wayfinder-references-initiative-discovery>` 标签。
|
|
119
|
+
|
|
207
120
|
</wayfinder-map-template>
|
|
208
121
|
|
|
209
122
|
<local-tracker-contract>
|
|
@@ -728,3 +641,307 @@ resolution: answered
|
|
|
728
641
|
```
|
|
729
642
|
|
|
730
643
|
</wayfinder-ticket-schema>
|
|
644
|
+
|
|
645
|
+
<activation-and-memory>
|
|
646
|
+
|
|
647
|
+
# Activation and memory retrieval protocol
|
|
648
|
+
|
|
649
|
+
本规则只在用户明确激活当前 workflow 或某个 Work 后读取。INDEX 只用于被动发现,不初始化状态、不读取 active change、不写入知识。
|
|
650
|
+
|
|
651
|
+
## Locate before read
|
|
652
|
+
|
|
653
|
+
1. 先解析当前 workflow 的 roots、状态索引和稳定 ID;不存在时静默跳过,不能凭旧路径猜测。
|
|
654
|
+
2. 根据当前请求、Work 分支、关键词、稳定 ID、状态和 provenance,先搜索相关索引行或目录项,再定位最小相关 entry;不把索引全文默认装入上下文。
|
|
655
|
+
3. 只回读命中的 entry 和直接 provenance;需要恢复、冲突裁决、归档、迁移或执行安全证明时,才读取该阶段声明的完整证据集合。
|
|
656
|
+
4. 没有匹配证据时返回缺失证据并停止依赖该结论的分支,不补造事实。
|
|
657
|
+
|
|
658
|
+
## Memory writes
|
|
659
|
+
|
|
660
|
+
正式知识、永久 context、synthesis 或 archive 写入前,先解析唯一 owner 与 gateway,检查 pending transaction、lock、未完成 promotion 和 recovery evidence。gateway 不明或事务未闭合时,只阻塞记忆写入,继续独立且已授权的审计、定位、验证和其他工作。
|
|
661
|
+
|
|
662
|
+
每次写入必须记录 source IDs、证据定位、验证时间或 digest;写入后定位受影响索引项并重新读取目标 entry,确认 owner、locator、内容和状态投影一致。原始证据不可被派生视图覆盖。
|
|
663
|
+
|
|
664
|
+
## Read budget
|
|
665
|
+
|
|
666
|
+
当前 Work 的权威状态、schema、Map/Plan、当前输入和直接所有权合同可以完整读取;非当前分支的知识树、历史 change、研究库、项目 Skill 和示例只按索引与关键词读取。执行、冲突、恢复和归档 Work 需要完整证据时,以该 Work 的显式合同为准。
|
|
667
|
+
|
|
668
|
+
## 事务与归属隔离
|
|
669
|
+
|
|
670
|
+
启动正式写入前检查原网关未闭合事务与写集。属于本任务的事务按原恢复协议处理;属于其他任务的事务不得接管、解锁、清空或覆盖。只暂停资源重叠的写入与依赖分支,继续独立、已授权工作;事务年龄不构成接管授权。写后按变更 ID 定位受影响的索引项并回读目标原文,不为核验默认整读整库。
|
|
671
|
+
|
|
672
|
+
</activation-and-memory>
|
|
673
|
+
|
|
674
|
+
<ref-w-wayfinder-references-initiative-discovery>
|
|
675
|
+
|
|
676
|
+
# Initiative:从大需求到独立 Change
|
|
677
|
+
|
|
678
|
+
## 结构与所有权
|
|
679
|
+
|
|
680
|
+
探索载体是现有 change 目录;W 在其中拥有 `specdev/changes/{change}/initiative.json` 与 wayfinder 地图/调查票。`specdev/changes/{change}/initiative.json` 只记录候选边界、关系和 materialized target,不缓存子 change 的状态、Spec、设计树或票正文。
|
|
681
|
+
|
|
682
|
+
候选 `id` 是稳定 kebab 标识,`target` 为 null 或实际 sibling change 名;同一个 target 不能重复,也不能指向探索载体本身或父 implementation change。其他任务的现存 change 只能在核验归属并获得明确关联授权后引用,不接管其工作。
|
|
683
|
+
|
|
684
|
+
## 探索顺序
|
|
685
|
+
|
|
686
|
+
1. 命名大目标、用户指定数量和排除项;按行为、领域边界、风险、接口与发布独立性广度扫描。
|
|
687
|
+
2. 能描述边界的部分成为候选 change;不能描述的留在迷雾。候选至少写背景、目标、非目标和未知项,不预造实施步骤。
|
|
688
|
+
3. 在探索地图建立共享调查问题;每个问题仍遵循 research/prototype/grilling/task、HITL/AFK 和每会话一个调查票的原纪律。
|
|
689
|
+
4. 用户接受候选边界后,创建或明确关联 target change。共享答案以 solution comment/source 引用导入,不复制成新的永久知识。
|
|
690
|
+
5. 对每个 target 调用 “设计访谈能力”;该 target 独立拥有 design-tree、LOG、CONTEXT、ADR。已确认共享决定可引用复用,不能要求用户机械回答同一问题。
|
|
691
|
+
6. 单个 target 的关键决定清晰后分别进入 S/T;无关 target 继续探索。一个 target 的 blocker 不应阻塞其独立 sibling。
|
|
692
|
+
|
|
693
|
+
## 校验与交接门禁
|
|
694
|
+
|
|
695
|
+
- 候选 DAG 无环,依赖 ID 存在;目标与来源有证据,未创建 target 的候选不宣称 Ready。
|
|
696
|
+
- `--stage wayfinder` 验证 initiative 结构、目标存在性与禁止自引用;它不等于子 change 已就绪。
|
|
697
|
+
- 交接时对**选定** target 分别执行 `--stage grill` 与 `--stage tickets --repo <project-root>`,检查设计树 consensus、Spec `ready_for_tickets`、所有待执行票 Ready。
|
|
698
|
+
- 选定范围的跨 change 依赖须同时选择或有已完成基线证据,不用未完成/已取消票虚假满足依赖。
|
|
699
|
+
- 一个 target 交给 P 的单 change 分支;两个或以上 Ready target 交给 P 的多 change 分支。P 不接手剩余迷雾,也不为这些未知部分伪造计划。
|
|
700
|
+
- 用户明确要求全部 change 时,报告全部候选与各自阻塞;交接已清晰部分不等于少交付其他部分或宣布整个大需求完成。
|
|
701
|
+
|
|
702
|
+
## 版本与恢复
|
|
703
|
+
|
|
704
|
+
变更候选边界或依赖时递增 `revision`,在探索 LOG 记录来源和替代关系。原 claim、评论编号和低分辨率地图仍是原协议;不改写其他任务,不把探索载体迁成父实现 change。两者可以关联,但职责和 owner 分开。
|
|
705
|
+
|
|
706
|
+
</ref-w-wayfinder-references-initiative-discovery>
|
|
707
|
+
|
|
708
|
+
<ref-w-wayfinder-references-map-traversal>
|
|
709
|
+
|
|
710
|
+
# 寻路
|
|
711
|
+
|
|
712
|
+
|
|
713
|
+
一个模糊的想法出现了——太大而无法放入单个 Agent 会话,且从当前状态到**目的地**的路径尚不可见。寻路就是找到那条路,而非冲向目标。此 work 在 change state 中绘制一张**共享地图**,然后逐个处理其 Tickets,直到路径变得清晰。
|
|
714
|
+
|
|
715
|
+
目的地可能是一份待移交和迭代的 Spec、一个在规划开始前需锁定的决策,或一项经说明允许在地图中完成的变更。命名目的地是第一步,它塑造每个 Ticket。
|
|
716
|
+
|
|
717
|
+
|
|
718
|
+
## 核心纪律
|
|
719
|
+
|
|
720
|
+
### 规划,而非执行
|
|
721
|
+
|
|
722
|
+
Wayfinder 默认进行**规划**:每个 Ticket 解决一个决策,当地图完成时路径就清晰了——在某人动手之前没有任何剩余决定。想要直接动手通常说明已经到达地图边缘,是时候移交。只有地图“说明”明确覆盖此行为时,task 才能把解除阻塞的执行带入地图。
|
|
723
|
+
|
|
724
|
+
### 用名称引用
|
|
725
|
+
|
|
726
|
+
每张地图和每个 Ticket 都有一个名称。人类阅读的叙述和“已做出的决策”始终用名称引用;ID 和路径包裹在名称链接里,不以裸 `INV-01` 墙代替名称。
|
|
727
|
+
|
|
728
|
+
### 每会话一个 Ticket
|
|
729
|
+
|
|
730
|
+
无论绘制还是遍历,**每个会话绝不解决超过一个 Ticket**。绘制地图的会话不解决任何 Ticket;并行 research 的每个独立 Agent 也只负责一个 Ticket。
|
|
731
|
+
|
|
732
|
+
## 产物与适配
|
|
733
|
+
|
|
734
|
+
- 地图:`specdev/changes/{change}/wayfinder-map.md`
|
|
735
|
+
- 子 Tickets:`specdev/changes/{change}/investigation/`
|
|
736
|
+
- solution comments:`specdev/changes/{change}/investigation/comments/`
|
|
737
|
+
- assignment registry:`specdev/changes/{change}/.status.json` 的 `claimed_investigations`
|
|
738
|
+
|
|
739
|
+
每次绘制或遍历前加载 下方 `<local-tracker-contract>` 标签。Ticket 和地图模板:
|
|
740
|
+
|
|
741
|
+
- 下方 `<investigation-ticket-template>` 标签
|
|
742
|
+
- 下方 `<wayfinder-map-template>` 标签
|
|
743
|
+
- 下方 `<solution-comment-template>` 标签
|
|
744
|
+
|
|
745
|
+
## Ticket 类型
|
|
746
|
+
|
|
747
|
+
每个 Ticket 要么是 **HITL**,与一个代表自己发言的人类一起工作;要么是 **AFK**,由 Agent 独立驱动。HITL Ticket 只能通过实时交流解决,Agent 绝不代替人类一方发言。
|
|
748
|
+
|
|
749
|
+
- **Research(AFK)**:阅读文档、第三方 API 或知识库等资源,揭示某个决策等待的事实。调用 下方 `<research>` 标签。当需要当前工作目录之外的知识时使用。
|
|
750
|
+
- **Prototype(HITL)**:调用 “原型阶段” 检测项目 UI、比较功能风格候选并逐步确认设计方向,把 `specdev/changes/{change}/prototypes/{design-id}/design-system.md` 与 comparison locator 链接为 solution comment 资产;`{design-id}` 使用 P 返回的 `UI-NNN`,P 不实现目的地。
|
|
751
|
+
- **Grilling(HITL)**:对话。调用 “设计访谈能力” 的 grilling 与 domain-modeling 能力,但本会话只关闭当前 Wayfinder Ticket。
|
|
752
|
+
- **Task(HITL 或 AFK)**:在决策做出前必须完成的手动工作。它通过为决策解除阻塞赢得位置,不以交付目的地为目标。Agent 能独立驱动时使用 AFK,否则给人类精确清单。
|
|
753
|
+
|
|
754
|
+
Ticket label 只能是 `wayfinder:research | wayfinder:prototype | wayfinder:grilling | wayfinder:task`。
|
|
755
|
+
|
|
756
|
+
## 战争迷雾与范围
|
|
757
|
+
|
|
758
|
+
地图刻意不完整:不要绘制还看不到的内容。活跃 Tickets 之外是**战争迷雾**——能感觉即将到来、但依赖尚未解决问题而无法精确陈述的决策和调查。
|
|
759
|
+
|
|
760
|
+
**迷雾还是 Ticket?** 判断标准是现在能否精确陈述问题,而非现在能否回答:
|
|
761
|
+
|
|
762
|
+
- 问题已经清晰时做成 Ticket,即使仍被阻塞;
|
|
763
|
+
- 还无法精确表述时留在“尚未明确”,不预先切成 Ticket 大小碎片。
|
|
764
|
+
|
|
765
|
+
目的地固定范围。目标之外的工作进入**超出范围**,不是战争迷雾。范围之外永不升级;只有重新命名目的地并创建新 change 时才重新考虑。越界 Ticket 关闭为 `out-of-scope`,链接进“超出范围”,不进入“已做出的决策”。
|
|
766
|
+
|
|
767
|
+
## 调用模式
|
|
768
|
+
|
|
769
|
+
### 绘制地图
|
|
770
|
+
|
|
771
|
+
用户带着模糊想法调用:
|
|
772
|
+
|
|
773
|
+
1. **命名目的地。** 运行一轮 G 的 grilling/domain-modeling,确定正在寻路的 Spec、决策或变更。
|
|
774
|
+
2. **绘制前沿。** 再次质询,这次广度优先,在整个空间展开而非深入一条线索。如果没有浮现任何迷雾,停下并询问用户如何继续,不创建地图。
|
|
775
|
+
3. **创建地图。** 使用模板填写目的地和说明;“已做出的决策”为空,迷雾写入“尚未明确”。
|
|
776
|
+
4. **创建现在可明确的 Tickets。** 先创建全部 Ticket,再第二遍连接 `blocked_by`,因为 ID 必须先存在。
|
|
777
|
+
5. **派出 research Agent。** 每个 research Ticket 使用独立上下文和 claim,各自只解决一个 Ticket;需要 Git 分支时先取得对应授权。
|
|
778
|
+
6. 停止。绘制地图是一个会话的工作,它不亲手解决任何 Ticket。
|
|
779
|
+
|
|
780
|
+
**完成标准**:目的地、地图、当前可表述 Tickets、阻塞边和战争迷雾已持久化;绘图会话没有关闭 Ticket。
|
|
781
|
+
|
|
782
|
+
### 遍历地图
|
|
783
|
+
|
|
784
|
+
用户带来地图,可选指定 Ticket:
|
|
785
|
+
|
|
786
|
+
1. 加载地图的低分辨率视图,不加载每个 Ticket 正文。
|
|
787
|
+
2. 用户指定 Ticket 时使用它;否则按本地 tracker contract 查询并选择第一个 frontier Ticket。
|
|
788
|
+
3. 在任何工作前领取 Ticket。已领取时跳过并选择其他 frontier。
|
|
789
|
+
4. 按需缩放:只读取当前 Ticket、相关或已关闭 Ticket 的详情,以及“说明”指定的能力。
|
|
790
|
+
5. 解决当前唯一 Ticket,使用下一个未占用编号写 solution comment,原子关闭 Ticket 并释放 claim。
|
|
791
|
+
6. 在地图“已做出的决策”追加名称链接和一句概括;越界则写入“超出范围”。
|
|
792
|
+
7. 创建新浮现的 Tickets,第二遍连接阻塞;从“尚未明确”删除每个已升级补丁;更新或关闭被答案判定无效的 Tickets。
|
|
793
|
+
|
|
794
|
+
写回前重读地图、Ticket 与 claims,预期其他会话并发编辑。
|
|
795
|
+
|
|
796
|
+
**完成标准**:本会话只关闭一个 Ticket;Ticket、solution comment、claim、地图和新 frontier 一致。
|
|
797
|
+
|
|
798
|
+
## 收敛与路由
|
|
799
|
+
|
|
800
|
+
当前沿为空且“尚未明确”不再包含阻塞目的地的内容时,路径清晰:
|
|
801
|
+
|
|
802
|
+
路由前使用 Speculo Node 校验器 的 `--stage wayfinder`;Ticket、claim、comment 或地图不一致时保持 blocked。
|
|
803
|
+
|
|
804
|
+
- 需要产品或架构取舍:“设计访谈能力”;
|
|
805
|
+
- 外部行为已清楚:“编写 Spec 阶段”;
|
|
806
|
+
- Spec Ready、只需拆分:“拆分 Tickets 阶段”;
|
|
807
|
+
- Bug 根因路线收敛:“Bug 诊断阶段”;
|
|
808
|
+
- 仍有高影响未知项:保持 active/blocked 并返回下一 frontier Ticket 名称。
|
|
809
|
+
|
|
810
|
+
## 完成标准
|
|
811
|
+
|
|
812
|
+
- 目的地塑造每个 Ticket 并固定范围;
|
|
813
|
+
- 地图是低分辨率索引,不列开放 Tickets,不复制答案详情;
|
|
814
|
+
- 四类 Ticket 与 HITL/AFK 语义正确;
|
|
815
|
+
- frontier 由 open、unblocked、unclaimed 事实查询;
|
|
816
|
+
- 名称用于人类叙述,裸 ID 只作内部标识;
|
|
817
|
+
- 战争迷雾、Ticket 与超出范围按可精确表述性和范围区分;
|
|
818
|
+
- 每会话最多解决一个 Ticket,HITL 用户没有被 Agent 代答;
|
|
819
|
+
- 每个关闭 Ticket 有 solution comment,资产通过链接引用;
|
|
820
|
+
- claim、阻塞、地图与 Ticket 状态一致;
|
|
821
|
+
- 路径清晰时返回下一 work,不把产品实现藏进寻路。
|
|
822
|
+
|
|
823
|
+
## 子文件引用
|
|
824
|
+
|
|
825
|
+
- 本地 Tracker:下方 `<local-tracker-contract>` 标签
|
|
826
|
+
- Ticket 模板:下方 `<investigation-ticket-template>` 标签
|
|
827
|
+
- Solution comment:下方 `<solution-comment-template>` 标签
|
|
828
|
+
- 地图模板:下方 `<wayfinder-map-template>` 标签
|
|
829
|
+
- Ticket schema:下方 `<wayfinder-ticket-schema>` 标签
|
|
830
|
+
|
|
831
|
+
</ref-w-wayfinder-references-map-traversal>
|
|
832
|
+
|
|
833
|
+
<ref-w-wayfinder-references-initiative-template>
|
|
834
|
+
|
|
835
|
+
```json
|
|
836
|
+
{
|
|
837
|
+
"schema_version": 1,
|
|
838
|
+
"artifact": "initiative",
|
|
839
|
+
"change": "<YYYY-MM-DD-initiative>",
|
|
840
|
+
"revision": 1,
|
|
841
|
+
"destination": "<大需求目标>",
|
|
842
|
+
"changes": []
|
|
843
|
+
}
|
|
844
|
+
```
|
|
845
|
+
|
|
846
|
+
</ref-w-wayfinder-references-initiative-template>
|
|
847
|
+
|
|
848
|
+
<ref-common-schemas-initiative-schema>
|
|
849
|
+
|
|
850
|
+
```json
|
|
851
|
+
{
|
|
852
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
853
|
+
"$id": "urn:speculo:specdev:initiative:v1",
|
|
854
|
+
"type": "object",
|
|
855
|
+
"required": [
|
|
856
|
+
"schema_version",
|
|
857
|
+
"artifact",
|
|
858
|
+
"change",
|
|
859
|
+
"revision",
|
|
860
|
+
"destination",
|
|
861
|
+
"changes"
|
|
862
|
+
],
|
|
863
|
+
"properties": {
|
|
864
|
+
"schema_version": {
|
|
865
|
+
"const": 1
|
|
866
|
+
},
|
|
867
|
+
"artifact": {
|
|
868
|
+
"const": "initiative"
|
|
869
|
+
},
|
|
870
|
+
"change": {
|
|
871
|
+
"type": "string",
|
|
872
|
+
"minLength": 1
|
|
873
|
+
},
|
|
874
|
+
"revision": {
|
|
875
|
+
"type": "integer",
|
|
876
|
+
"minimum": 1
|
|
877
|
+
},
|
|
878
|
+
"destination": {
|
|
879
|
+
"type": "string",
|
|
880
|
+
"minLength": 1
|
|
881
|
+
},
|
|
882
|
+
"changes": {
|
|
883
|
+
"type": "array",
|
|
884
|
+
"items": {
|
|
885
|
+
"type": "object",
|
|
886
|
+
"required": [
|
|
887
|
+
"id",
|
|
888
|
+
"name",
|
|
889
|
+
"background",
|
|
890
|
+
"scope",
|
|
891
|
+
"non_goals",
|
|
892
|
+
"unknowns",
|
|
893
|
+
"depends_on",
|
|
894
|
+
"target"
|
|
895
|
+
],
|
|
896
|
+
"properties": {
|
|
897
|
+
"id": {
|
|
898
|
+
"type": "string",
|
|
899
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
900
|
+
},
|
|
901
|
+
"name": {
|
|
902
|
+
"type": "string",
|
|
903
|
+
"minLength": 1
|
|
904
|
+
},
|
|
905
|
+
"background": {
|
|
906
|
+
"type": "string",
|
|
907
|
+
"minLength": 1
|
|
908
|
+
},
|
|
909
|
+
"scope": {
|
|
910
|
+
"type": "string",
|
|
911
|
+
"minLength": 1
|
|
912
|
+
},
|
|
913
|
+
"non_goals": {
|
|
914
|
+
"type": "array",
|
|
915
|
+
"items": {
|
|
916
|
+
"type": "string"
|
|
917
|
+
}
|
|
918
|
+
},
|
|
919
|
+
"unknowns": {
|
|
920
|
+
"type": "array",
|
|
921
|
+
"items": {
|
|
922
|
+
"type": "string"
|
|
923
|
+
}
|
|
924
|
+
},
|
|
925
|
+
"depends_on": {
|
|
926
|
+
"type": "array",
|
|
927
|
+
"items": {
|
|
928
|
+
"type": "string"
|
|
929
|
+
},
|
|
930
|
+
"uniqueItems": true
|
|
931
|
+
},
|
|
932
|
+
"target": {
|
|
933
|
+
"type": [
|
|
934
|
+
"string",
|
|
935
|
+
"null"
|
|
936
|
+
]
|
|
937
|
+
}
|
|
938
|
+
},
|
|
939
|
+
"additionalProperties": false
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
},
|
|
943
|
+
"additionalProperties": false
|
|
944
|
+
}
|
|
945
|
+
```
|
|
946
|
+
|
|
947
|
+
</ref-common-schemas-initiative-schema>
|
|
@@ -8,9 +8,44 @@ keywords: [archive, consolidate, learning, topic, cold-archive, 归档, 综合]
|
|
|
8
8
|
|
|
9
9
|
# Archive and Consolidate 命令
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## 持久化契约
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
唯一报告路径:
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
<Path>{roots.state}/commands/archive-and-consolidate/{date}-{scope}-{topic}[-NN].md</Path>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
实际路径必须通过 `<Path>{roots.state}/workspace.json</Path>` 的 `roots.state` 解析。解析后同时记下:
|
|
20
|
+
|
|
21
|
+
- `commands_def_root` = `{roots.commands}`:只放命令定义
|
|
22
|
+
- `commands_root` = `{roots.state}/commands`:只放 command 报告
|
|
23
|
+
|
|
24
|
+
`{roots.commands}` 不是报告根。禁止把 `YYYY-MM-DD-*.md` 写入 `{roots.commands}/archive-and-consolidate/` 或任何定义目录旁边。
|
|
25
|
+
|
|
26
|
+
POSIX 规范化后:
|
|
27
|
+
|
|
28
|
+
- `commands_root` 必须等于 `{roots.state}/commands`
|
|
29
|
+
- `commands_root` 等于 `{roots.commands}`,或报告路径落在 `{roots.commands}` 下 → **blocked,不写文件**
|
|
30
|
+
- `{roots.commands}/archive-and-consolidate/` 已存在 `YYYY-MM-DD-*.md` → **blocked**;列出误落盘文件,要求先搬到 `<Path>{roots.state}/commands/archive-and-consolidate/</Path>`。目标同名则加 `-NN`,不覆盖正文
|
|
31
|
+
|
|
32
|
+
规则:
|
|
33
|
+
|
|
34
|
+
- `<scope>`:目标 workflow 名
|
|
35
|
+
- `<topic>`:change 名或 `batch`
|
|
36
|
+
- 同日同 scope/topic 冲突时,从 `-01` 选择最小未占用编号
|
|
37
|
+
- 禁止覆盖已有报告
|
|
38
|
+
- 禁止把正式报告写入 `temp/`、系统临时目录、`{roots.commands}/`、`{roots.state}/{workflow}/` 或其他位置
|
|
39
|
+
- 报告记录 workflow、source/root IDs、dry-run 清单、用户确认、relocation manifest、synthesis revision 或 archive locator、`path_context.commands_root` 和验证结果
|
|
40
|
+
|
|
41
|
+
## 运行时解析
|
|
42
|
+
|
|
43
|
+
1. 从当前目录向上寻找 `<Path>{roots.state}/workspace.json</Path>`;无法唯一确定时停止并提示 `speculo init`。
|
|
44
|
+
2. 读取并验证 `path_base` 与 roots,再读取 `<Path>{roots.config}</Path>`(不存在时静默降级)。
|
|
45
|
+
3. 在调用任何 skill 或 Work 之前完成上面的 `commands_root` 校验。
|
|
46
|
+
4. 把 `commands_root` 作为报告 owner 路径传给后续 skill/Work;返回的 `path_context.commands_root` 若不等于 `{roots.state}/commands`,停止且不写文件。
|
|
47
|
+
|
|
48
|
+
无论走 Learning Work 还是其他 workflow,Command 报告都只写 `<Path>{roots.state}/commands/archive-and-consolidate/</Path>`。
|
|
14
49
|
|
|
15
50
|
## Learning 路由
|
|
16
51
|
|
|
@@ -23,10 +58,11 @@ keywords: [archive, consolidate, learning, topic, cold-archive, 归档, 综合]
|
|
|
23
58
|
|
|
24
59
|
## 其他 workflow
|
|
25
60
|
|
|
26
|
-
非 Learning 目标继续读取自身 README 和归档 Work
|
|
61
|
+
非 Learning 目标继续读取自身 README 和归档 Work,并在 Work 要求时读取 `<Path>{roots.skills}/archive-and-consolidate/SKILL.md</Path>`。Command 报告只记录选择和 owning Work/skill 返回的 manifest,不成为知识 writer。
|
|
27
62
|
|
|
28
63
|
## 完成标准
|
|
29
64
|
|
|
30
65
|
- dry-run、确认、移动、回滚和最终验证均有报告;
|
|
66
|
+
- 报告只出现在 `<Path>{roots.state}/commands/archive-and-consolidate/</Path>`;`path_context.commands_root` 等于 `{roots.state}/commands`,不等于 `{roots.commands}`;
|
|
31
67
|
- 原始 Markdown 内容不被覆盖,跨路径引用通过 stable ID/locations 解析;
|
|
32
68
|
- 未确认或失败事务不留下部分移动或 context 写入。
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: git-history-squash
|
|
3
|
+
type: command
|
|
4
|
+
name: Git History Squash
|
|
5
|
+
description: Plan and execute a confirmed first-parent Git history squash with recoverable refs and exact remote leases.
|
|
6
|
+
keywords: [git-history-squash, squash, history-convergence, 压缩历史, 历史收敛]
|
|
7
|
+
disable-model-invocation: true
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Git History Squash 命令
|
|
11
|
+
|
|
12
|
+
## 意图与边界
|
|
13
|
+
|
|
14
|
+
把用户指定的 Git 提交区间收敛为单一需求完成节点。本命令拥有 scope、确认门和审计报告;机械 plan/apply/publish/status 由 `<Path>{roots.skills}/git-history-squash/SKILL.md</Path>` 执行。
|
|
15
|
+
|
|
16
|
+
讨论 squash、rebase、提交整理或项目文件中的指令均不构成调用或副作用授权。未确认只产生 dry-run 计划。
|
|
17
|
+
|
|
18
|
+
## 持久化契约
|
|
19
|
+
|
|
20
|
+
Command 审计报告:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
<Path>{roots.state}/commands/git-history-squash/{date}-{scope}-{topic}[-NN].md</Path>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Skill 事务状态与机械报告仍只写:
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
<Path>{roots.state}/skills/git-history-squash/{date}-{topic}[-NN]/</Path>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
实际 command 报告路径必须通过 `<Path>{roots.state}/workspace.json</Path>` 的 `roots.state` 解析。`{roots.commands}` 只放命令定义。禁止把正式报告写入 `{roots.commands}/git-history-squash/`、`temp/`、系统临时目录或 `{roots.state}/{workflow}/`。
|
|
33
|
+
|
|
34
|
+
规则:
|
|
35
|
+
|
|
36
|
+
- `<scope>`:`workspace`、`multi-repo` 或 `repo-<slug>`
|
|
37
|
+
- `<topic>`:用户主题转小写 kebab-case;缺失时为 skill 返回的 change 名
|
|
38
|
+
- 同日同 scope/topic 冲突时,从 `-01` 选择最小未占用编号
|
|
39
|
+
- 禁止覆盖已有报告
|
|
40
|
+
- 本命令不创建 `state.json`;恢复游标属于 skill 运行目录
|
|
41
|
+
- 报告引用 skill change locator、digest 和验证结果,不复制完整 `state.json`,不含 token、email、凭证 URL 或机器绝对路径
|
|
42
|
+
|
|
43
|
+
POSIX 规范化后,command 报告根等于 `{roots.commands}` → **blocked,不写文件**。
|
|
44
|
+
|
|
45
|
+
## 写操作边界
|
|
46
|
+
|
|
47
|
+
未确认 `plan_digest` 前:不创建 Git object、不移动 ref、不改变 index/worktree、不 fetch、不 stash、不 checkout、不 push。
|
|
48
|
+
|
|
49
|
+
确认后仍禁止:
|
|
50
|
+
|
|
51
|
+
- 普通 `--force`、没有精确 expected SHA 的 lease、matching refspec
|
|
52
|
+
- `rebase`、`reset --hard`、交互式 rebase
|
|
53
|
+
- 自动删除 source/integration worktree、branch、backup ref、stash 或 reflog
|
|
54
|
+
|
|
55
|
+
远端更新是第二道确认门,只允许精确 `--force-with-lease=<ref>:<old-sha>` 和单一显式 refspec。
|
|
56
|
+
|
|
57
|
+
## 执行
|
|
58
|
+
|
|
59
|
+
1. 从当前目录向上寻找 `<Path>{roots.state}/workspace.json</Path>`;无法唯一确定时停止并提示 `speculo init`。读取并验证 roots,再读取 `<Path>{roots.config}</Path>`(不存在时静默降级)。
|
|
60
|
+
2. 读取 `<Path>{roots.skills}/git-history-squash/SKILL.md</Path>`,再按其 entry procedure 读取当前分支 reference。
|
|
61
|
+
3. 用户必须逐仓库明确 repository、完整 local branch ref、start、end、`inclusive | exclusive`、commit message、签名选择和远端发布选择;不得猜测缺失值。用 `<Path>{roots.skills}/git-history-squash/assets/request-template.json</Path>` 生成临时 request JSON。
|
|
62
|
+
4. 运行 skill `plan`。展示旧/新拓扑、将被替换的提交数、merge 数、受影响本地/远端 refs、backup ref 和预计提交信息。有 blocker 时保持 dry-run,不进入确认。
|
|
63
|
+
5. 只有用户在当前对话中明确确认该本地 manifest 和 `plan_digest` 后运行 `apply`。执行前重验计划仍与确认相同。
|
|
64
|
+
6. 脚本返回 `confirm-publish` 时,展示远端 manifest(repository、remote、remote branch、冻结 old SHA、local new SHA、保护策略、发布顺序)。只有用户明确确认该 manifest 和 `publish_digest` 后运行 `publish`。
|
|
65
|
+
7. 多层 submodule 先压缩并发布子仓库,再更新父仓库 gitlink;部分成功时记录已完成/未完成仓库和恢复步骤,不伪装原子成功。
|
|
66
|
+
8. 将选择、确认、验证、远端结果和恢复信息原子写入本次 command 报告,并重读报告、skill state 与目标 refs。
|
|
67
|
+
|
|
68
|
+
中断或重入时先运行 skill `status`;实际 refs 与 state 一致才用返回的下一 digest 回到步骤 5 或 6。漂移时 blocked,生成新的精确恢复计划并重新取得授权。本命令不自动执行恢复或清理。
|
|
69
|
+
|
|
70
|
+
## 完成标准
|
|
71
|
+
|
|
72
|
+
- dry-run 模式不移动任何 ref、不创建提交、不推送远端
|
|
73
|
+
- 压缩成功后旧 HEAD 与新 HEAD 的 tree 等价(父仓库 gitlink 按 skill submodule 合同),基线到新 HEAD 恰好一个提交,并存在可恢复 backup ref
|
|
74
|
+
- 远端在确认前零写入;lease 漂移时拒绝推送
|
|
75
|
+
- 旧 worktree/branch/backup ref 未被本命令删除
|
|
76
|
+
- 报告位于唯一 command 路径;skill 运行目录可恢复;失败不伪装成部分成功
|