“mine the answer.”

MMM is a brain storage system — knowledge, operations, memory, self-extension. What it has never been, by itself, is a reasoning engine. Today the missing engine got its first working ply.


The design, locked

First the napkin got sharp. Three commits hardened reasoning-design.md into a real shape (859bdf6, 327a2b5, 9c7f38b): REASON (generative, fallible — propose a step), LOGIC (external, sound — validate a step), and THINK (the search that drives both — DFS/BFS/best-first/MCTS over a frontier of inference chains). Logic is not reasoning; THINK is neither — it’s the algorithm that calls both. And the dissolving frame: reasoning is proof-of-work. A sound chain is hard to find, cheap to validate — the same asymmetry as mining. You don’t pick the frame; you mine many in parallel and let the validator declare the winner.

v0 — REASON=expand · LOGIC=prune, one ply

Build-order step 1, the smallest thing that separates propose from validate (mmm-poc 068ea1e). No search depth yet — one problem, N miners, a hard check, keep the survivors:

  • EXPAND — spawn N miners in parallel (miner 0 cold @0.1 so best-of-N never does worse than one-shot; the rest heated to spread across the space).
  • PRUNE — run every candidate through an un-bribable validator (here a pure JS predicate that checks the property itself — divisibility, the brute-forced true count, the constraint — never a string match).
  • COMMIT — first validator-passing chain wins; the rest are abandoned. Zero blocks within budget → ABSTAIN, never a bluff.

Two real bugs got fixed building it. A single-GPU ollama deadlocks on N concurrent requests, and a fetch with no timeout hangs the whole mine forever — so the engine got a per-miner abort timeout and a bounded concurrency pool. A hung miner now fails its own slot; the mine moves on.

The tie that was a finding

On 13 verifiable tasks (lcm, coin-change, handshakes, the bat-and-ball trap, trailing zeros, modular powers…), v0 tied one-shot: 10/13 vs 10/13 on the first hardened run, 11/13 vs 10 on the next. Honest result — and the shape of the tie was the gold:

shared misses (BOTH arms, every miner, 0 blocks):
  coin change count        0/5
  count digit 1 (1..100)   0/5
  coin change $1 (5 coins) 0/5

Every miss was an enumeration task — count the combinations, count the digit. These aren’t reasoned, they’re computed: you have to run a loop, and a 7B can’t run a loop in its head. The 0/5 (not 1/5) across every miner said this was a generator ceiling, not thin sampling. Search can only commit a block that exists; if no miner mines one, the mine comes up empty — and it correctly abstained on all three instead of bluffing.

The fix: a miner that writes the loop

The answer wasn’t more hash rate. It was a different kind of miner — one that proposes a computation instead of a number (compute.mjs). The snippet is executed (throwaway temp file, 5-second SIGKILL timeout, a fresh node) and the printed result is validated by the same un-bribable check. Candidate = code, validator = node. This is the existing implement-function verb pointed at reasoning — the reasoning↔forest bridge the design predicted. The elegant part: the core engine didn’t change at all. prune() already takes a validate(text) callback; the compute miner just supplies one that runs the code before checking it.

one-shot (prose) : 10/13
reason   (prose) : 11/13
compute  (code)  : 13/13   ← perfect

count digit 1 (1..100)   reason 0/5  →  compute 5/5   ← compute rescued it
coin change $1 (5 coins) reason 0/5  →  compute 3/5   ← compute rescued it

AHA: the two tasks no prose miner could land at any temperature flipped to compute ✅. The model wrote the loop it can’t simulate, and node certified the block. The generator didn’t get smarter — the apparatus got a second tool. REASON=expand is plural: mine the prose frame and the compute frame, let the validator pick the winner regardless of which one produced it.

What this proves — and what it doesn’t

