Skip to content

feat(compliance): add Storyboard.requires runtime requirement gate#4312

Merged
bokelley merged 2 commits into
mainfrom
claude/issue-4311-storyboard-requires-field
May 10, 2026
Merged

feat(compliance): add Storyboard.requires runtime requirement gate#4312
bokelley merged 2 commits into
mainfrom
claude/issue-4311-storyboard-requires-field

Conversation

@bokelley
Copy link
Copy Markdown
Contributor

Closes #4311

Summary

Adds the optional requires field to storyboard-schema.yaml, aligning the spec with the reference implementation already shipped in @adcp/sdk@^6.16.0 (adcp-client#1635, merged). Third-party runners can now interoperate using the same storyboard-level requirement gate the SDK emits.

Adds requirement_unmet to runner-output-contract.yaml's skip_result.reasons enum — the SDK already emits this skip reason; the spec was missing it.

Files changed:

  • static/compliance/source/universal/storyboard-schema.yaml — adds requires field doc block with full normative semantics
  • static/compliance/source/universal/runner-output-contract.yaml — adds requirement_unmet to skip_result.reasons
  • .changeset/storyboard-requires-runtime-gate.mdminor bump

Non-breaking justification: adds an optional field with a well-defined default-when-absent behavior ([real_wire] = run unchanged); existing storyboards with no requires field are unaffected. requirement_unmet is additive to the skip reason enum.

Milestone: targets 3.1.0 (minor — new optional schema field). Note: gh CLI unavailable in this environment; milestone was not set programmatically. Please set via gh pr edit <num> --milestone "3.1.0".

Key normative decisions (from expert review)

  • Unknown requires values → requirement_unmet (not fail-load): consistent with the forward-compat posture throughout the harness; unknown gates are not schema violations
  • requires: [] → hard fail-load: schema constraint (empty array has no distinct semantic from omitting the field)
  • controller is orthogonal to prerequisites.controller_seeding: load-phase gate vs. execution-phase instruction; both may be declared; mid-run transient loss after gate passes routes to missing_test_controller at step scope
  • real_wire semantics deferred: default-when-absent behavior under --mock-only and composition with other values are explicitly deferred to the --mock-only PR

Pre-PR review

  • code-reviewer: approved — all three round-1 blockers resolved (not_applicable→requirement_unmet contradiction fixed; real_wire default-when-absent ambiguity fenced; transient controller loss clause added); one nit fixed (Closed enum → Known values)
  • ad-tech-protocol-expert: approved — non-breaking per spec; additive optional field; forward-compat posture consistent with runner-output-contract throughout the harness

Triage-managed PR. This bot does not currently iterate on
review comments or PR conversation threads (only on the source
issue). To unblock:

  • Push fixup commits directly: gh pr checkout <num>
    fix → push.
  • Or re-trigger: comment /triage execute on the source
    issue.

See #3121
for context.

Session: https://claude.ai/code/session_013gwxgVXaYDz63X8RGmnEUU


Generated by Claude Code

claude added 2 commits May 10, 2026 00:38
Adds optional `requires` field to storyboard-schema.yaml with three
recognized values (controller, seeded_state, real_wire), aligning the
spec with the reference implementation already shipped in adcp-client@6.16.0
(adcp-client#1635). Adds `requirement_unmet` to runner-output-contract.yaml's
skip_result.reasons to match the skip reason the SDK already emits.

Key normative decisions:
- Unknown requires values → requirement_unmet (not fail-load), consistent with
  forward-compat posture throughout the harness
- requires: [] is a hard fail-load (schema constraint, not semantic gate)
- controller is orthogonal to prerequisites.controller_seeding (load-phase gate
  vs. execution-phase instruction)
- real_wire is a no-op placeholder; --mock-only semantics and default-when-absent
  behavior are explicitly deferred to the --mock-only PR

https://claude.ai/code/session_013gwxgVXaYDz63X8RGmnEUU
Rephrase "Closed enum" to "Known values" to avoid false impression of
schema-violation on unknown requires values (the spec's forward-compat
rule routes them to requirement_unmet at runtime, not fail-load).

https://claude.ai/code/session_013gwxgVXaYDz63X8RGmnEUU
@bokelley bokelley added the claude-triaged Issue has been triaged by the Claude Code triage routine. Remove to re-triage. label May 10, 2026
@bokelley bokelley marked this pull request as ready for review May 10, 2026 10:27
@bokelley bokelley merged commit 4e96782 into main May 10, 2026
19 checks passed
@bokelley bokelley deleted the claude/issue-4311-storyboard-requires-field branch May 10, 2026 10:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

claude-triaged Issue has been triaged by the Claude Code triage routine. Remove to re-triage.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec: Storyboard.requires — runtime requirement gate (controller / seeded_state / real_wire)

2 participants