尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Say what happened, not who you are. Zero-knowledge whistleblowing where Meta Muse turns scattered evidence into a cited, verified timeline.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Say what happened, not who you are.
Candor is a whistleblowing platform built on two promises that usually pull against each other: the person reporting reveals as little about themselves as possible, and the people reviewing get an account of what happened that they can actually trust. A twelve-stage pipeline on Muse Spark Open, Meta's open-weights model, turns scattered, redacted evidence into a cited timeline in which every sentence traces back to a verbatim source passage, with uncertainty and contradictions shown rather than smoothed over.
Tips are how most fraud is found: 43% of the 1,921 cases in the ACFE's 2024 Report to the Nations were detected by a tip, more than by any other method, and over half of those tips came from employees. Candor is built for those employees.
meta-models/muse-spark-open-1026 on Baseten) in 59 seconds for $0.16; the model
calls are committed as cassettes in services/pipeline/tests/cassettes/northwind and replay
exactly.| Page | What to look for |
|---|---|
/report/northwind-ethics | The reporter flow. Use test passport A, load the sample evidence, watch metadata get stripped from a real PDF and DOCX, toggle redactions, then seal. Every step shows its real timing. |
/console | Sign in as a reviewer, open the Northwind report, read the brief, follow any claim to its quote, open the evidence with a 2-of-3 quorum. |
/audit | Verify the transparency log yourself, then tamper with an entry and watch the proofs fail. |
/inbox | Read the reviewers' follow-up questions with the demo codename and reply anonymously. |
/architecture | Every mechanism, with diagrams, the threat model and the source file behind each claim. |
/evals | Leakage, grounding, timeline accuracy and invalid-output handling on synthetic evidence. |
PERSON_1, ORG_2), first-name linking, and a re-identification risk score that
also flags quasi-identifiers such as unique roles, small headcounts and exact times.A 12-stage DAG with explicit dependencies, streamed live to the reviewer:
| Stage | What it does |
|---|---|
segment | Splits documents into stable passage IDs (D2.P001) with offsets and hashes |
injection_scan | Heuristic and model checks for planted instructions; risky passages are quarantined and spotlighted with nonce delimiters |
extract | Three independent samples (self-consistency) of claims, each citing verbatim quotes |
consolidate | Clusters claims across samples; agreement becomes a confidence input |
ground | Verifies every quote verbatim against the source passage and records exact offsets |
verify | Judges each claim against its cited and neighbouring passages: supported, contradicted, unsupported |
temporal | Normalises time expressions to intervals and solves a simple temporal network; negative cycles (Floyd-Warshall bounds, Bellman-Ford extraction) become explicit timeline conflicts |
entities | Union-find over explicit placeholder equivalences, never over guessed identities |
contradictions | Pairs of claims that cannot both be true, with the passages that conflict |
calibrate | A documented logistic formula over grounding, agreement, verification and source type gives each claim a confidence and an evidence class: documented, corroborated allegation, allegation, contradicted, unsupported |
gaps | Follow-up questions for the reporter that never ask for identifying details |
brief | A summary in which every key point cites claims |
Every model call uses strict JSON Schema structured output, semantic validation and a bounded repair loop with salvage, so invalid model output degrades a stage instead of corrupting the result. Findings are sealed back to the reviewers.
The analysis endpoint is protected with x402: an unpaid request gets HTTP 402 with payment
requirements; the organisation retries with an X-PAYMENT header that a facilitator verifies and
settles. Payment records live in their own database and link to jobs only through a keyed HMAC.
Submissions, analyses, access requests, quorum approvals and unlocks are appended to an RFC 9162 Merkle transparency log with Ed25519 signed tree heads, inclusion and consistency proofs, and periodic anchoring of the root on-chain. Opening original evidence requires signed approvals from a quorum of reviewers, who re-seal their shares to the requester.
| Path | What |
|---|---|
apps/web | Next.js 16 app: reporter flow, reviewer console, inbox, audit, evals, architecture |
services/identity | Hono service: Self verification, nullifier quota, RFC 9474 blind signing |
services/api | FastAPI: submissions, x402, job queue with leases and dead letters, SSE, quorum, inbox, transparency log |
services/pipeline | The 12-stage analysis DAG, providers (Meta, Fireworks, Baseten, Claude, Codex, replay, chaos, tap) and the pull worker |
services/evals | Synthetic scenarios with ground truth, metrics and the provider benchmark |
packages/crypto | Browser and Node crypto: envelopes, Shamir, blind tokens, codenames, Merkle proofs |
packages/privacy | Metadata stripping, PII detection, pseudonymisation, leakage scoring |
packages/sdk | Typed client and submission builder used by the web app and the demo seeder |
infra/modal | Modal app: API, identity, analysis workers, scheduled evals |
docs/specs | The contracts between services, including exact wire formats and test vectors |
Python and TypeScript interoperate through shared test vectors generated with PyNaCl
(docs/specs/vectors/protocol-vectors.json) that both sides must pass.
Requirements: Node 22+, pnpm 10, Python 3.12+ and uv.
pnpm install
pnpm seed
pnpm dev
pnpm dev starts identity (8787), the API (8000), the analysis worker and the web app (3000). With
no NEXT_PUBLIC_API_URL the web app runs in showcase mode with recorded data.
The pipeline uses Muse Spark Open on Baseten whenever BASETEN_API_KEY is set (the hackathon key
only serves meta-models/muse-spark-open-1026), then Muse Spark on the Meta Model API
(MODEL_API_KEY), then Muse Spark Open on Fireworks (FIREWORKS_API_KEY). Without any of those it
falls back to Claude Haiku 5.5, through the Anthropic API when ANTHROPIC_API_KEY is set and a
signed-in Claude Code CLI otherwise, so a local run needs no key.
CANDOR_LLM_PROVIDER (baseten, meta, fireworks, claude, codex or replay) overrides the
choice, and services/pipeline/router.json, when present, routes individual stages.
One command runs the six-case evaluation on whichever Muse host has a key, records every model call
in services/evals/cassettes/<host>-<model>, then benchmarks each Muse host against Claude Haiku
5.5 per stage and regenerates the router and the /evals data:
pnpm meta
pnpm meta evals or pnpm meta bench --repeats 1 runs one half. Providers without credentials are
listed as skipped rather than guessed.
The numbers on /evals come from a Muse Spark Open run whose 114 model calls are committed in
services/evals/cassettes/baseten-muse-spark-open-1026 and cost $1.88. This reproduces them
exactly, offline and without a key:
CANDOR_REPLAY_DIR=services/evals/cassettes/baseten-muse-spark-open-1026 uv run --project services/evals candor-evals run --provider replay --chaos 0.3 --no-publish
services/evals/cassettes/claude-haiku-5-5 keeps the earlier Claude Haiku 5.5 run (commit
af32e7b) for comparison.
pnpm check
runs Prettier, ESLint (including a rule that forbids comments), TypeScript, Vitest, Ruff, a Python comment and docstring checker, and pytest for every service.