# OpenAPM v0.1 -- machine-readable requirements manifest.
#
# Generated initially by scripts/bootstrap_requirements.py from
# Appendix C of openapm-v0.1.md, then maintained by hand on every
# spec edit. The orphan_check.py CI gate enforces that this file
# stays a byte-for-byte projection of the HTML anchors in the spec
# body (the canonical source); Appendix C is a reader-aid derived
# from the same anchors.
#
# Do NOT edit this file alone. The three-step ritual for adding a
# normative requirement is:
#   1. Add the <a id="req-XXX"></a> anchor + prose to openapm-v0.1.md
#      and the corresponding Appendix C row.
#   2. Add the entry below.
#   3. Add or extend a test under tests/spec_conformance/ with
#      @pytest.mark.req("req-XXX") (and optionally cite a fixture
#      path).
# CI fails at any incomplete step.
#
# Ships in v0.1.1 informatively (see spec sec.12.6 reservation;
# v0.2 will promote the surrounding requirements to normative MUST).

requirements_format_version: "1"
spec_version: "v0.1"
requirements:
  - id: req-mf-001
    keyword: MUST
    section: "4.1"
    conformance_class: producer
  - id: req-mf-002
    keyword: MUST
    section: "4.1"
    conformance_class: producer
  - id: req-mf-003
    keyword: MUST
    section: "4.1"
    conformance_class: producer
  - id: req-mf-004
    keyword: SHOULD
    section: "4.1"
    conformance_class: producer
  - id: req-mf-005
    keyword: MUST
    section: "4.2.1"
    conformance_class: producer
  - id: req-mf-006
    keyword: MUST
    section: "4.1"
    conformance_class: consumer
  - id: req-mf-007
    keyword: MUST
    section: "4.3.1"
    conformance_class: consumer
  - id: req-mf-008
    keyword: MUST
    section: "4.3.3"
    conformance_class: consumer
  - id: req-mf-009
    keyword: MUST
    section: "4.3.4"
    conformance_class: consumer
  - id: req-mf-010
    keyword: MUST
    section: "4.3.2"
    conformance_class: consumer
  - id: req-mf-011
    keyword: MUST
    section: "4.3.2"
    conformance_class: consumer
  - id: req-mf-012
    keyword: MUST
    section: "4.3.6"
    conformance_class: consumer
  - id: req-mf-013
    keyword: MUST
    section: "4.5"
    conformance_class: consumer
  - id: req-mf-014
    keyword: MUST
    section: "4.2.3"
    conformance_class: producer
  - id: req-mf-015
    keyword: MUST
    section: "4.2.3"
    conformance_class: producer
  - id: req-mf-016
    keyword: MUST
    section: "4.3.5"
    conformance_class: consumer
  - id: req-mf-017
    keyword: MUST
    section: "4.7"
    conformance_class: producer
  - id: req-mf-018
    keyword: MUST
    section: "4.6.1"
    conformance_class: consumer
  - id: req-mf-019
    keyword: MUST
    section: "4.2.4"
    conformance_class: consumer
  - id: req-mf-020
    keyword: MUST
    section: "4.1"
    conformance_class: consumer
  - id: req-mf-021
    keyword: MUST
    section: "4.8"
    conformance_class: producer
  - id: req-mf-022
    keyword: MUST
    section: "4.3.2"
    conformance_class: consumer
  - id: req-mf-023
    keyword: MUST
    section: "4.5"
    conformance_class: consumer
  - id: req-mf-024
    keyword: MUST
    section: "4.3.2"
    conformance_class: consumer
  - id: req-ext-001
    keyword: MUST
    section: "4.1"
    conformance_class: consumer
  - id: req-ext-002
    keyword: MUST
    section: "4.1"
    conformance_class: producer
  - id: req-lk-001
    keyword: MUST
    section: "5.1"
    conformance_class: consumer
  - id: req-lk-002
    keyword: MUST
    section: "5.4"
    conformance_class: consumer
  - id: req-lk-003
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
    notes: "full-SHA manifest pins must match resolved_commit during conformance audit"
  - id: req-lk-004
    keyword: MUST
    section: "5.4"
    conformance_class: consumer
  - id: req-lk-005
    keyword: MUST
    section: "5.5"
    conformance_class: consumer
  - id: req-lk-006
    keyword: MUST
    section: "5.5"
    conformance_class: consumer
    notes: "frozen validation covers direct package pins and MCP state before durable mutation"
  - id: req-lk-007
    keyword: SHOULD
    section: "5.5"
    conformance_class: consumer
  - id: req-lk-008
    keyword: MUST
    section: "5.6"
    conformance_class: consumer
  - id: req-lk-009
    keyword: MUST
    section: "5.6"
    conformance_class: consumer
  - id: req-lk-010
    keyword: MUST
    section: "5.6"
    conformance_class: consumer
  - id: req-lk-011
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
  - id: req-lk-012
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
  - id: req-lk-013
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
  - id: req-lk-014
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
  - id: req-lk-015
    keyword: MUST
    section: "5.6.4"
    conformance_class: consumer
  - id: req-lk-016
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
  - id: req-lk-017
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
  - id: req-lk-018
    keyword: SHOULD
    section: "5.5"
    conformance_class: consumer
  - id: req-lk-019
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
    notes: "name and dependency-apm.yml-derived version are self-asserted inventory metadata, never trust anchors"
  - id: req-lk-020
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
    notes: "target and identity reconciliation preserves legitimate, indeterminate, and freshly redeployed paths while dropping inactive-target ghosts"
  - id: req-lk-021
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
    notes: "extends req-lk-020's preserve/remove decision to merge-based hook configuration and its ownership record"
  - id: req-lk-022
    keyword: MUST
    section: "5.2"
    conformance_class: consumer
    notes: "source-cased materialization_repo_url remains non-identity metadata and drives rollback-safe, collision-closed materialization/link spelling"
  - id: req-pl-001
    keyword: MUST
    section: "6.1"
    conformance_class: governance
  - id: req-pl-002
    keyword: MUST
    section: "6.2"
    conformance_class: governance
  - id: req-pl-003
    keyword: MUST
    section: "6.4"
    conformance_class: governance
  - id: req-pl-004
    keyword: MUST
    section: "6.4"
    conformance_class: governance
  - id: req-pl-005
    keyword: MUST
    section: "6.5"
    conformance_class: governance
  - id: req-pl-006
    keyword: MUST
    section: "6.4"
    conformance_class: governance
  - id: req-pl-007
    keyword: MUST
    section: "6.3.1"
    conformance_class: governance
  - id: req-pl-008
    keyword: MUST
    section: "6.3.1"
    conformance_class: governance
  - id: req-pl-009
    keyword: MUST
    section: "6.6"
    conformance_class: governance
  - id: req-pl-010
    keyword: MUST
    section: "6.2"
    conformance_class: governance
  - id: req-pl-011
    keyword: MUST
    section: "6.1.1"
    conformance_class: governance
  - id: req-pl-012
    keyword: MUST
    section: "6.1.1"
    conformance_class: governance
  - id: req-pl-013
    keyword: MUST
    section: "6.8"
    conformance_class: governance
  - id: req-pl-014
    keyword: MUST
    section: "6.8"
    conformance_class: governance
  - id: req-pl-015
    keyword: MUST
    section: "6.3.5"
    conformance_class: governance
  - id: req-pl-016
    keyword: MUST
    section: "6.8"
    conformance_class: governance
    notes: "a canonical deployment-ledger owner absent from apm.lock.yaml is a hard integrity failure independent of security.audit.fail_on_drift; audit exits non-zero in both default and CI modes and refuses to mutate deployed bytes while ownership is invalid"
  - id: req-rs-001
    keyword: MUST
    section: "7.2"
    conformance_class: consumer
  - id: req-rs-002
    keyword: MUST
    section: "7.3"
    conformance_class: consumer
  - id: req-rs-003
    keyword: MUST
    section: "7.3"
    conformance_class: consumer
  - id: req-rs-004
    keyword: MUST
    section: "7.5"
    conformance_class: consumer
  - id: req-rs-005
    keyword: MUST
    section: "7.6"
    conformance_class: consumer
  - id: req-rs-006
    keyword: MUST
    section: "7.2"
    conformance_class: consumer
  - id: req-rs-007
    keyword: MUST
    section: "7.3"
    conformance_class: consumer
  - id: req-rs-008
    keyword: MUST
    section: "7.1"
    conformance_class: consumer
  - id: req-rs-009
    keyword: MUST
    section: "7.5.1"
    conformance_class: consumer
  - id: req-rs-010
    keyword: MUST
    section: "7.2"
    conformance_class: consumer
  - id: req-rs-011
    keyword: MUST
    section: "7.7"
    conformance_class: consumer
  - id: req-rs-012
    keyword: MUST
    section: "7.7"
    conformance_class: consumer
  - id: req-rs-013
    keyword: MUST
    section: "7.2"
    conformance_class: consumer
  - id: req-rs-014
    keyword: MUST
    section: "7.3.1"
    conformance_class: consumer
  - id: req-rs-015
    keyword: MUST
    section: "7.5"
    conformance_class: consumer
  - id: req-rs-016
    keyword: MUST
    section: "7.2"
    conformance_class: consumer
    notes: "minimum repository identity binds every cache layer; distinct identities must not share source material"
  - id: req-pr-001
    keyword: MUST
    section: "8.2"
    conformance_class: consumer
  - id: req-pr-002
    keyword: MUST
    section: "8.3"
    conformance_class: consumer
  - id: req-pr-003
    keyword: MUST
    section: "8.3"
    conformance_class: consumer
  - id: req-pr-004
    keyword: MUST
    section: "7.8"
    conformance_class: producer
  - id: req-pr-005
    keyword: SHOULD
    section: "7.8"
    conformance_class: producer
  - id: req-tg-001
    keyword: MUST
    section: "8.4"
    conformance_class: consumer
  - id: req-tg-002
    keyword: MUST
    section: "8.5"
    conformance_class: consumer
  - id: req-tg-003
    keyword: MUST
    section: "8.5"
    conformance_class: consumer
  - id: req-tg-004
    keyword: MUST
    section: "4.2.1"
    conformance_class: consumer
  - id: req-tg-005
    keyword: MUST
    section: "8.5"
    conformance_class: consumer
  - id: req-tg-006
    keyword: MUST
    section: "8.5"
    conformance_class: consumer
  - id: req-tg-007
    keyword: MUST
    section: "8.5"
    conformance_class: consumer
  - id: req-tg-008
    keyword: MUST
    section: "8.5.3"
    conformance_class: consumer
  - id: req-tg-009
    keyword: MUST
    section: "8.5.1"
    conformance_class: consumer
  - id: req-tg-010
    keyword: MUST
    section: "8.5.4"
    conformance_class: consumer
    notes: "project-scoped native hooks use a portable project-directory environment anchor and reject shell-expansion path syntax"
  - id: req-sc-001
    keyword: MUST
    section: "10.4"
    conformance_class: consumer
  - id: req-sc-002
    keyword: MUST
    section: "10.9"
    conformance_class: consumer
  - id: req-sc-003
    keyword: MUST
    section: "10.3"
    conformance_class: consumer
  - id: req-sc-004
    keyword: MUST
    section: "10.5"
    conformance_class: consumer
  - id: req-sc-005
    keyword: MUST
    section: "10.3"
    conformance_class: consumer
  - id: req-sc-006
    keyword: MUST
    section: "4.2.3"
    conformance_class: consumer
  - id: req-sc-007
    keyword: MUST
    section: "10.3"
    conformance_class: consumer
  - id: req-sc-008
    keyword: SHOULD
    section: "10.3"
    conformance_class: consumer
  - id: req-sc-009
    keyword: MUST
    section: "10.13"
    conformance_class: consumer
  - id: req-sc-010
    keyword: MUST
    section: "10.13"
    conformance_class: consumer
  - id: req-sc-011
    keyword: MUST
    section: "10.14"
    conformance_class: consumer
  - id: req-sc-012
    keyword: MUST
    section: "10.14"
    conformance_class: consumer
  - id: req-sc-013
    keyword: MUST
    section: "10.3"
    conformance_class: consumer
    notes: "configured authority overlap selects one documented host class before credential resolution; only that class's credentials reach requests and child processes; explicit non-default ports remain scoped"
  - id: req-rg-001
    keyword: MUST
    section: "11.3.3"
    conformance_class: registry
  - id: req-cf-001
    keyword: MUST
    section: "12.5"
    conformance_class: consumer
  - id: req-cf-002
    keyword: MUST
    section: "12.3"
    conformance_class: consumer