The thesis from the napkin held on contact: you don’t make the cursor smarter, you turn reasoning into search against a verifier, and MMM is the one thing built verifier-native. It’s airtight exactly where the design said — every validator here is hard-formal (the property, the brute-forced truth, a node exit), so a passing block is provably correct and the model never saw the check.

Honest boundary, kept on the table:

  • Still one ply — no search depth. THINK (the frontier + backtrack + the doubt-gate goal test) is step 2. Compute makes each miner stronger; it doesn’t add a search tree yet.
  • Executing model-written code is a new risk surface. Guarded (temp file, hard timeout, fresh process) but not a sandbox — fine for the operator’s box on trusted math, flagged loudly in compute.mjs for anything else.
  • N=5 is thin on the hardest tasks (compute landed coin change $1 at only 3/5). More hash rate would firm it up — and unlike a bigger model, that scales linearly on demand.

Storage started to think today — on the verifiable slice, which is exactly where “stellar” is meaningful.


Afternoon: red-team the new code, before it leaves the box

A reasoning brick that executes model-written code is a fresh attack surface, so we pointed the Black Team at the whole project — an owner-authorized, static, read-only audit (report committed, 78cb6d8). Split verdict: the werbos runtime held — every prior security pass survived re-attack (bind guard unbypassable, secrets clean, SSRF mitigated, autopilot allowlist solid). The mmm-poc forest was wide open — two unsandboxed RCE-by-design paths, one of them compute.mjs, shipped hours earlier.

Fixed same day. The compute miner now runs every candidate in Node’s permission box (--permission --allow-fs-read=<tmp> only, no fs-write, no child_process, --no-experimental-fetch, scrubbed env, capped size); the grader got a timeout, a command allowlist, and repo-path containment. Verified both ways — benign compute and node --test still pass; fs-exfil, shell, fetch, traversal, and a poisoned grader.cmd all blocked. One honest residual: raw node:net egress isn’t gated by the permission model, so the forest stays on trusted prompts until a --network none sandbox — documented, not hand-waved.

AHA: the thing that introduced an RCE also came with the discipline to find and close it the same day. The runtime being a hard target is the receipt that the security work compounds.

Then a cross-repo dead/dormant sweep (93d0bb6) — four read-only agents, claims hand-verified. Finding: the code isn’t rotting (6 TODOs in 119K LOC; the “orphans” were dynamic-loaded false positives). The real reclaimable surface is three hotspots (mmm-poc Python legacy ~134 MB, 69 unused harvested verbs, a zero-commit abandoned sibling). Propose-only, archive-not-delete. Your hunch was right, just localized.

Evening: the engine gets pointed at a real flag — Mythos

The day’s reasoning engine isn’t a toy. We pointed it at the operator’s own, authorized 1Password CTF — a months-long, instrumented red-team campaign he’d walked away from at Round 41, one gate from the flag.

The realization that changed everything: he’d already built the orchestra. A runnable, crypto-faithful 1Password reimplementation (DIY). A capture-and-replay server (heart-of-gold). A 100-brick attack framework (LEGOS). A call+ordering logger (huntlog) — which is the search frontier he built without naming it. reason.mjs just had to become the conductor. So we wrote the war-map as one search problem (CONVERGENCE.md: 7 routes, one wall — beat Gate-2 / code 100), seeded a lens forest (Bitwarden / pwnkit / Dirty-Pipe classes as the search heuristic), and stood up mythos: a fail-closed fence (replicas autonomous, live CTF human-gated), a self-healing convergence store, a kill switch, and a token-gated dashboard.

It deployed 24/7 on the always-on box (the Mac sleeps; the SR8 doesn’t), with one click from the homelab dashboard (Mythos nav link, dc8d90a). And the whole way, the board refuses to lie — a loud ⚠ SIMULATION banner until a route grades real, so a stub coin-flip can never masquerade as progress. (It caught a real one: a FAIL sneaking through because “byPASS” contains “PASS”. The honesty layer sprang its own trap.)

