@namewta/speculo 0.6.0 → 0.7.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/README.md +11 -11
- package/dist/src/cli.js +36 -128
- package/dist/src/cli.js.map +1 -1
- package/dist/src/index.d.ts +2 -4
- package/dist/src/index.js +173 -151
- package/dist/src/index.js.map +1 -1
- package/package.json +6 -4
- package/template/.speculo/README.md +4 -0
- package/template/canonical/canonical-specdev-engineering-cognitive-mentor.md +133 -141
- package/template/canonical/canonical-specdev-goal-plan.md +394 -377
- package/template/canonical/canonical-specdev-grill-with-docs.md +241 -178
- package/template/canonical/canonical-specdev-spec.md +132 -122
- package/template/canonical/canonical-specdev-tickets.md +176 -156
- package/template/canonical/canonical-specdev-wayfinder.md +106 -108
- package/template/commands/archive-and-consolidate.md +10 -8
- package/template/commands/handoff.md +2 -0
- package/template/commands/retro.md +3 -3
- package/template/commands/status.md +5 -4
- package/template/skills/archive-and-consolidate/SKILL.md +5 -9
- package/template/skills/archive-and-consolidate/assets/archive-plan-template.md +1 -1
- package/template/skills/archive-and-consolidate/references/archive-rules.md +4 -4
- package/template/skills/archive-and-consolidate/references/consolidation-rules.md +7 -8
- package/template/skills/archive-and-consolidate/references/knowledge-graduation.md +5 -2
- package/template/skills/github-npm-ops/SKILL.md +4 -2
- package/template/skills/github-npm-ops/references/issue-transport.md +26 -0
- package/template/skills/github-npm-ops/references/preflight-checklist.md +1 -1
- package/template/skills/github-npm-ops/scripts/issue-transport.mjs +227 -0
- package/template/workflows/specdev/A-archive-and-consolidate/A-archive-and-consolidate.md +31 -145
- package/template/workflows/specdev/A-archive-and-consolidate/consolidation-interview.md +4 -6
- package/template/workflows/specdev/C-code-review/C-code-review.md +42 -0
- package/template/workflows/specdev/C-code-review/code-review-template.md +42 -0
- package/template/workflows/specdev/D-diagnose-bugs/D-diagnose-bugs.md +45 -48
- package/template/workflows/specdev/D-diagnose-bugs/diagnosis-template.md +44 -40
- package/template/workflows/specdev/D-diagnose-bugs/feedback-loop.md +41 -0
- package/template/workflows/specdev/D-diagnose-bugs/hypothesis-and-instrumentation.md +32 -0
- package/template/workflows/specdev/D-diagnose-bugs/scripts/hitl-loop.template.sh +26 -0
- package/template/workflows/specdev/E-engineering-cognitive-mentor/E-engineering-cognitive-mentor.md +3 -3
- package/template/workflows/specdev/E-engineering-cognitive-mentor/persistence-and-resume.md +5 -20
- package/template/workflows/specdev/G-grill-with-docs/G-grill-with-docs.md +17 -10
- package/template/workflows/specdev/G-grill-with-docs/adr-format.md +31 -17
- package/template/workflows/specdev/G-grill-with-docs/context-format.md +9 -29
- package/template/workflows/specdev/G-grill-with-docs/domain-modeling-rules.md +10 -5
- package/template/workflows/specdev/G-grill-with-docs/stakeholder-questionnaire.md +45 -0
- package/template/workflows/specdev/I-implement/I-implement.md +29 -14
- package/template/workflows/specdev/I-implement/delegated-evidence-template.md +11 -0
- package/template/workflows/specdev/I-implement/evidence-template.md +24 -10
- package/template/workflows/specdev/I-implement/execution-preflight.md +4 -4
- package/template/workflows/specdev/I-implement/merge-conflict-protocol.md +20 -0
- package/template/workflows/specdev/I-implement/tdd-mocking.md +19 -0
- package/template/workflows/specdev/I-implement/tdd-rules.md +14 -12
- package/template/workflows/specdev/I-implement/tdd-test-design.md +25 -0
- package/template/workflows/specdev/I-init-setup/I-init-setup.md +12 -9
- package/template/workflows/specdev/I-init-setup/config-template.json +1 -1
- package/template/workflows/specdev/I-init-setup/domain-layout-template.md +2 -2
- package/template/workflows/specdev/I-init-setup/status-template.json +2 -3
- package/template/workflows/specdev/I-init-setup/tracking-template.md +3 -0
- package/template/workflows/specdev/INDEX.md +64 -26
- package/template/workflows/specdev/P-goal-plan/P-goal-plan.md +48 -38
- package/template/workflows/specdev/P-goal-plan/completion-control.md +19 -53
- package/template/workflows/specdev/P-goal-plan/delegated-execution-template.md +33 -0
- package/template/workflows/specdev/P-goal-plan/delegated-execution.md +53 -0
- package/template/workflows/specdev/P-goal-plan/goal-plan-template.md +9 -40
- package/template/workflows/specdev/P-goal-plan/orchestration-protocol.md +16 -68
- package/template/workflows/specdev/P-goal-plan/planning-modes.md +20 -48
- package/template/workflows/specdev/P-prototype/P-prototype.md +46 -0
- package/template/workflows/specdev/P-prototype/logic-prototype.md +24 -0
- package/template/workflows/specdev/P-prototype/prototype-record-template.md +46 -0
- package/template/workflows/specdev/P-prototype/ui-prototype.md +21 -0
- package/template/workflows/specdev/R-review-architecture/R-review-architecture.md +1 -1
- package/template/workflows/specdev/S-spec/S-spec.md +2 -1
- package/template/workflows/specdev/T-tickets/T-tickets.md +3 -2
- package/template/workflows/specdev/T-tickets/ticket-readiness.md +1 -1
- package/template/workflows/specdev/T-tickets/ticket-template.md +1 -1
- package/template/workflows/specdev/T-tickets/tickets-map-template.md +1 -1
- package/template/workflows/specdev/T-triage/T-triage.md +65 -26
- package/template/workflows/specdev/T-triage/intake-protocol.md +32 -0
- package/template/workflows/specdev/T-triage/reconcile-protocol.md +34 -0
- package/template/workflows/specdev/T-triage/source-template.md +30 -0
- package/template/workflows/specdev/T-triage/triage-template.md +38 -24
- package/template/workflows/specdev/W-wayfinder/W-wayfinder.md +3 -1
- package/template/workflows/specdev/_state/status.json +2 -3
- package/template/workflows/specdev/common/README.md +9 -2
- package/template/workflows/specdev/common/rules/artifact-contract.md +20 -9
- package/template/workflows/specdev/common/rules/change-completion.md +33 -0
- package/template/workflows/specdev/common/rules/deviation-control.md +2 -2
- package/template/workflows/specdev/common/rules/evidence-and-verification.md +1 -1
- package/template/workflows/specdev/common/rules/path-ownership.md +3 -3
- package/template/workflows/specdev/common/schemas/change-status.schema.json +43 -0
- package/template/workflows/specdev/common/schemas/code-review.schema.json +22 -0
- package/template/workflows/specdev/common/schemas/diagnosis.schema.json +19 -0
- package/template/workflows/specdev/common/schemas/prototype-record.schema.json +24 -0
- package/template/workflows/specdev/common/schemas/source.schema.json +20 -0
- package/template/workflows/specdev/common/schemas/status.schema.json +20 -78
- package/template/workflows/specdev/common/schemas/triage.schema.json +21 -0
- package/template/workflows/specdev/common/skills/code-review/SKILL.md +49 -0
- package/template/workflows/specdev/common/skills/code-review/references/fowler-smells.md +18 -0
- package/template/workflows/specdev/common/skills/code-review/references/reviewer-contracts.md +13 -0
- package/template/workflows/specdev/common/skills/code-review/references/source-discovery.md +22 -0
- package/template/workflows/specdev/common/skills/dev-worktree/SKILL.md +12 -9
- package/template/workflows/specdev/common/skills/dev-worktree/references/create.md +18 -13
- package/template/workflows/specdev/common/skills/dev-worktree/references/finalize.md +8 -6
- package/template/workflows/specdev/common/skills/research/SKILL.md +38 -26
- package/template/workflows/specdev/common/skills/subagent-delivery/SKILL.md +3 -5
- package/template/workflows/specdev/common/tools/README.md +3 -0
- package/template/workflows/specdev/common/tools/validate-specdev.mjs +496 -30
- package/dist/src/migrate.d.ts +0 -38
- package/dist/src/migrate.js +0 -642
- package/dist/src/migrate.js.map +0 -1
- package/dist/src/skills-mirror.d.ts +0 -38
- package/dist/src/skills-mirror.js +0 -160
- package/dist/src/skills-mirror.js.map +0 -1
- package/template/workflows/specdev/A-archive-and-consolidate/archive-checklist.md +0 -15
- package/template/workflows/specdev/A-archive-and-consolidate/knowledge-promotion-rules.md +0 -32
- package/template/workflows/specdev/I-implement/code-review-process.md +0 -17
- package/template/workflows/specdev/I-implement/tdd-examples.md +0 -14
- package/template/workflows/specdev/I-init-setup/status-labels-template.md +0 -55
|
@@ -115,7 +115,7 @@ Ticket 是**决策完备的微型执行计划**:它消除执行者在目标、
|
|
|
115
115
|
- 有序执行路线和安全落点;
|
|
116
116
|
- expected、writable、read-only、shared 路径;
|
|
117
117
|
- 正常、失败和回归验证矩阵;
|
|
118
|
-
- 用户界面交互受影响时的
|
|
118
|
+
- 用户界面交互受影响时的 E2E Gate 与执行 owner;后续委派 Goal Plan 可以显式把该 Gate 转交 Lead;
|
|
119
119
|
- Deep 的迁移、兼容窗口、监控、回滚和不可逆批准点;
|
|
120
120
|
- 可判定验收标准。
|
|
121
121
|
|
|
@@ -128,7 +128,7 @@ Ticket 是**决策完备的微型执行计划**:它消除执行者在目标、
|
|
|
128
128
|
3. 识别根 Ticket、汇合点、扇出与收缩点;
|
|
129
129
|
4. 为每个 Spec 验收合同映射至少一个 Ticket;
|
|
130
130
|
5. 检查并行候选的 `writable_paths` 是否相交;
|
|
131
|
-
6. 共享路径必须指定唯一 owner
|
|
131
|
+
6. 共享路径必须指定唯一 owner,通常由专门 Ticket 或明确的集成 owner 修改;
|
|
132
132
|
7. 不得用依赖边表达“可能更方便”或纯粹的人员交接。
|
|
133
133
|
|
|
134
134
|
使用 下方 `<tickets-map-template>` 标签 草拟总体 Map。
|
|
@@ -194,8 +194,11 @@ specdev/changes/{change}/ticket/NN-<ticket-name>.md
|
|
|
194
194
|
|
|
195
195
|
运行:
|
|
196
196
|
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
```bash
|
|
198
|
+
node Speculo Node 校验器 \
|
|
199
|
+
--stage tickets \
|
|
200
|
+
specdev/changes/{change}
|
|
201
|
+
```
|
|
199
202
|
|
|
200
203
|
更新 `specdev/status.json` 与 `specdev/changes/{change}/.status.json`。
|
|
201
204
|
|
|
@@ -307,7 +310,7 @@ specdev/changes/{change}/ticket/NN-<ticket-name>.md
|
|
|
307
310
|
- [ ] `writable_paths` 非空,或明确为仅文档、调查或无代码变更。
|
|
308
311
|
- [ ] 每个 shared path 在 `shared_path_owners` 中有唯一 owner。
|
|
309
312
|
- [ ] 正常、失败和回归至少各有一条验证,或有可信的不适用原因。
|
|
310
|
-
- [ ] 仅当用户界面交互受影响时定义 E2E
|
|
313
|
+
- [ ] 仅当用户界面交互受影响时定义 E2E 与当前执行 owner;Ticket 不预设 Lead/Worker,委派 Goal Plan 可以显式改由 Lead 集成。
|
|
311
314
|
- [ ] Evidence 位置明确为 `specdev/changes/{change}/evidence/T-NN.md`。
|
|
312
315
|
- [ ] 单个全新上下文能够完成;否则已拆分。
|
|
313
316
|
- [ ] 所有内部文件与目录引用使用本文约定的逻辑路径。
|
|
@@ -449,7 +452,7 @@ shared_path_owners: []
|
|
|
449
452
|
|
|
450
453
|
不适用的关键风险类别必须写“不适用:原因”。
|
|
451
454
|
|
|
452
|
-
仅当用户界面交互受影响时增加 E2E
|
|
455
|
+
仅当用户界面交互受影响时增加 E2E 行并指定当前执行 owner。若后续 Goal Plan 含委派附录,再由该计划显式转交 Lead;Ticket 不预设 Lead/Worker 角色。
|
|
453
456
|
|
|
454
457
|
## 9. 发布、迁移与恢复
|
|
455
458
|
|
|
@@ -527,7 +530,7 @@ T-01 [READY]
|
|
|
527
530
|
## 5. 并行与路径所有权
|
|
528
531
|
|
|
529
532
|
- 最大并发来自 `specdev/config.json`。
|
|
530
|
-
- shared owner
|
|
533
|
+
- shared owner 为专用 Ticket 或明确的集成 owner;只有委派 Goal Plan 才使用 Lead 角色。
|
|
531
534
|
- 项目路径契约以 Ticket frontmatter 为准。
|
|
532
535
|
- 并行写代码的 Ticket 使用独立 worktree;只读调查不需要。
|
|
533
536
|
|
|
@@ -625,33 +628,44 @@ SpecDev 通过分层工件避免同一决策被多个模型反复重做。每个
|
|
|
625
628
|
|
|
626
629
|
| 工件 | 具体位置 | 必须决定 | 不应决定 |
|
|
627
630
|
|---|---|---|---|
|
|
628
|
-
|
|
|
631
|
+
| 来源快照 | `specdev/changes/{change}/source.md` | 原始请求、捕获时间、locator、hash 和关闭能力 | 当前产品合同或实现状态 |
|
|
632
|
+
| 分诊 | `specdev/changes/{change}/triage.md` | 请求类别、影响、风险、缺失输入、下一 work 和远程 reconcile 状态 | 详细实现方案或开发进度 |
|
|
629
633
|
| 诊断 | `specdev/changes/{change}/diagnosis.md` | 复现、证据、根因、修复不变量和回归契约 | 未经验证的修复实现 |
|
|
630
634
|
| 设计日志 | `specdev/changes/{change}/LOG.md` | 讨论轨迹、确认、延后、替代与废弃结论 | 当前架构权威摘要 |
|
|
631
635
|
| 设计树 | `specdev/changes/{change}/design-tree.json` | 决策节点、依赖、当前 frontier、轮次与共识状态 | 领域真相或架构决定正文 |
|
|
632
|
-
| 领域上下文 | `specdev/changes/{change}/CONTEXT.md` |
|
|
633
|
-
| 架构决策 | `specdev/changes/{change}/ADR.md` |
|
|
636
|
+
| Change 领域上下文 | `specdev/changes/{change}/CONTEXT.md` | 本 change 已确认、供下游使用的领域术语和语义 | 永久领域知识或临时会议记录 |
|
|
637
|
+
| Change 架构决策 | `specdev/changes/{change}/ADR.md` | 已成为本 change 下游合同的架构决策、原因、后果和替代关系 | 永久项目 ADR 或尚未决定的方案集合 |
|
|
634
638
|
| Spec | `specdev/changes/{change}/spec.md` | 用户问题、外部行为、范围、验收合同、非功能要求和已锁定实现约束 | 文件级施工步骤 |
|
|
635
639
|
| Ticket | `specdev/changes/{change}/ticket/NN-<ticket-name>.md` | 单一垂直切片的行为、决策、范围、路径所有权、执行路线和验证证据 | 跨 Ticket 里程碑治理 |
|
|
636
640
|
| Tickets Map | `specdev/changes/{change}/tickets-map.md` | 依赖 DAG、合同覆盖、Ready 投影、并行候选和路径冲突 | 单 Ticket 的完整实现契约 |
|
|
637
641
|
| Goal Plan | `specdev/changes/{change}/goal-plan.md` | 跨 Ticket 调度、Gate、共享所有权、迁移顺序、集成和偏差治理 | 复制 Ticket 全文 |
|
|
638
642
|
| Evidence | `specdev/changes/{change}/evidence/T-NN.md` | 实际修改、命令、结果、验收映射、偏差、风险和提交引用 | 新的产品或架构决策 |
|
|
643
|
+
| 代码审查 | `specdev/changes/{change}/reviews/CR-###.md` | 固定点、标准轴和规范轴 finding | 实施修复或合并两轴排名 |
|
|
644
|
+
| 原型记录 | `specdev/changes/{change}/prototypes/{prototype-id}/record.md` | 一个问题、分支、资产、答案、promotion 和清理 | 生产实现或多个问题的计划 |
|
|
645
|
+
| Stakeholder 问卷 | `specdev/changes/{change}/questionnaires/{slug}.md` | 第三方原始回答和恢复条件 | 未经转录确认的产品/架构决定 |
|
|
639
646
|
| Wayfinder 地图 | `specdev/changes/{change}/wayfinder-map.md` | 目的地、说明、已关闭决策索引、战争迷雾和范围之外 | 开放 Ticket 正文或答案详情 |
|
|
640
647
|
| Wayfinder Ticket | `specdev/changes/{change}/investigation/{investigation-id}.md` | 一个可精确陈述的问题、类型、阻塞和关闭状态 | 解决方案评论或交付目标 |
|
|
641
648
|
| Wayfinder solution comment | `specdev/changes/{change}/investigation/comments/{investigation-id}/NN-solution.md` | Ticket 的答案、结果事实和资产指针 | 地图索引或产品实现 |
|
|
642
649
|
| 架构审查 | `specdev/changes/{change}/architecture-review.md` 与 `specdev/changes/{change}/architecture-review.html` | 深化候选、证据、可视化、选择和访谈状态 | 未经用户选择的执行契约 |
|
|
643
650
|
|
|
651
|
+
Change CONTEXT/ADR 是 active change 内的执行权威,不是 workflow 级永久知识。G 和其他设计/执行 Works 只读 `specdev/context/` 与 `specdev/adr/`;只有 A 在 change 完成、实现证据验证、毕业评估和用户确认后才能写入永久 namespace。未毕业内容随归档 change 保留,不能从 change 工件消失。
|
|
652
|
+
|
|
644
653
|
## 2. 权威顺序
|
|
645
654
|
|
|
646
655
|
同一事项冲突时按下列顺序裁决:
|
|
647
656
|
|
|
648
657
|
1. 用户最新明确决定;
|
|
649
|
-
2.
|
|
650
|
-
3.
|
|
651
|
-
4.
|
|
652
|
-
5.
|
|
653
|
-
6.
|
|
654
|
-
7.
|
|
658
|
+
2. 当前 change 已接受的架构决策:`specdev/changes/{change}/ADR.md`;
|
|
659
|
+
3. 永久 ADR 与领域上下文:`specdev/adr/`、`specdev/context/`;
|
|
660
|
+
4. 当前外部行为权威:`specdev/changes/{change}/spec.md`;
|
|
661
|
+
5. 当前 Ticket 契约:`specdev/changes/{change}/ticket/NN-<ticket-name>.md`;
|
|
662
|
+
6. 当前跨 Ticket 编排:`specdev/changes/{change}/goal-plan.md`;
|
|
663
|
+
7. 当前代码与运行事实;
|
|
664
|
+
8. 旧计划、旧日志和未经确认的推断。
|
|
665
|
+
|
|
666
|
+
当前 change 决定与永久知识冲突时,必须在 LOG/ADR 中显式说明替代关系;它只约束当前 change,直到 A 决定是否提升并更新永久版本。
|
|
667
|
+
|
|
668
|
+
`specdev/changes/{change}/source.md` 只对“原始输入是什么”具有权威;后续用户决定、ADR 和 Spec 可以显式演进该意图。远程来源在摄入后发生变化不会自动改写本地合同,必须重新 Triage。
|
|
655
669
|
|
|
656
670
|
代码事实可以证明计划已过时,但不能静默改写用户目标或已接受契约。出现这种情况时,按 下方 `<deviation-control>` 标签 退回相应工件修订。
|
|
657
671
|
|
|
@@ -765,16 +779,16 @@ shared_paths: ["package.json"]
|
|
|
765
779
|
1. 可能并行的 Ticket,其 `writable_paths` 不得相交。
|
|
766
780
|
2. glob 与具体路径按覆盖关系判断,不得只比较字符串。
|
|
767
781
|
3. 根依赖清单、锁文件、根导出、共享 schema、迁移索引、全局路由和跨 Ticket 合同文件默认视为 shared。
|
|
768
|
-
4. shared path
|
|
782
|
+
4. shared path 只能由专用 owner Ticket 或 Goal Plan 明确指定的唯一集成 owner 修改;消费者 Ticket 只读。委派 Goal Plan 可以把该 owner 指定为 Lead,但普通计划不预设角色。
|
|
769
783
|
5. 需要越界时先停止,按 下方 `<deviation-control>` 标签 提出 ownership change;不得先改后报。
|
|
770
784
|
6. 前置 Ticket 改变目录结构后,后续 Ticket 开始前重新解析项目路径;若授权范围语义未改变,可只更新导航路径。
|
|
771
785
|
7. 不得把“最后解决合并冲突”当作所有权方案。
|
|
772
786
|
|
|
773
787
|
## 3. Worktree 与分支
|
|
774
788
|
|
|
775
|
-
|
|
789
|
+
需要并行或临时隔离项目写入时使用独立 worktree;只读调查和顺序执行默认共用当前工作区。Worktree 防止工作区污染,路径所有权防止逻辑冲突,两者不能互相替代。
|
|
776
790
|
|
|
777
|
-
|
|
791
|
+
生命周期由调用方明确的 workspace owner 按 下方 `<dev-worktree>` 标签 管理。普通 Goal Plan 由当前执行或集成 owner 负责;委派 Goal Plan 才把 workspace owner 映射为 Lead。编排规则位于 “目标规划阶段的核心编排规则”。
|
|
778
792
|
|
|
779
793
|
</path-ownership>
|
|
780
794
|
|
|
@@ -806,7 +820,7 @@ shared_paths: ["package.json"]
|
|
|
806
820
|
4. 可重复手动步骤、截图或查询结果;
|
|
807
821
|
5. 代码阅读推断。
|
|
808
822
|
|
|
809
|
-
E2E
|
|
823
|
+
E2E 仅在变更影响用户界面交互时加入验证矩阵。普通执行由当前实现或集成 owner 运行;委派执行中 Worker 只记录场景、预期结果和待执行状态,由 Lead 在集成阶段运行。API、CLI、后端、库或数据变更默认使用其稳定接缝,不追加 E2E。
|
|
810
824
|
|
|
811
825
|
低层证据不能替代明确要求的用户行为证据。高风险迁移还需要 dry-run、调用点扫描、数据核对、监控信号或回滚演练。
|
|
812
826
|
|
|
@@ -849,7 +863,7 @@ E2E 仅在变更影响用户界面交互时加入验证矩阵,并且只由 Lea
|
|
|
849
863
|
## 1. 偏差等级
|
|
850
864
|
|
|
851
865
|
- **local**:只改变局部实现,不改变 Ticket 的行为、范围、公共契约、路径所有权或验证;记录到 Evidence 后可继续。
|
|
852
|
-
- **ticket**:改变 Ticket 的执行路线、可写范围、局部契约或验收映射,但不改变 Spec;必须停止相关修改、更新 Ticket
|
|
866
|
+
- **ticket**:改变 Ticket 的执行路线、可写范围、局部契约或验收映射,但不改变 Spec;必须停止相关修改、更新 Ticket 并获得该 Ticket 或计划明确的批准 owner 同意。
|
|
853
867
|
- **spec**:改变外部行为、范围、用户故事、验收合同或非功能要求;必须返回 “编写 Spec 阶段”。
|
|
854
868
|
- **architecture**:改变已接受架构决策或公共架构约束;必须返回 “设计访谈能力” 并更新 `specdev/changes/{change}/ADR.md`。
|
|
855
869
|
- **release**:改变迁移、兼容窗口、发布门禁、回滚或不可逆批准点;必须停止并获得明确人工批准。
|
|
@@ -884,7 +898,7 @@ E2E 仅在变更影响用户界面交互时加入验证矩阵,并且只由 Lea
|
|
|
884
898
|
|
|
885
899
|
- 未批准的 ticket、spec、architecture 或 release 偏差不得继续实现。
|
|
886
900
|
- 不得通过扩大 `writable_paths`、删除测试、降低断言或把风险改写成“已知限制”来绕过停止。
|
|
887
|
-
-
|
|
901
|
+
- 偏差影响普通并行执行时,当前集成 owner 必须暂停受影响 Wave,重新计算路径所有权、依赖和 Gate;委派执行由 Lead 承担同一责任。
|
|
888
902
|
|
|
889
903
|
</deviation-control>
|
|
890
904
|
|
|
@@ -892,42 +906,54 @@ E2E 仅在变更影响用户界面交互时加入验证矩阵,并且只由 Lea
|
|
|
892
906
|
|
|
893
907
|
# SpecDev Research
|
|
894
908
|
|
|
895
|
-
##
|
|
909
|
+
## 输入
|
|
910
|
+
|
|
911
|
+
- `decision`:研究要支持的一个具体决定;
|
|
912
|
+
- `questions`:需要回答的穷尽问题集;
|
|
913
|
+
- `stop_condition`:何时证据已足够;
|
|
914
|
+
- `caller`:D、G、S、W、R、T 或 I;
|
|
915
|
+
- `target_artifact`:调用方拥有且将接收结果的完整 Path。
|
|
896
916
|
|
|
897
|
-
|
|
917
|
+
缺少 owner 或 target 时返回阻塞,不创建 `{change}/research/` 等共享 namespace。
|
|
898
918
|
|
|
899
919
|
## 流程
|
|
900
920
|
|
|
901
|
-
1.
|
|
902
|
-
2.
|
|
903
|
-
3.
|
|
904
|
-
4.
|
|
905
|
-
5.
|
|
906
|
-
6.
|
|
907
|
-
7. 长期有效且经实现验证后才可由 Archive 提升到永久 research。
|
|
921
|
+
1. 固定问题、版本、环境和停止条件。
|
|
922
|
+
2. 优先官方文档、规范、源代码、论文或维护者材料;技术问题使用一手来源。
|
|
923
|
+
3. 核对发布日期、版本、适用环境、限制和已知冲突。
|
|
924
|
+
4. 对每个会改变决定的实质声明就近给出来源;关键结论交叉验证,来源冲突时并列呈现。
|
|
925
|
+
5. 区分来源事实、代码库事实、推断、建议和未知项。
|
|
926
|
+
6. 返回一个 Markdown block,由 caller 原子写入 `target_artifact`;本 Skill 不自行写 state。
|
|
908
927
|
|
|
909
|
-
##
|
|
928
|
+
## 输出
|
|
910
929
|
|
|
911
930
|
```markdown
|
|
912
|
-
|
|
913
|
-
-
|
|
914
|
-
-
|
|
915
|
-
-
|
|
931
|
+
## Research: <问题>
|
|
932
|
+
- Decision / target:
|
|
933
|
+
- Scope / version:
|
|
934
|
+
- Stop condition:
|
|
916
935
|
|
|
917
|
-
## Findings
|
|
918
936
|
### R-001
|
|
919
|
-
-
|
|
920
|
-
-
|
|
921
|
-
-
|
|
922
|
-
-
|
|
923
|
-
-
|
|
924
|
-
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
937
|
+
- Claim:
|
|
938
|
+
- Type: official fact / code fact / inference / recommendation
|
|
939
|
+
- Source:
|
|
940
|
+
- Confidence:
|
|
941
|
+
- Limits:
|
|
942
|
+
- Artifact impact:
|
|
943
|
+
|
|
944
|
+
### Conflicts and Unknowns
|
|
945
|
+
### Recommendation
|
|
928
946
|
```
|
|
929
947
|
|
|
930
|
-
|
|
948
|
+
不得长篇复制受版权保护内容。长期有效且经实现验证的结论只能由 Archive 从调用方工件提升到永久 research。
|
|
949
|
+
|
|
950
|
+
## 完成标准
|
|
951
|
+
|
|
952
|
+
- 每个输入问题有答案或明确未知;
|
|
953
|
+
- 每个实质声明就近引用一手来源;
|
|
954
|
+
- 版本、限制、冲突和置信度已记录;
|
|
955
|
+
- 结果有唯一 owning artifact;
|
|
956
|
+
- 本 Skill 没有创建自己的 state 路径。
|
|
931
957
|
|
|
932
958
|
</research>
|
|
933
959
|
|
|
@@ -937,79 +963,89 @@ E2E 仅在变更影响用户界面交互时加入验证矩阵,并且只由 Lea
|
|
|
937
963
|
|
|
938
964
|
## 适用范围
|
|
939
965
|
|
|
940
|
-
-
|
|
966
|
+
- 用于并行写代码且路径所有权不冲突的 Ready Ticket,或明确要求临时隔离的一次性原型。
|
|
941
967
|
- 只读调查和顺序执行默认共用当前工作区。
|
|
942
|
-
-
|
|
968
|
+
- 调用方必须明确 workspace owner、implementation owner、固定基线、工作项 ID、持久化 owner 和允许的结束动作。
|
|
969
|
+
- 普通执行不建立额外角色;委派 Goal Plan 才把 workspace owner/implementation owner 分别映射为 Lead/Worker。
|
|
943
970
|
- 平台原生 worktree 优先;不可用时使用 Git worktree。
|
|
944
971
|
|
|
945
972
|
## 生命周期
|
|
946
973
|
|
|
947
974
|
1. 创建或恢复时加载 下方 `<dev-worktree-create>` 标签。
|
|
948
|
-
2.
|
|
949
|
-
3.
|
|
975
|
+
2. implementation owner 完成后返回工作项状态、Evidence/record 路径、`workspace_ref`、checkpoint、commit 或 PR 引用和未验证项;Ticket worktree 从 `active` 更新为 `review`。
|
|
976
|
+
3. workspace owner 集成或清理时加载 下方 `<dev-worktree-finalize>` 标签;一次性原型只评估和清理,不合入生产分支。
|
|
950
977
|
|
|
951
|
-
状态依次为 `planned → active → review → integrated → removed`;失败进入 `blocked
|
|
978
|
+
Ticket worktree 状态依次为 `planned → active → review → integrated → removed`;失败进入 `blocked`,记录写入 `specdev/changes/{change}/.status.json` 的 `worktrees`。原型的 branch、`workspace_ref` 和清理结果只写入 `specdev/changes/{change}/prototypes/{prototype-id}/record.md`,不伪造 Ticket worktree 记录。
|
|
952
979
|
|
|
953
980
|
## 边界
|
|
954
981
|
|
|
955
|
-
- 每个并行 Ticket 使用独立 worktree、分支和相同 `base_sha
|
|
956
|
-
-
|
|
957
|
-
-
|
|
982
|
+
- 每个并行 Ticket 使用独立 worktree、分支和相同 `base_sha`;每个原型使用独立 worktree 和分支。
|
|
983
|
+
- Git provider 固定使用 `<project-root>/specdev-worktree/<work-item-id>/`,持久化 `workspace_ref: specdev-worktree/<work-item-id>`;`<project-root>` 由 `workspace.json#path_base: project-root` 解析。
|
|
984
|
+
- native/external provider 保留其可迁移 opaque locator;所有 provider 都不保存机器绝对路径、认证秘密或真实用户数据。
|
|
985
|
+
- 项目根 `.gitignore` 的 `specdev-worktree/` 条目由 `speculo init` 单一维护;缺失时创建流程阻塞并提示重新运行 init。
|
|
986
|
+
- E2E 仅适用于用户界面交互受影响的变更。普通执行由当前集成 owner 运行;委派执行由 Lead 在集成阶段运行。
|
|
958
987
|
- 合并、推送、PR、删除分支或 worktree 仍需用户授权。
|
|
959
988
|
|
|
960
989
|
</dev-worktree>
|
|
961
990
|
|
|
962
991
|
<dev-worktree-create>
|
|
963
992
|
|
|
964
|
-
#
|
|
993
|
+
# 创建或恢复工作项 Worktree
|
|
965
994
|
|
|
966
995
|
## 前置
|
|
967
996
|
|
|
968
|
-
- Ticket `ready: true
|
|
969
|
-
- `specdev/config.json` 中 `git.worktree_for_parallel: true
|
|
970
|
-
-
|
|
997
|
+
- Ticket `ready: true` 且依赖完成,或原型问题与临时写入范围已锁定;项目写路径无冲突。
|
|
998
|
+
- 并行 Ticket 要求 `specdev/config.json` 中 `git.worktree_for_parallel: true`;一次性原型要求 P-prototype 已取得本次临时 worktree 授权。
|
|
999
|
+
- 调用方已指定 workspace owner、implementation owner、工作项 ID、持久化 owner,并固定 `base_sha`;并行 Ticket 共用同一基线。
|
|
971
1000
|
|
|
972
1001
|
## 创建
|
|
973
1002
|
|
|
974
|
-
1.
|
|
975
|
-
2.
|
|
976
|
-
3.
|
|
977
|
-
4.
|
|
978
|
-
5.
|
|
1003
|
+
1. 从 Speculo 工作区声明的 `path_base: project-root` 解析 `<project-root>`。若记录的 provider 为 `git`,要求 `workspace_ref` 精确为 `specdev-worktree/<work-item-id>`,拼接后仍位于 project root,且 `specdev-worktree/` 不是逃逸到外部的符号链接。
|
|
1004
|
+
2. 读取调用方拥有的持久化记录:Ticket 使用 `specdev/changes/{change}/.status.json` 的 `worktrees`;原型使用 `specdev/changes/{change}/prototypes/{prototype-id}/record.md`。若已有可恢复记录,Git provider 必须在 `git worktree list --porcelain` 中匹配固定路径、分支与 `base_sha`;native/external 由对应 provider 解析 opaque locator。一致则恢复,任一不一致停止。
|
|
1005
|
+
3. 否则优先调用平台原生 worktree 能力。使用 native/external 时保存 provider 返回的可迁移 locator;不可用时进入 Git fallback。
|
|
1006
|
+
4. Git fallback 前确认项目根 `.gitignore` 已包含 `specdev-worktree/` 或等价根模式。缺失时停止并提示重新运行当前版本 `speculo init`,不在本 Skill 内修改 `.gitignore`。
|
|
1007
|
+
5. Git fallback 固定 `physical_path = <project-root>/specdev-worktree/<work-item-id>`、`workspace_ref = specdev-worktree/<work-item-id>`,从 `base_sha` 执行 `git worktree add -b <work-item-branch> <physical-path> <base-sha>`。已存在但未与同一记录和 Git 注册匹配的目标路径一律阻塞。
|
|
1008
|
+
6. 分支使用 `speculo/<change>/<work-item-id>`;现有分支未能匹配记录时停止。
|
|
1009
|
+
7. 安装项目所需依赖,运行最小基线检查。E2E 不属于 implementation owner 的创建基线。
|
|
1010
|
+
8. Ticket 将记录写入 `worktrees`:
|
|
979
1011
|
|
|
980
1012
|
```json
|
|
981
1013
|
{
|
|
982
1014
|
"ticket_id": "T-01",
|
|
983
|
-
"owner": "<
|
|
984
|
-
"provider": "
|
|
1015
|
+
"owner": "<implementation-owner>",
|
|
1016
|
+
"provider": "git",
|
|
985
1017
|
"base_sha": "<sha>",
|
|
986
1018
|
"branch": "speculo/<change>/T-01",
|
|
987
|
-
"workspace_ref": "
|
|
1019
|
+
"workspace_ref": "specdev-worktree/T-01",
|
|
988
1020
|
"status": "active",
|
|
989
1021
|
"updated_at": "<ISO-8601>"
|
|
990
1022
|
}
|
|
991
1023
|
```
|
|
992
1024
|
|
|
993
|
-
|
|
1025
|
+
native/external provider 将示例中的 provider 与 `workspace_ref` 换为对应可迁移 locator,不套用 Git 物理路径。原型不使用本 JSON 结构,只在 record 的 Run and Assets 中记录源码 branch/commit,并在 frontmatter 写入 `workspace_ref` 与清理状态。
|
|
1026
|
+
|
|
1027
|
+
完成条件:工作区可定位、基线可用、调用方记录与实际 provider、分支和 checkpoint 一致;Git provider 的引用与工作项 ID 完全一致。失败时在调用方拥有的记录中设为 `blocked` 并保留现场。
|
|
994
1028
|
|
|
995
1029
|
</dev-worktree-create>
|
|
996
1030
|
|
|
997
1031
|
<dev-worktree-finalize>
|
|
998
1032
|
|
|
999
|
-
#
|
|
1033
|
+
# 集成与清理工作项 Worktree
|
|
1034
|
+
|
|
1035
|
+
## 集成
|
|
1000
1036
|
|
|
1001
|
-
|
|
1037
|
+
仅生产 Ticket 进入本段;一次性原型不得合入生产分支。
|
|
1002
1038
|
|
|
1003
|
-
1. 确认记录为 `review`,读取
|
|
1039
|
+
1. workspace owner 确认记录为 `review`,读取 implementation owner 的 Evidence,实际修改未越过路径契约。
|
|
1004
1040
|
2. 在目标集成基线上应用变更并运行受影响的定向与回归验证。
|
|
1005
|
-
3.
|
|
1041
|
+
3. 仅当变更影响用户界面交互时,由当前集成 owner 运行验收所需的最小 E2E;委派执行中 implementation owner 只提供场景和预期结果,Lead 负责运行。
|
|
1006
1042
|
4. 验证通过后将记录更新为 `integrated`;冲突或失败时设为 `blocked` 并保留 worktree。
|
|
1007
1043
|
|
|
1008
1044
|
## 清理
|
|
1009
1045
|
|
|
1010
1046
|
1. 取得用户对删除 worktree 和分支的授权。
|
|
1011
|
-
2.
|
|
1012
|
-
3. 确认 worktree
|
|
1047
|
+
2. Git provider 从 project root 解析 `specdev-worktree/<work-item-id>`,重验无路径逃逸且与 `git worktree list --porcelain` 的记录一致,再从主工作树移除;native/external 通过对应 provider 管理入口移除。
|
|
1048
|
+
3. 确认 worktree 不再注册且工作项目录不存在后删除对应分支。Ticket 将状态更新为 `removed`;原型把 `cleanup_status` 更新为 `clean`。保留项目根 `specdev-worktree/` 统一目录及 `.gitignore` 条目。
|
|
1013
1049
|
|
|
1014
1050
|
PR 或暂缓集成时保留 worktree。清理失败时停止;仅在用户明确要求时使用强制删除。
|
|
1015
1051
|
|
|
@@ -1030,7 +1066,7 @@ PR 或暂缓集成时保留 worktree。清理失败时停止;仅在用户明
|
|
|
1030
1066
|
"execution": {
|
|
1031
1067
|
"max_parallel": 3,
|
|
1032
1068
|
"deep_ticket_human_approval": true,
|
|
1033
|
-
"shared_path_owner": "
|
|
1069
|
+
"shared_path_owner": "explicit"
|
|
1034
1070
|
},
|
|
1035
1071
|
"verification": {
|
|
1036
1072
|
"test": null,
|
|
@@ -1113,11 +1149,10 @@ PR 或暂缓集成时保留 worktree。清理失败时停止;仅在用户明
|
|
|
1113
1149
|
|
|
1114
1150
|
```json
|
|
1115
1151
|
{
|
|
1116
|
-
"schema_version":
|
|
1152
|
+
"schema_version": 4,
|
|
1117
1153
|
"workflow": "specdev",
|
|
1118
1154
|
"active": [],
|
|
1119
|
-
"
|
|
1120
|
-
"completed": []
|
|
1155
|
+
"archived": []
|
|
1121
1156
|
}
|
|
1122
1157
|
```
|
|
1123
1158
|
|
|
@@ -1128,19 +1163,18 @@ PR 或暂缓集成时保留 worktree。清理失败时停止;仅在用户明
|
|
|
1128
1163
|
```json
|
|
1129
1164
|
{
|
|
1130
1165
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1131
|
-
"$id": "urn:speculo:specdev:status:
|
|
1166
|
+
"$id": "urn:speculo:specdev:status:v4",
|
|
1132
1167
|
"title": "SpecDev Global Status",
|
|
1133
1168
|
"type": "object",
|
|
1134
1169
|
"required": [
|
|
1135
1170
|
"schema_version",
|
|
1136
1171
|
"workflow",
|
|
1137
1172
|
"active",
|
|
1138
|
-
"
|
|
1139
|
-
"completed"
|
|
1173
|
+
"archived"
|
|
1140
1174
|
],
|
|
1141
1175
|
"properties": {
|
|
1142
1176
|
"schema_version": {
|
|
1143
|
-
"const":
|
|
1177
|
+
"const": 4
|
|
1144
1178
|
},
|
|
1145
1179
|
"workflow": {
|
|
1146
1180
|
"const": "specdev"
|
|
@@ -1152,30 +1186,27 @@ PR 或暂缓集成时保留 worktree。清理失败时停止;仅在用户明
|
|
|
1152
1186
|
"required": [
|
|
1153
1187
|
"change",
|
|
1154
1188
|
"current_work",
|
|
1155
|
-
"works_run"
|
|
1156
|
-
"result"
|
|
1189
|
+
"works_run"
|
|
1157
1190
|
],
|
|
1158
1191
|
"properties": {
|
|
1159
1192
|
"change": {
|
|
1160
|
-
"type": "string"
|
|
1193
|
+
"type": "string",
|
|
1194
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
1161
1195
|
},
|
|
1162
1196
|
"current_work": {
|
|
1163
1197
|
"type": [
|
|
1164
1198
|
"string",
|
|
1165
1199
|
"null"
|
|
1166
|
-
]
|
|
1200
|
+
],
|
|
1201
|
+
"pattern": "^specdev/"
|
|
1167
1202
|
},
|
|
1168
1203
|
"works_run": {
|
|
1169
1204
|
"type": "array",
|
|
1170
1205
|
"items": {
|
|
1171
|
-
"type": "string"
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
"type": [
|
|
1176
|
-
"string",
|
|
1177
|
-
"null"
|
|
1178
|
-
]
|
|
1206
|
+
"type": "string",
|
|
1207
|
+
"pattern": "^specdev/"
|
|
1208
|
+
},
|
|
1209
|
+
"uniqueItems": true
|
|
1179
1210
|
},
|
|
1180
1211
|
"claimed_investigations": {
|
|
1181
1212
|
"type": "array",
|
|
@@ -1203,77 +1234,23 @@ PR 或暂缓集成时保留 worktree。清理失败时停止;仅在用户明
|
|
|
1203
1234
|
"type": "string"
|
|
1204
1235
|
}
|
|
1205
1236
|
},
|
|
1206
|
-
"additionalProperties":
|
|
1237
|
+
"additionalProperties": false
|
|
1207
1238
|
}
|
|
1208
1239
|
}
|
|
1209
1240
|
},
|
|
1210
|
-
"additionalProperties":
|
|
1211
|
-
}
|
|
1212
|
-
},
|
|
1213
|
-
"work_history": {
|
|
1214
|
-
"type": "array",
|
|
1215
|
-
"items": {
|
|
1216
|
-
"type": "object",
|
|
1217
|
-
"required": [
|
|
1218
|
-
"change",
|
|
1219
|
-
"work_id",
|
|
1220
|
-
"started_at",
|
|
1221
|
-
"completed_at",
|
|
1222
|
-
"result"
|
|
1223
|
-
],
|
|
1224
|
-
"properties": {
|
|
1225
|
-
"change": {
|
|
1226
|
-
"type": "string"
|
|
1227
|
-
},
|
|
1228
|
-
"work_id": {
|
|
1229
|
-
"type": "string",
|
|
1230
|
-
"pattern": "^specdev/"
|
|
1231
|
-
},
|
|
1232
|
-
"started_at": {
|
|
1233
|
-
"type": "string"
|
|
1234
|
-
},
|
|
1235
|
-
"completed_at": {
|
|
1236
|
-
"type": [
|
|
1237
|
-
"string",
|
|
1238
|
-
"null"
|
|
1239
|
-
]
|
|
1240
|
-
},
|
|
1241
|
-
"result": {
|
|
1242
|
-
"type": [
|
|
1243
|
-
"string",
|
|
1244
|
-
"null"
|
|
1245
|
-
]
|
|
1246
|
-
}
|
|
1247
|
-
},
|
|
1248
|
-
"additionalProperties": true
|
|
1241
|
+
"additionalProperties": false
|
|
1249
1242
|
}
|
|
1250
1243
|
},
|
|
1251
|
-
"
|
|
1244
|
+
"archived": {
|
|
1252
1245
|
"type": "array",
|
|
1253
1246
|
"items": {
|
|
1254
|
-
"type": "
|
|
1255
|
-
"
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
"archive_path"
|
|
1259
|
-
],
|
|
1260
|
-
"properties": {
|
|
1261
|
-
"change": {
|
|
1262
|
-
"type": "string"
|
|
1263
|
-
},
|
|
1264
|
-
"archived_at": {
|
|
1265
|
-
"type": "string"
|
|
1266
|
-
},
|
|
1267
|
-
"archive_path": {
|
|
1268
|
-
"type": "string",
|
|
1269
|
-
"pattern": "^specdev/archive/[0-9]{4}-[0-9]{2}/.+/$"
|
|
1270
|
-
}
|
|
1271
|
-
},
|
|
1272
|
-
"additionalProperties": true
|
|
1273
|
-
}
|
|
1247
|
+
"type": "string",
|
|
1248
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}-[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
1249
|
+
},
|
|
1250
|
+
"uniqueItems": true
|
|
1274
1251
|
}
|
|
1275
1252
|
},
|
|
1276
|
-
"additionalProperties":
|
|
1253
|
+
"additionalProperties": false
|
|
1277
1254
|
}
|
|
1278
1255
|
```
|
|
1279
1256
|
|
|
@@ -1451,6 +1428,49 @@ PR 或暂缓集成时保留 worktree。清理失败时停止;仅在用户明
|
|
|
1451
1428
|
}
|
|
1452
1429
|
},
|
|
1453
1430
|
"allOf": [
|
|
1431
|
+
{
|
|
1432
|
+
"if": {
|
|
1433
|
+
"properties": {
|
|
1434
|
+
"worktrees": {
|
|
1435
|
+
"contains": {
|
|
1436
|
+
"properties": {
|
|
1437
|
+
"provider": {
|
|
1438
|
+
"const": "git"
|
|
1439
|
+
}
|
|
1440
|
+
},
|
|
1441
|
+
"required": [
|
|
1442
|
+
"provider"
|
|
1443
|
+
]
|
|
1444
|
+
}
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
},
|
|
1448
|
+
"then": {
|
|
1449
|
+
"properties": {
|
|
1450
|
+
"worktrees": {
|
|
1451
|
+
"items": {
|
|
1452
|
+
"if": {
|
|
1453
|
+
"properties": {
|
|
1454
|
+
"provider": {
|
|
1455
|
+
"const": "git"
|
|
1456
|
+
}
|
|
1457
|
+
},
|
|
1458
|
+
"required": [
|
|
1459
|
+
"provider"
|
|
1460
|
+
]
|
|
1461
|
+
},
|
|
1462
|
+
"then": {
|
|
1463
|
+
"properties": {
|
|
1464
|
+
"workspace_ref": {
|
|
1465
|
+
"pattern": "^specdev-worktree/T-[0-9]{2,}$"
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
},
|
|
1454
1474
|
{
|
|
1455
1475
|
"if": {
|
|
1456
1476
|
"properties": {
|