OPEN SOURCE

Productizer — requirements that stay true

Claude Code is already very good at the work. What it does not do on its own is remember what you agreed. After enough sessions nobody can answer “what did we decide this system does?” — the code is fine, the decisions are scattered across chat logs. This is a plugin, not a platform: two commands to install, one markdown file per product, and an agent that sits beside you keeping that file true as the work goes.

Get it on GitHub ↗ Jump to install

The nine-stage loop around one living spec, and the dashboard it publishes: you write the intent at stage 1, the agent runs the rest, and deploy and publish are gated

Manageable on purpose. One file, in your repo.

Stage 1 is yours: describe the problem, as a GitHub issue or just in chat. Stages 2 to 6 — design, build, test, deploy, maintain — run as the agent, against the whole spec rather than a blank page. You stay in three places that actually need judgement: ruling contradictions, approving the pull request, and triaging what production sends back.

That is the difference between a line and a loop. Work moves at agent speed; the decisions stay yours.

Built on Anthropic’s playbook. The original six-stage structure comes from it; the living spec, the contradiction stop, the declared checks and the two gated stages are where this goes its own way.

Reference: Louis Claxton, The AI-Native SDLC Playbook, claude.com — with contributions from Jim Blackhurst, Will Steuk and Jamal Arif.

MIT licensed. github.com/gitayg/productizerissues and suggestions welcome, and they get classified the same way everything else does.

Writing the spec is the collaboration

You do not write a specification and hand it over. You describe what you want, and the agent works it into the spec that already exists — naming what is genuinely new, tightening what was vague, and telling you when something is already covered. The spec gets better every time you use it, because keeping it true is the work rather than a chore beside it.

Four things can come back, and only two of them make work:

  1. Extend

    Nothing covers it yet. New requirements get the next ids and are written in EARS, so each one names a trigger and an observable response a test can assert.

  2. Refine

    Covered, but imprecise. Same requirement id, tightened text, recorded with the issue that drove it.

  3. Duplicate

    Already specified. You get the requirement id and it stops. That is not a rejection — if the behaviour exists but does not work, that is a bug, which is a more useful thing to know.

  4. Contradict

    What you have asked for conflicts with something already agreed. You get both, side by side, and you decide. Nothing is merged until you do — not because the tool is strict, but because that decision is genuinely yours and the agent has no way to make it well. This is the part the other tools leave out: Spec Kit recommends resolving, BMAD applies the change and mentions the conflict.

Requirement ids are permanent. Never reused, never renumbered — a test asserting R14 still means R14 two years on. Reuse an id and every citation silently redirects to a different requirement while the suite stays green. Replaced requirements are marked superseded and keep their original text. BMAD gets this right too, in almost the same words; most tools renumber per feature, which quietly breaks every citation you ever wrote.

Install it in two commands

# add the marketplace, then install the plugin
claude plugin marketplace add gitayg/productizer
claude plugin install productizer

Then just describe what you want. The skill works out which stage you are in from the issue and the branch, asks once for the repo binding, and writes it to .claude/sdlc.json so it never asks again.

What comes with it

Ask to see it, and it publishes a dashboard

the part that is hard to describe and obvious once you see it

This is the part that is hard to describe and obvious the moment you see it. The lifecycle lives in markdown files, because files are the only thing that reviews, diffs and survives. But nobody reads a lifecycle as markdown. So when you ask to see it, the agent generates a read-only page from those same files and hands you the link.

Not a service, not a login, and nothing to keep running. It is a single HTML file generated from the current state of your repo — a view, never an input. Nothing is ever read back out of it into the spec, because the moment a view becomes editable the committed chain stops being the audit trail.

productizer · pipeline
Two things need you
Contradictions1nothing merges until ruled
Checks, last runREFUSED1 missing tool, 1 hollow
Requirements with no test4of 58 active
Living spec583 superseded, 1 withdrawn
Backlog63 todo · 1 in progress
Releases104 tagged
Backlog
B7Export settlements as CSV
Intake
B6Queue unverifiable callbackscontradiction — waiting on you
Build
R44Settlement export writerplan.md committed
Check
R42CSV row per settlementsast hollow — blocked
Review
R43Duplicate callback guardPR open, 2 findings
Gated
v3.5.1Release announcementdrafted — you publish
0Bindproduct, source of truth, spec home
0aScaffoldempty spec, allocator at R1
0cImportdraft a spec from a repo with history
0dModelsper-stage model and effort
IdWhat is wantedNotesStatus
B7Export settlements as CSVOps asks monthlytodo
B6Queue unverifiable callbacksPROJ-412 · contradicts R7in progress
B5Tighten p95 to 100 msPROJ-418 · R12 refinementtodo
B4Per-tenant rate limitswaiting on meteringlong term
2Designintake, then merge the delta1 contradiction
4CCheckdeclared checks, coverage assertedpassing
5CAnnouncedrafted, held at the publish gateyou
SKILL.mdthe lifecycle, every non-negotiable
.claude/sdlc/spec.mdR1 … R58 · 3 superseded
backlog.mdthe queue in front of intake
v3.5.0an overview: counted state, and what is movingtagged
v3.4.3one column template for the backlog tabletagged
v3.3.0fixes from the first end-to-end runtagged

A static sample — click the tabs. The published view carries live counts from your own repo, and its backlog can be dragged into priority order.

Get it on GitHub ↗
glick.run — AGPL-3.0