Skip to content

owed_subscription_periods raises coverage input errors for values no schedule reads (invalid_timezone, missing_previous_timezone, missing_standard_dimensions) #1769

Closed

Description

@bokelley

Summary

owed_subscription_periods (adcp 10.0.0b4) raises three coverage input errors for values that no schedule in play reads. In each case the TypeScript SDK or the spec's reference model, or both, return the owed rows. Differential testing found all three (adcontextprotocol/adcp tests/interop/differential, 5,000 seeded scenarios on tzdata 2026f, mapping as in tests/test_reporting_subscription_parity.py).

The spec's position comes from error-codes.json and the numeric-offset-timezone-is-refused vector, which was changed so that a refusal follows only "from the coverage rule": a utc schedule never reads the account timezone, so its periods are derivable.

Each repro starts from the baseline case input in static/compliance/source/test-vectors/reporting-subscriptions/vectors.json. Its only offering is utc-aligned, and it owes 11-03, 11-04 and 11-05.

1. invalid_timezone for an account timezone no schedule reads

Set account.timezone to "+05:00".

  • Reference model: the 3 rows.
  • Python: COVERAGE_INPUT_INVALID/invalid_timezone ("account_timezone '+05:00' is not a recognized IANA timezone").
  • error-codes.json: "A zone a schedule reads is not an IANA zone".

The TS SDK has the same bug (filed in adcp-client).

2. missing_previous_timezone when no account_timezone offering resolves

Add "coverage": {"timezone_cutovers": [{"effective_at": "2026-11-05T05:00:00Z", "timezone": "America/New_York"}]} (no previous_timezone).

  • Reference model and TS: the 3 rows.
  • Python: COVERAGE_INPUT_INCOMPLETE/missing_previous_timezone.
  • A cutover entry only affects account_timezone periods, and none resolve here.

3. missing_standard_dimensions for an offering that isn't a candidate

Add a second offering that no selector can match (for example feed_purpose: "pacing", period_duration: "PT1H") and omit its standard_dimensions.

  • Reference model and TS: the 3 rows.
  • Python: COVERAGE_INPUT_INCOMPLETE/missing_standard_dimensions ("offering 'off_z_pacing_hourly' has no standard_dimensions").
  • error-codes.json: "A candidate offering does not publish standard_dimensions".

Suggested fix

Raise each error only where the rule reads the value:

  • validate the account zone where an account_timezone calendar is built;
  • require previous_timezone only for entries that apply to a resolved account_timezone offering;
  • check standard_dimensions only on candidate offerings.

🤖 Generated with Claude Code

Activity

  1. bokelley commented on Nov 1, 2026

    @bokelley
    ContributorAuthor

    Fixed on next by fc370c61 ("refuse coverage input only where a schedule reads it"), which landed with #1766. It merged into a non-default branch, so the issue didn't auto-close.

    Each refusal now follows only from the coverage rule:

    • the account zone is validated where an account_timezone calendar is built;
    • previous_timezone is required only for cutovers that apply to a resolved account_timezone offering;
    • standard_dimensions is checked only on candidate offerings.

    tests/test_reporting_subscription_parity.py reproduces all three cases from the spec's baseline vector (test_issue_1769_*), and each owes the same 11-03, 11-04 and 11-05 rows. The parity suite passes on next at 7edba16d (128 passed).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions