The Witness install command on /mcp never ran for anyone: it placed --header before the server name, and Claude Code's CLI declares that flag variadic, so it swallowed both the name and the URL and died with error: missing required argument 'name'. Name and URL now come first and the header last — the order claude mcp add --help itself demonstrates — verified end to end against CLI 2.1.247. The Oracle snippet was never affected; it carries no header.
A running log of non-trivial changes, maintained by contributors.
The MCP endpoints moved onto World Machines hostnames: the Oracle is now oracle.worldmachines.org/mcp and the gated Witness witness.worldmachines.org/mcp, replacing the *.aneeshsathe.workers.dev URLs /mcp had been handing out for people to paste into their own client config — a personal subdomain that, once installed, sits in someone's setup indefinitely. The old hostnames still answer and every existing token keeps working, so nothing needs re-adding; only the copy-paste snippets changed. Prime Radiant made the same move the same day and now lives at primeradiant.worldmachines.org, with its old address redirecting.
Consolidated the crowded 11-link nav into five places — Theory, Library, Wiki, Ask, Club — each opening a second row on hover (desktop) or a chevron tap (touch), with zero JavaScript: pure CSS :hover/:focus-within/:target, keyboard- and 320px-safe. On wiki pages the wiki toolbar simply *is* the Wiki group standing open, so there's one bar and one row everywhere. build.py now owns the hand-written nav copies (syncstaticnavs()) — they had quietly drifted into four different versions. Also gated /wiki* behind member login for now.
Rebuilt /wiki from a rendered folder tree into a concept-first knowledge space. The decisive find: 394 of its 713 "dangling" link targets — 3,734 occurrences, two-thirds of the corpus's connective tissue — were mere case/punctuation variants of notes that exist, so link resolution now runs in tiers (exact → glossary alias → unambiguous normalised slug → red link), with every normalised match listed on /wiki/loose-links for tightening at source. New surfaces: hub concepts ranked by inbound links, tag-derived topic pages, a wanted-pages worklist (the 313 titles the club keeps naming but never wrote, each with a start-this-note link), orphans, recent changes, and client-side search — resolved links 6,409 → 10,199, orphans 281 → 87, note URLs unchanged, and the incremental rebuild proven byte-equivalent to a full one by a committed verifier.
Scribe went live: **scribe.worldmachines.org**, an installable phone-first PWA (behind its own Access application, JWT-verified) through which members capture thoughts, book notes, glossary entries and link-notes straight into their raw-notes/ directory as [trivial] commits — no git required. Access provisioning learned to split applications under Cloudflare's 5-destination-per-app cap, MCP joined the site navigation on every page (it was unreachable except by URL), Kyle's contribution-workflow docs merged (#37), and the July DNS-incident handoff PRs (#29, #31) closed as completed history.
Published raw-notes/ as a browsable wiki at /wiki/ — 999 notes indexed by contributor and by book, with resolved [[wiki-links]], backlinks ("linked from"), bylines and source-on-GitHub links on every page; dangling links render as muted text instead of dead hrefs, which is what 4,600 of the 11,000 links in the corpus currently are. Added a /wiki/glossary/ layer where members develop the club's own definitions (raw-notes/commons/glossary/, one term per file, status seed → developing → settled), seeded with *World Machine*, *Legibility* and *Psychohistory*. The generator (website/scripts/build_wiki.py, stdlib only) is deterministic and incremental: wiki-rebuild.yml diffs each push against its base and re-renders only the pages a note change actually invalidates (~0.1s for one note vs ~1s for all 1,000), so Pages re-uploads a handful of files rather than the whole tree.
Shipped member login and closed two auth holes. /api/admin/handles (the contributor registry, emails included) was reachable unauthenticated because the old Access policy covered /admin/* but not /api/admin/*; it now enforces an admin allowlist in-function, fail-closed. Worse, every member endpoint would also accept an email read from the *unverified* CFAuthorization cookie payload — a client-forgeable identity — so identity now flows through one shared library (functions/lib/access.js) that cryptographically verifies the Access JWT when ACCESSTEAMDOMAIN is configured. The Witness/MCP panel gains a real "Sign in" button, sign-out, and self-service token list/revoke; a new scripts/provision-access.mjs creates the members + admin Access applications idempotently from the command line.
Expanded the Evolution guide with a substantial Biology toolkit that teaches DNA, genes, traits, inheritance, populations, variation, selection, drift, and ancestry before the advanced material. Added /evolution/dennett, a wide-ranging 2026 companion to *Darwin’s Dangerous Idea* that connects contemporary evolutionary science with consciousness, agency, culture, AI, meaning, ethics, and a carefully sourced constellation of successors and critics—including explicit World Machines guardrails against historical fatalism and simplistic memetics.
Added **Evolution** to the site navigation and reshaped /evolution/ into an easy-to-browse field reference for the *Darwin’s Dangerous Idea* book club rather than a formal course. The new topic guide opens with a plain-language causal map, lets readers enter by question, moves technical model details behind optional disclosures, improves keyboard/mobile access, and retains simulations, a glossary, and expert sources for deeper dives.
Moved the worldmachines.org registration from Venkat's Cloudflare account to Aneesh's, completing the custom-domain cutover left pending since the July 16 bindings flip. The EPP auth-code route was a dead end — the domain was already at Cloudflare Registrar, so there was no registrar-to-registrar transfer to make and the zone could never leave pending in the receiving account; the working path is Cloudflare's inter-account transfer, which the *source* account initiates and the target accepts within five days. That move carries WHOIS contacts only, so the zone arrived holding stale A/AAAA records Cloudflare had auto-imported from Venkat's proxied DNS — all Cloudflare-owned IPs, which trips error 1000 and took the site down until they were deleted and the Pages custom domain provisioned its own proxied apex CNAME to worldmachines-2rd.pages.dev. Oracle, MCP, and every binding were unaffected: they already lived in Aneesh's account.
Updated the approval-policy workflow so website/ changes can be approved by **either** @aneeshsathe or @vgururao (previously @vgururao only), and added an author-bypass: because GitHub blocks a PR author from approving their own PR, an owner who *opens* a website/ or wiki/ PR now self-clears that gate — otherwise an owner could never merge their own gated PR. Reflects the stack's move to Aneesh's account while keeping Venkat as a co-owner of the site gate. (This PR itself still requires Venkat's approval, since it touches website/ under the current policy.)
Put the Oracle's running costs on the Oracle page. A collapsible "health stats" box above the chat reports questions answered and dollars spent, split web vs MCP, against the hourly/daily spend caps that keep a public Oracle affordable — served by a new /api/stats Pages Function proxying the Oracle worker. The meter fails soft by design: any upstream trouble hides the box entirely rather than showing a broken number, so the chat is never blocked by its own dashboard. Asking a question now refreshes the numbers, and hitting a spend cap returns a plain-language "try again later" instead of an HTTP error.
Consolidated the Oracle-page, MCP, and account-cutover work into one PR (supersedes #17, #20, #23). The Oracle at /oracle is now multi-turn chat with clean citations — [chunk:…] passages collapse into per-book "Sources" chips and concept [[…]] links become explorable buttons, so answers read as prose instead of raw tokens. Adds a public /mcp page (documenting the no-auth Oracle MCP + a gated Witness-token mint via /api/mcp-token, MCPTOKENS KV) and flips the Pages bindings back to Aneesh's account (HANDLES namespace + ORACLEURL → wm-oracle-dev.aneeshsathe.workers.dev); merging is itself the corrective cutover deploy. Also points the "Project Chat" nav link (every page + build.py's template) at the project Discord (discord.gg/tqUFztN3r) instead of the old Zulip server.
Completed the Oracle/Witness stack transfer from Aneesh's Cloudflare account to Venkat's, and reorganized all five project repos into a single worldmachines/ container folder (wm-site, wm-infra, wm-oracle, wm-encyclopedia-kb, wm-feeder). The full deploy: R2 buckets provisioned, catalog workers deployed via GitOps CI, 817 notes synced and embedded into both shared and personal DuckLake catalogs, Witness and Oracle workers stood up with fresh credentials, and PR #15 merged — bringing server-side /api/ask proxy, citation-enabled oracle.html, and the feeder ingest workflow. Oracle is now fully live on Venkat's account at worldmachines.org.
Embedding correctness fix for the Oracle preview: EmbeddingGemma's asymmetric prefixes are now applied on both sides — documents in the notes pipeline (title: … | text: …) and queries in /api/embed (task: search result | query: …). Until now both embedded bare text, costing retrieval quality. Merging triggers a full re-embed of the notes parquet (758 notes) via notes-ingest.yml. Part of the wm-encyclopedia-kb Oracle/Witness (ADR 0002) Phase 1 work.
Three things shipped today. (1) **Full-text library**: new worldmachines-library R2 bucket serves PDFs under public/ (open) and private/ (CF Access JWT gated); article JSON schema gained license and pdfkey fields; resources page shows download badges and dynamically loads a Team Library section for registered members. First document: Darnton's The Business of Enlightenment_ (CC BY), plus a companion supplement of all 1,197 French passages translated into English with page and chapter context (viewable at /supplements/business-of-enlightenment-translations). (2) **Self-service join flow**: CF Access can now be set to allow any email OTP; unregistered users who authenticate see a "not registered" panel redirecting to /join, where they submit a request that creates a GitHub issue with the exact wrangler kv approval command — one admin step instead of two. New /api/me endpoint provides consistent auth state across submit, profile, and library pages. (3) **ADR 0002** (PR #13) proposes how to ingest library books into the Oracle, pending Aneesh's input on retrieval quality tradeoffs.
Added a direct-push inbox flow for submitting new writing without going through the web form or a fork/merge. Contributors add lines to newwritinginbox.md in the repo root (handle | type | url) and push to main; a GitHub Actions workflow ingests the entries, clears the file, rebuilds the site, and deploys — same pipeline as the web form. Also populated the HANDLES KV with all contributor emails (several were missing due to the May 20 binding fix arriving after initial setup) and synced the Cloudflare Access allowlist to match.
Fixed a silent infrastructure breakage: the HANDLES KV binding had been dropped when Aneesh's Oracle commit introduced wrangler.jsonc on May 12, causing the contributors page, submit form, and admin UI to fail silently ever since. Fixed by adding the binding to wrangler.jsonc and manually writing the missing KV entry for Sean Stevenson. Added ARCHITECTURE.md as a full technical reference for the website stack (bindings, deployment, APIs, pipelines), and a proper README.md for the GitHub repo landing page.
Added rebuild.yml GitHub Actions workflow — pushes to devlog.md or blurbs.md now auto-rebuild and deploy the site, no manual build.py or wrangler step needed. Added session wrap-up checklist to CLAUDE.md and a security policy (no credentials in tracked files) to CONTRIBUTING.md. Opened issue #10 proposing wiki generation pipeline and browsing layer options.
Promoted Aneesh's Oracle preview to /oracle — the stub is now the live RAG interface. /notes redirects to /oracle. Oracle is public (no auth gate). Nav updated to include Devlog. Also merged PR #9 (Oracle infrastructure): created R2 bucket worldmachines-notes, applied Pages R2+AI bindings, set up CFAITOKEN/CFR2TOKEN GitHub secrets, ran first notes-ingest (743 notes embedded). Added two raw notes: Prime Radiant and Stigmergic-Verbose Cycle. Opened issue #10 proposing wiki generation pipeline.
Working Oracle preview at /notes: a personal-notes Parquet on R2 with EmbeddingGemma-300M vectors per row, in-browser DuckDB-WASM does cosine-similarity retrieval, Gemma-4-26B answers via a Pages Function — single-voice Oracle output, no citations. tools/notes-pipeline/ uv project builds the parquet (single- or multi-contributor mode). A new notes-ingest GitHub workflow rebuilds and uploads the parquet on every push to raw-notes/. ADR at wiki/decisions/0001-notes-oracle-architecture.md. Page is unlinked from site nav and not at /oracle — that stub stays until Venkat reviews.
Added a "Project Chat" link to the site nav pointing to the Zulip server (worldmachines.zulipchat.com), so contributors can find the chat from any page.
Governance and tooling session. Reviewed and merged Kyle's repo restructure PR; resolved a ruleset conflict where the hard PR-gate was blocking the ingest bot, settling on soft governance (CODEOWNERS and approval-policy workflow active but advisory). Added this devlog page and a devlog-check workflow to flag non-trivial commits that skip the log.
Reorganized the repository for multi-person collaboration. Three zones now: raw-notes/ for per-collaborator working notes, wiki/ for the shared AI-organized knowledge layer, and website/ for the public site. Added CODEOWNERS and an approval-policy workflow enforcing zone-specific review requirements (website PRs need Venkat; wiki PRs need any admin; raw-notes are self-owned).
Metadata backfill. Recovered publication dates for all 22 essays via trafilatura URL extraction, and first-publication years for 31 of 38 books via the Open Library API. Seven books still need manual correction — the API returned edition or translation dates rather than original publication years.
Site structure and contributor tooling. Split content into a blurb landing page, /contributions for member essays, and /resources for the curated reading list. Added self-service /profile editing, a /theory introduction page, and a comprehensive CSS overhaul. Batch-loaded all 60 articles (22 contributions, 38 resources/books).
Project launch. Stood up the full pipeline: Cloudflare Pages hosting at worldmachines.org, Access email-OTP gate for contributors, Pages Functions backed by KV for the handle registry, and GitHub Actions ingest (trafilatura text extraction → build.py HTML generation → Pages deploy).