create-yss-spec 2.1.3 → 2.1.5
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/template/.agents/skills/code-review/SKILL.md +38 -10
- package/template/.agents/skills/high-fidelity-html-prototype/SKILL.md +16 -12
- package/template/.agents/skills/product-design-prototype/SKILL.md +6 -2
- package/template/.agents/skills/prototype-review/SKILL.md +6 -2
- package/template/.agents/skills/wireframe-prototype/SKILL.md +5 -1
- package/template/.agents/skills/yss-api-integration/SKILL.md +25 -7
- package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +3 -17
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +0 -30
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.py +1 -21
- package/template/.agents/skills/yss-design-system/SKILL.md +6 -5
- package/template/.agents/skills/yss-frontend-scaffold-generator/SKILL.md +12 -6
- package/template/.agents/skills/yss-openapi-draft-review/SKILL.md +13 -17
- package/template/.agents/skills/yss-openapi-governance/SKILL.md +89 -114
- package/template/.agents/skills/yss-openapi-governance/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +13 -7
- package/template/.agents/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +8 -2
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +77 -30
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +7 -2
- package/template/.agents/skills/yss-product-lifecycle/references/state-model.md +8 -0
- package/template/.agents/skills/yss-prototype-stage/SKILL.md +40 -0
- package/template/.agents/skills/yss-router/SKILL.md +2 -2
- package/template/.agents/skills/yss-router/references/router-contract.yaml +9 -8
- package/template/.agents/skills/yss-router/references/slice-implementation-contract.md +4 -1
- package/template/.agents/skills/yss-router/references/yss-skill-execution-result.md +2 -1
- package/template/.claude/skills/code-review/SKILL.md +38 -10
- package/template/.claude/skills/high-fidelity-html-prototype/SKILL.md +16 -12
- package/template/.claude/skills/product-design-prototype/SKILL.md +6 -2
- package/template/.claude/skills/prototype-review/SKILL.md +6 -2
- package/template/.claude/skills/wireframe-prototype/SKILL.md +5 -1
- package/template/.claude/skills/yss-api-integration/SKILL.md +25 -7
- package/template/.claude/skills/yss-ddd-scaffold-generator/SKILL.md +3 -17
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +0 -30
- package/template/.claude/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.py +1 -21
- package/template/.claude/skills/yss-design-system/SKILL.md +6 -5
- package/template/.claude/skills/yss-frontend-scaffold-generator/SKILL.md +12 -6
- package/template/.claude/skills/yss-openapi-draft-review/SKILL.md +13 -17
- package/template/.claude/skills/yss-openapi-governance/SKILL.md +89 -114
- package/template/.claude/skills/yss-openapi-governance/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +13 -7
- package/template/.claude/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +8 -2
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +77 -30
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +7 -2
- package/template/.claude/skills/yss-product-lifecycle/references/state-model.md +8 -0
- package/template/.claude/skills/yss-prototype-stage/SKILL.md +40 -0
- package/template/.claude/skills/yss-router/SKILL.md +2 -2
- package/template/.claude/skills/yss-router/references/router-contract.yaml +9 -8
- package/template/.claude/skills/yss-router/references/slice-implementation-contract.md +4 -1
- package/template/.claude/skills/yss-router/references/yss-skill-execution-result.md +2 -1
- package/template/.codex/skills/code-review/SKILL.md +38 -10
- package/template/.codex/skills/high-fidelity-html-prototype/SKILL.md +16 -12
- package/template/.codex/skills/product-design-prototype/SKILL.md +6 -2
- package/template/.codex/skills/prototype-review/SKILL.md +6 -2
- package/template/.codex/skills/wireframe-prototype/SKILL.md +5 -1
- package/template/.codex/skills/yss-api-integration/SKILL.md +25 -7
- package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +3 -17
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +0 -30
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.py +1 -21
- package/template/.codex/skills/yss-design-system/SKILL.md +6 -5
- package/template/.codex/skills/yss-frontend-scaffold-generator/SKILL.md +12 -6
- package/template/.codex/skills/yss-openapi-draft-review/SKILL.md +13 -17
- package/template/.codex/skills/yss-openapi-governance/SKILL.md +89 -114
- package/template/.codex/skills/yss-openapi-governance/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +13 -7
- package/template/.codex/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +8 -2
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +77 -30
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +7 -2
- package/template/.codex/skills/yss-product-lifecycle/references/state-model.md +8 -0
- package/template/.codex/skills/yss-prototype-stage/SKILL.md +40 -0
- package/template/.codex/skills/yss-router/SKILL.md +2 -2
- package/template/.codex/skills/yss-router/references/router-contract.yaml +9 -8
- package/template/.codex/skills/yss-router/references/slice-implementation-contract.md +4 -1
- package/template/.codex/skills/yss-router/references/yss-skill-execution-result.md +2 -1
- package/template/.hermes/skills/code-review/SKILL.md +38 -10
- package/template/.hermes/skills/high-fidelity-html-prototype/SKILL.md +16 -12
- package/template/.hermes/skills/product-design-prototype/SKILL.md +6 -2
- package/template/.hermes/skills/prototype-review/SKILL.md +6 -2
- package/template/.hermes/skills/wireframe-prototype/SKILL.md +5 -1
- package/template/.hermes/skills/yss-api-integration/SKILL.md +25 -7
- package/template/.hermes/skills/yss-ddd-scaffold-generator/SKILL.md +3 -17
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +0 -30
- package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.py +1 -21
- package/template/.hermes/skills/yss-design-system/SKILL.md +6 -5
- package/template/.hermes/skills/yss-frontend-scaffold-generator/SKILL.md +12 -6
- package/template/.hermes/skills/yss-openapi-draft-review/SKILL.md +13 -17
- package/template/.hermes/skills/yss-openapi-governance/SKILL.md +89 -114
- package/template/.hermes/skills/yss-openapi-governance/agents/openai.yaml +2 -2
- package/template/.hermes/skills/yss-product-lifecycle/SKILL.md +13 -7
- package/template/.hermes/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +8 -2
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration-contract.yaml +77 -30
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +7 -2
- package/template/.hermes/skills/yss-product-lifecycle/references/state-model.md +8 -0
- package/template/.hermes/skills/yss-prototype-stage/SKILL.md +40 -0
- package/template/.hermes/skills/yss-router/SKILL.md +2 -2
- package/template/.hermes/skills/yss-router/references/router-contract.yaml +9 -8
- package/template/.hermes/skills/yss-router/references/slice-implementation-contract.md +4 -1
- package/template/.hermes/skills/yss-router/references/yss-skill-execution-result.md +2 -1
- package/template/.pi/skills/code-review/SKILL.md +38 -10
- package/template/.pi/skills/high-fidelity-html-prototype/SKILL.md +16 -12
- package/template/.pi/skills/product-design-prototype/SKILL.md +6 -2
- package/template/.pi/skills/prototype-review/SKILL.md +6 -2
- package/template/.pi/skills/wireframe-prototype/SKILL.md +5 -1
- package/template/.pi/skills/yss-api-integration/SKILL.md +25 -7
- package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +3 -17
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +0 -30
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.py +1 -21
- package/template/.pi/skills/yss-design-system/SKILL.md +6 -5
- package/template/.pi/skills/yss-frontend-scaffold-generator/SKILL.md +12 -6
- package/template/.pi/skills/yss-openapi-draft-review/SKILL.md +13 -17
- package/template/.pi/skills/yss-openapi-governance/SKILL.md +89 -114
- package/template/.pi/skills/yss-openapi-governance/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +13 -7
- package/template/.pi/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +8 -2
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +77 -30
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +7 -2
- package/template/.pi/skills/yss-product-lifecycle/references/state-model.md +8 -0
- package/template/.pi/skills/yss-prototype-stage/SKILL.md +40 -0
- package/template/.pi/skills/yss-router/SKILL.md +2 -2
- package/template/.pi/skills/yss-router/references/router-contract.yaml +9 -8
- package/template/.pi/skills/yss-router/references/slice-implementation-contract.md +4 -1
- package/template/.pi/skills/yss-router/references/yss-skill-execution-result.md +2 -1
- package/template/.qoder/skills/code-review/SKILL.md +38 -10
- package/template/.qoder/skills/high-fidelity-html-prototype/SKILL.md +16 -12
- package/template/.qoder/skills/product-design-prototype/SKILL.md +6 -2
- package/template/.qoder/skills/prototype-review/SKILL.md +6 -2
- package/template/.qoder/skills/wireframe-prototype/SKILL.md +5 -1
- package/template/.qoder/skills/yss-api-integration/SKILL.md +25 -7
- package/template/.qoder/skills/yss-ddd-scaffold-generator/SKILL.md +3 -17
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +0 -30
- package/template/.qoder/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.py +1 -21
- package/template/.qoder/skills/yss-design-system/SKILL.md +6 -5
- package/template/.qoder/skills/yss-frontend-scaffold-generator/SKILL.md +12 -6
- package/template/.qoder/skills/yss-openapi-draft-review/SKILL.md +13 -17
- package/template/.qoder/skills/yss-openapi-governance/SKILL.md +89 -114
- package/template/.qoder/skills/yss-openapi-governance/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +13 -7
- package/template/.qoder/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +8 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +77 -30
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +7 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/state-model.md +8 -0
- package/template/.qoder/skills/yss-prototype-stage/SKILL.md +40 -0
- package/template/.qoder/skills/yss-router/SKILL.md +2 -2
- package/template/.qoder/skills/yss-router/references/router-contract.yaml +9 -8
- package/template/.qoder/skills/yss-router/references/slice-implementation-contract.md +4 -1
- package/template/.qoder/skills/yss-router/references/yss-skill-execution-result.md +2 -1
- package/template/.trae/skills/code-review/SKILL.md +38 -10
- package/template/.trae/skills/high-fidelity-html-prototype/SKILL.md +16 -12
- package/template/.trae/skills/product-design-prototype/SKILL.md +6 -2
- package/template/.trae/skills/prototype-review/SKILL.md +6 -2
- package/template/.trae/skills/wireframe-prototype/SKILL.md +5 -1
- package/template/.trae/skills/yss-api-integration/SKILL.md +25 -7
- package/template/.trae/skills/yss-ddd-scaffold-generator/SKILL.md +3 -17
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/pom/bootstrap-pom.xml.template +0 -30
- package/template/.trae/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +1 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.py +1 -21
- package/template/.trae/skills/yss-design-system/SKILL.md +6 -5
- package/template/.trae/skills/yss-frontend-scaffold-generator/SKILL.md +12 -6
- package/template/.trae/skills/yss-openapi-draft-review/SKILL.md +13 -17
- package/template/.trae/skills/yss-openapi-governance/SKILL.md +89 -114
- package/template/.trae/skills/yss-openapi-governance/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +13 -7
- package/template/.trae/skills/yss-product-lifecycle/references/artifact-dependencies.md +2 -2
- package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +8 -2
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +77 -30
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +7 -2
- package/template/.trae/skills/yss-product-lifecycle/references/state-model.md +8 -0
- package/template/.trae/skills/yss-prototype-stage/SKILL.md +40 -0
- package/template/.trae/skills/yss-router/SKILL.md +2 -2
- package/template/.trae/skills/yss-router/references/router-contract.yaml +9 -8
- package/template/.trae/skills/yss-router/references/slice-implementation-contract.md +4 -1
- package/template/.trae/skills/yss-router/references/yss-skill-execution-result.md +2 -1
- package/template/AGENTS.md +7 -5
- package/template/CONTEXT.md +15 -1
- package/template/README.md +2 -1
- package/template/__yss_dotfile__.gitignore +4 -0
- package/template/docs/adr/0001-product-design-prototype-entrypoint.md +1 -1
- package/template/docs/adr/0003-machine-readable-lifecycle-registry.md +5 -0
- package/template/docs/adr/0004-split-lifecycle-and-router-registry-domains.md +5 -0
- package/template/docs/adr/0005-cross-repository-ecosystem-release-manifest.md +5 -0
- package/template/docs/adr/0006-stable-lifecycle-ids-and-generated-structure.md +5 -0
- package/template/docs/adr/0007-separate-skill-routing-registry-from-integrity-lock.md +5 -0
- package/template/docs/agents/issue-tracker.md +1 -0
- package/template/docs/api/templates/openapi-draft-review-checklist.md +8 -6
- package/template/docs/api/templates/openapi-freeze-record-template.md +8 -2
- package/template/docs/api/templates/openapi-json-export-record-template.md +60 -0
- package/template/docs/architecture/templates/architecture-review-checklist.md +6 -19
- package/template/docs/architecture/templates/functional-architecture-template.md +4 -4
- package/template/docs/architecture/templates/system-overview-design-template.md +10 -5
- package/template/docs/architecture/templates/tech-design-template.md +4 -11
- package/template/docs/design/README.md +4 -2
- package/template/docs/design/design.md +4 -0
- package/template/docs/design/templates/interaction-spec-template.md +3 -3
- package/template/docs/design/templates/prototype-confirmation-template.md +9 -6
- package/template/docs/design/templates/prototype-evidence-template.yaml +46 -0
- package/template/docs/design/templates/prototype-review-checklist.md +4 -4
- package/template/docs/discovery/templates/discovery-template.md +0 -1
- package/template/docs/implementation/create-yss-spec-repository-mode-contract.md +2 -2
- package/template/docs/process/harness-process-tailoring.md +2 -0
- package/template/docs/process/harness-work-unit-map.md +14 -10
- package/template/docs/process/lifecycle-artifact-map.md +84 -39
- package/template/docs/process/lifecycle-registry-baseline.json +70 -0
- package/template/docs/process/lifecycle-registry.yaml +289 -0
- package/template/docs/process/schemas/lifecycle-registry.schema.json +35 -0
- package/template/docs/reviews/lifecycle-registry-phase0-1-red-green-2026-08-17.md +61 -0
- package/template/docs/reviews/matt-yss-p0-ticket-review-git-red-green-2026-08-17.md +91 -0
- package/template/docs/reviews/openapi-skill-primary-source-research-2026-08-16.md +76 -0
- package/template/docs/reviews/openapi-yaml-first-independent-review-2026-08-16.md +121 -0
- package/template/docs/reviews/openapi-yaml-first-pressure-scenarios-2026-08-16.md +191 -0
- package/template/docs/reviews/openapi-yaml-first-red-green-2026-08-16.md +76 -0
- package/template/docs/reviews/openapi-yaml-json-output-independent-review-2026-08-16.md +30 -0
- package/template/docs/reviews/openapi-yaml-json-output-scope-red-green-2026-08-16.md +154 -0
- package/template/docs/reviews/research-create-yss-spec-refresh-2026-08-16.md +164 -0
- package/template/docs/reviews/security-permission-lifecycle-simplification-red-green-2026-08-16.md +43 -0
- package/template/docs/reviews/template-release-review-remediation-red-green-2026-08-17.md +41 -0
- package/template/docs/templates/agent-brief-template.md +2 -2
- package/template/docs/templates/build-architecture-checklist-template.md +3 -4
- package/template/docs/templates/implementation-repo-registry-template.md +0 -2
- package/template/docs/templates/implementation-routing-template.md +6 -6
- package/template/docs/templates/openapi-spec-template.yaml +0 -6
- package/template/docs/templates/review-report-template.md +2 -1
- package/template/docs/templates/spec-delta-template.md +1 -1
- package/template/docs/templates/spec-template.md +0 -1
- package/template/docs/templates/vertical-slice-ticket-template.md +2 -2
- package/template/docs/user-guide//344/272/247/345/223/201/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201.md +6 -6
- package/template/docs/user-guide//344/272/247/345/223/201/347/240/224/345/217/221/345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/346/234/200/344/275/263/345/256/236/350/267/265.md +3 -3
- package/template/docs/user-guide//345/244/226/351/203/250/345/221/275/344/273/244/350/241/214/345/267/245/345/205/267/345/256/236/350/267/265/346/214/207/345/215/227.md +1 -1
- package/template/docs/user-guide//347/224/237/345/221/275/345/221/250/346/234/237/346/234/200/344/275/263/345/256/236/350/267/265.md +1 -1
- package/template/scripts/generate-lifecycle-artifacts +26 -0
- package/template/scripts/lifecycle-registry.rb +194 -0
- package/template/scripts/sync-skills +1 -0
- package/template/scripts/test-export-yss-skills.rb +10 -6
- package/template/scripts/test-lifecycle-registry.rb +74 -0
- package/template/scripts/update-skill-lock +1 -0
- package/template/scripts/verify-governance-release +39 -0
- package/template/scripts/verify-lifecycle-registry +67 -0
- package/template/scripts/verify-lifecycle-scenarios +193 -23
- package/template/scripts/verify-matt-yss-integration-scenarios +297 -1
- package/template/scripts/verify-openapi-json-handoff-scenarios +270 -0
- package/template/scripts/verify-openapi-yaml-first-scenarios +120 -0
- package/template/scripts/verify-prototype-backend-scaffold-scenarios +26 -4
- package/template/scripts/verify-template +27 -3
- package/template/scripts/verify-yss-router-scenarios +51 -14
- package/template/skills-lock.json +25 -25
- package/template/wiki/raw/skills-lock.json +0 -15
- package/template/wiki/wiki/OpenAPI/345/245/221/347/272/246.md +1 -1
- package/template/wiki/wiki/YSS/345/267/245/347/250/213/346/212/200/350/203/275/344/275/223/347/263/273.md +1 -1
- package/template/yss-public-skills.json +5 -5
- package/template.snapshot.json +4 -4
- package/template/.agents/skills/yss-ddd-scaffold-generator/assets/templates/config/smart-doc.json.template +0 -17
- package/template/.agents/skills/yss-openapi/SKILL.md +0 -116
- package/template/.agents/skills/yss-openapi/agents/openai.yaml +0 -4
- package/template/.agents/skills/yss-openapi/img.png +0 -0
- package/template/.agents/skills/yss-openapi/img_1.png +0 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/assets/templates/config/smart-doc.json.template +0 -17
- package/template/.claude/skills/yss-openapi/SKILL.md +0 -116
- package/template/.claude/skills/yss-openapi/agents/openai.yaml +0 -4
- package/template/.claude/skills/yss-openapi/img.png +0 -0
- package/template/.claude/skills/yss-openapi/img_1.png +0 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/assets/templates/config/smart-doc.json.template +0 -17
- package/template/.codex/skills/yss-openapi/SKILL.md +0 -116
- package/template/.codex/skills/yss-openapi/agents/openai.yaml +0 -4
- package/template/.codex/skills/yss-openapi/img.png +0 -0
- package/template/.codex/skills/yss-openapi/img_1.png +0 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/assets/templates/config/smart-doc.json.template +0 -17
- package/template/.hermes/skills/yss-openapi/SKILL.md +0 -116
- package/template/.hermes/skills/yss-openapi/agents/openai.yaml +0 -4
- package/template/.hermes/skills/yss-openapi/img.png +0 -0
- package/template/.hermes/skills/yss-openapi/img_1.png +0 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/assets/templates/config/smart-doc.json.template +0 -17
- package/template/.pi/skills/yss-openapi/SKILL.md +0 -116
- package/template/.pi/skills/yss-openapi/agents/openai.yaml +0 -4
- package/template/.pi/skills/yss-openapi/img.png +0 -0
- package/template/.pi/skills/yss-openapi/img_1.png +0 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/assets/templates/config/smart-doc.json.template +0 -17
- package/template/.qoder/skills/yss-openapi/SKILL.md +0 -116
- package/template/.qoder/skills/yss-openapi/agents/openai.yaml +0 -4
- package/template/.qoder/skills/yss-openapi/img.png +0 -0
- package/template/.qoder/skills/yss-openapi/img_1.png +0 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/assets/templates/config/smart-doc.json.template +0 -17
- package/template/.trae/skills/yss-openapi/SKILL.md +0 -116
- package/template/.trae/skills/yss-openapi/agents/openai.yaml +0 -4
- package/template/.trae/skills/yss-openapi/img.png +0 -0
- package/template/.trae/skills/yss-openapi/img_1.png +0 -0
|
@@ -2,9 +2,47 @@
|
|
|
2
2
|
# frozen_string_literal: true
|
|
3
3
|
|
|
4
4
|
require "pathname"
|
|
5
|
+
require "set"
|
|
5
6
|
require "yaml"
|
|
6
7
|
|
|
7
8
|
ROOT = Pathname.new(__dir__).join("..").realpath
|
|
9
|
+
REGISTRY = YAML.safe_load(
|
|
10
|
+
ROOT.join("docs/process/lifecycle-registry.yaml").read,
|
|
11
|
+
permitted_classes: [],
|
|
12
|
+
aliases: false
|
|
13
|
+
)
|
|
14
|
+
REGISTRY_IDS = %w[stages gates artifacts work_units evidence].flat_map do |collection|
|
|
15
|
+
REGISTRY.fetch(collection).map { |record| record.fetch("id") }
|
|
16
|
+
end.to_set
|
|
17
|
+
ROUTE_REGISTRY_IDS = {
|
|
18
|
+
"impact-assessment" => "artifact.impact-assessment",
|
|
19
|
+
"ssot-update" => "work-unit.ssot-update",
|
|
20
|
+
"skill-projection-sync" => "work-unit.skill-projection-sync",
|
|
21
|
+
"pressure-scenarios" => "evidence.fresh-verification",
|
|
22
|
+
"fresh-verification" => "work-unit.fresh-verification",
|
|
23
|
+
"independent-review" => "work-unit.independent-review",
|
|
24
|
+
"tracker-sync" => "evidence.checkpoint-and-rollback",
|
|
25
|
+
"spec" => "artifact.spec",
|
|
26
|
+
"product-overview" => "artifact.product-overview",
|
|
27
|
+
"functional-architecture" => "artifact.functional-architecture",
|
|
28
|
+
"interaction-spec" => "artifact.interaction-spec",
|
|
29
|
+
"low-fidelity-prototype" => "artifact.low-fidelity-prototype",
|
|
30
|
+
"state-matrix" => "artifact.state-matrix",
|
|
31
|
+
"prototype-review" => "gate.prototype-reviewed",
|
|
32
|
+
"high-fidelity-html-prototype" => "artifact.high-fidelity-html-prototype",
|
|
33
|
+
"prototype-verification" => "gate.prototype-verified",
|
|
34
|
+
"user-confirmation" => "gate.user-confirmation",
|
|
35
|
+
"openapi-draft" => "artifact.openapi-draft",
|
|
36
|
+
"draft-review" => "gate.openapi-draft-reviewed",
|
|
37
|
+
"design-review" => "gate.design-reviewed",
|
|
38
|
+
"openapi-freeze" => "gate.openapi-frozen",
|
|
39
|
+
"engineering-baseline" => "artifact.engineering-baseline",
|
|
40
|
+
"architecture-review" => "artifact.architecture-review",
|
|
41
|
+
"data-architecture" => "artifact.data-architecture",
|
|
42
|
+
"spec-delta" => "artifact.spec-delta",
|
|
43
|
+
"parent-ticket" => "artifact.parent-ticket",
|
|
44
|
+
"vertical-slice-tickets" => "artifact.vertical-slice-ticket"
|
|
45
|
+
}.freeze
|
|
8
46
|
|
|
9
47
|
def route(facts)
|
|
10
48
|
if facts.fetch(:repository_mode) == "template-source"
|
|
@@ -19,20 +57,26 @@ def route(facts)
|
|
|
19
57
|
end
|
|
20
58
|
|
|
21
59
|
gates = %w[impact-assessment tracker-sync fresh-verification]
|
|
22
|
-
|
|
60
|
+
small_change = facts.fetch(:scale) == :small && !facts.fetch(:high_risk) &&
|
|
61
|
+
!facts.fetch(:ui_impact) && !facts.fetch(:api_impact) &&
|
|
62
|
+
!facts.fetch(:backend_impact) && !facts.fetch(:data_impact)
|
|
63
|
+
return gates if small_change
|
|
23
64
|
|
|
24
65
|
gates.concat(%w[spec product-overview functional-architecture])
|
|
25
66
|
|
|
26
67
|
if facts.fetch(:ui_impact)
|
|
27
68
|
gates.concat(%w[
|
|
69
|
+
interaction-spec
|
|
28
70
|
low-fidelity-prototype
|
|
29
71
|
state-matrix
|
|
72
|
+
prototype-review
|
|
30
73
|
high-fidelity-html-prototype
|
|
74
|
+
prototype-verification
|
|
31
75
|
user-confirmation
|
|
32
76
|
])
|
|
33
77
|
end
|
|
34
78
|
|
|
35
|
-
gates.concat(%w[openapi-draft design-review openapi-freeze]) if facts.fetch(:api_impact)
|
|
79
|
+
gates.concat(%w[openapi-draft draft-review design-review openapi-freeze]) if facts.fetch(:api_impact)
|
|
36
80
|
|
|
37
81
|
if facts.fetch(:backend_impact) || facts.fetch(:high_risk)
|
|
38
82
|
gates.concat(%w[engineering-baseline architecture-review])
|
|
@@ -53,7 +97,7 @@ scenarios = [
|
|
|
53
97
|
data_impact: false, existing_frozen_baseline: true
|
|
54
98
|
},
|
|
55
99
|
required: %w[impact-assessment tracker-sync fresh-verification],
|
|
56
|
-
forbidden: %w[spec product-overview spec-delta high-fidelity-html-prototype]
|
|
100
|
+
forbidden: %w[spec product-overview spec-delta interaction-spec high-fidelity-html-prototype prototype-review prototype-verification]
|
|
57
101
|
},
|
|
58
102
|
{
|
|
59
103
|
name: "纯后端新功能",
|
|
@@ -63,7 +107,17 @@ scenarios = [
|
|
|
63
107
|
data_impact: false, existing_frozen_baseline: false
|
|
64
108
|
},
|
|
65
109
|
required: %w[spec product-overview functional-architecture openapi-draft engineering-baseline parent-ticket vertical-slice-tickets],
|
|
66
|
-
forbidden: %w[low-fidelity-prototype state-matrix high-fidelity-html-prototype user-confirmation spec-delta]
|
|
110
|
+
forbidden: %w[interaction-spec low-fidelity-prototype state-matrix prototype-review high-fidelity-html-prototype prototype-verification user-confirmation spec-delta]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
name: "普通 API 功能无需专项输入",
|
|
114
|
+
facts: {
|
|
115
|
+
repository_mode: "project-instance", scale: :small, high_risk: false,
|
|
116
|
+
ui_impact: false, api_impact: true, backend_impact: true,
|
|
117
|
+
data_impact: false, existing_frozen_baseline: false
|
|
118
|
+
},
|
|
119
|
+
required: %w[spec product-overview functional-architecture openapi-draft draft-review openapi-freeze engineering-baseline parent-ticket vertical-slice-tickets],
|
|
120
|
+
forbidden: %w[interaction-spec low-fidelity-prototype state-matrix prototype-review high-fidelity-html-prototype prototype-verification user-confirmation spec-delta]
|
|
67
121
|
},
|
|
68
122
|
{
|
|
69
123
|
name: "有 UI 的新功能",
|
|
@@ -72,7 +126,7 @@ scenarios = [
|
|
|
72
126
|
ui_impact: true, api_impact: true, backend_impact: true,
|
|
73
127
|
data_impact: false, existing_frozen_baseline: false
|
|
74
128
|
},
|
|
75
|
-
required: %w[spec product-overview low-fidelity-prototype state-matrix high-fidelity-html-prototype user-confirmation openapi-freeze vertical-slice-tickets],
|
|
129
|
+
required: %w[spec product-overview interaction-spec low-fidelity-prototype state-matrix prototype-review high-fidelity-html-prototype prototype-verification user-confirmation openapi-freeze vertical-slice-tickets],
|
|
76
130
|
forbidden: %w[spec-delta]
|
|
77
131
|
},
|
|
78
132
|
{
|
|
@@ -83,7 +137,7 @@ scenarios = [
|
|
|
83
137
|
data_impact: true, existing_frozen_baseline: true
|
|
84
138
|
},
|
|
85
139
|
required: %w[spec product-overview spec-delta openapi-draft data-architecture architecture-review vertical-slice-tickets],
|
|
86
|
-
forbidden: %w[high-fidelity-html-prototype]
|
|
140
|
+
forbidden: %w[interaction-spec prototype-review high-fidelity-html-prototype prototype-verification]
|
|
87
141
|
},
|
|
88
142
|
{
|
|
89
143
|
name: "模板源流程修订",
|
|
@@ -107,12 +161,48 @@ scenarios.each do |scenario|
|
|
|
107
161
|
failures << "#{scenario.fetch(:name)} 错误触发: #{unexpected.join(', ')}" unless unexpected.empty?
|
|
108
162
|
end
|
|
109
163
|
|
|
164
|
+
route_keys = scenarios.flat_map { |scenario| scenario.fetch(:required) + scenario.fetch(:forbidden) }.uniq
|
|
165
|
+
route_keys.each do |route_key|
|
|
166
|
+
registry_id = ROUTE_REGISTRY_IDS[route_key]
|
|
167
|
+
failures << "生命周期场景 route key 未映射稳定 ID: #{route_key}" unless registry_id
|
|
168
|
+
failures << "生命周期场景 route key 映射到不存在的稳定 ID: #{route_key} -> #{registry_id}" if registry_id && !REGISTRY_IDS.include?(registry_id)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
prototype_registry_requirements = {
|
|
172
|
+
"gate.prototype-reviewed" => ["evidence.prototype-review-result"],
|
|
173
|
+
"gate.prototype-verified" => ["evidence.antd-cli-validation", "evidence.browser-prototype-verification"],
|
|
174
|
+
"gate.user-confirmation" => ["evidence.prototype-confirmation"]
|
|
175
|
+
}.freeze
|
|
176
|
+
prototype_registry_requirements.each do |gate_id, required_evidence|
|
|
177
|
+
gate = REGISTRY.fetch("gates").find { |record| record.fetch("id") == gate_id }
|
|
178
|
+
failures << "原型阶段缺少生命周期门禁: #{gate_id}" unless gate
|
|
179
|
+
next unless gate
|
|
180
|
+
|
|
181
|
+
missing_evidence = required_evidence - gate.fetch("evidence", [])
|
|
182
|
+
failures << "#{gate_id} 缺少证据: #{missing_evidence.join(', ')}" unless missing_evidence.empty?
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
%w[
|
|
186
|
+
artifact.interaction-spec
|
|
187
|
+
artifact.prototype-review
|
|
188
|
+
artifact.prototype-confirmation
|
|
189
|
+
evidence.prototype-review-result
|
|
190
|
+
evidence.antd-cli-validation
|
|
191
|
+
evidence.browser-prototype-verification
|
|
192
|
+
evidence.prototype-confirmation
|
|
193
|
+
].each do |stable_id|
|
|
194
|
+
failures << "原型阶段缺少生命周期对象: #{stable_id}" unless REGISTRY_IDS.include?(stable_id)
|
|
195
|
+
end
|
|
196
|
+
|
|
110
197
|
semantic_markers = {
|
|
111
198
|
"AGENTS.md" => [
|
|
112
|
-
"
|
|
199
|
+
"生命周期注册表中的条件门禁全部按影响面强制",
|
|
113
200
|
"只要进入 Spec 基线",
|
|
114
201
|
"才构成产品设计影响",
|
|
115
202
|
"Spec Delta 只记录相对既有冻结 Spec 基线",
|
|
203
|
+
"安全 / 权限不设独立生命周期资料或专属门禁",
|
|
204
|
+
"普通 action 注册",
|
|
205
|
+
"SQL / DDL / 迁移和上传 / 下载本身不构成安全 / 权限专项",
|
|
116
206
|
"template-source",
|
|
117
207
|
"apps/backend/<project>/",
|
|
118
208
|
"apps/frontend/<project>/",
|
|
@@ -126,7 +216,17 @@ semantic_markers = {
|
|
|
126
216
|
"不生成空文档",
|
|
127
217
|
"最近可信阶段",
|
|
128
218
|
"同一独立执行者",
|
|
129
|
-
"集中 checkpoint"
|
|
219
|
+
"集中 checkpoint",
|
|
220
|
+
"安全 / 权限不单独分诊",
|
|
221
|
+
"不自动升级为安全专项"
|
|
222
|
+
],
|
|
223
|
+
"docs/process/lifecycle-artifact-map.md" => [
|
|
224
|
+
"安全 / 权限不形成独立门禁",
|
|
225
|
+
"按实际 UI、API、Backend、Data、High-risk 影响"
|
|
226
|
+
],
|
|
227
|
+
".agents/skills/yss-product-lifecycle/references/artifact-dependencies.md" => [
|
|
228
|
+
"不使用独立影响类型",
|
|
229
|
+
"不增加安全 / 权限传播"
|
|
130
230
|
],
|
|
131
231
|
"docs/process/implementation-repo-integration.md" => [
|
|
132
232
|
"apps/backend/<project>/",
|
|
@@ -171,7 +271,7 @@ unless failures.empty?
|
|
|
171
271
|
exit 1
|
|
172
272
|
end
|
|
173
273
|
|
|
174
|
-
puts "
|
|
274
|
+
puts "六类生命周期压力场景验证通过"
|
|
175
275
|
|
|
176
276
|
skill_root = ROOT.join(".agents/skills/yss-product-lifecycle")
|
|
177
277
|
skill = skill_root.join("SKILL.md").read
|
|
@@ -235,7 +335,7 @@ reference_markers = {
|
|
|
235
335
|
]
|
|
236
336
|
}.freeze
|
|
237
337
|
|
|
238
|
-
removed_skills = %w[code-review-process yss-domain-modeling]
|
|
338
|
+
removed_skills = %w[code-review-process yss-domain-modeling yss-openapi]
|
|
239
339
|
removed_skills.each do |skill_name|
|
|
240
340
|
failures << "已移除 skill 仍存在: #{skill_name}" if ROOT.join(".agents/skills", skill_name).exist?
|
|
241
341
|
end
|
|
@@ -250,7 +350,8 @@ tracked_policy_files = [
|
|
|
250
350
|
tracked_policy_files.each do |relative_path|
|
|
251
351
|
body = ROOT.join(relative_path).read
|
|
252
352
|
removed_skills.each do |skill_name|
|
|
253
|
-
|
|
353
|
+
pattern = Regexp.new("(?<![a-z0-9-])#{Regexp.escape(skill_name)}(?![a-z0-9-])")
|
|
354
|
+
failures << "#{relative_path} 仍引用已移除 skill: #{skill_name}" if body.match?(pattern)
|
|
254
355
|
end
|
|
255
356
|
end
|
|
256
357
|
|
|
@@ -265,6 +366,47 @@ unless prototype_review.include?("isolated visual fixes") && prototype_review.in
|
|
|
265
366
|
failures << "prototype-review 未排除无行为影响的局部视觉改动"
|
|
266
367
|
end
|
|
267
368
|
|
|
369
|
+
yss_design_system = ROOT.join(".agents/skills/yss-design-system/SKILL.md").read
|
|
370
|
+
failures << "yss-design-system 未将 product-design:index 声明为原型主入口" unless yss_design_system.include?("product-design:index")
|
|
371
|
+
failures << "yss-design-system 未路由统一原型阶段契约" unless yss_design_system.include?("yss-prototype-stage")
|
|
372
|
+
|
|
373
|
+
%w[product-design-prototype wireframe-prototype high-fidelity-html-prototype].each do |skill_name|
|
|
374
|
+
body = ROOT.join(".agents/skills/#{skill_name}/SKILL.md").read
|
|
375
|
+
failures << "#{skill_name} 未降为兼容入口" unless body.include?("兼容入口") && body.include?("yss-prototype-stage")
|
|
376
|
+
end
|
|
377
|
+
|
|
378
|
+
high_fidelity = ROOT.join(".agents/skills/high-fidelity-html-prototype/SKILL.md").read
|
|
379
|
+
failures << "高保真原型仍固定 AntD CLI 版本" if high_fidelity.include?("@ant-design/cli@6.5.0")
|
|
380
|
+
failures << "高保真原型仍以 npm view 代替受控 AntD CLI 证据" if high_fidelity.include?("npm view antd version")
|
|
381
|
+
|
|
382
|
+
confirmation_template = ROOT.join("docs/design/templates/prototype-confirmation-template.md").read
|
|
383
|
+
failures << "原型确认模板仍固定 AntD 版本" if confirmation_template.include?("--version 6.0.0")
|
|
384
|
+
failures << "原型确认模板未引用统一证据清单" unless confirmation_template.include?("prototype-evidence.yaml")
|
|
385
|
+
|
|
386
|
+
evidence_template_path = ROOT.join("docs/design/templates/prototype-evidence-template.yaml")
|
|
387
|
+
failures << "缺少机器可读的原型证据模板" unless evidence_template_path.file?
|
|
388
|
+
if evidence_template_path.file?
|
|
389
|
+
evidence_template = evidence_template_path.read
|
|
390
|
+
%w[design_baseline antd browser_verification review user_confirmation].each do |field|
|
|
391
|
+
failures << "原型证据模板缺少 #{field}" unless evidence_template.include?("#{field}:")
|
|
392
|
+
end
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
prototype_stage_path = ROOT.join(".agents/skills/yss-prototype-stage/SKILL.md")
|
|
396
|
+
failures << "缺少跨 Agent 原型阶段契约" unless prototype_stage_path.file?
|
|
397
|
+
if prototype_stage_path.file?
|
|
398
|
+
prototype_stage = prototype_stage_path.read
|
|
399
|
+
%w[product-design:index antd design.md project_design browser_verification].each do |marker|
|
|
400
|
+
failures << "统一原型阶段契约缺少 #{marker}" unless prototype_stage.include?(marker)
|
|
401
|
+
end
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
design_baseline = ROOT.join("docs/design/design.md").read
|
|
405
|
+
failures << "项目设计基线未声明上游 design.md 与项目 token 的优先级" unless design_baseline.include?("上游默认") && design_baseline.include?("项目覆盖")
|
|
406
|
+
|
|
407
|
+
adr = ROOT.join("docs/adr/0001-product-design-prototype-entrypoint.md").read
|
|
408
|
+
failures << "ADR 仍引用不存在的原型流程文档" if adr.include?("docs/process/product-prototype-workflow.md")
|
|
409
|
+
|
|
268
410
|
openapi_review = ROOT.join(".agents/skills/yss-openapi-draft-review/SKILL.md").read
|
|
269
411
|
%w[Automated semantic unchanged].each do |marker|
|
|
270
412
|
failures << "OpenAPI Draft Review 缺少自动/语义边界: #{marker}" unless openapi_review.include?(marker)
|
|
@@ -362,14 +504,14 @@ failures << "Matt prototype 分支模式错误" unless matt_prototype["branch_pa
|
|
|
362
504
|
failures << "Matt prototype 不能作为生产交付物" unless matt_prototype["production_delivery"] == false
|
|
363
505
|
failures << "Matt prototype 错误替代 YSS 高保真原型" unless matt_prototype["replaces_yss_high_fidelity"] == false
|
|
364
506
|
yss_prototype = prototype_modes.fetch("yss_high_fidelity", {})
|
|
365
|
-
%w[prototype_review antd_cli_verification user_confirmation].each do |field|
|
|
507
|
+
%w[prototype_review antd_cli_verification browser_verification prototype_evidence user_confirmation].each do |field|
|
|
366
508
|
failures << "YSS 高保真 prototype 缺少 #{field} 门禁" unless yss_prototype.fetch("required", []).include?(field)
|
|
367
509
|
end
|
|
368
510
|
failures << "YSS 高保真 prototype 错误替代 Matt prototype" unless yss_prototype["replaces_matt_logic"] == false
|
|
369
511
|
|
|
370
512
|
prototype_mode_requirements = {
|
|
371
513
|
"matt_logic" => %w[prototype_mode prototype_branch source_handoff prototype_asset_or_run conclusion updated_authoritative_asset remaining_questions return_handoff],
|
|
372
|
-
"yss_high_fidelity" => %w[prototype_mode prototype_review antd_cli_verification user_confirmation]
|
|
514
|
+
"yss_high_fidelity" => %w[prototype_mode prototype_review antd_cli_verification browser_verification prototype_evidence user_confirmation]
|
|
373
515
|
}.freeze
|
|
374
516
|
prototype_mode_requirements.each do |mode, required_fields|
|
|
375
517
|
evidence = required_fields.to_h { |field| [field, true] }.merge("prototype_mode" => mode)
|
|
@@ -421,8 +563,9 @@ ready_required.each do |condition|
|
|
|
421
563
|
end
|
|
422
564
|
|
|
423
565
|
propagation = contract.fetch("impact_propagation")
|
|
424
|
-
expected_types = %w[wording ui-state
|
|
566
|
+
expected_types = %w[wording ui-state api-schema state-machine data-model service-boundary nfr deployment]
|
|
425
567
|
failures << "影响类型不完整" unless (expected_types - propagation.keys).empty?
|
|
568
|
+
failures << "安全 / 权限仍作为独立传播类型" unless (propagation.keys & %w[permission security]).empty?
|
|
426
569
|
|
|
427
570
|
allowed_conditions = %w[always existing_frozen_baseline ui_impact api_impact data_impact backend_impact]
|
|
428
571
|
propagation.each do |impact_type, definition|
|
|
@@ -464,14 +607,41 @@ expected_types.each do |impact_type|
|
|
|
464
607
|
failures << "#{impact_type} 可执行传播结果为空" if targets.nil? || targets.empty?
|
|
465
608
|
end
|
|
466
609
|
|
|
467
|
-
|
|
610
|
+
new_module_api = propagated_targets(
|
|
468
611
|
propagation,
|
|
469
|
-
"
|
|
612
|
+
"api-schema",
|
|
470
613
|
all_impacts_context.merge("existing_frozen_baseline" => false)
|
|
471
614
|
)
|
|
472
|
-
failures << "新模块错误激活 spec-delta" if
|
|
473
|
-
unless
|
|
474
|
-
failures << "
|
|
615
|
+
failures << "新模块错误激活 spec-delta" if new_module_api.any? { |target| target["name"] == "spec-delta" }
|
|
616
|
+
unless new_module_api.any? { |target| target["kind"] == "gate" && target["name"] == "openapi-freeze" }
|
|
617
|
+
failures << "普通 API 影响未使 openapi-freeze gate stale"
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
legacy_posture_key = %w[security permission posture].join("_")
|
|
621
|
+
failures << "生命周期合同仍要求已废弃的专项输入" if contract.key?(legacy_posture_key)
|
|
622
|
+
ordinary_route = route(
|
|
623
|
+
repository_mode: "project-instance", scale: :medium, high_risk: false,
|
|
624
|
+
ui_impact: true, api_impact: true, backend_impact: true,
|
|
625
|
+
data_impact: false, existing_frozen_baseline: false
|
|
626
|
+
)
|
|
627
|
+
%w[openapi-draft openapi-freeze engineering-baseline].each do |gate|
|
|
628
|
+
failures << "普通功能错误移除 #{gate} 门禁" unless ordinary_route.include?(gate)
|
|
629
|
+
end
|
|
630
|
+
|
|
631
|
+
data_targets = propagated_targets(propagation, "data-model", all_impacts_context)
|
|
632
|
+
failures << "SQL / DDL 未按普通数据影响传播" unless data_targets.any? { |target| target["name"] == "data-architecture" }
|
|
633
|
+
api_targets = propagated_targets(propagation, "api-schema", all_impacts_context)
|
|
634
|
+
failures << "下载接口未按普通 API 影响传播" unless api_targets.any? { |target| target["name"] == "openapi-draft" }
|
|
635
|
+
|
|
636
|
+
seam_required = contract.fetch("seam_deferred_required")
|
|
637
|
+
def seam_field_filled?(value)
|
|
638
|
+
value.is_a?(Array) ? !value.empty? : !value.to_s.empty?
|
|
639
|
+
end
|
|
640
|
+
valid_seam = seam_required.to_h { |field| [field, "value"] }
|
|
641
|
+
failures << "完整 seam-deferred 证据被错误阻断" unless seam_required.all? { |field| seam_field_filled?(valid_seam[field]) }
|
|
642
|
+
%w[owner follow_up_ticket target_version_or_release_date].each do |field|
|
|
643
|
+
mutation = valid_seam.reject { |key, _| key == field }
|
|
644
|
+
failures << "seam-deferred 缺少 #{field} 时未阻断" if seam_required.all? { |required_field| seam_field_filled?(mutation[required_field]) }
|
|
475
645
|
end
|
|
476
646
|
|
|
477
647
|
no_api_ui = propagated_targets(
|
|
@@ -488,11 +658,11 @@ unless unknown_decision == {"action" => "pause", "reason_code" => "impact-classi
|
|
|
488
658
|
failures << "未知 impact type 未返回结构化暂停"
|
|
489
659
|
end
|
|
490
660
|
|
|
491
|
-
|
|
492
|
-
|
|
661
|
+
api_gate_stale = new_module_api.any? { |target| target["kind"] == "gate" }
|
|
662
|
+
api_artifact_stale = new_module_api.any? { |target| target["kind"] == "artifact" }
|
|
493
663
|
linked_ready_facts = ready_slice.merge(
|
|
494
|
-
"gates_satisfied" => !
|
|
495
|
-
"no_stale_artifacts" => !
|
|
664
|
+
"gates_satisfied" => !api_gate_stale,
|
|
665
|
+
"no_stale_artifacts" => !api_artifact_stale
|
|
496
666
|
)
|
|
497
667
|
failures << "传播后未撤销 ready-for-agent" if ready_for_agent?(ready_required, linked_ready_facts)
|
|
498
668
|
|