{
  "schemaVersion": 1,
  "version": "2026-09-18.2",
  "authority": "reconstructed local reference contract",
  "owner": "Pan Out research maintainer",
  "scope": "Static signed-out consumer-web reference. These rules specify the delivered examples; they do not describe YouTube's private infrastructure.",
  "verification": "scripts/verify-operational.cjs",
  "report": "reference-data/operational-verification.json",
  "contracts": [
    {
      "id": "delivery-budgets",
      "rule": "Initial page resource transfer must stay below 5,000,000 bytes. Load fonts, scripts, styles, images and original fixture media from this publication. Lazy-load long catalog images. Do not autoplay audio or video. Lazy-load Premium animated illustrations and use deterministic first-frame posters when reduced motion is requested. Keep page overflow within one CSS pixel at 390, 768, 1440 and 1920 pixels.",
      "testIds": [
        "first-transfer:index.html",
        "first-transfer:assets.html",
        "first-transfer:components.html",
        "first-transfer:examples/search.html",
        "first-transfer:examples/watch-unavailable.html",
        "first-transfer:examples/playable-local.html",
        "first-transfer:examples/premium.html",
        "first-transfer:examples/premium.html?offer=lite-explainer"
      ],
      "failureAction": "Compress or defer the offending asset; retain its dimensions to prevent layout shifts. Recapture the affected page."
    },
    {
      "id": "content-and-data",
      "rule": "Treat video titles, query text and channel names as text. Encode query parameters with encodeURIComponent. Missing creator names use Channel unavailable; missing duration omits the duration badge. Keep object identity stable while filters change visibility. The local fixture contains a bounded collection; it does not promise production pagination, ranking or concurrency.",
      "testIds": [
        "unsafe-query"
      ],
      "failureAction": "Use textContent or native input.value. Do not interpret fixture strings as markup. Add the failing long, Unicode or missing case to the family specimen."
    },
    {
      "id": "interruption-and-recovery",
      "rule": "Loaded controls remain usable offline. A repeated menu or account-gate action leaves one current layer. Escape closes the active layer and returns focus to its trigger. The static site has no service-worker cache: navigating or reloading offline may show the browser's network error. The browser owns native media buffering and clipboard permission failures; show explicit failure copy and keep surrounding content available.",
      "testIds": [
        "repeated-menu",
        "menu-cancellation",
        "repeated-account-gate",
        "offline-existing-page"
      ],
      "failureAction": "Preserve query and object identity, cancel the current local layer, and expose a retry only when it can perform a real documented action."
    },
    {
      "id": "account-and-authorization",
      "rule": "Every account-dependent local action opens the signed-out boundary. The fixture never changes a subscription, saves a playlist, sends a comment, authenticates an account or collects payment data. Keep private completion states outside observed claims. A public action's visibility is not proof that the user has permission to complete it.",
      "testIds": [
        "repeated-account-gate"
      ],
      "failureAction": "Restore the gate and remove any false success state. Reverify both pointer and keyboard contracts."
    },
    {
      "id": "privacy-and-storage",
      "rule": "No cookies, telemetry, identity collection, watch-history persistence or runtime calls to third parties. Appearance alone may persist under youtube-fixture-theme with light or dark values. Ignore invalid stored values. If storage is disabled, retain the current in-memory appearance and keep controls usable. Users can reset appearance with Light or clear site storage.",
      "testIds": [
        "theme-persistence",
        "restricted-storage",
        "privacy:examples/search.html"
      ],
      "failureAction": "Remove unexpected collection or network calls. Guard storage access; a storage error must not abort control initialization."
    },
    {
      "id": "browser-and-input-boundary",
      "rule": "Verified runtime is Chromium 152 with native semantics, pointer and keyboard input, at four viewport widths. The guide retains reduced-motion, forced-color and 200% text-resize tests. Native browser accessibility snapshots support semantic inspection. Physical assistive-technology user testing and other browser engines remain unverified; do not claim universal compatibility.",
      "testIds": [
        "reference-data/accessibility-states.json",
        "reference-data/axe-accessibility.json",
        "reference-data/control-audit-local.json"
      ],
      "failureAction": "Record the failing environment and repair the local contract before adding it to the supported matrix."
    },
    {
      "id": "diagnostics-and-changes",
      "rule": "Retain page URL, viewport, control selector, expected result and before/after state in local test reports. Never collect a visitor's query or activity to monitor this guide. There are no runtime experiments or feature flags. To roll back a release, restore the prior frozen static package and publish it under the same private site name. Any evaluated content change requires a new package and dependency freeze and new independent review.",
      "testIds": [
        "scripts/crawl-site.cjs",
        "scripts/freeze.cjs"
      ],
      "failureAction": "Keep the failed release provisional, retain the failing report, restore the last verified package if necessary, and record the migration in CHANGELOG.md."
    }
  ],
  "privateBoundaries": [
    "Production media delivery, abuse detection and moderation",
    "Authentication, subscription and billing completion",
    "Personalized ranking, telemetry, production flags and service recovery",
    "Concurrent playlist edits, creator publishing and tenant administration"
  ],
  "sourceBoundaryEvidence": [
    "reference-data/contract-recovery-ledger.json",
    "reference-data/independent-denominator.json",
    "RESEARCH.md"
  ],
  "motionEvidence": "evidence/premium-motion-posters/posters.json"
}
