Manthan — the agents' home (scope 6, scratchpad, 2026-08-13)
Scan only, verified live. manthan, 4 containers running.
Operator's framing: "the home of agents, where agents live, sleep, talk, explore." The README says
the same in its own words:
Sanskrit मंथन — "churning." An independent, always-on learning & exploration platform where
Conduir agents live, talk, prototype and evolve ideas. Conduir and other internal systems consume
Manthan's outputs to learn and improve.
*Samudra Manthan — … Halahala (poison) surfaces first; then the 14 ratnas; finally amrita. Bad
ideas come early. The rare breakthrough comes late. You keep churning.*
1. The API is exactly the metaphor — 20 routes
manthan-api-1, container port 8000 → host :47002.
| Concern | Routes |
|---|---|
| live / sleep | /agents, /healthz, /readyz |
| talk | /herald/entries, /herald/status |
| explore | /ideas/search, /prototypes/list, /opportunities/current, /artefacts/recent |
| evolve | /elites, /diversity, /gate/selection, /ab/temporal |
| accrued experience | /patina/leaderboard, /patina/{agent_id} |
| lineage | /lineage/graph, /lineage/graph/grafosa, /lineage/{artefact_id} |
| Conduir consumption | /feed, /signal/feed |
Two things stand out:
patina— per-agent accrued weathering/experience, with a leaderboard. This is the same
concept as the (empty) agent_effectiveness table in the conduir flywheel ledger, but modelled as
a first-class product surface here.
/lineage/graph/grafosa— grafosa is already the lineage projection in this world. Directly
relevant to the agent-fork lineage question: the graph-as-derived-lineage-view pattern is not
hypothetical, it exists here.
2. Live state — the lights are on, nobody is home
manthan-api-1 Up 43h healthz 200 {"status":"ok","service":"manthan-api","version":"0.2.0"}
manthan-substrate-1 Up 17h docker health: UNHEALTHY
manthan-postgres-1 Up 43h (pgvector)
manthan-nats-1 Up 43h/healthz 200 ok
/readyz 200 {"ready": FALSE,
"substrate": "unreachable:ReadTimeout",
"herald[9120]": "unreachable"}
/agents 000 timeout
/elites 000 timeout
/diversity 000 timeout
/patina/leaderboard 000 timeout
/artefacts/recent 000 timeout
/prototypes/list 000 timeout
/opportunities/current 000 timeout
/herald/status 200 node_count: 3, reachable_count: 0
/docs 200Every population, exploration and evolution route times out. The process is alive and its
liveness probe is green; nothing behind it answers.
/readyz is honest — ready: false with named failing checks. That distinction (liveness green,
readiness false, data path dead) is the same trap found elsewhere in the estate today, and here at
least the readiness probe tells the truth.
Herald — the "talk" layer is fully down
alpha http://host.docker.internal:9120 ConnectError: All connection attempts failed
beta http://host.docker.internal:9121 ConnectError
gamma http://host.docker.internal:9122 ConnectErrorNot a DNS problem — host.docker.internal resolves fine inside the container (172.17.0.1). I
checked, expecting the usual Linux gotcha; it is not that. Host ports 9120/9121/9122 simply have
nothing listening. The three herald nodes were never started.
Substrate — healthy-by-endpoint, unhealthy-by-docker, unreachable-by-caller
docker inspect manthan-substrate-1 -> health: unhealthy
curl :47000/healthz -> 200 (fast); its logs show healthz served OK repeatedly
manthan-api readyz -> substrate "unreachable:ReadTimeout"Three different answers about one service. The consistent explanation is the project's own
BUG-001: data paths eagerly load a 1536-dim embedding per node, so /healthz returns instantly
while any real query hangs past the caller's timeout.
3. The project documents its own state honestly
docs/KNOWN-ISSUES.md — 2 × P0, 2 × P1, all open, and my probes reproduce them:
| Bug | Sev | Claim | My live check |
|---|---|---|---|
| BUG-001 | P0 | /feed + /signal/feed 502 — lineage graph eagerly loads 1536-dim embeddings. "the documented Conduir consumer path is unusable" | reproduced — both return 000 (timeout, worse than 502) |
| BUG-002 | P0 | Sensing heartbeat dies on one 502; sensors.py never runs. "half the documented ingest pipeline has not run" | consistent — no exploration data on any route |
| BUG-003 | P1 | Nightly CI red 40 consecutive runs on a stale Prometheus job label | not checked |
| BUG-004 | P1 | Runtime not running; PR #29 unmerged for a month; production −99.5% | consistent with the dead data paths |
Both ends of the loop are broken: BUG-002 kills the ingest (world-sensing → nothing new to
churn), BUG-001 kills the egress (/feed → Conduir cannot consume what was churned). A churning
platform with neither intake nor outflow.
4. How this lands against the rest of the estate
- Conduir's documented consumer path from Manthan is
/feed, and it is down. So the
"Conduir consumes Manthan's outputs to learn and improve" link is not merely unexercised — it is
actively broken at the far end, independently of anything on the Conduir side.
patinavsagent_effectiveness: two worlds independently modelled per-agent accrued
performance. Manthan exposes it as a product surface (leaderboard); Conduir has the table and it
is empty. If agent measurement is wanted, these should not be built twice.
/lineage/graph/grafosais precedent for the fork-lineage decision: grafosa as a *derived
graph view* over an authoritative store, which is the option I recommended in the fork scan.
- Same estate-wide pattern, fourth instance: the measurement surfaces exist and carry no data.
5. Not established
- No write path was exercised; nothing was started, stopped, or reconfigured.
- BUG-003 (CI) not verified.
- Whether
/feedever worked, and what the 3 herald nodes are meant to be, was not investigated. - The
manthan-postgresandmanthan-natscontents were not inspected — there may be churned
artefacts sitting in the database that the API simply cannot serve.
- Old-world/lineage comparison not done.