尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Moved out of Ruflo monorepo
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗One focused debate. One clear weakness. One immediate repair. One measurable improvement over time.
Daily Debate is a daily reasoning trainer built around one loop:
Guests get the same loop without an account: today's motion against the live AI opponent (the transcript goes to the AI provider only to write its replies and is not stored), or a guided case that never leaves the device. Feedback, repair and retest checks are deterministic and local either way.
Practice quality beats practice volume. The product deliberately optimises the
smallest complete loop and measures whether it works before adding anything
else. Validation is published, not implied: as of the latest benchmark run no
benchmarked judge clears the quality gates (Groq, Cerebras and Gemini have no
benchmark row yet), so every training-loop number is unvalidated
and competitive claims stay behind eloGate — see
docs/status.md for the honest numbers and
docs/roadmap.md for what is active (proving the loop) versus
parked (corpus, benchmarks, classrooms, tournaments, ranked play).
Next.js (App Router) + a repository-owned Postgres/auth backend + free-tier AI only: the opponent, summaries, topics and PvP judge run over OpenAI-compatible free tiers (UnoRouter → Groq → Cerebras → Gemini → NVIDIA → OpenRouter). Each call fails over model by model and then provider by provider until one returns a schema-valid answer, so a rate-limited free tier does not take the product down. There is no paid provider. The app talks to standard Postgres through the Neon serverless driver.
npm install, copy .env.example to .env.local, and set DATABASE_URL plus at least one AI provider key. Configure the password-reset email variables before relying on account recovery.npm run db:migrate && npm run dev.The Vercel project must point its Root Directory at the repository root (this is a standalone repo) with the framework preset left on Next.js.
Requests run through the Next.js 16 proxy in src/proxy.ts. The proxy only checks for the app's signed-in session cookie; it performs no database or third-party network work, so a backend outage cannot crash Vercel Routing Middleware. Without DATABASE_URL, / remains available in guest mode, /login explains that sign-in is unavailable, and protected pages redirect there.
Previews must never share the production database. Scope DATABASE_URL to Production only; point Preview (and local Development) at their own database — the Vercel–Neon integration can create a Neon branch per preview automatically, or set a dedicated DATABASE_URL override for the Preview environment. Sharing one URL across environments lets a preview build run migrations against production and leak preview writes into prod data. Redeploy after setting variables:
| Variable | Required | Notes |
|---|---|---|
DATABASE_URL | yes | Server-only pooled Postgres connection string. Never expose it with a NEXT_PUBLIC_ prefix. |
UNOROUTER_API_KEY / GROQ_API_KEY / CEREBRAS_API_KEY / GEMINI_API_KEY / NVIDIA_API_KEY / OPENROUTER_API_KEY | at least one (production) | Free-tier AI providers, tried in that order. Set as many as you can: each extra key is another fallback when a free tier is rate-limited. With none, solo debates, PvP judging and daily topics show an explicit "AI unavailable" state (daily topics fall back to the curated bank). <LABEL>_DISABLED=1 removes one without deleting its key. |
<LABEL>_MODEL / <LABEL>_FALLBACK_MODELS | optional | Per-provider model chain (e.g. GROQ_MODEL). Defaults and priority order live in config/ai-providers.json, shared by the app, the benchmark and topic generation. Free rosters change often; override when a provider retires a default. A provider that answers 429 is skipped by later requests until its Retry-After passes. The model that actually served is stamped into every verdict. |
AI_DAILY_SPEND_CAP_USD | optional | Daily AI spend cap, default 10; off disables. When hit: opponent/judge degrade to an explicit retryable unavailable state (never silent). |
AI_SPEND_UNCOSTED_CALL_USD | optional | Declared charge for each call with no recorded cost (classifier.dev), default 0.02. Free-tier provider calls are logged at $0 unless the provider reports a cost. |
GUEST_AI_DAILY_CALLS | optional | Global cap on live guest opponent calls per 24h, default 400 (each visitor is also limited to 8/day). GUEST_AI_DISABLED=1 keeps every guest on the guided case. |
NEXT_PUBLIC_VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY / VAPID_SUBJECT | optional | Web Push reminders. Generate with npx web-push generate-vapid-keys; subject is mailto: or https:. All three unset = no opt-in shown, nothing sent. |
PUSH_DISPATCH_SECRET | optional |
After setting DATABASE_URL, run npm run db:migrate locally against the same database before deploying authenticated features.
Deploys migrate themselves. Production builds run pending migrations before next build (see scripts/vercel-build.mjs); a failed migration fails the build so the previous deployment stays live. Preview builds skip migrations unless MIGRATE_ON_PREVIEW=1 is set for a preview-scoped database. Check ledger state any time with npm run db:status (non-zero exit while migrations are pending); npm run db:policy enforces the expand/contract rule (destructive SQL needs a -- destructive-ok: <reason> marker).
npm test — unit + regression suite (fully offline; DB invariant tests also run when TEST_DATABASE_URL is set).npm run test:e2e — Playwright against an ephemeral Postgres with E2E_MOCK_AI=1; includes PvP, full-debate, and the Sprint → weakness → repair loop.npm run benchmark:judges — live-model judge benchmark (weekly in CI).| File | Contents |
|---|---|
| docs/status.md | Feature status with honest labels, validation notice, capability map, model-call costs |
| docs/product.md | The daily loop, Sprint vs Full, coaching goal, repair, screen-by-screen hierarchy |
| docs/judging.md | Argument graph, observable assessment, scoring policy, judge ensemble + invariance |
| docs/evidence.md | Source grounding, citation verification, quote + claim-to-source matching |
| docs/validation.md | Measurement honesty, confidence labels, benchmarks, corpus, what stays provisional |
| docs/architecture.md | Pipeline, data model, reliability, security, testing |
| docs/roadmap.md | Prove-the-loop scorecard, active backlog, parked surfaces, gating rule |
≥32 characters; protects POST /api/push/dispatch. Set the same value as the PUSH_DISPATCH_SECRET repository secret; the hourly push-dispatch workflow calls the URL in the PROD_HEALTH_URL variable. |
CLASSIFIER_DEV_ENABLED | optional | 1 sends argument texts to classifier.dev. Default off everywhere until the service is disclosed in the privacy policy. |
NEXT_PUBLIC_EXPERIMENTAL_SURFACES | optional | 1 re-enables the parked surfaces in navigation (PvP, friend challenges, voice input, corpus-validation pages). Default off — see docs/status.md. |
OPENROUTER_MODEL | optional | Defaults to nvidia/nemotron-3-super-120b-a12b:free. |
OPENROUTER_FALLBACK_MODELS | optional | Comma-separated failover chain. Defaults to free Nemotron 3 Super then Ultra. Empty string pins to one model. |
CORPUS_ADMIN_EMAILS | optional | Leave unset to keep the corpus endpoints closed. |
RESEND_API_KEY | required for password reset | Server-only Resend API key. Reset requests report the service unavailable when email delivery is not configured. |
PASSWORD_RESET_FROM | required for password reset | Verified sender, for example Daily Debate <[email protected]>. |
APP_BASE_URL | recommended | Canonical public origin used in reset links, for example https://debate.example.com. Vercel production URL is used as a fallback. |