BlogWikiAbout

Kyle Pericak

"It works in my environment"

Bot-Wiki/Product Requirement Docs/<Feature Name>

<Feature Name>

Problem

What's broken or missing? Who has this problem? How do we know it's real?

Goal

What does success look like? One sentence.

Success Metrics

How will we measure whether this worked? 1-3 measurable indicators.

Non-Goals

What are we explicitly NOT doing? Draw the boundary of the solution space.

User Stories

Who does what, and why? 2-5 stories, each with acceptance criteria.

Story: </h3> <p>As a <user>, I want <action> so that <outcome>.</p> <p><strong>Acceptance criteria:</strong></p> <ul class="contains-task-list"> <li class="task-list-item"><input type="checkbox" disabled> <testable condition with specific expected behavior></li> <li class="task-list-item"><input type="checkbox" disabled> <testable condition with specific expected behavior></li> </ul> <h2 id="scope">Scope</h2> <p>What's in v1? What's deferred? Be specific about boundaries.</p> <h2 id="open-questions">Open Questions</h2> <p>What don't we know yet? What needs investigation before implementation?</p> <h2 id="risks">Risks</h2> <p>What could go wrong? What assumptions are we making?</p> </div><style data-emotion="css 15l33vf">.css-15l33vf{margin-top:30px;padding-top:15px;border-top:1px solid #eee;}</style><div class="MuiBox-root css-15l33vf"><style data-emotion="css 1wlk75r">.css-1wlk75r{margin:0;font-size:14px;color:#888888;margin-bottom:5px;}</style><span class="MuiTypography-root MuiTypography-blogPostGreySubtitle css-1wlk75r">Related:</span><style data-emotion="css 1424k1g">.css-1424k1g{-webkit-text-decoration:underline;text-decoration:underline;text-decoration-color:rgba(25, 118, 210, 0.4);display:block;-webkit-text-decoration:none;text-decoration:none;margin-bottom:3px;}.css-1424k1g:hover{text-decoration-color:inherit;}</style><style data-emotion="css 1f3lvd5">.css-1f3lvd5{margin:0;font:inherit;color:#1976d2;-webkit-text-decoration:underline;text-decoration:underline;text-decoration-color:rgba(25, 118, 210, 0.4);display:block;-webkit-text-decoration:none;text-decoration:none;margin-bottom:3px;}.css-1f3lvd5:hover{text-decoration-color:inherit;}</style><a class="MuiTypography-root MuiTypography-inherit MuiLink-root MuiLink-underlineAlways css-1f3lvd5" href="/wiki/design-docs/<slug>.html">wiki/design-docs/<slug></a><a class="MuiTypography-root MuiTypography-inherit MuiLink-root MuiLink-underlineAlways css-1f3lvd5" href="/<linear-issue-url>.html"><linear-issue-url></a></div></div></div></div><style data-emotion="css 1jv09ek">.css-1jv09ek{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%;height:50px;background-color:#EEEEEE;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;border:1px dotted #AAAAAA;padding:0 10px;}@media (min-width:0px){.css-1jv09ek{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding-left:3%;padding-right:3%;}}@media (min-width:600px){.css-1jv09ek{-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding-left:3%;padding-right:3%;}}@media (min-width:900px){.css-1jv09ek{padding-left:6%;padding-right:6%;}}@media (min-width:1200px){.css-1jv09ek{padding-left:9%;padding-right:9%;}}</style><div class="MuiBox-root css-1jv09ek"><style data-emotion="css 1wdrywq">.css-1wdrywq{margin:0;font-size:small;text-align:center;word-wrap:break-word;overflow-wrap:anywhere;}</style><span class="MuiTypography-root MuiTypography-footerText css-1wdrywq">Blog code last updated on <!-- -->2026-03-17<!-- -->:<a href="https://github.com/kylep/multi/commit/7ae9b0dec32c090b187b7ffa81b1559756cdad46"> <!-- -->7ae9b0dec32c090b187b7ffa81b1559756cdad46</a></span></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"route":["wiki","prds","template"],"markdownFiles":[],"categories":{"dev":13,"ai":11,"development":14,"cloud":22,"systems administration":17,"reference pages":5,"projects":5,"gaming":1,"guides":1},"tags":{"ai-agents":2,"sdlc":1,"product-management":1,"prd":1,"design-docs":1,"claude-code":14,"ai":15,"kubernetes":2,"agents":2,"automation":1,"go":1,"mcp":6,"cloudflare":2,"dns":2,"orchestration":1,"bot-wiki":3,"security":4,"hooks":1,"rag":2,"faiss":1,"openrouter":2,"embeddings":1,"python":12,"wiki":1,"knowledge-base":1,"opencode":3,"openclaw":4,"linear":3,"self-hosted":3,"vault":1,"telegram":1,"docker":11,"linting":1,"ruff":1,"biome":1,"hadolint":1,"tflint":1,"semgrep":1,"trivy":1,"gitleaks":1,"cursor":2,"llm":2,"dev":1,"ga4":1,"google-analytics":1,"next-js":1,"playwright":1,"testing":1,"gherkin":1,"codex":1,"monorepo":1,"ruler":1,"images":2,"comfyui":1,"apple-silicon":2,"sdxl":1,"ip-adapter":1,"ttrpg":1,"coderabbit":1,"code-review":1,"github":1,"llama-cpp":1,"qwen":1,"deepseek":1,"mistral":1,"openai":2,"flux":1,"nano-banana":1,"blog":1,"markdown":1,"mermaid":1,"diagram":1,"openstack":9,"https":3,"openssl":1,"mac-os":4,"ubuntu":9,"kvm":1,"http":1,"api":2,"tshark":1,"tcpdump":1,"nfs":1,"ceph":2,"git":2,"aws":11,"lambda":3,"codebuild":2,"windows":2,"powershell":1,"api-gateway":1,"firebase":2,"cicd":1,"codepipeline":1,"codecommit":1,"ec2":1,"node.js":1,"ansible":3,"gcp":7,"vim":2,"s3":1,"remote-access":2,"pure-storage":1,"bash":2,"pypi":1,"minecraft":1,"email":4,"wifi":2,"chrome":1,"ssh":1,"postfix":1,"ci/cd":1,"pelican":4},"currentPageIndexNumber":0,"pageCount":6,"postContent":{},"wikiContent":{"slug":"wiki/prds/template","title":"\u003cFeature Name\u003e","summary":"\u003cOne-liner\u003e","contentHtml":"\u003ch2 id=\"problem\"\u003eProblem\u003c/h2\u003e\n\u003cp\u003eWhat's broken or missing? Who has this problem? How do we know it's real?\u003c/p\u003e\n\u003ch2 id=\"goal\"\u003eGoal\u003c/h2\u003e\n\u003cp\u003eWhat does success look like? One sentence.\u003c/p\u003e\n\u003ch2 id=\"success-metrics\"\u003eSuccess Metrics\u003c/h2\u003e\n\u003cp\u003eHow will we measure whether this worked? 1-3 measurable indicators.\u003c/p\u003e\n\u003ch2 id=\"non-goals\"\u003eNon-Goals\u003c/h2\u003e\n\u003cp\u003eWhat are we explicitly NOT doing? Draw the boundary of the solution space.\u003c/p\u003e\n\u003ch2 id=\"user-stories\"\u003eUser Stories\u003c/h2\u003e\n\u003cp\u003eWho does what, and why? 2-5 stories, each with acceptance criteria.\u003c/p\u003e\n\u003ch3 id=\"story-title\"\u003eStory: \u003ctitle\u003e\u003c/h3\u003e\n\u003cp\u003eAs a \u003cuser\u003e, I want \u003caction\u003e so that \u003coutcome\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAcceptance criteria:\u003c/strong\u003e\u003c/p\u003e\n\u003cul class=\"contains-task-list\"\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" disabled\u003e \u003ctestable condition with specific expected behavior\u003e\u003c/li\u003e\n\u003cli class=\"task-list-item\"\u003e\u003cinput type=\"checkbox\" disabled\u003e \u003ctestable condition with specific expected behavior\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"scope\"\u003eScope\u003c/h2\u003e\n\u003cp\u003eWhat's in v1? What's deferred? Be specific about boundaries.\u003c/p\u003e\n\u003ch2 id=\"open-questions\"\u003eOpen Questions\u003c/h2\u003e\n\u003cp\u003eWhat don't we know yet? What needs investigation before implementation?\u003c/p\u003e\n\u003ch2 id=\"risks\"\u003eRisks\u003c/h2\u003e\n\u003cp\u003eWhat could go wrong? What assumptions are we making?\u003c/p\u003e\n","metaData":{"title":"\u003cFeature Name\u003e","summary":"\u003cOne-liner\u003e","status":"draft | approved | in-progress | done","owner":"kyle","date":"YYYY-MM-DD","hidden":false,"related":["wiki/design-docs/\u003cslug\u003e","\u003clinear-issue-url\u003e"]},"breadcrumbs":[{"title":"Bot-Wiki","slug":"wiki"},{"title":"Product Requirement Docs","slug":"wiki/prds"},{"title":"\u003cFeature Name\u003e","slug":"wiki/prds/template"}],"childTreeHtml":"","children":[]},"lastGitCommitHash":"7ae9b0dec32c090b187b7ffa81b1559756cdad46","siteLastModified":"2026-03-17"},"__N_SSG":true},"page":"/[...route]","query":{"route":["wiki","prds","template"]},"buildId":"uocAgF0qPuNcHlPaI-0od","isFallback":false,"gsp":true,"scriptLoader":[]}</script></body></html>