M3 — mass collection — user-verification, captured on the podman runner

Provenance: the raw output below is the run's own artifact, downloaded from the workflow run — user-verify.log and diag.log, plus the PNGs the browser driver captured. Nothing here is retyped. The PNGs are the artifact's bytes, sha-identical to those committed under the wiki's M3-podman-verification/.

The run

Workflow: user-verification (podman) — job user-verification (podman container)
Run: 37971211444 — completed / success
Commit: 8afeb04 (branch feat/m3-mass-collection); CI on the same SHA: success
Runner kind: podman-runner (disposable container, headless chromium)
Artifact: user-verification-podman

This is not the milestone's CIHOST run (that one is the yc VM): the Yandex Cloud folder refuses VM allocation (quota, POST /instances → 429 Resource allocation is restricted), so the same layer was run on the disposable podman container instead. The two stopgap steps the layer needs there name both the add-issue and the removal-issue they are paired with: the browser driver (preinstall#105 ↔ #106) and — since the snap cannot be built on this image — the store (preinstall#107 ↔ #108, the pinned v26.9.12.8-stable the snap ships). No continue-on-error anywhere.

What the run shows

M3 layer — the collection store beside the source's own view

the live Polymarket page for the recorded token, captured by the layer's browser
The source's own view at the recorded moment — the market's live page, captured by the layer's browser (HTTP 200, not the site's 404).

M2 layer — the recorded table beside the sources' own views

the live Polymarket page for the M2 token at T
Market half — the Polymarket page for the token at T.
the live text source's own view at T
Text half — the live text source's own view at T (the source's own JSON answer, no longer a blank canvas).

Raw output — the run's own log

Full user-verify.log (raw file):

== deploy: the declared stack and the ClickHouse contour ==
Downloading https://services.gradle.org/distributions/gradle-8.14.4-bin.zip
.............10%.............20%.............30%.............40%.............50%.............60%.............70%.............80%.............90%..............100%
== deploy: the declared stack and the ClickHouse contour ==
kotlin      : 2.4.20
jvm         : 21.0.12.1
jvm_vendor  : Eclipse Adoptium
gradle      : 8.14.4
koin        : 4.0.0
clickhouse  : server 24.8 (compose.local.yml)
store_url   : http://127.0.0.1:8123
select1     : 1
schema      : recording + recording_header ensured
deploy: OK
load-fixture: 22 rows into 'recording' (1077937940350992…)
== user verification: khl-sib-sal-2026-10-07 ==
moment T      : 2026-10-09T18:13:13Z
market page   : https://polymarket.com/event/khl-sib-sal-2026-10-07
source view   : thesportsdb-khl (https://www.thesportsdb.com/api/v1/json/3/livescore.php?s=Ice%20Hockey)
-- market half --
  table : token=10779379403509928208771740072565882868916750118110564166010793647890848906146  price=0.001
  page  : Skip to main content How it works Log in Sign up Trending Combos Perps Breaking New Politics Sports Crypto Esports Iran Finance Geopolitics Tech Culture Economy Weather Mentions Elections Art More Live Futures ALL SPORTS NFL MLB College Football UFC UEFA Champions League UEFA Nations League Soccer Tennis Cricket Basketball Baseball Football Hockey All NHL Czech Extraliga DEL Liiga KHL National League AHL SHL Champions Hockey League Rugby Aussie Rules Table Tennis Darts Handball Golf Combat Motorsports Cycling Chess Pickleball Esports Sports · KHL Sibir Novosibirsk – Salavat Yulaev Ufa Sibir 0 
  shot  : user-verification/khl-sib-sal-2026-10-07.market.png  (HTTP 200)
-- text half --
  table : Russian KHL | Sibir Novosibirsk 4-5 Salavat Yulaev Ufa | 2
  view  : Russian KHL | Sibir Novosibirsk 4-5 Salavat Yulaev Ufa
  shot  : user-verification/khl-sib-sal-2026-10-07.text.png  (HTTP 200)
-- field-for-field --
  match  market.identity  the recorded token is the market the page is for
  match  market.price     the table's price beside the page at T
  match  text.score       the score in the source's view is the score in the recorded line
  match  market.page      the page is the market, not the site's 404
  match  market.shot      the captured page is not a blank image
  match  text.shot        the captured source view is not a blank image
user-verify: OK
load-fixture: 364 order-book rows, 180 trades into 'order_book'/'trade'
load-fixture: events will-shakhtar-donetsk-win-the-2026-27-uefa-champions-league-championship-20260701202025578,will-elise-stefanik-win-the-2028-republican-presidential-nomination,will-bernie-sanders-win-the-2028-democratic-presidential-nomination-879,will-the-iranian-regime-fall-by-the-end-of-2026
== M3 user verification: the collection store beside the source's own view, field for field ==
event        : will-shakhtar-donetsk-win-the-2026-27-uefa-champions-league-championship-20260701202025578
market       : will-shakhtar-donetsk-win-the-2026-27-uefa-champions-league-championship-20260701202025578
question     : Will Shakhtar Donetsk win the 2026-27 UEFA Champions League Championship?
token        : 33339798372916037220786136133406478491116150628220441951753426683441228279665
moment T     : 2026-10-07T21:34:39Z
window       : ±10s
source page  : https://polymarket.com/market/will-shakhtar-donetsk-win-the-2026-27-uefa-champions-league-championship-20260701202025578
store        : http://127.0.0.1:8123
counts       : order_book=180 trade=179
-- store, order book at T --
  recv_time  : 2026-10-07T21:34:38Z
  best_bid   : 0.001
  best_ask   : 0.002
-- store, trades around T --
  2026-10-07T21:34:29Z  price=0.002  size=5  side=BUY
  2026-10-07T21:34:30Z  price=0.002  size=5  side=BUY
  2026-10-07T21:34:31Z  price=0.002  size=5  side=BUY
-- source's own record at T (the market's published price history) --
  price at T : 0.0015  (t=2026-10-07T21:34:24Z)
