create-yss-spec 3.1.3 → 3.2.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 +5 -1
- package/package.json +1 -1
- package/template/.agents/skills/.strategic-design-skills-manifest.json +1 -1
- package/template/.agents/skills/yss-domain/SKILL.md +3 -3
- package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
- package/template/.agents/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
- package/template/.agents/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
- package/template/.agents/skills/yss-mvc-design/SKILL.md +16 -0
- package/template/.agents/skills/yss-mvc-design/agents/openai.yaml +4 -0
- package/template/.agents/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +2 -2
- package/template/.agents/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +1 -1
- package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.agents/skills/yss-tactical-design/SKILL.md +2 -2
- package/template/.agents/skills/yss-tactical-design/references/output-template.md +2 -0
- package/template/.agents/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
- package/template/.agents/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
- package/template/.agents/skills/yss-technical-design/SKILL.md +31 -0
- package/template/.agents/skills/yss-technical-design/agents/openai.yaml +4 -0
- package/template/.agents/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
- package/template/.agents/skills/yss-technical-design/references/technical-design-contract.md +31 -0
- package/template/.agents/skills/yss-technical-design/references/technical-design.schema.json +759 -0
- package/template/.agents/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
- package/template/.agents/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
- package/template/.agents/skills/yss-technical-design/tests/fixtures.mjs +32 -0
- package/template/.agents/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
- package/template/.claude/skills/yss-domain/SKILL.md +3 -3
- package/template/.claude/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
- package/template/.claude/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
- package/template/.claude/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
- package/template/.claude/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
- package/template/.claude/skills/yss-mvc-design/SKILL.md +16 -0
- package/template/.claude/skills/yss-mvc-design/agents/openai.yaml +4 -0
- package/template/.claude/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +2 -2
- package/template/.claude/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +1 -1
- package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.claude/skills/yss-tactical-design/SKILL.md +2 -2
- package/template/.claude/skills/yss-tactical-design/references/output-template.md +2 -0
- package/template/.claude/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
- package/template/.claude/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
- package/template/.claude/skills/yss-technical-design/SKILL.md +31 -0
- package/template/.claude/skills/yss-technical-design/agents/openai.yaml +4 -0
- package/template/.claude/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
- package/template/.claude/skills/yss-technical-design/references/technical-design-contract.md +31 -0
- package/template/.claude/skills/yss-technical-design/references/technical-design.schema.json +759 -0
- package/template/.claude/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
- package/template/.claude/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
- package/template/.claude/skills/yss-technical-design/tests/fixtures.mjs +32 -0
- package/template/.claude/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
- package/template/.codex/skills/yss-domain/SKILL.md +3 -3
- package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
- package/template/.codex/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
- package/template/.codex/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
- package/template/.codex/skills/yss-mvc-design/SKILL.md +16 -0
- package/template/.codex/skills/yss-mvc-design/agents/openai.yaml +4 -0
- package/template/.codex/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +2 -2
- package/template/.codex/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +1 -1
- package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.codex/skills/yss-tactical-design/SKILL.md +2 -2
- package/template/.codex/skills/yss-tactical-design/references/output-template.md +2 -0
- package/template/.codex/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
- package/template/.codex/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
- package/template/.codex/skills/yss-technical-design/SKILL.md +31 -0
- package/template/.codex/skills/yss-technical-design/agents/openai.yaml +4 -0
- package/template/.codex/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
- package/template/.codex/skills/yss-technical-design/references/technical-design-contract.md +31 -0
- package/template/.codex/skills/yss-technical-design/references/technical-design.schema.json +759 -0
- package/template/.codex/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
- package/template/.codex/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
- package/template/.codex/skills/yss-technical-design/tests/fixtures.mjs +32 -0
- package/template/.codex/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
- package/template/.cursor/skills/yss-domain/SKILL.md +3 -3
- package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
- package/template/.cursor/skills/yss-mvc-design/SKILL.md +16 -0
- package/template/.cursor/skills/yss-mvc-design/agents/openai.yaml +4 -0
- package/template/.cursor/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +2 -2
- package/template/.cursor/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +1 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.cursor/skills/yss-tactical-design/SKILL.md +2 -2
- package/template/.cursor/skills/yss-tactical-design/references/output-template.md +2 -0
- package/template/.cursor/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
- package/template/.cursor/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
- package/template/.cursor/skills/yss-technical-design/SKILL.md +31 -0
- package/template/.cursor/skills/yss-technical-design/agents/openai.yaml +4 -0
- package/template/.cursor/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
- package/template/.cursor/skills/yss-technical-design/references/technical-design-contract.md +31 -0
- package/template/.cursor/skills/yss-technical-design/references/technical-design.schema.json +759 -0
- package/template/.cursor/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
- package/template/.cursor/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
- package/template/.cursor/skills/yss-technical-design/tests/fixtures.mjs +32 -0
- package/template/.cursor/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
- package/template/.pi/skills/yss-domain/SKILL.md +3 -3
- package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
- package/template/.pi/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
- package/template/.pi/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
- package/template/.pi/skills/yss-mvc-design/SKILL.md +16 -0
- package/template/.pi/skills/yss-mvc-design/agents/openai.yaml +4 -0
- package/template/.pi/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +2 -2
- package/template/.pi/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +1 -1
- package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.pi/skills/yss-tactical-design/SKILL.md +2 -2
- package/template/.pi/skills/yss-tactical-design/references/output-template.md +2 -0
- package/template/.pi/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
- package/template/.pi/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
- package/template/.pi/skills/yss-technical-design/SKILL.md +31 -0
- package/template/.pi/skills/yss-technical-design/agents/openai.yaml +4 -0
- package/template/.pi/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
- package/template/.pi/skills/yss-technical-design/references/technical-design-contract.md +31 -0
- package/template/.pi/skills/yss-technical-design/references/technical-design.schema.json +759 -0
- package/template/.pi/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
- package/template/.pi/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
- package/template/.pi/skills/yss-technical-design/tests/fixtures.mjs +32 -0
- package/template/.pi/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
- package/template/.qoder/skills/yss-domain/SKILL.md +3 -3
- package/template/.qoder/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
- package/template/.qoder/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
- package/template/.qoder/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
- package/template/.qoder/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
- package/template/.qoder/skills/yss-mvc-design/SKILL.md +16 -0
- package/template/.qoder/skills/yss-mvc-design/agents/openai.yaml +4 -0
- package/template/.qoder/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +2 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +1 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.qoder/skills/yss-tactical-design/SKILL.md +2 -2
- package/template/.qoder/skills/yss-tactical-design/references/output-template.md +2 -0
- package/template/.qoder/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
- package/template/.qoder/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
- package/template/.qoder/skills/yss-technical-design/SKILL.md +31 -0
- package/template/.qoder/skills/yss-technical-design/agents/openai.yaml +4 -0
- package/template/.qoder/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
- package/template/.qoder/skills/yss-technical-design/references/technical-design-contract.md +31 -0
- package/template/.qoder/skills/yss-technical-design/references/technical-design.schema.json +759 -0
- package/template/.qoder/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
- package/template/.qoder/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
- package/template/.qoder/skills/yss-technical-design/tests/fixtures.mjs +32 -0
- package/template/.qoder/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
- package/template/.trae/skills/yss-domain/SKILL.md +3 -3
- package/template/.trae/skills/yss-implementation-contract-compiler/SKILL.md +2 -2
- package/template/.trae/skills/yss-implementation-contract-compiler/references/boundaries.md +5 -0
- package/template/.trae/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +10 -2
- package/template/.trae/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +8 -1
- package/template/.trae/skills/yss-mvc-design/SKILL.md +16 -0
- package/template/.trae/skills/yss-mvc-design/agents/openai.yaml +4 -0
- package/template/.trae/skills/yss-mvc-design/references/mvc-design.schema.json +315 -0
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +2 -2
- package/template/.trae/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +14 -9
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +1 -1
- package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +1 -1
- package/template/.trae/skills/yss-tactical-design/SKILL.md +2 -2
- package/template/.trae/skills/yss-tactical-design/references/output-template.md +2 -0
- package/template/.trae/skills/yss-tactical-design/references/tactical-design-contract.md +3 -1
- package/template/.trae/skills/yss-tactical-design/scripts/validate-tactical-design.mjs +3 -2
- package/template/.trae/skills/yss-technical-design/SKILL.md +31 -0
- package/template/.trae/skills/yss-technical-design/agents/openai.yaml +4 -0
- package/template/.trae/skills/yss-technical-design/references/technical-design-common.schema.json +290 -0
- package/template/.trae/skills/yss-technical-design/references/technical-design-contract.md +31 -0
- package/template/.trae/skills/yss-technical-design/references/technical-design.schema.json +759 -0
- package/template/.trae/skills/yss-technical-design/scripts/generate-schema.mjs +20 -0
- package/template/.trae/skills/yss-technical-design/scripts/validate-technical-design.mjs +134 -0
- package/template/.trae/skills/yss-technical-design/tests/fixtures.mjs +32 -0
- package/template/.trae/skills/yss-technical-design/tests/run-scenarios.mjs +82 -0
- package/template/CONTEXT.md +2 -1
- package/template/docs/agents/digital-human-roles.yaml +2 -2
- package/template/docs/agents/yss-skill-registry.yaml +20 -1
- package/template/docs/architecture/templates/architecture-review-checklist.md +1 -1
- package/template/docs/architecture/templates/system-overview-design-template.md +15 -4
- package/template/docs/process/lifecycle-artifact-map.md +2 -0
- package/template/docs/process/lifecycle-registry-baseline.json +3 -1
- package/template/docs/process/lifecycle-registry.yaml +9 -2
- package/template/docs/process/schemas/strategic-design-handoff.schema.json +77 -4
- package/template/docs/process/strategic-handoff-package.md +4 -2
- package/template/docs/process/template-verification-profiles.yaml +14 -0
- package/template/docs/user-guide//346/210/230/346/234/257/350/256/276/350/256/241/345/255/220/351/241/271/347/233/256/347/224/250/346/210/267/346/211/213/345/206/214.md +7 -6
- package/template/scripts/fixtures/strategic-handoff/fixture.mjs +3 -2
- package/template/scripts/lib/implementation-contract-compiler.mjs +8 -1
- package/template/scripts/lib/strategic-handoff-consumption.mjs +4 -4
- package/template/scripts/lib/strategic-handoff-design-targets.mjs +15 -0
- package/template/scripts/lib/technical-design-boundary.mjs +23 -0
- package/template/scripts/sync-strategic-handoff-tools +3 -2
- package/template/scripts/verify-strategic-handoff-package-scenarios +7 -1
- package/template/skills-lock.json +41 -11
- package/template.snapshot.json +4 -4
|
@@ -82,6 +82,11 @@ required_files:
|
|
|
82
82
|
- docs/design/templates/visual-baseline-template.yaml
|
|
83
83
|
- docs/process/templates/maintenance-checkpoint-template.yaml
|
|
84
84
|
- docs/templates/subagent-task-package-template.md
|
|
85
|
+
- .agents/skills/yss-technical-design/SKILL.md
|
|
86
|
+
- .agents/skills/yss-technical-design/references/technical-design.schema.json
|
|
87
|
+
- .agents/skills/yss-technical-design/scripts/validate-technical-design.mjs
|
|
88
|
+
- .agents/skills/yss-mvc-design/SKILL.md
|
|
89
|
+
- .agents/skills/yss-mvc-design/references/mvc-design.schema.json
|
|
85
90
|
- .agents/skills/yss-tactical-design/SKILL.md
|
|
86
91
|
- .agents/skills/yss-tactical-design/agents/openai.yaml
|
|
87
92
|
- .agents/skills/yss-tactical-design/references/tactical-design-contract.md
|
|
@@ -191,6 +196,10 @@ syntax_files:
|
|
|
191
196
|
- scripts/verify-maintenance-review-workflow-scenarios
|
|
192
197
|
- scripts/verify-template-cache-scenarios
|
|
193
198
|
routing:
|
|
199
|
+
- patterns: [".template-source/cli-core/**"]
|
|
200
|
+
groups: [dedicated-cli-core]
|
|
201
|
+
- patterns: [".agents/skills/yss-technical-design/**", ".agents/skills/yss-mvc-design/**", ".agents/skills/yss-tactical-design/**", "scripts/lib/technical-design-boundary.mjs", "scripts/lib/strategic-handoff-design-targets.mjs"]
|
|
202
|
+
groups: [tactical-design, implementation]
|
|
194
203
|
- patterns: ["scripts/*backend-delivery*", "scripts/*frontend-delivery*", "scripts/lib/*backend-delivery*", "scripts/lib/*frontend-delivery*", "scripts/fixtures/backend-delivery/**", "docs/process/frontend-backend-delivery.md", "docs/process/schemas/backend-delivery*", "docs/process/schemas/frontend-delivery*"]
|
|
195
204
|
groups: [frontend-delivery]
|
|
196
205
|
- patterns: ["scripts/*user-decision*", "scripts/lib/user-decision*", "scripts/fixtures/user-decision/**", "docs/process/schemas/user-decision*", "docs/process/templates/user-decision*", "scripts/lib/approval-record.mjs", "scripts/verify-approval-record"]
|
|
@@ -230,6 +239,9 @@ routing:
|
|
|
230
239
|
- patterns: ["scripts/**"]
|
|
231
240
|
groups: [hygiene]
|
|
232
241
|
groups:
|
|
242
|
+
dedicated-cli-core:
|
|
243
|
+
commands:
|
|
244
|
+
- { run: "node --test .template-source/cli-core/tests/*.test.mjs", when: template-source }
|
|
233
245
|
frontend-delivery:
|
|
234
246
|
commands:
|
|
235
247
|
- { run: "scripts/verify-frontend-delivery-scenarios" }
|
|
@@ -259,6 +271,8 @@ groups:
|
|
|
259
271
|
- { run: "node .agents/skills/yss-antdv-next-design/tests/run-scenarios.mjs" }
|
|
260
272
|
tactical-design:
|
|
261
273
|
commands:
|
|
274
|
+
- { run: "node .agents/skills/yss-technical-design/scripts/generate-schema.mjs --check" }
|
|
275
|
+
- { run: "node .agents/skills/yss-technical-design/tests/run-scenarios.mjs" }
|
|
262
276
|
- { run: "node --check .agents/skills/yss-tactical-design/scripts/validate-tactical-design.mjs" }
|
|
263
277
|
- { run: "node --check .agents/skills/yss-tactical-design/tests/run-scenarios.mjs" }
|
|
264
278
|
- { run: "node .agents/skills/yss-tactical-design/tests/run-scenarios.mjs" }
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
# 战术设计子项目用户手册
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本入口保留给既有读者。“战术设计子项目”通过 `yss-technical-design` 统一承接技术设计,整体主控仍为 `yss-product-lifecycle`。先确认后端项目采用 `domain-driven` 或 `layered-mvc`,再分别调用 `yss-tactical-design` 或 `yss-mvc-design`;DDD 是选项,不是默认要求。技术设计不代替 API Freeze 或 Slice Contract 批准。
|
|
4
4
|
|
|
5
5
|
## 输入与开始
|
|
6
6
|
|
|
7
|
-
先核对本仓身份、profile、根 CONTEXT.md
|
|
7
|
+
先核对本仓身份、profile、根 CONTEXT.md、适用的战略交接、需求及批准证据。已有战略包时,导入快照后完成目标词汇对账,再逐项登记源规则/关键场景的承接;缺失、冲突或过期先回交,不能猜测业务规则。
|
|
8
8
|
|
|
9
9
|
```text
|
|
10
10
|
请按本仓生命周期检查“设备领用”当前战略输入及目标词汇对账。
|
|
11
|
-
|
|
11
|
+
使用 yss-technical-design 核对已确认的项目架构并起草技术设计,
|
|
12
|
+
DDD 调用 yss-tactical-design,传统 MVC 调用 yss-mvc-design;
|
|
12
13
|
解释设备占用的竞争、状态转换和一致性边界,并映射公开测试 seam。
|
|
13
14
|
逐项列出已承接、冲突、延期及依赖切片,等待适用审查后再编译实现合同。
|
|
14
15
|
```
|
|
@@ -20,15 +21,15 @@
|
|
|
20
21
|
| 谁保护不变量 | 哪个对象/边界保证设备不能同时被领用 |
|
|
21
22
|
| 状态是否合法 | 未批准申请是否允许领用;重复归还如何处理 |
|
|
22
23
|
| 一致性在哪里保证 | 申请与设备占用是否同事务;失败如何恢复 |
|
|
23
|
-
| 外部依赖如何隔离 | API/Repository
|
|
24
|
+
| 外部依赖如何隔离 | API/Repository/适配边界怎样映射而不篡改业务含义 |
|
|
24
25
|
| 如何证伪设计 | 并发领用、无权限、重复请求的公开 seam 与预期结果 |
|
|
25
26
|
|
|
26
|
-
|
|
27
|
+
案例只是提问方向,答案由项目实际业务与工程条件决定。MVC 不要求先完成战略 DDD,也不要求聚合、值对象或 DDD Gateway;用例、规则、事务、幂等、并发和测试承接仍须清晰。没有相关技术设计影响时记录带原因的 not-applicable。
|
|
27
28
|
|
|
28
29
|
## 从设计到实现
|
|
29
30
|
|
|
30
31
|
综合项目由本仓生命周期继续路由,通用研发/后端由 Harness 流程承接。前端专职只消费上游规则、冻结接口并准备前端工程设计,不在本仓派发后端战术实现。
|
|
31
32
|
|
|
32
|
-
|
|
33
|
+
技术设计经现有门禁批准后,编译器消费当前设计并起草实现合同,批准与可实现状态由本仓编排和门禁控制。实现前确认工程登记、冻结接口、测试 seam、允许路径与回滚点。战术评审通过不等于 ready-for-agent。
|
|
33
34
|
|
|
34
35
|
过程示例见 [设备借用贯穿案例](设备借用贯穿案例.md);项目选型见 [用户手册](用户手册.md)。
|
|
@@ -16,7 +16,8 @@ context_schema_version: 1
|
|
|
16
16
|
|---|---|---|---|---|
|
|
17
17
|
| 供应商 | 提供产品或服务的主体 | Supplier | Global | |
|
|
18
18
|
`;
|
|
19
|
-
|
|
19
|
+
// Legacy fixture remains the default for released CLI compatibility tests.
|
|
20
|
+
export async function fixture(root, { technicalDesign = false } = {}) {
|
|
20
21
|
const put=(ref,value)=>{const p=path.join(root,ref);mkdirSync(path.dirname(p),{recursive:true});writeFileSync(p,typeof value==='string'?value:json(value));};
|
|
21
22
|
put('yss-project.yaml','schema_version: 1\nrepository_mode: project-instance\n');put('CONTEXT.md',context);
|
|
22
23
|
const source=parseContextSource(context), resolved=resolveContextTermRefs(source,['Global/Supplier']);
|
|
@@ -51,7 +52,7 @@ const visualBaselineRef = { baseline_id: sealedBaseline.baseline_id, version: se
|
|
|
51
52
|
const terminalGate=countersignRuleForGate(roles.gate_policy,'gate.strategic-design-handoff-approved')?'gate.strategic-design-handoff-approved':'gate.stage-decision-package-approved';
|
|
52
53
|
const gates={domain_strategy_ref:'gate.domain-strategy-approved',stage_decision_package_ref:'gate.stage-decision-package-approved',spec_ref:'gate.spec-baseline-approved',prototype_ref:'gate.user-confirmation',visual_baseline_ref:'gate.user-confirmation',business_ticket_set_ref:terminalGate,handoff:terminalGate};
|
|
53
54
|
const approvals=Object.fromEntries([...Object.keys(sourceRefs),'handoff'].map(key=>[key,{record_ref:`approvals/${key}.yaml`,gate_id:gates[key],digest_kind:key==='visual_baseline_ref'?'visual-baseline':['domain_strategy_ref','stage_decision_package_ref','business_ticket_set_ref'].includes(key)?'canonical-json':'sha256-bytes'}]));
|
|
54
|
-
const handoff={schema_version:3,handoff_id:'strategic-design-handoff.supplier',handoff_version:'v1',status:'approved',source:sourceRefs,source_context_snapshot:snapshot,context_delta:{added:resolved.terms.map(({term_ref,term,meaning,english_identifier,context_id,forbidden_aliases})=>({term_ref,term,meaning,english_identifier,context_id,forbidden_aliases})),updated:[],deprecated:[]},target_context_reconciliation:{target_context_ref:'CONTEXT.md',reconciliation_schema_ref:'docs/process/schemas/context-reconciliation.schema.json',required_before_skill:'yss-tactical-design',status:'pending'},target:{team:'downstream-rd-team',skill:'yss-tactical-design',output:'tactical-design-contract'},problem_and_business_outcomes:['提交供应商材料'],bounded_context_and_subdomain_map:['SupplierManagement'],context_map_and_translation_responsibility:['SupplierManagement'],ubiquitous_language_and_concept_candidates:['Global/Supplier'],scenarios_and_business_invariants:['rule.complete','scenario.submit'],tactical_design_questions:['一致性边界'],deferred_decisions_and_ownership:[],evidence_and_version_digests:['evidence/offline.log'],acceptance:['traceability'],package_export:{schema_version:1,approvals,additional_files:[],reference_map:{},prototype:{profile:'H2',preview_root:'preview',entry_ref:'preview/index.html',verification_ref:'evidence/offline.json',verification_digest:hash(readFileSync(path.join(root,'evidence/offline.json'))),source_digest:treeDigest(root,'prototype-src'),source_root:'prototype-src',lock_ref:'prototype-src/pnpm-lock.yaml'}}};
|
|
55
|
+
const handoff={schema_version:3,handoff_id:'strategic-design-handoff.supplier',handoff_version:'v1',status:'approved',source:sourceRefs,source_context_snapshot:snapshot,context_delta:{added:resolved.terms.map(({term_ref,term,meaning,english_identifier,context_id,forbidden_aliases})=>({term_ref,term,meaning,english_identifier,context_id,forbidden_aliases})),updated:[],deprecated:[]},target_context_reconciliation:{target_context_ref:'CONTEXT.md',reconciliation_schema_ref:'docs/process/schemas/context-reconciliation.schema.json',required_before_skill:technicalDesign?'yss-technical-design':'yss-tactical-design',status:'pending'},target:{team:'downstream-rd-team',skill:technicalDesign?'yss-technical-design':'yss-tactical-design',output:technicalDesign?'technical-design-contract':'tactical-design-contract'},problem_and_business_outcomes:['提交供应商材料'],bounded_context_and_subdomain_map:['SupplierManagement'],context_map_and_translation_responsibility:['SupplierManagement'],ubiquitous_language_and_concept_candidates:['Global/Supplier'],scenarios_and_business_invariants:['rule.complete','scenario.submit'],tactical_design_questions:['一致性边界'],deferred_decisions_and_ownership:[],evidence_and_version_digests:['evidence/offline.log'],acceptance:['traceability'],package_export:{schema_version:1,approvals,additional_files:[],reference_map:{},prototype:{profile:'H2',preview_root:'preview',entry_ref:'preview/index.html',verification_ref:'evidence/offline.json',verification_digest:hash(readFileSync(path.join(root,'evidence/offline.json'))),source_digest:treeDigest(root,'prototype-src'),source_root:'prototype-src',lock_ref:'prototype-src/pnpm-lock.yaml'}}};
|
|
55
56
|
const sign=()=>{put('handoff.yaml',handoff);for(const[key,approval]of Object.entries(approvals)){const asset=key==='handoff'?{id:handoff.handoff_id,version:handoff.handoff_version,digest:hash(readFileSync(path.join(root,'handoff.yaml')))}:sourceRefs[key];put(approval.record_ref,{schema_version:1,gate_id:approval.gate_id,decision:'approved',actor_kind:'digital-human',role_id:countersignRuleForGate(roles.gate_policy,approval.gate_id).countersigners[0],runtime_id:'runtime.generic',principal_ref:'synthetic-maintenance-fixture',artifact_bindings:[{id:asset.id||asset.baseline_id,version:asset.version,digest:asset.digest}]});}};
|
|
56
57
|
sign();return{handoff,strategy,stage,put,sign,snapshot};
|
|
57
58
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { enforceTechnicalDesign } from './technical-design-boundary.mjs';
|
|
1
2
|
import { enforceHarnessSkillScope } from "./harness-execution-scope.mjs";
|
|
2
3
|
import { createHash } from "node:crypto";
|
|
3
4
|
import { readFileSync } from "node:fs";
|
|
@@ -66,7 +67,8 @@ export function compileImplementationContract({
|
|
|
66
67
|
architecture_evidence,
|
|
67
68
|
root = ROOT,
|
|
68
69
|
slice_id,
|
|
69
|
-
frontend_delivery
|
|
70
|
+
frontend_delivery,
|
|
71
|
+
technical_design
|
|
70
72
|
}) {
|
|
71
73
|
assertV2(registry, compilerContract);
|
|
72
74
|
const deliveryInput = enforceFrontendDelivery({ slice_id, frontend_delivery }, { root });
|
|
@@ -91,6 +93,8 @@ export function compileImplementationContract({
|
|
|
91
93
|
for (const recipe of orderedRecipes) if (recipe.architecture_family && recipe.architecture_family !== architecture_identity.architecture_family) fail(`Recipe ${recipe.id} 与架构族不匹配`);
|
|
92
94
|
}
|
|
93
95
|
|
|
96
|
+
enforceTechnicalDesign({ technical_design, conditions, architecture_identity, slice_id }, { root });
|
|
97
|
+
|
|
94
98
|
const capabilitySources = new Map();
|
|
95
99
|
const orderedCapabilities = [];
|
|
96
100
|
const addCapability = (capabilityId, source) => {
|
|
@@ -175,6 +179,7 @@ export function compileImplementationContract({
|
|
|
175
179
|
readiness_blockers: architectureProfile.maturity === "supported" ? [] : ["backend-profile-not-supported"],
|
|
176
180
|
skill_profiles: Object.fromEntries(orderedSkills.map((skill) => [skill, architecture_identity.architecture_profile]))
|
|
177
181
|
} : {}),
|
|
182
|
+
...(technical_design ? { technical_design, slice_id } : {}),
|
|
178
183
|
recipe_ids: orderedRecipes.map((recipe) => recipe.id),
|
|
179
184
|
conditions: [...conditionSet].sort(),
|
|
180
185
|
required_capabilities: orderedCapabilities,
|
|
@@ -202,6 +207,8 @@ export function evaluateContractFreshness(contract, { registry, compilerContract
|
|
|
202
207
|
if (contract?.schema_version !== 2) fail("Slice Implementation Contract schema v1 已停止支持;必须重新编译 v2 合同");
|
|
203
208
|
const resolution = contract.resolution ?? contract;
|
|
204
209
|
const reasons = [];
|
|
210
|
+
try { enforceTechnicalDesign({ ...resolution, slice_id: contract.slice_id ?? resolution.slice_id }, { root }); }
|
|
211
|
+
catch { reasons.push("technical-design-stale-or-unavailable"); }
|
|
205
212
|
try { enforceFrontendDelivery(contract, { root }); }
|
|
206
213
|
catch { reasons.push("frontend-delivery-stale-or-unavailable"); }
|
|
207
214
|
if (resolution.registry_digest !== digestDocument(registry)) reasons.push("registry-digest-changed");
|
|
@@ -3,6 +3,7 @@ import path from 'node:path';
|
|
|
3
3
|
import { spawnSync } from 'node:child_process';
|
|
4
4
|
import { openBundle } from './strategic-handoff.mjs';
|
|
5
5
|
import { read, safe, ensure, ROOT, digest, project } from './strategic-handoff-io.mjs';
|
|
6
|
+
import { designTargets } from './strategic-handoff-design-targets.mjs';
|
|
6
7
|
import { parseContextContract } from './context-contract.mjs';
|
|
7
8
|
const present=x=>typeof x==='string'&&x.trim();
|
|
8
9
|
const list=x=>Array.isArray(x)&&x.length&&x.every(present);
|
|
@@ -14,6 +15,7 @@ const strategyBasis=value=>({
|
|
|
14
15
|
export async function verifyConsumption(data,{root=process.cwd(),sliceRef,consumer='tactical'}={}) {
|
|
15
16
|
project(root);
|
|
16
17
|
ensure(['tactical','frontend'].includes(consumer),'未知战略消费者');
|
|
18
|
+
if (data.schema_version === 2 && consumer === 'tactical') ensure(['domain-driven','layered-mvc'].includes(data.architecture?.family), '未知技术设计架构');
|
|
17
19
|
if (sliceRef) ensure(data.status === (consumer==='frontend'?'accepted':'approved'), consumer==='frontend'?'前端接收记录尚未 accepted':'切片只能消费 approved 战术合同');
|
|
18
20
|
const binding=data.strategic_handoff;
|
|
19
21
|
ensure(binding && present(binding.import_receipt_ref) && present(binding.context_reconciliation_ref),'缺少战略交接导入收据与目标对账引用');
|
|
@@ -42,9 +44,7 @@ export async function verifyConsumption(data,{root=process.cwd(),sliceRef,consum
|
|
|
42
44
|
const rows=new Map();for(const row of binding.rows){ensure(!rows.has(row.source_id),`重复承接: ${row.source_id}`);rows.set(row.source_id,row);}
|
|
43
45
|
const issues=[], blocked=new Set();let all=false;
|
|
44
46
|
const mark=(id,reason,row)=>{issues.push({source_id:id,reason});if(row?.dependency_status!=='known'||!list(row.dependent_slice_refs))all=true;else row.dependent_slice_refs.forEach(x=>blocked.add(x));};
|
|
45
|
-
const
|
|
46
|
-
const ids=new Set(catalogs.flatMap(k=>(data[k]||[]).flatMap(x=>Object.entries(x).filter(([k])=>k.endsWith('_id')).map(([,v])=>v))));
|
|
47
|
-
const seams=new Map((data.test_seams||[]).map(x=>[x.seam_id,x]));
|
|
47
|
+
const { ids, seams } = designTargets(data);
|
|
48
48
|
const cases=new Map((data.frontend_cases||[]).map(x=>[x.case_id,x]));
|
|
49
49
|
for(const[id,source]of known){
|
|
50
50
|
const row=rows.get(id);
|
|
@@ -77,7 +77,7 @@ export async function verifyConsumption(data,{root=process.cwd(),sliceRef,consum
|
|
|
77
77
|
all=true;issues.push({source_id:'strategic-design-basis',reason:'upstream-design-stale'});
|
|
78
78
|
}
|
|
79
79
|
const blockedHere=all||(sliceRef?blocked.has(sliceRef):issues.length>0);
|
|
80
|
-
return {result:blockedHere?'blocked':'verified',bundle_digest:current.manifest.bundle_digest,consumed_bundle_digest:receipt.bundle_digest,...(consumer==='frontend'?{frontend_acceptance_digest:digest(data)}:{tactical_digest:digest(data)}),scope:sliceRef||`whole-${consumer}-design`,coverage_complete:[...known.keys()].every(id=>rows.has(id)),block_all:all,blocked_slice_refs:[...blocked].sort(),issues};
|
|
80
|
+
return {result:blockedHere?'blocked':'verified',bundle_digest:current.manifest.bundle_digest,consumed_bundle_digest:receipt.bundle_digest,...(consumer==='frontend'?{frontend_acceptance_digest:digest(data)}:{tactical_digest:digest(data), ...(data.schema_version === 2 ? {technical_design_digest:digest(data)} : {})}),scope:sliceRef||`whole-${consumer}-design`,coverage_complete:[...known.keys()].every(id=>rows.has(id)),block_all:all,blocked_slice_refs:[...blocked].sort(),issues};
|
|
81
81
|
});
|
|
82
82
|
});
|
|
83
83
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ensure } from './strategic-handoff-io.mjs';
|
|
2
|
+
|
|
3
|
+
export function designTargets(data) {
|
|
4
|
+
const design = data.schema_version === 2 ? data.design : data;
|
|
5
|
+
const catalogs = data.schema_version === 2 && data.architecture?.family === 'layered-mvc'
|
|
6
|
+
? ['module_catalog', 'use_case_catalog', 'rule_catalog', 'state_transition_catalog', 'persistence_mapping', 'integration_catalog']
|
|
7
|
+
: ['aggregate_catalog', 'entity_catalog', 'value_object_catalog', 'behavior_catalog', 'invariant_catalog', 'state_transition_catalog', 'domain_event_catalog', 'gateway_catalog'];
|
|
8
|
+
const primaryKeys = { module_catalog: 'module_id', use_case_catalog: 'use_case_id', rule_catalog: 'rule_id', state_transition_catalog: 'transition_id', persistence_mapping: 'mapping_id', integration_catalog: 'integration_id', aggregate_catalog: 'aggregate_id', entity_catalog: 'entity_id', value_object_catalog: 'value_object_id', behavior_catalog: 'behavior_id', invariant_catalog: 'invariant_id', domain_event_catalog: 'event_id', gateway_catalog: 'gateway_id' };
|
|
9
|
+
const ids = catalogs.flatMap(key => (design?.[key] || []).map(item => item[primaryKeys[key]]).filter(Boolean));
|
|
10
|
+
ensure(new Set(ids).size === ids.length, '设计对象 ID 重复');
|
|
11
|
+
const seams = design?.test_seams || [];
|
|
12
|
+
ensure(new Set(seams.map(item => item.seam_id)).size === seams.length, '测试 seam ID 重复');
|
|
13
|
+
return { ids: new Set(ids), seams: new Map(seams.map(item => [item.seam_id, item])) };
|
|
14
|
+
}
|
|
15
|
+
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { readFileSync } from 'node:fs';
|
|
3
|
+
import { spawnSync } from 'node:child_process';
|
|
4
|
+
import { ROOT, read, safe, ensure, hash } from './strategic-handoff-io.mjs';
|
|
5
|
+
|
|
6
|
+
// The compiler's synchronous boundary reruns the design verifier against current files.
|
|
7
|
+
export function enforceTechnicalDesign(state = {}, { root = ROOT } = {}) {
|
|
8
|
+
const binding = state.technical_design;
|
|
9
|
+
const affected = (state.conditions || []).some(value => ['backend-technical-design-impact','tactical-domain','tactical-domain-impact','aggregate-impact','state-machine-impact','invariant-impact','consistency-impact','domain-event-impact','gateway-boundary-impact','persistence-mapping-impact'].includes(value));
|
|
10
|
+
if (!binding && !affected) return;
|
|
11
|
+
ensure(binding?.ref && binding?.digest && binding?.version, '缺少已批准技术设计绑定');
|
|
12
|
+
ensure(state.slice_id, '技术设计消费必须绑定切片 ID');
|
|
13
|
+
const file = safe(root, binding.ref);
|
|
14
|
+
ensure(hash(readFileSync(file)) === binding.digest, '技术设计绑定摘要漂移');
|
|
15
|
+
const data = read(file);
|
|
16
|
+
ensure(data.status === 'approved' && data.version === binding.version, '技术设计必须为批准且绑定版本');
|
|
17
|
+
const family = data.schema_version === 1 && binding.legacy_ddd === true ? 'domain-driven' : data.architecture?.family;
|
|
18
|
+
ensure(family && family === state.architecture_identity?.architecture_family, '技术设计与实现架构不匹配');
|
|
19
|
+
const args = [path.join(ROOT, '.agents/skills/yss-technical-design/scripts/validate-technical-design.mjs'), file, '--root', root, '--slice', state.slice_id];
|
|
20
|
+
if (binding.legacy_ddd === true) args.push('--legacy-ddd');
|
|
21
|
+
const verified = spawnSync(process.execPath, args, { cwd: root, encoding: 'utf8', timeout: 60000, maxBuffer: 2 * 1024 * 1024 });
|
|
22
|
+
ensure(verified.status === 0, `技术设计不可消费: ${verified.error?.message || verified.stderr}`);
|
|
23
|
+
}
|
|
@@ -7,9 +7,10 @@ const root=path.resolve(import.meta.dirname,'..');
|
|
|
7
7
|
const check=process.argv.includes('--check');
|
|
8
8
|
const targets=['submodules/yss-harness-design-agent','submodules/yss-harness-dev-agent','submodules/yss-harness-backend-agent','submodules/yss-harness-frontend-agent'];
|
|
9
9
|
const shared=['scripts/strategic-handoff','scripts/verify-strategic-handoff-consumption','scripts/verify-strategic-handoff-package-scenarios','scripts/verify-strategic-context-import','scripts/verify-strategic-context-import-scenarios','scripts/lib/context-contract.mjs','docs/process/strategic-handoff-package.md','docs/process/schemas/strategic-design-handoff.schema.json',...readdirSync(path.join(root,'scripts/lib')).filter(x=>x.startsWith('strategic-handoff-')||x==='strategic-handoff.mjs').map(x=>`scripts/lib/${x}`),...readdirSync(path.join(root,'docs/process/schemas')).filter(x=>x.startsWith('strategic-handoff-')).map(x=>`docs/process/schemas/${x}`),...readdirSync(path.join(root,'scripts/fixtures/strategic-handoff')).map(x=>`scripts/fixtures/strategic-handoff/${x}`)];
|
|
10
|
-
shared.push('scripts/instantiate-harness','scripts/
|
|
10
|
+
shared.push('scripts/instantiate-harness','scripts/backend-delivery','scripts/verify-frontend-delivery','scripts/lib/backend-delivery.mjs','scripts/lib/frontend-delivery.mjs','scripts/lib/frontend-delivery-boundary.mjs','docs/process/frontend-backend-delivery.md','docs/process/schemas/backend-delivery.schema.json','docs/process/schemas/backend-delivery-verification.schema.json','docs/process/schemas/frontend-delivery-acceptance.schema.json');
|
|
11
11
|
let differences=[];
|
|
12
|
-
|
|
12
|
+
// 专职执行范围由各模板持有;后端只消费 wire 校验器,不恢复原型构建技能。
|
|
13
|
+
function sync(source,dest){let bytes=readFileSync(source);if(dest.includes('/yss-harness-backend-agent/')){let content=bytes.toString();if(dest.endsWith('/scripts/lib/strategic-handoff.mjs'))content=content.replace('../../.agents/skills/yss-prototype-stage/scripts/visual-baseline-contract.mjs','./visual-baseline-contract.mjs');if(dest.endsWith('/scripts/fixtures/strategic-handoff/fixture.mjs'))content=content.replace('../../../.agents/skills/yss-prototype-stage/scripts/visual-baseline-contract.mjs','../../lib/visual-baseline-contract.mjs');bytes=Buffer.from(content);}if(!existsSync(dest)||!bytes.equals(readFileSync(dest))){differences.push(path.relative(root,dest));if(!check){mkdirSync(path.dirname(dest),{recursive:true});writeFileSync(dest,bytes);}}if(!check&&path.basename(path.dirname(dest))==='scripts'&&!path.extname(dest))chmodSync(dest,0o755);}
|
|
13
14
|
for(const kind of ['domain-strategy','stage-decision-package'])sync(path.join(root,`.agents/skills/yss-stage-decision/references/${kind}.schema.json`),path.join(root,`docs/process/schemas/strategic-handoff-${kind}.schema.json`));
|
|
14
15
|
for(const target of targets){
|
|
15
16
|
if(!existsSync(path.join(root,target,'.git')))continue;
|
|
@@ -9,7 +9,7 @@ import { fixture, context } from './fixtures/strategic-handoff/fixture.mjs';
|
|
|
9
9
|
import { exportBundle, openBundle, importBundle } from './lib/strategic-handoff.mjs';
|
|
10
10
|
import { read, json, hash, digest } from './lib/strategic-handoff-io.mjs';
|
|
11
11
|
import { parseContextContract } from './lib/context-contract.mjs';
|
|
12
|
-
const setup=async t=>{const base=mkdtempSync(path.join(tmpdir(),'handoff-test-'));t.after(()=>rmSync(base,{recursive:true,force:true}));const source=path.join(base,'source');mkdirSync(source);return{base,source,...await fixture(source)};};
|
|
12
|
+
const setup=async t=>{const base=mkdtempSync(path.join(tmpdir(),'handoff-test-'));t.after(()=>rmSync(base,{recursive:true,force:true}));const source=path.join(base,'source');mkdirSync(source);return{base,source,...await fixture(source,{technicalDesign:true})};};
|
|
13
13
|
function advanceStrategy(f,version='v2') {
|
|
14
14
|
f.handoff.handoff_version=version;
|
|
15
15
|
f.strategy.domain_version=version;
|
|
@@ -79,6 +79,12 @@ test('受控延期只阻断依赖切片;未知依赖扩大阻断;目标未
|
|
|
79
79
|
writeFileSync(path.join(target,'reconciliation.yaml'),json(record));
|
|
80
80
|
for(const row of tactical.strategic_handoff.rows)Object.assign(row,{disposition:'implemented',tactical_refs:['behavior.submit'],test_seam_refs:['test-seam.submit'],scenario_tests:[{outcome:'success',seam_ref:'test-seam.submit'},{outcome:'failure',seam_ref:'test-seam.submit'}],evidence_refs:['CONTEXT.md'],dependency_status:'known',dependent_slice_refs:['slice.submit']});
|
|
81
81
|
assert.equal((await verifyConsumption(tactical,{root:target})).result,'verified');
|
|
82
|
+
const mvc={schema_version:2,status:'approved',architecture:{family:'layered-mvc'},strategic_handoff:structuredClone(tactical.strategic_handoff),design:{use_case_catalog:[{use_case_id:'use-case.submit'}],test_seams:[{seam_id:'test-seam.submit',subject_ref:'use-case.submit'}]}};
|
|
83
|
+
for(const row of mvc.strategic_handoff.rows)row.tactical_refs=['use-case.submit'];
|
|
84
|
+
assert.equal((await verifyConsumption(mvc,{root:target})).result,'verified');
|
|
85
|
+
mvc.strategic_handoff.rows[0].tactical_refs=['aggregate.fake'];
|
|
86
|
+
await assert.rejects(()=>verifyConsumption(mvc,{root:target}),/落点悬空/);
|
|
87
|
+
|
|
82
88
|
const row=tactical.strategic_handoff.rows[0];Object.assign(row,{disposition:'deferred',reason:'分批实现',risk:'不能提交',owner:'需求负责人',followup_ticket_ref:'ticket.followup',verification_plan:'提交测试',target_version:'v2'});
|
|
83
89
|
assert.equal((await verifyConsumption(tactical,{root:target,sliceRef:'slice.submit'})).result,'blocked');
|
|
84
90
|
assert.equal((await verifyConsumption(tactical,{root:target,sliceRef:'slice.other'})).result,'verified');
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"revision": "c4d958f18cc947cb91cbe1bd48783fa4601cc18f"
|
|
22
22
|
},
|
|
23
23
|
"iloveZzz/yss-harness-design-agent": {
|
|
24
|
-
"revision": "
|
|
24
|
+
"revision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab"
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"skills": {
|
|
@@ -559,7 +559,7 @@
|
|
|
559
559
|
"sourceType": "git-submodule",
|
|
560
560
|
"skillPath": ".agents/skills/prototype-review/SKILL.md",
|
|
561
561
|
"effectiveHash": "51021f119697dbff644d70c3d6ba3314147c47f412c6f56e4b5540ea3bf554a1",
|
|
562
|
-
"sourceRevision": "
|
|
562
|
+
"sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
|
|
563
563
|
"upstreamHash": "2e77b3093a758bb692fb3bda453c5c020d0523f875975e17e2731365f67432e1",
|
|
564
564
|
"adaptationRef": "docs/agents/strategic-design-skills-integration.md",
|
|
565
565
|
"targets": [
|
|
@@ -824,7 +824,7 @@
|
|
|
824
824
|
"sourceType": "git-submodule",
|
|
825
825
|
"skillPath": ".agents/skills/yss-antd-design/SKILL.md",
|
|
826
826
|
"effectiveHash": "917099caa9b76ca3cfd1d0f81f61b28111c1c54ed93e92891f81012dcd0662e2",
|
|
827
|
-
"sourceRevision": "
|
|
827
|
+
"sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
|
|
828
828
|
"upstreamHash": "08ce99d45586d5ea19e25fdd9e9a6ede16e66f18992b70b87e0cd23f92343b16",
|
|
829
829
|
"adaptationRef": "docs/agents/strategic-design-skills-integration.md",
|
|
830
830
|
"targets": [
|
|
@@ -842,7 +842,7 @@
|
|
|
842
842
|
"sourceType": "git-submodule",
|
|
843
843
|
"skillPath": ".agents/skills/yss-antdv-next-design/SKILL.md",
|
|
844
844
|
"effectiveHash": "8c55e3a815ace34fbf591e931a58970b3d58cb657e00432ca6c72938d307563b",
|
|
845
|
-
"sourceRevision": "
|
|
845
|
+
"sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
|
|
846
846
|
"upstreamHash": "2942ed52dd58a38e51f09eb11254809334aeaed08f21cd081f09f35e6647a68c",
|
|
847
847
|
"adaptationRef": "docs/agents/strategic-design-skills-integration.md",
|
|
848
848
|
"targets": [
|
|
@@ -953,7 +953,7 @@
|
|
|
953
953
|
"sourceType": "git-submodule",
|
|
954
954
|
"skillPath": ".agents/skills/yss-design-system/SKILL.md",
|
|
955
955
|
"effectiveHash": "e69597b8b6a5ce4de5bd40f67630443b8176202f6b028b2ce146a2a1d062816f",
|
|
956
|
-
"sourceRevision": "
|
|
956
|
+
"sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
|
|
957
957
|
"upstreamHash": "90aaf06b2514353152464a4d032076fa9d5ef56272d8ad526f5544f3c22a2b00",
|
|
958
958
|
"adaptationRef": "docs/agents/strategic-design-skills-integration.md",
|
|
959
959
|
"targets": [
|
|
@@ -985,7 +985,7 @@
|
|
|
985
985
|
"source": "project",
|
|
986
986
|
"sourceType": "local",
|
|
987
987
|
"skillPath": ".agents/skills/yss-domain/SKILL.md",
|
|
988
|
-
"effectiveHash": "
|
|
988
|
+
"effectiveHash": "e682e141ac6cdb9d97296f270e314a6c7d00ebf574f8a9aaba557dcd8f6553b7",
|
|
989
989
|
"targets": [
|
|
990
990
|
".agents/skills",
|
|
991
991
|
".claude/skills",
|
|
@@ -1108,7 +1108,7 @@
|
|
|
1108
1108
|
"source": "project",
|
|
1109
1109
|
"sourceType": "local",
|
|
1110
1110
|
"skillPath": ".agents/skills/yss-implementation-contract-compiler/SKILL.md",
|
|
1111
|
-
"effectiveHash": "
|
|
1111
|
+
"effectiveHash": "4f9ec75e4484bc2794ea057037890d2bcb96512c8c64bef9d9fdae7c66abe46d",
|
|
1112
1112
|
"targets": [
|
|
1113
1113
|
".agents/skills",
|
|
1114
1114
|
".claude/skills",
|
|
@@ -1149,6 +1149,21 @@
|
|
|
1149
1149
|
".trae/skills"
|
|
1150
1150
|
]
|
|
1151
1151
|
},
|
|
1152
|
+
"yss-mvc-design": {
|
|
1153
|
+
"source": "project",
|
|
1154
|
+
"sourceType": "local",
|
|
1155
|
+
"skillPath": ".agents/skills/yss-mvc-design/SKILL.md",
|
|
1156
|
+
"effectiveHash": "b3deae27723c3a0e9e32c8f5b40fb1295d082a31ccea3f4d9a190b47a704efd3",
|
|
1157
|
+
"targets": [
|
|
1158
|
+
".agents/skills",
|
|
1159
|
+
".claude/skills",
|
|
1160
|
+
".codex/skills",
|
|
1161
|
+
".cursor/skills",
|
|
1162
|
+
".pi/skills",
|
|
1163
|
+
".qoder/skills",
|
|
1164
|
+
".trae/skills"
|
|
1165
|
+
]
|
|
1166
|
+
},
|
|
1152
1167
|
"yss-mvc-scaffold-generator": {
|
|
1153
1168
|
"source": "project",
|
|
1154
1169
|
"sourceType": "local",
|
|
@@ -1213,7 +1228,7 @@
|
|
|
1213
1228
|
"source": "project",
|
|
1214
1229
|
"sourceType": "local",
|
|
1215
1230
|
"skillPath": ".agents/skills/yss-product-lifecycle/SKILL.md",
|
|
1216
|
-
"effectiveHash": "
|
|
1231
|
+
"effectiveHash": "c262bd69e978eee24b49526043b2439c30ce006f4fbbcb56e881c903ba6f3d51",
|
|
1217
1232
|
"targets": [
|
|
1218
1233
|
".agents/skills",
|
|
1219
1234
|
".claude/skills",
|
|
@@ -1229,7 +1244,7 @@
|
|
|
1229
1244
|
"sourceType": "git-submodule",
|
|
1230
1245
|
"skillPath": ".agents/skills/yss-prototype-stage/SKILL.md",
|
|
1231
1246
|
"effectiveHash": "0ecf3125a73d15e4c9b6b665f92535180df82ccb2255fa863ec59f3ff5d460aa",
|
|
1232
|
-
"sourceRevision": "
|
|
1247
|
+
"sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
|
|
1233
1248
|
"upstreamHash": "e8f2f3a507da6bf7be0582e4a4dd9659381da8e291755070698a1f51a4e33808",
|
|
1234
1249
|
"adaptationRef": "docs/agents/strategic-design-skills-integration.md",
|
|
1235
1250
|
"targets": [
|
|
@@ -1325,7 +1340,7 @@
|
|
|
1325
1340
|
"sourceType": "git-submodule",
|
|
1326
1341
|
"skillPath": ".agents/skills/yss-stage-decision/SKILL.md",
|
|
1327
1342
|
"effectiveHash": "63e222ec2bc572c8d66fc52143ba3862650d243f57e1e9c71214b533eba37c23",
|
|
1328
|
-
"sourceRevision": "
|
|
1343
|
+
"sourceRevision": "8a67e0f5a56aa5085d18c2b42bb540c8f36c2fab",
|
|
1329
1344
|
"upstreamHash": "1eadf230f0e17bf6d209c1df1249acef3520ab29c26a80c476a2a557a224c10a",
|
|
1330
1345
|
"adaptationRef": "docs/agents/strategic-design-skills-integration.md",
|
|
1331
1346
|
"targets": [
|
|
@@ -1342,7 +1357,22 @@
|
|
|
1342
1357
|
"source": "project",
|
|
1343
1358
|
"sourceType": "local",
|
|
1344
1359
|
"skillPath": ".agents/skills/yss-tactical-design/SKILL.md",
|
|
1345
|
-
"effectiveHash": "
|
|
1360
|
+
"effectiveHash": "2ffb26709fd68184e0fe8f724318dc748fc479dcf52af236fe63f49a17540bfa",
|
|
1361
|
+
"targets": [
|
|
1362
|
+
".agents/skills",
|
|
1363
|
+
".claude/skills",
|
|
1364
|
+
".codex/skills",
|
|
1365
|
+
".cursor/skills",
|
|
1366
|
+
".pi/skills",
|
|
1367
|
+
".qoder/skills",
|
|
1368
|
+
".trae/skills"
|
|
1369
|
+
]
|
|
1370
|
+
},
|
|
1371
|
+
"yss-technical-design": {
|
|
1372
|
+
"source": "project",
|
|
1373
|
+
"sourceType": "local",
|
|
1374
|
+
"skillPath": ".agents/skills/yss-technical-design/SKILL.md",
|
|
1375
|
+
"effectiveHash": "a4226303571483b115ef7134f9615440ce8b7d39f209be39e1bc16152e080a9f",
|
|
1346
1376
|
"targets": [
|
|
1347
1377
|
".agents/skills",
|
|
1348
1378
|
".claude/skills",
|
package/template.snapshot.json
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
"templateName": "yss-spec-project-template",
|
|
4
4
|
"templateSource": "github:iloveZzz/yss-spec-project-template",
|
|
5
5
|
"templateRepository": "https://github.com/iloveZzz/yss-spec-project-template.git",
|
|
6
|
-
"requestedRef": "
|
|
7
|
-
"templateCommit": "
|
|
6
|
+
"requestedRef": "c3d09280872dcfc905c86ac6f40e4e32e610e220",
|
|
7
|
+
"templateCommit": "c3d09280872dcfc905c86ac6f40e4e32e610e220",
|
|
8
8
|
"manifestHash": "f7520dfdfa388b19ea47cb893c2daab8936019783aa84589f13921e459702280",
|
|
9
9
|
"encodedPaths": {
|
|
10
10
|
".codex/skills/data-analytics/.gitignore": ".codex/skills/data-analytics/__yss_dotfile__.gitignore",
|
|
@@ -12,6 +12,6 @@
|
|
|
12
12
|
".codex/skills/product-design/templates/prototype/.npmrc": ".codex/skills/product-design/templates/prototype/__yss_dotfile__.npmrc",
|
|
13
13
|
".gitignore": "__yss_dotfile__.gitignore"
|
|
14
14
|
},
|
|
15
|
-
"snapshotHash": "
|
|
16
|
-
"generatedAt": "2026-09-
|
|
15
|
+
"snapshotHash": "80175edec720607595f99f1bab5d0a8480b1644537be8ae71623de01acb0a787",
|
|
16
|
+
"generatedAt": "2026-09-08T11:40:21.647Z"
|
|
17
17
|
}
|