The two kinds of context
shipflow reads context at two different lifetimes:
product.md is shipflow’s equivalent of a project constitution: domain glossary, architecture
boundaries, house-rule conventions, non-negotiables, and a baseline definition of done. Every phase
reads it; a single work item never has to restate any of it.
Creating it
This is a bootstrap the first time (starting from templates/product.md) and an update
afterward (only changing what’s asked or clearly stale). It’s grounded from evidence — your
READMEs, package metadata, the repos in your config, and the conventions already dominant in your
code — not invented. Anywhere it’s genuinely unsure, it leaves a placeholder and a
“confirm with the team” note instead of guessing.
What’s in it
Non-negotiables are treated as implicit acceptance criteria. feature-verify checks them
even though the work item never listed them — a change that violates one is a gap, exactly like
a missed AC, and blocks the flow from reaching PR. Keep this list short and genuinely true; a
wrong non-negotiable silently blocks unrelated PRs.
It’s a human-ratified document
product.md encodes team commitments, so the skill always presents the draft (or the diff, on an
update) and asks you to ratify before finalizing — it will not silently mark itself final. The
version footer follows semver by convention: patch for wording, minor for a new rule, major for a
removed or changed principle.
Where each phase uses it
feature-context — reads it to interpret the requirement in the product’s own terms.
feature-plan — honors its conventions and boundaries; won’t plan changes in areas it marks
out of bounds.
feature-verify — grades its non-negotiables the same way it grades acceptance criteria.
If product.md doesn’t exist yet, phases still run — they just say so rather than inventing
product rules. Set context.require_product_doc: true in shipflow.config.md if you’d rather
hard-stop every phase until it exists.
Observe mode — the constitution learns from what shipped
Bootstrap/update is human-driven: you ask, it drafts, you ratify. Observe mode runs the other
direction — ask “does product.md need updating?” and it reads every .shipflow/*/verify-report.md
that reached READY, looking for patterns the document doesn’t capture yet:
- Scope-creep that recurs across work items — often a convention worth formalizing, not
flagging every time.
- A non-negotiable that keeps getting violated or graded PARTIAL — either the wording needs
clarifying, or it’s stale and should be softened.
- A convention that shows up repeatedly in plans’ impact analysis but isn’t written down.
It proposes a diff, each line citing the work item(s) that motivated it, and requires the same
ratification as any other update — it never edits product.md on its own. If nothing recent
suggests a change, it says so rather than manufacturing one.