create-yss-spec 2.1.9 → 2.1.10
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 +1 -1
- package/package.json +1 -1
- package/src/cli.js +82 -15
- package/template/.agents/skills/diagnosing-bugs/SKILL.md +2 -4
- package/template/.agents/skills/domain-modeling/SKILL.md +1 -1
- package/template/.agents/skills/grilling/SKILL.md +7 -1
- package/template/.agents/skills/triage/SKILL.md +2 -2
- package/template/.agents/skills/wait-what/SKILL.md +2 -2
- package/template/.agents/skills/wayfinder/SKILL.md +1 -1
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +43 -91
- package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +7 -5
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +88 -22
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +5 -4
- package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +4 -1
- package/template/.claude/skills/diagnosing-bugs/SKILL.md +2 -4
- package/template/.claude/skills/domain-modeling/SKILL.md +1 -1
- package/template/.claude/skills/grilling/SKILL.md +7 -1
- package/template/.claude/skills/triage/SKILL.md +2 -2
- package/template/.claude/skills/wait-what/SKILL.md +2 -2
- package/template/.claude/skills/wayfinder/SKILL.md +1 -1
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +43 -91
- package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +7 -5
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +88 -22
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +5 -4
- package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +4 -1
- package/template/.codex/skills/diagnosing-bugs/SKILL.md +2 -4
- package/template/.codex/skills/domain-modeling/SKILL.md +1 -1
- package/template/.codex/skills/grilling/SKILL.md +7 -1
- package/template/.codex/skills/triage/SKILL.md +2 -2
- package/template/.codex/skills/wait-what/SKILL.md +2 -2
- package/template/.codex/skills/wayfinder/SKILL.md +1 -1
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +43 -91
- package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +7 -5
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +88 -22
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +5 -4
- package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +4 -1
- package/template/.hermes/skills/diagnosing-bugs/SKILL.md +2 -4
- package/template/.hermes/skills/domain-modeling/SKILL.md +1 -1
- package/template/.hermes/skills/grilling/SKILL.md +7 -1
- package/template/.hermes/skills/triage/SKILL.md +2 -2
- package/template/.hermes/skills/wait-what/SKILL.md +2 -2
- package/template/.hermes/skills/wayfinder/SKILL.md +1 -1
- package/template/.hermes/skills/yss-product-lifecycle/SKILL.md +43 -91
- package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +7 -5
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration-contract.yaml +88 -22
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +5 -4
- package/template/.hermes/skills/yss-product-lifecycle/references/state-model.md +4 -1
- package/template/.pi/skills/diagnosing-bugs/SKILL.md +2 -4
- package/template/.pi/skills/domain-modeling/SKILL.md +1 -1
- package/template/.pi/skills/grilling/SKILL.md +7 -1
- package/template/.pi/skills/triage/SKILL.md +2 -2
- package/template/.pi/skills/wait-what/SKILL.md +2 -2
- package/template/.pi/skills/wayfinder/SKILL.md +1 -1
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +43 -91
- package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +7 -5
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +88 -22
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +5 -4
- package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +4 -1
- package/template/.qoder/skills/diagnosing-bugs/SKILL.md +2 -4
- package/template/.qoder/skills/domain-modeling/SKILL.md +1 -1
- package/template/.qoder/skills/grilling/SKILL.md +7 -1
- package/template/.qoder/skills/triage/SKILL.md +2 -2
- package/template/.qoder/skills/wait-what/SKILL.md +2 -2
- package/template/.qoder/skills/wayfinder/SKILL.md +1 -1
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +43 -91
- package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +7 -5
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +88 -22
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +5 -4
- package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +4 -1
- package/template/.trae/skills/diagnosing-bugs/SKILL.md +2 -4
- package/template/.trae/skills/domain-modeling/SKILL.md +1 -1
- package/template/.trae/skills/grilling/SKILL.md +7 -1
- package/template/.trae/skills/triage/SKILL.md +2 -2
- package/template/.trae/skills/wait-what/SKILL.md +2 -2
- package/template/.trae/skills/wayfinder/SKILL.md +1 -1
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +43 -91
- package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +7 -5
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +88 -22
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +5 -4
- package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +4 -1
- package/template/AGENTS.md +2 -2
- package/template/CONTEXT.md +7 -1
- package/template/docs/adr/0007-lifecycle-native-work-units.md +5 -0
- package/template/docs/agents/skills-maintenance.md +11 -3
- package/template/docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md +1 -1
- package/template/docs/process/lifecycle-artifact-map.md +19 -15
- package/template/docs/process/lifecycle-registry-baseline.json +15 -1
- package/template/docs/process/lifecycle-registry.yaml +77 -0
- package/template/docs/process/schemas/frontend-implementation-evidence.schema.json +39 -0
- package/template/docs/process/schemas/lifecycle-checkpoint.schema.json +56 -0
- package/template/docs/process/schemas/lifecycle-registry.schema.json +2 -2
- package/template/docs/process/templates/frontend-implementation-plan-template.yaml +16 -0
- package/template/docs/process/templates/frontend-implementation-verification-template.yaml +21 -0
- package/template/docs/process/templates/lifecycle-checkpoint-template.yaml +30 -0
- package/template/docs/process/templates/stage-checkpoint-template.md +9 -5
- package/template/scripts/lib/lifecycle-registry.mjs +9 -4
- package/template/scripts/lib/scenario-checks.mjs +37 -15
- package/template/scripts/lib/skill-supply-chain.mjs +33 -8
- package/template/scripts/verify-frontend-implementation-evidence +51 -0
- package/template/scripts/verify-lifecycle-checkpoint +37 -0
- package/template/scripts/verify-template +5 -2
- package/template/scripts/verify-upstream-skill-source +32 -0
- package/template/skills-lock.json +105 -55
- package/template.manifest.json +12 -0
- package/template.snapshot.json +4 -4
- package/template/.agents/skills/batch-grill-me/SKILL.md +0 -15
- package/template/.agents/skills/batch-grill-me/agents/openai.yaml +0 -5
- package/template/.claude/skills/batch-grill-me/SKILL.md +0 -15
- package/template/.claude/skills/batch-grill-me/agents/openai.yaml +0 -5
- package/template/.codex/skills/batch-grill-me/SKILL.md +0 -15
- package/template/.codex/skills/batch-grill-me/agents/openai.yaml +0 -5
- package/template/.hermes/skills/batch-grill-me/SKILL.md +0 -15
- package/template/.hermes/skills/batch-grill-me/agents/openai.yaml +0 -5
- package/template/.pi/skills/batch-grill-me/SKILL.md +0 -15
- package/template/.pi/skills/batch-grill-me/agents/openai.yaml +0 -5
- package/template/.qoder/skills/batch-grill-me/SKILL.md +0 -15
- package/template/.qoder/skills/batch-grill-me/agents/openai.yaml +0 -5
- package/template/.trae/skills/batch-grill-me/SKILL.md +0 -15
- package/template/.trae/skills/batch-grill-me/agents/openai.yaml +0 -5
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@ npx create-yss-spec@latest
|
|
|
33
33
|
- 旧、新资产内容冲突或清单 schema / mode 非法时 fail closed
|
|
34
34
|
- 保留模板的共享 skill 投影;生成实例可在尚未 `git init` 时运行模板校验
|
|
35
35
|
|
|
36
|
-
本次模板适配按 `2.1.
|
|
36
|
+
本次模板适配按 `2.1.10` 发布。`templateCommit` 会写入实例 metadata;“最新模板”指用户执行的 `npx create-yss-spec@latest` 所携带的最新已发布快照,CLI 运行时不会拉取模板仓库。
|
|
37
37
|
|
|
38
38
|
## 接管已有项目
|
|
39
39
|
|
package/package.json
CHANGED
package/src/cli.js
CHANGED
|
@@ -18,6 +18,15 @@ const TEMPLATE_MANIFEST = JSON.parse(TEMPLATE_MANIFEST_TEXT);
|
|
|
18
18
|
const ROOT_EXCLUDED_ENTRIES = new Set(TEMPLATE_MANIFEST.excludeRootEntries);
|
|
19
19
|
const ROOT_EXCLUDED_FILES = new Set(TEMPLATE_MANIFEST.excludeRootFiles);
|
|
20
20
|
const EXCLUDED_RELATIVE_PATHS = new Set(TEMPLATE_MANIFEST.excludePaths);
|
|
21
|
+
const INIT_EXCLUDED_ROOT_ENTRIES = new Set(
|
|
22
|
+
TEMPLATE_MANIFEST.initExcludeRootEntries || [],
|
|
23
|
+
);
|
|
24
|
+
const INIT_EXCLUDED_ROOT_FILES = new Set(
|
|
25
|
+
TEMPLATE_MANIFEST.initExcludeRootFiles || [],
|
|
26
|
+
);
|
|
27
|
+
const INIT_EXCLUDED_RELATIVE_PATHS = new Set(
|
|
28
|
+
TEMPLATE_MANIFEST.initExcludePaths || [],
|
|
29
|
+
);
|
|
21
30
|
const RENDERED_RELATIVE_PATHS = new Set(TEMPLATE_MANIFEST.renderPaths);
|
|
22
31
|
const EXAMPLE_DOC_PATHS = new Set(TEMPLATE_MANIFEST.exampleDocPaths);
|
|
23
32
|
const TEMPLATE_METADATA_FILENAME = ".yss-template.json";
|
|
@@ -323,12 +332,20 @@ function targetPath(targetDir, relativePath) {
|
|
|
323
332
|
return resolved;
|
|
324
333
|
}
|
|
325
334
|
|
|
326
|
-
function shouldExcludeRelativePath(relativePath) {
|
|
327
|
-
|
|
335
|
+
function shouldExcludeRelativePath(relativePath, mode = "managed") {
|
|
336
|
+
const normalized = normalizeRelativePath(relativePath);
|
|
337
|
+
return EXCLUDED_RELATIVE_PATHS.has(normalized) ||
|
|
338
|
+
(mode === "init" &&
|
|
339
|
+
(INIT_EXCLUDED_RELATIVE_PATHS.has(normalized) ||
|
|
340
|
+
INIT_EXCLUDED_ROOT_FILES.has(normalized)));
|
|
328
341
|
}
|
|
329
342
|
|
|
330
|
-
function shouldSkipRootEntry(entryName) {
|
|
331
|
-
return ROOT_EXCLUDED_ENTRIES.has(entryName) ||
|
|
343
|
+
function shouldSkipRootEntry(entryName, mode = "managed") {
|
|
344
|
+
return ROOT_EXCLUDED_ENTRIES.has(entryName) ||
|
|
345
|
+
ROOT_EXCLUDED_FILES.has(entryName) ||
|
|
346
|
+
(mode === "init" &&
|
|
347
|
+
(INIT_EXCLUDED_ROOT_ENTRIES.has(entryName) ||
|
|
348
|
+
INIT_EXCLUDED_ROOT_FILES.has(entryName)));
|
|
332
349
|
}
|
|
333
350
|
|
|
334
351
|
function parseRepositoryIdentity(content) {
|
|
@@ -438,12 +455,18 @@ function renderTemplateFile(relativePath, content, variables) {
|
|
|
438
455
|
return content;
|
|
439
456
|
}
|
|
440
457
|
|
|
441
|
-
function buildCopyPlan(
|
|
458
|
+
function buildCopyPlan(
|
|
459
|
+
sourceDir,
|
|
460
|
+
targetDir,
|
|
461
|
+
variables,
|
|
462
|
+
relativeDir = "",
|
|
463
|
+
mode = "managed",
|
|
464
|
+
) {
|
|
442
465
|
const operations = [];
|
|
443
466
|
const entries = fs.readdirSync(sourceDir, { withFileTypes: true });
|
|
444
467
|
|
|
445
468
|
for (const entry of entries) {
|
|
446
|
-
if (!relativeDir && shouldSkipRootEntry(entry.name)) {
|
|
469
|
+
if (!relativeDir && shouldSkipRootEntry(entry.name, mode)) {
|
|
447
470
|
continue;
|
|
448
471
|
}
|
|
449
472
|
|
|
@@ -452,7 +475,7 @@ function buildCopyPlan(sourceDir, targetDir, variables, relativeDir = "") {
|
|
|
452
475
|
: entry.name;
|
|
453
476
|
const relativePath = logicalTemplatePath(bundledRelativePath);
|
|
454
477
|
|
|
455
|
-
if (shouldExcludeRelativePath(relativePath)) {
|
|
478
|
+
if (shouldExcludeRelativePath(relativePath, mode)) {
|
|
456
479
|
continue;
|
|
457
480
|
}
|
|
458
481
|
|
|
@@ -466,7 +489,13 @@ function buildCopyPlan(sourceDir, targetDir, variables, relativeDir = "") {
|
|
|
466
489
|
if (entry.isDirectory()) {
|
|
467
490
|
operations.push({ type: "mkdir", relativePath, targetPath: targetPathValue });
|
|
468
491
|
operations.push(
|
|
469
|
-
...buildCopyPlan(
|
|
492
|
+
...buildCopyPlan(
|
|
493
|
+
sourcePath,
|
|
494
|
+
targetDir,
|
|
495
|
+
variables,
|
|
496
|
+
bundledRelativePath,
|
|
497
|
+
mode,
|
|
498
|
+
),
|
|
470
499
|
);
|
|
471
500
|
continue;
|
|
472
501
|
}
|
|
@@ -567,14 +596,14 @@ function buildSyncVariables(metadata) {
|
|
|
567
596
|
};
|
|
568
597
|
}
|
|
569
598
|
|
|
570
|
-
function buildDesiredManagedOperations(targetDir, variables) {
|
|
571
|
-
return buildCopyPlan(BUNDLED_TEMPLATE_ROOT, targetDir, variables)
|
|
599
|
+
function buildDesiredManagedOperations(targetDir, variables, mode = "managed") {
|
|
600
|
+
return buildCopyPlan(BUNDLED_TEMPLATE_ROOT, targetDir, variables, "", mode)
|
|
572
601
|
.filter((operation) => operation.type === "copy" || operation.type === "render")
|
|
573
602
|
.map((operation) => buildDesiredManagedFile(operation, { variables }));
|
|
574
603
|
}
|
|
575
604
|
|
|
576
605
|
function buildSyncDesiredOperations(targetDir, variables, identity) {
|
|
577
|
-
return buildDesiredManagedOperations(targetDir, variables).map((operation) => {
|
|
606
|
+
return buildDesiredManagedOperations(targetDir, variables, "init").map((operation) => {
|
|
578
607
|
if (
|
|
579
608
|
operation.relativePath !== "yss-project.yaml" ||
|
|
580
609
|
identity.state !== "valid" ||
|
|
@@ -1096,7 +1125,12 @@ function runTemplateVerification(targetDir, scriptPath) {
|
|
|
1096
1125
|
}
|
|
1097
1126
|
}
|
|
1098
1127
|
|
|
1099
|
-
function verifyGeneratedTemplate(targetDir) {
|
|
1128
|
+
function verifyGeneratedTemplate(targetDir, mode = "managed") {
|
|
1129
|
+
if (mode === "init") {
|
|
1130
|
+
verifyGeneratedInstance(targetDir);
|
|
1131
|
+
return;
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1100
1134
|
for (const scriptPath of [
|
|
1101
1135
|
"scripts/sync-skills",
|
|
1102
1136
|
"scripts/update-skill-lock",
|
|
@@ -1106,6 +1140,33 @@ function verifyGeneratedTemplate(targetDir) {
|
|
|
1106
1140
|
}
|
|
1107
1141
|
}
|
|
1108
1142
|
|
|
1143
|
+
function verifyGeneratedInstance(targetDir) {
|
|
1144
|
+
const forbiddenPaths = [
|
|
1145
|
+
...[...INIT_EXCLUDED_ROOT_ENTRIES],
|
|
1146
|
+
...[...INIT_EXCLUDED_ROOT_FILES],
|
|
1147
|
+
...[...INIT_EXCLUDED_RELATIVE_PATHS],
|
|
1148
|
+
];
|
|
1149
|
+
for (const relativePath of forbiddenPaths) {
|
|
1150
|
+
if (pathKind(targetPath(targetDir, relativePath)) !== "missing") {
|
|
1151
|
+
throw new Error(`初始化结果包含禁止分发的模板源资产:${relativePath}`);
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
const identity = readTargetIdentity(targetDir);
|
|
1156
|
+
if (
|
|
1157
|
+
identity.state !== "valid" ||
|
|
1158
|
+
identity.fields.repository_mode !== "project-instance"
|
|
1159
|
+
) {
|
|
1160
|
+
throw new Error("初始化结果的 yss-project.yaml 必须是 project-instance");
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
const agentsContent = fs.readFileSync(targetPath(targetDir, "AGENTS.md"), "utf8");
|
|
1164
|
+
const readmeContent = fs.readFileSync(targetPath(targetDir, "README.md"), "utf8");
|
|
1165
|
+
if (agentsContent.includes("[填写]") || readmeContent.includes("[填写]")) {
|
|
1166
|
+
throw new Error("初始化结果仍包含模板占位信息");
|
|
1167
|
+
}
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1109
1170
|
function loadTemplateMetadata(targetDir) {
|
|
1110
1171
|
const metadataPath = targetPath(targetDir, TEMPLATE_METADATA_FILENAME);
|
|
1111
1172
|
const metadataKind = pathKind(metadataPath);
|
|
@@ -1483,7 +1544,13 @@ function runInit(argv = []) {
|
|
|
1483
1544
|
readTemplateSnapshot();
|
|
1484
1545
|
const targetDir = normalizeTargetDir(promptedOptions.targetDir);
|
|
1485
1546
|
const targetState = inspectTargetDir(targetDir, promptedOptions.force);
|
|
1486
|
-
const operations = buildCopyPlan(
|
|
1547
|
+
const operations = buildCopyPlan(
|
|
1548
|
+
BUNDLED_TEMPLATE_ROOT,
|
|
1549
|
+
targetDir,
|
|
1550
|
+
promptedOptions,
|
|
1551
|
+
"",
|
|
1552
|
+
"init",
|
|
1553
|
+
);
|
|
1487
1554
|
|
|
1488
1555
|
if (promptedOptions.dryRun) {
|
|
1489
1556
|
console.log("dry-run 预览");
|
|
@@ -1496,7 +1563,7 @@ function runInit(argv = []) {
|
|
|
1496
1563
|
|
|
1497
1564
|
prepareTargetDir(targetDir, targetState);
|
|
1498
1565
|
executePlan(operations, promptedOptions);
|
|
1499
|
-
verifyGeneratedTemplate(targetDir);
|
|
1566
|
+
verifyGeneratedTemplate(targetDir, "init");
|
|
1500
1567
|
writeTemplateMetadata(
|
|
1501
1568
|
targetDir,
|
|
1502
1569
|
buildMetadata(promptedOptions, operations.filter((operation) => operation.type !== "mkdir"), targetDir),
|
|
@@ -1671,7 +1738,7 @@ function runSync(argv = []) {
|
|
|
1671
1738
|
applyManagedOperation(operation, transaction);
|
|
1672
1739
|
}
|
|
1673
1740
|
applyMigrationPlan(migrationPlan, transaction);
|
|
1674
|
-
verifyGeneratedTemplate(targetDir);
|
|
1741
|
+
verifyGeneratedTemplate(targetDir, "init");
|
|
1675
1742
|
writeTemplateMetadata(
|
|
1676
1743
|
targetDir,
|
|
1677
1744
|
buildNextSyncMetadata(metadata, syncPlan, targetDir),
|
|
@@ -127,7 +127,7 @@ If a correct seam exists:
|
|
|
127
127
|
4. Watch it pass.
|
|
128
128
|
5. Re-run the Phase 1 feedback loop against the original (un-minimised) scenario.
|
|
129
129
|
|
|
130
|
-
## Phase 6 — Cleanup
|
|
130
|
+
## Phase 6 — Cleanup
|
|
131
131
|
|
|
132
132
|
Required before declaring done:
|
|
133
133
|
|
|
@@ -135,6 +135,4 @@ Required before declaring done:
|
|
|
135
135
|
- [ ] Regression test passes (or absence of seam is documented)
|
|
136
136
|
- [ ] All `[DEBUG-...]` instrumentation removed (`grep` the prefix)
|
|
137
137
|
- [ ] Throwaway prototypes deleted (or moved to a clearly-marked debug location)
|
|
138
|
-
- [ ] The hypothesis that turned out correct is stated in the commit / PR message
|
|
139
|
-
|
|
140
|
-
**Then ask: what would have prevented this bug?** If the answer involves architectural change (no good test seam, tangled callers, hidden coupling) hand off to the `/improve-codebase-architecture` skill with the specifics. Make the recommendation **after** the fix is in, not before — you have more information now than when you started.
|
|
138
|
+
- [ ] The hypothesis that turned out correct is stated in the commit / PR message, so the next debugger learns
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: domain-modeling
|
|
3
|
-
description: Build and sharpen a project's domain model. Use when
|
|
3
|
+
description: Build and sharpen a project's domain model. Use when discussing codebase terminology, writing or editing a CONTEXT.md, or recording or editing an ADR.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Domain Modeling
|
|
@@ -7,11 +7,17 @@ Interview the user relentlessly until you reach a shared understanding. Map this
|
|
|
7
7
|
|
|
8
8
|
Work the tree in **rounds**. The **frontier** is every decision whose prerequisites are already settled — the questions you can ask _now_ without guessing at answers you haven't heard yet. Ask the whole frontier in one round: number each question and give your recommended answer. Then wait for the user's answers before the next round.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Format a round like so:
|
|
11
11
|
|
|
12
12
|
```
|
|
13
13
|
❓ **Q1** - **<question title>**: <question body, might be multiple paragraphs, including multiple choices>
|
|
14
14
|
|
|
15
|
+
➡️ <your recommended answer>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
❓ **Q2** - **<question title>**: <question body, might be multiple paragraphs, including multiple choices>
|
|
20
|
+
|
|
15
21
|
➡️ <your recommended answer>
|
|
16
22
|
```
|
|
17
23
|
|
|
@@ -40,7 +40,7 @@ For a PR, the same states read against the attached code: `ready-for-agent` mean
|
|
|
40
40
|
|
|
41
41
|
Every triaged issue should carry exactly one category role and one state role. If state roles conflict, flag it and ask the maintainer before doing anything else.
|
|
42
42
|
|
|
43
|
-
These are canonical role names
|
|
43
|
+
These are canonical role names. The actual label strings used in the issue tracker may differ. The mapping should have been provided to you. If not, tell the user to run `/setup-matt-pocock-skills`.
|
|
44
44
|
|
|
45
45
|
State transitions: an unlabeled issue normally goes to `needs-triage` first; from there it moves to `needs-info`, `ready-for-agent`, `ready-for-human`, or `wontfix`. `needs-info` returns to `needs-triage` once the reporter replies. The maintainer can override at any time — flag transitions that look unusual and ask before proceeding.
|
|
46
46
|
|
|
@@ -73,7 +73,7 @@ Show counts and a one-line summary per item. Let the maintainer pick.
|
|
|
73
73
|
|
|
74
74
|
3. **Verify the claim.** Before any grilling, check that the claim holds up. For a bug, reproduce it from the reporter's steps. For a PR, confirm the diff does what it claims — check it out, run the relevant tests or commands. Report what happened: confirmed (with code path), failed, or insufficient detail (a strong `needs-info` signal). A confirmed verification makes a much stronger agent brief.
|
|
75
75
|
|
|
76
|
-
4. **Grill (if needed).** If the request needs fleshing out,
|
|
76
|
+
4. **Grill (if needed).** If the request needs fleshing out, call the Skill tool twice, for "grilling" and "domain-modeling", and grill it into shape a round of questions at a time, sharpening domain terms and updating `CONTEXT.md`/ADRs inline as decisions land.
|
|
77
77
|
|
|
78
78
|
5. **Apply the outcome:**
|
|
79
79
|
- `ready-for-agent` — post an agent brief comment ([AGENT-BRIEF.md](AGENT-BRIEF.md)).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wait-what
|
|
3
|
-
description: Stop. That last message did not land
|
|
3
|
+
description: "Stop. That last message did not land: re-pitch it."
|
|
4
4
|
disable-model-invocation: true
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Wait
|
|
7
|
+
Wait, I don't understand where you've got to here. Re-pitch that: give me a little bit of context, talk in ASD-STE100 Simplified Technical English, and use the ubiquitous language from `CONTEXT.md` (follow `CONTEXT-MAP.md` to the right one if the repo has more than one).
|
|
@@ -22,7 +22,7 @@ The map is a single issue on this repo's issue tracker, labelled `wayfinder:map`
|
|
|
22
22
|
|
|
23
23
|
The map is an **index**, not a store. It lists the decisions made and points at the tickets that hold their detail; a decision lives in exactly one place — its ticket — so the map never restates it, only gists it and links.
|
|
24
24
|
|
|
25
|
-
**Where the map, its child tickets, blocking, and frontier queries physically live is tracker-specific.** The issue tracker should have been provided to you
|
|
25
|
+
**Where the map, its child tickets, blocking, and frontier queries physically live is tracker-specific.** The issue tracker should have been provided to you. If not, tell the user to run `/setup-matt-pocock-skills`. Consult the tracker doc's "Wayfinding operations" section for how _this_ repo expresses them. If no tracker has been provided, default to the local-markdown tracker.
|
|
26
26
|
|
|
27
27
|
### The map body
|
|
28
28
|
|
|
@@ -1,97 +1,49 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: yss-product-lifecycle
|
|
3
|
-
description:
|
|
3
|
+
description: 编排 YSS 产品或模块从机会调研到 Spec、原型、技术契约、垂直切片实现、审查、发布和复盘;当阶段、产物、门禁或 YSS skill 不清晰时使用。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# YSS Product Lifecycle
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
1.
|
|
13
|
-
2.
|
|
14
|
-
3. `
|
|
15
|
-
4. `
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
##
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
- `
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
- Ticket tracker 支持 `local-markdown`、GitHub 和 GitLab;模板默认 `local-markdown`,以 `docs/.scratch/<feature>/` 完整功能包为主载体。Git remote 只代表代码托管,不能覆盖已持久化的 tracker 选择;Local 主 tracker 不要求远程 Ticket。根 `.scratch/` 与 `docs/requirements/tickets/` 只作为旧路径迁移来源。
|
|
51
|
-
- 小改动和中等变更允许同一独立执行者完成 Review 与 fresh verification;该执行者不得是实现者。新模块、高风险或职责冲突时拆分 Reviewer 与 Verifier。
|
|
52
|
-
- 进入 `code-review` 前必须持久化或明确传入 `review_mode`、`review_base_ref`、`candidate_snapshot_ref`、`candidate_digest` 和完整候选引用;`worktree` 模式必须一次捕获 committed、staged、unstaged、untracked,并让两个 Reviewer 消费同一快照,不能用只看 `HEAD` 或实时变化的 diff 宣称已审查。候选 manifest 和 `yss-worktree-candidate-v1` 不可变摘要流以 `orchestration-contract.yaml.review_input` 为唯一机器契约。
|
|
53
|
-
- 实现授权不包含 Git 授权。只有用户分别明确给出值为 `true` 的 `commit_authorized` / `push_authorized`、非空 scope 和对应 `*_authorization_ref` 时才执行动作;缺失时只记录 checkpoint 判断,不得把 `implement`、`orchestrate`、当前分支或负责人要求解释成隐含授权。
|
|
54
|
-
- “然后 commit”“做完提交”等自然语言意向不构成上述结构化 Git 授权,不能据此预授权或事后补齐 scope / authorization ref。
|
|
55
|
-
- 连续自动推进期间累积 Ticket/Git 证据,在人工暂停、handoff、进入实现、合并或发布边界集中 checkpoint;不为每个连续经过的概念阶段重复写同类记录。
|
|
56
|
-
- 跨线程、仓库、原型分支或上下文边界时使用 `handoff` 或等价记录。
|
|
57
|
-
- 在 Matt 阶段边界(phase boundary)先按 `Continue → /clear → /handoff → subagent → /compact` 判断上下文动作;只在 checkpoint 记录可选 `phase_boundary` 证据,不新增生命周期状态。
|
|
58
|
-
- `to-questionnaire` 进入结构化 `external-input-required` 暂停;回答回流后必须重新分类影响面并更新权威资产,不能直接恢复下游实现。
|
|
59
|
-
- `wait-what` 只重新解释当前结论,不改变阶段、门禁、Ticket 或 `ready-for-agent` 状态;Agent 无法替代的人工步骤使用显式人工 checkpoint,秘密值不得进入持久化输出。
|
|
60
|
-
- Matt `prototype` 是保留在 `prototype/<name>` 分支的单文件可分享 HTML 主来源;YSS 高保真 HTML 原型仍必须经过 Prototype Review、AntD CLI、浏览器验证和用户确认,两者不得互相替代。
|
|
61
|
-
- 新工作单元返回 `Workflow Execution Result`;旧 `Matt Skill Result` 仅可兼容读取后归一化。`drift`、`new_impacts`、`violation`、`stale_candidates`、缺失证据或不完整结果不得推进为 `completed`。
|
|
62
|
-
|
|
63
|
-
### 原型完成后的后端脚手架与代码生成边界
|
|
64
|
-
|
|
65
|
-
`prototype_confirmation` 是产品设计门禁,不是业务实现授权。后端新工程的顺序固定为:工程基线 → `yss-router` 编译脚手架合同 draft → 生命周期批准/持久化 → `yss-ddd-scaffold-generator` → `yss-backend-scaffold-parent` → `yss-router` 合同重编译 → 垂直切片实现。
|
|
66
|
-
|
|
67
|
-
- `scaffold_status=required` 时,脚手架工作单元使用 `controlled-generation`,记录项目名、基础包名、输出目录、数据库类型、预期文件和实际 `./mvnw validate`、`./mvnw test`、`./mvnw package` 结果,并返回 YSS Skill Execution Result。
|
|
68
|
-
- 脚手架合同必须结构化记录 `contract_id`、`contract_version`、`slice_id`、Router draft 引用、生命周期批准引用、持久化引用、当前版本、实现仓库、允许写路径、预期证据文件和验证命令;生命周期批准记录至少包含 `approval_ref`、`approver`、`persisted_ref`、`current_version`。
|
|
69
|
-
- `yss-ddd-scaffold-generator` 必须读取已持久化的结构化脚手架合同 JSON,并校验 `status=approved`、当前版本、主 skill、`controlled-generation` 和固定验证命令;只传任意字符串引用不得放行。
|
|
70
|
-
- 生成项目必须包含 `.yss/scaffold-generation.json`,回勾实际使用的合同 ID、版本、Router draft 引用、生命周期批准引用、持久化引用、生成输入、受控模式和固定验证命令;元数据清单缺失或过期时阻断后续 Router。
|
|
71
|
-
- 三条 `./mvnw` 命令必须由受控工作单元真实执行,并记录每条命令的 `exit_code`、`duration_ms`、stdout/stderr 引用和执行时间;生成器打印的命令、输出目录存在或“生成成功”都不构成验证证据。
|
|
72
|
-
- 脚手架只生成多模块工程结构、POM、配置、Wrapper 和经验证的机械模板;不得生成或承载领域规则、状态机、权限、事务、复杂查询、错误映射或用户可见业务行为。
|
|
73
|
-
- 该生命周期脚手架工作单元必须关闭 `--with-example`,不得把 User CRUD 或业务字段伪装成样板;目标目录非空时 `--force` 默认阻断,只有覆盖范围、备份、回滚点和明确批准全部进入合同后才能另行审查。
|
|
74
|
-
- `scaffold_status=existing` 或 `initialized` 时不重复全量生成,但仍须完成 `yss-backend-scaffold-parent` 基线证据、Wrapper 校验和 `yss-router` 合同重编译。
|
|
75
|
-
- 脚手架完成不等于实现仓库接入、架构放行、契约批准或 `ready-for-agent`。后续每一个 Agent / generator 写入的后端代码都必须绑定批准合同和对应 YSS skill;业务行为只能使用 `behavior-tdd`,机械生成才可使用 `controlled-generation`。
|
|
76
|
-
|
|
77
|
-
| 压力诱因 | 统一裁决 |
|
|
78
|
-
|---|---|
|
|
79
|
-
| “普通 action、SQL / DDL 或下载也要补安全姿态吗” | 不补。没有明确的安全 / 权限行为需求时只按实际 API、Data 或工程影响推进;明确改变相关行为时也只复用普通产物和门禁。 |
|
|
80
|
-
| “延期项先不写责任人和目标版本,之后再补” | 阻断 `seam-deferred`;必须写风险、责任人、后续 Ticket、验证计划和目标版本 / 发布日期。 |
|
|
81
|
-
| “脚手架本来就是 YSS,先生成代码再补合同” | 先阻断;Router draft 不能批准合同或替代生命周期放行。 |
|
|
82
|
-
| “`./mvnw validate` 已通过,直接继续最省时间” | 只证明工程基线可验证,不证明业务、事务或契约已获批;三条实际命令的结果还必须进入 Execution Result。 |
|
|
83
|
-
| “后续代码也是生成物,不需要重新路由” | 只要写入业务代码,就必须重新消费当前 Slice Implementation Contract 和 YSS skill 闭包。 |
|
|
84
|
-
| “发布窗口快结束了,可以把业务字段放进脚手架” | 时间、上级要求、已有产出和演示压力都不能放宽禁止模式;必须拆为 `behavior-tdd` 工作单元。 |
|
|
85
|
-
|
|
86
|
-
**红旗:** 输出目录存在、脚手架成功、只打印了 `./mvnw` 命令、`validate` 通过、Router 只有 draft、或生成器参数中出现业务字段 / 权限 / 事务 / 状态机,均不足以继续业务实现;命中任一项即暂停并重路由。
|
|
87
|
-
|
|
88
|
-
**项目路径策略:** 在 Harness 内生成项目时,先确认目标属于 `apps/backend/<project>/` 或 `apps/frontend/<project>/`;把 `apps/backend/`、`apps/frontend/` 当作项目根,或把单数 `app/backend/`、`app/frontend/` 当作等价路径,均属于路径违规并阻断。
|
|
89
|
-
|
|
90
|
-
状态和依赖规则见 [state-model.md](references/state-model.md) 与 [artifact-dependencies.md](references/artifact-dependencies.md);Matt/YSS 对应见 [matt-yss-adapter.md](references/matt-yss-adapter.md)。
|
|
91
|
-
机器可执行的模式、readiness、Wayfinder、影响传播和回流字段见 [orchestration-contract.yaml](references/orchestration-contract.yaml)。说明文档与该契约冲突时必须暂停并修订权威资产,不得猜测。
|
|
92
|
-
|
|
93
|
-
## 输出
|
|
94
|
-
|
|
95
|
-
始终输出:模式、当前阶段、影响面、证据、资产/门禁状态、阻塞项、本轮动作、下一工作单元、暂停或继续理由、Ticket 同步和 Git checkpoint 判断;追加 `Workflow Execution Result`,并注明 workflow reference 或实际 model-invoked skill。
|
|
96
|
-
|
|
97
|
-
暂停时只提出一个具体人工决策,并给出推荐答案与确认后的恢复动作。`audit`/`route` 不得写文件、Ticket、标签或 Git。
|
|
8
|
+
这是生命周期主控 skill:负责识别阶段、判定影响面、检查产物与门禁、选择下一工作单元并验收结果。业务实现必须交给对应的 Matt/YSS 专项 skill;本 skill 不替代它们。
|
|
9
|
+
|
|
10
|
+
## 入口与边界
|
|
11
|
+
|
|
12
|
+
1. 先读取 `yss-project.yaml`、`CONTEXT.md`、相关 ADR、父 Ticket/checkpoint 和当前资产。
|
|
13
|
+
2. `repository_mode=template-source` 只走模板维护流程;命中产品流程时返回 `blocked: template-source-product-artifact-forbidden`,不得生成产品 Spec、原型、OpenAPI 或切片 Ticket。
|
|
14
|
+
3. `repository_mode=project-instance` 以 `docs/process/lifecycle-registry.yaml`、`harness-process-tailoring.md` 和本目录 references 为唯一阶段、门禁和裁剪事实源。
|
|
15
|
+
4. 模式:`route` 只读规划;`orchestrate` 有界推进;`resume` 重建后推进;`audit` 严格只读。未明确时使用 `route`。
|
|
16
|
+
|
|
17
|
+
Matt 的 `grill-with-docs`、`to-spec`、`to-tickets`、`implement` 等保留为显式兼容入口;默认路径是本 skill 持有的原生工作单元,由本编排器创建正式资产、维护状态并在四类人工门禁暂停。兼容入口不得自动调用它们或代替其创建正式资产;Matt 只导航,不得写生命周期资产或改变门禁/Ticket 状态;任何写入前回交本编排器。
|
|
18
|
+
|
|
19
|
+
## 不可裁剪的主链
|
|
20
|
+
|
|
21
|
+
机会调研/需求分析 → Spec/功能架构 → 产品设计与原型 → 技术分析(系统、数据、API、工程基线)→ Ticket 正式化 → 垂直切片实现(前后端 TDD)→ 独立 code review 与 fresh verification → 发布/复盘。
|
|
22
|
+
|
|
23
|
+
裁剪只允许将未命中的条件门禁标记为 `not-applicable` 并写原因;不得删除主阶段、已命中的门禁或必需产物。阶段是否完成取决于“内容 + 审查结论 + 上游新鲜度 + 可读证据”,文件存在不算通过。
|
|
24
|
+
|
|
25
|
+
## 阶段路由与技能
|
|
26
|
+
|
|
27
|
+
| 阶段 | 必需产物/门禁 | 工作单元与技能 | 通过条件 |
|
|
28
|
+
|---|---|---|---|
|
|
29
|
+
| 入口分诊 | 身份、影响面、最近可信阶段 | `yss-product-lifecycle` | `yss-project.yaml` 合法且影响面可解释 |
|
|
30
|
+
| 机会调研/需求分析 | Discovery、用户/MVP/非目标/成功标准、测试 seam | `work-unit.discovery-opportunity` + `work-unit.discovery-requirements`;市场/竞品事实用 `competitive-intelligence`,技术/标准事实用 `research`;`grill-with-docs` 为兼容入口 | 未决事实已 research 或 handoff,用户确认,无 runnable blocker |
|
|
31
|
+
| Spec/功能架构 | Spec、产品总体设计、功能架构;必要时 Spec Delta | 原生 `work-unit.spec-synthesis`;`to-spec` 为兼容入口 | 初稿先为 `ready-for-human`;只有 Spec baseline 人工批准后资产才为 `approved` 并进入下游 |
|
|
32
|
+
| 原型设计 | 交互说明、低保真、状态矩阵、高保真 HTML、评审记录 | `yss-design-system` → `yss-prototype-stage` → Codex `product-design:index`(非 Codex 交付等价合同) | `gate.prototype-reviewed`、`gate.prototype-verified`、`gate.user-confirmation` 均有证据 |
|
|
33
|
+
| 技术分析 | OpenAPI Draft/Freeze、数据架构、工程基线、架构审查 | `yss-openapi-governance` / `yss-openapi-draft-review`、`codebase-design`、`implementation-repo-onboarding`、`yss-router` | API/架构契约冻结;无 API 影响有明确记录;脚手架策略满足 |
|
|
34
|
+
| Ticket 正式化 | 功能父 Ticket、垂直切片、Slice Implementation Contract | 原生 `work-unit.ticket-decomposition`;`to-tickets` 为兼容入口;生命周期复算 | 依赖、验收、测试 seam 可执行;合同已批准、持久化且为当前版本 |
|
|
35
|
+
| 技术实现 | 前端/后端代码、TDD 证据、YSS Skill Execution Result | 原生 `work-unit.slice-implementation`;`implement` 为兼容入口;前端按 `yss-ui` + `yss-page-module-development`,后端按 `yss-router` 最小闭包,业务行为统一 `tdd` | 只写允许路径;业务行为用 `behavior-tdd`;UI 影响必须有还原计划 |
|
|
36
|
+
| Review/验证 | 不可变候选快照、review 结论、fresh verification | `code-review`(独立于实现者);UI 影响追加 `yss-ui` + `yss-design-system` 的 UI fidelity 轴 | findings 已处理;同一候选快照通过全部审查轴与验证 |
|
|
37
|
+
| 发布/复盘 | 发布/回滚证据、复盘记录 | 生命周期自有工作单元 | fresh verification、独立审查和人工发布裁决齐全 |
|
|
38
|
+
|
|
39
|
+
## 前端实现还原硬检查
|
|
40
|
+
|
|
41
|
+
原型通过不等于前端实现通过。`ready-for-agent` 前先产生 `frontend_implementation_plan`(原型/Spec、路由与页面清单、桌面/窄屏验收用例、加载/空态/错误/权限/关键交互状态、拟执行的 `pnpm` 命令);实现完成、发布前再产生 `frontend_implementation_verification`,补齐截图或视觉回归、console warning、命令退出码、未覆盖差异与责任人。差异未解释、截图缺失、只做 type-check 或只声称“已对齐”均为 `blocked`;发现新 API、状态或视觉行为时返回 `new_impacts`/`drift` 并重新路由。优先使用 `yss-ui/references/verification.md` 的分层验证和既有 `pnpm` scripts。
|
|
42
|
+
|
|
43
|
+
## 结果与暂停
|
|
44
|
+
|
|
45
|
+
每个工作单元必须返回 `Workflow Execution Result`(workflow reference、skill、changed files、evidence refs、actual verification、deferred seams、drift/new impacts)。缺少可读证据、`stale`、`violation`、`drift`、`new_impacts` 或阻塞信号时不得标记 completed。实现授权不包含 Git commit/push 授权;“做完提交”等自然语言意向不构成上述结构化 Git 授权。
|
|
46
|
+
|
|
47
|
+
输出固定包含:模式、当前阶段、影响面、资产/门禁状态、证据、阻塞项、本轮动作、下一工作单元、暂停/继续理由、Ticket 同步和 Git checkpoint 判断。暂停时只提出一个具体人工决策,并给出推荐答案与恢复动作。
|
|
48
|
+
|
|
49
|
+
详细执行循环、readiness、脚手架(包括 `controlled-generation`)、审查快照、状态传播和 Matt 边界见 [orchestration.md](references/orchestration.md)、[orchestration-contract.yaml](references/orchestration-contract.yaml)、[artifact-dependencies.md](references/artifact-dependencies.md) 和 [state-model.md](references/state-model.md)。
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
Matt skills 决定如何工作;YSS 生命周期决定是否允许推进;YSS 专项 skills 决定如何符合工程规范。
|
|
4
4
|
|
|
5
|
+
生命周期默认使用 `work_unit_routes.*.native`;下表中的 Matt flow 是 `work_unit_routes.*.compatibility` 显式兼容输入。兼容入口的正式资产由用户创建并回交生命周期验收,原生工作单元的正式资产由生命周期编排器创建。
|
|
6
|
+
|
|
5
7
|
## 入口与仓库身份裁决
|
|
6
8
|
|
|
7
9
|
- 所有入口先读取 `yss-project.yaml`。缺失、解析失败、schema 不支持或 `repository_mode` 非法时,停止路由并进入 migration-check。
|
|
8
10
|
- **直接调用 `ask-matt`** 时,它只能提供通用 Matt flow 导航,不得写生命周期资产、改变门禁或 Ticket 状态;有效 YSS 仓库必须在任何写入前把最终阶段、影响面、门禁和状态裁决交回 `yss-product-lifecycle`。
|
|
9
11
|
- **直接调用生命周期管理的 Matt user-invoked skill**(`setup-matt-pocock-skills`、`grill-with-docs`、`to-spec`、`to-tickets`、`implement`)时,用户仍是正式资产的创建者;生命周期先校验前置条件,再接受结果并重新计算阶段、门禁和状态。它们不适用 `ask-matt` 的 `navigate-only` 限制。其他 user-invoked skill 同样不得由生命周期自动调用;只有在其专属适配合同存在时才进入 YSS 流程。
|
|
10
|
-
- **直接调用 `yss-product-lifecycle`** 时,不机械嵌套调用任何 Matt user-invoked skill
|
|
12
|
+
- **直接调用 `yss-product-lifecycle`** 时,不机械嵌套调用任何 Matt user-invoked skill;编排器直接使用原生工作单元和允许的 model-invoked 原语。Matt user-invoked skill 保持显式兼容入口,生命周期负责准备、校验并验收其结果。
|
|
11
13
|
- `template-source` 只允许进入模板维护流程。命中 `to-spec`、`to-tickets`、`implement`、Release 或 Retrospective 时返回 `blocked`,原因是 `template-source-product-artifact-forbidden`;`ask-matt` 和 `setup-matt-pocock-skills` 都不得为具体产品生成 Spec、prototype、OpenAPI 或垂直切片 Ticket。
|
|
12
14
|
- `project-instance` 才允许进入产品 Discovery → Spec → 设计 → 契约 → Ticket → 实现 → Release / Retrospective 链路。
|
|
13
15
|
|
|
@@ -20,9 +22,9 @@ Matt skills 决定如何工作;YSS 生命周期决定是否允许推进;YSS
|
|
|
20
22
|
| 大型模糊工作 | `wayfinder` | map 真正完成后 `handoff → to-spec` |
|
|
21
23
|
| 技术事实 | `research` | 一手资料回填 Spec/OpenAPI/架构/ADR |
|
|
22
24
|
| runnable 问题 | `prototype` | 生成单文件可分享 HTML,保留 `prototype/<name>` 分支作为主来源;必须 source/return handoff 和结论回填,不得替代阶段 4 的低保真评审、Ant Design v6 高保真 HTML、AntD CLI 证据和用户确认 |
|
|
23
|
-
| Spec 综合 | `to-spec
|
|
24
|
-
| 切片 | `to-tickets
|
|
25
|
-
| 实现 | `implement
|
|
25
|
+
| Spec 综合 | 原生 `work-unit.spec-synthesis`;`to-spec`(用户显式兼容) | 初稿进入 `ready-for-human`,不得直接实现 |
|
|
26
|
+
| 切片 | 原生 `work-unit.ticket-decomposition`;`to-tickets`(用户显式兼容) | 仅在冻结/无影响记录后拆垂直切片,初始角色为 `ready-for-human` |
|
|
27
|
+
| 实现 | 原生 `work-unit.slice-implementation`;`implement`(用户显式兼容) | 当前合同批准并持久化后执行;内部使用 `tdd`,结果回交后再次核验 |
|
|
26
28
|
| Bug | `diagnosing-bugs`、`tdd` | 先建立红色反馈;高风险影响升级上游门禁 |
|
|
27
29
|
| 审查 | `code-review` | 唯一默认代码审查入口;审查者独立,结合 Spec、仓库治理规则和 YSS 标准 |
|
|
28
30
|
| 跨上下文 | `handoff` | 保存来源、阶段、未决项、命令和下一责任人 |
|
|
@@ -60,7 +62,7 @@ blocking_signals: []
|
|
|
60
62
|
|
|
61
63
|
Router 状态映射为:`draft → completed`、`blocked → blocked`、`ready-for-lifecycle-review → needs-human`。这里的 `completed` 只表示 Matt 工作单元已产出可验收结果,不表示生命周期完成或可发布。
|
|
62
64
|
|
|
63
|
-
`completed` 的 `evidence_refs`
|
|
65
|
+
`completed` 的 `evidence_refs` 至少包含一条可读取或可解析的证据引用;只有字段存在但为空,不能证明工作单元完成。兼容入口下的正式 Spec、Ticket 或实现资产仍只能由对应显式用户入口创建;原生工作单元由生命周期编排器创建并持有状态。
|
|
64
66
|
|
|
65
67
|
## Matt flow 前置条件
|
|
66
68
|
|