diff --git a/scripts/check_komodo.sh b/scripts/check_komodo.sh index 362b491..d4061fe 100755 --- a/scripts/check_komodo.sh +++ b/scripts/check_komodo.sh @@ -55,12 +55,15 @@ maybe_set_cdp_endpoint() { load_local_env +KOMODO_USER_AGENT="${KOMODO_USER_AGENT:-Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36}" +export KOMODO_USER_AGENT + fetch_json() { name="$1" url="$2" allow_fallback="${3:-1}" tmp="$OUT_DIR/$name.json.tmp" - if curl -A 'Mozilla/5.0' --retry 1 --retry-delay 1 --max-time 12 -fsSL "$url" > "$tmp" 2>/dev/null \ + if curl -A "$KOMODO_USER_AGENT" --retry 1 --retry-delay 1 --max-time 12 -fsSL "$url" > "$tmp" 2>/dev/null \ && jq empty "$tmp" >/dev/null 2>&1; then mv "$tmp" "$OUT_DIR/$name.json" return 0 diff --git a/scripts/download_with_playwright.js b/scripts/download_with_playwright.js index 0641079..850a112 100644 --- a/scripts/download_with_playwright.js +++ b/scripts/download_with_playwright.js @@ -23,6 +23,11 @@ function launchOptions(headless) { return options; } +function userAgent() { + return process.env.KOMODO_USER_AGENT || + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"; +} + function findKomodoPage(context, origin) { const pages = context.pages(); return pages.find((candidate) => candidate.url().startsWith(origin)) || pages[0] || null; @@ -66,7 +71,7 @@ async function main() { } else if (profileDir) { context = await chromium.launchPersistentContext(profileDir, { ...launchOptions(headless), - userAgent: "Mozilla/5.0", + userAgent: userAgent(), }); shouldCloseContext = true; page = context.pages()[0] || await context.newPage(); @@ -74,7 +79,7 @@ async function main() { browser = await chromium.launch(launchOptions(headless)); shouldCloseBrowser = true; context = await browser.newContext({ - userAgent: "Mozilla/5.0", + userAgent: userAgent(), storageState: storageState || undefined, extraHTTPHeaders: referer ? { Referer: referer } : undefined, }); diff --git a/scripts/fetch_with_playwright.js b/scripts/fetch_with_playwright.js index 6cc832e..760d9f3 100644 --- a/scripts/fetch_with_playwright.js +++ b/scripts/fetch_with_playwright.js @@ -25,6 +25,11 @@ function launchOptions(headless) { return options; } +function userAgent() { + return process.env.KOMODO_USER_AGENT || + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"; +} + function findKomodoPage(context, origin) { const pages = context.pages(); return pages.find((candidate) => candidate.url().startsWith(origin)) || pages[0] || null; @@ -68,7 +73,7 @@ async function main() { } else if (profileDir) { context = await chromium.launchPersistentContext(profileDir, { ...launchOptions(headless), - userAgent: "Mozilla/5.0", + userAgent: userAgent(), }); shouldCloseContext = true; page = context.pages()[0] || await context.newPage(); @@ -76,7 +81,7 @@ async function main() { browser = await chromium.launch(launchOptions(headless)); shouldCloseBrowser = true; context = await browser.newContext({ - userAgent: "Mozilla/5.0", + userAgent: userAgent(), storageState: storageState || undefined, extraHTTPHeaders: referer ? { Referer: referer } : undefined, }); diff --git a/scripts/save_visual_assets.py b/scripts/save_visual_assets.py index 551c141..f160796 100755 --- a/scripts/save_visual_assets.py +++ b/scripts/save_visual_assets.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 import argparse import json +import os import urllib.error import urllib.request from pathlib import Path @@ -20,6 +21,12 @@ VISUAL_EXTS = { ".m4v", } +DEFAULT_USER_AGENT = ( + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/123.0.0.0 Safari/537.36" +) + def is_visual_url(url: str) -> bool: path = urlparse(url).path.lower() @@ -167,7 +174,10 @@ def is_valid_download(url: str, content_type: str, data: bytes): def download(url: str, dest: Path): dest.parent.mkdir(parents=True, exist_ok=True) - req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) + req = urllib.request.Request( + url, + headers={"User-Agent": os.environ.get("KOMODO_USER_AGENT", DEFAULT_USER_AGENT)}, + ) with urllib.request.urlopen(req, timeout=15) as response: data = response.read() status = getattr(response, "status", 200) diff --git a/status/current.md b/status/current.md index 19d7721..42f6f65 100644 --- a/status/current.md +++ b/status/current.md @@ -1,17 +1,18 @@ # Steam Hardware Watch Status -Last updated: `2026-04-24` +Last updated: `2026-04-26` ## Best Current Answer -- `Price`: no confirmed public price leak for the new Steam Controller. -- `Release date`: no exact public launch date found. -- `Same-time launch`: not supported by the current evidence. A shared rollout window remains plausible, but the controller looks further along than Steam Machine or Steam Frame. +- `Price`: no confirmed public price leak for the new Steam Controller, Steam Machine, or Steam Frame. +- `Release date`: official Valve store pages now support a broad `early 2026` / `coming in 2026` window, but no exact preorder, ship, or launch date was found. +- `Same-time launch`: stronger than the seeded baseline for a shared public rollout window because Valve's official Steam Hardware page groups Controller, Machine, and Frame together. Exact same-day availability is still unconfirmed, and the controller remains furthest along. ## Source Snapshot ### Komodo +- Automated Komodo API access is working again after replacing the helper's rejected generic `Mozilla/5.0` user agent with a realistic browser user agent. - `Steam Controller`, `Steam Machine`, and `Steam Frame` are all real published WooCommerce products in a held state: - `publish` - `product-type-simple` @@ -19,23 +20,31 @@ Last updated: `2026-04-24` - `wishlist-only` - On `2026-04-24`, Komodo bulk-updated product records for all three hardware lines across currencies. - Also on `2026-04-24`, Komodo exposed a fresh controller-only section and media rollout with banner, videos, feature art, controls imagery, and a spec image. -- No comparable fresh Machine or Frame section and media rollout was found. +- Rechecked on `2026-04-26`: product modified timestamps remain `2026-04-24T15:12:12` for Controller, `2026-04-24T14:32:54` for Machine, and `2026-04-24T14:33:36` for Frame. +- No comparable fresh Machine or Frame section and media rollout was found. Machine and Frame still only show older wishlist sections in the current Komodo search output. ### SteamDB -- The strongest launch-adjacent signal remains the hidden `steam_controller_unboxing_2026` asset first seen on `2026-04-20`. +- Browser-verified SteamDB state on `2026-04-26`: + - `Steam Controller` app `4165870` remains `prerelease` with store release date `Coming soon`. + - `steam_controller_unboxing_2026` app `4653940` remains a released free video app, first seen on `2026-04-20`, with package `1620489` available as free on demand and showing `No Price`. + - The standard curl helper was blocked by SteamDB, so browser-style verification is the current usable path. ### SteamTracking / GameTracking -- Valve’s client strings already include controller onboarding, firmware update flow, puck handling, and pairing logic for the new controller ecosystem. +- A fresh SteamTracking checkout on `2026-04-26` still includes controller onboarding, firmware update flow, puck handling, and pairing logic for the new controller ecosystem. +- Pairing-focused hits include `ibex_internal`, `ibex_external`, `PairDongleTritonConnected`, `PairDongleTritonDocked`, and `ShouldTritonPairInOobe`. ### Valve Support / CDN -- No controller price or date leak has been confirmed from support pages or discoverable docs in the seeded baseline. +- Official Valve store pages were reachable and saved: + - `/sale/hardware` says the Steam Hardware family expands in early 2026, lists Steam Controller, Steam Machine, and Steam Frame, and was modified at `2026-04-26T06:06:01Z` in the embedded event metadata. + - `/sale/steamcontroller` has a dedicated Steam Controller page and was modified at `2026-04-26T06:05:47Z` in the embedded event metadata. +- No official Valve price, exact release date, or preorder date was found. ### Customs / Regulatory -- Shipment and filing checks remain secondary confirmation sources. No direct price or launch-date confirmation is seeded here. +- A quick `2026-04-26` web check did not find a new relevant Valve regulatory filing for the 2026 controller, Machine, or Frame. Results were dominated by old Steam Controller and Steam Deck records or unrelated products. ## Open Questions diff --git a/status/evidence.jsonl b/status/evidence.jsonl index a4a4201..320d794 100644 --- a/status/evidence.jsonl +++ b/status/evidence.jsonl @@ -6,3 +6,9 @@ {"date_checked":"2026-04-24","source":"steamdb","entity":"steam-controller","claim":"A hidden Steam Controller unboxing video asset exists and is the strongest late-stage public launch signal in the seeded baseline.","evidence_type":"hidden_media_app","confidence":"high","ref":"https://steamdb.info/app/4653940/","notes":"known internally as steam_controller_unboxing_2026 from prior research"} {"date_checked":"2026-04-24","source":"steamtracking","entity":"steam-controller","claim":"Valve client assets already contain controller onboarding, firmware, puck, and pairing flows for the new controller ecosystem.","evidence_type":"client_strings","confidence":"medium","ref":"/tmp/SteamTracking-master/Protobufs/webuimessages_steaminput.proto","notes":"Triton, Puck, and pairing/OOBE flows present in seeded local dump"} {"date_checked":"2026-04-24","source":"analysis","entity":"steam-controller,steam-machine,steam-frame","claim":"Current evidence supports a controller-ahead rollout more than a same-day three-product launch.","evidence_type":"cross_source_inference","confidence":"medium","ref":"/Users/sean.betts/.codex/skills/steam-hardware-watch/status/runs/2026-04-24.md","notes":"driven by controller-only Komodo rollout plus SteamDB unboxing signal"} +{"date_checked": "2026-04-26", "source": "valve-store", "entity": "steam-controller,steam-machine,steam-frame", "claim": "Official Steam Hardware store sale page is published and says the hardware family expands in early 2026.", "evidence_type": "official_store_page", "confidence": "high", "ref": "https://store.steampowered.com/sale/hardware", "notes": "Local artifact: /Users/sean/steam_hardware_watch/2026-04-26/api/valve/steam-hardware-root.html; event modified 2026-04-26T06:06:01Z; includes Controller, Machine, Frame and no exact price."} +{"date_checked": "2026-04-26", "source": "valve-store", "entity": "steam-controller", "claim": "Official Steam Controller sale page is published with a dedicated controller rollout page but no public price or exact date.", "evidence_type": "official_store_page", "confidence": "high", "ref": "https://store.steampowered.com/sale/steamcontroller", "notes": "Local artifact: /Users/sean/steam_hardware_watch/2026-04-26/api/valve/steam-controller-store.html; event modified 2026-04-26T06:05:47Z."} +{"date_checked": "2026-04-26", "source": "steamdb", "entity": "steam-controller", "claim": "SteamDB currently lists Steam Controller app 4165870 as prerelease with store release date Coming soon.", "evidence_type": "steamdb_app_metadata", "confidence": "medium", "ref": "https://steamdb.info/app/4165870/", "notes": "Browser fetch succeeded; curl helper was blocked. SteamDB shows last record update 2026-04-07T22:07:16Z."} +{"date_checked": "2026-04-26", "source": "steamdb", "entity": "steam-controller", "claim": "SteamDB still shows steam_controller_unboxing_2026 as a released free video app with an available free-on-demand package.", "evidence_type": "hidden_media_app", "confidence": "medium", "ref": "https://steamdb.info/app/4653940/", "notes": "Browser fetch succeeded; app first seen 2026-04-20 and last record update 2026-04-21T22:16:14Z; package 1620489 lists No Price."} +{"date_checked": "2026-04-26", "source": "steamtracking", "entity": "steam-controller", "claim": "Fresh SteamTracking checkout still contains Ibex dongles, Triton pairing, and controller OOBE strings.", "evidence_type": "client_strings", "confidence": "medium", "ref": "/Users/sean/steam_hardware_watch/2026-04-26/reports/steamtracking-pairing-focus.txt", "notes": "Includes ibex_internal, ibex_external, PairDongleTritonConnected, PairDongleTritonDocked, and ShouldTritonPairInOobe in service_steaminputmanager.proto."} +{"date_checked": "2026-04-26", "source": "komodo", "entity": "steam-controller,steam-machine,steam-frame", "claim": "Komodo API access was restored after using a realistic browser user agent; product records remain last modified on 2026-04-24 and no newer Machine or Frame rollout was found.", "evidence_type": "api_recheck", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-04-26/reports/komodo-product-modified.tsv", "notes": "Root cause of earlier block was helper user-agent Mozilla/5.0 receiving HTTP 403; default curl and realistic Chrome/Safari UAs returned JSON."}