Handoff Contract
A Product Handoff is the framework-independent contract between Product Definition and an SDD framework. It selects the product subgraph relevant to one delivery increment and records enough provenance to detect staleness. Handoffs and Product Context documents are generated and non-canonical.
A handoff MUST contain product context and traceability. It MUST NOT contain technical design, implementation tasks, class names, database decisions, framework choices, deployment instructions or any other decision owned by the SDD and implementation layers.
Handoff document
Section titled “Handoff document”Schema product-definition-as-code/handoff/v1alpha1:
schema: product-definition-as-code/handoff/v1alpha1id: HOF-GITHUB-123generated-at: 2026-01-01T10:00:00Zwork-item: provider: github repository: owner/repository id: '123' title: Generate framework-independent Product Handoffssource: repository: owner/repository revision: <git-commit-sha> product-change: CHG-HANDOFF-001 delivery-slice: SLI-HANDOFF-001implements: - FR-HANDOFF-001affects: - ACT-PRODUCT-ENGINEER - UC-HANDOFF-001artifacts: - id: FR-HANDOFF-001 type: functional-requirement path: docs/product/changes/active/chg-handoff-001/proposed/requirements/functional/fr-handoff-001.md digest: sha256:<hex>context: path: product-context.md digest: sha256:<hex>artifacts[].pathis the repository-relative path (POSIX separators) of the artifact at generation time; identity remains the ID, not the path.- Digests are
sha256:<hex>over the artifact’s UTF-8 content with line endings normalized to LF. source.revisionrecords the Git commit the handoff was generated from.
Generation rules
Section titled “Generation rules”The generator:
- MUST start from an
approveddelivery slice of a validated Product Change overlay. - MUST resolve all artifacts named by the slice’s
implementsandaffects. - MUST include the upstream product context selected by the closure rule below.
- MUST NOT include unrelated graph regions or reproduce the entire product repository.
- MUST record artifact paths, content digests and the source Git revision.
- MUST generate a readable
product-context.mdmarked as generated and non-canonical. - MUST derive the handoff
idfrom the work-item reference, asHOF-<provider>-<work-item id>.
Because the identifier is derived from the work item alone, one work item that delivers more than
one slice produces several handoffs sharing an id. The intended shape is one work item per slice;
the gap is recorded as OD-009. Consumers MUST therefore resolve a handoff by its recorded
source.product-change and source.delivery-slice, never by id alone.
Closure rule
Section titled “Closure rule”The included subgraph is computed deterministically:
- Start set: the slice’s
implementstargets andaffectstargets. - Expand Functional Requirements via
derived-from; Quality Requirements and Constraints viaapplies-to. - Expand each included Use Case via
primary-actor,supporting-actors,bounded-context,governed-byanduses-terms. - Expand each included Domain Term via
defined-in. - Add (one incoming hop) every Journey whose
stepsinclude an included Use Case, and that journey’sprimary-actor. - Add every Constraint whose
applies-tonames an included artifact, and every product-wide Constraint. - Do not expand further.
Artifacts are resolved overlay-first: a proposed future-state artifact of the handoff’s Product Change takes precedence over its baseline counterpart.
Product Context
Section titled “Product Context”product-context.md presents the selected subgraph for human and AI consumption: the work item,
the implemented requirements with their acceptance content, the affected behaviour, governing
rules, domain language and open questions of the Product Change. It MUST begin with a generated
marker naming the handoff ID and MUST NOT introduce content absent from the canonical sources.
Status and staleness
Section titled “Status and staleness”A conforming implementation MUST report exactly one of the following statuses for a handoff:
| Status | Meaning |
|---|---|
current | Every referenced artifact’s recomputed digest matches the handoff. |
stale | At least one referenced artifact’s content changed; the report names each stale artifact. |
invalid | The handoff document is malformed, references unknown artifacts, or its digests cannot be interpreted. |
source-revision-unavailable | A referenced artifact is absent from the working tree and source.revision cannot be resolved (for example in a shallow clone). |
Digest recomputation resolves artifacts overlay-first from the working tree; if a path is gone
(for example after promotion), the content at source.revision is used. Staleness is judged
exclusively by the digests of referenced artifacts: unrelated commits, unrelated artifact edits and
generated-file churn MUST NOT make a handoff stale.
SDD boundary
Section titled “SDD boundary”SDD frameworks consume handoffs; they retain native ownership of their own artifacts and workflow. SDD MAY report questions and contradictions back to Product Definition. SDD MUST NOT silently rewrite canonical product knowledge, and archiving an SDD change MUST NOT promote a Product Change.
