All projects

Truthseeker

First-principles rebuttal generator. Paste any article URL, get a structured response that includes:

Not running yet

Problem

Readers often struggle to critically evaluate articles and arguments, getting swept along by rhetorical posturing rather than engaging with the core claims.

Solution

truthseeker provides a structured analysis of articles, separating claims and providing context, to help readers engage with the argument's load-bearing parts.

Mission

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.

Vision

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.

Technical context

The stack has not been written down yet.

Investigate this project with Loki →

Sign in to ask about architecture, evidence, delivery risks and next steps in your workspace.

Changelog

  1. September 11, 2026

    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.

  2. September 7, 2026

    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`.

  3. September 6, 2026

    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.

  4. September 5, 2026

    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.

  5. September 4, 2026

    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).

  6. September 2, 2026

    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.

  7. August 31, 2026

    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.

  8. August 29, 2026

    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.

  9. August 29, 2026

    Awaiting CI on PR #24 (ai-kit dependency repointed from the retired catomean org to bitbaum); local main un-diverged.

  10. August 27, 2026

    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).

  11. August 27, 2026

    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.

  12. August 27, 2026

    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.

  13. August 25, 2026

    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.

  14. August 23, 2026

    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.

  15. August 21, 2026

    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.

  16. August 18, 2026

    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.

  17. August 18, 2026

    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.

  18. August 14, 2026

    No action taken — re-verified tsc/lint clean and repo state unchanged since last run; loop-protection rule fired before task selection again.

  19. August 12, 2026

    No action taken — re-verified tsc/lint/build clean and repo state unchanged since last run; loop-protection rule fired before task selection again.

  20. August 10, 2026

    No action taken this turn — verified tsc and lint remain clean; loop-protection rule fired before task selection.

Roadmap and changelog come from this project's canonical development record, read October 29, 2026.