Skip to content
Agentmart
Submit a tool

product-srs

CTO-posture skill that authors a project's SRS — the technical source of truth, written off the settled PRD alongside the CDO's UXD.

Skill by Eyal Golan

IndexedMIT
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/eyalgo-product-srs

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

CTO-posture skill that authors a project's SRS — the technical source of truth, written off the settled PRD alongside the CDO's UXD. Requires CTO posture (halts if invoked outside a cto session or the cto subagent). Non-interactive by design — it derives the whole SRS best-effort from the CPO's PRD, and instead of interviewing live it surfaces everything it can't settle into a companion open-issues file (open issues, choices to confirm) for the owner to answer async. On re-run it consumes both files, retires the owner's answered companion whole to a permanent trail, folds their answers into the SRS, and when nothing is left unresolved it clears the companion — its absence means the SRS is done. The skill resolves where the files land from the project's Product path. Use when authoring, continuing, or revising a product's SRS. Do not use for per-change specs (development-specs), the PRD (product-prd), the project's Agari (project-agari), or downstream documents (SDD / Delivery Plan / FDR / ADR / NFDR).

Use cases: design, agent-building

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/product-srs

What's inside

Skill name
product-srs
Description
CTO-posture skill that authors a project's SRS — the technical source of truth, written off the settled PRD alongside the CDO's UXD. Requires CTO posture (halts if invoked outside a cto session or the cto subagent). Non-interactive by design — it derives the whole SRS best-effort from the CPO's PRD, and instead of interviewing live it surfaces everything it can't settle into a companion open-issues file (open issues, choices to confirm) for the owner to answer async. On re-run it consumes both files, retires the owner's answered companion whole to a permanent trail, folds their answers into the SRS, and when nothing is left unresolved it clears the companion — its absence means the SRS is done. The skill resolves where the files land from the project's Product path. Use when authoring, continuing, or revising a product's SRS. Do not use for per-change specs (development-specs), the PRD (product-prd), the project's Agari (project-agari), or downstream documents (SDD / Delivery Plan / FDR / ADR / NFDR).
License
MIT
Metadata
risk: safe · tags: srs, cto, product-definition, technical-source-of-truth, upstream-chain · author: Eyal Golan · created: 2026-07-10 · version: 4.7.5 · category: product-definition
Instructions
272 lines in SKILL.md · view on GitHub

Files (28)

  • README.md
  • SKILL.md
  • evals.json · evals/
  • README.md · evals/inputs/
  • agari.md · evals/inputs/mailmate/
  • PRD.md · evals/inputs/mailmate/docs/
  • product_request.md · evals/inputs/mailmate/docs/
  • cycle-1.md · evals/inputs/mailmate/docs/trail/prd/
  • project.md · evals/inputs/mailmate/
  • agari.md · evals/inputs/trimly-reentry/
  • PRD.md · evals/inputs/trimly-reentry/docs/
  • SRS.md · evals/inputs/trimly-reentry/docs/
  • SRS_open_issues.md · evals/inputs/trimly-reentry/docs/
  • product_request.md · evals/inputs/trimly-reentry/docs/
  • cycle-1.md · evals/inputs/trimly-reentry/docs/trail/prd/
  • project.md · evals/inputs/trimly-reentry/
  • agari.md · evals/inputs/trimly/
  • PRD.md · evals/inputs/trimly/docs/
  • product_request.md · evals/inputs/trimly/docs/
  • cycle-1.md · evals/inputs/trimly/docs/trail/prd/
  • project.md · evals/inputs/trimly/
  • claude.md · intelligence/
  • codex.md · intelligence/
  • gemini.md · intelligence/
  • ollama.md · intelligence/
  • launcher.md
  • rich.md · prompts/
  • stack.json

SKILL.md (first lines)

# product-srs

## Purpose

Author a project's **SRS** (Software Requirements Specification): the technical source of truth —
the system-level **what**, derived from the CPO's PRD. It is written **alongside the CDO's UXD**:
both come off the settled PRD, neither derives from the other, and the SDD needs both. The sequence
is `<CORE>/doctrine/setup/setting_up_a_project.md`, which owns it and is not restated here.

This file is the **orchestrator**: posture, the file loop, path resolution, staging, and the
commit. **How to
author** — the SRS-completeness lens, the PRD critique, the sorting of what to surface, the
provenance gate, the stability rule, and the tone — is the authoring prompt
**`prompts/rich.md`**, applied at Step 2; a rule referenced below by name lives
there. The SRS's **section shape** is the template
**`<CORE>/templates/product-templates/srs_template.md`**; the companion's shape is
**`srs_open_issues_template.md`** beside it. None of them is restated here.

**Non-interactive.** The run never blocks on the owner: it derives the whole SRS best-effort,
writes what it can't settle into a companion open-issues file the owner answers on their own time,
and a re-run folds those answers in. That is what lets it run headless (as the `cto` subagent) as
well as in an interactive `cto:` session.

---

## Posture

**CTO role required.** If invoked outside CTO posture (neither a `cto:` session nor the `cto`
subagent), stop and say: *"product-srs requires CTO posture. Switch? (Open a session with the
`cto:` prefix, or run the `cto` subagent.)"* Do not shed the role. Where the CTO ends and the
delivery-tier **Architect** begins is a posture fact the CTO loader stack already owns — take the
boundary from there, never from a restatement here.

---

## The files and the loop

product-srs produces the files below under the product's `docs/` — the skill resolves the
locations (next section); a caller names the **project**, never the paths.