source shot  : user-verification/will-shakhtar-donetsk-win-the-2026-27-uefa-champions-league-championship-20260701202025578.market.png
-- field-for-field --
  match  market.page    HTTP 200, 404=false, names[Shakhtar,Donetsk]=true
  match  market.shot    non-white 12.69% (a blank capture is not evidence)
  match  orderbook.at_T store mid=0.0015 source=0.0015 drift=0 (tick 0.001)
  match  trades.at_T    store trades around T=20, all within [0.001,0.002]=true
user-verify-m3: OK

Raw output — the environment diagnosis

Full diag.log (raw file):

user        : uid=1002(runner) gid=1002(runner) groups=1002(runner)
HOME        : /home/runner
PATH        : /home/runner/.ghsetup/v1/bin:/home/runner/.local/bin:/home/tools/tools/v1/bin:/home/runner/.local/bin:/opt/toolset/current/bin:/opt/toolset/bin:/home/dev/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
have node               /home/tools/tools/v1/bin/node
have npm                /home/tools/tools/v1/bin/npm
have npx                /home/tools/tools/v1/bin/npx
have java               /home/tools/tools/v1/bin/java
have javac              /home/tools/tools/v1/bin/javac
have gradle             MISSING
have podman             MISSING
have clickhouse         MISSING
have clickhouse-server  MISSING
have curl               /usr/bin/curl
have getent             /usr/bin/getent
have python3            /home/tools/tools/v1/bin/python3
have apt-get            /usr/bin/apt-get
have sudo               MISSING
node -v     : v24.21.0
java        : openjdk version "21.0.12.1" 2026-08-18 LTS
-- /opt/toolset --
total 8
drwxr-xr-x 2 dev  dev  4096 Sep 29 18:52 .
drwxr-xr-x 7 root root 4096 Sep 30 16:33 ..
-- /opt/toolset/current/bin --
ls: cannot access '/opt/toolset/current/bin': No such file or directory
-- HOME/.config/toolssetup/env.sh --
# toolssetup v1 mounted from /home/tools/tools
# Generated by toolssetup/mount.sh. Source it, or let ~/.bashrc source it.
export TOOLSSETUP_ROOT="/home/tools/tools"
export TOOLSSETUP_VERSION="v1"
export TOOLSSETUP_PREFIX="/home/tools/tools/v1"
export PATH="/home/tools/tools/v1/bin:$HOME/.local/bin:$PATH"
# python: the interpreter is read-only in the shared root; caches and venvs are the account's
export UV_CACHE_DIR="$HOME/.cache/toolssetup/uv"
export PIP_CACHE_DIR="$HOME/.cache/toolssetup/pip"
# node/npm: the npm cache and the global prefix are the account's, so
# `npm i -g` never tries to write into the sealed toolset
export npm_config_cache="$HOME/.cache/toolssetup/npm"
export npm_config_prefix="$HOME/.local"
# go: modules and the build cache live in the account's home
export GOPATH="$HOME/go"
export GOMODCACHE="$HOME/go/pkg/mod"
export GOCACHE="$HOME/.cache/toolssetup/go-build"
export GOENV="$HOME/.config/go/env"
# rust: the toolchain is read-only in the shared root; the registry a build
# needs (`cargo`) stays in the account's home
export RUSTUP_HOME="/home/tools/tools/v1/store/rust/rustup"
export CARGO_HOME="$HOME/.cargo"
export JAVA_HOME="/home/tools/tools/v1/store/java/21.0.12.1+1/jdk-21.0.12.1+1"
export KOTLIN_HOME="/home/tools/tools/v1/store/kotlin/2.4.20/kotlinc"
export SCALA_HOME="/home/tools/tools/v1/store/scala/3.9.0/scala3-3.9.0/bin"

What this run does not cover

Links