fix(proof): stage proxy model + holdout for live score - #234
Conversation
|
@greptileai review |
Greptile SummaryThe current revision keeps live Proof scoring fail-closed when required staged proxy or holdout assets are unusable. It verifies holdout content integrity, stages proxy archives through temporary disk storage with cleanup, prevents proxy-archive creation when holdout packing fails, and requires the published scoring image to have no baked proxies. Confidence Score: 5/5Safe to merge. There are no outstanding findings. All previously reported issues are fully fixed in the current code: readiness rejects empty or invalid staged assets; holdout shards are verified against their expected content hashes before packing; proxy archives are staged from bounded temporary storage and cleaned up; holdout packing occurs before proxy archive creation; and the publishing workflow requires the baked-proxy manifest to be empty. Files Needing Attention: None. Reviews (4): Last reviewed commit: "test(proof): assert no proxy tar on hash..." | Re-trigger Greptile |
Drop the invalid Qwen/Qwen3.8-0.6B HF default and require PROOF_PROXY_MODEL_DIR plus PROOF_HOLDOUT_STORE so harvest can score without a silent bad download or a baked holdout tree. Co-authored-by: Mathis <echobt@users.noreply.github.com>
b0e6337 to
861d8cc
Compare
ready() now proves the proxy archive can be created and holdout shards hash-match before can_score. pack_holdout_tar hashes shard bytes. Live score writes the proxy model to a temp tar and streams it over SSH with a size-based timeout. Publish requires baked_proxies.json == []. Co-authored-by: Mathis <echobt@users.noreply.github.com>
|
@greptileai review |
Pack holdout shards before the model archive and attach ProxyTarGuard immediately after pack_proxy_tar so a missing or hash-invalid shard cannot leave a model-sized temp file on the control plane. Co-authored-by: Mathis <echobt@users.noreply.github.com>
Cover live_extras missing and hash-invalid shards so a holdout refuse cannot leave a proof-proxy* archive in temp. Co-authored-by: Mathis <echobt@users.noreply.github.com>
|
@greptileai review Re-trigger: head |
…235) Reland #232 onto current main. Under PROOF_FORCE_SIM, a sealed topic scores with sim_win_document (harness relative to the seal) so staging submit→score can clear a ~0.29 NLL floor. Skill-only sim_document stays NLL>=1.0. Lium path unchanged. Conflict resolution vs #234: keep ProxyModelMissing/HoldoutStoreMissing and live-asset notes; keep sim probe runbook. Cargo.lock regenerated incrementally for new test deps only. Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Mathis <echobt@users.noreply.github.com>
Summary
Prod live score on 2026-09-07 printed
PROOF_EVAL_OKthen refused in ~5–8s with:refused: no model: Qwen/Qwen3.8-0.6B is not a local folder and is not a valid model identifierThe pinned image (
ghcr.io/cortexlm/proof-eval@sha256:78b614a1…) has a correct entrypoint and marker, but:DEFAULT_PROXYwas the invalid HF idQwen/Qwen3.8-0.6B(typo;Qwen/Qwen3-0.6Bexists).proxy_model. Harvest only stagedrequest.json+teacher.envand never setPROOF_PROXY_MODEL_DIRor primedPROOF_HOLDOUT_STORE./opt/proof-eval/holdouttree, so the next refuse after a model would be missing holdout shards.This PR is the control-plane + eval-source fix. It does not re-pin a digest, publish an image from this agent, or touch deploy secrets.
Rebased onto
mainafter #233 (3422b186).crates/proof-harvest/src/lib.rskeeps both the #233stdout_tailwarn on a missingPROOF_EVAL_OKand this PR’s proxy/holdout staging.RLM judge vs eval proxy (do not conflate)
Staging RLM judge is now the Astra
InferenceOffer(cx/gpt-6-astra). That is the live judge backend harvested intoteacher.envas the API key +request.jsonoffer fields.Eval harness local
PROOF_PROXY_MODEL_DIRis miner/proxy measurement weights staged onto the pod. It is not the judge. Do not reintroduce Qwen/HF as the judge, and do not “fix” the typo default toQwen/Qwen3-0.6B.Choice: fail-closed, no HF fallback
We removed the HF default instead of correcting it to
Qwen/Qwen3-0.6B.A silent download of a real id would fight the pin (
proxy_model/proxy_modelsmust stay empty) and would still fail on a pod with no HF cache. Score now requires a local directory atPROOF_PROXY_MODEL_DIR.baked_proxies.jsonis[].selftestno longer demands a baked proxy.How live score gets model + holdout
deploy/env/proof-challenge.env.example):PROOF_PROXY_MODEL_DIR— local measurement weights (directory, not an HF id)PROOF_HOLDOUT_STORE— shard files named<content_sha256>(64 hex). This is notPROOF_HOLDOUT_FILE(the record catalog).proof-challengepasses those paths intoLiumProofHarvest.ready()/ score fail-closed if either path is missing or a named shard is absent (can_score=false/ submit 503, no rent).tar -cf -) and stages them under/tmp/proof_eval/{proxy,holdout}.teacher.envnow also exports:PROOF_PROXY_MODEL_DIR='/tmp/proof_eval/proxy'PROOF_HOLDOUT_STORE='/tmp/proof_eval/holdout'plus the existing judge key lines. The key still never enters
request.json.PROOF_FORCE_SIM/ StubWin / relative baseline (#232) are untouched.Operator must still do before the next 1× GPU rent
proof-evalvia the existing.github/workflows/publish-proof-eval-image.ymlpath (this PR only changes source + the publish job’s empty-bake checks). Do not invent a sha256.config/proof-pin.tomleval_image_digestto that published digest after the job is green. Keepproxy_model = ""/proxy_models = [].PROOF_PROXY_MODEL_DIR— real local weights the image canfrom_pretrainedPROOF_HOLDOUT_STORE/<content_sha256>— shard bytes matching the topic holdout recordssha256:78b614a1…expecting this source fix to apply; that digest still has the invalidDEFAULT_PROXY.No prod/staging deploy from this PR.
Files changed
eval/src/proof_eval/{contract,baked,harness,cli}.py+baked_proxies.json— empty bake, require local model direval/tests/test_contract.py— refuse missing model dir / missing holdout shardcrates/harvest-pod—RunExtras+stage_tree_cmd(tar extract under workdir)crates/proof-harvest— pack + stage proxy/holdout;teacher.envpaths; fail-closed ready; keeps fix(proof-harvest): log stdout_tail on PROOF_EVAL_OK refuse #233stdout_tailon refusecrates/proof-eval—ProxyModelMissing/HoldoutStoreMissingbins/proof-challenge—PROOF_PROXY_MODEL_DIR/PROOF_HOLDOUT_STORECLI/envdeploy/env/proof-challenge.env.example,docs/PROOF.md,docs/runbooks/staging-testnet-e2e.md,eval/README.md.github/workflows/publish-proof-eval-image.yml— stop grepping the typo id; pin snippet stays empty proxyGreptile
Every PR is reviewed by Greptile before merge. Config:
.greptile/.@greptileai reviewTest plan
cargo test -p harvest-pod -p proof-harvest -p proof-eval -p proof-challenge -p proof-challenge-bin --all-targetspython3 -m pytest eval/tests/test_contract.py(15 passed)cargo fmt --all -- --checkcargo clippy -p harvest-pod -p proof-harvest -p proof-eval -p proof-challenge -p proof-challenge-bin --all-targets -- -D warningscargo run -p xtask -- loc-capcargo run -p xtask -- external-docs-checkcargo test --workspace/ deny / remaining xtask gates in CIRisk
Live
can_scorestays false until the operator stages proxy dir + holdout store and a new proof-eval digest is published and pinned. That is fail-closed, not a silent HF download. NoBASE_*rename, no secrets, no emission/consensus change.Naming
I did not rename
BASE_*environment variables, deployed host paths(
/opt/base,/run/base, …), GHCRbaseintelligence/basepackage names, orbase-*-v1cryptographic domain tags, unless this PR’s purpose is a coordinatedcutover documented in
docs/NAMING.md.