{"slug":"write-product-spec","title":"write-product-spec","summary":"Use when a user asks for a product spec with invariants, a tech spec, or a PRD. Modes: product (default), technical, requirements. Not for task breakdown: use plan.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-08T21:38:38.024511Z","repo":{"url":"https://github.com/OutlineDriven/odin-claude-plugin","stars":38,"forks":0,"license":"Apache-2.0","updatedAt":"2026-09-25T15:08:42Z"},"bodyHtml":"<hr>\n<h2>name: write-product-spec\ndescription: 'Use when a user asks for a product spec with invariants, a tech spec, or a PRD. Modes: product (default), technical, requirements. Not for task breakdown: use plan.'\ndisable-model-invocation: true</h2>\n<h1>Write product spec</h1>\n<h2>Contract</h2>\n<table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Bound contract</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Trigger</td>\n<td>User asks for a product spec with numbered behavioral invariants, a technical implementation plan, or an evidence-backed PRD.</td>\n</tr>\n<tr>\n<td>Authority</td>\n<td>Human-gated: in requirements mode, previews and confirms credentials, paid actions, and remote publishing before execution; otherwise writes only the named artifact. Rollback is delete the file. No remote mutation without explicit human approval in requirements mode.</td>\n</tr>\n<tr>\n<td>Side effect</td>\n<td>Writes one PRODUCT.md, TECH.md, or PRD artifact; in requirements mode also stages, commits, and opens a PR after explicit confirmation.</td>\n</tr>\n<tr>\n<td>Done</td>\n<td>The named artifact exists, meets its mode-specific contract, and the output is confirmed.</td>\n</tr>\n</tbody>\n</table>\n<h2>Inputs</h2>\n<ul>\n<li>Mode (required): <code>product</code> (default), <code>technical</code>, or <code>requirements</code>.</li>\n<li>Feature identifier or intent (required): for <code>product</code> and <code>requirements</code>, a short kebab-case feature name or ticket or issue number; for <code>technical</code>, a description of the feature, change, or system to specify.</li>\n<li>Feature summary (required for <code>product</code> and <code>requirements</code>): one to three sentences describing what the feature does and the desired outcome.</li>\n<li>Target consumers (optional for <code>product</code>): who consumes the surface. Defaults to the end user.</li>\n<li>Key behaviors and edge cases (optional for <code>product</code>): gather via dialogue; do not guess.</li>\n<li>Codebase context (optional for <code>technical</code>): existing files, modules, or architecture the spec must integrate with.</li>\n<li>Target users (optional for <code>requirements</code>): who the feature serves.</li>\n<li>Constraints (optional for <code>requirements</code>): limits on the feature.</li>\n<li>Related URLs or docs (optional for <code>requirements</code>): sources to cite.</li>\n<li>Priority level (optional for <code>requirements</code>): P0, P1, or P2.</li>\n</ul>\n<h2>Procedure</h2>\n<ol>\n<li>Select the mode. Ask or infer from the request: <code>product</code> for behavioral invariants, <code>technical</code> for implementation plan, <code>requirements</code> for evidence-backed PRD. Default to <code>product</code> if the request does not name a mode. Done when: the mode is confirmed.</li>\n<li>Confirm scope. Ask only what is strictly necessary; do not guess.\n<ul>\n<li>Mode <code>product</code>: confirm the feature identifier, feature summary, target consumers, key behaviors, edge cases, and validation approach.</li>\n<li>Mode <code>technical</code>: confirm the intent, codebase context, and constraints.</li>\n<li>Mode <code>requirements</code>: confirm the feature name or description, target users, constraints, related URLs or docs, and priority level.\nDone when: the required scope for the selected mode is confirmed.</li>\n</ul>\n</li>\n<li>Mode <code>requirements</code>: gather supporting evidence. Read local sources when present and non-stale (≤7 days): <code>reports/customer_feedback_summaries/</code>, <code>reports/competitor_changelog_reports/</code> or <code>reports/feature_research/</code>, <code>reports/git_history_analysis/</code>, <code>reports/weekly_product_briefings/</code>. Note absent or stale sources. Cite every claim in the Problem Statement and Technical Considerations sections; tag unattributed claims <code>[UNCITED]</code>. Done when: available sources are read and stale or missing sources are noted.</li>\n<li>Draft the artifact structure.\n<ul>\n<li>Mode <code>product</code>: Summary (required), Behavior (required, numbered invariants), optional Problem, optional Goals/Non-goals, optional Open questions. Do not include Validation, Success criteria, or Testing sections.</li>\n<li>Mode <code>technical</code>: Objective, Background, Design, Implementation plan, Risks and mitigations, Open questions. No placeholders or TODOs.</li>\n<li>Mode <code>requirements</code>: TL;DR, Problem Statement, Goals &amp; Success Metrics, Target Users, Scope, Proposed Solution, Technical Considerations, Competitive Context, Open Questions, References. Include a header block with title, author, date, status (Draft), priority.\nDone when: the section list is decided with required and optional sections.</li>\n</ul>\n</li>\n<li>Produce the content.\n<ul>\n<li>Mode <code>product</code>: write Behavior as numbered, testable invariants from the consumer's perspective. Cover default flow, states, inputs, empty/error/loading/cancellation states, edge cases, keyboard/accessibility, and invariants. Keep framing thin relative to Behavior.</li>\n<li>Mode <code>technical</code>: write each section. Validate every implementation step against the codebase: confirm referenced paths, types, and interfaces exist or are created by a prior step.</li>\n<li>Mode <code>requirements</code>: write each section with citations. Derive the feature slug from the feature name (lowercase, hyphenated).\nDone when: all sections are drafted with concrete content and the mode-specific contract is satisfied.</li>\n</ul>\n</li>\n<li>Write the artifact.\n<ul>\n<li>Mode <code>product</code>: <code>specs/&lt;id&gt;/PRODUCT.md</code> where <code>&lt;id&gt;</code> is the feature identifier.</li>\n<li>Mode <code>technical</code>: <code>TECH.md</code> in the working directory.</li>\n<li>Mode <code>requirements</code>: <code>reports/prds/prd_&lt;feature_slug&gt;_YYYY-MM-DD.md</code>.\nCreate the directory if it does not exist. Done when: the file is written to the correct path.</li>\n</ul>\n</li>\n<li>Mode <code>requirements</code>: publish the PRD. Present the saved path and a content summary. Obtain explicit confirmation. Stage and commit the PRD file; open a pull request against the default branch. If VCS commands fail, report the error. Inform the user that optional exports to Google Docs, Notion, or Slack are separate steps. Done when: the PR is open or the user stops before the PR.</li>\n<li>Confirm the output. Present the file path, a one-line summary, and a count (behavior invariants for <code>product</code>, implementation steps for <code>technical</code>, or sections for <code>requirements</code>). Done when: the summary and count are presented.</li>\n</ol>\n<h2>Failure and recovery</h2>\n<table>\n<thead>\n<tr>\n<th>Failure class</th>\n<th>Mode</th>\n<th>Partial-result rule</th>\n<th>Recovery</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Missing scope</td>\n<td>all</td>\n<td>No file written</td>\n<td>Stop; ask for the missing input.</td>\n</tr>\n<tr>\n<td>Conflicting requirements</td>\n<td>technical</td>\n<td>No file written</td>\n<td>Stop; name the conflict and present the trade-off.</td>\n</tr>\n<tr>\n<td>Scope creep</td>\n<td>technical</td>\n<td>Bound to the original ask</td>\n<td>Note out-of-scope items in Open questions.</td>\n</tr>\n<tr>\n<td>Technical uncertainty</td>\n<td>technical</td>\n<td>Record the assumption</td>\n<td>Flag the assumption in Open questions with the test or investigation needed.</td>\n</tr>\n<tr>\n<td>Unclear behavior</td>\n<td>product</td>\n<td>No file written</td>\n<td>Write <code>**Open question:** ...</code> inline in Behavior; do not guess.</td>\n</tr>\n<tr>\n<td>File write fails</td>\n<td>all</td>\n<td>No artifact on disk</td>\n<td>Report the error with the path and root cause.</td>\n</tr>\n<tr>\n<td>Source read fails</td>\n<td>requirements</td>\n<td>Continue without that source</td>\n<td>Note the absence; do not halt.</td>\n</tr>\n<tr>\n<td>Stale data (&gt;7 days)</td>\n<td>requirements</td>\n<td>Note staleness</td>\n<td>Proceed; do not block.</td>\n</tr>\n<tr>\n<td>Uncited claim</td>\n<td>requirements</td>\n<td>Tag <code>[UNCITED]</code></td>\n<td>Resolve or move to Open Questions.</td>\n</tr>\n<tr>\n<td>Missing required section</td>\n<td>all</td>\n<td>Incomplete artifact</td>\n<td>Do not claim Done; report which section is absent.</td>\n</tr>\n<tr>\n<td>PR creation fails</td>\n<td>requirements</td>\n<td>PRD file exists</td>\n<td>Report the error; do not delete the PRD file.</td>\n</tr>\n<tr>\n<td>Partial stop</td>\n<td>all</td>\n<td>No file written</td>\n<td>Do not save a partial artifact.</td>\n</tr>\n</tbody>\n</table>\n<p>To reverse the side effect, delete the written artifact. In requirements mode, a partial result that produced a file but not a PR leaves the file in place.</p>\n<h2>Output</h2>\n<ul>\n<li>Mode <code>product</code>: <code>specs/&lt;id&gt;/PRODUCT.md</code> with sections in order: Summary, Behavior (numbered invariants), optional Problem, optional Goals/Non-goals, optional Open questions; no Validation, Success criteria, or Testing sections.</li>\n<li>Mode <code>technical</code>: <code>TECH.md</code> with sections in order: Objective, Background, Design, Implementation plan, Risks and mitigations, Open questions; no placeholders or TODOs.</li>\n<li>Mode <code>requirements</code>: <code>reports/prds/prd_&lt;feature_slug&gt;_YYYY-MM-DD.md</code> with sections in order: TL;DR, Problem Statement, Goals &amp; Success Metrics, Target Users, Scope, Proposed Solution, Technical Considerations, Competitive Context, Open Questions, References; plus an open PR against the default branch.</li>\n</ul>\n","files":[{"path":"agents/openai.yaml","sizeBytes":151,"isText":true},{"path":"SKILL.md","sizeBytes":7895,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-08T21:39:28.522177Z","sha256":"5C890D7B26FDBFF1D30E8B01D8BE95AD0D320D131C76FA4DF06B02AA4EF9C821","sizeBytes":3232},"review":null,"source":{"repositoryUrl":"https://github.com/OutlineDriven/odin-claude-plugin","path":"plugins/odin-product/skills/write-product-spec","license":"Apache-2.0","commit":"8ce0e87a3e88043cdeb4be21eec5565bbdc638ea","subtreeSha":"93923AFB80A691451CA4D3A60CD59364B9402DCB0698AA3A2D96157B8B2530BC","lastSyncedAt":"2026-09-26T23:11:44.497011Z"},"reviewedAt":"2026-09-08T21:41:02.950765Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/OutlineDriven/odin-claude-plugin/tree/main/plugins/odin-product/skills/write-product-spec"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install outlinedriven-odin-claude-plugin@llmmart"},{"target":"git","command":"git clone https://github.com/OutlineDriven/odin-claude-plugin.git"}]}