Skip to main content
Primitives are the atoms of a product tree. Every value that an app, compiler, validator, search index, or coding agent must read goes in YAML. Reader-friendly views — PM summaries, developer briefs, designer views, customer-facing docs — are compiled from these records, not authored alongside them. This guide shows you how to write each type well.

The core principle

Put product truth in structured fields, not in prose summaries. A summary is useful for humans skimming the tree, but tools cannot reliably parse prose. If a value shapes scope, acceptance criteria, a dependency, or a measurement rule, it belongs in fields or refs.
A premise explains why the product (or a feature within it) should exist. Write premises before intents. Every intent should ultimately serve at least one premise.Key fields for a premise:
  • evidence_confidence: low, medium, or high — how certain you are the premise is true
  • evidence_provenance: where the evidence came from (interview, analytics, research, doc)
  • product_implication: what the product must or must not do if this premise holds
schema: readyroom/primitive/v1
kind: primitive
id: P-001
type: premise
title: Users abandon multi-step onboarding before completing step 3
milestone: m1
status: active
summary: >
  Activation data shows 68% of new users exit the onboarding flow
  at or before step 3, resulting in incomplete profile setup and
  lower feature discovery rates.
fields:
  evidence_confidence: high
  evidence_provenance: "Product analytics export, 2024-03-01; confirmed by product lead"
  product_implication: >
    The onboarding flow must be completable in fewer than three steps
    OR must make the value of continuing obvious at each step.
    Features that require a complete profile cannot be gated behind
    a broken funnel.
refs: []
artifacts:
  - SA-001   # sanitized funnel export used as fixture
owner_notes:
  - "Step 3 drop-off worsened after the March password policy change."
Do not raise evidence_confidence to high until a product lead or stakeholder explicitly confirms the premise. A premise inferred from a design doc alone starts at low or medium.

Refs: storing relationships correctly

Relationships between primitives go in refs, not in summary prose. There are five approved ref roles. The four canonical tree edges for primitive relationships are:
EdgeMeaning
intent --serves--> premiseThe intent addresses a root product premise
intent --contains_premise--> premiseThe intent owns a subordinate premise
intent --requires--> serviceThe intent depends on a service
intent --governed_by--> standardThe intent must obey a standard
The fifth role, questions, is used on refs where a question card or flag explicitly references the primitives it is questioning or blocking. Store only the outgoing edge from the source record. Do not store inverse edges. Views derive inverse labels automatically. If you write premise --serves--> intent, you are duplicating the edge and making the tree harder to validate. Explicit refs include from, role, and to:
refs:
  - from: I-001
    role: serves
    to: P-001
Compact refs infer from as the current primitive id. Use compact refs only for outgoing edges:
refs:
  - role: requires
    id: SV-001

What NOT to put in primitives

The following do not belong in .ready.yml primitive records:
  • Coding lifecycle state — use seed or delta flags for that
  • Local chat logs or raw provider transcripts — these are local cache, not product truth
  • Secrets or credentials — store the credential location (e.g., vault path), never the value
  • Raw logs or unreviewed scratch content — promote to a primitive only after review
  • Large binaries or source diffs — use artifact refs instead

Artifacts: when to use refs instead of inline content

Store bulky samples, mockups, screenshots, snippets, and generated outputs as artifacts. Reference them by id or path in the primitive’s artifacts field rather than inlining their content.
# In the primitive
artifacts:
  - SA-001   # compact ref by artifact id

# In ready/m1/artifacts/manifest.yaml
id: SA-001
artifact_type: sample_data
path: ready/m1/artifacts/samples/SA-001.json
privacy: sanitized_fixture
used_by:
  - I-001
roles:
  - input_sample
Small sanitized samples are allowed inline when they are intentionally product fixtures and their presence is meaningful for review. When in doubt, use an artifact ref.