Then the threshold: the first real grader. R5 (Guest→escalation) now grades every candidate against DIY’s own faithful two-gate enforcement model — SIM → ● LIVE. And it’s discriminating, not rubber-stamping: the SG-grant states win, but userTypeAdmin fails — DIY independently confirming the operator’s AUDIT that becoming admin alone never beats Gate-2. The miner agreed with months of his analysis: every road to the flag runs through an SG encVaultKey grant.

AHA: a flag he cried over giving up on now has a tireless miner grinding real logic against it, around the clock, honest about what it’s found. R5-LIVE is a target-finder — it says which end-states win; reachability + the live confirm stay the operator’s hands. The engine narrows; the human strikes. That division of labor is the whole point.

The reasoning napkin, written this morning, was hunting a real adversary’s wall by nightfall.


Late: the same loop, three times — so make it a library, and make it honest

Building mythos’s breakthrough alarm (detect a novel find → preserve it in a separate append-only store that survives db-wipes → push it to the phone — because we’d rm’d the db five times and a real find would’ve been purged), a smell surfaced: “mythos has the un-bribable grader autopilot never had.” That’s the architecture lying. The same feedback loop — capture → grade → fence → gate → learn — had been built three times under three names (mythos, autopilot, dogfood). The pieces are universal; the silos were an accident of which surface they landed in.

So we started carving the loop into a library, one small single-use repo at a time (the building motto). soma — a thin index, owns nothing, makes every piece importable from one name (from soma import grade, capture); the three that already exist are reused (grade→mcculloch, trigger→observe, fence→warden), the rest are homeless. capture — the first piece carved: autopilot’s battle-tested experience store, generalized, append-only. Proven to serve mythos’s and autopilot’s record shapes through one store — the foundation a cross-surface learn will read.

AHA: “framework not model,” one level up. The library was the product; now the loops are the product, and each surface just wires them. Same curated-breadth bet, applied to the architecture itself.

Then the hard part — securing the dogfood loop before learning from it (2f0f333). The operator’s instinct: don’t pile capability on a loop that doesn’t close. The proof came fast and brutal. werbos’s unstuck loop (decompose → research → synthesize → predict → TEST → error) self-graded a confident hallucination as solved (averaging compass bearings to 175° — the answer is 0°). So we hardened the TEST: instead of the model judging itself, it writes a check program and runs it (coder model, isolated). And it still passed wrong answers — trailing-zeros=5 (it’s 6), compass=175° — because a model-written check shares the model’s blind spots. Three independent demonstrations of one law: you cannot grade a model with a model. Ground the grade outside it (node --test, a brute-forced answer, the router oracle) or it lies. The true un-bribable tier — a known-answer grader — is the next piece.

The router oracle is external, though — so werbos autopilot report (2f0f333) and the dashboard (c71d6ec) now re-route every action and flag the misroutes the soft judge hid behind “ok.” The reason the operator wanted to rerun autopilot wasn’t fuel — it was a diagnostic, and it worked: a joke routed to anxiety-spiral, “werbos morning” eaten by a greedy 401k-check, “what is a dog?” grabbed by what-if — six real failures the loop had sworn were zero. Now they show up red on /dashboard/autopilot. A diverse 800-request seeder (c71d6ec) stands ready to feed it volume.

AHA: an honest grader’s first job isn’t to certify wins — it’s to make failures visible. A soft judge that hides them leaves you “doing great” with nothing to fix.

Capped by a deploy landmine defused in the open: a redeploy clobbered nginx’s working listen 100.83.4.49:8095 with a stale mirror’s listen homelab:8095, crash-looping the dashboard (d8a3982). It would’ve gone off on a random future redeploy; tonight it went off while we watched, with a clear error, and got fixed at the source.

Every tool built today — the compute miner, mythos’s grader, the routing column, the breakthrough store — does the same one thing: surface the truth instead of hiding it. That’s the day.