# SSP read-side audit disciplines — per-control shape rules (detail)

Detail companion to `skills/ssp/SKILL.md` § Read-side audit disciplines. The value semantics (by-who taxonomy, inheritance rules, status vocabulary) are corpus-owned: `reference-docs/halo-platform/ssp-narrative-doctrine.md`.

## `absent_fields` — null + flag, never default

When a field is absent in Halo (no IR linked, no narrative stored, no Origination set), emit the field as `null` AND list it in a per-control `absent_fields` array. Never invent a default. "Not Assessed" is a deliberate Halo state — not a fallback bucket; reserve it for `implementation_status` when Halo explicitly records it. Missing data = `null` + `absent_fields`; deliberately-not-assessed = `"Not Assessed"`. Surface every `absent_fields` entry in `gaps.md`.

## Verbatim implementation-language preservation

Implementation Statement narrative (Halo IS asset, field 229) emits verbatim into the per-control record. Do not paraphrase, summarize, condense, or rewrite. The writer/reviewer polished it before it landed in Halo; the downstream renders narrative or grades against the dual-test, and both depend on source integrity. Apply [[ssp-brand-voice]] only to render-time prose the agent composes (section headers, gap placeholders, transitions) — never to Halo-stored narrative.

## `set_parameters` — read ODP values from SP assets, never from IS prose

Per-control ODP values come from the linked Set Parameter assets (dtype 193), NOT from Implementation Statement narrative. For each control, walk the SP children — rel 12 on the IR (Scope=`Control`) and rel 11 on the CI (Scope=`System`) — and emit a `set_parameters` array, one entry per SP carrying `{param_id_handle: Title (213), index: 237, label: 238, scope: 239, value: 236}`. Do NOT parse `[Assignment: organization-defined ...]` values out of the IS narrative text; the IS narrative describes HOW the control is implemented, the SP assets carry WHAT values were chosen. If a control's catalog requirement has an ODP slot but no linked SP asset, emit the value as `null` and surface it in `absent_fields` + `gaps.md`. Only FedRAMP Rev5 carries ODP prose in the catalog; CMMC + 20x have none, so absent SPs there are expected, not gaps.
