create-yss-spec 2.2.10 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/template/.agents/skills/ask-matt/SKILL.md +1 -1
- package/template/.agents/skills/wayfinder/SKILL.md +2 -2
- package/template/.agents/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.agents/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
- package/template/.agents/skills/yss-domain/SKILL.md +2 -1
- package/template/.agents/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-domain/references/domain-layer-guide.md +2 -0
- package/template/.agents/skills/yss-dto/SKILL.md +6 -0
- package/template/.agents/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
- package/template/.agents/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.agents/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
- package/template/.agents/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.agents/skills/yss-repository/SKILL.md +15 -13
- package/template/.agents/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
- package/template/.agents/skills/yss-research/SKILL.md +73 -0
- package/template/.agents/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.agents/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.agents/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.agents/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.agents/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.agents/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.agents/skills/yss-router/references/router-contract.yaml +7 -3
- package/template/.agents/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.agents/skills/yss-web-controller/SKILL.md +16 -10
- package/template/.agents/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.agents/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
- package/template/.agents/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
- package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
- package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
- package/template/.agents/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
- package/template/.agents/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
- package/template/.agents/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.agents/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
- package/template/.agents/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
- package/template/.claude/skills/ask-matt/SKILL.md +1 -1
- package/template/.claude/skills/wayfinder/SKILL.md +2 -2
- package/template/.claude/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
- package/template/.claude/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
- package/template/.claude/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.claude/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
- package/template/.claude/skills/yss-domain/SKILL.md +2 -1
- package/template/.claude/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-domain/references/domain-layer-guide.md +2 -0
- package/template/.claude/skills/yss-dto/SKILL.md +6 -0
- package/template/.claude/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
- package/template/.claude/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.claude/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
- package/template/.claude/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.claude/skills/yss-repository/SKILL.md +15 -13
- package/template/.claude/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
- package/template/.claude/skills/yss-research/SKILL.md +73 -0
- package/template/.claude/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.claude/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.claude/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.claude/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.claude/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.claude/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.claude/skills/yss-router/references/router-contract.yaml +7 -3
- package/template/.claude/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.claude/skills/yss-web-controller/SKILL.md +16 -10
- package/template/.claude/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.claude/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
- package/template/.claude/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
- package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
- package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
- package/template/.claude/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
- package/template/.claude/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
- package/template/.claude/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.claude/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
- package/template/.claude/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
- package/template/.codex/skills/ask-matt/SKILL.md +1 -1
- package/template/.codex/skills/product-design/package.json +4 -2
- package/template/.codex/skills/product-design/skills/research/SKILL.md +22 -0
- package/template/.codex/skills/product-design/skills/research/assets/evidence-template.yaml +65 -0
- package/template/.codex/skills/product-design/skills/research/assets/research-brief-template.md +33 -0
- package/template/.codex/skills/product-design/skills/research/references/evidence-audited.md +80 -0
- package/template/.codex/skills/product-design/skills/research/scripts/validate-research-package.mjs +149 -0
- package/template/.codex/skills/product-design/skills/research/tests/run-scenarios.mjs +72 -0
- package/template/.codex/skills/wayfinder/SKILL.md +2 -2
- package/template/.codex/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.codex/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
- package/template/.codex/skills/yss-domain/SKILL.md +2 -1
- package/template/.codex/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-domain/references/domain-layer-guide.md +2 -0
- package/template/.codex/skills/yss-dto/SKILL.md +6 -0
- package/template/.codex/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
- package/template/.codex/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.codex/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
- package/template/.codex/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.codex/skills/yss-repository/SKILL.md +15 -13
- package/template/.codex/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
- package/template/.codex/skills/yss-research/SKILL.md +73 -0
- package/template/.codex/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.codex/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.codex/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.codex/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.codex/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.codex/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.codex/skills/yss-router/references/router-contract.yaml +7 -3
- package/template/.codex/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.codex/skills/yss-web-controller/SKILL.md +16 -10
- package/template/.codex/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.codex/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
- package/template/.codex/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
- package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
- package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
- package/template/.codex/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
- package/template/.codex/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
- package/template/.codex/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.codex/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
- package/template/.codex/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
- package/template/.cursor/skills/ask-matt/SKILL.md +1 -1
- package/template/.cursor/skills/wayfinder/SKILL.md +2 -2
- package/template/.cursor/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.cursor/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
- package/template/.cursor/skills/yss-domain/SKILL.md +2 -1
- package/template/.cursor/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-domain/references/domain-layer-guide.md +2 -0
- package/template/.cursor/skills/yss-dto/SKILL.md +6 -0
- package/template/.cursor/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
- package/template/.cursor/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.cursor/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
- package/template/.cursor/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.cursor/skills/yss-repository/SKILL.md +15 -13
- package/template/.cursor/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
- package/template/.cursor/skills/yss-research/SKILL.md +73 -0
- package/template/.cursor/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.cursor/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.cursor/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.cursor/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.cursor/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.cursor/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.cursor/skills/yss-router/references/router-contract.yaml +7 -3
- package/template/.cursor/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.cursor/skills/yss-web-controller/SKILL.md +16 -10
- package/template/.cursor/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.cursor/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
- package/template/.cursor/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
- package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
- package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
- package/template/.cursor/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
- package/template/.cursor/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
- package/template/.cursor/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
- package/template/.cursor/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
- package/template/.hermes/skills/ask-matt/SKILL.md +1 -1
- package/template/.hermes/skills/wayfinder/SKILL.md +2 -2
- package/template/.hermes/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
- package/template/.hermes/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
- package/template/.hermes/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
- package/template/.hermes/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.hermes/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
- package/template/.hermes/skills/yss-domain/SKILL.md +2 -1
- package/template/.hermes/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.hermes/skills/yss-domain/references/domain-layer-guide.md +2 -0
- package/template/.hermes/skills/yss-dto/SKILL.md +6 -0
- package/template/.hermes/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
- package/template/.hermes/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.hermes/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
- package/template/.hermes/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.hermes/skills/yss-repository/SKILL.md +15 -13
- package/template/.hermes/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.hermes/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
- package/template/.hermes/skills/yss-research/SKILL.md +73 -0
- package/template/.hermes/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.hermes/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.hermes/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.hermes/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.hermes/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.hermes/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.hermes/skills/yss-router/references/router-contract.yaml +7 -3
- package/template/.hermes/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.hermes/skills/yss-web-controller/SKILL.md +16 -10
- package/template/.hermes/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.hermes/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
- package/template/.hermes/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
- package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
- package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
- package/template/.hermes/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
- package/template/.hermes/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
- package/template/.hermes/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.hermes/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
- package/template/.hermes/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
- package/template/.pi/skills/ask-matt/SKILL.md +1 -1
- package/template/.pi/skills/wayfinder/SKILL.md +2 -2
- package/template/.pi/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.pi/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
- package/template/.pi/skills/yss-domain/SKILL.md +2 -1
- package/template/.pi/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-domain/references/domain-layer-guide.md +2 -0
- package/template/.pi/skills/yss-dto/SKILL.md +6 -0
- package/template/.pi/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
- package/template/.pi/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.pi/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
- package/template/.pi/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.pi/skills/yss-repository/SKILL.md +15 -13
- package/template/.pi/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
- package/template/.pi/skills/yss-research/SKILL.md +73 -0
- package/template/.pi/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.pi/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.pi/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.pi/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.pi/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.pi/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.pi/skills/yss-router/references/router-contract.yaml +7 -3
- package/template/.pi/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.pi/skills/yss-web-controller/SKILL.md +16 -10
- package/template/.pi/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.pi/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
- package/template/.pi/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
- package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
- package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
- package/template/.pi/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
- package/template/.pi/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
- package/template/.pi/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.pi/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
- package/template/.pi/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
- package/template/.qoder/skills/ask-matt/SKILL.md +1 -1
- package/template/.qoder/skills/wayfinder/SKILL.md +2 -2
- package/template/.qoder/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
- package/template/.qoder/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
- package/template/.qoder/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.qoder/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
- package/template/.qoder/skills/yss-domain/SKILL.md +2 -1
- package/template/.qoder/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-domain/references/domain-layer-guide.md +2 -0
- package/template/.qoder/skills/yss-dto/SKILL.md +6 -0
- package/template/.qoder/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
- package/template/.qoder/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.qoder/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
- package/template/.qoder/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.qoder/skills/yss-repository/SKILL.md +15 -13
- package/template/.qoder/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
- package/template/.qoder/skills/yss-research/SKILL.md +73 -0
- package/template/.qoder/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.qoder/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.qoder/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.qoder/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.qoder/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.qoder/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.qoder/skills/yss-router/references/router-contract.yaml +7 -3
- package/template/.qoder/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.qoder/skills/yss-web-controller/SKILL.md +16 -10
- package/template/.qoder/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.qoder/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
- package/template/.qoder/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
- package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
- package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
- package/template/.qoder/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
- package/template/.qoder/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
- package/template/.qoder/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.qoder/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
- package/template/.qoder/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
- package/template/.trae/skills/ask-matt/SKILL.md +1 -1
- package/template/.trae/skills/wayfinder/SKILL.md +2 -2
- package/template/.trae/skills/yss-ddd-scaffold-generator/SKILL.md +14 -3
- package/template/.trae/skills/yss-ddd-scaffold-generator/references/ARCHITECTURE.md +3 -3
- package/template/.trae/skills/yss-ddd-scaffold-generator/references/USAGE_EXAMPLES.md +12 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/references/yss-backend-scaffold-parent/SKILL.md +2 -1
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/first-slice-compatibility.test.mjs +45 -11
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/first-slice-verification.test.mjs +164 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/generate_scaffold.mjs +18 -4
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs +172 -0
- package/template/.trae/skills/yss-ddd-scaffold-generator/scripts/scaffold-generator.test.mjs +14 -1
- package/template/.trae/skills/yss-domain/SKILL.md +2 -1
- package/template/.trae/skills/yss-domain/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-domain/references/domain-layer-guide.md +2 -0
- package/template/.trae/skills/yss-dto/SKILL.md +6 -0
- package/template/.trae/skills/yss-dto/references/openapi-wire-profile.yaml +6 -0
- package/template/.trae/skills/yss-product-lifecycle/SKILL.md +1 -1
- package/template/.trae/skills/yss-product-lifecycle/references/matt-yss-adapter.md +2 -2
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration-contract.yaml +12 -10
- package/template/.trae/skills/yss-product-lifecycle/references/orchestration.md +2 -2
- package/template/.trae/skills/yss-repository/SKILL.md +15 -13
- package/template/.trae/skills/yss-repository/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-repository/references/infrastructure-layer-guide.md +1 -1
- package/template/.trae/skills/yss-research/SKILL.md +73 -0
- package/template/.trae/skills/yss-research/agents/openai.yaml +3 -0
- package/template/.trae/skills/yss-research/assets/evidence-template.yaml +68 -0
- package/template/.trae/skills/yss-research/assets/research-brief-template.md +36 -0
- package/template/.trae/skills/yss-research/references/evidence-contract.md +42 -0
- package/template/.trae/skills/yss-research/scripts/validate-research-package.mjs +128 -0
- package/template/.trae/skills/yss-research/tests/run-scenarios.mjs +81 -0
- package/template/.trae/skills/yss-router/references/router-contract.yaml +7 -3
- package/template/.trae/skills/yss-stage-decision/SKILL.md +2 -1
- package/template/.trae/skills/yss-web-controller/SKILL.md +16 -10
- package/template/.trae/skills/yss-web-controller/agents/openai.yaml +2 -2
- package/template/.trae/skills/yss-web-controller/assets/templates/Controller.java.template +11 -11
- package/template/.trae/skills/yss-web-controller/assets/templates/WebConvertor.java.template +4 -7
- package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/CreateRequest.java.template +2 -2
- package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/PageRequest.java.template +4 -7
- package/template/.trae/skills/yss-web-controller/assets/templates/web/dto/UpdateRequest.java.template +2 -2
- package/template/.trae/skills/yss-web-controller/references/web-adapter-layer-guide.md +6 -4
- package/template/.trae/skills/yss-web-controller/references/web-generation-contract.schema.json +97 -0
- package/template/.trae/skills/yss-web-controller/scripts/generate_controller.mjs +141 -20
- package/template/.trae/skills/yss-web-controller/scripts/generate_controller.test.mjs +131 -35
- package/template/AGENTS.md +2 -2
- package/template/CONTEXT.md +1 -1
- package/template/docs/agents/digital-human-roles.yaml +2 -2
- package/template/docs/agents/yss-skill-registry.yaml +18 -3
- package/template/docs/process/MATT-POCOCK-ENGINEERING-SKILLS.md +1 -0
- package/template/docs/user-guide//347/224/250/346/210/267/346/211/213/345/206/214.md +1 -1
- package/template/scripts/lib/scenario-checks.mjs +8 -4
- package/template/scripts/lib/skill-registry.mjs +49 -5
- package/template/scripts/lib/skill-supply-chain.mjs +3 -2
- package/template/scripts/verify-yss-dto-openapi-profile +8 -0
- package/template/skills-lock.json +30 -30
- package/template.snapshot.json +4 -4
- package/template/.agents/skills/research/SKILL.md +0 -12
- package/template/.agents/skills/research/agents/openai.yaml +0 -3
- package/template/.claude/skills/research/SKILL.md +0 -12
- package/template/.claude/skills/research/agents/openai.yaml +0 -3
- package/template/.codex/skills/research/SKILL.md +0 -12
- package/template/.codex/skills/research/agents/openai.yaml +0 -3
- package/template/.cursor/skills/research/SKILL.md +0 -12
- package/template/.cursor/skills/research/agents/openai.yaml +0 -3
- package/template/.hermes/skills/research/SKILL.md +0 -12
- package/template/.hermes/skills/research/agents/openai.yaml +0 -3
- package/template/.pi/skills/research/SKILL.md +0 -12
- package/template/.pi/skills/research/agents/openai.yaml +0 -3
- package/template/.qoder/skills/research/SKILL.md +0 -12
- package/template/.qoder/skills/research/agents/openai.yaml +0 -3
- package/template/.trae/skills/research/SKILL.md +0 -12
- package/template/.trae/skills/research/agents/openai.yaml +0 -3
|
@@ -9,6 +9,13 @@ Run a fresh UX research scan for the product the user specifies.
|
|
|
9
9
|
|
|
10
10
|
Focus on current, evidence-backed user problems. Prioritize logged-in product experience, self-serve flows, onboarding, docs/help, developer experience, support friction, and product workflows.
|
|
11
11
|
|
|
12
|
+
## Modes
|
|
13
|
+
|
|
14
|
+
- `quick` is the default. It produces a sharp in-chat brief from the best available current evidence.
|
|
15
|
+
- `evidence-audited` is opt-in. Use it only when the user explicitly asks for deep, strict, auditable, or `evidence-audited` research. For consequential product or investment decisions, recommend this mode but do not switch silently.
|
|
16
|
+
|
|
17
|
+
Both modes remain UX research workflows. Do not import academic-paper writing, peer-review, publication, or multi-agent ceremony.
|
|
18
|
+
|
|
12
19
|
## Critical Overrides
|
|
13
20
|
|
|
14
21
|
- Refer to the Plugin router [$index](../index/SKILL.md) before proceeding.
|
|
@@ -25,7 +32,9 @@ Do not inspect every saved reference. Inspect only what the current task needs.
|
|
|
25
32
|
## Contract
|
|
26
33
|
|
|
27
34
|
- Restate the product, audience, time horizon, and research scope before scanning.
|
|
35
|
+
- State the active mode. In `evidence-audited`, also state the planned source classes and inclusion/exclusion criteria before searching.
|
|
28
36
|
- Use public sources by default. Use internal sources when the connectors are available and the user request allows it.
|
|
37
|
+
- Search user-provided or saved material first, apply the same inclusion criteria to it, then search externally to fill material gaps. Never silently omit supplied material; report exclusions or access failures.
|
|
29
38
|
- Cite sources wherever available.
|
|
30
39
|
- Separate observed evidence from inference.
|
|
31
40
|
- Do not overclaim from anecdotes.
|
|
@@ -70,6 +79,8 @@ Do not inspect every saved reference. Inspect only what the current task needs.
|
|
|
70
79
|
|
|
71
80
|
7. Tell a clear product story.
|
|
72
81
|
|
|
82
|
+
For `evidence-audited` mode, follow [evidence-audited.md](references/evidence-audited.md) after scope restatement. This adds a reproducible Search Log, an Evidence Ledger, key-claim audit, counter-signal handling, and an explicit failure policy. It does not require sentence-by-sentence auditing.
|
|
83
|
+
|
|
73
84
|
## Output
|
|
74
85
|
|
|
75
86
|
Default to an in-chat research brief unless the user asks for another format.
|
|
@@ -81,6 +92,14 @@ Include:
|
|
|
81
92
|
- Source map: what was searched, what each source contributed, and where signal was weak.
|
|
82
93
|
- Opportunity map: group recommendations into fix this week, fix this quarter, and needs deeper research.
|
|
83
94
|
|
|
95
|
+
When the user explicitly asks to persist an `evidence-audited` result, create two adjacent files named `<slug>-research-brief.md` and `<slug>-evidence.yaml`. Start from [research-brief-template.md](assets/research-brief-template.md) and [evidence-template.yaml](assets/evidence-template.yaml), then run:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
node scripts/validate-research-package.mjs <slug>-research-brief.md <slug>-evidence.yaml
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Run the command from this skill directory. Do not persist research files merely because `evidence-audited` mode is active.
|
|
102
|
+
|
|
84
103
|
## Rules
|
|
85
104
|
|
|
86
105
|
- Use citations wherever available.
|
|
@@ -89,4 +108,7 @@ Include:
|
|
|
89
108
|
- Separate UX friction from missing features.
|
|
90
109
|
- Separate reliability/performance issues from UX workflow issues.
|
|
91
110
|
- Mark internal-only evidence separately from public evidence.
|
|
111
|
+
- Do not equate source count with frequency. State whether frequency is measured, repeated across independent sources, or anecdotal.
|
|
112
|
+
- In `evidence-audited` mode, audit the key claims for every ranked problem: problem existence, impact, frequency characterization, and the evidence basis for the recommended move. Audit every high-severity key claim; for lower-severity problems include at least one primary supporting item and one counter-signal or an explicit `none-found` search result.
|
|
113
|
+
- Unsupported key claims must use `needs-deeper-research`; partially supported claims must be qualified. Never label a persisted package audited when its validator has not passed.
|
|
92
114
|
- Keep the brief sharp, specific, and easy to consume.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": 1,
|
|
3
|
+
"mode": "evidence-audited",
|
|
4
|
+
"scope": {
|
|
5
|
+
"product": "<product>",
|
|
6
|
+
"audience": "<audience>",
|
|
7
|
+
"time_horizon": "<time horizon>",
|
|
8
|
+
"research_questions": ["<question>"],
|
|
9
|
+
"inclusion_criteria": ["<criterion>"],
|
|
10
|
+
"exclusion_criteria": ["<criterion>"]
|
|
11
|
+
},
|
|
12
|
+
"search_log": [
|
|
13
|
+
{
|
|
14
|
+
"id": "search-001",
|
|
15
|
+
"channel": "<channel or corpus>",
|
|
16
|
+
"query_or_corpus": "<query or inspected material>",
|
|
17
|
+
"searched_at": "YYYY-MM-DD",
|
|
18
|
+
"result": "results-found"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "search-002",
|
|
22
|
+
"channel": "<channel searched for disconfirming evidence>",
|
|
23
|
+
"query_or_corpus": "<counter-signal query>",
|
|
24
|
+
"searched_at": "YYYY-MM-DD",
|
|
25
|
+
"result": "none-found"
|
|
26
|
+
}
|
|
27
|
+
],
|
|
28
|
+
"evidence_items": [
|
|
29
|
+
{
|
|
30
|
+
"id": "evidence-001",
|
|
31
|
+
"visibility": "public",
|
|
32
|
+
"source_level": "primary",
|
|
33
|
+
"source_class": "<issue, forum, review, metric, docs, interview, support>",
|
|
34
|
+
"source_ref": "<URL or internal reference>",
|
|
35
|
+
"locator": "<section, issue comment, timestamp, or other precise locator>",
|
|
36
|
+
"stance": "support",
|
|
37
|
+
"observed_at": "YYYY-MM-DD",
|
|
38
|
+
"evidence_date": "YYYY-MM-DD",
|
|
39
|
+
"observation": "<what the source directly shows>",
|
|
40
|
+
"freshness": "current",
|
|
41
|
+
"limitations": []
|
|
42
|
+
}
|
|
43
|
+
],
|
|
44
|
+
"claims": [
|
|
45
|
+
{
|
|
46
|
+
"id": "claim-001",
|
|
47
|
+
"problem_id": "problem-001",
|
|
48
|
+
"claim_kind": "problem-exists",
|
|
49
|
+
"statement": "<decision-bearing claim>",
|
|
50
|
+
"severity": "high",
|
|
51
|
+
"frequency_signal": "anecdotal",
|
|
52
|
+
"confidence": "medium",
|
|
53
|
+
"evidence_refs": ["evidence-001"],
|
|
54
|
+
"counter_signal_refs": ["search-002"],
|
|
55
|
+
"audit_status": "supported",
|
|
56
|
+
"disposition": "publish"
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"source_gaps": [],
|
|
60
|
+
"audit_summary": {
|
|
61
|
+
"status": "complete",
|
|
62
|
+
"audited_claim_ids": ["claim-001"],
|
|
63
|
+
"notes": []
|
|
64
|
+
}
|
|
65
|
+
}
|
package/template/.codex/skills/product-design/skills/research/assets/research-brief-template.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# <Product> UX Research Brief
|
|
2
|
+
|
|
3
|
+
## Research Scope
|
|
4
|
+
|
|
5
|
+
- Mode: `evidence-audited`
|
|
6
|
+
- Audience:
|
|
7
|
+
- Time horizon:
|
|
8
|
+
- Scope:
|
|
9
|
+
- Access limitations:
|
|
10
|
+
|
|
11
|
+
## Executive Read
|
|
12
|
+
|
|
13
|
+
Summarize the product story in 5–7 sentences.
|
|
14
|
+
|
|
15
|
+
## Ranked UX Problems
|
|
16
|
+
|
|
17
|
+
For each problem, cover the user goal, surface, breakage, evidence, severity, frequency signal, confidence, recommended move, and its key claim IDs (`claim-*`).
|
|
18
|
+
|
|
19
|
+
## Source Map
|
|
20
|
+
|
|
21
|
+
Explain what was searched, what each source class contributed, exclusions, failed access, and weak-signal areas.
|
|
22
|
+
|
|
23
|
+
## Opportunity Map
|
|
24
|
+
|
|
25
|
+
### Fix This Week
|
|
26
|
+
|
|
27
|
+
### Fix This Quarter
|
|
28
|
+
|
|
29
|
+
### Needs Deeper Research
|
|
30
|
+
|
|
31
|
+
## Evidence Limitations
|
|
32
|
+
|
|
33
|
+
State coverage gaps, conflicting evidence, counter-signals, and conclusions that were narrowed or withheld.
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Evidence-Audited UX Research
|
|
2
|
+
|
|
3
|
+
Use this protocol only when the caller explicitly selects `evidence-audited` mode. The goal is an auditable UX brief, not an academic literature review.
|
|
4
|
+
|
|
5
|
+
## 1. Search plan
|
|
6
|
+
|
|
7
|
+
Before searching, declare:
|
|
8
|
+
|
|
9
|
+
- product, audience, time horizon, geography or platform boundaries, and research questions;
|
|
10
|
+
- source classes likely to carry direct user or product evidence;
|
|
11
|
+
- inclusion and exclusion criteria;
|
|
12
|
+
- known access limits, including unavailable internal sources.
|
|
13
|
+
|
|
14
|
+
Search user-provided and saved material first. Apply the same inclusion and exclusion criteria to supplied and externally discovered material. Search externally to fill gaps, check recency, and seek disconfirming evidence. Record unsuccessful searches and access failures; they bound the conclusion.
|
|
15
|
+
|
|
16
|
+
## 2. Search Log
|
|
17
|
+
|
|
18
|
+
Record every material search with its channel, query or inspected corpus, execution date, scope, and result. A zero-result search is still a result. Do not claim that a channel was searched when only an aggregator snippet was inspected.
|
|
19
|
+
|
|
20
|
+
## 3. Evidence Ledger
|
|
21
|
+
|
|
22
|
+
Create one evidence item per independently locatable observation. Each item records:
|
|
23
|
+
|
|
24
|
+
- a stable ID;
|
|
25
|
+
- public or internal visibility, source class, and source level (`primary`, `direct-experience`, `near-primary`, `secondary`, or `lead-only`);
|
|
26
|
+
- source URL or internal reference plus a precise locator;
|
|
27
|
+
- observation date and publication/event date when available;
|
|
28
|
+
- whether the item supports or counters the mapped claim;
|
|
29
|
+
- the observed evidence, without interpretation;
|
|
30
|
+
- freshness and access limitations.
|
|
31
|
+
|
|
32
|
+
Keep inference in claims, not in evidence observations. Short quotations may support location and meaning, but respect source quotation limits.
|
|
33
|
+
|
|
34
|
+
## 4. Key-claim audit
|
|
35
|
+
|
|
36
|
+
Audit the decision-bearing claims for each ranked problem rather than every sentence:
|
|
37
|
+
|
|
38
|
+
1. the problem exists;
|
|
39
|
+
2. the asserted impact;
|
|
40
|
+
3. the frequency characterization;
|
|
41
|
+
4. the evidence basis for the recommended product move.
|
|
42
|
+
|
|
43
|
+
For every high-severity problem, audit all four claim kinds. For lower-severity problems, audit at least one `primary` supporting item and one counter-signal. `lead-only` items may guide discovery but cannot support a claim. When no counter-signal is found, reference a Search Log entry whose result is `none-found`; absence of a found counter-signal is not proof that none exists.
|
|
44
|
+
|
|
45
|
+
Use these audit outcomes:
|
|
46
|
+
|
|
47
|
+
- `supported`: cited evidence directly supports the claim as worded;
|
|
48
|
+
- `partially-supported`: evidence supports a narrower or qualified claim;
|
|
49
|
+
- `unsupported`: evidence does not support the claim;
|
|
50
|
+
- `not-audited`: allowed only before the audit is complete.
|
|
51
|
+
|
|
52
|
+
Every evidence reference must resolve to a ledger item. The audit checks support, not merely citation existence.
|
|
53
|
+
|
|
54
|
+
## 5. Frequency and confidence
|
|
55
|
+
|
|
56
|
+
Describe frequency as one of:
|
|
57
|
+
|
|
58
|
+
- `measured`: backed by a relevant dataset or metric;
|
|
59
|
+
- `repeated-independent`: repeated across independent sources, without a population-rate claim;
|
|
60
|
+
- `anecdotal`: one or a small number of reports;
|
|
61
|
+
- `unknown`: the available evidence cannot characterize frequency.
|
|
62
|
+
|
|
63
|
+
Rank confidence from source directness, independence, recency, access quality, and counter-signals. Do not raise confidence merely because several posts repeat the same upstream report.
|
|
64
|
+
|
|
65
|
+
## 6. Failure and downgrade policy
|
|
66
|
+
|
|
67
|
+
- Ordinary access gaps or conflicting evidence do not block the brief. Surface the gap and lower confidence.
|
|
68
|
+
- A partially supported claim must be narrowed and use disposition `qualify`.
|
|
69
|
+
- An unsupported key claim, fabricated or mismatched citation, or unverified source identity must not be presented as certain. Use disposition `needs-deeper-research`.
|
|
70
|
+
- A persisted package fails when its structure is invalid, references do not resolve, lower-severity problems lack primary support, a high-severity claim was not audited, or the report claims completion while an audit remains `not-audited`.
|
|
71
|
+
|
|
72
|
+
## 7. Persistence
|
|
73
|
+
|
|
74
|
+
Persist only on explicit request. Use adjacent `<slug>-research-brief.md` and `<slug>-evidence.yaml` files. The evidence file uses JSON syntax, which is valid YAML 1.2, so the bundled validator can parse it without an external YAML dependency.
|
|
75
|
+
|
|
76
|
+
The Markdown brief must mention every key-claim ID and contain the headings required by the template. The evidence file remains the source of truth for search execution, claim-to-evidence mapping, audit state, gaps, and counter-signals.
|
|
77
|
+
|
|
78
|
+
## Design provenance
|
|
79
|
+
|
|
80
|
+
This protocol adapts two engineering patterns from [Academic Research Skills](https://github.com/Imbad0202/academic-research-skills): its Material Passport-style provenance chain and claim-to-reference alignment audit. The UX workflow deliberately omits academic writing, publication, agent-team, and cross-model review machinery.
|
package/template/.codex/skills/product-design/skills/research/scripts/validate-research-package.mjs
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
const SOURCE_LEVELS = ["primary", "direct-experience", "near-primary", "secondary", "lead-only"];
|
|
6
|
+
|
|
7
|
+
function fail(message) {
|
|
8
|
+
throw new TypeError(message);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function requireString(value, label) {
|
|
12
|
+
if (typeof value !== "string" || !value.trim()) fail(`${label} must be a non-empty string`);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function requireArray(value, label, { nonEmpty = false } = {}) {
|
|
16
|
+
if (!Array.isArray(value) || (nonEmpty && value.length === 0)) fail(`${label} must be ${nonEmpty ? "a non-empty" : "an"} array`);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function uniqueIds(items, label) {
|
|
20
|
+
const ids = new Set();
|
|
21
|
+
items.forEach((item, index) => {
|
|
22
|
+
requireString(item?.id, `${label}[${index}].id`);
|
|
23
|
+
if (ids.has(item.id)) fail(`${label} contains duplicate id: ${item.id}`);
|
|
24
|
+
ids.add(item.id);
|
|
25
|
+
});
|
|
26
|
+
return ids;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function requireChoice(value, choices, label) {
|
|
30
|
+
if (!choices.includes(value)) fail(`${label} must be one of: ${choices.join(", ")}`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function parseEvidence(file) {
|
|
34
|
+
let value;
|
|
35
|
+
try {
|
|
36
|
+
value = JSON.parse(readFileSync(file, "utf8"));
|
|
37
|
+
} catch (error) {
|
|
38
|
+
fail(`${path.basename(file)} must use JSON-compatible YAML 1.2 syntax: ${error.message}`);
|
|
39
|
+
}
|
|
40
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) fail("evidence root must be an object");
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function validate(briefFile, evidenceFile) {
|
|
45
|
+
if (!briefFile || !evidenceFile) fail("usage: validate-research-package.mjs <brief.md> <evidence.yaml>");
|
|
46
|
+
const briefPath = path.resolve(briefFile);
|
|
47
|
+
const evidencePath = path.resolve(evidenceFile);
|
|
48
|
+
if (path.dirname(briefPath) !== path.dirname(evidencePath)) fail("brief and evidence files must be adjacent");
|
|
49
|
+
if (!briefPath.endsWith("-research-brief.md") || !evidencePath.endsWith("-evidence.yaml")) fail("expected <slug>-research-brief.md and <slug>-evidence.yaml");
|
|
50
|
+
const briefSlug = path.basename(briefPath, "-research-brief.md");
|
|
51
|
+
const evidenceSlug = path.basename(evidencePath, "-evidence.yaml");
|
|
52
|
+
if (!briefSlug || briefSlug !== evidenceSlug) fail("brief and evidence files must use the same non-empty slug");
|
|
53
|
+
|
|
54
|
+
const brief = readFileSync(briefPath, "utf8");
|
|
55
|
+
const headings = ["Research Scope", "Executive Read", "Ranked UX Problems", "Source Map", "Opportunity Map", "Evidence Limitations"];
|
|
56
|
+
headings.forEach((heading) => {
|
|
57
|
+
if (!brief.includes(`## ${heading}`)) fail(`brief is missing heading: ## ${heading}`);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const evidence = parseEvidence(evidencePath);
|
|
61
|
+
if (evidence.schema_version !== 1) fail("schema_version must be 1");
|
|
62
|
+
if (evidence.mode !== "evidence-audited") fail("mode must be evidence-audited");
|
|
63
|
+
["product", "audience", "time_horizon"].forEach((field) => requireString(evidence.scope?.[field], `scope.${field}`));
|
|
64
|
+
["research_questions", "inclusion_criteria", "exclusion_criteria"].forEach((field) => requireArray(evidence.scope?.[field], `scope.${field}`, { nonEmpty: true }));
|
|
65
|
+
|
|
66
|
+
requireArray(evidence.search_log, "search_log", { nonEmpty: true });
|
|
67
|
+
const searchIds = uniqueIds(evidence.search_log, "search_log");
|
|
68
|
+
const searchesById = new Map(evidence.search_log.map((entry) => [entry.id, entry]));
|
|
69
|
+
evidence.search_log.forEach((entry, index) => {
|
|
70
|
+
["channel", "query_or_corpus", "searched_at"].forEach((field) => requireString(entry[field], `search_log[${index}].${field}`));
|
|
71
|
+
requireChoice(entry.result, ["results-found", "none-found", "access-failed", "excluded"], `search_log[${index}].result`);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
requireArray(evidence.evidence_items, "evidence_items", { nonEmpty: true });
|
|
75
|
+
const evidenceIds = uniqueIds(evidence.evidence_items, "evidence_items");
|
|
76
|
+
const evidenceById = new Map(evidence.evidence_items.map((item) => [item.id, item]));
|
|
77
|
+
evidence.evidence_items.forEach((item, index) => {
|
|
78
|
+
requireChoice(item.source_level, SOURCE_LEVELS, `evidence_items[${index}].source_level`);
|
|
79
|
+
requireChoice(item.visibility, ["public", "internal"], `evidence_items[${index}].visibility`);
|
|
80
|
+
requireChoice(item.stance, ["support", "counter"], `evidence_items[${index}].stance`);
|
|
81
|
+
["source_class", "source_ref", "locator", "observed_at", "observation", "freshness"].forEach((field) => requireString(item[field], `evidence_items[${index}].${field}`));
|
|
82
|
+
requireArray(item.limitations, `evidence_items[${index}].limitations`);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
requireArray(evidence.claims, "claims", { nonEmpty: true });
|
|
86
|
+
const claimIds = uniqueIds(evidence.claims, "claims");
|
|
87
|
+
const highKinds = new Map();
|
|
88
|
+
const lowerSeverityPrimary = new Map();
|
|
89
|
+
evidence.claims.forEach((claim, index) => {
|
|
90
|
+
["problem_id", "statement"].forEach((field) => requireString(claim[field], `claims[${index}].${field}`));
|
|
91
|
+
requireChoice(claim.claim_kind, ["problem-exists", "impact", "frequency", "recommended-move"], `claims[${index}].claim_kind`);
|
|
92
|
+
requireChoice(claim.severity, ["low", "medium", "high", "critical"], `claims[${index}].severity`);
|
|
93
|
+
requireChoice(claim.frequency_signal, ["measured", "repeated-independent", "anecdotal", "unknown"], `claims[${index}].frequency_signal`);
|
|
94
|
+
requireChoice(claim.confidence, ["low", "medium", "high"], `claims[${index}].confidence`);
|
|
95
|
+
requireChoice(claim.audit_status, ["supported", "partially-supported", "unsupported", "not-audited"], `claims[${index}].audit_status`);
|
|
96
|
+
requireChoice(claim.disposition, ["publish", "qualify", "needs-deeper-research"], `claims[${index}].disposition`);
|
|
97
|
+
requireArray(claim.evidence_refs, `claims[${index}].evidence_refs`, { nonEmpty: true });
|
|
98
|
+
requireArray(claim.counter_signal_refs, `claims[${index}].counter_signal_refs`, { nonEmpty: true });
|
|
99
|
+
const supporting = claim.evidence_refs.map((ref) => {
|
|
100
|
+
if (!evidenceIds.has(ref)) fail(`${claim.id} has unresolved evidence ref: ${ref}`);
|
|
101
|
+
const item = evidenceById.get(ref);
|
|
102
|
+
if (item.stance !== "support") fail(`${claim.id} support ref is not marked support: ${ref}`);
|
|
103
|
+
if (item.source_level === "lead-only") fail(`${claim.id} uses lead-only evidence as support: ${ref}`);
|
|
104
|
+
return item;
|
|
105
|
+
});
|
|
106
|
+
claim.counter_signal_refs.forEach((ref) => {
|
|
107
|
+
if (!evidenceIds.has(ref) && !searchIds.has(ref)) fail(`${claim.id} has unresolved counter-signal ref: ${ref}`);
|
|
108
|
+
if (evidenceIds.has(ref) && evidenceById.get(ref).stance !== "counter") fail(`${claim.id} counter-signal evidence is not marked counter: ${ref}`);
|
|
109
|
+
if (searchIds.has(ref) && searchesById.get(ref).result !== "none-found") fail(`${claim.id} counter-signal search must have result none-found: ${ref}`);
|
|
110
|
+
});
|
|
111
|
+
if (claim.audit_status === "unsupported" && claim.disposition !== "needs-deeper-research") fail(`${claim.id} is unsupported and must use needs-deeper-research`);
|
|
112
|
+
if (claim.audit_status === "partially-supported" && claim.disposition !== "qualify") fail(`${claim.id} is partially supported and must use qualify`);
|
|
113
|
+
if (["high", "critical"].includes(claim.severity)) {
|
|
114
|
+
const kinds = highKinds.get(claim.problem_id) ?? new Set();
|
|
115
|
+
kinds.add(claim.claim_kind);
|
|
116
|
+
highKinds.set(claim.problem_id, kinds);
|
|
117
|
+
} else {
|
|
118
|
+
lowerSeverityPrimary.set(claim.problem_id, (lowerSeverityPrimary.get(claim.problem_id) ?? false) || supporting.some((item) => item.source_level === "primary"));
|
|
119
|
+
}
|
|
120
|
+
if (!brief.includes(claim.id)) fail(`brief does not reference key claim: ${claim.id}`);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const requiredHighKinds = ["problem-exists", "impact", "frequency", "recommended-move"];
|
|
124
|
+
highKinds.forEach((kinds, problemId) => {
|
|
125
|
+
const missing = requiredHighKinds.filter((kind) => !kinds.has(kind));
|
|
126
|
+
if (missing.length) fail(`${problemId} is high severity but is missing audited claim kinds: ${missing.join(", ")}`);
|
|
127
|
+
});
|
|
128
|
+
lowerSeverityPrimary.forEach((hasPrimary, problemId) => {
|
|
129
|
+
if (!hasPrimary) fail(`${problemId} is lower severity but has no primary supporting evidence`);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
requireArray(evidence.source_gaps, "source_gaps");
|
|
133
|
+
if (evidence.audit_summary?.status !== "complete") fail("audit_summary.status must be complete");
|
|
134
|
+
requireArray(evidence.audit_summary.audited_claim_ids, "audit_summary.audited_claim_ids", { nonEmpty: true });
|
|
135
|
+
const audited = new Set(evidence.audit_summary.audited_claim_ids);
|
|
136
|
+
audited.forEach((id) => { if (!claimIds.has(id)) fail(`audit_summary has unknown claim: ${id}`); });
|
|
137
|
+
claimIds.forEach((id) => { if (!audited.has(id)) fail(`audit_summary is missing claim: ${id}`); });
|
|
138
|
+
evidence.claims.forEach((claim) => { if (claim.audit_status === "not-audited") fail(`${claim.id} remains not-audited`); });
|
|
139
|
+
requireArray(evidence.audit_summary.notes, "audit_summary.notes");
|
|
140
|
+
return { claims: claimIds.size, evidence_items: evidenceIds.size, searches: searchIds.size };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
try {
|
|
144
|
+
const result = validate(process.argv[2], process.argv[3]);
|
|
145
|
+
process.stdout.write(`research package valid (${result.claims} claims, ${result.evidence_items} evidence items, ${result.searches} searches)\n`);
|
|
146
|
+
} catch (error) {
|
|
147
|
+
process.stderr.write(`research package invalid: ${error.message}\n`);
|
|
148
|
+
process.exitCode = 1;
|
|
149
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
8
|
+
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
9
|
+
const validator = path.join(root, "scripts/validate-research-package.mjs");
|
|
10
|
+
const template = JSON.parse(readFileSync(path.join(root, "assets/evidence-template.yaml"), "utf8"));
|
|
11
|
+
const directory = mkdtempSync(path.join(tmpdir(), "product-design-research-"));
|
|
12
|
+
const brief = path.join(directory, "sample-research-brief.md");
|
|
13
|
+
const evidence = path.join(directory, "sample-evidence.yaml");
|
|
14
|
+
const requiredHeadings = ["Research Scope", "Executive Read", "Ranked UX Problems", "Source Map", "Opportunity Map", "Evidence Limitations"];
|
|
15
|
+
|
|
16
|
+
function run(payload, expectedStatus, expectedText) {
|
|
17
|
+
writeFileSync(brief, `${requiredHeadings.map((heading) => `## ${heading}`).join("\n\n")}\n\n${payload.claims.map((claim) => claim.id).join(" ")}\n`);
|
|
18
|
+
writeFileSync(evidence, `${JSON.stringify(payload, null, 2)}\n`);
|
|
19
|
+
const result = spawnSync(process.execPath, [validator, brief, evidence], { encoding: "utf8" });
|
|
20
|
+
if (result.status !== expectedStatus || !`${result.stdout}${result.stderr}`.includes(expectedText)) {
|
|
21
|
+
throw new Error(`expected status ${expectedStatus} containing ${expectedText}, got ${result.status}: ${result.stdout}${result.stderr}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
template.scope.product = "Example";
|
|
27
|
+
template.scope.audience = "Administrators";
|
|
28
|
+
template.scope.time_horizon = "Last 90 days";
|
|
29
|
+
template.scope.research_questions = ["Where does onboarding fail?"];
|
|
30
|
+
template.scope.inclusion_criteria = ["Direct experience in scope"];
|
|
31
|
+
template.scope.exclusion_criteria = ["Unverifiable reposts"];
|
|
32
|
+
template.search_log[0].channel = "GitHub Issues";
|
|
33
|
+
template.search_log[0].query_or_corpus = "onboarding failure";
|
|
34
|
+
template.search_log[0].searched_at = "2026-09-03";
|
|
35
|
+
template.search_log[1].channel = "GitHub Issues";
|
|
36
|
+
template.search_log[1].query_or_corpus = "onboarding completed successfully";
|
|
37
|
+
template.search_log[1].searched_at = "2026-09-03";
|
|
38
|
+
template.evidence_items[0].source_class = "issue";
|
|
39
|
+
template.evidence_items[0].source_ref = "https://example.com/issues/1";
|
|
40
|
+
template.evidence_items[0].locator = "comment-1";
|
|
41
|
+
template.evidence_items[0].observed_at = "2026-09-03";
|
|
42
|
+
template.evidence_items[0].evidence_date = "2026-09-01";
|
|
43
|
+
template.evidence_items[0].observation = "A user reports that setup stopped before completion.";
|
|
44
|
+
template.claims[0].severity = "medium";
|
|
45
|
+
template.claims[0].statement = "At least one user encountered an onboarding blocker.";
|
|
46
|
+
run(template, 0, "research package valid");
|
|
47
|
+
|
|
48
|
+
const unsupported = structuredClone(template);
|
|
49
|
+
unsupported.claims[0].audit_status = "unsupported";
|
|
50
|
+
unsupported.claims[0].disposition = "publish";
|
|
51
|
+
run(unsupported, 1, "must use needs-deeper-research");
|
|
52
|
+
|
|
53
|
+
const unresolved = structuredClone(template);
|
|
54
|
+
unresolved.claims[0].evidence_refs = ["evidence-missing"];
|
|
55
|
+
run(unresolved, 1, "unresolved evidence ref");
|
|
56
|
+
|
|
57
|
+
const falseCounter = structuredClone(template);
|
|
58
|
+
falseCounter.claims[0].counter_signal_refs = ["search-001"];
|
|
59
|
+
run(falseCounter, 1, "counter-signal search must have result none-found");
|
|
60
|
+
|
|
61
|
+
const incompleteHighSeverity = structuredClone(template);
|
|
62
|
+
incompleteHighSeverity.claims[0].severity = "high";
|
|
63
|
+
run(incompleteHighSeverity, 1, "high severity but is missing audited claim kinds");
|
|
64
|
+
|
|
65
|
+
const lowerSeverityWithoutPrimary = structuredClone(template);
|
|
66
|
+
lowerSeverityWithoutPrimary.evidence_items[0].source_level = "secondary";
|
|
67
|
+
run(lowerSeverityWithoutPrimary, 1, "lower severity but has no primary supporting evidence");
|
|
68
|
+
|
|
69
|
+
process.stdout.write("research package scenarios passed (6)\n");
|
|
70
|
+
} finally {
|
|
71
|
+
rmSync(directory, { recursive: true, force: true });
|
|
72
|
+
}
|
|
@@ -74,7 +74,7 @@ The answer isn't part of the body — it's recorded on resolution (see [Work thr
|
|
|
74
74
|
|
|
75
75
|
Every ticket is either **HITL** — human in the loop, worked _with_ a human who speaks for themselves — or **AFK**, driven by the agent alone. A HITL ticket only resolves through that live exchange; the agent never stands in for the human's side of it (a grilling agent that answers its own questions has broken this).
|
|
76
76
|
|
|
77
|
-
- **Research** (AFK): Reading documentation, third-party APIs, or local resources like knowledge bases to surface a fact a decision waits on. Resolved by a `/research` **subagent
|
|
77
|
+
- **Research** (AFK): Reading documentation, third-party APIs, or local resources like knowledge bases to surface a fact a decision waits on. Resolved by a `/yss-research` **subagent** (`/research` is a deprecated alias). Use when knowledge outside the current working directory is required.
|
|
78
78
|
- **Prototype** (HITL): Raise the fidelity of the discussion by making a cheap, rough, concrete artifact to react to — an outline, a rough take, a stub, or UI/logic code via the /prototype skill. Links the prototype as an asset. Use when "how should it look" or "how should it behave" is the key question.
|
|
79
79
|
- **Grilling** (HITL): Conversation. The default case. Always invoke the /grilling and /domain-modeling skills.
|
|
80
80
|
- **Task** (HITL or AFK): Manual work that must happen before a _decision_ can be made — nothing to decide, prototype, or research, but the discussion is blocked until it's done. Signing up for a service so its API can be judged, provisioning access, moving data so its shape can be seen. This is the one type that _does_ rather than decides — and it earns its place by unblocking a decision, not by delivering the destination. The agent drives it alone where it can (AFK); otherwise it hands the human a precise checklist (HITL). Resolved when the work is done; the answer records what was done and any resulting facts (credentials location, new URLs, row counts) later tickets depend on.
|
|
@@ -112,7 +112,7 @@ User invokes with a loose idea.
|
|
|
112
112
|
2. **Map the frontier.** Grill again, **breadth-first** this time: fan out across the whole space rather than deep on any one thread, surfacing the open decisions and the first steps takeable now. **If this surfaces no fog** — the way to the destination is already clear, the whole journey small enough for one session — you don't need a map. Stop and ask the user how they'd like to proceed.
|
|
113
113
|
3. **Create the map** (label `wayfinder:map`): Destination and Notes filled in, Decisions-so-far empty, the fog sketched into **Not yet specified**.
|
|
114
114
|
4. **Create the tickets you can specify now** as child issues of the map — then wire blocking edges in a **second pass** (issues need ids before they can reference each other). Wiring sorts them into the frontier and the blocked; everything you can't yet specify stays in the fog — the **Not yet specified** section.
|
|
115
|
-
5. **Fire the research subagents.** For each `research` ticket you just created, spin up a `/research` subagent to resolve it in parallel, capturing its findings on a throwaway `research/<name>` branch with a context pointer from the ticket.
|
|
115
|
+
5. **Fire the research subagents.** For each `research` ticket you just created, spin up a `/yss-research` subagent to resolve it in parallel, capturing its findings on a throwaway `research/<name>` branch with a context pointer from the ticket. `/research` remains only as a deprecated compatibility alias.
|
|
116
116
|
6. Stop — charting is one session's work; it hand-resolves nothing.
|
|
117
117
|
|
|
118
118
|
### Work through the map
|
|
@@ -28,7 +28,7 @@ description: 用于生成完整的 YSS DDD 多模块后端脚手架。当用户
|
|
|
28
28
|
2. 优先运行 `node scripts/generate_and_verify_scaffold.mjs`,在同一个受控工作流中生成骨架并执行真实 Maven 验证。`generate_scaffold.mjs` 只是底层生成原语,单独返回 0 不代表脚手架完成。
|
|
29
29
|
3. 检查生成的模块名、POM、机械启动入口、基础配置文件和包路径。
|
|
30
30
|
4. 受控工作流必须在生成项目根目录实际执行 `./mvnw validate`、`./mvnw test` 和 `./mvnw package`;三条命令全部返回 0 后才能报告完成。
|
|
31
|
-
5. 三条 Wrapper 命令通过只得到 `empty-scaffold-verified
|
|
31
|
+
5. 三条 Wrapper 命令通过只得到 `empty-scaffold-verified`。如需声称已满足下游技能的首切片就绪条件,必须使用 `node scripts/run_first_slice_verification.mjs` 校验批准且版本当前的 Slice Implementation Contract、完整分层产物、skill tree digest 与根 Wrapper;只有验证器成功更新 Manifest 后才得到 `first-slice-verified`。
|
|
32
32
|
|
|
33
33
|
受控验证命令由本 skill 的 `node scripts/run_scaffold_verification.mjs` 固定执行;验证器先检查 `.yss/scaffold-generation.json` 的合同元数据和 Wrapper、Java、项目级 Maven settings/profile、仓库凭据是否就绪,再在指定 evidence 目录写入每条命令的 stdout/stderr、`exit_code`、`failure_category`、耗时、执行时间和 `scaffold-verification.json`。仓库或凭据失败归为 `repository-access`,与 `project-model`、`compilation`、`bootstrap-entrypoint`、`test-failure`、`packaging` 分开;任何一条命令失败或未执行都必须阻断。
|
|
34
34
|
|
|
@@ -55,6 +55,15 @@ node scripts/generate_and_verify_scaffold.mjs \
|
|
|
55
55
|
--evidence-dir /path/to/evidence/scaffold
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
+
完成批准的 golden first slice 后运行:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
node scripts/run_first_slice_verification.mjs \
|
|
62
|
+
--project-root /path/to/implementation-repo/my-service \
|
|
63
|
+
--slice-contract-file /path/to/approved-slice-contract.json \
|
|
64
|
+
--evidence-dir /path/to/evidence/first-slice
|
|
65
|
+
```
|
|
66
|
+
|
|
58
67
|
## 生成结果应包含
|
|
59
68
|
|
|
60
69
|
- 父工程 POM
|
|
@@ -75,7 +84,7 @@ node scripts/generate_and_verify_scaffold.mjs \
|
|
|
75
84
|
- Harness 内多项目布局必须使用 `apps/backend/<project>/`;`apps/backend/` 只能是生成器的父容器,`app/backend/`、`app/frontend/` 及其子路径一律拒绝。`git-submodule` gitlink、空挂载点、detached HEAD 工作树不得覆盖生成,即使传入 `--force` 也不得当成普通目录,且不得走「请显式传入 `--force`」普通目录覆盖 / rename 路径。`--output-dir` 指向 detached HEAD 子仓时不得 mkdir、staging 或生成工程。先 `git submodule update --init` 并在子仓附加分支工作树内生成。生成器必须先调用 `gitSubmoduleScaffoldViolation`,再在 exists / `--force` / rename 之前调用 `refuseGitlinkAsRegularDirectory`。
|
|
76
85
|
- 不要在 skill 里硬编码用户业务字段或真实连接信息。
|
|
77
86
|
- 生成后要检查依赖关系是否仍符合分层约束。
|
|
78
|
-
-
|
|
87
|
+
- 生成时的静态依赖由技能注册表与 Router 共同约束为 `yss-backend-scaffold-parent`、`alibaba-java-code-style`。生成后必须回到 Router,并按批准切片加载 `yss-domain`、`yss-application`、`yss-repository`、`yss-mybatis`、`yss-web-controller`、`yss-dto`、`yss-exception`、`yss-validation`、`mapstruct`、`lombok`、`alibaba-java-code-style` 等实际命中的行为 skill。
|
|
79
88
|
- 当前脚手架第一阶段仅支持经过验证的 `mysql`;未提供完整模板和验证的数据库类型不得伪装成已支持。
|
|
80
89
|
- 生成后的后端工程必须使用项目根目录 `./mvnw ...` 执行构建、测试、运行和 CI 验证;不得在 README、实施记录、Ticket、Review 或 Release 中默认写裸 `mvn ...`。既有仓库确实无法使用 wrapper 时,必须记录受控例外。
|
|
81
90
|
- 原型确认后,`scaffold_status=required` 才能进入本 skill;本 skill 的生成边界是工程结构、POM、配置、Wrapper 和机械模板,不是业务实现。
|
|
@@ -83,7 +92,8 @@ node scripts/generate_and_verify_scaffold.mjs \
|
|
|
83
92
|
- 新脚手架合同只接受 schema v2,必须分别携带 `project_name`、`base_package` 和 `maven_coordinates`;后者包含项目 `group_id` / `project_version`、父 POM GAV 与 `yss_components_version`,并由 CLI 原样传入。schema v1 为 `unsupported`,直接拒绝且不自动升级。
|
|
84
93
|
- 合同 `profiles` 只支持 `target-domain-model`、`mybatis-plus`、`mysql`、`spring-boot-2.7-jdk8`、`javax`、`web`、`yss-internal`。普通 MyBatis、Boot 3、独立 client module、client-in-domain 和其他旧架构均为 `unsupported`,不提供回退分支。
|
|
85
94
|
- 运行生成器必须传入 `--contract-file`;生成器会校验合同 `status=approved`、`current_version`、`primary_skill`、`controlled-generation`、实际输出路径和固定三条验证命令,不接受仅凭任意字符串引用的放行。
|
|
86
|
-
- 生成项目必须写入 Manifest v2 `.yss/scaffold-generation.json`,记录合同 digest、Target Profile、模板 digest
|
|
95
|
+
- 生成项目必须写入 Manifest v2 `.yss/scaffold-generation.json`,记录合同 digest、Target Profile、模板 digest、下游完整 skill tree digest、脚手架父合同与 Router 合同 digest、generator-owned 文件 hash、严格 `generation_policy` 和完成等级;清单缺失或不一致时不得交给后续 Router。
|
|
96
|
+
- `first-slice-verified` 只能由 `run_first_slice_verification.mjs` 写入。手工改 Manifest、只生成 Controller、只通过局部模块测试或仅有结构扫描都不能升级完成等级。
|
|
87
97
|
- 严禁把领域规则、状态机、权限、事务、复杂查询、错误映射、业务字段或用户可见行为塞进脚手架生成步骤。`./mvnw validate`、输出目录存在或“生成成功”都不等于生命周期批准、架构放行或 `ready-for-agent`。
|
|
88
98
|
- 生命周期脚手架生成必须关闭 `--with-example`,不得把 User CRUD 或业务字段当作样板。生成器严格 `initialize-only`:非空目标、`--force`、旧项目迁移和当前模板升级一律 `unsupported`。未来若支持同一 Target Profile 内的模板升级,必须另行设计和批准,当前不预留可执行承诺。
|
|
89
99
|
- 脚手架完成后,所有后续生成的后端代码必须回到 `yss-router`,消费批准且版本当前的 Slice Implementation Contract 和对应 YSS skill;业务行为使用 `behavior-tdd`,机械生成才使用 `controlled-generation`。
|
|
@@ -98,6 +108,7 @@ node scripts/generate_and_verify_scaffold.mjs \
|
|
|
98
108
|
- 主脚本:`scripts/generate_scaffold.mjs`
|
|
99
109
|
- 推荐的一键生成验证入口:`scripts/generate_and_verify_scaffold.mjs`
|
|
100
110
|
- 受控验证器:`scripts/run_scaffold_verification.mjs`
|
|
111
|
+
- 首切片验证器:`scripts/run_first_slice_verification.mjs`
|
|
101
112
|
- 模板目录:`assets/templates/`
|
|
102
113
|
- 分层细化参考:`references/yss-backend-scaffold-parent/` 及其子 skill
|
|
103
114
|
|
|
@@ -104,13 +104,13 @@ Domain Error -> Application propagation/translation -> Web Exception Translator
|
|
|
104
104
|
|
|
105
105
|
- Scaffold 只生成机械模块、POM、Wrapper、配置、架构规则和 Manifest,不生成生产业务 CRUD。
|
|
106
106
|
- 初始生成器为 `initialize-only`,非空目标失败。
|
|
107
|
-
- Manifest v2
|
|
107
|
+
- Manifest v2 记录模板、脚手架父合同、Router 合同、downstream 完整 skill tree digest 与 generator-owned 文件 hash。
|
|
108
108
|
- 当前不支持模板升级,不得重跑初始生成器覆盖业务工程。未来如需支持同一 Target Profile 内的模板版本升级,必须另行设计、批准并验证。
|
|
109
109
|
|
|
110
110
|
## 5. 完成等级
|
|
111
111
|
|
|
112
112
|
- `generated`:文件已原子生成,尚未完成 Wrapper 验证。
|
|
113
113
|
- `empty-scaffold-verified`:根目录 `./mvnw validate/test/package` 全部通过。
|
|
114
|
-
- `first-slice-verified
|
|
114
|
+
- `first-slice-verified`:批准且版本当前的 golden first slice 已具备 Domain 模型/Gateway、Application Service 实现/事务/Query Port、Repository/Mapper/GatewayImpl/QueryAdapter、DTO/Web/Exception 与分层测试;下游完整 skill tree digest 无漂移,且根 Wrapper 全部通过。该状态只能由 `scripts/run_first_slice_verification.mjs` 写入。
|
|
115
115
|
|
|
116
|
-
|
|
116
|
+
只有首切片验证器可以把 Manifest 从 `empty-scaffold-verified` 升级到最后一级;手工写值、局部测试或结构扫描均无效。只有最后一级可以声明已满足下游 YSS skills 的首切片就绪条件。
|
|
@@ -102,7 +102,18 @@ metadata-service/
|
|
|
102
102
|
|
|
103
103
|
## 4. 后续路由
|
|
104
104
|
|
|
105
|
-
`empty-scaffold-verified` 不等于业务切片可实现。后续必须回到 `yss-router`,消费批准且版本当前的 Slice Implementation Contract,再按影响面加载 `yss-domain`、`yss-application`、`yss-repository`、`yss-mybatis`、`yss-dto`、`yss-exception`、`yss-
|
|
105
|
+
`empty-scaffold-verified` 不等于业务切片可实现。后续必须回到 `yss-router`,消费批准且版本当前的 Slice Implementation Contract,再按影响面加载 `yss-domain`、`yss-application`、`yss-repository`、`yss-mybatis`、`yss-web-controller`、`yss-dto`、`yss-exception`、`yss-validation`、`mapstruct`、`lombok`、`alibaba-java-code-style` 等 skill,并使用 `behavior-tdd` 实现业务行为。
|
|
106
|
+
|
|
107
|
+
完成 golden first slice 后,必须运行:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
node .agents/skills/yss-ddd-scaffold-generator/scripts/run_first_slice_verification.mjs \
|
|
111
|
+
--project-root /path/to/implementation-repo/metadata-service \
|
|
112
|
+
--slice-contract-file /path/to/approved-slice-contract.json \
|
|
113
|
+
--evidence-dir /path/to/evidence/first-slice
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
只有该验证器确认合同、全层产物、skill tree digest 与根 Wrapper 全部通过,并更新 Manifest 后,才能标记 `first-slice-verified`。
|
|
106
117
|
|
|
107
118
|
目标目录必须不存在。`--force`、旧项目迁移和当前模板升级均为 `unsupported`。旧项目继续按原工程维护;现代化改造必须单独立项、先评估再逐切片迁移。
|
|
108
119
|
|
|
@@ -45,7 +45,7 @@ infrastructure-+
|
|
|
45
45
|
- Maven 内部仓库通过命名 profile `yss-internal` 与环境变量注入;共享模板不写内部 URL 或凭据。
|
|
46
46
|
- Wrapper 必须带 checksum;DEBUG 和 MyBatis stdout SQL 只允许在 `application-local.yml`。
|
|
47
47
|
- `./mvnw validate`、`./mvnw test`、`./mvnw package` 全部成功只得到 `empty-scaffold-verified`。
|
|
48
|
-
-
|
|
48
|
+
- 只有批准且版本当前的 golden first slice 真实组合 Domain/Application/Infrastructure/Web、通过下游 skill tree drift 校验与根 Wrapper,才能由 `run_first_slice_verification.mjs` 写入 `first-slice-verified`。
|
|
49
49
|
|
|
50
50
|
## 下游权威技能
|
|
51
51
|
|
|
@@ -53,5 +53,6 @@ infrastructure-+
|
|
|
53
53
|
- Application:`yss-application`
|
|
54
54
|
- Persistence:`yss-repository` + `yss-mybatis`
|
|
55
55
|
- Web:`yss-web-controller` + `yss-dto` + `yss-exception`
|
|
56
|
+
- 横切实现约束:`yss-validation` + `mapstruct` + `lombok` + `alibaba-java-code-style`
|
|
56
57
|
|
|
57
58
|
业务代码必须回到 `yss-router`,消费批准且版本当前的 Slice Implementation Contract,并采用 `behavior-tdd`;脚手架只生成机械工程资产。
|