Repository navigation
fix(claims): two model families by default, live HAL badge, narrowed zkRepID copy, credits (MEDIUM for the voter default, LOW otherwise) - #1462
Conversation
…zkRepID copy, credits (MEDIUM for the voter default, LOW otherwise) - /classify's default voter pair is now always gpt-oss on Groq + qwen on Cerebras. With no Cerebras key the old default was gpt-oss x2, one family, which S47 already forced to not-checked. A missing key now fails closed or hands the slot to a canary-ready stand-in of another family. tests/classify-two-families-default.test.ts: 8/10 fail on main, 10/10 here. - README: the static "HAL: live" badge becomes two shields.io badges reading /api/v1/hal/stats; tests/readme-claims.test.ts pins the fields to the route. - "Independent" checkers become "different model families" in README, docs, the Telegram bot replies and HAL's decision_reason text (Kim et al., ICML 2025, arXiv 2506.07962: errors correlate across families too). - zkRepID: "checkable without revealing it" becomes a range proof with the score public, in README, both demos, a VERIFIED CLAIM_LEDGER row and docs. - Credits for Plonky3, x402, TruthfulQA, FEVER (CC BY-SA 3.0) and HaluEval, each licence read at source; MIT note for contracts/RepIDStaking.sol; hub blurb; CLAUDE.md no longer calls the Apache-2.0 code proprietary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Strix Security Review✅ No open security findings. PR summary: This PR is a claims-honesty sweep: it changes the default `/classify` voter pair to always be two model families (Groq gpt-oss + Cerebras qwen) instead of falling back to two Groq gpt-oss models, and rewrites README, docs, comments and user-facing copy to stop calling the checkers "independent", stop claiming the zkRepID proof hides the score, add a live HAL badge, add a credits/licence section, and pin the corrected claims with new tests. Review summaryReviewed all 27 changed files in the diff. The only behavioural change is in Review 1 on this PR · Reviewed by Strix |
There was a problem hiding this comment.
Reviewed all 27 changed files in the diff. The only behavioural change is in src/classify/free-votes.ts: activeVoters/parseVoters now always default to the two-family pair (Groq gpt-oss + Cerebras qwen) and the one-family DEFAULT_VOTERS constant is removed. I traced the classification path end to end (including THE FALLBACK and the final oneFamily gate) and the two-family guarantee still holds — with no Cerebras key the empty slot abstains no_key, stand-ins are excluded by family and by already-asked host, and a label of pass/veto still requires two deciders on different hosts of different families. Every other change is comment, documentation, marketing copy, demo output, or test code, and no authentication, validation, cryptographic, or data-handling control is added or removed. No security vulnerabilities found in the changed code.
Reviewed by Strix
Configure security review settings
Repo-alignment sprint (approved by Sean, 2026-10-23): make this repo's public claims true, code first, copy narrowed only where code can't fix it in about two days. One PR.
Weight. Item 2, the change to the default pair of
/classifyvoters, is MEDIUM: it changes live behaviour, but only on a deployment with no Cerebras key. Production has the key, so production keeps the same pair (see the proof column). Everything else is LOW: copy that narrows or corrects a claim, docs, tests.Code change (MEDIUM): the default checker pair is always two model families
src/classify/free-votes.ts. Before: with noCEREBRAS_API_KEY,activeVotersreturnedgpt-oss-120b+gpt-oss-20bon Groq, one family. S47 already made a one-family pair answernot-checkedevery time, so that default spent two calls on an answer that could never decide. A malformedCLASSIFY_VOTERSfell back to the same pair.After: the default is always
groq:openai/gpt-oss-120b+cerebras:qwen-3.8-27b, andparseVotersfalls back to it too. With no Cerebras key, that slot gives no answer (no_key, nothing sent). THE FALLBACK may then fill it with a canary-ready model of another family, and otherwise the label isnot-checked. The same-familyDEFAULT_VOTERSconstant is deleted, so every test that used it had to be looked at by hand rather than silently meaning something else.tests/classify-two-families-default.test.ts. On untouchedmain: 8 failed, 2 passed (the two Cerebras-keyed cases already held). On this branch: 10/10.CLASSIFY_VOTERSor add the Cerebras key, because they test those flows, not the default.Every changed claim
README.md:8GET /api/v1/hal/stats:last_24h_classificationsandquorum_health.answering_providerslast_24h_inferences: 0, 3 of 5 configured providers answering. shields.io rendered0and3from that endpoint.tests/readme-claims.test.tsfails if a badge reads a fieldsrc/routes/hal-stats.tsdoes not return. No code was needed: the public stats JSON already existed.src/classify/free-votes.tsnot-checkedunless a canary-ready stand-in of another family answers/api/v1/classify/statslistsgroq:openai/gpt-oss-120bandcerebras:qwen-3.8-27b, both canaryokat 2026-10-23 15:29Z.src/routes/telegram-public.ts(bot replies)replyFor, unchanged.src/hal/fact-check.tsdecision_reason/quorum_note(public API text)README.md:63repid_scorein the clear (src/zkp/proof-statement-guard.ts); the README's own table marks selective disclosure TARGET. Hiding the score needs a new circuit in the prover repo, so this is copy, not code.scripts/demo/trust-receipt.mjs:150,scripts/demo/trust-harness-e2e.mjs:238(demo output)CLAIM_LEDGER.md(a VERIFIED row, citeable externally)docs/AGENT-HARNESS-ADOPTION-PLAN.md:121,docs/ZKREPID.md:4, headers ofsrc/zkrepid/index.tsandsrc/zkrepid/boundary.tsREADME.mdEvaluation,docs/ARCHITECTURE.md,docs/HAL_TAMPERING_DETECTION.md,docs/RSI-ADOPTION-PLAN.md,eval/kernel/README.md,eval/candidates/README.mdtests/readme-claims.test.tsfails if the README calls the checkers independent again.README.mdtopsrc/config/prover.ts(every proof job in 30 days used the HyperDAG-core prover). "Test network only": the last real settlement in/api/v1/passport/trinity-shofet, tx0x7a713be1…caa056(2026-10-20), is on Base Sepolia (chain 84532) and returnsnullon Base mainnet [RPC lookup 2026-10-23]; thebaseentry insrc/config/network.tshas no registry addresses. The "Called by" list is not extended.README.mdnew Credits sectioncoinbase/x402Apache-2.0 and nowx402-foundation/x402Apache-2.0 (its README says the repo moved); TruthfulQA Apache-2.0, and our CSV is the same git blob as upstreamTruthfulQA.csv(4206d1e); FEVER CC BY-SA 3.0 (fever.ai dataset page); HaluEval MIT. Row counts fromeval/rigorous/rigorous-corpus-v1.jsonl: FEVER 100 (verbatim), HaluEval 100, TruthfulQA 90.zkp-vault/Cargo.tomlhasp3-poseidon2; no x402 package is imported anywhere insrc/orscripts/.README.mdCreditscontracts/RepIDStaking.solisSPDX-License-Identifier: MITinside an Apache-2.0 repo: noted, not relicensedCLAUDE.md:73,CLAUDE.md:96LICENSEandpackage.json; if proprietary was the intent, the licence is what would change, and that is Sean's callLICENSE,package.json"license": "Apache-2.0", README badge.README.mdLicenseLICENSEtext untouched.README.mdfootersrc/routes/telegram-public.tscommentVerification
npx tsc --noEmit: clean.npm run check: VERIFIED (check:named-env-vars).npm testlocally on Windows (2 workers): 12,048 passed, 156 failed in 19 suites. I classified every failing suite by running it on untouchedmain(fb1e350) in the same checkout:maintoo: ENV. The causes are the Windows-onlyERR_UNSUPPORTED_ESM_URL_SCHEME(384 hits), no reachable Supabase (fetch failed,ECONNREFUSED), and the missingbabybear-leafbinary.client-ip-limiters,kernel/cc1-kernel-fixesandverify-prooffailed under the full run ("Exceeded timeout of 5000 ms") and pass alone on this branch.fb1e350,readme-edgesfailed to load because of CRLF line endings: its parser wantsstraight after the code fence, and a Windowsautocrlfcheckout gives `. With LF endings, which is what CI gets, it passes 13/13 along withreadme-claims. Same onmain`.hal/fact-check,quorum-receipt-writer,zkrepid-boundary,readme-claims,repid-staking-access-control. That is 565/565 tests.tests/readme-claims.test.tsagainstmain's README: 4/4 fail; against this branch: 4/4 pass.Not changed, and why
/api/v1/hal/statsreports a failed count query as0(classifications.last_24h ?? 0), so on a DB error the new badge would show0, not "unknown". Fixing it changes a public field that trustrepid and hyperdag-landing read, so it is a follow-up, not a quiet edit here.independentFamilies,auditFamilyIndependence,HAL_STRICT_FAMILY_INDEPENDENCE, comments undersrc/hal/,src/providers/) are left as they are: renaming identifiers is a refactor, and those comments are not public claims.coinbase/x402, whose README now says it moved tox402-foundation/x402.components/compatibility-info.tsx,lib/glossary.ts,app/mission/page.tsx,public/llms.txt). Another repo, so not touched here.🤖 Generated with Claude Code