create-yss-spec 3.1.0 → 3.1.3
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 +117 -91
- package/bin/create-yss-spec.js +11 -3
- package/package.json +9 -2
- package/src/api/_sync-service.js +191 -0
- package/src/api/index.js +22 -0
- package/src/api/project-diff.js +9 -0
- package/src/api/project-doctor.js +10 -0
- package/src/api/template-apply.js +10 -0
- package/src/api/template-plan.js +9 -0
- package/src/cli/args.js +60 -0
- package/src/cli/error-output.js +52 -0
- package/src/cli/flags.js +9 -0
- package/src/cli/help.js +95 -0
- package/src/cli/index.js +82 -0
- package/src/cli/plan-output.js +61 -0
- package/src/cli/prompts.js +91 -0
- package/src/cli/router.js +41 -0
- package/src/cli.js +5 -2253
- package/src/commands/attach.js +280 -0
- package/src/commands/diff.js +23 -0
- package/src/commands/doctor.js +417 -0
- package/src/commands/init.js +193 -0
- package/src/commands/sync.js +146 -0
- package/src/commands/update.js +14 -0
- package/src/contracts/apply-result-v1.json +45 -0
- package/src/contracts/customization-policy-v1.json +28 -0
- package/src/contracts/doctor-report-v1.json +29 -0
- package/src/contracts/error-envelope-v1.json +24 -0
- package/src/contracts/generator-policy-v1.json +24 -0
- package/src/contracts/ownership-policy-v1.json +40 -0
- package/src/contracts/plan-schema-v1.json +115 -0
- package/src/family-identity.js +365 -0
- package/src/family-runtime.js +23 -0
- package/src/filesystem/apply-plan.js +44 -0
- package/src/filesystem/copy-path.js +28 -0
- package/src/filesystem/path-utils.js +67 -0
- package/src/filesystem/transaction-runner.js +41 -0
- package/src/filesystem/transaction.js +153 -0
- package/src/git/submodule.js +115 -0
- package/src/git/worktree.js +69 -0
- package/src/template/attach-planner-runtime.js +51 -0
- package/src/template/attach-planner.js +160 -0
- package/src/template/instance-runtime.js +463 -0
- package/src/template/lifecycle-metadata.js +99 -0
- package/src/template/lifecycle-policy.js +129 -0
- package/src/template/lifecycle-runtime.js +90 -0
- package/src/template/migration-planner.js +95 -0
- package/src/template/migration-runtime.js +247 -0
- package/src/template/ownership-metadata.js +79 -0
- package/src/template/ownership-policy.js +149 -0
- package/src/template/ownership-runtime.js +109 -0
- package/src/template/plan-schema.js +36 -0
- package/src/template/sync-planner-runtime.js +57 -0
- package/src/template/sync-planner.js +206 -0
- package/src/template/verification-runtime.js +154 -0
- package/src/validation/identity.js +41 -0
- package/src/validation/metadata.js +105 -0
- package/src/validation/security.js +67 -0
- package/src/validation/snapshot.js +47 -0
- package/template/.agents/skills/.strategic-design-skills-manifest.json +1 -1
- package/template/.agents/skills/yss-frontend-scaffold-generator/SKILL.md +2 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +6 -0
- package/template/.agents/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +2 -0
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +2 -0
- package/template/.agents/skills/yss-ui/SKILL.md +2 -0
- package/template/.claude/skills/yss-frontend-scaffold-generator/SKILL.md +2 -0
- package/template/.claude/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.claude/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +6 -0
- package/template/.claude/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +2 -0
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +2 -0
- package/template/.claude/skills/yss-ui/SKILL.md +2 -0
- package/template/.codex/skills/yss-frontend-scaffold-generator/SKILL.md +2 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +6 -0
- package/template/.codex/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +2 -0
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +2 -0
- package/template/.codex/skills/yss-ui/SKILL.md +2 -0
- package/template/.cursor/skills/yss-frontend-scaffold-generator/SKILL.md +2 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +6 -0
- package/template/.cursor/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +2 -0
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +2 -0
- package/template/.cursor/skills/yss-ui/SKILL.md +2 -0
- package/template/.pi/skills/yss-frontend-scaffold-generator/SKILL.md +2 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +6 -0
- package/template/.pi/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +2 -0
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +2 -0
- package/template/.pi/skills/yss-ui/SKILL.md +2 -0
- package/template/.qoder/skills/yss-frontend-scaffold-generator/SKILL.md +2 -0
- package/template/.qoder/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.qoder/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +6 -0
- package/template/.qoder/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +2 -0
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +2 -0
- package/template/.qoder/skills/yss-ui/SKILL.md +2 -0
- package/template/.trae/skills/yss-frontend-scaffold-generator/SKILL.md +2 -0
- package/template/.trae/skills/yss-implementation-contract-compiler/SKILL.md +2 -0
- package/template/.trae/skills/yss-implementation-contract-compiler/references/compiler-contract.yaml +6 -0
- package/template/.trae/skills/yss-implementation-contract-compiler/references/slice-implementation-contract.md +2 -0
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +2 -0
- package/template/.trae/skills/yss-ui/SKILL.md +2 -0
- package/template/CONTEXT.md +2 -0
- package/template/README.md +4 -0
- package/template/docs/agents/digital-human-roles.yaml +1 -0
- package/template/docs/process/frontend-backend-delivery.md +72 -0
- package/template/docs/process/implementation-repo-integration.md +2 -0
- package/template/docs/process/lifecycle-artifact-map.md +1 -0
- package/template/docs/process/lifecycle-registry-baseline.json +2 -1
- package/template/docs/process/lifecycle-registry.yaml +5 -0
- package/template/docs/process/schemas/backend-delivery-verification.schema.json +113 -0
- package/template/docs/process/schemas/backend-delivery.schema.json +301 -0
- package/template/docs/process/schemas/digital-human-task-package.schema.json +8 -0
- package/template/docs/process/schemas/frontend-delivery-acceptance.schema.json +200 -0
- package/template/docs/process/schemas/frontend-implementation-evidence.schema.json +3 -0
- package/template/docs/process/template-verification-profiles.yaml +6 -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 +20 -206
- package/template/docs/user-guide//347/224/250/346/210/267/346/211/213/345/206/214.md +63 -963
- package/template/docs/user-guide//347/224/250/346/210/267/346/211/213/345/206/214/347/264/242/345/274/225.md +11 -14
- package/template/docs/user-guide//350/256/276/345/244/207/345/200/237/347/224/250/350/264/257/347/251/277/346/241/210/344/276/213.md +127 -0
- package/template/scripts/backend-delivery +14 -0
- package/template/scripts/fixtures/backend-delivery/revision-server.mjs +11 -0
- package/template/scripts/instantiate-harness +69 -0
- package/template/scripts/lib/backend-delivery.mjs +164 -0
- package/template/scripts/lib/frontend-delivery-boundary.mjs +49 -0
- package/template/scripts/lib/frontend-delivery.mjs +73 -0
- package/template/scripts/lib/harness-execution-scope.mjs +52 -0
- package/template/scripts/lib/implementation-contract-compiler.mjs +12 -2
- package/template/scripts/lib/lifecycle-transition.mjs +7 -0
- package/template/scripts/lib/strategic-handoff-consumption.mjs +14 -7
- package/template/scripts/lib/strategic-handoff.mjs +1 -1
- package/template/scripts/lib/task-package.mjs +7 -0
- package/template/scripts/sync-strategic-handoff-tools +3 -1
- package/template/scripts/verify-frontend-delivery +9 -0
- package/template/scripts/verify-frontend-delivery-scenarios +131 -0
- package/template/scripts/verify-frontend-implementation-evidence +2 -0
- package/template/skills-lock.json +11 -11
- package/template.manifest.json +43 -1
- package/template.snapshot.json +5 -5
|
@@ -7,6 +7,14 @@
|
|
|
7
7
|
"required": ["schema_version", "task_id", "work_unit_id", "actor_id", "role_id", "runtime_id", "execution_state", "workflow_status", "skill_source", "contract", "inputs", "objective", "allowed_write_paths", "forbidden_actions", "expected_outputs", "expected_evidence_files", "verification_commands", "verification_results", "downstream_consumers", "convergence"],
|
|
8
8
|
"properties": {
|
|
9
9
|
"schema_version": { "const": 1 },
|
|
10
|
+
"frontend_delivery": {
|
|
11
|
+
"type": "object", "additionalProperties": false, "required": ["acceptance_ref"],
|
|
12
|
+
"properties": {
|
|
13
|
+
"acceptance_ref": { "type": "string", "minLength": 1 },
|
|
14
|
+
"digest": { "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" }
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"slice_id": { "type": "string", "minLength": 1 },
|
|
10
18
|
"task_id": { "type": "string", "minLength": 1, "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._-]*$" },
|
|
11
19
|
"work_unit_id": { "type": "string", "minLength": 1, "pattern": "^work-unit\\.[a-z0-9][a-z0-9-]*$" },
|
|
12
20
|
"actor_id": { "type": "string", "minLength": 1, "pattern": "^[a-zA-Z0-9][a-zA-Z0-9._:-]*$" },
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"type": "object",
|
|
4
|
+
"additionalProperties": false,
|
|
5
|
+
"properties": {
|
|
6
|
+
"schema_version": {
|
|
7
|
+
"const": 1
|
|
8
|
+
},
|
|
9
|
+
"status": {
|
|
10
|
+
"const": "accepted"
|
|
11
|
+
},
|
|
12
|
+
"slice_id": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"minLength": 1
|
|
15
|
+
},
|
|
16
|
+
"backend_delivery": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"additionalProperties": false,
|
|
19
|
+
"properties": {
|
|
20
|
+
"import_receipt_ref": {
|
|
21
|
+
"type": "string",
|
|
22
|
+
"minLength": 1
|
|
23
|
+
},
|
|
24
|
+
"bundle_digest": {
|
|
25
|
+
"type": "string",
|
|
26
|
+
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"required": [
|
|
30
|
+
"import_receipt_ref",
|
|
31
|
+
"bundle_digest"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"strategic_handoff": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"additionalProperties": false,
|
|
37
|
+
"properties": {
|
|
38
|
+
"import_receipt_ref": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"minLength": 1
|
|
41
|
+
},
|
|
42
|
+
"bundle_digest": {
|
|
43
|
+
"type": "string",
|
|
44
|
+
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
45
|
+
},
|
|
46
|
+
"context_reconciliation_ref": {
|
|
47
|
+
"type": "string",
|
|
48
|
+
"minLength": 1
|
|
49
|
+
},
|
|
50
|
+
"rows": {
|
|
51
|
+
"type": "array",
|
|
52
|
+
"items": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"required": [
|
|
55
|
+
"source_id",
|
|
56
|
+
"source_digest",
|
|
57
|
+
"disposition",
|
|
58
|
+
"dependency_status",
|
|
59
|
+
"dependent_slice_refs",
|
|
60
|
+
"evidence_refs"
|
|
61
|
+
],
|
|
62
|
+
"properties": {
|
|
63
|
+
"source_id": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"minLength": 1
|
|
66
|
+
},
|
|
67
|
+
"source_digest": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
70
|
+
},
|
|
71
|
+
"disposition": {
|
|
72
|
+
"enum": [
|
|
73
|
+
"mapped",
|
|
74
|
+
"pending",
|
|
75
|
+
"conflict",
|
|
76
|
+
"deferred",
|
|
77
|
+
"not-applicable"
|
|
78
|
+
]
|
|
79
|
+
},
|
|
80
|
+
"dependency_status": {
|
|
81
|
+
"enum": [
|
|
82
|
+
"known",
|
|
83
|
+
"unknown"
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
"dependent_slice_refs": {
|
|
87
|
+
"type": "array",
|
|
88
|
+
"items": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"minLength": 1
|
|
91
|
+
},
|
|
92
|
+
"minItems": 0,
|
|
93
|
+
"uniqueItems": true
|
|
94
|
+
},
|
|
95
|
+
"evidence_refs": {
|
|
96
|
+
"type": "array",
|
|
97
|
+
"items": {
|
|
98
|
+
"type": "string",
|
|
99
|
+
"minLength": 1
|
|
100
|
+
},
|
|
101
|
+
"minItems": 0,
|
|
102
|
+
"uniqueItems": true
|
|
103
|
+
},
|
|
104
|
+
"frontend_case_refs": {
|
|
105
|
+
"type": "array",
|
|
106
|
+
"items": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"minLength": 1
|
|
109
|
+
},
|
|
110
|
+
"minItems": 0,
|
|
111
|
+
"uniqueItems": true
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
"minItems": 1,
|
|
116
|
+
"uniqueItems": true
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
"required": [
|
|
120
|
+
"import_receipt_ref",
|
|
121
|
+
"bundle_digest",
|
|
122
|
+
"context_reconciliation_ref",
|
|
123
|
+
"rows"
|
|
124
|
+
]
|
|
125
|
+
},
|
|
126
|
+
"frontend_cases": {
|
|
127
|
+
"type": "array",
|
|
128
|
+
"items": {
|
|
129
|
+
"type": "object",
|
|
130
|
+
"additionalProperties": false,
|
|
131
|
+
"properties": {
|
|
132
|
+
"case_id": {
|
|
133
|
+
"type": "string",
|
|
134
|
+
"minLength": 1
|
|
135
|
+
},
|
|
136
|
+
"source_ids": {
|
|
137
|
+
"type": "array",
|
|
138
|
+
"items": {
|
|
139
|
+
"type": "string",
|
|
140
|
+
"minLength": 1
|
|
141
|
+
},
|
|
142
|
+
"minItems": 1,
|
|
143
|
+
"uniqueItems": true
|
|
144
|
+
},
|
|
145
|
+
"outcome": {
|
|
146
|
+
"enum": [
|
|
147
|
+
"success",
|
|
148
|
+
"failure"
|
|
149
|
+
]
|
|
150
|
+
},
|
|
151
|
+
"operation_ids": {
|
|
152
|
+
"type": "array",
|
|
153
|
+
"items": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"minLength": 1
|
|
156
|
+
},
|
|
157
|
+
"minItems": 1,
|
|
158
|
+
"uniqueItems": true
|
|
159
|
+
},
|
|
160
|
+
"visual_case_ids": {
|
|
161
|
+
"type": "array",
|
|
162
|
+
"items": {
|
|
163
|
+
"type": "string",
|
|
164
|
+
"minLength": 1
|
|
165
|
+
},
|
|
166
|
+
"minItems": 1,
|
|
167
|
+
"uniqueItems": true
|
|
168
|
+
},
|
|
169
|
+
"evidence_ref": {
|
|
170
|
+
"type": "string",
|
|
171
|
+
"minLength": 1
|
|
172
|
+
},
|
|
173
|
+
"evidence_digest": {
|
|
174
|
+
"type": "string",
|
|
175
|
+
"pattern": "^sha256:[a-f0-9]{64}$"
|
|
176
|
+
}
|
|
177
|
+
},
|
|
178
|
+
"required": [
|
|
179
|
+
"case_id",
|
|
180
|
+
"source_ids",
|
|
181
|
+
"outcome",
|
|
182
|
+
"operation_ids",
|
|
183
|
+
"visual_case_ids",
|
|
184
|
+
"evidence_ref",
|
|
185
|
+
"evidence_digest"
|
|
186
|
+
]
|
|
187
|
+
},
|
|
188
|
+
"minItems": 1,
|
|
189
|
+
"uniqueItems": true
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
"required": [
|
|
193
|
+
"schema_version",
|
|
194
|
+
"status",
|
|
195
|
+
"slice_id",
|
|
196
|
+
"backend_delivery",
|
|
197
|
+
"strategic_handoff",
|
|
198
|
+
"frontend_cases"
|
|
199
|
+
]
|
|
200
|
+
}
|
|
@@ -6,6 +6,9 @@
|
|
|
6
6
|
"additionalProperties": false,
|
|
7
7
|
"required": ["schema_version", "kind", "template", "status", "prototype_ref", "spec_ref", "visual_baseline", "route_and_page_inventory", "pnpm_commands"],
|
|
8
8
|
"properties": {
|
|
9
|
+
"frontend_delivery": {"type":"object","additionalProperties":false,"required":["acceptance_ref","digest"],"properties":{"acceptance_ref":{"type":"string","minLength":1},"digest":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"}}},
|
|
10
|
+
"slice_id": {"type":"string","minLength":1},
|
|
11
|
+
"slice_contract_ref": {"type":"string","minLength":1},
|
|
9
12
|
"schema_version": {"const": 2},
|
|
10
13
|
"kind": {"enum": ["plan", "verification"]},
|
|
11
14
|
"template": {"type": "boolean"},
|
|
@@ -191,6 +191,8 @@ syntax_files:
|
|
|
191
191
|
- scripts/verify-maintenance-review-workflow-scenarios
|
|
192
192
|
- scripts/verify-template-cache-scenarios
|
|
193
193
|
routing:
|
|
194
|
+
- 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
|
+
groups: [frontend-delivery]
|
|
194
196
|
- 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"]
|
|
195
197
|
groups: [lifecycle, collaboration]
|
|
196
198
|
- patterns: ["scripts/*strategic-handoff*", "scripts/lib/strategic-handoff*", "scripts/fixtures/strategic-handoff/**", "docs/process/strategic-handoff-package.md", "docs/process/schemas/strategic-handoff-*"]
|
|
@@ -228,6 +230,10 @@ routing:
|
|
|
228
230
|
- patterns: ["scripts/**"]
|
|
229
231
|
groups: [hygiene]
|
|
230
232
|
groups:
|
|
233
|
+
frontend-delivery:
|
|
234
|
+
commands:
|
|
235
|
+
- { run: "scripts/verify-frontend-delivery-scenarios" }
|
|
236
|
+
- { run: "node .template-source/scripts/verify-delivery-harness-distribution.mjs", when: template-source }
|
|
231
237
|
strategic-handoff-package:
|
|
232
238
|
commands:
|
|
233
239
|
- { run: "node --check scripts/lib/strategic-handoff.mjs" }
|
|
@@ -1,220 +1,34 @@
|
|
|
1
1
|
# 战术设计子项目用户手册
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
本入口保留给既有读者。Tactical Design 把已批准业务规则映射为聚合、状态、不变量、一致性边界和测试 seam;它不是新的模板家族,不代替 API Freeze 或 Slice Contract 批准。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## 输入与开始
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
- 产品经理、业务专家:想知道业务规则在技术设计中如何被保护。
|
|
10
|
-
- 架构师、开发者:需要把业务边界细化为聚合、状态和一致性规则。
|
|
11
|
-
- 测试人员:需要找到可以独立验证的领域行为。
|
|
12
|
-
- AI Agent 操作者:需要知道何时让 Agent 起草、何时要求人工确认、何时必须停下。
|
|
13
|
-
|
|
14
|
-
不懂代码也可以读完“业务读者篇”;“研发接手篇”会出现少量工程术语,但每个术语都会先用白话解释。
|
|
15
|
-
|
|
16
|
-
## 看完能做什么
|
|
17
|
-
|
|
18
|
-
1. 说清 Strategic Design 和 Tactical Design 的分工。
|
|
19
|
-
2. 判断轻量 `Tactical DDD Check` 是否足够,还是需要独立的 Tactical Design 产物。
|
|
20
|
-
3. 把一个业务场景拆成聚合、Entity、Value Object、领域服务和领域事件。
|
|
21
|
-
4. 说明不变量、一致性边界、Repository / Gateway 和 API 的隔离方式。
|
|
22
|
-
5. 形成可评审、可测试、可交给实现团队的战术设计结果。
|
|
23
|
-
|
|
24
|
-
## 先记住:它解决什么问题
|
|
25
|
-
|
|
26
|
-
Strategic Design 解决“业务应该怎样分工和划边界”;Tactical Design 解决“在一个边界里面,具体由哪些对象协作,以及规则如何不被破坏”。
|
|
27
|
-
|
|
28
|
-
| 工作 | 大白话 | 典型结果 |
|
|
29
|
-
|---|---|---|
|
|
30
|
-
| Strategic Design | 决定业务地图和上下文边界 | 子域、限界上下文、统一语言、Context Map |
|
|
31
|
-
| Tactical Design | 决定一个上下文内部怎样组织规则 | 聚合、状态机、不变量、领域服务、领域事件 |
|
|
32
|
-
| 工程实现 | 把设计变成可运行的软件 | OpenAPI、代码、数据映射、测试和发布 |
|
|
33
|
-
|
|
34
|
-
本手册的终点是“战术设计已评审并可交给实现”;OpenAPI Freeze、代码和发布仍由下游研发流程负责。
|
|
35
|
-
|
|
36
|
-
## 开始前:确认输入和仓库身份
|
|
37
|
-
|
|
38
|
-
### 输入必须来自已确认的交接包
|
|
39
|
-
|
|
40
|
-
开始前应能找到批准且版本当前的 `Strategic Design Handoff`,其中至少包括:
|
|
41
|
-
|
|
42
|
-
- 已确认的业务术语和上下文边界;
|
|
43
|
-
- 关键场景、业务不变量和领域事件候选;
|
|
44
|
-
- Spec、原型或业务级 Ticket 的版本引用;
|
|
45
|
-
- 交给 Tactical Design 裁决的问题,例如聚合边界、状态、一致性和持久化;
|
|
46
|
-
- 未决问题、责任人和后续验证计划。
|
|
47
|
-
- `source_context_snapshot` 与包含术语定义的 `context_delta`,以及“目标仓在 Tactical Design 前完成 `context_reconciliation`”的约束。
|
|
48
|
-
|
|
49
|
-
先把 `context_delta` 对账到当前项目根目录唯一 `CONTEXT.md`,生成目标侧 reconciliation,并运行 `scripts/verify-strategic-context-import --root . --reconciliation <record> <handoff>`。如果交接包缺失、仍为 v1、过期、摘要漂移或与当前 Spec / 目标词汇不一致,先回到上游处理,不要凭经验补写模型。
|
|
50
|
-
|
|
51
|
-
### 确认项目实例
|
|
52
|
-
|
|
53
|
-
打开项目根目录的 `yss-project.yaml`:
|
|
54
|
-
|
|
55
|
-
| 配置 | 含义 | 处理方式 |
|
|
56
|
-
|---|---|---|
|
|
57
|
-
| `repository_mode: project-instance` | 真实业务项目 | 可以记录真实战术设计 |
|
|
58
|
-
| `repository_mode: template-source` | 模板源 | 只能维护通用模板,不能写具体产品模型 |
|
|
59
|
-
| 文件缺失或值不合法 | 身份不清楚 | 先停止并做迁移检查 |
|
|
60
|
-
|
|
61
|
-
在项目实例中,先让 Agent 只读分诊:
|
|
62
|
-
|
|
63
|
-
```text
|
|
64
|
-
使用 yss-product-lifecycle,以 route 模式检查“客户合同审批”的 Tactical Design 输入。
|
|
65
|
-
请先读取 yss-project.yaml、CONTEXT.md、Strategic Design Handoff 和当前已有架构资料。
|
|
66
|
-
本轮只读,不要修改文件。请用普通话告诉我:
|
|
67
|
-
1. 上游交接包是否批准且仍然有效;
|
|
68
|
-
2. 当前是轻量 Tactical DDD Check 还是需要独立 Tactical Design;
|
|
69
|
-
3. 已确认、待确认和冲突的业务规则分别是什么;
|
|
70
|
-
4. 下一步只做哪一件事。
|
|
71
|
-
正式 ID 放在普通话解释后面。
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## 业务读者篇:用白话理解核心概念
|
|
75
|
-
|
|
76
|
-
### 1. 聚合(Aggregate)
|
|
77
|
-
|
|
78
|
-
聚合是一组必须一起守规则的对象。聚合根是这组对象对外唯一的入口;外部不能绕过聚合根直接修改内部对象。
|
|
79
|
-
|
|
80
|
-
例子:一次“客户合同审批”可以由 `Contract` 聚合根管理审批状态和审批记录。审批记录如果只能随合同一起新增、退回和查询,就可以放在这个聚合内;不相关的通知不要硬塞进来。
|
|
81
|
-
|
|
82
|
-
判断一个对象是否属于同一聚合,可以问:
|
|
83
|
-
|
|
84
|
-
- 这些数据是否必须在同一次事务中保持一致?
|
|
85
|
-
- 修改其中一个对象时,是否必须立即检查另一个对象?
|
|
86
|
-
- 聚合变得很大后,是否会造成锁、并发或性能问题?
|
|
87
|
-
|
|
88
|
-
不要按数据库表的外键关系画聚合;表关系图和业务一致性边界不是一回事。
|
|
89
|
-
|
|
90
|
-
### 2. Entity(实体)
|
|
91
|
-
|
|
92
|
-
实体有自己的身份,即使其他属性变化,它仍然是“同一个东西”。例如合同有 `contractId`,合同名称或金额修改后仍是同一份合同。
|
|
93
|
-
|
|
94
|
-
### 3. Value Object(值对象)
|
|
95
|
-
|
|
96
|
-
值对象由它的值决定身份,没有单独的业务身份。例如合同金额、客户地址、审批意见或时间范围。两个值完全相同的金额可以互相替换;值对象通常应尽量不可变。
|
|
97
|
-
|
|
98
|
-
### 4. 不变量(Invariant)
|
|
99
|
-
|
|
100
|
-
不变量是无论哪条入口执行,都不能被破坏的规则。例如:
|
|
101
|
-
|
|
102
|
-
- 合同资料完整且校验通过后才能提交审批;
|
|
103
|
-
- 已通过审批的合同不能直接改回草稿;
|
|
104
|
-
- 同一份合同不能同时存在两个正在处理的审批流程;
|
|
105
|
-
- 每次审批都必须留下操作人、时间、动作和意见。
|
|
106
|
-
|
|
107
|
-
每条不变量都要能对应至少一个测试场景。不要把“页面上有一个发布按钮”当成不变量。
|
|
108
|
-
|
|
109
|
-
### 5. 状态机
|
|
110
|
-
|
|
111
|
-
状态机把允许的状态变化写清楚。合同示例:`草稿 → 待审批 → 审批中 → 已通过`;审批人退回时回到“草稿”,但“已通过”不能直接回到“草稿”。
|
|
112
|
-
|
|
113
|
-
| 当前状态 | 动作 | 下一状态 | 必须满足 |
|
|
114
|
-
|---|---|---|---|
|
|
115
|
-
| 草稿 | 提交审批 | 待审批 | 合同资料完整 |
|
|
116
|
-
| 待审批 | 审批人接单 | 审批中 | 已分配审批人 |
|
|
117
|
-
| 审批中 | 审批通过 | 已通过 | 规则检查通过 |
|
|
118
|
-
| 审批中 | 退回 | 草稿 | 必须填写退回原因 |
|
|
119
|
-
| 已通过 | 修改 | 不允许 | 创建新的合同草稿 |
|
|
120
|
-
|
|
121
|
-
### 6. 领域服务(Domain Service)
|
|
122
|
-
|
|
123
|
-
当一条业务规则不自然属于某个实体,或需要协调多个聚合时,可以使用领域服务。领域服务只表达业务决策,不负责 HTTP、数据库连接或页面跳转。
|
|
124
|
-
|
|
125
|
-
### 7. 领域事件(Domain Event)
|
|
126
|
-
|
|
127
|
-
领域事件记录“业务上已经发生了什么”,例如 `ContractApproved`。它适合通知订阅者、触发异步处理或留下审计线索;事件名称应使用业务语言,不要直接暴露数据库表名。
|
|
128
|
-
|
|
129
|
-
## 研发接手篇:从场景形成战术设计
|
|
130
|
-
|
|
131
|
-
### 第一步:从用户场景开始,不从类名开始
|
|
132
|
-
|
|
133
|
-
以“提交客户合同审批”为例,先写出:谁发起、前置条件、动作、结果、失败方式和后续影响。
|
|
7
|
+
先核对本仓身份、profile、根 CONTEXT.md、当前战略交接及批准证据。导入快照后完成目标词汇对账,再逐项登记源规则/关键场景的承接;缺失、冲突或过期先回交,不能猜测业务规则。
|
|
134
8
|
|
|
135
9
|
```text
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
失败:保留原状态,返回可理解的失败原因
|
|
10
|
+
请按本仓生命周期检查“设备领用”当前战略输入及目标词汇对账。
|
|
11
|
+
有领域行为影响时,使用 yss-tactical-design 起草战术设计,
|
|
12
|
+
解释设备占用的竞争、状态转换和一致性边界,并映射公开测试 seam。
|
|
13
|
+
逐项列出已承接、冲突、延期及依赖切片,等待适用审查后再编译实现合同。
|
|
141
14
|
```
|
|
142
15
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
把规则分成“必须立即成立”和“可以稍后完成”:
|
|
146
|
-
|
|
147
|
-
| 规则 | 一致性要求 | 设计提示 |
|
|
148
|
-
|---|---|---|
|
|
149
|
-
| 提交前资料必须完整 | 立即成立 | 放在合同聚合的不变量中 |
|
|
150
|
-
| 同一合同不能重复提交 | 立即成立 | 由聚合 + Repository 检查并发冲突 |
|
|
151
|
-
| 审批结果通知销售 | 可稍后完成 | 审批完成后发送领域事件 |
|
|
152
|
-
| 统计报表更新 | 可稍后完成 | 使用异步订阅,不阻塞审批事务 |
|
|
153
|
-
|
|
154
|
-
跨聚合流程由 Application 编排;核心规则仍放在 Domain。不要把所有规则塞进 Controller 或 Application Service。
|
|
155
|
-
|
|
156
|
-
### 第三步:画出对象职责,而不是字段清单
|
|
157
|
-
|
|
158
|
-
至少记录以下内容:
|
|
159
|
-
|
|
160
|
-
| 对象 | 类型 | 负责什么 | 不负责什么 |
|
|
161
|
-
|---|---|---|---|
|
|
162
|
-
| `Contract` | Aggregate Root / Entity | 状态变化、提交前检查 | 发送 HTTP、直接操作表 |
|
|
163
|
-
| `ApprovalRecord` | Entity 或 Value Object(需裁决) | 表达审批动作、意见和时间 | 决定整个流程 |
|
|
164
|
-
| `ApproveContract` | Domain Service(必要时) | 协调跨对象的审批规则 | 事务提交和接口适配 |
|
|
165
|
-
| `ContractRepository` | Repository seam | 保存和加载聚合 | 对外暴露数据库结构 |
|
|
166
|
-
| `ContractApproved` | Domain Event | 描述审批已通过 | 代替主事务中的规则检查 |
|
|
167
|
-
|
|
168
|
-
“Value Object 还是 Entity”不是凭习惯决定的:如果版本需要独立追踪身份、生命周期或并发操作,可能是 Entity;如果它只是不可变的版本值,可能是 Value Object。把裁决理由写下来。
|
|
169
|
-
|
|
170
|
-
### 第四步:隔离 Repository、Gateway 和 API
|
|
171
|
-
|
|
172
|
-
- `Repository` 面向领域模型的保存 / 加载,不让领域层依赖 ORM 或表结构。
|
|
173
|
-
- `Gateway` 面向外部系统能力,例如通知、文件存储或规则服务;领域层只依赖抽象接口。
|
|
174
|
-
- API schema 面向调用方,不直接暴露聚合内部对象、Repository 或持久化表。
|
|
175
|
-
- Application 负责用例编排、事务边界和跨聚合协调;Domain 负责核心业务规则。
|
|
176
|
-
|
|
177
|
-
### 第五步:写测试 seam
|
|
178
|
-
|
|
179
|
-
每条关键规则都要有可执行的验证入口:
|
|
180
|
-
|
|
181
|
-
- 聚合行为测试:给定状态和动作,验证状态变化或拒绝原因;
|
|
182
|
-
- Repository / Gateway 契约测试:验证抽象接口的输入输出;
|
|
183
|
-
- Application 用例测试:验证事务边界和跨聚合协调;
|
|
184
|
-
- API 契约测试:验证公开 wire shape,不验证内部类名。
|
|
185
|
-
|
|
186
|
-
## 什么时候需要独立 Tactical Design
|
|
187
|
-
|
|
188
|
-
大多数简单变更,在系统概要设计中的 `Tactical DDD Check` 写清楚即可。只有当以下内容复杂到无法在一节中审查时,才升级为独立 Tactical Design 产物:
|
|
189
|
-
|
|
190
|
-
- 多个聚合之间有复杂的一致性或并发规则;
|
|
191
|
-
- 状态机有分支、补偿、重试或不可逆状态;
|
|
192
|
-
- 持久化映射会隐藏或破坏领域边界;
|
|
193
|
-
- Gateway、领域事件或最终一致性需要明确时序;
|
|
194
|
-
- 评审者无法仅凭概要设计复现关键业务行为。
|
|
16
|
+
## 评审要回答的问题
|
|
195
17
|
|
|
196
|
-
|
|
18
|
+
| 设计问题 | 设备借用中的例子 |
|
|
19
|
+
|---|---|
|
|
20
|
+
| 谁保护不变量 | 哪个对象/边界保证设备不能同时被领用 |
|
|
21
|
+
| 状态是否合法 | 未批准申请是否允许领用;重复归还如何处理 |
|
|
22
|
+
| 一致性在哪里保证 | 申请与设备占用是否同事务;失败如何恢复 |
|
|
23
|
+
| 外部依赖如何隔离 | API/Repository/Gateway 怎样映射而不篡改业务含义 |
|
|
24
|
+
| 如何证伪设计 | 并发领用、无权限、重复请求的公开 seam 与预期结果 |
|
|
197
25
|
|
|
198
|
-
|
|
26
|
+
案例只是提问方向,答案由项目实际业务与工程条件决定。没有领域行为影响时按当前政策记录带原因的 not-applicable,不为简单页面硬造聚合。
|
|
199
27
|
|
|
200
|
-
|
|
201
|
-
- [ ] Strategic Design Handoff 为 schema v2,目标根 `CONTEXT.md` 已完成 context delta 对账,`strategic_context_import_ref` 与 `context_reconciliation_ref` 均通过校验。
|
|
202
|
-
- [ ] 统一语言与 `CONTEXT.md` 一致,没有临时创造同义词。
|
|
203
|
-
- [ ] 聚合根、Entity、Value Object 的身份和边界有理由。
|
|
204
|
-
- [ ] 每个聚合的不变量和允许的状态转换都写清楚。
|
|
205
|
-
- [ ] 一致性规则区分了立即成立与最终一致。
|
|
206
|
-
- [ ] Application、Domain、Repository、Gateway 和 API 的职责没有混淆。
|
|
207
|
-
- [ ] 领域事件表达业务事实,不暴露内部表结构。
|
|
208
|
-
- [ ] 关键规则都有测试 seam 和失败场景。
|
|
209
|
-
- [ ] 已判断轻量 `Tactical DDD Check` 是否足够;需要升级时写明原因。
|
|
210
|
-
- [ ] 未决问题有负责人、后续 Ticket、验证计划和目标版本。
|
|
28
|
+
## 从设计到实现
|
|
211
29
|
|
|
212
|
-
|
|
30
|
+
综合项目由本仓生命周期继续路由,通用研发/后端由 Harness 流程承接。前端专职只消费上游规则、冻结接口并准备前端工程设计,不在本仓派发后端战术实现。
|
|
213
31
|
|
|
214
|
-
-
|
|
215
|
-
- [战略设计子项目用户手册](../../submodules/yss-harness-design-agent/docs/user-guide/战略设计子项目用户手册.md):上游 Discovery、DDD 战略设计、Spec、原型和 Strategic Design Handoff。
|
|
216
|
-
- [系统概要设计模板](../architecture/templates/system-overview-design-template.md):轻量 Tactical DDD Check 的记录位置。
|
|
217
|
-
- [架构评审清单](../architecture/templates/architecture-review-checklist.md):设计评审时的结构化检查项。
|
|
218
|
-
- `yss-implementation-contract-compiler` 与后端 / 前端专项技能:批准后的实现合同、代码和验证规则。
|
|
32
|
+
编译器起草当前合同,批准与可实现状态由本仓编排和门禁控制。实现前确认工程登记、冻结接口、测试 seam、允许路径与回滚点。战术评审通过不等于 ready-for-agent。
|
|
219
33
|
|
|
220
|
-
|
|
34
|
+
过程示例见 [设备借用贯穿案例](设备借用贯穿案例.md);项目选型见 [用户手册](用户手册.md)。
|