@zigrivers/scaffold 2.1.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/LICENSE +21 -0
- package/README.md +477 -0
- package/dist/cli/commands/adopt.d.ts +12 -0
- package/dist/cli/commands/adopt.d.ts.map +1 -0
- package/dist/cli/commands/adopt.js +107 -0
- package/dist/cli/commands/adopt.js.map +1 -0
- package/dist/cli/commands/adopt.test.d.ts +2 -0
- package/dist/cli/commands/adopt.test.d.ts.map +1 -0
- package/dist/cli/commands/adopt.test.js +277 -0
- package/dist/cli/commands/adopt.test.js.map +1 -0
- package/dist/cli/commands/build.d.ts +12 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +105 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/build.test.d.ts +2 -0
- package/dist/cli/commands/build.test.d.ts.map +1 -0
- package/dist/cli/commands/build.test.js +272 -0
- package/dist/cli/commands/build.test.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +14 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +102 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/dashboard.test.d.ts +2 -0
- package/dist/cli/commands/dashboard.test.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.test.js +142 -0
- package/dist/cli/commands/dashboard.test.js.map +1 -0
- package/dist/cli/commands/decisions.d.ts +13 -0
- package/dist/cli/commands/decisions.d.ts.map +1 -0
- package/dist/cli/commands/decisions.js +62 -0
- package/dist/cli/commands/decisions.js.map +1 -0
- package/dist/cli/commands/decisions.test.d.ts +2 -0
- package/dist/cli/commands/decisions.test.d.ts.map +1 -0
- package/dist/cli/commands/decisions.test.js +154 -0
- package/dist/cli/commands/decisions.test.js.map +1 -0
- package/dist/cli/commands/info.d.ts +12 -0
- package/dist/cli/commands/info.d.ts.map +1 -0
- package/dist/cli/commands/info.js +110 -0
- package/dist/cli/commands/info.js.map +1 -0
- package/dist/cli/commands/info.test.d.ts +2 -0
- package/dist/cli/commands/info.test.d.ts.map +1 -0
- package/dist/cli/commands/info.test.js +392 -0
- package/dist/cli/commands/info.test.js.map +1 -0
- package/dist/cli/commands/init.d.ts +13 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +46 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/init.test.d.ts +2 -0
- package/dist/cli/commands/init.test.d.ts.map +1 -0
- package/dist/cli/commands/init.test.js +156 -0
- package/dist/cli/commands/init.test.js.map +1 -0
- package/dist/cli/commands/knowledge.d.ts +4 -0
- package/dist/cli/commands/knowledge.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.js +346 -0
- package/dist/cli/commands/knowledge.js.map +1 -0
- package/dist/cli/commands/knowledge.test.d.ts +2 -0
- package/dist/cli/commands/knowledge.test.d.ts.map +1 -0
- package/dist/cli/commands/knowledge.test.js +293 -0
- package/dist/cli/commands/knowledge.test.js.map +1 -0
- package/dist/cli/commands/list.d.ts +12 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +73 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/list.test.d.ts +2 -0
- package/dist/cli/commands/list.test.d.ts.map +1 -0
- package/dist/cli/commands/list.test.js +166 -0
- package/dist/cli/commands/list.test.js.map +1 -0
- package/dist/cli/commands/next.d.ts +12 -0
- package/dist/cli/commands/next.d.ts.map +1 -0
- package/dist/cli/commands/next.js +75 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/next.test.d.ts +2 -0
- package/dist/cli/commands/next.test.d.ts.map +1 -0
- package/dist/cli/commands/next.test.js +236 -0
- package/dist/cli/commands/next.test.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +13 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +105 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/reset.test.d.ts +2 -0
- package/dist/cli/commands/reset.test.d.ts.map +1 -0
- package/dist/cli/commands/reset.test.js +211 -0
- package/dist/cli/commands/reset.test.js.map +1 -0
- package/dist/cli/commands/run.d.ts +14 -0
- package/dist/cli/commands/run.d.ts.map +1 -0
- package/dist/cli/commands/run.js +379 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/run.test.d.ts +2 -0
- package/dist/cli/commands/run.test.d.ts.map +1 -0
- package/dist/cli/commands/run.test.js +535 -0
- package/dist/cli/commands/run.test.js.map +1 -0
- package/dist/cli/commands/skip.d.ts +13 -0
- package/dist/cli/commands/skip.d.ts.map +1 -0
- package/dist/cli/commands/skip.js +123 -0
- package/dist/cli/commands/skip.js.map +1 -0
- package/dist/cli/commands/skip.test.d.ts +2 -0
- package/dist/cli/commands/skip.test.d.ts.map +1 -0
- package/dist/cli/commands/skip.test.js +339 -0
- package/dist/cli/commands/skip.test.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +79 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/status.test.d.ts +2 -0
- package/dist/cli/commands/status.test.d.ts.map +1 -0
- package/dist/cli/commands/status.test.js +245 -0
- package/dist/cli/commands/status.test.js.map +1 -0
- package/dist/cli/commands/update.d.ts +11 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +159 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/update.test.d.ts +2 -0
- package/dist/cli/commands/update.test.d.ts.map +1 -0
- package/dist/cli/commands/update.test.js +140 -0
- package/dist/cli/commands/update.test.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +12 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +65 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/validate.test.d.ts +2 -0
- package/dist/cli/commands/validate.test.d.ts.map +1 -0
- package/dist/cli/commands/validate.test.js +159 -0
- package/dist/cli/commands/validate.test.js.map +1 -0
- package/dist/cli/commands/version.d.ts +13 -0
- package/dist/cli/commands/version.d.ts.map +1 -0
- package/dist/cli/commands/version.js +89 -0
- package/dist/cli/commands/version.js.map +1 -0
- package/dist/cli/commands/version.test.d.ts +2 -0
- package/dist/cli/commands/version.test.d.ts.map +1 -0
- package/dist/cli/commands/version.test.js +63 -0
- package/dist/cli/commands/version.test.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +72 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.test.d.ts +2 -0
- package/dist/cli/index.test.d.ts.map +1 -0
- package/dist/cli/index.test.js +8 -0
- package/dist/cli/index.test.js.map +1 -0
- package/dist/cli/middleware/output-mode.d.ts +21 -0
- package/dist/cli/middleware/output-mode.d.ts.map +1 -0
- package/dist/cli/middleware/output-mode.js +27 -0
- package/dist/cli/middleware/output-mode.js.map +1 -0
- package/dist/cli/middleware/output-mode.test.d.ts +2 -0
- package/dist/cli/middleware/output-mode.test.d.ts.map +1 -0
- package/dist/cli/middleware/output-mode.test.js +41 -0
- package/dist/cli/middleware/output-mode.test.js.map +1 -0
- package/dist/cli/middleware/project-root.d.ts +21 -0
- package/dist/cli/middleware/project-root.d.ts.map +1 -0
- package/dist/cli/middleware/project-root.js +54 -0
- package/dist/cli/middleware/project-root.js.map +1 -0
- package/dist/cli/middleware/project-root.test.d.ts +2 -0
- package/dist/cli/middleware/project-root.test.d.ts.map +1 -0
- package/dist/cli/middleware/project-root.test.js +112 -0
- package/dist/cli/middleware/project-root.test.js.map +1 -0
- package/dist/cli/output/auto.d.ts +18 -0
- package/dist/cli/output/auto.d.ts.map +1 -0
- package/dist/cli/output/auto.js +43 -0
- package/dist/cli/output/auto.js.map +1 -0
- package/dist/cli/output/context.d.ts +19 -0
- package/dist/cli/output/context.d.ts.map +1 -0
- package/dist/cli/output/context.js +15 -0
- package/dist/cli/output/context.js.map +1 -0
- package/dist/cli/output/context.test.d.ts +2 -0
- package/dist/cli/output/context.test.d.ts.map +1 -0
- package/dist/cli/output/context.test.js +335 -0
- package/dist/cli/output/context.test.js.map +1 -0
- package/dist/cli/output/error-display.d.ts +31 -0
- package/dist/cli/output/error-display.d.ts.map +1 -0
- package/dist/cli/output/error-display.js +79 -0
- package/dist/cli/output/error-display.js.map +1 -0
- package/dist/cli/output/error-display.test.d.ts +2 -0
- package/dist/cli/output/error-display.test.d.ts.map +1 -0
- package/dist/cli/output/error-display.test.js +230 -0
- package/dist/cli/output/error-display.test.js.map +1 -0
- package/dist/cli/output/interactive.d.ts +22 -0
- package/dist/cli/output/interactive.d.ts.map +1 -0
- package/dist/cli/output/interactive.js +126 -0
- package/dist/cli/output/interactive.js.map +1 -0
- package/dist/cli/output/json.d.ts +17 -0
- package/dist/cli/output/json.d.ts.map +1 -0
- package/dist/cli/output/json.js +62 -0
- package/dist/cli/output/json.js.map +1 -0
- package/dist/cli/types.d.ts +11 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/config/loader.d.ts +22 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +159 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.test.d.ts +2 -0
- package/dist/config/loader.test.d.ts.map +1 -0
- package/dist/config/loader.test.js +226 -0
- package/dist/config/loader.test.js.map +1 -0
- package/dist/config/migration.d.ts +15 -0
- package/dist/config/migration.d.ts.map +1 -0
- package/dist/config/migration.js +39 -0
- package/dist/config/migration.js.map +1 -0
- package/dist/config/migration.test.d.ts +2 -0
- package/dist/config/migration.test.d.ts.map +1 -0
- package/dist/config/migration.test.js +44 -0
- package/dist/config/migration.test.js.map +1 -0
- package/dist/config/schema.d.ts +121 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +22 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/schema.test.d.ts +2 -0
- package/dist/config/schema.test.d.ts.map +1 -0
- package/dist/config/schema.test.js +126 -0
- package/dist/config/schema.test.js.map +1 -0
- package/dist/core/adapters/adapter.d.ts +64 -0
- package/dist/core/adapters/adapter.d.ts.map +1 -0
- package/dist/core/adapters/adapter.js +25 -0
- package/dist/core/adapters/adapter.js.map +1 -0
- package/dist/core/adapters/adapter.test.d.ts +2 -0
- package/dist/core/adapters/adapter.test.d.ts.map +1 -0
- package/dist/core/adapters/adapter.test.js +175 -0
- package/dist/core/adapters/adapter.test.js.map +1 -0
- package/dist/core/adapters/claude-code.d.ts +9 -0
- package/dist/core/adapters/claude-code.d.ts.map +1 -0
- package/dist/core/adapters/claude-code.js +34 -0
- package/dist/core/adapters/claude-code.js.map +1 -0
- package/dist/core/adapters/claude-code.test.d.ts +2 -0
- package/dist/core/adapters/claude-code.test.d.ts.map +1 -0
- package/dist/core/adapters/claude-code.test.js +100 -0
- package/dist/core/adapters/claude-code.test.js.map +1 -0
- package/dist/core/adapters/codex.d.ts +10 -0
- package/dist/core/adapters/codex.d.ts.map +1 -0
- package/dist/core/adapters/codex.js +61 -0
- package/dist/core/adapters/codex.js.map +1 -0
- package/dist/core/adapters/codex.test.d.ts +2 -0
- package/dist/core/adapters/codex.test.d.ts.map +1 -0
- package/dist/core/adapters/codex.test.js +122 -0
- package/dist/core/adapters/codex.test.js.map +1 -0
- package/dist/core/adapters/universal.d.ts +10 -0
- package/dist/core/adapters/universal.d.ts.map +1 -0
- package/dist/core/adapters/universal.js +45 -0
- package/dist/core/adapters/universal.js.map +1 -0
- package/dist/core/adapters/universal.test.d.ts +2 -0
- package/dist/core/adapters/universal.test.d.ts.map +1 -0
- package/dist/core/adapters/universal.test.js +121 -0
- package/dist/core/adapters/universal.test.js.map +1 -0
- package/dist/core/assembly/context-gatherer.d.ts +17 -0
- package/dist/core/assembly/context-gatherer.d.ts.map +1 -0
- package/dist/core/assembly/context-gatherer.js +49 -0
- package/dist/core/assembly/context-gatherer.js.map +1 -0
- package/dist/core/assembly/context-gatherer.test.d.ts +2 -0
- package/dist/core/assembly/context-gatherer.test.d.ts.map +1 -0
- package/dist/core/assembly/context-gatherer.test.js +252 -0
- package/dist/core/assembly/context-gatherer.test.js.map +1 -0
- package/dist/core/assembly/depth-resolver.d.ts +11 -0
- package/dist/core/assembly/depth-resolver.d.ts.map +1 -0
- package/dist/core/assembly/depth-resolver.js +23 -0
- package/dist/core/assembly/depth-resolver.js.map +1 -0
- package/dist/core/assembly/depth-resolver.test.d.ts +2 -0
- package/dist/core/assembly/depth-resolver.test.d.ts.map +1 -0
- package/dist/core/assembly/depth-resolver.test.js +100 -0
- package/dist/core/assembly/depth-resolver.test.js.map +1 -0
- package/dist/core/assembly/engine.d.ts +22 -0
- package/dist/core/assembly/engine.d.ts.map +1 -0
- package/dist/core/assembly/engine.js +215 -0
- package/dist/core/assembly/engine.js.map +1 -0
- package/dist/core/assembly/engine.test.d.ts +2 -0
- package/dist/core/assembly/engine.test.d.ts.map +1 -0
- package/dist/core/assembly/engine.test.js +462 -0
- package/dist/core/assembly/engine.test.js.map +1 -0
- package/dist/core/assembly/instruction-loader.d.ts +16 -0
- package/dist/core/assembly/instruction-loader.d.ts.map +1 -0
- package/dist/core/assembly/instruction-loader.js +40 -0
- package/dist/core/assembly/instruction-loader.js.map +1 -0
- package/dist/core/assembly/instruction-loader.test.d.ts +2 -0
- package/dist/core/assembly/instruction-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/instruction-loader.test.js +109 -0
- package/dist/core/assembly/instruction-loader.test.js.map +1 -0
- package/dist/core/assembly/knowledge-loader.d.ts +34 -0
- package/dist/core/assembly/knowledge-loader.d.ts.map +1 -0
- package/dist/core/assembly/knowledge-loader.js +204 -0
- package/dist/core/assembly/knowledge-loader.js.map +1 -0
- package/dist/core/assembly/knowledge-loader.test.d.ts +2 -0
- package/dist/core/assembly/knowledge-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/knowledge-loader.test.js +205 -0
- package/dist/core/assembly/knowledge-loader.test.js.map +1 -0
- package/dist/core/assembly/meta-prompt-loader.d.ts +13 -0
- package/dist/core/assembly/meta-prompt-loader.d.ts.map +1 -0
- package/dist/core/assembly/meta-prompt-loader.js +91 -0
- package/dist/core/assembly/meta-prompt-loader.js.map +1 -0
- package/dist/core/assembly/meta-prompt-loader.test.d.ts +2 -0
- package/dist/core/assembly/meta-prompt-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/meta-prompt-loader.test.js +232 -0
- package/dist/core/assembly/meta-prompt-loader.test.js.map +1 -0
- package/dist/core/assembly/methodology-change.d.ts +27 -0
- package/dist/core/assembly/methodology-change.d.ts.map +1 -0
- package/dist/core/assembly/methodology-change.js +41 -0
- package/dist/core/assembly/methodology-change.js.map +1 -0
- package/dist/core/assembly/methodology-change.test.d.ts +2 -0
- package/dist/core/assembly/methodology-change.test.d.ts.map +1 -0
- package/dist/core/assembly/methodology-change.test.js +145 -0
- package/dist/core/assembly/methodology-change.test.js.map +1 -0
- package/dist/core/assembly/methodology-resolver.d.ts +11 -0
- package/dist/core/assembly/methodology-resolver.d.ts.map +1 -0
- package/dist/core/assembly/methodology-resolver.js +19 -0
- package/dist/core/assembly/methodology-resolver.js.map +1 -0
- package/dist/core/assembly/methodology-resolver.test.d.ts +2 -0
- package/dist/core/assembly/methodology-resolver.test.d.ts.map +1 -0
- package/dist/core/assembly/methodology-resolver.test.js +87 -0
- package/dist/core/assembly/methodology-resolver.test.js.map +1 -0
- package/dist/core/assembly/preset-loader.d.ts +26 -0
- package/dist/core/assembly/preset-loader.d.ts.map +1 -0
- package/dist/core/assembly/preset-loader.js +146 -0
- package/dist/core/assembly/preset-loader.js.map +1 -0
- package/dist/core/assembly/preset-loader.test.d.ts +2 -0
- package/dist/core/assembly/preset-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/preset-loader.test.js +107 -0
- package/dist/core/assembly/preset-loader.test.js.map +1 -0
- package/dist/core/assembly/update-mode.d.ts +25 -0
- package/dist/core/assembly/update-mode.d.ts.map +1 -0
- package/dist/core/assembly/update-mode.js +70 -0
- package/dist/core/assembly/update-mode.js.map +1 -0
- package/dist/core/assembly/update-mode.test.d.ts +2 -0
- package/dist/core/assembly/update-mode.test.d.ts.map +1 -0
- package/dist/core/assembly/update-mode.test.js +235 -0
- package/dist/core/assembly/update-mode.test.js.map +1 -0
- package/dist/core/dependency/dependency.d.ts +20 -0
- package/dist/core/dependency/dependency.d.ts.map +1 -0
- package/dist/core/dependency/dependency.js +104 -0
- package/dist/core/dependency/dependency.js.map +1 -0
- package/dist/core/dependency/dependency.test.d.ts +2 -0
- package/dist/core/dependency/dependency.test.d.ts.map +1 -0
- package/dist/core/dependency/dependency.test.js +166 -0
- package/dist/core/dependency/dependency.test.js.map +1 -0
- package/dist/core/dependency/eligibility.d.ts +17 -0
- package/dist/core/dependency/eligibility.d.ts.map +1 -0
- package/dist/core/dependency/eligibility.js +60 -0
- package/dist/core/dependency/eligibility.js.map +1 -0
- package/dist/core/dependency/eligibility.test.d.ts +2 -0
- package/dist/core/dependency/eligibility.test.d.ts.map +1 -0
- package/dist/core/dependency/eligibility.test.js +198 -0
- package/dist/core/dependency/eligibility.test.js.map +1 -0
- package/dist/core/dependency/graph.d.ts +12 -0
- package/dist/core/dependency/graph.d.ts.map +1 -0
- package/dist/core/dependency/graph.js +34 -0
- package/dist/core/dependency/graph.js.map +1 -0
- package/dist/core/knowledge/knowledge-update-assembler.d.ts +24 -0
- package/dist/core/knowledge/knowledge-update-assembler.d.ts.map +1 -0
- package/dist/core/knowledge/knowledge-update-assembler.js +46 -0
- package/dist/core/knowledge/knowledge-update-assembler.js.map +1 -0
- package/dist/core/knowledge/knowledge-update-assembler.test.d.ts +2 -0
- package/dist/core/knowledge/knowledge-update-assembler.test.d.ts.map +1 -0
- package/dist/core/knowledge/knowledge-update-assembler.test.js +93 -0
- package/dist/core/knowledge/knowledge-update-assembler.test.js.map +1 -0
- package/dist/core/knowledge/knowledge-update-template.md +55 -0
- package/dist/dashboard/generator.d.ts +37 -0
- package/dist/dashboard/generator.d.ts.map +1 -0
- package/dist/dashboard/generator.js +42 -0
- package/dist/dashboard/generator.js.map +1 -0
- package/dist/dashboard/generator.test.d.ts +2 -0
- package/dist/dashboard/generator.test.d.ts.map +1 -0
- package/dist/dashboard/generator.test.js +186 -0
- package/dist/dashboard/generator.test.js.map +1 -0
- package/dist/dashboard/template.d.ts +4 -0
- package/dist/dashboard/template.d.ts.map +1 -0
- package/dist/dashboard/template.js +190 -0
- package/dist/dashboard/template.js.map +1 -0
- package/dist/e2e/commands.test.d.ts +9 -0
- package/dist/e2e/commands.test.d.ts.map +1 -0
- package/dist/e2e/commands.test.js +499 -0
- package/dist/e2e/commands.test.js.map +1 -0
- package/dist/e2e/init.test.d.ts +10 -0
- package/dist/e2e/init.test.d.ts.map +1 -0
- package/dist/e2e/init.test.js +180 -0
- package/dist/e2e/init.test.js.map +1 -0
- package/dist/e2e/knowledge.test.d.ts +2 -0
- package/dist/e2e/knowledge.test.d.ts.map +1 -0
- package/dist/e2e/knowledge.test.js +103 -0
- package/dist/e2e/knowledge.test.js.map +1 -0
- package/dist/e2e/pipeline.test.d.ts +8 -0
- package/dist/e2e/pipeline.test.d.ts.map +1 -0
- package/dist/e2e/pipeline.test.js +295 -0
- package/dist/e2e/pipeline.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/project/adopt.d.ts +28 -0
- package/dist/project/adopt.d.ts.map +1 -0
- package/dist/project/adopt.js +49 -0
- package/dist/project/adopt.js.map +1 -0
- package/dist/project/adopt.test.d.ts +2 -0
- package/dist/project/adopt.test.d.ts.map +1 -0
- package/dist/project/adopt.test.js +220 -0
- package/dist/project/adopt.test.js.map +1 -0
- package/dist/project/claude-md.d.ts +33 -0
- package/dist/project/claude-md.d.ts.map +1 -0
- package/dist/project/claude-md.js +112 -0
- package/dist/project/claude-md.js.map +1 -0
- package/dist/project/claude-md.test.d.ts +2 -0
- package/dist/project/claude-md.test.d.ts.map +1 -0
- package/dist/project/claude-md.test.js +151 -0
- package/dist/project/claude-md.test.js.map +1 -0
- package/dist/project/detector.d.ts +7 -0
- package/dist/project/detector.d.ts.map +1 -0
- package/dist/project/detector.js +78 -0
- package/dist/project/detector.js.map +1 -0
- package/dist/project/detector.test.d.ts +2 -0
- package/dist/project/detector.test.d.ts.map +1 -0
- package/dist/project/detector.test.js +137 -0
- package/dist/project/detector.test.js.map +1 -0
- package/dist/project/frontmatter.d.ts +17 -0
- package/dist/project/frontmatter.d.ts.map +1 -0
- package/dist/project/frontmatter.js +236 -0
- package/dist/project/frontmatter.js.map +1 -0
- package/dist/project/frontmatter.test.d.ts +2 -0
- package/dist/project/frontmatter.test.d.ts.map +1 -0
- package/dist/project/frontmatter.test.js +218 -0
- package/dist/project/frontmatter.test.js.map +1 -0
- package/dist/project/signals.d.ts +12 -0
- package/dist/project/signals.d.ts.map +1 -0
- package/dist/project/signals.js +2 -0
- package/dist/project/signals.js.map +1 -0
- package/dist/state/completion.d.ts +22 -0
- package/dist/state/completion.d.ts.map +1 -0
- package/dist/state/completion.js +82 -0
- package/dist/state/completion.js.map +1 -0
- package/dist/state/completion.test.d.ts +2 -0
- package/dist/state/completion.test.d.ts.map +1 -0
- package/dist/state/completion.test.js +246 -0
- package/dist/state/completion.test.js.map +1 -0
- package/dist/state/decision-logger.d.ts +16 -0
- package/dist/state/decision-logger.d.ts.map +1 -0
- package/dist/state/decision-logger.js +80 -0
- package/dist/state/decision-logger.js.map +1 -0
- package/dist/state/decision-logger.test.d.ts +2 -0
- package/dist/state/decision-logger.test.d.ts.map +1 -0
- package/dist/state/decision-logger.test.js +182 -0
- package/dist/state/decision-logger.test.js.map +1 -0
- package/dist/state/lock-manager.d.ts +18 -0
- package/dist/state/lock-manager.d.ts.map +1 -0
- package/dist/state/lock-manager.js +134 -0
- package/dist/state/lock-manager.js.map +1 -0
- package/dist/state/lock-manager.test.d.ts +2 -0
- package/dist/state/lock-manager.test.d.ts.map +1 -0
- package/dist/state/lock-manager.test.js +190 -0
- package/dist/state/lock-manager.test.js.map +1 -0
- package/dist/state/state-manager.d.ts +37 -0
- package/dist/state/state-manager.d.ts.map +1 -0
- package/dist/state/state-manager.js +125 -0
- package/dist/state/state-manager.js.map +1 -0
- package/dist/state/state-manager.test.d.ts +2 -0
- package/dist/state/state-manager.test.d.ts.map +1 -0
- package/dist/state/state-manager.test.js +240 -0
- package/dist/state/state-manager.test.js.map +1 -0
- package/dist/types/adapter.d.ts +24 -0
- package/dist/types/adapter.d.ts.map +1 -0
- package/dist/types/adapter.js +2 -0
- package/dist/types/adapter.js.map +1 -0
- package/dist/types/assembly.d.ts +89 -0
- package/dist/types/assembly.d.ts.map +1 -0
- package/dist/types/assembly.js +2 -0
- package/dist/types/assembly.js.map +1 -0
- package/dist/types/claude-md.d.ts +11 -0
- package/dist/types/claude-md.d.ts.map +1 -0
- package/dist/types/claude-md.js +2 -0
- package/dist/types/claude-md.js.map +1 -0
- package/dist/types/cli.d.ts +15 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/cli.js +2 -0
- package/dist/types/cli.js.map +1 -0
- package/dist/types/config.d.ts +40 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/decision.d.ts +14 -0
- package/dist/types/decision.d.ts.map +1 -0
- package/dist/types/decision.js +2 -0
- package/dist/types/decision.js.map +1 -0
- package/dist/types/dependency.d.ts +12 -0
- package/dist/types/dependency.d.ts.map +1 -0
- package/dist/types/dependency.js +2 -0
- package/dist/types/dependency.js.map +1 -0
- package/dist/types/enums.d.ts +23 -0
- package/dist/types/enums.d.ts.map +1 -0
- package/dist/types/enums.js +11 -0
- package/dist/types/enums.js.map +1 -0
- package/dist/types/enums.test.d.ts +2 -0
- package/dist/types/enums.test.d.ts.map +1 -0
- package/dist/types/enums.test.js +13 -0
- package/dist/types/enums.test.js.map +1 -0
- package/dist/types/errors.d.ts +24 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +2 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/frontmatter.d.ts +43 -0
- package/dist/types/frontmatter.d.ts.map +1 -0
- package/dist/types/frontmatter.js +2 -0
- package/dist/types/frontmatter.js.map +1 -0
- package/dist/types/index.d.ts +14 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +14 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/lock.d.ts +10 -0
- package/dist/types/lock.d.ts.map +1 -0
- package/dist/types/lock.js +2 -0
- package/dist/types/lock.js.map +1 -0
- package/dist/types/state.d.ts +49 -0
- package/dist/types/state.d.ts.map +1 -0
- package/dist/types/state.js +2 -0
- package/dist/types/state.js.map +1 -0
- package/dist/types/wizard.d.ts +14 -0
- package/dist/types/wizard.d.ts.map +1 -0
- package/dist/types/wizard.js +2 -0
- package/dist/types/wizard.js.map +1 -0
- package/dist/utils/errors.d.ts +42 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +232 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/errors.test.d.ts +2 -0
- package/dist/utils/errors.test.d.ts.map +1 -0
- package/dist/utils/errors.test.js +91 -0
- package/dist/utils/errors.test.js.map +1 -0
- package/dist/utils/fs.d.ts +11 -0
- package/dist/utils/fs.d.ts.map +1 -0
- package/dist/utils/fs.js +20 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/fs.test.d.ts +2 -0
- package/dist/utils/fs.test.d.ts.map +1 -0
- package/dist/utils/fs.test.js +93 -0
- package/dist/utils/fs.test.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/levenshtein.d.ts +11 -0
- package/dist/utils/levenshtein.d.ts.map +1 -0
- package/dist/utils/levenshtein.js +37 -0
- package/dist/utils/levenshtein.js.map +1 -0
- package/dist/utils/levenshtein.test.d.ts +2 -0
- package/dist/utils/levenshtein.test.d.ts.map +1 -0
- package/dist/utils/levenshtein.test.js +34 -0
- package/dist/utils/levenshtein.test.js.map +1 -0
- package/dist/validation/config-validator.d.ts +10 -0
- package/dist/validation/config-validator.d.ts.map +1 -0
- package/dist/validation/config-validator.js +11 -0
- package/dist/validation/config-validator.js.map +1 -0
- package/dist/validation/dependency-validator.d.ts +10 -0
- package/dist/validation/dependency-validator.d.ts.map +1 -0
- package/dist/validation/dependency-validator.js +34 -0
- package/dist/validation/dependency-validator.js.map +1 -0
- package/dist/validation/frontmatter-validator.d.ts +12 -0
- package/dist/validation/frontmatter-validator.d.ts.map +1 -0
- package/dist/validation/frontmatter-validator.js +50 -0
- package/dist/validation/frontmatter-validator.js.map +1 -0
- package/dist/validation/index.d.ts +19 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +64 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/index.test.d.ts +2 -0
- package/dist/validation/index.test.d.ts.map +1 -0
- package/dist/validation/index.test.js +241 -0
- package/dist/validation/index.test.js.map +1 -0
- package/dist/validation/state-validator.d.ts +15 -0
- package/dist/validation/state-validator.d.ts.map +1 -0
- package/dist/validation/state-validator.js +104 -0
- package/dist/validation/state-validator.js.map +1 -0
- package/dist/wizard/questions.d.ts +18 -0
- package/dist/wizard/questions.d.ts.map +1 -0
- package/dist/wizard/questions.js +46 -0
- package/dist/wizard/questions.js.map +1 -0
- package/dist/wizard/suggestion.d.ts +10 -0
- package/dist/wizard/suggestion.d.ts.map +1 -0
- package/dist/wizard/suggestion.js +17 -0
- package/dist/wizard/suggestion.js.map +1 -0
- package/dist/wizard/wizard.d.ts +19 -0
- package/dist/wizard/wizard.d.ts.map +1 -0
- package/dist/wizard/wizard.js +104 -0
- package/dist/wizard/wizard.js.map +1 -0
- package/dist/wizard/wizard.test.d.ts +2 -0
- package/dist/wizard/wizard.test.d.ts.map +1 -0
- package/dist/wizard/wizard.test.js +167 -0
- package/dist/wizard/wizard.test.js.map +1 -0
- package/knowledge/core/adr-craft.md +281 -0
- package/knowledge/core/api-design.md +501 -0
- package/knowledge/core/database-design.md +380 -0
- package/knowledge/core/domain-modeling.md +317 -0
- package/knowledge/core/operations-runbook.md +513 -0
- package/knowledge/core/security-review.md +523 -0
- package/knowledge/core/system-architecture.md +402 -0
- package/knowledge/core/task-decomposition.md +372 -0
- package/knowledge/core/testing-strategy.md +409 -0
- package/knowledge/core/user-stories.md +337 -0
- package/knowledge/core/user-story-innovation.md +171 -0
- package/knowledge/core/ux-specification.md +380 -0
- package/knowledge/finalization/apply-fixes-and-freeze.md +93 -0
- package/knowledge/finalization/developer-onboarding.md +376 -0
- package/knowledge/finalization/implementation-playbook.md +404 -0
- package/knowledge/product/gap-analysis.md +305 -0
- package/knowledge/product/prd-craft.md +324 -0
- package/knowledge/product/prd-innovation.md +204 -0
- package/knowledge/review/review-adr.md +203 -0
- package/knowledge/review/review-api-contracts.md +233 -0
- package/knowledge/review/review-database-schema.md +229 -0
- package/knowledge/review/review-domain-modeling.md +288 -0
- package/knowledge/review/review-implementation-tasks.md +202 -0
- package/knowledge/review/review-methodology.md +215 -0
- package/knowledge/review/review-operations.md +212 -0
- package/knowledge/review/review-prd.md +235 -0
- package/knowledge/review/review-security.md +213 -0
- package/knowledge/review/review-system-architecture.md +296 -0
- package/knowledge/review/review-testing-strategy.md +176 -0
- package/knowledge/review/review-user-stories.md +172 -0
- package/knowledge/review/review-ux-spec.md +208 -0
- package/knowledge/validation/critical-path-analysis.md +203 -0
- package/knowledge/validation/cross-phase-consistency.md +181 -0
- package/knowledge/validation/decision-completeness.md +218 -0
- package/knowledge/validation/dependency-validation.md +233 -0
- package/knowledge/validation/implementability-review.md +252 -0
- package/knowledge/validation/scope-management.md +223 -0
- package/knowledge/validation/traceability.md +198 -0
- package/methodology/custom-defaults.yml +43 -0
- package/methodology/deep.yml +42 -0
- package/methodology/mvp.yml +42 -0
- package/package.json +58 -0
- package/pipeline/architecture/review-architecture.md +44 -0
- package/pipeline/architecture/system-architecture.md +45 -0
- package/pipeline/decisions/adrs.md +45 -0
- package/pipeline/decisions/review-adrs.md +39 -0
- package/pipeline/finalization/apply-fixes-and-freeze.md +39 -0
- package/pipeline/finalization/developer-onboarding-guide.md +36 -0
- package/pipeline/finalization/implementation-playbook.md +45 -0
- package/pipeline/modeling/domain-modeling.md +57 -0
- package/pipeline/modeling/review-domain-modeling.md +41 -0
- package/pipeline/planning/implementation-tasks.md +57 -0
- package/pipeline/planning/review-tasks.md +38 -0
- package/pipeline/pre/create-prd.md +45 -0
- package/pipeline/pre/innovate-prd.md +47 -0
- package/pipeline/pre/innovate-user-stories.md +47 -0
- package/pipeline/pre/review-prd.md +44 -0
- package/pipeline/pre/review-user-stories.md +43 -0
- package/pipeline/pre/user-stories.md +48 -0
- package/pipeline/quality/operations.md +42 -0
- package/pipeline/quality/review-operations.md +37 -0
- package/pipeline/quality/review-security.md +40 -0
- package/pipeline/quality/review-testing.md +39 -0
- package/pipeline/quality/security.md +44 -0
- package/pipeline/quality/testing-strategy.md +42 -0
- package/pipeline/specification/api-contracts.md +44 -0
- package/pipeline/specification/database-schema.md +41 -0
- package/pipeline/specification/review-api.md +40 -0
- package/pipeline/specification/review-database.md +39 -0
- package/pipeline/specification/review-ux.md +38 -0
- package/pipeline/specification/ux-spec.md +43 -0
- package/pipeline/validation/critical-path-walkthrough.md +37 -0
- package/pipeline/validation/cross-phase-consistency.md +35 -0
- package/pipeline/validation/decision-completeness.md +36 -0
- package/pipeline/validation/dependency-graph-validation.md +36 -0
- package/pipeline/validation/implementability-dry-run.md +36 -0
- package/pipeline/validation/scope-creep-check.md +38 -0
- package/pipeline/validation/traceability-matrix.md +36 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prd-innovation
|
|
3
|
+
description: Techniques for discovering feature-level innovation opportunities in product requirements
|
|
4
|
+
topics: [innovation, prd, competitive-analysis, product-thinking, features]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# PRD Innovation
|
|
8
|
+
|
|
9
|
+
This knowledge covers feature-level innovation — discovering new capabilities, competitive gaps, and defensive product improvements that belong in the PRD. It operates at the product scope level: should this feature exist at all?
|
|
10
|
+
|
|
11
|
+
This is distinct from user story innovation (`user-story-innovation.md`), which covers UX-level enhancements to existing features. If an idea doesn't require a new PRD section or feature entry, it belongs in user story innovation, not here.
|
|
12
|
+
|
|
13
|
+
## Scope Boundary
|
|
14
|
+
|
|
15
|
+
**In scope:**
|
|
16
|
+
- New features users would expect based on competitive norms
|
|
17
|
+
- New user flows that address friction points in existing flows
|
|
18
|
+
- Competitive positioning — capabilities that differentiate the product
|
|
19
|
+
- Defensive product gaps — things users would complain about on day 1
|
|
20
|
+
- AI-native capabilities that wouldn't exist without AI
|
|
21
|
+
|
|
22
|
+
**Out of scope:**
|
|
23
|
+
- UX polish on existing features (smart defaults, inline validation, progressive disclosure) — belongs in user story innovation
|
|
24
|
+
- Implementation details (technology choices, architecture) — belongs in ADRs
|
|
25
|
+
- Non-functional improvements to existing features — belongs in user story innovation
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## Competitive & Market Analysis
|
|
30
|
+
|
|
31
|
+
Research similar products to identify gaps and opportunities. The goal is actionable findings, not an exhaustive market report.
|
|
32
|
+
|
|
33
|
+
### What to Research
|
|
34
|
+
|
|
35
|
+
- **Direct competitors** — Products solving the same problem for the same users. What do they do well? What do users complain about?
|
|
36
|
+
- **Adjacent products** — Products in the same space that solve related problems. What patterns do they use that users now expect?
|
|
37
|
+
- **Emerging patterns** — UX conventions that have become table stakes. Users don't request them, but their absence feels like a gap (e.g., dark mode, keyboard shortcuts, real-time collaboration).
|
|
38
|
+
|
|
39
|
+
### How to Use Findings
|
|
40
|
+
|
|
41
|
+
For each competitive insight:
|
|
42
|
+
1. Is this a table-stakes feature (users expect it)? → Must-have candidate
|
|
43
|
+
2. Is this a differentiator (competitors don't have it, but users would love it)? → Evaluate cost/impact
|
|
44
|
+
3. Is this a copied feature (competitors have it, but it doesn't serve our users' specific needs)? → Skip
|
|
45
|
+
|
|
46
|
+
### Anti-Patterns
|
|
47
|
+
|
|
48
|
+
- **Feature parity obsession** — Copying every competitor feature dilutes focus. Only adopt features that serve your users' specific problem.
|
|
49
|
+
- **Exhaustive matrices** — A 50-row competitor comparison belongs in market research, not the PRD innovation pass. Focus on the 3-5 insights that actually affect product decisions.
|
|
50
|
+
|
|
51
|
+
## User Experience Gaps
|
|
52
|
+
|
|
53
|
+
Look at the core user flows described in the PRD and ask: where would a real user get frustrated?
|
|
54
|
+
|
|
55
|
+
### First 60 Seconds
|
|
56
|
+
|
|
57
|
+
The onboarding experience determines whether a user keeps the product:
|
|
58
|
+
- Can a new user understand the product's value within 60 seconds?
|
|
59
|
+
- Is there a clear first action? Or does the user land on an empty state with no guidance?
|
|
60
|
+
- How many steps between signup and the first "aha moment" where the product delivers value?
|
|
61
|
+
|
|
62
|
+
### Flow Friction Points
|
|
63
|
+
|
|
64
|
+
For each core user flow:
|
|
65
|
+
- How many steps does it take? Can any be eliminated or combined?
|
|
66
|
+
- Are there unnecessary confirmation dialogs? (Prefer undo over "are you sure?")
|
|
67
|
+
- Does the user need to leave the flow to get information required by the flow?
|
|
68
|
+
- What's the "delightful" version of this flow versus the "functional" version?
|
|
69
|
+
|
|
70
|
+
### Missing Flows
|
|
71
|
+
|
|
72
|
+
- Are there common user goals that the PRD doesn't address with a dedicated flow?
|
|
73
|
+
- Does the user have to work around the product to accomplish something obvious?
|
|
74
|
+
|
|
75
|
+
## Missing Expected Features
|
|
76
|
+
|
|
77
|
+
Features that users would search for and be surprised are absent. These are not innovative — they're expected. Their absence feels like a bug.
|
|
78
|
+
|
|
79
|
+
### Common Missing Features by Category
|
|
80
|
+
|
|
81
|
+
**Search & Discovery:**
|
|
82
|
+
- Text search across primary content types
|
|
83
|
+
- Filtering and sorting on list views
|
|
84
|
+
- Recently viewed / recently used items
|
|
85
|
+
|
|
86
|
+
**Data Management:**
|
|
87
|
+
- Bulk import/export (CSV, JSON)
|
|
88
|
+
- Undo for destructive actions
|
|
89
|
+
- Duplicate/clone for repetitive creation
|
|
90
|
+
|
|
91
|
+
**Communication:**
|
|
92
|
+
- Notification preferences (what, when, how)
|
|
93
|
+
- Email digests vs. real-time notifications
|
|
94
|
+
- In-app notification center
|
|
95
|
+
|
|
96
|
+
**Personalization:**
|
|
97
|
+
- User preferences / settings
|
|
98
|
+
- Saved views or filters
|
|
99
|
+
- Customizable dashboard or home screen
|
|
100
|
+
|
|
101
|
+
### Detection Technique
|
|
102
|
+
|
|
103
|
+
For each persona in the PRD, walk through their typical week:
|
|
104
|
+
1. What would they do daily? Weekly? Monthly?
|
|
105
|
+
2. For each action, is there a feature that supports it?
|
|
106
|
+
3. For each gap, would the user be surprised it's missing?
|
|
107
|
+
|
|
108
|
+
## AI-Native Opportunities
|
|
109
|
+
|
|
110
|
+
Features that would be impractical to build without AI but become natural with it. These are not "AI bolted on" — they are capabilities that fundamentally change the user experience.
|
|
111
|
+
|
|
112
|
+
### Categories
|
|
113
|
+
|
|
114
|
+
**Natural language interfaces:**
|
|
115
|
+
- Search that understands intent ("show me overdue invoices from last quarter") rather than requiring structured queries
|
|
116
|
+
- Data entry through conversation rather than forms for complex inputs
|
|
117
|
+
- Commands that understand context ("send the same email I sent to the last batch")
|
|
118
|
+
|
|
119
|
+
**Auto-categorization and tagging:**
|
|
120
|
+
- Content automatically categorized based on content analysis
|
|
121
|
+
- Suggested tags that learn from user corrections
|
|
122
|
+
- Smart folders or views that organize themselves
|
|
123
|
+
|
|
124
|
+
**Predictive behavior:**
|
|
125
|
+
- Pre-filled forms based on patterns ("you usually set this to X")
|
|
126
|
+
- Suggested next actions based on workflow patterns
|
|
127
|
+
- Anomaly detection ("this value is unusual — did you mean X?")
|
|
128
|
+
|
|
129
|
+
**Content generation:**
|
|
130
|
+
- Draft generation for repetitive writing (emails, descriptions, reports)
|
|
131
|
+
- Summarization of long content (meeting notes, documents, threads)
|
|
132
|
+
- Template suggestions based on context
|
|
133
|
+
|
|
134
|
+
### Evaluation
|
|
135
|
+
|
|
136
|
+
AI features should pass the "magic vs. gimmick" test:
|
|
137
|
+
- **Magic:** User thinks "how did it know?" and saves meaningful time
|
|
138
|
+
- **Gimmick:** User thinks "that's cool" once and never uses it again
|
|
139
|
+
- Only propose features that pass the magic test
|
|
140
|
+
|
|
141
|
+
## Defensive Product Thinking
|
|
142
|
+
|
|
143
|
+
Proactively identify what users would complain about. Fix the most likely complaints before they happen.
|
|
144
|
+
|
|
145
|
+
### The 1-Star Review Technique
|
|
146
|
+
|
|
147
|
+
Write the most likely 1-star review for the v1 product. Common templates:
|
|
148
|
+
- "I can't believe it doesn't even have [obvious feature]."
|
|
149
|
+
- "I tried to [common action] and it just [broke/was confusing/lost my data]."
|
|
150
|
+
- "Great concept but unusable on [mobile/slow connection/screen reader]."
|
|
151
|
+
- "I wanted to [goal] but had to [painful workaround] because [missing capability]."
|
|
152
|
+
|
|
153
|
+
For each plausible 1-star review: is the complaint addressed in the PRD? If not, should it be?
|
|
154
|
+
|
|
155
|
+
### Abandonment Analysis
|
|
156
|
+
|
|
157
|
+
Identify the most common reasons a user would try the product and stop using it:
|
|
158
|
+
1. **Complexity barrier** — Too hard to learn. Is onboarding addressed?
|
|
159
|
+
2. **Performance barrier** — Too slow. Are performance NFRs adequate?
|
|
160
|
+
3. **Trust barrier** — Doesn't feel reliable. Is error handling comprehensive?
|
|
161
|
+
4. **Value barrier** — Doesn't deliver on the promise fast enough. Is time-to-value minimized?
|
|
162
|
+
5. **Integration barrier** — Doesn't connect to their existing tools. Are integrations addressed?
|
|
163
|
+
|
|
164
|
+
### Accessibility & Inclusion
|
|
165
|
+
|
|
166
|
+
Gaps that alienate entire user segments:
|
|
167
|
+
- Keyboard-only navigation for users who can't use a mouse
|
|
168
|
+
- Screen reader support for visually impaired users
|
|
169
|
+
- Mobile responsiveness for users on phones
|
|
170
|
+
- Offline or degraded-mode support for users with unreliable connections
|
|
171
|
+
- Internationalization for non-English-speaking users
|
|
172
|
+
|
|
173
|
+
## Evaluation Framework
|
|
174
|
+
|
|
175
|
+
For each innovation suggestion, evaluate before proposing to the user.
|
|
176
|
+
|
|
177
|
+
### Cost Assessment
|
|
178
|
+
|
|
179
|
+
- **Trivial** (no new features): A small addition to an existing PRD feature section. No new user flows, no new data entities.
|
|
180
|
+
- **Moderate** (1-3 new features): Requires new PRD feature entries, possibly a new user flow. Contained within existing product scope.
|
|
181
|
+
- **Significant** (reshapes scope): Requires rethinking product boundaries, adding new personas, or fundamentally changing architecture assumptions.
|
|
182
|
+
|
|
183
|
+
### Impact Assessment
|
|
184
|
+
|
|
185
|
+
- **Nice-to-have**: Users wouldn't notice if absent. Polishes the product but doesn't change adoption or satisfaction meaningfully.
|
|
186
|
+
- **Noticeable improvement**: Users would appreciate it. Reduces friction in common workflows or addresses a gap competitors have filled.
|
|
187
|
+
- **Significant differentiator**: Sets the product apart. Users would choose this product partly because of this capability.
|
|
188
|
+
|
|
189
|
+
### Decision Framework
|
|
190
|
+
|
|
191
|
+
| | Trivial Cost | Moderate Cost | Significant Cost |
|
|
192
|
+
|---|---|---|---|
|
|
193
|
+
| **Differentiator** | Must-have v1 | Must-have v1 | Backlog (worth it but not now) |
|
|
194
|
+
| **Noticeable** | Must-have v1 | Backlog | Backlog |
|
|
195
|
+
| **Nice-to-have** | Include if free | Backlog | Reject |
|
|
196
|
+
|
|
197
|
+
### Presenting to the User
|
|
198
|
+
|
|
199
|
+
Group related suggestions for efficient decision-making. For each group:
|
|
200
|
+
1. Describe the enhancement and its user benefit (1-2 sentences)
|
|
201
|
+
2. State the cost (trivial/moderate/significant)
|
|
202
|
+
3. State your recommendation (must-have v1 / backlog / reject) with reasoning
|
|
203
|
+
4. Wait for approval before integrating into the PRD
|
|
204
|
+
5. Document approved innovations to the same standard as existing PRD features — full description, priority, business rules. No vague one-liners.
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-adr
|
|
3
|
+
description: Failure modes and review passes specific to Architecture Decision Records
|
|
4
|
+
topics: [review, adr, decisions]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review: Architecture Decision Records
|
|
8
|
+
|
|
9
|
+
ADRs encode the "why" behind the architecture. They must be complete (every significant decision recorded), honest (genuine trade-off analysis), and non-contradictory (no two ADRs making incompatible decisions). This review uses 7 passes targeting the specific ways ADR sets fail.
|
|
10
|
+
|
|
11
|
+
Follows the review process defined in `review-methodology.md`.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Pass 1: Decision Coverage
|
|
16
|
+
|
|
17
|
+
### What to Check
|
|
18
|
+
|
|
19
|
+
Every significant architectural decision has an ADR. Technology choices, pattern selections, component boundaries, integration strategies, and constraint trade-offs are all recorded.
|
|
20
|
+
|
|
21
|
+
### Why This Matters
|
|
22
|
+
|
|
23
|
+
Unrecorded decisions become folklore — known to the original author but invisible to implementing agents. When an agent encounters an undocumented technology choice, it either assumes incorrectly or asks questions the ADR should have answered. At scale, unrecorded decisions are the primary source of "but why do we do it this way?" confusion.
|
|
24
|
+
|
|
25
|
+
### How to Check
|
|
26
|
+
|
|
27
|
+
1. Read through the domain models and architecture document (if it exists at this point)
|
|
28
|
+
2. List every decision implied by the structure: technology choices (language, framework, database), architectural patterns (monolith vs. microservices, event-driven vs. request-response), component boundaries, integration mechanisms, data storage strategies
|
|
29
|
+
3. For each identified decision, find the corresponding ADR
|
|
30
|
+
4. Flag decisions that are visible in the artifacts but have no ADR
|
|
31
|
+
5. Check that technology selection decisions cover: primary language/framework, database(s), key infrastructure (message queue, cache, CDN), deployment platform
|
|
32
|
+
|
|
33
|
+
### What a Finding Looks Like
|
|
34
|
+
|
|
35
|
+
- P0: "The architecture uses PostgreSQL and Redis but there is no ADR recording why these were chosen over alternatives."
|
|
36
|
+
- P1: "The system uses event-driven communication between Order and Inventory services, but no ADR documents this pattern choice versus synchronous calls."
|
|
37
|
+
- P2: "The testing framework choice (Jest) is implied by package.json conventions but not recorded as a decision."
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Pass 2: Rationale Quality
|
|
42
|
+
|
|
43
|
+
### What to Check
|
|
44
|
+
|
|
45
|
+
Each ADR has genuine alternatives that were seriously considered (not straw-manned). Consequences are honest — both positive and negative. The rationale explains why the chosen option was selected, not just what was selected.
|
|
46
|
+
|
|
47
|
+
### Why This Matters
|
|
48
|
+
|
|
49
|
+
Straw-manned alternatives ("we could do nothing" or obviously bad options) indicate the decision was made before the analysis. This means the real reasoning is undocumented. When conditions change, the team has no basis for re-evaluating because they do not know why the decision was actually made.
|
|
50
|
+
|
|
51
|
+
### How to Check
|
|
52
|
+
|
|
53
|
+
1. For each ADR, read the alternatives section
|
|
54
|
+
2. Check that at least 2-3 alternatives are genuinely viable — would a reasonable engineer consider them?
|
|
55
|
+
3. Verify each alternative has honest pros and cons (not just cons)
|
|
56
|
+
4. Read the consequences section: are there negative consequences? (Every decision has trade-offs — all-positive consequences indicate dishonest analysis)
|
|
57
|
+
5. Check the rationale: does it explain why the chosen option's trade-offs are acceptable, or does it just restate the decision?
|
|
58
|
+
6. Look for evaluation criteria: what dimensions were the options compared on?
|
|
59
|
+
|
|
60
|
+
### What a Finding Looks Like
|
|
61
|
+
|
|
62
|
+
- P0: "ADR-003 lists 'do nothing' and 'use an obviously unsuitable technology' as alternatives. The real alternatives (comparable frameworks) are missing."
|
|
63
|
+
- P1: "ADR-007 consequences section lists only benefits. A REST API decision always has trade-offs (chatty calls, over-fetching, versioning complexity) — these are absent."
|
|
64
|
+
- P2: "ADR-012 explains what was chosen but not why. The rationale section reads 'We chose React' without explaining what made it the best fit."
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Pass 3: Contradiction Detection
|
|
69
|
+
|
|
70
|
+
### What to Check
|
|
71
|
+
|
|
72
|
+
No two ADRs make contradictory decisions without explicit acknowledgment. When one ADR supersedes or modifies another, the relationship is documented.
|
|
73
|
+
|
|
74
|
+
### Why This Matters
|
|
75
|
+
|
|
76
|
+
Contradictory ADRs give implementing agents conflicting instructions. If ADR-005 says "use REST for all APIs" and ADR-012 says "use GraphQL for the dashboard API" without referencing ADR-005, an agent reading both does not know which takes precedence. Contradictions that are intentional (scoped exceptions) must be explicit.
|
|
77
|
+
|
|
78
|
+
### How to Check
|
|
79
|
+
|
|
80
|
+
1. Build a decision matrix: for each ADR, note what it decides and what domain it constrains
|
|
81
|
+
2. Look for overlapping constraints: two ADRs that affect the same architectural concern
|
|
82
|
+
3. For each overlap, determine: do they agree, or do they contradict?
|
|
83
|
+
4. For contradictions, check: does the later ADR reference the earlier one and explain the exception?
|
|
84
|
+
5. Check for implicit contradictions: ADR-A says "minimize external dependencies" while ADR-B adds three new external services
|
|
85
|
+
6. Verify supersession chains: if ADR-X supersedes ADR-Y, is ADR-Y marked as superseded?
|
|
86
|
+
|
|
87
|
+
### What a Finding Looks Like
|
|
88
|
+
|
|
89
|
+
- P0: "ADR-005 specifies 'all state in PostgreSQL' but ADR-011 introduces Redis for session management without referencing ADR-005 or explaining the exception."
|
|
90
|
+
- P1: "ADR-003 (monolith-first) and ADR-009 (separate auth service) contradict. ADR-009 should reference ADR-003 and explain why auth is the exception."
|
|
91
|
+
- P2: "ADR-015 supersedes ADR-008 but ADR-008 status is still 'accepted'. Update to 'superseded by ADR-015'."
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Pass 4: Implied Decision Mining
|
|
96
|
+
|
|
97
|
+
### What to Check
|
|
98
|
+
|
|
99
|
+
Decisions visible in domain models, architecture, or code that were never formally recorded as ADRs. These are the "everyone knows" decisions that new team members do not know.
|
|
100
|
+
|
|
101
|
+
### Why This Matters
|
|
102
|
+
|
|
103
|
+
Implied decisions are the most dangerous gap in an ADR set. They represent consensus that was never examined or documented. When an implementing agent encounters an implied decision, it has no rationale to evaluate whether the decision still applies. Implied decisions also tend to be the decisions most likely to be wrong — they were never subjected to alternatives analysis.
|
|
104
|
+
|
|
105
|
+
### How to Check
|
|
106
|
+
|
|
107
|
+
1. Read domain models looking for architectural assumptions: "the system uses X" statements embedded in narrative
|
|
108
|
+
2. Read architecture documents for technology mentions without corresponding ADRs
|
|
109
|
+
3. Check for pattern assumptions: "RESTful API" assumed without an ADR choosing REST over alternatives
|
|
110
|
+
4. Look for constraint assumptions: "single database" or "multi-tenant" assumed without formal analysis
|
|
111
|
+
5. Check for deployment assumptions: cloud provider, containerization, CI/CD tool — all are decisions
|
|
112
|
+
6. Review domain event patterns: synchronous vs. asynchronous, at-least-once vs. exactly-once — these are decisions
|
|
113
|
+
|
|
114
|
+
### What a Finding Looks Like
|
|
115
|
+
|
|
116
|
+
- P0: "The domain models assume multi-tenancy (tenant_id on entities) but there is no ADR analyzing single-tenant vs. multi-tenant trade-offs."
|
|
117
|
+
- P1: "The architecture assumes containerized deployment (Docker references throughout) but no ADR records this decision."
|
|
118
|
+
- P2: "TypeScript is used throughout code examples in domain models but no ADR formally selects TypeScript over JavaScript."
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Pass 5: Status Hygiene
|
|
123
|
+
|
|
124
|
+
### What to Check
|
|
125
|
+
|
|
126
|
+
ADR statuses reflect reality. No stale "proposed" ADRs (should be accepted or rejected). Supersession chains are clean. Deprecated ADRs point to their replacements.
|
|
127
|
+
|
|
128
|
+
### Why This Matters
|
|
129
|
+
|
|
130
|
+
Stale statuses create confusion about which decisions are in effect. A "proposed" ADR that was accepted months ago but never updated looks like an undecided question. Broken supersession chains mean both the old and new ADR appear active, leading to the contradiction problems in Pass 3.
|
|
131
|
+
|
|
132
|
+
### How to Check
|
|
133
|
+
|
|
134
|
+
1. List all ADRs and their statuses
|
|
135
|
+
2. Flag any "proposed" or "draft" ADRs — are these genuinely pending, or were they accepted but not updated?
|
|
136
|
+
3. For "superseded" or "deprecated" ADRs, verify they reference their replacement
|
|
137
|
+
4. For "accepted" ADRs, verify they are still current — has a later ADR effectively superseded them?
|
|
138
|
+
5. Check for "rejected" ADRs — are the rejections still valid, or have circumstances changed?
|
|
139
|
+
6. Verify ADR numbering is sequential and has no gaps (gaps suggest deleted ADRs, which violates ADR principles)
|
|
140
|
+
|
|
141
|
+
### What a Finding Looks Like
|
|
142
|
+
|
|
143
|
+
- P1: "ADR-004 has status 'proposed' but is referenced by three other ADRs as if it were accepted. Update status."
|
|
144
|
+
- P1: "ADR-006 status is 'deprecated' but does not reference which ADR replaces it."
|
|
145
|
+
- P2: "ADR numbering jumps from 008 to 010. If ADR-009 was removed, it should exist as 'rejected' or 'withdrawn', not deleted."
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Pass 6: Cross-Reference Integrity
|
|
150
|
+
|
|
151
|
+
### What to Check
|
|
152
|
+
|
|
153
|
+
ADRs that reference each other do so correctly. Cross-references point to real ADRs, the referenced content matches what is claimed, and no circular reference chains create logical loops.
|
|
154
|
+
|
|
155
|
+
### Why This Matters
|
|
156
|
+
|
|
157
|
+
Broken cross-references make it impossible to follow decision chains. When ADR-015 says "as decided in ADR-007," but ADR-007 does not actually address that topic, the rationale chain is broken. Implementing agents cannot trace why decisions were made.
|
|
158
|
+
|
|
159
|
+
### How to Check
|
|
160
|
+
|
|
161
|
+
1. For each ADR, extract all references to other ADRs
|
|
162
|
+
2. Verify each referenced ADR exists
|
|
163
|
+
3. Verify the referenced ADR actually says what the referencing ADR claims it says
|
|
164
|
+
4. Check for circular reference chains (A references B references C references A)
|
|
165
|
+
5. Verify "supersedes" relationships are bidirectional (superseding ADR says "supersedes X"; X says "superseded by Y")
|
|
166
|
+
6. Check that references to domain models and architecture documents are also accurate
|
|
167
|
+
|
|
168
|
+
### What a Finding Looks Like
|
|
169
|
+
|
|
170
|
+
- P1: "ADR-012 says 'per ADR-007, we use event-driven communication' but ADR-007 actually decides on synchronous REST. Wrong cross-reference."
|
|
171
|
+
- P1: "ADR-015 supersedes ADR-008, but ADR-008 does not mention being superseded."
|
|
172
|
+
- P2: "ADR-020 references 'the data model in Section 3' without specifying which document's Section 3."
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Pass 7: Downstream Readiness
|
|
177
|
+
|
|
178
|
+
### What to Check
|
|
179
|
+
|
|
180
|
+
The system architecture step needs technology choices and pattern decisions finalized. All architecture-constraining decisions must be in "accepted" status with clear rationale.
|
|
181
|
+
|
|
182
|
+
### Why This Matters
|
|
183
|
+
|
|
184
|
+
The architecture document translates ADR decisions into component structure. If technology choices are unresolved, the architect must either make the decision inline (bypassing the ADR process) or leave the architecture ambiguous. Both lead to rework.
|
|
185
|
+
|
|
186
|
+
### How to Check
|
|
187
|
+
|
|
188
|
+
The system architecture step specifically needs:
|
|
189
|
+
1. **Technology stack decisions** — Language, framework, database, key infrastructure, all accepted
|
|
190
|
+
2. **Architectural pattern decisions** — Monolith vs. services, synchronous vs. asynchronous, state management approach
|
|
191
|
+
3. **Integration pattern decisions** — How components communicate, what protocols, what data formats
|
|
192
|
+
4. **Deployment topology decisions** — Where the system runs, how many environments, how deploys work
|
|
193
|
+
5. **Cross-cutting concern decisions** — Logging, monitoring, authentication, error handling patterns
|
|
194
|
+
6. **Data management decisions** — Single vs. multiple databases, caching strategy, data consistency model
|
|
195
|
+
|
|
196
|
+
For each category, verify at least one accepted ADR covers it. If a category is intentionally deferred, verify the deferral is documented with a timeline.
|
|
197
|
+
|
|
198
|
+
### What a Finding Looks Like
|
|
199
|
+
|
|
200
|
+
- P0: "No accepted ADR covers database technology selection. The system architecture step cannot design data storage components without this decision."
|
|
201
|
+
- P0: "The monolith-vs-services question has two proposed ADRs (ADR-003, ADR-004) but neither is accepted. The system architecture step cannot define component boundaries."
|
|
202
|
+
- P1: "Authentication approach is not covered by any ADR. The system architecture step needs to know the auth pattern to design the auth component."
|
|
203
|
+
- P2: "Monitoring strategy has no ADR. This could be deferred to the operations step but should be noted."
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-api-contracts
|
|
3
|
+
description: Failure modes and review passes specific to API contract specifications
|
|
4
|
+
topics: [review, api, contracts, rest, graphql]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review: API Contracts
|
|
8
|
+
|
|
9
|
+
API contracts define the system's external and internal interfaces. They must cover every domain operation that crosses a boundary, handle errors explicitly, enforce authentication and authorization, and align with both the domain model and the database schema. This review uses 8 passes targeting the specific ways API contracts fail.
|
|
10
|
+
|
|
11
|
+
Follows the review process defined in `review-methodology.md`.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Pass 1: Operation Coverage
|
|
16
|
+
|
|
17
|
+
### What to Check
|
|
18
|
+
|
|
19
|
+
Every domain operation that crosses a component boundary has a corresponding API endpoint (or GraphQL query/mutation, gRPC method, etc.). No cross-boundary operation is left without an API contract.
|
|
20
|
+
|
|
21
|
+
### Why This Matters
|
|
22
|
+
|
|
23
|
+
Missing endpoints mean entire features cannot be accessed through the API. Implementing agents discover the gap when they need to wire up a frontend component or integration — they either invent an endpoint (diverging from the contract) or block waiting for design. Operation coverage gaps are the most common API contract failure.
|
|
24
|
+
|
|
25
|
+
### How to Check
|
|
26
|
+
|
|
27
|
+
1. List every component interaction from the architecture's data flows
|
|
28
|
+
2. For each interaction that crosses a component or service boundary, verify a corresponding API endpoint exists
|
|
29
|
+
3. Cross-reference domain model operations: every aggregate command (create, update, delete) that is exposed beyond its owning service needs an endpoint
|
|
30
|
+
4. Check for read operations: every query pattern identified in the architecture needs a corresponding GET endpoint or query
|
|
31
|
+
5. Verify that domain events that trigger cross-service operations have corresponding webhook or event subscription endpoints if applicable
|
|
32
|
+
6. Check for administrative operations: user management, configuration, health checks, metrics
|
|
33
|
+
|
|
34
|
+
### What a Finding Looks Like
|
|
35
|
+
|
|
36
|
+
- P0: "Architecture data flow shows 'Frontend requests user's order history' but no GET /users/{id}/orders endpoint exists in the API contract."
|
|
37
|
+
- P1: "Domain model defines 'cancel order' as a command on the Order aggregate, but no PATCH/DELETE endpoint covers order cancellation."
|
|
38
|
+
- P2: "Health check endpoint is not documented. Implementation will need one for deployment orchestration."
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Pass 2: Error Contract Completeness
|
|
43
|
+
|
|
44
|
+
### What to Check
|
|
45
|
+
|
|
46
|
+
Every endpoint has explicit error responses defined. Error responses include status codes, error body structure, and conditions under which each error occurs.
|
|
47
|
+
|
|
48
|
+
### Why This Matters
|
|
49
|
+
|
|
50
|
+
Undocumented errors are the primary source of poor error handling in client code. When the API returns a 422 that is not in the contract, the frontend falls back to a generic "something went wrong" message. Complete error contracts enable clients to handle every failure mode gracefully.
|
|
51
|
+
|
|
52
|
+
### How to Check
|
|
53
|
+
|
|
54
|
+
1. For each endpoint, list the documented error responses
|
|
55
|
+
2. Check for standard errors every endpoint should handle: 400 (bad input), 401 (unauthenticated), 403 (unauthorized), 404 (not found), 500 (server error)
|
|
56
|
+
3. Check for domain-specific errors: business rule violations (e.g., "insufficient inventory"), state transition errors (e.g., "cannot cancel a shipped order"), constraint violations (e.g., "duplicate email")
|
|
57
|
+
4. Verify error response bodies have a consistent structure across all endpoints (error code, message, details)
|
|
58
|
+
5. Check for rate limiting errors (429) if the API has rate limits
|
|
59
|
+
6. Verify that error responses do not leak internal details (stack traces, database errors, internal IDs)
|
|
60
|
+
|
|
61
|
+
### What a Finding Looks Like
|
|
62
|
+
|
|
63
|
+
- P0: "POST /orders endpoint documents only 201 (success) and 400 (bad request). Missing: 401 (unauthenticated), 403 (not authorized to create orders), 409 (duplicate order reference), 422 (validation errors like 'inventory unavailable')."
|
|
64
|
+
- P1: "Error response format varies between endpoints. /users returns {error: string} while /orders returns {code: number, message: string, details: object}. Standardize."
|
|
65
|
+
- P2: "No endpoint documents a 429 (rate limited) response, but the architecture mentions rate limiting as a requirement."
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Pass 3: Auth/AuthZ Coverage
|
|
70
|
+
|
|
71
|
+
### What to Check
|
|
72
|
+
|
|
73
|
+
Every endpoint specifies its authentication requirements (who can call it) and authorization rules (what permissions are needed). No endpoint is left with ambiguous access control.
|
|
74
|
+
|
|
75
|
+
### Why This Matters
|
|
76
|
+
|
|
77
|
+
Endpoints without documented auth requirements default to "anyone can call this" in implementation. This is a security vulnerability when the endpoint should be restricted. Even internal service-to-service endpoints need auth documentation — "internal only, requires service token" is a valid auth specification.
|
|
78
|
+
|
|
79
|
+
### How to Check
|
|
80
|
+
|
|
81
|
+
1. For each endpoint, check for authentication specification: unauthenticated, user token, service token, API key, etc.
|
|
82
|
+
2. For authenticated endpoints, check for authorization specification: what role, permission, or ownership is required?
|
|
83
|
+
3. Verify that resource-ownership authorization is documented: "users can only access their own orders" (not just "requires user role")
|
|
84
|
+
4. Check for admin/superuser endpoints: are they clearly distinguished from regular user endpoints?
|
|
85
|
+
5. Verify that public endpoints are explicitly marked as public (not just missing auth — intentional vs. accidental)
|
|
86
|
+
6. Check for cross-service authentication: how do services authenticate to each other?
|
|
87
|
+
|
|
88
|
+
### What a Finding Looks Like
|
|
89
|
+
|
|
90
|
+
- P0: "DELETE /users/{id} has no auth specification. Can any authenticated user delete any user? Only admins? Only the user themselves?"
|
|
91
|
+
- P1: "GET /orders/{id} requires authentication but does not specify authorization. Can any authenticated user view any order, or only their own?"
|
|
92
|
+
- P2: "Service-to-service endpoints (e.g., /internal/inventory/reserve) do not document the authentication mechanism. Are they protected by network isolation, service tokens, or mTLS?"
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Pass 4: Versioning Consistency
|
|
97
|
+
|
|
98
|
+
### What to Check
|
|
99
|
+
|
|
100
|
+
API versioning strategy is consistent across all endpoints and aligns with the ADR on API versioning. Version handling is explicit, not assumed.
|
|
101
|
+
|
|
102
|
+
### Why This Matters
|
|
103
|
+
|
|
104
|
+
Inconsistent versioning makes it impossible for clients to know which version they are consuming. If some endpoints use URL versioning (/v1/), others use header versioning (Accept: application/vnd.api.v1+json), and others have no versioning, client SDK generation and API gateway configuration become fragmented.
|
|
105
|
+
|
|
106
|
+
### How to Check
|
|
107
|
+
|
|
108
|
+
1. Find the ADR on API versioning strategy
|
|
109
|
+
2. Verify every endpoint follows the same versioning scheme
|
|
110
|
+
3. Check for endpoints with no version indicator — are they intentionally unversioned (health checks, root) or accidentally unversioned?
|
|
111
|
+
4. If URL versioning is used, verify all paths include the version prefix
|
|
112
|
+
5. Check for backward compatibility commitments: what changes are considered breaking?
|
|
113
|
+
6. Verify that the contract documents how clients should handle version upgrades
|
|
114
|
+
|
|
115
|
+
### What a Finding Looks Like
|
|
116
|
+
|
|
117
|
+
- P1: "ADR-008 specifies URL-based versioning (/v1/), but three endpoints omit the version prefix: /health, /orders/webhook, /auth/token."
|
|
118
|
+
- P1: "Some endpoints use /v1/ prefix and others use /api/v1/ prefix. Inconsistent path structure."
|
|
119
|
+
- P2: "No documentation on what constitutes a breaking change versus a backward-compatible change. Clients do not know when to expect a version bump."
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Pass 5: Payload Shape vs Domain Entities
|
|
124
|
+
|
|
125
|
+
### What to Check
|
|
126
|
+
|
|
127
|
+
Request and response payloads align with domain model entities. Field names match domain terminology. Field types match domain attribute types. Payload structure reflects domain relationships.
|
|
128
|
+
|
|
129
|
+
### Why This Matters
|
|
130
|
+
|
|
131
|
+
Misalignment between API payloads and domain entities creates a translation layer that implementing agents must build and maintain. If the domain entity uses "orderedAt" but the API returns "created_date," every consumer must know about the mapping. Alignment reduces cognitive load and bug surface.
|
|
132
|
+
|
|
133
|
+
### How to Check
|
|
134
|
+
|
|
135
|
+
1. For each endpoint, compare request/response fields to the corresponding domain entity attributes
|
|
136
|
+
2. Check field names: do they match domain terminology (ubiquitous language)?
|
|
137
|
+
3. Check field types: if the domain model says "Money" (amount + currency), does the API represent it the same way or split/merge fields?
|
|
138
|
+
4. Check nested structures: do response shapes reflect domain aggregate boundaries?
|
|
139
|
+
5. Verify that API responses do not expose internal database fields (auto-increment IDs, internal status codes, audit columns) unless intentional
|
|
140
|
+
6. Check for missing fields: domain entity attributes that are absent from the API response (may be intentional for security, or may be a gap)
|
|
141
|
+
|
|
142
|
+
### What a Finding Looks Like
|
|
143
|
+
|
|
144
|
+
- P1: "Domain entity 'Order' uses 'placedAt' (DateTime) but API response uses 'createdDate' (string). Name mismatch and type mismatch."
|
|
145
|
+
- P1: "Domain entity 'Product' has a 'price' attribute modeled as Money (amount + currency), but the API returns 'price' as a plain number with no currency. Multi-currency support will break."
|
|
146
|
+
- P2: "API response includes 'internal_status_code' field which is a database implementation detail, not a domain concept."
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Pass 6: Idempotency
|
|
151
|
+
|
|
152
|
+
### What to Check
|
|
153
|
+
|
|
154
|
+
Mutating operations (POST, PUT, PATCH, DELETE) document their idempotency behavior. Operations that should be idempotent specify the mechanism (idempotency keys, natural idempotency).
|
|
155
|
+
|
|
156
|
+
### Why This Matters
|
|
157
|
+
|
|
158
|
+
Non-idempotent operations cause duplicate side effects on retry. If a client retries a failed POST /orders (network timeout, unclear response), the system may create two orders. Idempotency documentation tells client developers whether they can safely retry and how to do so.
|
|
159
|
+
|
|
160
|
+
### How to Check
|
|
161
|
+
|
|
162
|
+
1. For each POST endpoint, check: is it idempotent? If yes, what mechanism (idempotency key header, natural deduplication by business key)?
|
|
163
|
+
2. For each PUT endpoint, verify it is naturally idempotent (same PUT produces the same result)
|
|
164
|
+
3. For each PATCH endpoint, check if idempotency depends on the specific operation (appending to a list is not idempotent; setting a value is)
|
|
165
|
+
4. For each DELETE endpoint, verify behavior on repeated calls (first call deletes, subsequent calls return 404 or 204?)
|
|
166
|
+
5. Check for operations with side effects (sending emails, charging payments) — these must be idempotent or explicitly documented as non-idempotent
|
|
167
|
+
6. Verify that the idempotency mechanism is documented for clients: what header to send, how long the idempotency key is valid, what happens on key reuse
|
|
168
|
+
|
|
169
|
+
### What a Finding Looks Like
|
|
170
|
+
|
|
171
|
+
- P0: "POST /payments/charge has no idempotency specification. A client retry could charge the customer twice."
|
|
172
|
+
- P1: "POST /orders documents an idempotency key mechanism but does not specify the header name, key format, or expiration window."
|
|
173
|
+
- P2: "DELETE /orders/{id} does not specify behavior on repeated calls. Does the second DELETE return 404 (resource not found) or 204 (success, already deleted)?"
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
## Pass 7: Pagination/Filtering
|
|
178
|
+
|
|
179
|
+
### What to Check
|
|
180
|
+
|
|
181
|
+
List endpoints have pagination designed. Filter and sort parameters are documented. Response includes pagination metadata.
|
|
182
|
+
|
|
183
|
+
### Why This Matters
|
|
184
|
+
|
|
185
|
+
Unpaginated list endpoints return unbounded result sets. In development this works fine; in production with thousands of records, a single unpaginated call can crash the server or the client. Pagination must be designed, not retrofitted — retrofitting changes the API contract and breaks existing clients.
|
|
186
|
+
|
|
187
|
+
### How to Check
|
|
188
|
+
|
|
189
|
+
1. Identify every list/collection endpoint (GET endpoints returning arrays)
|
|
190
|
+
2. Verify each has pagination parameters documented (page/size, cursor-based, or offset/limit)
|
|
191
|
+
3. Check that pagination response includes metadata: total count (or has-next indicator), current page/cursor, page size
|
|
192
|
+
4. Verify that filter parameters are documented for common query patterns (identified in architecture data flows)
|
|
193
|
+
5. Check sort parameters: which fields can be sorted on? What is the default sort order?
|
|
194
|
+
6. Verify maximum page size is specified and enforced (prevents clients requesting 10,000 records)
|
|
195
|
+
7. For cursor-based pagination, check that cursor format and stability guarantees are documented
|
|
196
|
+
|
|
197
|
+
### What a Finding Looks Like
|
|
198
|
+
|
|
199
|
+
- P0: "GET /orders returns all orders with no pagination parameters. With 100,000 orders, this endpoint will timeout or crash."
|
|
200
|
+
- P1: "GET /products has pagination (page, size) but no filter parameters. The architecture's data flow shows 'search products by category and price range' as a primary use case."
|
|
201
|
+
- P2: "Pagination response includes 'total_count' but does not specify whether this is an exact count or an estimate (important for large datasets)."
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Pass 8: Downstream Readiness
|
|
206
|
+
|
|
207
|
+
### What to Check
|
|
208
|
+
|
|
209
|
+
The UX spec and implementation tasks steps can proceed with these API contracts. The API provides everything needed to build frontend interactions and define backend tasks.
|
|
210
|
+
|
|
211
|
+
### Why This Matters
|
|
212
|
+
|
|
213
|
+
The UX spec needs to know what data is available from the API to design screens. Implementation tasks need to know the API surface to scope work. Gaps in the API contract create ambiguity in both downstream phases.
|
|
214
|
+
|
|
215
|
+
### How to Check
|
|
216
|
+
|
|
217
|
+
The UX spec step needs:
|
|
218
|
+
1. Every user-facing action has a corresponding API endpoint
|
|
219
|
+
2. Response shapes are detailed enough to design screen layouts (know what fields are available)
|
|
220
|
+
3. Error responses are documented enough to design error states
|
|
221
|
+
4. Loading states are inferable: which operations are fast (synchronous) vs. slow (async with polling)?
|
|
222
|
+
|
|
223
|
+
The implementation tasks step needs:
|
|
224
|
+
1. Endpoint complexity is visible: which endpoints are simple CRUD, which require complex business logic?
|
|
225
|
+
2. Dependencies between endpoints are clear: which endpoints must be built first?
|
|
226
|
+
3. Integration points with external services are specified
|
|
227
|
+
4. Authentication/authorization requirements are detailed enough to implement
|
|
228
|
+
|
|
229
|
+
### What a Finding Looks Like
|
|
230
|
+
|
|
231
|
+
- P0: "The UX wireframe shows a 'user dashboard' with order count, recent orders, and account balance, but the API has no endpoint that provides this aggregated data. The frontend would need to make 3+ separate calls."
|
|
232
|
+
- P1: "Several endpoints are marked as 'async' (returns 202) but there is no documented polling or webhook mechanism for the frontend to get the result."
|
|
233
|
+
- P2: "API response examples do not include null/empty cases. The UX spec needs to know what an empty order list or a user with no profile photo looks like in API terms."
|