| File | What it is | Lifecycle |
|---|---|---|
| `<Product path>/docs/SRS.md` | The SRS — best-effort complete on every run. | Permanent; one document, revised and versioned in place (the bump-on-material-change rule is the template's own header note), never forked. |
| `<Product path>/docs/SRS_open_issues.md` | The companion, holding what the run couldn't settle, in the buckets `srs_open_issues_template.md` defines — kept distinct, never blurred. Which bucket an item lands in, and how it is led, is the prompt's. | Transient — exists only while something is unresolved. **Its absence is the done signal.** |
| `<Product path>/docs/trail/srs/cycle-<N>.md` | Each answered companion, retired whole. | Permanent. |

**Cycle numbering:** `N` is one higher than the **highest** `cycle-<N>.md` already in `trail/srs/` —
list the directory and take the max, so a removed or renamed cycle can't make you collide with an
existing one. The first is `cycle-1.md`; create `trail/srs/` if it isn't there. Never overwrite an
existing cycle.

**The loop, repeated until clean:**

1. The run derives/updates the SRS and writes the companion with what it couldn't settle.
2. The **owner answers inline** — filling the companion's answer slots, whose names and shape are
   `srs_open_issues_template.md`'s, stated there and not here — and re-runs the skill.
3. The run **copies the answered companion whole to the next trail cycle**, folds the answers into
   the SRS, and rewrites the companion with only what is still unresolved — an answer the fold
   leaves unsettled still drops, its residue re-raised as a fresh unanswered item. This is the
   ordinary cycle — something survives the fold. A run where nothing would is step 4's, and step 4
   alone says what it may touch.
4. When the answers resolve everything, the run is the close: one run that folds, copies the
   answered companion to the trail, and **removes** the companion instead of rewriting it — through
   the builder, Step 3's `--rm`, never a hand-`rm`. **No open-issues file = the SRS is done.** The
   close has a precondition the ordinary cycle does not: the owner's answers must already be
   committed (Workflow Step 3 owns the rule and why). Re-entry is inline answers, so the first
   closing touch normally finds them uncommitted — and then it **changes nothing at all**: no fold,
   no trail copy, no rewrite, no commit; the companion survives intact, answers and all, for the
   owner to commit. It reports the state and asks for that commit; the re-run after it is the close,
   start to finish, in one run. That stop is a report with an ask, not a live interview.

Step 3 is why the trail exists. Folding rewrites the companion and the close removes it — so
without the trail the owner's answers are destroyed twice, and their reasoning for a decision
survives only in git history. The trail costs one `cp` on the same commit and makes every owner
answer permanently citable. It is the skill's job; the owner never manages it.

---

## Inputs and where the files land

- **The PRD** — your primary input; read it in full, status line included. Its location is
  `product-prd`'s to name — that skill wrote it, and its own file table owns where the PRD lands
  under the product's `docs/`; resolve the path from `<CORE>/../skills/cpo/.claude/skills/product-prd/SKILL.md`, never
  from a path remembered here. It must exist: if nothing is at the resolved path, halt and report —
  there is nothing to derive an SRS from. What the status line means for the derivation — including
  a line that is missing or carries a value the PRD template's vocabulary does not hold — is the
  prompt's rule; whatever it raises reaches the owner through the companion like any other item.
- **`system/projects/<name>/agari.md`** — the project's 上がり Agari, the declared terminus, beside
  the card below. Read it in full. What it means for the derivation is the prompt's rule; it is the
  scope boundary, not a source of requirements, and the prompt says how that binds. **Its absence
  does not halt the run** — neither does a file still carrying the placeholder `project-stamp`
  stamps. Agari and SRS gate each other in neither direction
  (`<CORE>/doctrine/setup/setting_up_a_project.md`), so a project may legitimately
  reach the SRS first; the state reaches the owner
  through the companion, exactly as an unreadable PRD status line does.
- **`system/projects/<name>/doctrine/`** — the project's own doctrine, if the folder holds anything.
  Read what is there. An empty or absent folder is silence, not a halt.
- **The product's `docs/` folder** — read it by **listing the directory**, not by recalling a set of
  filenames. Beyond the PRD and the SRS loop files named here, whatever else the folder holds is
  input the run is entitled to: the product request the PRD was derived from, the PRD's own trail of
  owner answers, anything a later round adds. What each carries, and which supersedes which, is the
  prompt's § *Inputs you work from*. Skip binary assets. Enumerating rather than naming is
  deliberate — a list of filenames kept here goes stale the day the product gains a document, and
  the run would never know what it had missed.
- **Context and constraints** — whatever the owner hands you, or the docs it points at. What counts
  as one is the prompt's § *Inputs you work from*; read the list there, it is not restated here.
- **`system/projects/<name>/project.md`** — the directed project's card. Its `Product path:` field
  resolves where every output lands; the field is the card template's
  (`<CORE>/templates/project_template.md`, the shape `project-stamp` stamps the card from), so
  read it from the card in hand. Every later `Product path:` in this file means that field.

**Path resolution.** A relative `Product path:` is inside the instance repo; an absolute one is
outside it, in whatever repo holds the product (which need not be its root — Step 1 resolves that
repo as `<repo>`). Every instance-relative path this file names (`system/…`,
`.claude/…`) resolves from the instance repo root — the directory the session opened in; no step
`cd`s away from it. If `Product path:` is a placeholder or awaits an owner value, halt and report:
both outputs resolve from it, so there is nowhere to write even an open issue recording the gap.
Never invent one.

From eyalgo/kensaiapp, MIT.

More from eyalgo/kensaiapp

Signals

Stars
0
Forks
0
Open issues
0
Last commit (this folder)
Oct 19, 2026 (10 days ago)
Last release
Oct 22, 2026 (7 days ago)

From GitHub (fetched Oct 24, 2026).

Details

Version
4.7.5
License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from Eyal Golan

Cite this page

product-srs skill. Agent Mart. https://agentmart.dev/skills/eyalgo-product-srs (last updated 2026-10-24)