monad.ai v2.1.1 — current local implementation status
The current NRP work is no longer only an HTTP resolver. It is a mesh-aware runtime path:
me://namespace:read/pathThis is the current operational loop:
request
→ parseBridgeTarget
→ findMonadsForNamespaceAsync
→ matchesMeshSelector
→ computeScoreDetailed
→ fetch selected monad
→ recordForwardResult
→ correlateOutcome
→ analyze-decisions
| Phase | Status | Result |
|---|---|---|
| Phase 1 | done | Namespace reads/writes and claim/open lifecycle |
| Phase 2 | done | Self mapping, monad identity, __surface, disclosure envelopes |
| Phase 3 | done | Mesh index, /.mesh/monads, /.mesh/resolve, bridge forwarding |
| Phase 4 | done | Selector-aware mesh routing ([device:macbook], [host:edge]) |
| Phase 5 | done | Production scoring engine with open .me claim metadata |
| Phase 5.5 | done | Score introspection, runner-up tracking, margin logging |
| Phase 5.6 | done | Decision log, biased sampling, offline analyzer |
| Phase 6 | done | Continuous reward and epsilon-greedy exploration for fragile choices |
| Phase 7 | done | Global adaptive weights and live /.mesh/weights observability |
| Phase 8 | done | Patch bay: controlled feature composition with learned weights |
| Phase 9 | done | Namespace-local weights with maturity blending and global background learning |
| Endpoint | Purpose |
|---|---|
GET /<path> |
Read a path in the namespace selected by Host |
POST / |
Write/claim/open depending on body operation |
GET /__surface |
Self description and monad continuity proof |
GET /.mesh/monads |
List locally known and CLI-known monads |
GET /.mesh/resolve?namespace=... |
Discover monads claiming a namespace |
GET /.mesh/resolve?monad=frank |
Discover a monad by name/id |
GET /.mesh/weights |
Inspect global adaptive scorer weights |
GET /.mesh/weights?namespace=... |
Inspect namespace-local weights and blended request weights |
GET /resolve?target=me://ns:read/path |
Bridge a canonical NRP target |
The selector is not part of the semantic path. It constrains execution.
me://frank.local[device:macbook]:read/profile
Resolution:
frank.localprofiledevice:macbookThe fast index remains simple:
claimed_namespaces: string[]
tags: string[]
type: "desktop" | "mobile" | "server" | "browser-tab" | "node"
The open .me subtree holds rich learned metadata:
_.mesh.monads.<id>.claimed.<namespace> = {
resonance: 42,
effectiveResonance: 31.5,
avgLatencyMs: 85,
forwardCount: 100,
failureCount: 4,
geopoliticalZone: "mx-east",
energyProfile: "low-power"
}
The index answers: who could answer?
The scoring engine answers: who should answer?
Adaptive weights now use two layers:
_.mesh.adaptiveWeights global prior
_.mesh.nsWeights.<namespace> namespace-local posterior
Reads blend them by namespace maturity:
maturity = min(1, sampleCount / 200)
weights = global * (1 - maturity) + namespace * maturity
Writes split the same reward gradient:
globalShare = max(0.05, 1 - maturity)
nsShare = maturity
The global prior remains alive at full namespace maturity, so cross-namespace trends still propagate.
| Env var | Default | Effect |
|---|---|---|
MONAD_MESH_STALE_MS |
300000 |
Exclude stale monads from mesh claim selection |
MONAD_DEBUG_SCORING |
unset | Log every scoring decision when set to 1 |
MONAD_SCORE_SAMPLE_RATE |
0 |
Randomly log a fraction of scoring decisions |
MONAD_SCORE_MARGIN_THRESHOLD |
0.05 |
Always log fragile low-margin decisions |
MONAD_EXPLORATION_RATE |
0 |
Route some fragile decisions to runner-up |
MONAD_DECISION_LOG |
unset | JSONL path for correlated decision outcomes |
MONAD_LEARNING_QUALITY_WEIGHT |
0.7 |
Quality/latency split in reward |
MONAD_DEBUG_WEIGHTS |
unset | Log adaptive weight changes after every forward |
Current regression suite:
19 test files
154 tests
Primary commands:
npm run build
npm test
npm run docs:api
Decision analysis:
MONAD_DECISION_LOG=~/.monad/decisions.jsonl npm run dev
tsx scripts/analyze-decisions.ts ~/.monad/decisions.jsonl
These remain design targets, not production guarantees:
.me-defined scoring pipeline