@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,305 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gap-analysis
|
|
3
|
+
description: Systematic approaches to finding gaps in requirements and specifications
|
|
4
|
+
topics: [gap-analysis, requirements, completeness, ambiguity, edge-cases]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Gap Analysis
|
|
8
|
+
|
|
9
|
+
Gap analysis is the systematic process of finding what is missing from a set of requirements or specifications. A gap is anything that an implementing team would need to know but that the document does not tell them. Gaps are not errors (things stated incorrectly) — they are omissions (things not stated at all).
|
|
10
|
+
|
|
11
|
+
## Systematic Analysis Approaches
|
|
12
|
+
|
|
13
|
+
### Section-by-Section Review
|
|
14
|
+
|
|
15
|
+
Walk through the document section by section, asking structured questions at each:
|
|
16
|
+
|
|
17
|
+
**For each feature description:**
|
|
18
|
+
1. Who uses this feature? (Is the actor specified?)
|
|
19
|
+
2. What triggers this feature? (Is the entry point clear?)
|
|
20
|
+
3. What are the inputs? (Are all fields listed? With types and constraints?)
|
|
21
|
+
4. What is the happy path output? (Is the success response defined?)
|
|
22
|
+
5. What are the error outputs? (Is every failure mode addressed?)
|
|
23
|
+
6. What state changes? (What data is created, updated, or deleted?)
|
|
24
|
+
7. What are the preconditions? (What must be true before this feature can execute?)
|
|
25
|
+
8. What are the postconditions? (What is guaranteed to be true after execution?)
|
|
26
|
+
9. Are there rate limits, permissions, or visibility constraints?
|
|
27
|
+
10. Is this feature idempotent? (What happens if it runs twice?)
|
|
28
|
+
|
|
29
|
+
**For each data entity:**
|
|
30
|
+
1. What are all the fields? (Are any missing?)
|
|
31
|
+
2. What are the field types? (String, number, enum, date, etc.)
|
|
32
|
+
3. Which fields are required vs optional?
|
|
33
|
+
4. What are the valid ranges or patterns for each field?
|
|
34
|
+
5. What happens when a field is null vs absent vs empty?
|
|
35
|
+
6. How is this entity created? Updated? Deleted?
|
|
36
|
+
7. What relationships does it have with other entities?
|
|
37
|
+
8. What uniqueness constraints exist?
|
|
38
|
+
|
|
39
|
+
**For each user flow:**
|
|
40
|
+
1. What is the starting state?
|
|
41
|
+
2. What are all the steps?
|
|
42
|
+
3. At each step, what can go wrong?
|
|
43
|
+
4. At each step, can the user go back?
|
|
44
|
+
5. What happens if the user abandons the flow mid-way?
|
|
45
|
+
6. What happens if the user's session expires during the flow?
|
|
46
|
+
7. What does the user see while waiting for asynchronous operations?
|
|
47
|
+
|
|
48
|
+
### Cross-Reference Checking
|
|
49
|
+
|
|
50
|
+
Compare different sections of the same document (or different documents) for consistency and completeness:
|
|
51
|
+
|
|
52
|
+
1. **Feature list vs. detail sections** — Is every listed feature described in detail? Are there detail sections for unlisted features?
|
|
53
|
+
2. **Personas vs. features** — Does every persona have at least one feature that addresses their primary need? Does every feature map to a persona?
|
|
54
|
+
3. **NFRs vs. features** — Do performance requirements specify which features they apply to? Are there features without any NFR coverage?
|
|
55
|
+
4. **Constraints vs. features** — Do constraints affect feature design? Is the impact documented?
|
|
56
|
+
5. **Success criteria vs. features** — Can every success criterion be measured by at least one feature? Are there features that contribute to no success criterion?
|
|
57
|
+
6. **Error scenarios vs. features** — Does every feature with user input have error handling? Does every feature with external dependencies have failure handling?
|
|
58
|
+
|
|
59
|
+
### Edge Case Enumeration
|
|
60
|
+
|
|
61
|
+
Systematically explore the boundaries of each feature:
|
|
62
|
+
|
|
63
|
+
**Boundary conditions:**
|
|
64
|
+
- Minimum values (0, empty string, empty list, null)
|
|
65
|
+
- Maximum values (max integer, max string length, max file size)
|
|
66
|
+
- Just over/under limits (101 characters for a 100-char limit)
|
|
67
|
+
- Unicode edge cases (emoji, RTL text, zero-width characters)
|
|
68
|
+
- Time zone boundaries (DST transitions, UTC offset changes)
|
|
69
|
+
- Date boundaries (leap years, month boundaries, year boundaries)
|
|
70
|
+
|
|
71
|
+
**State boundaries:**
|
|
72
|
+
- First use (no data exists)
|
|
73
|
+
- Normal use (typical data volume)
|
|
74
|
+
- Heavy use (large data volumes, many records)
|
|
75
|
+
- Degraded state (partial data, corrupt data, missing references)
|
|
76
|
+
- Recovery state (after a crash, after a failed migration, after restoring from backup)
|
|
77
|
+
|
|
78
|
+
**Concurrency boundaries:**
|
|
79
|
+
- Two users editing the same record
|
|
80
|
+
- Two users claiming the same resource
|
|
81
|
+
- Rapid successive submissions (double-click)
|
|
82
|
+
- Long-running operations interrupted by newer operations
|
|
83
|
+
- Race conditions between create and delete
|
|
84
|
+
|
|
85
|
+
**Network boundaries:**
|
|
86
|
+
- Slow connection (high latency)
|
|
87
|
+
- Intermittent connection (requests that time out mid-way)
|
|
88
|
+
- Offline mode (if applicable)
|
|
89
|
+
- Partial response (connection drops mid-transfer)
|
|
90
|
+
|
|
91
|
+
## Ambiguity Detection
|
|
92
|
+
|
|
93
|
+
An ambiguity is a statement that could reasonably be interpreted in more than one way. Ambiguities are gaps because the implementing team must guess which interpretation is correct.
|
|
94
|
+
|
|
95
|
+
### Types of Ambiguity
|
|
96
|
+
|
|
97
|
+
**Lexical ambiguity** — A word has multiple meanings.
|
|
98
|
+
- "The system should store the user's records." (Medical records? Usage records? Database records?)
|
|
99
|
+
- "Notify the admin when a user is blocked." (Email notification? In-app notification? Both?)
|
|
100
|
+
|
|
101
|
+
**Structural ambiguity** — The sentence structure allows multiple readings.
|
|
102
|
+
- "Users can view reports shared by team members and partners." (Reports shared by [team members and partners]? Or [reports shared by team members] and [partners]?)
|
|
103
|
+
- "The system sends email when the order is completed or cancelled and the user has opted in." (Opted in to what — both notifications or just cancellation?)
|
|
104
|
+
|
|
105
|
+
**Scope ambiguity** — The boundary of a requirement is unclear.
|
|
106
|
+
- "Support all modern browsers." (Which ones? What version threshold?)
|
|
107
|
+
- "The search should return relevant results." (What defines relevant? Ranked how?)
|
|
108
|
+
|
|
109
|
+
**Referential ambiguity** — Pronouns or references are unclear.
|
|
110
|
+
- "When the admin approves the user's request, they receive a notification." (Who receives — the admin or the user?)
|
|
111
|
+
|
|
112
|
+
### Detection Technique
|
|
113
|
+
|
|
114
|
+
For each requirement statement:
|
|
115
|
+
1. Read it once and form an interpretation.
|
|
116
|
+
2. Deliberately try to form a DIFFERENT valid interpretation.
|
|
117
|
+
3. If you can, the statement is ambiguous.
|
|
118
|
+
4. Rewrite the statement to be unambiguous, or flag it as needing clarification.
|
|
119
|
+
|
|
120
|
+
**Example:**
|
|
121
|
+
- Original: "The system should validate user input."
|
|
122
|
+
- Interpretation 1: Client-side validation only (JavaScript form validation)
|
|
123
|
+
- Interpretation 2: Server-side validation only (API-level validation)
|
|
124
|
+
- Interpretation 3: Both client-side and server-side validation
|
|
125
|
+
- Finding: Ambiguous. Specify where validation occurs.
|
|
126
|
+
- Rewrite: "The system validates user input on both the client (inline feedback during form entry) and the server (API returns 422 with field-level error messages)."
|
|
127
|
+
|
|
128
|
+
### Ambiguity Severity Levels
|
|
129
|
+
|
|
130
|
+
- **Critical** — Ambiguity about core functionality. Different interpretations lead to fundamentally different implementations.
|
|
131
|
+
- **Major** — Ambiguity about behavior details. Different interpretations lead to different user experiences.
|
|
132
|
+
- **Minor** — Ambiguity about edge cases or formatting. Different interpretations are cosmetically different.
|
|
133
|
+
|
|
134
|
+
## Edge Case Discovery
|
|
135
|
+
|
|
136
|
+
### Error Scenarios
|
|
137
|
+
|
|
138
|
+
For each operation, systematically enumerate error scenarios:
|
|
139
|
+
|
|
140
|
+
**Input errors:**
|
|
141
|
+
- Missing required fields
|
|
142
|
+
- Fields with wrong types
|
|
143
|
+
- Fields with values outside valid ranges
|
|
144
|
+
- Fields with malicious content (SQL injection, XSS)
|
|
145
|
+
- Duplicate submissions
|
|
146
|
+
|
|
147
|
+
**State errors:**
|
|
148
|
+
- Operating on a deleted entity
|
|
149
|
+
- Operating on an entity in an unexpected state
|
|
150
|
+
- Stale data (entity was modified since last read)
|
|
151
|
+
|
|
152
|
+
**Permission errors:**
|
|
153
|
+
- Unauthenticated access
|
|
154
|
+
- Authenticated but unauthorized access
|
|
155
|
+
- Access to another user's data
|
|
156
|
+
- Elevated privilege operations by non-admin users
|
|
157
|
+
|
|
158
|
+
**External dependency errors:**
|
|
159
|
+
- Payment processor unavailable
|
|
160
|
+
- Email service unavailable
|
|
161
|
+
- Third-party API returns unexpected response
|
|
162
|
+
- Third-party API rate limit exceeded
|
|
163
|
+
- DNS resolution failure
|
|
164
|
+
|
|
165
|
+
**Resource errors:**
|
|
166
|
+
- Database connection pool exhausted
|
|
167
|
+
- Disk full
|
|
168
|
+
- Memory exhausted
|
|
169
|
+
- File size exceeds limit
|
|
170
|
+
|
|
171
|
+
### Boundary Conditions
|
|
172
|
+
|
|
173
|
+
For each quantitative constraint, test the boundaries:
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
Constraint: Username must be 3-30 characters
|
|
177
|
+
Test cases:
|
|
178
|
+
- 0 characters (empty) → error
|
|
179
|
+
- 1 character → error
|
|
180
|
+
- 2 characters → error
|
|
181
|
+
- 3 characters → success (minimum boundary)
|
|
182
|
+
- 15 characters → success (normal)
|
|
183
|
+
- 30 characters → success (maximum boundary)
|
|
184
|
+
- 31 characters → error
|
|
185
|
+
- 1000 characters → error (ensure no buffer overflow)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Concurrent Access
|
|
189
|
+
|
|
190
|
+
For each shared resource:
|
|
191
|
+
1. What happens when two users read simultaneously? (Usually fine)
|
|
192
|
+
2. What happens when two users write simultaneously? (Last write wins? Merge? Reject?)
|
|
193
|
+
3. What happens when one user reads while another writes? (Stale data? Locked? Consistent?)
|
|
194
|
+
4. What happens when two users try to claim the same unique resource? (First wins? Queue? Error?)
|
|
195
|
+
|
|
196
|
+
## NFR Gap Patterns
|
|
197
|
+
|
|
198
|
+
### Performance Gaps
|
|
199
|
+
|
|
200
|
+
- Response time specified for reads but not writes
|
|
201
|
+
- Average response time specified but not percentiles (p50 can be 100ms while p99 is 10 seconds)
|
|
202
|
+
- Page load time specified but not API response time
|
|
203
|
+
- No specification for batch operations (import 10,000 records — how long is acceptable?)
|
|
204
|
+
- No specification for search response time (full-text search is often slower than CRUD)
|
|
205
|
+
|
|
206
|
+
### Security Gaps
|
|
207
|
+
|
|
208
|
+
- Authentication mechanism specified but not session management (timeout, rotation, revocation)
|
|
209
|
+
- Authorization model specified but not data isolation (can user A see user B's data?)
|
|
210
|
+
- Encryption at rest mentioned but not encryption in transit (or vice versa)
|
|
211
|
+
- Password policy not specified (minimum length, complexity, rotation)
|
|
212
|
+
- No mention of rate limiting or brute force protection
|
|
213
|
+
- No mention of audit logging (who did what when)
|
|
214
|
+
|
|
215
|
+
### Accessibility Gaps
|
|
216
|
+
|
|
217
|
+
- WCAG level stated but not specific compliance areas (keyboard navigation, screen reader support, color contrast)
|
|
218
|
+
- No mention of focus management for dynamic content (modals, notifications, form errors)
|
|
219
|
+
- No mention of alt text requirements for images
|
|
220
|
+
- No mention of motion reduction for users who prefer reduced motion
|
|
221
|
+
|
|
222
|
+
### Scalability Gaps
|
|
223
|
+
|
|
224
|
+
- Current scale specified but not growth projections
|
|
225
|
+
- User count specified but not data volume (10,000 users with 1 record each is different from 10,000 users with 1 million records each)
|
|
226
|
+
- No specification for what degrades gracefully under load (versus what must maintain full quality)
|
|
227
|
+
|
|
228
|
+
## Contradiction Detection
|
|
229
|
+
|
|
230
|
+
Contradictions are requirements that cannot both be true simultaneously.
|
|
231
|
+
|
|
232
|
+
### Detection Technique
|
|
233
|
+
|
|
234
|
+
1. Group requirements by topic (authentication, data handling, UI behavior, etc.).
|
|
235
|
+
2. Within each group, compare every pair of requirements.
|
|
236
|
+
3. Ask: "Can these both be true at the same time?"
|
|
237
|
+
|
|
238
|
+
### Common Contradiction Patterns
|
|
239
|
+
|
|
240
|
+
**Real-time vs. batch:**
|
|
241
|
+
- "Display real-time inventory counts" AND "Update inventory via nightly batch job"
|
|
242
|
+
- These contradict unless there is a mechanism to handle the 24-hour stale window.
|
|
243
|
+
|
|
244
|
+
**Simple vs. comprehensive:**
|
|
245
|
+
- "The interface should be simple and uncluttered" AND "Display all order details on one page"
|
|
246
|
+
- Simplicity and completeness often conflict. Which takes priority?
|
|
247
|
+
|
|
248
|
+
**Flexible vs. consistent:**
|
|
249
|
+
- "Allow users to customize their workflow" AND "Ensure all users follow the standard process"
|
|
250
|
+
- Customization and standardization conflict. What is the scope of customization?
|
|
251
|
+
|
|
252
|
+
**Fast vs. thorough:**
|
|
253
|
+
- "API responses under 100ms" AND "Validate against all business rules on every request"
|
|
254
|
+
- Complex validation may make 100ms impossible. Which gives?
|
|
255
|
+
|
|
256
|
+
### Resolution
|
|
257
|
+
|
|
258
|
+
For each contradiction, the PRD should clarify:
|
|
259
|
+
1. Which requirement takes priority?
|
|
260
|
+
2. Under what conditions does each apply?
|
|
261
|
+
3. Is there a design that satisfies both, and what are the trade-offs?
|
|
262
|
+
|
|
263
|
+
## Output Format
|
|
264
|
+
|
|
265
|
+
### Gap Report Structure
|
|
266
|
+
|
|
267
|
+
```markdown
|
|
268
|
+
## Gap Analysis Report
|
|
269
|
+
|
|
270
|
+
### Summary
|
|
271
|
+
- Total gaps found: [N]
|
|
272
|
+
- Critical: [N] (blocks implementation)
|
|
273
|
+
- Major: [N] (impacts quality)
|
|
274
|
+
- Minor: [N] (cosmetic or edge case)
|
|
275
|
+
|
|
276
|
+
### Critical Gaps
|
|
277
|
+
1. [Gap description]
|
|
278
|
+
- **Location:** [Section/feature]
|
|
279
|
+
- **Impact:** [What happens if not resolved]
|
|
280
|
+
- **Recommended resolution:** [What to add or clarify]
|
|
281
|
+
|
|
282
|
+
### Major Gaps
|
|
283
|
+
...
|
|
284
|
+
|
|
285
|
+
### Minor Gaps
|
|
286
|
+
...
|
|
287
|
+
|
|
288
|
+
### Ambiguities
|
|
289
|
+
1. [Statement as written]
|
|
290
|
+
- **Possible interpretations:** [list]
|
|
291
|
+
- **Recommended clarification:** [suggested rewrite]
|
|
292
|
+
|
|
293
|
+
### Contradictions
|
|
294
|
+
1. [Requirement A] vs [Requirement B]
|
|
295
|
+
- **Analysis:** [why they conflict]
|
|
296
|
+
- **Recommended resolution:** [which takes priority and why]
|
|
297
|
+
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## When to Use Gap Analysis
|
|
301
|
+
|
|
302
|
+
- **After PRD creation** — Find gaps before domain modeling begins. Cheapest time to fix.
|
|
303
|
+
- **After each documentation phase** — Incremental gap analysis as specifications become more detailed.
|
|
304
|
+
- **After requirements change** — Any PRD modification should trigger gap analysis of affected features.
|
|
305
|
+
- **Before implementation** — Final gap analysis of the complete specification set.
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prd-craft
|
|
3
|
+
description: What makes a good PRD — problem framing, feature scoping, success criteria, competitive context
|
|
4
|
+
topics: [prd, requirements, product, scoping]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# PRD Craft
|
|
8
|
+
|
|
9
|
+
A Product Requirements Document is the single source of truth for what is being built and why. It defines the problem, the users, the scope, and the success criteria. Everything in the pipeline flows from the PRD — domain models, architecture, implementation tasks. A weak PRD propagates weakness through every downstream artifact.
|
|
10
|
+
|
|
11
|
+
This document covers what makes a good PRD, what makes a bad one, and how to tell the difference.
|
|
12
|
+
|
|
13
|
+
## Problem Statement
|
|
14
|
+
|
|
15
|
+
The problem statement is the foundation. If it is wrong, everything built on top of it is wrong.
|
|
16
|
+
|
|
17
|
+
### What Makes a Good Problem Statement
|
|
18
|
+
|
|
19
|
+
A good problem statement is **specific**, **testable**, and **grounded in observable reality**.
|
|
20
|
+
|
|
21
|
+
**Good examples:**
|
|
22
|
+
- "Small business owners spend an average of 6 hours per week manually reconciling invoices from 3+ payment processors because no tool aggregates them into a single view."
|
|
23
|
+
- "Mobile users abandon checkout at a 72% rate because the current flow requires 7 form screens on a 4-inch display."
|
|
24
|
+
- "Customer support handles 200+ tickets per week about order status because there is no self-service tracking interface."
|
|
25
|
+
|
|
26
|
+
**Bad examples:**
|
|
27
|
+
- "We need to improve the user experience." (Not specific — improve what? For whom? By how much?)
|
|
28
|
+
- "The platform should be more scalable." (Not a problem — scalability is a solution. What breaks at what scale?)
|
|
29
|
+
- "Users want a better dashboard." (Aspirational, not grounded. What is wrong with the current one? What does "better" mean?)
|
|
30
|
+
- "We need to modernize our technology stack." (Technology is not a problem — what user-facing or business issue does the old stack cause?)
|
|
31
|
+
|
|
32
|
+
### Problem Statement Checklist
|
|
33
|
+
|
|
34
|
+
- [ ] Names a specific user group (not "users" or "everyone")
|
|
35
|
+
- [ ] Describes an observable behavior or pain point (not a desired state)
|
|
36
|
+
- [ ] Includes quantitative evidence where available (time wasted, error rate, abandonment rate)
|
|
37
|
+
- [ ] Does not prescribe a solution (the problem is not "we need feature X")
|
|
38
|
+
- [ ] Can be validated — you can measure whether the problem is solved
|
|
39
|
+
|
|
40
|
+
## Target Users
|
|
41
|
+
|
|
42
|
+
### Personas with Needs
|
|
43
|
+
|
|
44
|
+
Each persona should have:
|
|
45
|
+
- **Role or description** — Who they are in relation to the product.
|
|
46
|
+
- **Primary need** — What they need from this specific product. Not generic needs.
|
|
47
|
+
- **Current behavior** — How they currently solve the problem (or cope with it).
|
|
48
|
+
- **Constraints** — What limits their ability to adopt a solution (time, skill, budget, organizational rules).
|
|
49
|
+
- **Success looks like** — What would change for them if the problem were solved.
|
|
50
|
+
|
|
51
|
+
**Good persona:**
|
|
52
|
+
```
|
|
53
|
+
## Small Business Owner (Primary)
|
|
54
|
+
- Manages 1-3 employees
|
|
55
|
+
- Handles own bookkeeping alongside core business work
|
|
56
|
+
- Currently uses spreadsheets and manual data entry from 3 payment processor dashboards
|
|
57
|
+
- Has 30 minutes per day maximum for administrative tasks
|
|
58
|
+
- Non-technical — comfortable with consumer apps but not developer tools
|
|
59
|
+
- Success: invoice reconciliation takes < 30 minutes per week instead of 6 hours
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**Bad persona:**
|
|
63
|
+
```
|
|
64
|
+
## User
|
|
65
|
+
- Wants to manage their business better
|
|
66
|
+
- Uses our product regularly
|
|
67
|
+
- Needs things to be fast and easy
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
The bad persona tells the implementation team nothing actionable. It does not constrain design decisions.
|
|
71
|
+
|
|
72
|
+
### How Many Personas
|
|
73
|
+
|
|
74
|
+
Most products have 2-4 meaningful personas. If a PRD lists more than 6, the product scope is likely too broad. If it lists only 1, secondary users (admins, support staff, integration partners) may be missing.
|
|
75
|
+
|
|
76
|
+
### Anti-pattern: The Everything User
|
|
77
|
+
|
|
78
|
+
A persona that represents all users is no persona at all. "Power users who want advanced features AND casual users who want simplicity" describes a contradiction, not a persona. Different personas may have conflicting needs — that is fine, but the PRD must state which takes priority.
|
|
79
|
+
|
|
80
|
+
## Feature Scoping
|
|
81
|
+
|
|
82
|
+
### What Is In, What Is Out, What Is Deferred
|
|
83
|
+
|
|
84
|
+
Every PRD should have three explicit lists:
|
|
85
|
+
|
|
86
|
+
**In Scope (v1):** Features that will be built in this release. Each should be specific enough to estimate.
|
|
87
|
+
|
|
88
|
+
**Out of Scope:** Features that will NOT be built. Stating what is out is as important as stating what is in — it prevents scope creep during downstream phases.
|
|
89
|
+
|
|
90
|
+
**Deferred (future):** Features that are planned for later releases. This is different from "out of scope" — deferred items inform architecture decisions (design for extensibility) without committing to immediate implementation.
|
|
91
|
+
|
|
92
|
+
**Good scoping:**
|
|
93
|
+
```
|
|
94
|
+
## In Scope
|
|
95
|
+
- User registration with email/password
|
|
96
|
+
- Product catalog with category-based browsing
|
|
97
|
+
- Shopping cart with add/remove/update quantity
|
|
98
|
+
- Checkout with Stripe payment integration
|
|
99
|
+
- Order confirmation email
|
|
100
|
+
- Order history page
|
|
101
|
+
|
|
102
|
+
## Out of Scope
|
|
103
|
+
- Social login (Google, Apple, Facebook)
|
|
104
|
+
- Product reviews and ratings
|
|
105
|
+
- Wishlist functionality
|
|
106
|
+
- Gift cards and promo codes
|
|
107
|
+
- Multi-currency support
|
|
108
|
+
|
|
109
|
+
## Deferred (v2)
|
|
110
|
+
- Mobile native app (design API for mobile consumption)
|
|
111
|
+
- Marketplace for third-party sellers (design data model for future multi-tenancy)
|
|
112
|
+
- Advanced search with filters (use basic text search for v1)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**Bad scoping:**
|
|
116
|
+
```
|
|
117
|
+
## Features
|
|
118
|
+
- User management
|
|
119
|
+
- Product management
|
|
120
|
+
- Order management
|
|
121
|
+
- Payment processing
|
|
122
|
+
- Notifications
|
|
123
|
+
- Analytics
|
|
124
|
+
- Admin tools
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
This tells you nothing about boundaries. Is "user management" basic registration or full RBAC with teams and permissions? Is "analytics" a page view counter or a business intelligence suite?
|
|
128
|
+
|
|
129
|
+
### MoSCoW Prioritization
|
|
130
|
+
|
|
131
|
+
When the in-scope list is large, use MoSCoW to further prioritize:
|
|
132
|
+
|
|
133
|
+
- **Must Have** — Without these, the product does not solve the problem statement. Failure to deliver any Must Have means the release fails.
|
|
134
|
+
- **Should Have** — Important but not critical. The product works without them but is noticeably weaker.
|
|
135
|
+
- **Could Have** — Nice to have. Include if time permits.
|
|
136
|
+
- **Won't Have (this release)** — Same as deferred, but MoSCoW makes priority explicit.
|
|
137
|
+
|
|
138
|
+
**Example:**
|
|
139
|
+
```
|
|
140
|
+
Must Have:
|
|
141
|
+
- User registration and login
|
|
142
|
+
- Product catalog display
|
|
143
|
+
- Add to cart
|
|
144
|
+
- Checkout with payment
|
|
145
|
+
- Order confirmation
|
|
146
|
+
|
|
147
|
+
Should Have:
|
|
148
|
+
- Search by product name
|
|
149
|
+
- Order history
|
|
150
|
+
- Email notifications for order status changes
|
|
151
|
+
|
|
152
|
+
Could Have:
|
|
153
|
+
- Category filtering
|
|
154
|
+
- Recently viewed products
|
|
155
|
+
- Save payment method for future use
|
|
156
|
+
|
|
157
|
+
Won't Have:
|
|
158
|
+
- Product reviews
|
|
159
|
+
- Wishlist
|
|
160
|
+
- Social login
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Feature Detail Level
|
|
164
|
+
|
|
165
|
+
Each in-scope feature needs enough detail to be estimable:
|
|
166
|
+
|
|
167
|
+
**Too vague:**
|
|
168
|
+
- "Product search" — Full-text? By name only? With filters? Auto-suggest? Fuzzy matching?
|
|
169
|
+
|
|
170
|
+
**Right level:**
|
|
171
|
+
- "Product search: Text search by product name and description. Results ranked by relevance. Paginated, 20 per page. No filters in v1. No auto-suggest in v1."
|
|
172
|
+
|
|
173
|
+
**Too detailed (belongs in specs, not PRD):**
|
|
174
|
+
- "Product search: Implement Elasticsearch with BM25 ranking, 3-gram tokenizer, custom analyzers for each locale, with Redis caching of top-1000 queries..."
|
|
175
|
+
|
|
176
|
+
The PRD says WHAT, not HOW.
|
|
177
|
+
|
|
178
|
+
## Success Criteria
|
|
179
|
+
|
|
180
|
+
### Measurable Outcomes
|
|
181
|
+
|
|
182
|
+
Success criteria define how you will know the product works. They must be measurable, specific, and tied to the problem statement.
|
|
183
|
+
|
|
184
|
+
**Good success criteria:**
|
|
185
|
+
- "Invoice reconciliation time decreases from 6 hours/week to under 30 minutes/week for the median user."
|
|
186
|
+
- "Checkout abandonment rate decreases from 72% to under 40%."
|
|
187
|
+
- "Customer support tickets about order status decrease by 80%."
|
|
188
|
+
- "95% of new users complete onboarding without contacting support."
|
|
189
|
+
|
|
190
|
+
**Bad success criteria:**
|
|
191
|
+
- "Users are satisfied with the product." (Not measurable without defining how satisfaction is measured)
|
|
192
|
+
- "The system is performant." (Not specific — performant how?)
|
|
193
|
+
- "Revenue increases." (Not tied to the problem. Revenue can increase for many reasons.)
|
|
194
|
+
- "We ship on time." (Success criteria for the project, not the product)
|
|
195
|
+
|
|
196
|
+
### Types of Success Criteria
|
|
197
|
+
|
|
198
|
+
1. **User behavior metrics** — Conversion rates, completion rates, time-on-task, error rates.
|
|
199
|
+
2. **Business metrics** — Revenue impact, cost reduction, customer acquisition.
|
|
200
|
+
3. **Technical metrics** — Uptime, latency, error rate (these are NFRs, but they can also be success criteria).
|
|
201
|
+
4. **Adoption metrics** — Sign-up rate, daily active users, feature usage.
|
|
202
|
+
|
|
203
|
+
Every success criterion should have a **target value** and a **measurement method**. "Checkout abandonment under 40% as measured by analytics funnel tracking" is complete. "Checkout abandonment decreases" is not.
|
|
204
|
+
|
|
205
|
+
## Constraints
|
|
206
|
+
|
|
207
|
+
### Categories of Constraints
|
|
208
|
+
|
|
209
|
+
**Technical constraints:**
|
|
210
|
+
- Existing systems that must be integrated with.
|
|
211
|
+
- Technology mandates from the organization (e.g., must use AWS, must use TypeScript).
|
|
212
|
+
- Legacy data that must be migrated.
|
|
213
|
+
- API contracts that cannot be changed.
|
|
214
|
+
|
|
215
|
+
**Timeline constraints:**
|
|
216
|
+
- Hard deadlines (regulatory, contractual, event-driven).
|
|
217
|
+
- Soft deadlines (competitive pressure, business planning).
|
|
218
|
+
- Phase constraints (v1 by date X, v2 by date Y).
|
|
219
|
+
|
|
220
|
+
**Budget constraints:**
|
|
221
|
+
- Development budget (team size, contractor budget).
|
|
222
|
+
- Infrastructure budget (monthly cloud spend limits).
|
|
223
|
+
- Third-party service costs (payment processor fees, API call limits).
|
|
224
|
+
|
|
225
|
+
**Team constraints:**
|
|
226
|
+
- Team size and skill composition.
|
|
227
|
+
- Available work hours (full-time vs part-time contributors).
|
|
228
|
+
- Technology familiarity (learning curve for new tech).
|
|
229
|
+
|
|
230
|
+
**Regulatory constraints:**
|
|
231
|
+
- Data privacy (GDPR, CCPA, HIPAA).
|
|
232
|
+
- Financial regulations (PCI DSS, SOX).
|
|
233
|
+
- Accessibility mandates (ADA, WCAG requirements).
|
|
234
|
+
- Industry-specific regulations.
|
|
235
|
+
|
|
236
|
+
### How Constraints Affect Downstream Artifacts
|
|
237
|
+
|
|
238
|
+
Each constraint should be traceable to architectural decisions:
|
|
239
|
+
- "Must use PostgreSQL" → ADR for database choice.
|
|
240
|
+
- "Must comply with GDPR" → Data model includes consent tracking, API includes data export/delete.
|
|
241
|
+
- "Team of 3 developers" → Implementation tasks sized for 3 parallel workers.
|
|
242
|
+
- "Launch by March 1" → Feature scope fits within timeline.
|
|
243
|
+
|
|
244
|
+
## Non-Functional Requirements
|
|
245
|
+
|
|
246
|
+
NFRs define HOW the system should behave, not WHAT it should do. They are frequently under-specified in PRDs, which leads to expensive rework.
|
|
247
|
+
|
|
248
|
+
### Quantified NFRs
|
|
249
|
+
|
|
250
|
+
**Good:**
|
|
251
|
+
- "Page load time: p95 under 2 seconds on 4G mobile connection."
|
|
252
|
+
- "API response time: p95 under 200ms for read operations, p95 under 500ms for write operations."
|
|
253
|
+
- "Availability: 99.9% uptime measured monthly (43 minutes of downtime per month allowed)."
|
|
254
|
+
- "Concurrent users: Support 10,000 simultaneous authenticated sessions."
|
|
255
|
+
- "Data retention: Transaction records retained for 7 years per financial regulation."
|
|
256
|
+
|
|
257
|
+
**Bad:**
|
|
258
|
+
- "The system should be fast." (How fast? Under what conditions?)
|
|
259
|
+
- "High availability." (What percentage? How is it measured?)
|
|
260
|
+
- "Scalable." (To what? 100 users? 1 million users? What is the growth curve?)
|
|
261
|
+
- "Secure." (Against what threats? To what standard?)
|
|
262
|
+
|
|
263
|
+
### NFR Categories Checklist
|
|
264
|
+
|
|
265
|
+
- [ ] **Performance** — Response times (p50, p95, p99), throughput, page load times
|
|
266
|
+
- [ ] **Scalability** — Concurrent users, data volume, growth rate
|
|
267
|
+
- [ ] **Availability** — Uptime target, maintenance windows, failover requirements
|
|
268
|
+
- [ ] **Security** — Authentication requirements, encryption, audit logging, compliance standards
|
|
269
|
+
- [ ] **Accessibility** — WCAG level, screen reader support, keyboard navigation
|
|
270
|
+
- [ ] **Data** — Retention periods, backup frequency, recovery point objective (RPO), recovery time objective (RTO)
|
|
271
|
+
- [ ] **Internationalization** — Languages, locales, character sets, date/number formats
|
|
272
|
+
- [ ] **Browser/device support** — Minimum browser versions, mobile support, responsive breakpoints
|
|
273
|
+
- [ ] **Monitoring** — What needs to be observable? Alerting thresholds?
|
|
274
|
+
|
|
275
|
+
## Competitive Context
|
|
276
|
+
|
|
277
|
+
### What to Include
|
|
278
|
+
|
|
279
|
+
- **What exists** — Name competing products and what they do well.
|
|
280
|
+
- **How this is different** — Specific differentiators, not "we're better."
|
|
281
|
+
- **Why users would switch** — What pain does this product solve that competitors do not?
|
|
282
|
+
- **What to learn from** — Features or patterns from competitors worth adopting.
|
|
283
|
+
|
|
284
|
+
### What NOT to Include
|
|
285
|
+
|
|
286
|
+
- Exhaustive competitor feature matrices (belongs in market research, not PRD).
|
|
287
|
+
- Competitive strategy or positioning (belongs in business plan, not PRD).
|
|
288
|
+
- Pricing comparisons (unless pricing is a product feature).
|
|
289
|
+
|
|
290
|
+
## Common PRD Failures
|
|
291
|
+
|
|
292
|
+
### The "Requirements as Solutions" Failure
|
|
293
|
+
PRD prescribes technical solutions instead of stating requirements. "Use Redis for caching" belongs in architecture, not the PRD. The PRD should say "response time under 200ms" — how to achieve that is an architectural decision.
|
|
294
|
+
|
|
295
|
+
### The "Missing Sad Path" Failure
|
|
296
|
+
PRD describes only happy paths. What happens when payment fails? When the user's session expires during checkout? When the network drops? When the form has invalid data? Every user action that can fail should have at least a sentence about what happens.
|
|
297
|
+
|
|
298
|
+
### The "Everyone Is a User" Failure
|
|
299
|
+
PRD addresses "users" as a monolith instead of identifying distinct personas with distinct needs. Admins, end users, API consumers, and support staff have different requirements.
|
|
300
|
+
|
|
301
|
+
### The "Implied API" Failure
|
|
302
|
+
PRD describes a UI but implies an API without stating it. "Users can view their order history" implies GET /orders, data model for orders, pagination, filtering, sorting. These implications should be explicit in the PRD.
|
|
303
|
+
|
|
304
|
+
### The "No Boundaries" Failure
|
|
305
|
+
PRD states what is in scope but never states what is out. Every documentation phase becomes a scope negotiation.
|
|
306
|
+
|
|
307
|
+
### The "Success Is Shipping" Failure
|
|
308
|
+
PRD has no success criteria beyond "launch the product." Without measurable outcomes, there is no way to know if the product solved the problem.
|
|
309
|
+
|
|
310
|
+
## PRD Quality Checklist
|
|
311
|
+
|
|
312
|
+
Before considering a PRD complete:
|
|
313
|
+
|
|
314
|
+
- [ ] Problem statement is specific and testable
|
|
315
|
+
- [ ] Target users are identified with personas
|
|
316
|
+
- [ ] Features are scoped with in/out/deferred lists
|
|
317
|
+
- [ ] Features are prioritized (MoSCoW or equivalent)
|
|
318
|
+
- [ ] Success criteria are measurable with target values
|
|
319
|
+
- [ ] Constraints are documented (technical, timeline, budget, team, regulatory)
|
|
320
|
+
- [ ] NFRs are quantified
|
|
321
|
+
- [ ] Error scenarios and edge cases are addressed (at least at high level)
|
|
322
|
+
- [ ] Competitive context is provided
|
|
323
|
+
- [ ] The PRD says WHAT, not HOW
|
|
324
|
+
- [ ] Every stakeholder group has been considered (end users, admins, support, integrators)
|