product.yaml
Outcome + boundary
Reduces capability drift. It owns the release outcome, boundary, actors, capabilities, inline acceptance, exclusions, measures, and optional product-wide DCL.
Agentic coding / product intent
“Add file upload” sounds specific until the agent has to choose what validation, progress, cancellation, partial failure, retry, and recognizable completion mean for the person using it.
THE FAILURE Tests show behavior under tested conditions; they do not establish the product experience.
$ task: Add file upload
It may leave the user-visible contract undefined.
Tests can pass while the product experience diverges.
The agent needs current product intent before it changes code.
01 The fix
A PIP is the smallest coherent, current description of the intended product. It gives each coding session one canonical target and reduces product guesswork without pretending to specify every implementation detail. It is a target, not a plan; engineering still chooses the internals within those stated behaviors and constraints.
Focused context: the agent reads the relevant intent, traces the existing implementation owner, and changes the smallest aligned slice before it gathers focused evidence and reviews evidence against the PIP.
Authority versus evidence. Evidence tells you what exists. The canonical PIP tells you what the product is meant to be; evidence does not rewrite canonical intent.
02 The package
Format 7.0 starts with three default files. Together they answer what result matters, which physical system owns it, and what the actor sees. Add another artifact only when it resolves a distinct, consequential product question; the default is an orientation, not a claim that every product needs only three files. Before agents create, update, or implement against a PIP, the project designates its canonical PIP location.
product.yaml
Reduces capability drift. It owns the release outcome, boundary, actors, capabilities, inline acceptance, exclusions, measures, and optional product-wide DCL.
architecture/stack-context.md
Makes physical ownership explicit. It names the physical systems, responsibility, owned state, deployment, external boundaries, and connections.
experience/user-flows.md
Exposes invisible UX decisions. It preserves actor actions, surfaces, choices, visible failure, recovery, and recognizable outcomes without internal call order.
ADD WHEN NEEDED
acceptance.yamlseveral scenarios or recovery pathsbehavior/rules, decisions, or lifecycle statesdata/product-significant entities and constraintssequences/ordered calls, retries, and fallbackscontracts/shared external boundariesgovernance.yamlcurrent editing authority only, when project guidance is otherwise unclearquality/measurable reliability, privacy, or performance boundsRETRIEVAL
One fact, one owner. Stable direct links and concise current rationale preserve why a choice exists, so an agent can retrieve a focused slice without duplicating or losing context.
DCL / DEVELOPMENT COMPLEXITY LEVEL
DCL right-sizes the target using users, wait path, recovery, credible load, risk, and operations. It is not a score, gate, acceptance criterion, or mechanism prescription; low DCL never weakens security, privacy, authorization, money safety, or data integrity.
03 In a project
Start with a deliberately fictional task that is easy to underestimate. The authorized product decision, captured in the PIP, gives an agent a target it can inspect, implement, and compare with observed behavior.
“Add file upload to the task.”
An authorized product decision chooses upload-before-submit for this release. The canonical PIP records that current intent for the agent.
Submit stays unavailable until upload completes. Cancel and recoverable failure preserve task text; invalid files show “File type or size not supported.”
schema_version: 7.0.0
name: Desklight
release: 1.0.0
outcome: >-
A teammate can attach a file to a task draft, recognize
upload progress, and submit only after a usable attachment
is complete.
boundary: >-
PDF, PNG, or JPEG up to 25 MB. The draft stays editable
while the upload runs. No offline queue or background sync
in this release.
capabilities:
- id: CAP-001
name: Attach a file before submitting a task
behavior: >-
Submit stays unavailable until upload completes; cancel
or recoverable failure preserves task text.
acceptance:
- A valid file shows progress while the task stays a draft.
- An invalid type or over-limit file shows "File type or size not supported".
- Cancel shows "Upload cancelled" and keeps task text.
- Failure shows "Upload failed" and Retry.
- Completion shows attachment name + size; Submit becomes available.Read product.yaml. Restate the upload-before-submit behavior, file boundary, visible recovery, and exclusions.
Read the concrete owner slices below. Trace the existing implementation owner for the path instead of guessing from a ticket.
Make the smallest aligned slice. If the PIP cannot answer a product behavior, route an authorized intent decision instead of inventing policy.
Gather focused evidence for valid, invalid, success, and failure/recovery states, then review it against the PIP. Keep observations outside the canonical package.
ARCH-001 · Desklight web app
owns: task detail surface + attachment request
owned state: task text + attachment status
runs: deployed web app with object storage
boundary: storage service owns file bytes
web app owns task-facing statusFLOW-001 · Task detail
SURFACE · Task detail
choose file → show progress while draft stays editable
invalid → show “File type or size not supported”
cancel → show “Upload cancelled” → keep task text
failure → show “Upload failed” → Retry / Remove
complete → show attachment name + size → Submit available04 Add the skill
Product Intent Package content says what the product should be. Product Intent Manager teaches an agent how to create, update, and consume that intent safely: read the canonical PIP, inspect owners, preserve boundaries, and keep evidence outside it.
INSTALL
Keep the workflow next to the project when every contributor and coding agent needs the same PIP operating procedure.
git clone https://github.com/swabbie-dev/product-intent-package.git
mkdir -p .agents/skills
cp -R product-intent-package/skills/product-intent-manager \
.agents/skills/product-intent-managerINVOKE
Use the skill by name, then point the agent at the canonical package before it plans or edits.
Use $product-intent-manager.
Read the canonical PIP at product/product-intent
before deciding what this change should do.ALIGN
Inspect existing owners, compare focused evidence with intent, and route unresolved product questions instead of quietly changing the target.
Read → trace → change → observe → review
Keep evidence outside the canonical PIP.
Raise one product question before policy.The skill helps an agent manage intent. It does not grant permission to change a canonical product definition, deploy code, or mutate external systems.
05 The guardrails
A PIP is useful when it stays coherent, current, and proportional. These are the habits that keep a package from turning into another document graveyard.
The package says what the product is meant to be now. Git and working notes carry the chronology.
Keep a decision in the artifact responsible for it, then link to that owner when another view needs context.
User flows show visible experience. Sequences show execution. Stack context shows physical ownership. Do not make one diagram do all three.
A different end state belongs in a coherent PIP fork until an authorized editor adopts it.
Code, tests, tickets, and runtime behavior tell you what exists. They do not silently decide what should ship.
Development Complexity Level communicates users, wait path, recovery, credible load, risk, and operations. It is not a score, gate, or mechanism prescription.