First-principles rebuttal generator. Paste any article URL, get a structured response that includes:
Readers often struggle to critically evaluate articles and arguments, getting swept along by rhetorical posturing rather than engaging with the core claims.
truthseeker provides a structured analysis of articles, separating claims and providing context, to help readers engage with the argument's load-bearing parts.
truthseeker fights the surrender to consensus framing by surfacing the structure of an argument, allowing readers to engage with the load-bearing parts and ignore the rhetorical scaffolding.
To become a comprehensive tool for critical thinking, providing in-depth analysis of articles, speeches, and videos, and promoting a deeper understanding of the arguments presented.
The stack has not been written down yet.
Investigate this project with Loki →Diagnosed and repaired the state that made the last two runs time out — primary checkout stranded on merged branch ci/pat-rationale with main held by the stale ssrf worktree — by removing six clean merged worktrees, moving the checkout to main (cd3c289, #47), deleting nine merged local branches, and re-running install plus the full verify bundle green (77/77 tests); then re-confirmed live that the Groq key is still 401-rejected and annotated the blocker a fifth time.
Fast-forwarded local main to origin (40fc184), resynced dependencies under pnpm following the #40 migration, re-verified the whole bundle green (prettier + eslint + tsc + 52/52 tests), and re-confirmed live — not from a cached report — that the Groq key is still 401-rejected, annotating the blocker with a fourth confirmation plus a correction that the unblock command is now `pnpm run analyze`.
Re-verified full clean state (tsc/lint/tests all pass, 0 TODOs, tree clean at 40fc184, no pending blocker file) — nothing changed since the last run, which already reached the same awaiting_user conclusion.
Ran full verification (pnpm run verify: format/lint/typecheck/test all clean) plus pnpm audit and a targeted code scan of the analysis pipeline (src/lib/analysis.ts, src/app/api/analyze/route.ts) for silent failures or half-wired flows — found none; the two recent dep-bump/pnpm-migration commits (#40-#42) left the repo fully green and docs (README) already consistent with pnpm. No T0/T1, no uncommitted work, no pending blocker file, 0 TODOs. Per the stop-brake rule, did not manufacture T2 busywork.
Confirmed PR #13 (the npmrc fix) is merged into main; fast-forwarded local main to origin/main (27 commits, f4a43a6..615b28f), reinstalled deps clean, and re-ran the full verify suite (tsc clean, lint clean, 52/52 tests). Live-verified `npm run analyze` against a real URL — the core analysis feature works end-to-end (full structured critique returned in ~4.5s), which contradicts the 2026-09-03 handoff's claim that GROQ_API_KEY was still 401-rejected; that blocker is not open. CI on main is green (last 5 runs all success). No T0/T1 found: no type errors, no lint errors, no uncommitted work, no pending blocker file, no TODO/FIXME/HACK in src/, health-check wiring (src/app/api/health, src/lib/health.ts) is sound. Logged findings under "## Proposed" in the roadmap file (stale-blocker correction + the one open T2 + the two non-autopilot open questions: deploy go-ahead, biaslens convergence).
Re-verified live (not from a cached report) that the Groq key is still 401-rejected and unchanged, then fast-forwarded local main to origin (TypeScript 6, #37), reinstalled deps against the new lockfile, and re-confirmed tsc/lint/52 tests all green on the upgraded toolchain before annotating the blocker with a third confirmation.
Re-verified the Groq key is still rejected live (not a stale report), then fast-forwarded local main to match origin (7 already-merged dependabot/CI commits) and ran npm ci to fix the resulting node_modules/lockfile drift (vitest 3.2.7 -> 4.1.11), re-confirming tsc/lint/tests all green afterward.
Re-verified the Groq 401 is still live rather than re-reporting a stale file, and cleared a latent supply-chain hazard the org rename left behind — package.json/lockfile/README still fetched ai-kit from the retired `catomean` org via a GitHub 301 redirect, which installs fine until that name is reclaimed and then breaks `npm ci` everywhere at once; repointed to `bitbaum` (v0.4.0 = the same pinned sha 44f6bcaa, proven by a clean npm ci) and un-diverged local main, which held an unpushed commit that would have reverted the bitbaum/fleet sweep migration from #22/#23.
Awaiting CI on PR #24 (ai-kit dependency repointed from the retired catomean org to bitbaum); local main un-diverged.
Ran the product live for the first time since the #16 model-rot repair and found truthseeker is down — Groq answers HTTP 401 "Invalid API Key" — then fixed the two defects that failure exposed: the walk asked a second model at a vendor that had already refused the shared key, and reported "chain exhausted … HTTP 401", which reads as a vendor outage rather than "your credential was refused"; 401/403 is now a vendor-level verdict that skips that vendor's remaining links while still crossing to the next vendor, and the error names the rejected key plus the unconfigured vendors the chain could reach, with 5 tests added (3 fail against the pre-fix llm.ts, 2 exist to fail if the skip is ever widened past auth).
Finished the #16 multi-vendor migration at its one unmigrated call site — scripts/analyze-cli.ts still exited 1 on a missing GROQ_API_KEY, so an OPENROUTER_API_KEY-only environment that the HTTP route serves fine (5 usable links) was refused at the CLI door, which matters because the CLI is the only way to use this project today; the preflight now asks lib/llm's exported configuredLinks()/noProviderMessage(), both derived from the chain, and the same stale single-vendor claim was corrected in README (which still advertised the retired llama-3.3-70b-versatile), .env.example, and .gitignore (Next.js's default .env* had kept .env.example out of every clone), with 5 tests added including a seam gate that fails if analyze-cli.ts ever names an *_API_KEY itself.
Fixed the paste fallback destroying the pasted article body on submit — the only path into the app for bot-gated sources (Republik, paywalls) made the app's own "usually fixed by retrying" advice impossible to follow, because every transient failure (non-JSON completion, chain exhaustion, 502, dropped connection) came back with an empty textarea; the URL is now stored with the text in src/lib/pasted-body.ts, which makes both this bug and the stale-paste bug #11 fixed unrepresentable, with 7 pure tests guarding a rule that has now been got wrong twice in opposite directions.
Replaced article-fetch's hand-copied entity table with `entities`' decodeHTML — German named entities (ä/ü/ß), all hex escapes ('), astral code points and a double-decode ordering bug were silently corrupting both the LLM prompt and the on-screen title; added 14 regression tests (8 of which fail against the old decoder) and landed the day-old stranded .gitignore branch that had been pushed without a PR.
Found and fixed the root cause of the last two timeouts — this box's global npm config sets `omit=dev`, so plain `npm install`/`npm ci` here silently skipped vitest/eslint/typescript, breaking `npm run verify` and causing repeated slow reinstall attempts that collided with shared registry congestion; added a project-local `.npmrc` (`include=dev`), verified a clean install now pulls devDependencies and `npm run verify` passes (lint clean, tsc clean, 6/6 tests), and opened PR #13 (fix/npmrc-include-dev) against main.
Diagnosed the two consecutive run timeouts as the autopilot loop re-firing into a project with no actionable work; re-verified main is fully green (lint/tsc clean, 6/6 tests, clean tree, 0 TODOs) and engaged the Stop brake instead of inventing T2 churn.
Fixed a second correctness bug (rule 8) found by targeted backend scan: fetchArticle() decoded HTML entities in the article body but never in the title, so any title with an ampersand, curly quote, or en/em-dash (most professionally-published articles) leaked raw entity codes (e.g. "What’s Next?") straight into the LLM prompt, the API response, and the UI. One-line fix applying the existing decodeEntities() to the title; verified with a traced repro. Merged via PR #12 (f4a43a6) on main.
Fixed a correctness bug (rule 8) where the paste-text fallback never cleared, so a stale paste from a previously-failed URL could silently be submitted and analyzed under an unrelated new URL with no indication it was stale; merged via PR #11 (be15c73) on main. Also resynced local node_modules (npm install), which had drifted from package-lock.json and was falsely failing tsc/test locally.
No action taken — re-verified tsc/lint clean and repo state unchanged since last run; loop-protection rule fired before task selection again.
No action taken — re-verified tsc/lint/build clean and repo state unchanged since last run; loop-protection rule fired before task selection again.
No action taken this turn — verified tsc and lint remain clean; loop-protection rule fired before task selection.