The platform
+Dottie
++
An orchestration platform built around a measured loop. Goals go in, one router sends each to the cheapest tier that can do the work, and every run leaves a measured trace.
+github.com/jcdavis131/dottie
+One monorepo
+Dottie is the whole platform in one repository: the harness, the router, the decision model, the local sidecar and the sites around them. Four parts carry the story.
+-
+
The CLI
scout
The harness's front door. One entry point, plugins behind it.
apps/scout-cli
+ The policy
The router
One routing policy that picks a tier for each goal.
packages/dottie-loop
+ The model
System One
Typed questions, answered as Choice, Score and Noul.
apps/jev-v0
+ The sidecar
dottie-os
Serves System One at
/decideon your machine.local · tailnet
+
The loop the parts serve. Every step writes down what it measured.
+-
+
- Route
- Execute
- Record
- Mine
- Retrain
- Gate
- Serve +
apps/scout-cli
+scout
+Dottie's command line. The harness gets exactly one tool, and every capability is a plugin behind scout --json, each declaring what it may touch.
-
+
- 60+ plugins, one entry pointHarness, MCP, forge, vector and more, each a subcommand. +
- Default denyEvery plugin declares network, filesystem and secrets in a manifest. Undeclared means refused. +
- Real tool callsA goal like
mcp:<server>__<tool>runs a real external call through the meta-MCP layer, under an allowlist.
+ - Measured runs
harness runrecords latency, status and token cost for every step. Zero is written down as a measured zero.
+
$ git clone https://github.com/jcdavis131/dottie.git +$ cd dottie +$ uv sync --all-groups --frozen +$ uv run scout --help + +# route a goal with the deterministic heuristic +$ uv run scout --json harness route \ + "compare Stripe vs Lemon Squeezy Aug 2026" + +# route, plan, execute, write the measured timeline +$ uv run scout harness run "ship the harness loop" --json + +# serve scout itself as one MCP server +$ uv run scout mcp serve+
The standalone scout-cli repository is superseded; scout lives in the monorepo at apps/scout-cli.
packages/dottie-loop · router.py
+The router
+One routing policy chooses among five tiers, from deterministic to agentic epic. A goal passes through four gates, in order, on its way to a tier.
+-
+
- 01
Hard constraints
Policy exclusions first. Restricted goals are not routed automatically, and nothing runs when neither a model nor a tool is available.
+ - 02
Heuristic
Deterministic when it can satisfy the goal, otherwise the heuristic tier. Always available, and it has the final word today.
+ - 03
Learned, if gated
A learned answer counts only if its artifact says
gate_passed: true, a human stamped it, and it picks an equal or cheaper tier.
+ - 04
Escalate, if recorded
A more capable tier only after a recorded insufficiency: when it happened and what failed. Never on a hunch.
+
| Backend | What it is | Today |
|---|---|---|
| Heuristic | MoMA-lite rules over the goal text and its side effects. | Authoritative |
| Learned MLP | The orchestrator model from the training factory, apps/ava-factory. | Advisory |
| System One | A typed question sent to dottie-os over /decide. | Advisory |
-
+
- Advisory means logged and shownLearned and System One answers are recorded next to the heuristic's and displayed. They do not change the tier until a checkpoint passes the gate and a human stamps it. +
- The last recorded comparisonIn the latest evaluation report (August 2026), the learned candidate and the heuristic both scored 83.6% on 61 measured held-out goals. A tie does not pass the gate, which requires strictly beating the heuristic, so the heuristic stayed. +
- Traces feed the next modelRouting traces from real harness runs feed a training loop on the GPU host. Unifying scout and jarvisd on this one policy is in progress. +
Contract · jev-decision-schema-1.0.0
+System One
+The decision model. It takes state and a set of typed questions and answers each with a closed distribution, never free text. Three question types, frozen in one schema.
+The three frames below are what /decide returns today with no checkpoint loaded: mode: untrained, uniform over the offered options. The shapes are the contract. The numbers are exactly what an untrained model owes you.
-
+
-
+ + +
One of a closed set
Choice
- choice
- billing
- shape_concentration
- 0.333
Pick one label from 2 to 255 named options. On a perfect tie the first key wins, and the probabilities say it was a tie.
+
+ -
+ + +
A level on an ordered scale
Score
- score
- 1.5
- shape_concentration
- 0.25
Place the state on a rubric of 2 to 10 named levels. The score is the expected level, with a legend back to the words.
+
+ -
+ + +
Yes or no, as a number
Noul
- noul
- 0.5
- shape_concentration
- n/a
A yes-or-no question answered as one probability of yes, between 0 and 1. The number is the whole answer.
+
+
shape_concentration
+maxᵢ p(optionᵢ)
+The largest probability in a Choice or Score answer. It describes the shape of the distribution: 1/n when the model spreads evenly over n options, 1 when all the mass sits on one. It is a named statistic, not a promise about accuracy, so System One never calls it confidence and makes no calibration claim.
+The local sidecar
+dottie-os
+dottie-os serves System One on your own machine or tailnet. Tools ask it a typed question over POST /decide and get typed answers back. Nothing is published to a public host.
-
+
- Loopback by defaultThe reference server binds
127.0.0.1:8770unless told otherwise. Reach it over your tailnet, not the open internet.
+ - Refuses rather than guessesEvery request is checked against the frozen schema: 1 to 32 questions, at most 64 KB. A schema violation is a
422, an oversized body a413; nothing is silently truncated.
+ - Where it livesThe reference
/decideserver isapps/jev-v0. The sidecar runs on the GPU host;apps/dottie-osin the repo mirrors its data-curation scripts.
+
{
+ "schema": "jev-decision-schema-1.0.0",
+ "state": {
+ "ticket": "TD-1001",
+ "message": "Charged twice on invoice 4412."
+ },
+ "questions": {
+ "team": {
+ "type": "choice",
+ "instructions":
+ "Which team should handle this ticket?",
+ "criteria": {
+ "billing": "Charges, invoices, refunds",
+ "technical": "Bugs, outages, integrations",
+ "other": "None of these"
+ }
+ },
+ "urgent": {
+ "type": "noul",
+ "instructions":
+ "Does the sender ask for help today?"
+ }
+ }
+}
+ {
+ "schema": "jev-decision-schema-1.0.0",
+ "model": "jev-v0-untrained",
+ "mode": "untrained",
+ "answers": {
+ "team": {
+ "type": "choice",
+ "choice": "billing",
+ "probabilities": {
+ "billing": 0.333,
+ "technical": 0.333,
+ "other": 0.333
+ },
+ "shape_concentration": 0.333
+ },
+ "urgent": { "type": "noul", "noul": 0.5 }
+ }
+}
+ Designed · not built
+The hive
+A way to run a team of agents on plain files next to the sidecar: a roster, a shared blackboard, a task ledger, mailboxes and append-only logs. No database; everything readable with cat. It exists today as a design, not as code.
-
+
- One writer per fileEach agent writes only inside its own directory. One process commits to git; agents never do. +
- Fail-closed deliveryA router moves messages from one outbox to another inbox. Undeliverable mail bounces to the orchestrator; malformed mail is quarantined and logged, never dropped. +
- A human at the boundaryPause, gate, steer and halt are enforced where actions leave the hive. Destructive operations need an explicit confirmation. +
hive/ + registry.json # roster: agent, role, capabilities + board.md # shared blackboard, one scribe + tasks.json # task ledger + log.jsonl # append-only event feed + costs.jsonl # append-only cost ledger + agents/<id>/ + identity.md # who I am, what I may do + memory.md # long-term memory + inbox/ # delivered to me + outbox/ # waiting for the router + cursor.json # nothing is read twice+
As of September 2026
+Status
+What runs, what is being built, and the rules that do not bend while it is.
+Shipped
+-
+
- scoutThe CLI in the monorepo: harness route and run, meta-MCP, forge, 60+ plugins. +
- The heuristic routerMoMA-lite over five tiers, authoritative in the harness. +
- The System One contractFrozen
jev-decision-schema-1.0.0and a typed/decideserver.
+ - Gates as code
dottie-loop: evaluation gates, promotion and rollback records that can stop an advance.
+
In progress
+-
+
- One routerA single policy in
dottie-loopfor scout and jarvisd, with heuristic, learned MLP and System One backends.
+ - System One checkpointsA small model with LoRA and pointer heads. None has passed the gate. +
- The training loopReal routing traces into training on the GPU host. +
- The consoleA web console for dottie-os, planned at os.jcamd.com. +
- The hiveDesigned; not yet built. +
The rules
+-
+
- Nothing auto-promotesA checkpoint is authoritative only if its artifact says
gate_passed: trueand a human stamped it.
+ - No synthetic championsSynthetic rows never train a champion. Router training data is real harness traces only. +
- No calibration claimsProbabilities are named for what they are:
shape_concentration,backend_confidence.
+ - No champion without a measurementA model is called live only when it has been measured. +
Source
+Everything above is in one repository.
+MIT licensed, solo, built on public and free-tier tools. Read the code; when this page and the code disagree, the code is right.
+