01 The verdict in one page
Every serious lab that ran agents across more than one context window converged on the same substrate, and none of them called it a "project tracker". They called it a feature list (Anthropic), an ExecPlan (OpenAI Codex), a todo provider (Microsoft), a memory stream (Generative Agents), a task network (HTN planning), or Task JSON (the practitioner literature). The common shape is always the same five properties:
- It is a file, not a conversation. It survives compaction, a crash, a new session, a new agent.
- It is structured enough that only one field per item should change. Progress is flipped or derived — never rewritten in prose.
- It is hierarchical. A goal rolls up from milestones, milestones from initiatives, initiatives from tasks — so "how far along is the goal?" is a number, not an opinion.
- It is attributable. Every change carries a timestamp and the identity of the agent that made it.
- It ends in something a human or a dashboard can read. Otherwise the human becomes the verification loop.
Milestr implements all five, and — unusually — it implements them as a deterministic CLI contract with a self-healing state engine, not as a prompt convention. That is the substance of the fit. The rest of this page walks the evidence, the mapping, and the honest gaps.
Component claims
Every individual mechanism Milestr uses has independent published support: context rot, derived rollup, field-flip discipline, attribution, KPI steering, durable state.
The combination
No published ablation isolates "hierarchical rollup DAG" against "flat todo list" on a long-horizon agent benchmark. Say "the literature supports each component; the combination is our design."
Adoption
0 GitHub stars. 6,413 lifetime npm downloads, median 1/day, 43 zero-days out of 120. Beads — a direct comparator — has 28,211 stars and 32,270 monthly npm downloads.
Missing surface
No MCP server. Milestr is CLI-only — the correct side of the CLI-vs-MCP axis for local single-user work, but invisible to every MCP-native agent runtime.
02 The six documented failures agents actually hit
These are not opinions. Each is named, described and instrumented in a primary source — and each one is a state failure, not a reasoning failure.
One-shotting
The agent tries to do everything at once, runs out of context mid-implementation, and leaves the next session with a feature half-built and undocumented. The next agent then has to guess what happened.
Premature victory declaration
A later agent instance "would look around, see that progress had been made, and declare the job done." Anthropic's internal name for it: "Claude declares victory on the entire project too early."
Undocumented progress → dirty handoff
"Claude leaves the environment in a state with bugs or undocumented progress." The next agent re-reads files, re-asks answered questions, re-derives decisions — and sometimes re-attempts fixes that already failed.
Premature feature completion
"Claude marks features as done prematurely" — the agent changes code, runs unit tests, and never checks the feature works end-to-end. The state lies, so every downstream decision is built on a false premise.
Unverifiable completion claims
"Claude stops when the work looks done. Without a check it can run, 'looks done' is the only signal available, and you become the verification loop."
Drift from the objective
Over extended interactions, agent behaviour degrades in three named ways: semantic drift (progressive deviation from the original intent), coordination drift (breakdown in multi-agent consensus), behavioural drift (unintended strategies emerge). Left unchecked: lower task-completion accuracy, more human intervention.
03 The problem is measured, not anecdotal
Three independent quantitative results define the constraint any long-horizon agent substrate has to beat.
Models are near-100% on tasks under 4 human-minutes. The 50%-success task length has been doubling roughly every 7 months — but the current ceiling is a few minutes of human work.
9 models, 4 task families, 5 horizons, 3 context regimes, 10,664 trajectories. Task success follows a geometric law; per-step reliability saturates well below 1. Projected success falls from 0.42 at GAIA horizons to 0.24 at hundred-step production horizons.
Chroma tested 18 LLMs with input length as the only variable: performance degrades on every model, non-uniformly, long before the window fills. Anthropic calls context "a finite resource with diminishing marginal returns" and an "attention budget".
Measured consequence of not having durable state
PROJECTMEM (arXiv:2606.12329, Jun 2026) ran a six-month self-study on 27 projects: 86 of the 427 distinct issues closed by a recorded fix had at least one failed attempt before the first fix in event-log order. That is the cost of a next agent that cannot see what was already tried. Their engineering answer — an append-only typed event log projected deterministically into compact summaries — took the median analysis of a 1,500-event log from 42.0 seconds to 79.3 milliseconds.
04 Seven primitives, each with its own literature — and its line in Milestr
Read left to right, this table is the whole argument: a failure mode, the primitive that fixes it, the primary source that prescribes it, and the exact implementation in the Milestr codebase.
| Primitive | Fixes | Prescribed by | Milestr implementation |
|---|---|---|---|
| Durable state outside the window | One-shotting, context rot, dirty handoff | Anthropic harnesses: init.sh + claude-progress.txt + git history; OpenAI: "anything it can't access in-context while running effectively doesn't exist" |
data.json on disk, one file per project; every command re-reads it — src/data/store.ts:13 |
| Structured, field-level mutation | Undocumented progress, accidental rewrites | Anthropic: "the model is less likely to inappropriately change or overwrite JSON files compared to Markdown files"; "edit this file only by changing the status of a passes field" |
Typed CLI actions with a Zod-validated schema (src/data/schema.ts); SKILL.md §"NEVER edit data.json by hand" (line 207) |
| Derived rollup progress | Premature victory, drift | ST-WebAgentBench (arXiv:2410.06703): Completion Rate vs Partial Completion Rate; Anthropic: agent may flip one boolean, not restate progress | cascadeUpdate() src/actions/utils.ts:87 — parent progress = mean of children; parent done ⇒ progress 100 |
| Self-healing state | Drift from out-of-band edits | OpenAI harness engineering: "recurring cleanup process… functions like garbage collection"; linters + CI validate the knowledge base is current | healParentRollups() src/actions/utils.ts:155, wired into every loadData(); logs a HEAL: line (store.ts:67) |
| Attributed append-only log | Coordination drift, "who did what", cost attribution | OpenTelemetry GenAI conventions: gen_ai.agent.id, gen_ai.memory.record.id; Anthropic: evaluate final state via discrete checkpoints |
dashboard.log — every mutation writes CALLED: / CHANGE: with agent + action; --agent is mandatory (no silent agent=unknown writes) |
| KPI as steering truth | Drift from the objective, token-chasing | StateLens (ACM TURC '26): progress-as-scored-signal took success 0.333→0.667 and cut repeat rate 0.285→0.083 with no human in the loop | First-class KPI objects (value, unit, trend, source) + the four-role agent mesh where the KPI tracker is the sole writer of values |
| Human-readable projection | Verification loop, invisible progress | Claude Code: "you become the verification loop"; LangChain: "A single number like '67% complete' is immediately understandable" | Single-file HTML dashboard regenerated on every write, published to Cloudflare Pages — 5 views, plus an export-time parse guard that refuses to publish a broken script |
<script> block, so the browser discarded the whole script: tab switcher, tree zoom, detail drawer and theme toggle were all dead — silently, on every published dashboard, for a month. v1.3.2 fixed it, moved the script into its own module, added assertDashboardScriptParses() at export time, and added 30 jsdom tests that execute the dashboard and assert behaviour. A projection that lies is worse than no projection — that is the same reason Milestr self-heals its rollups instead of trusting them.
05 What a session actually looks like
Anthropic's fix for one-shotting was a fixed orientation routine. Every session starts the same way, reads the same three artifacts, and ends by writing back. This is the loop Milestr makes mechanical — the state is queryable instead of reconstructed from a transcript.
Anthropic's routine
1. pwd. 2. Read the git logs and progress files. 3. Read the feature list and choose the highest-priority feature that's not yet done.
OpenAI's ExecPlan
Same shape, richer schema: mandatory Progress, Surprises & Discoveries, Decision Log, Outcomes sections. "It should always be possible to restart from only the ExecPlan."
Microsoft's todo provider
todos_add / todos_complete (requires a completion reason) / todos_get_remaining; persisted via TodoFileStore; injected before each run so the agent can resume outstanding work.
06 Why hierarchy beats a flat list
A flat list answers "what is left?". It cannot answer "how far along is the goal?" without re-deriving that from the items — by a reader (human or agent) that may mis-weigh, mis-count, or simply be optimistic. Anthropic's failure #2 is exactly that: progress becomes an impression. With rollup it becomes a number.
passes field… we landed on using JSON for this, as the model is less likely to inappropriately change or overwrite JSON files compared to Markdown files."
— Anthropic, Effective harnesses for long-running agents, Nov 26 2025Formal backing for the hierarchy itself
The goal → milestone → initiative → task shape is Hierarchical Task Network planning, formalized decades before LLM agents: a task network "represents a hierarchy of tasks each of which can be executed," separating what we want to do from how it is implemented (Ghallab et al., arXiv:1403.7426). Complexity work (Alford et al., arXiv:2401.14174, 2024) establishes that HTN-level structure is what makes plan verification and state reachability tractable — hierarchy is the structure that makes state checking cheap. That is precisely what a parent rollup needs, and precisely what a flat list cannot do.
07 A deterministic contract for a nondeterministic agent
Every failure above is a reliability problem, and reliability comes from making the agent's interface boring: typed commands, validated state, machine-checkable output. Milestr's surface is deliberately narrow.
# every mutation names its author — no silent agent=unknown writes
$ milestr --agent runner status M1.2 done "rollup fixed"
# machine-readable state for the next agent or a script
$ milestr list --json | jq '.[] | select(.status=="blocked") | .id'
# derived numbers, never narrated
$ milestr metrics --json
{ "total": 7, "byStatus": { "ongoing": 3, "done": 2 },
"byType": { "goal": 3, "milestone": 4 }, "kpis": 4 }
One field per mutation
The agent's job is to flip a status or a progress number and attach a reason — never to rewrite the document. The command surface makes that the only path: there is no "edit the JSON" verb.
src/actions/handlers.tsFailure is loud, not silent
Concurrency → LockError with the holder's PID. Schema drift → Zod error. Stale version → explicit migration error. Out-of-band edit → MANUAL_EDIT: line in the log. Broken dashboard → export refuses to publish.
CLI vs MCP — where Milestr sits
A 2026 comparative analysis across 14 dimensions (arXiv:2610.30157, Jul 29 2026) is blunt about the trade-off: CLI is superior for single-user, local-only workflows (2–5× latency advantage), while MCP is what CLI fundamentally cannot satisfy — fine-grained access control, credential isolation, structured audit, multi-tenant governance — at a cost of up to 55K tokens for naive MCP loading. Its recommendation is a hybrid.
| Dimension | CLI (Milestr today) | MCP server | Verdict for Milestr |
|---|---|---|---|
| Latency, local single-user | wins | 2–5× slower | Correct side of the axis |
| Zero setup for an agent runtime | partial — agent must shell out | wins — native tool surface | Real gap. Every MCP-native agent sees nothing without a server |
| Token cost of loading the tool | wins — 0 tokens | up to 55K naive | Milestr's surface is tiny; an MCP wrapper would be small too |
| Structured audit / multi-tenant RBAC | partial — attributed log + file lock | wins | Needed before selling to teams |
| Human oversight surface | wins — published dashboard | agent-only | Keep the dashboard as the human's window |
08 Accountability is a design constraint, not a feature
Anthropic's multi-agent research system reported that multi-agent setups beat single-agent by 90.2% on their internal eval — while burning ~15× the tokens of chat, with token usage explaining 80% of the performance variance. At that burn rate and agent count, "which agent produced this change" stops being a nicety: it is the only way to do root-cause analysis, cost attribution and quality control.
| Agent role | Sole writer of | May never touch | Why |
|---|---|---|---|
| Runner | task.status, task.progress, task.activityLog | kpi.*, root.* | Execution truth |
| Planner | new tasks, parent.plan_version | kpi.*, task.status | Structure only |
| KPI tracker | kpi.value, kpi.trend | task.* | Measured truth |
| Orchestrator | root.activityLog, task.needs_replan | kpi.value, task.status | Control plane |
The rule is two agents must never write the same field. Violations are bugs. The single-writer discipline mirrors the multi-agent literature: the MDPI survey of LLM-based multi-agent systems warns that without a control plane "even highly capable agents risk duplication of effort, logical inconsistency, or unbounded autonomy that diverges from the system's objectives."
Identity is a standard, not an invention
OpenTelemetry's GenAI conventions define gen_ai.agent.id, gen_ai.agent.name, gen_ai.conversation.id, gen_ai.memory.record.id. The existence of a vendor-neutral agent identity is the signal that "which agent wrote which record" is a first-class concept.
Attribution is what makes it debuggable
Milestr's dashboard.log carries CALLED: <agent> | action=… | args=… on every invocation, plus CHANGE:, HEAL:, MANUAL_EDIT:, MIGRATION: lines. Root-causing a bad state change is a grep, not an archaeology exercise.
KPI beats token-count
The orchestrator's metric is goal progress against KPI trajectory, not tokens. That choice is deliberate: it makes the loop steer toward an outcome rather than toward efficiency theatre.
09 The honest gap — where Milestr actually stands
A positioning page that hides this would be worthless. Here is the state of play, verified on 2026-10-26.
Adoption — the binding constraint
The 5,568-download spike is 87% of lifetime volume. Strip the spikes and the tool averages 2.6 downloads/day. Real usage is a handful of internal agents, not a market.
The competitive set (npm downloads / 30d, GitHub stars)
beads is the direct comparator and it is not close: a dependency-aware graph issue tracker for agents, 28k stars, 32k monthly downloads, with Claude Code / Codex / Cursor hooks already installed. What it does not have is a goal/milestone/initiative hierarchy, cascade rollup, a KPI scorecard, or an auto-published dashboard — that is the defensible wedge.
Milestr's daily npm downloads, 2026-06-28 → 2026-10-25
SKILL.md, but the majority of agent traffic now enters through MCP tool surfaces. Until Milestr exposes its state as MCP tools, it is invisible to MCP-native runtimes and to the registries those runtimes query.
10 What to do on Monday
The assessment's conclusion is that the thesis is sound and the bottleneck is reach, not correctness. Three moves, in order.
- Ship the MCP surface first. Expose
list,view,status,progress,create,list-kpisas MCP tools over the same CLI code path — no second implementation, so the state engine stays single-source. This is the only move that puts Milestr in front of the 47k-server registry and the 231M-download SDK audience. Cost: one small server module. Highest leverage in the whole plan. - Turn the proof into a public artifact. Publish a dashboard for a real multi-agent project (a Milestr instance running its own release cycle), with the published URL in the README. The dashboard-publish loop is the distribution mechanic — an agent that ends every task with a public URL has something to share; a CLI that prints a table has nothing. Cost: one project. This is what the Cloudflare publish feature is actually for.
- Fix the one-clause gap and claim it cleanly. Beat beads on the axis it does not cover — goal hierarchy, cascade rollup, KPI-as-truth, self-healing state — and say so explicitly, because "a memory upgrade for your coding agent" is a stronger market position than "another issue tracker". Then ship the open
install-skillso an agent can self-install the contract in one command. Cost: one issue (#22) and one README rewrite.
11 Sources
Every source below was read in full during this assessment (2026-10-26). Statistics quoted in the body are taken from these texts, not from summaries of summaries.
Primary — vendor engineering
- Anthropic — Effective harnesses for long-running agents, Nov 26 2025 — anthropic.com/engineering/effective-harnesses-for-long-running-agents
- Anthropic — Effective context engineering for AI agents, Sep 29 2025 — anthropic.com/engineering/effective-context-engineering-for-ai-agents
- Anthropic — How we built our multi-agent research system, Jun 13 2025 — anthropic.com/engineering/multi-agent-research-system
- Anthropic — Code execution with MCP — anthropic.com/engineering/code-execution-with-mcp
- OpenAI — Harness engineering: leveraging Codex in an agent-first world, Feb 11 2026 — openai.com/index/harness-engineering
- OpenAI Cookbook — Codex Execution Plans (ExecPlans) — cookbook.openai.com/articles/codex_exec_plans
- Claude Code Docs — Best practices for Claude Code — code.claude.com/docs/en/claude-code-best-practices
- Claude Code Docs — Track todos (Agent SDK) — code.claude.com/docs/en/agent-sdk/todo-tracking
- Claude Code Docs — Create custom subagents — docs.claude.com/en/docs/claude-code/sub-agents
- Microsoft — Planning and todos (Agent Framework), updated Sep 19 2026 — learn.microsoft.com/en-us/agent-framework/agents/planning-and-todos
Primary — papers
- Chroma — Context Rot, Jul 14 2025 — trychroma.com/research/context-rot
- METR — Measuring AI Ability to Complete Long Software Tasks, Mar 19 2025 — metr.org · arXiv:2503.14499
- Mittal — How Fast Do Agents Rot?, arXiv:2609.01660, Aug 31 2026
- Context Length Alone Hurts LLM Performance Despite Perfect Retrieval, arXiv:2510.05381
- Malo & Qiu — PROJECTMEM: A Local-First, Event-Sourced Memory and Judgment Layer for AI Coding Agents, arXiv:2606.12329, Jun 2026
- Agent Drift: Quantifying Behavioral Degradation in Multi-Agent LLM Systems, arXiv:2601.04170
- Malik et al. — MCP vs CLI for AI Agents, arXiv:2610.30157, Jul 29 2026
- Liu et al. — StateLens: Transition Prediction for Robust Long-Horizon LLM Agents, ACM TURC '26 — dl.acm.org/doi/10.1145/3833142.3833173
- Liu et al. — Lost in the Middle, arXiv:2307.03172, 2023
- Park et al. — Generative Agents, arXiv:2304.03442, UIST '23
- Packer et al. — MemGPT: Towards LLMs as Operating Systems, arXiv:2310.08560, 2023
- Shinn et al. — Reflexion, arXiv:2303.11366, NeurIPS 2023
- Wang et al. — Agent Workflow Memory, arXiv:2409.07429, 2024
- Hong et al. — MetaGPT, arXiv:2308.00352, ICLR 2024
- Ghallab et al. — An Overview of Hierarchical Task Network Planning, arXiv:1403.7426
- Alford et al. — A Structural Complexity Analysis of HTN Planning, arXiv:2401.14174, 2024
- ST-WebAgentBench, arXiv:2410.06703
- Evaluation and Benchmarking of LLM Agents: A Survey, arXiv:2507.21504
- Ebrahimi & Asudeh — Reliability, Transparency, Accountability in LLM-based Multi-Agent Systems, Dec 2024
Primary — practitioner + ecosystem
- Sandruk — Task JSON as source of truth for agent work — sandruk.org/blog/task-json-ssot
- Sprintra — Why your project management tool wasn't built for AI agents — sprintra.io/blog/why-pm-tools-fail-ai-age
- MindStudio — Issue Trackers as AI Agent Infrastructure — mindstudio.ai/blog/issue-trackers-ai-agent-infrastructure-jira-linear
- Scrum.org — Jira to AI Agents: From PM Tool to Project Knowledge Architecture
- RAAV — Linear for AI agents — raav.ai/compare/linear
- LangChain — Todo list (Deep Agents) · Plan-and-Execute Agents — docs.langchain.com
- OpenTelemetry — GenAI semantic conventions — semantic-conventions-genai
- Tanod — State of the MCP Registry, Oct 25 2026 · MCP Toplist ecosystem report, Oct 2026
- gastownhall/beads README — Distributed graph issue tracker for AI agents
First-party — the subject itself
- github.com/Dr-Agentic/milestr — 51 commits, 5 tags, v1.3.2 (2026-10-23), 13 issues, 12 PRs
- npm registry —
milestr5 versions since 2026-06-28; download counts via api.npmjs.org, read 2026-10-26 - Codebase audit —
src/2,994 LOC TS ·tests/3,241 LOC · 152 tests green ·SKILL.md382 lines - Live instance —
/Users/morsy/.hermes/workspaces/milie/milestr·metrics --jsonoutput quoted in §07