Context
Sibling to #4438, which defines the spec-side governance contract for surfacing the human_oversight: edited|directed + disclosure.required: false pattern as an audit observation. This issue tracks the reference training agent implementation.
PR #4437 added the non-normative warning to docs and schema; depends on #4438 landing the audit_observations[] wire shape before implementation can begin.
Scope
Implementation in server/src/training-agent/ against the spec-side contract from #4438.
-
get_creative_features handler — when called against a creative whose provenance carries human_oversight ∈ {edited, directed} AND disclosure.required == false, emit an audit_observations[] entry with:
-
No change to sync_creatives enforcement. The PROVENANCE_* structural-rejection family stays untouched. This pattern surfaces, it does not reject.
-
Storyboard / conformance scenario registered in static/compliance/source/protocols/media-buy/scenarios/ covering:
- Setup: seller publishes a creative-policy requiring
get_creative_features verification.
- Step 1: buyer submits creative with
human_oversight: edited + disclosure.required: false.
- Step 2: seller calls
get_creative_features against the seeded on-list verifier.
- Step 3: verifier response includes
audit_observations[] entry for the oversight/disclosure combination.
- Step 4: seller accepts the creative (the combination is permitted) but the observation is now recorded on the artifact for downstream audit.
-
Floor bumps in .github/workflows/training-agent-storyboards.yml:
min_clean_storyboards +1
min_passing_steps +N for the new scenario
Pre-reqs
Out of scope
Refs
Context
Sibling to #4438, which defines the spec-side governance contract for surfacing the
human_oversight: edited|directed+disclosure.required: falsepattern as an audit observation. This issue tracks the reference training agent implementation.PR #4437 added the non-normative warning to docs and schema; depends on #4438 landing the
audit_observations[]wire shape before implementation can begin.Scope
Implementation in
server/src/training-agent/against the spec-side contract from #4438.get_creative_featureshandler — when called against a creative whose provenance carrieshuman_oversight ∈ {edited, directed}ANDdisclosure.required == false, emit anaudit_observations[]entry with:code: OVERSIGHT_DISCLOSURE_CARVEOUT_CLAIMED(or whatever code lands in provenance: governance-agent flag rule for human_oversight ↔ disclosure.required inconsistency #4438)claimed_value: human_oversight=<value>, disclosure.required=falseseverity: audit-worthy(or per provenance: governance-agent flag rule for human_oversight ↔ disclosure.required inconsistency #4438's enum)recovery: 'informational'— this is not a rejection signal.No change to
sync_creativesenforcement. ThePROVENANCE_*structural-rejection family stays untouched. This pattern surfaces, it does not reject.Storyboard / conformance scenario registered in
static/compliance/source/protocols/media-buy/scenarios/covering:get_creative_featuresverification.human_oversight: edited+disclosure.required: false.get_creative_featuresagainst the seeded on-list verifier.audit_observations[]entry for the oversight/disclosure combination.Floor bumps in
.github/workflows/training-agent-storyboards.yml:min_clean_storyboards+1min_passing_steps+N for the new scenarioPre-reqs
audit-observationspredicate may need adding to the conformance harness — coordinate with Storyboard conformance: required-clean allowlist + errors[*] predicate + pre-commit gate #3803 if still open.Out of scope
digital_source_typetruth-of-claim. The structural inconsistency is the only thing flagged here; truth-of-claim verification is Training agent: implement PROVENANCE_CLAIM_CONTRADICTED truth-of-claim verification #3802 territory.Refs