docs(compliance): storyboard troubleshooting + known-ambiguities guides (#2605, #2607, #2608)#2614
docs(compliance): storyboard troubleshooting + known-ambiguities guides (#2605, #2607, #2608)#2614bokelley wants to merge 3 commits into
Conversation
…es (#2608, #2605, #2607) Two new docs that close the implementer-DX gap #2608 identified and document the current state of the open any_of and SDK-injection ambiguities (#2605, #2607) so new implementers aren't paying 1:1 detective-work cost per issue. storyboard-troubleshooting.mdx — failure-mode lookup keyed on the raw error messages new implementers see. Each section: what the runner is telling you, what it means, how to fix. Covers the high-frequency patterns: PRODUCT_NOT_FOUND (fixture seeding), missing WWW-Authenticate: Signature challenge on 401, errors[] vs adcp_error envelope drift, context echo failures, capability-vector mismatches, INVALID_STATE variants, the idempotency missing-key SDK inversion, and account/brand stripping. known-ambiguities.mdx — running inventory of open spec ambiguities with interim guidance. Entries tagged Tracked / Under review / Resolved; each links to its upstream issue. Entries are removed as issues close. Current set: envelope shape (#2587), past_start (resolved by #2389, kept as forwarding pointer), remaining any_of audit (#2605), idempotency SDK-injection (#2607), schema-optional fields asserted by vectors (#2604), check_governance conditional- approval shape (#2603), $context.* resolution (#2589), INVALID_STATE_TRANSITION canonicalization (#2588), fixture-id hardcoding (#2585). idempotency.yaml — missing_key phase gains an SDK-injection caveat in its narrative pointing at #2607. Implementers reading the YAML now see the caveat in-line without having to hunt down the troubleshooting doc. Both new docs wired into the Implementation Patterns nav group. Closes #2608. Progresses #2605 and #2607 by documenting the workarounds while underlying fixes land (vector-level any_of audit for #2605; storyboard-runner raw-HTTP probe for #2607 — both tracked as follow-ups). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Schema Link Check ResultsCommit:
|
Filed adcp-client#678 to track the probeRawRequest work that unblocks the idempotency missing_key vector. Cross-linking from the three places that previously only referenced adcp#2607: - known-ambiguities.mdx entry now lists both issues with their respective scopes (spec vs runner fix) - storyboard-troubleshooting.mdx section on the missing_key vacuous-pass now points at the runner fix too - idempotency.yaml narrative cites both, and names probeRawRequest and probeSignedRequest explicitly so implementers can find the pattern when reading the YAML Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… NOT_CANCELLABLE (#2605 audit) Completes the vector-level audit #2605 asked for. The only legitimate finding across all 25 check: error_code assertions in static/compliance/source/: invalid_transitions > second_cancel locked to NOT_CANCELLABLE, but re-cancelling a media buy in canceled (terminal) state satisfies TWO spec rules at once: - media-buy/specification.mdx §129, §254: sales agents MUST reject updates to media buys in terminal states with error code INVALID_STATE - update_media_buy.mdx §675: NOT_CANCELLABLE — media buy or package cannot be canceled An agent that returns INVALID_STATE on re-cancel is spec-conformant via the terminal-state-update rule; an agent returning NOT_CANCELLABLE is spec-conformant via the cancellation-rejection rule. Both are defensible readings of the current spec. Widened the vector to allowed_values: ["NOT_CANCELLABLE", "INVALID_STATE"] with narrative pointing implementers at both spec references. Updated the scenario summary and phase narrative to reflect the dual-branch acceptance. Other single-branch error_code assertions in the storyboards were audited and are spec-locked (VERSION_UNSUPPORTED, GOVERNANCE_DENIED, INVALID_STATE for pause/resume on canceled, MEDIA_BUY_NOT_FOUND, PACKAGE_NOT_FOUND, TERMS_REJECTED) per their canonical sources. No further widenings needed. known-ambiguities.mdx entry for #2605 updated to reflect the completed vector-level audit. The spec-side decision on whether to canonicalize one code for re-cancel remains open; the vector no longer penalizes either choice. Progresses #2605. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
Closing as obsolete — superseded by parallel-merged PRs. What landed while this PR was open
What this PR's docs got wrong anywayCode review caught several folklore defects that would have shipped stale even without the duplication:
Open question that survivedThe re-cancel vector's error-code assertion is a real spec ambiguity — `specification.mdx §129,254` says "Sales agents MUST reject updates to media buys in terminal states (`completed`, `rejected`, `canceled`) with error code `INVALID_STATE`." That MUST applies to re-cancel (a terminal-state update). `NOT_CANCELLABLE` is a MAY per §128. An agent returning `INVALID_STATE` on re-cancel is conformant with the MUST and currently fails the vector. The #2611 audit called `NOT_CANCELLABLE` "scenario-canonical" but didn't resolve the conflict with the MUST. I'm filing a follow-up issue to surface that for a spec-owner decision rather than pushing a unilateral vector change here. |
Summary
Two new implementer-facing docs that close the DX gap #2608 identified and document the current state of the open conformance ambiguities (#2605, #2607) so new implementers aren't paying 1:1 detective-work cost per unresolved issue.
docs/building/implementation/storyboard-troubleshooting.mdxFailure-mode lookup keyed on the raw error messages new implementers see. Each section: what the runner is telling you → what it means → how to fix. Patterns covered:
PRODUCT_NOT_FOUND→ fixture seeding (comply_test_controller / static seed / alias)WWW-Authenticate: Signaturechallenge on 401 → RFC 9421 challenge emission +signatureErrorCodeFromCausemappingerrors[]vsadcp_errorenvelope drift → Spec: response envelope unification — errors[] vs adcp_error on failure responses #2587 tracking + interim guidance (returnerrors[])contextkey back; Spec: context-echo semantics tightening (.* resolution and MUST-echo rules) #2589skipVectorsescape hatchINVALID_STATE/INVALID_TRANSITION/INVALID_STATE_TRANSITION→ canonical + lint location; Spec: error-code taxonomy lint + generated enum (INVALID_STATE_TRANSITION vs INVALID_TRANSITION etc.) #2588missing_keySDK inversion → Testing infrastructure: idempotency 'missing key' vector can't probe through reference SDK client #2607account/brandstripping → declare required in schemaPlus operator escape hatches, a "before filing a bug" checklist, and cross-links to the canonical source docs.
docs/building/implementation/known-ambiguities.mdxRunning inventory of open spec ambiguities with interim guidance. Tagged Tracked / Under review / Resolved; each links to its upstream issue. Entries are deleted as issues close. Current set:
errors[]vsadcp_error)past_start_handledreject-or-adjustany_ofsingle-branch assertionsmissing_keySDK inversioncheck_governanceconditional-approval shape$context.*resolution rulesINVALID_STATE_TRANSITIONcanonicalizationstatic/compliance/source/universal/idempotency.yamlThe
missing_keyphase gains an SDK-injection caveat note in its narrative, pointing at #2607. Implementers reading the YAML now see the caveat in-line without having to hunt down the troubleshooting doc.Closes
Progresses
skipVectorsworkaround. Vector-level audit remains open as a follow-up.Test plan
npm run test:docs-nav— passes (nav entries wired)npm run build:compliance— passes (YAML note doesn't break compilation)npm testvia pre-commit — 631 tests pass, typecheck clean🤖 Generated with Claude Code