From b4277d7f7e5911165d6724aaa7b49cbee7d2b26c Mon Sep 17 00:00:00 2001 From: seanbetts Date: Sun, 10 May 2026 21:54:47 +0100 Subject: [PATCH] Monitor SteamDB reservation package pages --- scripts/check_steamdb.sh | 116 +++++++++++++++++++++++++++++++++++- status/current.md | 100 ++++++++++++++++--------------- status/evidence.jsonl | 2 + tests/test_check_steamdb.py | 73 +++++++++++++++++++++++ 4 files changed, 240 insertions(+), 51 deletions(-) diff --git a/scripts/check_steamdb.sh b/scripts/check_steamdb.sh index 9ef29f7..c63b385 100755 --- a/scripts/check_steamdb.sh +++ b/scripts/check_steamdb.sh @@ -16,6 +16,7 @@ mkdir -p "$OUT_DIR" "$REPORT_DIR" ERROR_FILE="$REPORT_DIR/steamdb-errors.txt" : > "$ERROR_FILE" : > "$REPORT_DIR/steamdb-key-lines.txt" +: > "$REPORT_DIR/steamdb-reservation-packages.tsv" load_local_env() { env_file="${STEAMDB_ENV_FILE:-$REPO_DIR/.local/steamdb-env.sh}" @@ -93,10 +94,119 @@ fetch_html "controller-history" "https://steamdb.info/app/4165870/history/" || t fetch_html "controller-unboxing-app" "https://steamdb.info/app/4653940/" || true fetch_html "controller-unboxing-package" "https://steamdb.info/sub/1620489/" || true -rg -n "Coming soon|released|ownersonly|free on demand|unboxing|package|depot|video" \ +for packageid in 1558609 1629446 1629447 1629458 1629460 1629484 1629486; do + fetch_html "package-$packageid" "https://steamdb.info/sub/$packageid/" || true +done + +python3 - "$OUT_DIR" "$REPORT_DIR/steamdb-reservation-packages.tsv" <<'PY' +import html +import sys +from html.parser import HTMLParser +from pathlib import Path + + +out_dir = Path(sys.argv[1]) +report_path = Path(sys.argv[2]) + +packages = { + "1558609": ("Steam Controller", "4165870", "Steam Controller"), + "1629446": ("Steam Machine", "4165910", "Steam Machine"), + "1629447": ("Steam Machine", "4165910", "Steam Machine"), + "1629458": ("Steam Machine", "4165910", "Steam Machine"), + "1629460": ("Steam Machine", "4165910", "Steam Machine"), + "1629484": ("Steam Frame", "4165890", "Steam Frame"), + "1629486": ("Steam Frame", "4165890", "Steam Frame"), +} + + +class TextParser(HTMLParser): + def __init__(self): + super().__init__() + self.parts = [] + + def handle_data(self, data): + text = html.unescape(data).strip() + if text: + self.parts.append(text) + + +def clean(value): + return str(value or "").replace("\t", " ").replace("\n", " ").strip() + + +def normalized_text(path): + parser = TextParser() + parser.feed(path.read_text(encoding="utf-8", errors="replace")) + parts = [part.replace("\u2013", "-") for part in parser.parts] + return parts, " ".join(parts) + + +def field_after(parts, label): + for index, part in enumerate(parts): + if part == label: + for candidate in parts[index + 1 :]: + if candidate: + return candidate + return "" + + +rows = [[ + "product", + "package_id", + "last_record_update", + "last_changenumber", + "possible_apps", + "status", +]] + +for packageid, (product, expected_appid, expected_name) in packages.items(): + path = out_dir / f"package-{packageid}.html" + if not path.exists(): + rows.append([product, packageid, "", "", "", "missing_or_blocked"]) + continue + + parts, text = normalized_text(path) + last_record_update = field_after(parts, "Last Record Update") + last_changenumber = field_after(parts, "Last Changenumber") + possible_apps = "" + if expected_appid in text and expected_name in text: + possible_apps = f"{expected_appid}:{expected_name}" + + lower_text = text.lower() + if "besides the fact that it exists" in lower_text: + status = "private_exists_only" + elif last_record_update or last_changenumber: + status = "details_available" + else: + status = "unknown" + + rows.append([ + product, + packageid, + last_record_update, + last_changenumber, + possible_apps, + status, + ]) + +report_path.write_text( + "\n".join("\t".join(clean(value) for value in row) for row in rows) + "\n", + encoding="utf-8", +) +PY + +{ + printf '%s\n' "Reservation package SteamDB snapshot:" + sed -n '1,40p' "$REPORT_DIR/steamdb-reservation-packages.tsv" + printf '\n%s\n' "HTML key matches:" +} > "$REPORT_DIR/steamdb-key-lines.txt" + +rg -n -o "Coming soon|released|ownersonly|free on demand|unboxing|package|depot|video" \ "$OUT_DIR" \ - > "$REPORT_DIR/steamdb-key-lines.txt" || true + | sort -u \ + >> "$REPORT_DIR/steamdb-key-lines.txt" || true printf '%s\n' \ "Saved SteamDB pages to $OUT_DIR" \ - "Saved matching lines to $REPORT_DIR/steamdb-key-lines.txt" + "Saved matching lines to $REPORT_DIR/steamdb-key-lines.txt" \ + "Saved reservation package report to $REPORT_DIR/steamdb-reservation-packages.tsv" diff --git a/status/current.md b/status/current.md index 36aeff7..0e270a3 100644 --- a/status/current.md +++ b/status/current.md @@ -1,83 +1,87 @@ # Steam Hardware Watch Status -Last updated: `2026-05-04` +Last updated: `2026-05-10` ## Best Current Answer - `Price`: Steam Controller remains confirmed by official Valve store APIs at `$99.00` in the US. Steam Machine and Steam Frame still have no confirmed public price. -- `Release date`: Steam Controller remains confirmed with release date `May 4, 2026` and package `1558609`. Steam Machine and Steam Frame still only have broad `2026` timing. -- `Same-time launch`: exact same-day availability is effectively ruled out for the full trio. Steam Controller has a purchase package and exact date; Machine and Frame still do not. +- `Release date`: Steam Controller remains confirmed with release date `May 4, 2026` and package `1558609`. Steam Machine and Steam Frame still only expose broad `Coming soon` / `2026` timing. +- `Same-time launch`: same-day availability for the full trio is ruled out. Steam Controller is public and purchasable; Machine and Frame still have no public package, package group, price, or exact availability. ## Source Snapshot ### Komodo -- Automated Komodo API access was blocked on `2026-05-04`; do not treat the comparison report's Komodo section removals as real content removals. -- Automated Komodo API access worked on `2026-05-02` with the realistic browser user agent. -- `Steam Controller`, `Steam Machine`, and `Steam Frame` remain real published WooCommerce products. -- Controller product metadata moved again: modified timestamp is now `2026-04-30T19:14:10`. -- Controller remains in the sale-adjacent state seen in the prior run: - - `product_tag-wishlist-only` is absent. - - `purchasable` is present. - - `outofstock` remains. - - `product_tag` is `[112]`; tag `113` is `wishlist-only`. -- Machine and Frame remain dormant by comparison: both still carry `product_tag-wishlist-only`, remain `outofstock`, and do not have the `purchasable` class. -- Machine and Frame product modified timestamps are unchanged at `2026-04-24T14:32:54` and `2026-04-24T14:33:36`. -- Current Komodo section coverage shows Controller-only launch-page depth, with older wishlist-only sections for Machine and Frame. -- Visual asset retrieval is complete for the current Komodo set: `141` discovered and `141` retrieved, with `0` blocked. The browsable library contains `11` videos, `12` images, `3` logos, `3` poster frames, `44` thumbnails, and `68` variants. +- Komodo API access worked on `2026-05-10`. +- Product modified timestamps: + - Controller: `2026-05-08T15:55:26` + - Machine: `2026-04-24T14:32:54` + - Frame: `2026-04-24T14:33:36` +- Controller remains the only product with recent Komodo movement. Machine and Frame remain unchanged from their April 24 timestamps. +- Visual asset retrieval completed for the current set: `141` discovered, `141` retrieved, `0` blocked. ### SteamDB -- The standard SteamDB helper was still blocked by challenge pages on `2026-05-04` for app `4165870`, app history, app `4653940`, and package `1620489`. -- Browser-verified SteamDB state from `2026-04-26` is now superseded for price and date by official Valve store APIs, but remains useful for historical app/package tracking. +- The SteamDB helper now includes the reservation package pages for: + - Controller: `1558609` + - Machine: `1629446`, `1629447`, `1629458`, `1629460` + - Frame: `1629484`, `1629486` +- Automated SteamDB access and the dedicated browser fallback were still blocked on `2026-05-10`. +- The saved package report is therefore a structural baseline, not a content baseline: all watched SteamDB package rows are `missing_or_blocked`. +- A true SteamDB package baseline still requires a trusted browser session that can pass SteamDB's challenge and save the package pages. ### SteamTracking / GameTracking -- A fresh SteamTracking checkout on `2026-05-04` 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`. -- The same Triton/Ibex pairing surface now also appears in `Random/SteamApkStrings.txt`, indicating the Steam Android APK string dump includes the controller pairing API names. This broadens the client-surface evidence, but does not introduce a new price or launch-date signal. +- Fresh SteamTracking content still contains the known Triton/Ibex controller pairing surface: + - `ibex_internal` + - `ibex_external` + - `PairDongleTritonConnected` + - `PairDongleTritonDocked` + - `ShouldTritonPairInOobe` +- Known reservation package-code baseline remains: Machine package IDs `1629446`, `1629447`, `1629458`, `1629460` and Frame package IDs `1629484`, `1629486` first appeared in SteamTracking commit `334bd31a28a0` at `2026-04-28T23:46:34Z`. +- No new price or exact availability signal was found in this run. ### SteamVR Depots -- SteamVR app `250820` news metadata was saved on `2026-05-04`. -- The SteamDB depot page for SteamVR was blocked by challenge pages, so no fresh manifest/build comparison was collected. -- The first SteamVR helper baseline found public news references to SteamVR/OpenXR/Steam Link VR, but no direct `Deckard`, `Roy`, or `Steam Frame` depot-content hit because no local SteamVR depot snapshot was available to scan. +- SteamVR news metadata was saved. +- SteamDB's SteamVR depot page remained blocked by challenge pages, so no fresh depot manifest/build comparison was collected. +- No local SteamVR depot snapshot was available for deeper content scanning. ### SteamOS Package Mirror -- Valve's public SteamOS package mirror was reachable on `2026-05-04`. -- The default `holo-3.8`, `holo-main`, `jupiter-3.8`, and `jupiter-main` package database pass produced `758` package rows and no fetch errors. -- No high-signal `Fremont`, `Deckard`, `Roy`, `Steam Frame`, `Steam Machine`, ARM/Snapdragon, or product-specific top-level repo namespace appeared in the default mirror pass. -- The notable mirror hits were Deck/Jupiter-adjacent, including `foxnet`, `foxnetstatsd`, `linux-firmware-neptune-*`, and `plasma-remotecontrollers`. +- Valve's public SteamOS package mirror was reachable. +- Notable mirror hits include `fremont-hw-support 20260506.1-1` in `holo-3.8` and `holo-main`. +- No direct `Deckard`, `Roy`, `Steam Frame`, `Steam Machine`, ARM/Snapdragon, or new product-specific top-level repo namespace appeared in the default pass. -### Valve Support / CDN +### Valve Support / Store / CDN -- Official Valve store pages were reachable and saved on `2026-05-04`. -- Official appdetails for app `4165870` still show hardware type, package `1558609`, `price_overview.final_formatted` `$99.00`, and release date `May 4, 2026`. -- Official packagedetails for package `1558609` still show USD final price `9900` cents, release date `May 4, 2026`, and page content for the Steam Controller puck, 35+ hour battery, TMR thumbsticks, haptics, and inputs. -- Steam Controller store event metadata moved again to `rtime32_last_modified` `2026-05-04T18:27:52Z`; the Steam Hardware root event moved to `2026-05-04T18:27:56Z`. The announcement body hash was unchanged, so this is metadata/json movement rather than a clear text-body change. -- Steam Machine and Steam Frame still do not have comparable official price or exact purchase timing in the checked Valve artifacts. +- Official Valve pages and APIs were reachable. +- Valve API package snapshot: + - Controller app `4165870`: public, package `1558609`, package group present, `$99.00`. + - Frame app `4165890`: public app metadata, `Coming soon`, no packages, no package groups, no price. + - Machine app `4165910`: public app metadata, `Coming soon`, no packages, no package groups, no price. + - Machine packages `1629446`, `1629447`, `1629458`, `1629460`: `packagedetails success:false`. + - Frame packages `1629484`, `1629486`: `packagedetails success:false`. +- This is the cleanest public-readiness baseline heading into next week. ### Customs / Regulatory -- No new customs or regulatory pass was run on `2026-05-02`; the latest saved customs evidence remains from `2026-05-01`. -- NBD's public Valve Corporation page showed latest Valve trade data dated `2026-04-04`, including a `WIRELESS PC CONTROLLER` row from `HONG KONG (CHINA)`. -- ImportGenius showed an April 23, 2026 `GAME CONSOLE .` shipment for `INGRAM MICRO C/O VALVE CORPORATION`, but that record does not identify which Valve hardware product. -- These customs records support active Valve hardware logistics, but do not prove price, exact launch date, or device-specific timing for Machine or Frame. +- ImportInfo automated customs fetches were blocked on `2026-05-10`. +- The latest useful customs evidence remains the `2026-05-01` NBD / ImportGenius pass: + - `WIRELESS PC CONTROLLER` row dated `2026-04-04`. + - `GAME CONSOLE` shipment arriving `2026-04-23` for `INGRAM MICRO C/O VALVE CORPORATION`. +- Customs data remains corroborating evidence only, not price/date/product-identity proof. ## Open Questions - When will Valve publish Steam Machine and Steam Frame prices? -- Will Steam Controller ship dates or purchase-state details differ by region after the `May 4, 2026` release date? -- When will Steam Machine and Steam Frame receive exact availability timing? -- When do comparable fresh media and purchasable-state changes appear for Machine and Frame, if at all? +- When will Steam Machine and Steam Frame receive public packages or package groups? +- Will SteamDB package `Last Record Update` / changenumber movement precede public Valve API readiness? +- Are the `fremont-hw-support` SteamOS packages related to Steam Machine launch preparation? ## Next Checks -- Recheck Komodo product classes/tags for Machine and Frame with browser-style fallback if normal API access remains blocked. -- Recheck SteamDB via browser-style access after the official appdetails movement. -- Watch Valve store metadata and `/hardware/...` paths for Machine and Frame price or availability fields. -- Download or point `STEAMVR_SCAN_DIRS` at SteamVR beta depot snapshots for a real depot-content diff. -- Monitor the SteamOS mirror root for new product-specific repos such as possible Machine/Frame namespaces. -- Track NBD and other customs aggregators for follow-on controller shipments and any Machine or Frame descriptions. -- Run customs or regulatory checks if a new primary-source signal appears. +- Get one trusted-browser SteamDB package-page baseline for the watched package IDs. +- Watch Valve `appdetails` / `packagedetails` for Machine and Frame package or package-group exposure. +- Watch SteamDB package `Last Record Update` and `Last Changenumber` deltas once the challenge can be passed. +- Continue normal Komodo, SteamTracking, SteamOS mirror, Valve API, and customs checks. diff --git a/status/evidence.jsonl b/status/evidence.jsonl index 0963721..1051a60 100644 --- a/status/evidence.jsonl +++ b/status/evidence.jsonl @@ -35,3 +35,5 @@ {"date_checked": "2026-05-04", "source": "valve-store", "entity": "steam-controller,steam-machine,steam-frame", "claim": "Official Valve metadata moved on launch day while only Steam Controller still has a confirmed purchase package, price, and release date.", "evidence_type": "official_store_metadata_delta", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-04/api/valve/steam-controller-store.html", "notes": "Steam Controller event modified 2026-05-04T18:27:52Z; Steam Hardware root modified 2026-05-04T18:27:56Z; appdetails and packagedetails still confirm package 1558609, USD $99.00, release date May 4, 2026; Machine and Frame still lack comparable price or exact timing."} {"date_checked": "2026-05-04", "source": "steamtracking", "entity": "steam-controller", "claim": "Fresh SteamTracking checkout shows the Triton/Ibex pairing API surface in the Steam Android APK string dump as well as existing proto and web UI surfaces.", "evidence_type": "client_strings", "confidence": "medium", "ref": "/Users/sean/steam_hardware_watch/2026-05-04/reports/steamtracking-pairing-focus.txt", "notes": "Random/SteamApkStrings.txt now includes CSteamInputService_PairDongleTritonConnected, PairDongleTritonDocked, ShouldTritonPairInOobe, UnpairedTritonDocked, UnpairedTritonPluggedIn, ibex_internal, and ibex_external. This broadens client-surface evidence but does not change price or release-date confidence."} {"date_checked": "2026-05-04", "source": "steamos-mirror", "entity": "steam-machine,steam-frame", "claim": "First default SteamOS package mirror pass did not expose direct Machine or Frame codename/package evidence.", "evidence_type": "package_mirror_baseline", "confidence": "medium", "ref": "/Users/sean/steam_hardware_watch/2026-05-04/reports/steamos-mirror-packages.tsv", "notes": "Default holo-3.8, holo-main, jupiter-3.8, and jupiter-main pass produced 758 package rows with no errors. No Fremont, Deckard, Roy, Steam Frame, Steam Machine, ARM/Snapdragon, or new product-specific top-level repo namespace appeared; notable hits were Deck/Jupiter-adjacent foxnet, linux-firmware-neptune, and plasma-remotecontrollers."} +{"date_checked": "2026-05-10", "source": "valve-store", "entity": "steam-controller,steam-machine,steam-frame", "claim": "Valve Store APIs confirm Steam Controller remains public with package 1558609 and USD 99.00 while Steam Machine and Steam Frame apps remain coming soon with no public packages or price.", "evidence_type": "official_store_api_recheck", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-10/reports/valve-reservation-packages.tsv", "notes": "appdetails: Controller public with packages=1558609 and package_groups=1; Frame 4165890 and Machine 4165910 public app metadata but package_groups=0, no packages, no price; Machine packages 1629446/1629447/1629458/1629460 and Frame packages 1629484/1629486 still packagedetails success:false."} +{"date_checked": "2026-05-10", "source": "steamdb", "entity": "steam-controller,steam-machine,steam-frame", "claim": "SteamDB reservation package monitor is now part of the baseline, but automated and browser-fallback fetches were blocked for all watched package pages.", "evidence_type": "blocked_fetch", "confidence": "high", "ref": "/Users/sean/steam_hardware_watch/2026-05-10/reports/steamdb-reservation-packages.tsv", "notes": "Watched package IDs: 1558609, 1629446, 1629447, 1629458, 1629460, 1629484, 1629486. All rows are missing_or_blocked after SteamDB challenge pages, so a manual trusted browser pass is still needed for Last Record Update/changenumber baseline."} diff --git a/tests/test_check_steamdb.py b/tests/test_check_steamdb.py index cf52540..6464ec7 100644 --- a/tests/test_check_steamdb.py +++ b/tests/test_check_steamdb.py @@ -129,3 +129,76 @@ class CheckSteamDBTests(unittest.TestCase): self.assertIn("Coming soon", html) errors = (run_dir / "reports" / "steamdb-errors.txt").read_text(encoding="utf-8") self.assertEqual("", errors) + + def test_records_reservation_package_update_baseline(self): + tmp = TemporaryDirectory() + self.addCleanup(tmp.cleanup) + tmp_path = Path(tmp.name) + run_dir = tmp_path / "run" + fake_bin = tmp_path / "bin" + fake_bin.mkdir() + + write_executable( + fake_bin / "curl", + """ + #!/bin/sh + for arg in "$@"; do + url="$arg" + done + + case "$url" in + *sub/1629446*) + printf '%s\\n' '

Steam Sub 1629446

Last Record Update27 April 2026 – 18:22:46 UTC
Last Changenumber35499151

We have no information about this package besides the fact that it exists.

Possible apps in this package

4165910GameSteam Machine35499151
' + ;; + *sub/1629484*) + printf '%s\\n' '

Steam Sub 1629484

Last Record Update27 April 2026 – 18:21:50 UTC
Last Changenumber35499157

We have no information about this package besides the fact that it exists.

Possible apps in this package

4165890GameSteam Frame35499151
' + ;; + *sub/*) + package="${url%/}" + package="${package##*/}" + printf '

Steam Sub %s

Last Record Update27 April 2026 – 18:20:00 UTC
Last Changenumber35499000

We have no information about this package besides the fact that it exists.

\\n' "$package" + ;; + *) + printf '%s\\n' 'Steam Controller AppID: 4165870Coming soon prerelease' + ;; + esac + """, + ) + + env = os.environ.copy() + env.update({"PATH": f"{fake_bin}:{env['PATH']}"}) + + result = subprocess.run( + [str(ROOT / "scripts" / "check_steamdb.sh"), str(run_dir)], + cwd=ROOT, + env=env, + text=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=False, + ) + + self.assertEqual("", result.stderr) + self.assertEqual(0, result.returncode) + + steamdb_dir = run_dir / "api" / "steamdb" + self.assertTrue((steamdb_dir / "package-1629446.html").exists()) + self.assertTrue((steamdb_dir / "package-1629484.html").exists()) + + report = (run_dir / "reports" / "steamdb-reservation-packages.tsv").read_text( + encoding="utf-8" + ) + self.assertIn( + "Steam Machine\t1629446\t27 April 2026 - 18:22:46 UTC\t35499151\t4165910:Steam Machine\tprivate_exists_only", + report, + ) + self.assertIn( + "Steam Frame\t1629484\t27 April 2026 - 18:21:50 UTC\t35499157\t4165890:Steam Frame\tprivate_exists_only", + report, + ) + + key_lines = (run_dir / "reports" / "steamdb-key-lines.txt").read_text( + encoding="utf-8" + ) + self.assertTrue(key_lines.startswith("Reservation package SteamDB snapshot:")) + self.assertIn("Steam Machine\t1629446", key_lines)