Review: 0.3, walked as a stranger and set beside its peers
October 2026, before the 0.3.0 release. The first half is what a first-time visitor meets: the site, the quickstart, the hosted and the local playground, create-marg-app, the CLI, the evals. The second half sets Marg beside Google ADK (the earlier study is adk-dev-2026-10.md), the OpenAI Agents SDK, LangGraph and Pydantic AI, area by area. It ends with every gap ranked and classified: fixed now, on the roadmap as 0.4, or declined with the reason. Peer facts are as of 14 October 2026, from their published docs and release notes; version numbers will drift, the shapes will not.
1. What 0.3 is
0.2 made Marg installable; 0.3 made it findable and legible. What a 0.3.0 user gets, where the site says so, what proves it, and what guards it:
| Feature | On the site | Proof | Guard |
|---|---|---|---|
Nine packages on npm, create-marg-app | Quickstart | npx create-marg-app@latest demo && npm install && npm run gateway | check:pack, check:create, the packages CI job, release.yml |
The marg command (web, new, evals, verdict, check) | Quickstart, "Your own domain" | npx marg check in a created project | check:create runs it |
| The site, search, the comparison page, the FAQ | marg-adk.github.io/marg | search finds readYesNo | the pages workflow builds every PR; a dead link fails it |
| The playground as the dev UI: draft and trace panes, openers, a phone layout | Get started → The playground | the six-turn journey; the trace shows create_ticket | npm test (the widget under a fake DOM), the image job serves the page |
| The build-a-domain skill for coding agents | Build → Build with a coding agent | a created project has .claude/skills/build-a-domain and AGENTS.md | check:create asserts the files |
| A page per model provider and per integration | Models, Integrations | the env lines on each page | a unit test resolves every preset from the environment |
| Simulated users in the evals | Build → Evals, "Simulated users" | the simulated-user scenario in both example suites | the example suites in CI |
| The bookings example and two-domain routing | Build → The bookings example | npm run evals:bookings | CI |
| The English reader core, Hinglish as an opt-in lexicon | Build → Readers, "Registers" | AGENT_LEXICONS=hinglish; the gateway logs what it loaded | reply-words.test.ts, lexicons/hinglish.test.ts |
| A Python tool-server template | Build → Tools in Python | marg new bookings --lang python | SCAFFOLD_LANG=python npm run check:scaffold, the scaffold (python 3.11) job |
Three of those rows are not in the published 0.2.1: the simulated user, the lexicons and the Python template landed after it. The site is built from main, so until 0.3.0 ships a visitor who follows "Tools in Python" on a fresh project gets a TypeScript server and no message, which is the first finding below.
2. The walk
What a first-time visitor meets, in the order they meet it. Each item says what was found and what became of it.
The home page. One sentence, three buttons, four features, the GIF, the quickstart in tabs, the field numbers, "Is Marg for you?", an FAQ. It reads cleanly and says the wedge with the number beside it. The FAQ's "Which models" named seven providers of twenty-two: fixed, with a link to the Models section. Nothing on the page says which version is live; the "since" line per page that 0.3's first item promised was never built: on the roadmap (0.4).
The hosted playground. Sleeps when idle; the site and the README say so. Woke in about a minute, two domains, writes off, the openers drawn; the ticket opener resolves the customer picker. Fine.
npx create-marg-app@latest demo in an empty folder. Prints the next steps, refuses a non-empty folder, installs clean on Node 22 (one npm 11 install-script warning, documented in the README). The gateway boots on marg web, health answers, the playground serves. Fine.
npx marg new bookings --lang python in that project. Wrote a TypeScript server and said nothing: the published 0.2.1 CLI did not know --lang and ignored it. The release closes the specific case; the general one was the CLI accepting any flag. Fixed: every command refuses a flag it does not know, with the known flags named, and marg new checks the templates hold the server template for the chosen language before writing a file. Found on the way: marg --version printed the help, and marg verdict --help never reached Verdict. Fixed.
The playground after a scaffold. The empty state offered <verbatim thing a user would type> beside the real openers, because a fresh domain keeps the template's placeholders until the author fills them in. Fixed: placeholders are skipped.
The six-turn journey, with the trace pane open. Opener, picker, category chips, the Details card, priority chips, the summary with provenance, the create: as the GIF shows. The trace pane shows, per turn, who answered (runtime or model), the domain, each tool call with its time, and the create. It does not show a tool's arguments or result, the route decision and its confidence, or a step's state, which the 0.3 roadmap item promised and which every peer's dev UI shows. On the roadmap (0.4).
A partial form submit. Typing "about 40" into the numeric Affected-users row and submitting was rejected, correctly ("1 row to fix"), but the card came back empty and unmarked: the environment pick and the steps typed were gone. The engine merged the redraw's state into the stored step only after the draw had run, so the form step never saw it. The scenario that claimed to cover it checked only the "to fix" wording. Fixed, with a formRow check that was red on the old engine and is green now.
A premature yes. "yes, create it" while the card is open: the runtime answers that the card is still open and draws it again; nothing is created. The playground page had described this as the create-gate refusal, which is the second line of defence the visitor does not see at that moment. Reworded to say what happens and why.
The create, then a reload. The completion card, "Add files", "Start another". After a reload the transcript is redrawn as documented, but the Draft and Trace panes come back empty: the dev UI builds them from the turns it saw, and a reload has seen none. On the roadmap (0.4).
The quickstart's words. Step 5 said the create is refused with writes off; the project's own .env has writes on, so the visitor sees a ticket created. Reworded: the default writes, the evals and the hosted playground refuse. The README said "v0.1.0" and listed the npm packages without the CLI; the docs index had no row for the Python guide, the providers or the integrations; the PR template's gate line said 7/7. Fixed.
The evals with a simulated user. The simulated-user scenario runs in both suites on the mock model; the guide shows cooperativeUser with an opener, answers by row key, preferred taps and asides. The UserSim shape admits a model-played user; none ships. On the roadmap (0.4).
Search. Finds readYesNo, the roadmap's acceptance test.
3. The peers, area by area
The four nearest frameworks, with Marg's one job shape in mind: collect → validate → confirm → write. "Lacks" and "has" are relative to that shape, not in general.
Time to first working agent
| First run | |
|---|---|
| ADK (Python 2.12, TypeScript 2.3) | pip install google-adk, adk create, a key in .env, adk web |
| OpenAI Agents SDK (Python 0.23, JS 0.20) | pip install openai-agents, an OPENAI_API_KEY, one file, python main.py; no CLI |
| LangGraph (1.2) / LangChain 1.x | pip install langchain, a key, create_agent, one file; langgraph new templates; langgraph dev |
| Pydantic AI (2.56) | pip install pydantic-ai, a key, four lines; uvx clai with no install |
| Marg | npx create-marg-app, npm run gateway; no key, the mock model plays the model |
Every peer needs a key before the first run. Marg is the only one whose first run is a whole journey with a form, a picker and a create, and the only one that runs with no key at all. What they have that Marg lacks: a one-line agent. Marg's smallest unit is a domain folder; there is no "agent in four lines" because the thing Marg sells is the folder. It matters for the wedge only in that a visitor must be told so in the first screen, and is.
Tools in other languages
All four peers are MCP clients (stdio, Streamable HTTP, deprecated SSE) and so is Marg; ADK and Pydantic AI also expose an agent as an MCP server. Marg's tool contract is narrower on purpose: the triad per entity, the bearer and the trace context in _meta, hidden internal_* tools, and now the same contract in Python with a scaffold check that proves it. None of the peers prescribe a contract for a tool server; none check one in CI. Nothing to add.
Evals and user simulation
| Deterministic, offline, no key | Model-judged | Simulated user | |
|---|---|---|---|
| ADK | trajectory and ROUGE criteria, conformance recordings, adk eval in CI | rubric, hallucination, safety, multi-turn (Vertex) | a generative user with personas and a stop signal; no model-free mode |
| OpenAI Agents SDK | ScriptedModel, call inspection, drift detection (the SDK's "Testing") | the platform's trace grading, being wound down in late 2026 | none |
| LangGraph | LangSmith's pytest/Vitest integrations with cached cassettes | LLM-as-judge, pairwise | openevals: scripted turns, then an LLM user with a persona; not claimed deterministic |
| Pydantic AI | TestModel, FunctionModel, trajectory evaluators over spans | LLMJudge | none |
| Marg | scenarios against a writes-off gateway, the scripted mock model, flake classification, the gate in CI | none | cooperativeUser, deterministic, in CI |
Marg's position is the strongest on the first column and alone on the third with a deterministic user in CI. What it lacks: a shipped model-played user for runs outside CI, where ADK and openevals are. The UserSim shape is there; modelUser({ persona, goal, model }) is the missing export. Roadmap (0.4). A model judge is declined: Marg's checks assert what must always hold, and a judge cannot be a merge gate.
Observability
ADK and Pydantic AI emit OpenTelemetry in the GenAI semantic conventions with OTEL_EXPORTER_OTLP_* exporting; LangSmith ingests and exports OTel; the OpenAI SDK traces to its own dashboard and reaches OTel only through third-party processors. Marg is in the first group, with dashboards and alerts as code for one backend and a page per OTLP backend. ADK's metric names (gen_ai.client.token.usage, gen_ai.invoke_agent.duration) and Pydantic AI's instrumentation version 5 (gen_ai.aggregated_usage.*) are worth matching as the conventions settle: a check item, not a gap.
Model providers
LangChain lists 88 chat providers, Pydantic AI about 35 prefixes with a FallbackModel, ADK routes through LiteLLM with a RoutedLlm and a FallbackModel, the OpenAI SDK is OpenAI-first with LiteLLM and the Vercel AI SDK as adapters. Marg has 22 presets over two adapters, a chain with failover and a breaker per endpoint, and a page each. Parity for the job shape. One note: Pydantic AI now lists "decision models" (System One among them) as a provider class, which puts Verdict's System One link in company.
The dev UI
| Shows | |
|---|---|
adk web | chat, sessions, state, events with function calls and responses, a trace tab with latency, evals from the UI, a visual builder; confirmation as a dialog |
| OpenAI | none local; the Traces dashboard; a terminal REPL |
| LangSmith Studio | the graph, each step's prompts, tool calls and results, intermediate state, threads, time travel, typed form fields from interrupt(response_schema); needs a LangSmith key even when data stays local |
Pydantic AI clai web | a local chat with a model picker and approve/reject prompts for requires_approval tools |
| Marg playground | one conversation, the live draft with provenance, the trace per turn (runtime or model, tools with time, usage, the create), past chats, openers, a phone layout |
Marg's draft-with-provenance pane has no equivalent anywhere; it is the view of the job. What the peers show that Marg does not: a tool call's arguments and result, the route decision with its confidence, a step's state, and, in Studio, time travel. The first three are the roadmap's own words for 0.3's trace pane and the gateway already logs them per turn. Roadmap (0.4), with the reload gap beside it. Time travel is declined: a journey is a draft, not a graph of checkpoints, and "Change something" is the user's time travel.
The CLI
adk has fourteen subcommands including deploy, eval, conformance, optimize; langgraph has new, dev, up, build, deploy; clai is a chat; the OpenAI SDK has none. marg has five. The two that matter for the shape, new and check, are there; deploy is declined (one image, a Compose file and a Render blueprint are the deploy story, and a hosted runtime is not Marg's job). The silent-flag defect found in the walk is fixed.
Deployment
ADK deploys to Cloud Run, GKE and a managed runtime from the CLI; LangGraph to a paid platform or a licensed standalone server; Pydantic AI runs under Temporal, DBOS or Prefect for durability; the OpenAI SDK leaves it to you. Marg ships an image, Compose profiles, a TLS edge and a blueprint for the free tier, and its sessions are durable in a store with fallback. Durable execution of a graph is declined for the same reason as time travel: the unit of resumption is the draft, and the transcript endpoint redraws the open ask. Nothing to add for 0.4.
Docs and site
All four peers publish llms.txt; ADK carries a "Supported in Python vX · TypeScript vY" badge per page; LangChain and Pydantic AI serve every page as markdown by suffix. Marg's site now publishes /llms.txt (fixed), every page carries a "Source" link to its markdown in the repository, and search works. The per-page "since" line is the one promise from 0.3 not kept. Roadmap (0.4).
The method for coding agents
Every peer now ships skills: ADK's Agents CLI (seven skills, Python only, with scaffold, eval, deploy), OpenAI's agents-sdk skill, langchain-skills, Pydantic's pydantic/skills, all installable with npx skills add. Marg's build-a-domain skill is the same idea with a narrower and more testable claim (a domain that passes check:scaffold's shape and its own suite); it is installed by create-marg-app and loaded from .claude/skills. What is missing is the one-line install for a project that did not come from create-marg-app, and a line on the site saying so. Roadmap (0.4), small.
Human input and the write
The reason Marg exists, so the longest row. Since the earlier review the peers have moved:
- ADK's tool confirmation is still labelled experimental; the yes comes back as a structured
adk_request_confirmationresponse that code reads. Graph workflows gainedRequestInputwith aresponse_schema, documented as not validating the structure, andrequire_confirmationon workflow nodes. - The OpenAI SDK pauses on
needsApprovaland resumes throughstate.approve()/state.reject(): the yes is an API call, never prose. No structured input beyond a string. - LangGraph's
interrupt(response_schema=…)validates the resume value against a schema and Studio renders typed fields; the human-in-the-loop middleware takes approve / edit / reject / respond decisions as data. - Pydantic AI's
requires_approval,DeferredToolRequestsandToolApproved/ToolDeniedmake the decision an object the application builds; the web UI has approve and reject buttons; the docs warn the adapter does not verify the client's approval.
So every peer now reads the yes in code when the yes is a button. None of them reads a typed reply by its whole content, none owns the question's wording or the choice of control, none carries the settled value into later tool calls so the model's own value cannot stand, none fingerprints the summary a confirmation refers to, and none gates the write three times. Where a visitor would expect convergence is the schema on the resume value: that validates the shape of what a form sends, which Marg has done since 0.1, and says nothing about a reply typed beside it. The comparison page now says this in one sentence. Nothing to add; the wedge holds and is now easier to state.
4. The gaps, ranked and classified
Rank is by what it costs a newcomer or a user, highest first.
| # | Gap | Class | What was done or will be |
|---|---|---|---|
| 1 | The published 0.2.1 cannot back three site claims (Python tools, simulated users, lexicons) | fix now | 0.3.0 released from this review |
| 2 | A partial form submit came back empty and unmarked | fix now | the engine fix, formRow, the scenario strengthened |
| 3 | marg new … --lang python silently wrote a TypeScript server on the older CLI | fix now | unknown flags are an error; the template is checked before writing; --version; verdict --help |
| 4 | The trace pane lacks tool arguments and results, the route decision with its confidence, a step's state | roadmap 0.4 | item 1 |
| 5 | The Draft and Trace panes are empty after a reload | roadmap 0.4 | item 1 |
| 6 | The quickstart, the playground page, the README and the FAQ said things the visitor does not see | fix now | reworded |
| 7 | A fresh scaffold's placeholders appeared as suggested openers | fix now | skipped on the empty state |
| 8 | No model-played simulated user ships | roadmap 0.4 | item 2 |
| 9 | No llms.txt | fix now | written by the sync |
| 10 | No "since" line per page; nothing on the site says which version is live | roadmap 0.4 | item 3 |
| 11 | The skill has no one-line install outside create-marg-app | roadmap 0.4 | item 4 |
| 12 | Evals from the dev UI (ADK) | decline | a scenario is code in a suite that runs in CI; a UI that writes scenarios would make them a second artefact to keep green |
| 13 | A model judge in the evals | decline | a judge cannot be a merge gate; the checks assert what must always hold |
| 14 | Time travel over checkpoints, durable graph execution | decline | the draft is the unit of resumption; "Change something" is the user's time travel; sessions are already durable with fallback |
| 15 | marg deploy, a hosted runtime | decline | one image, Compose profiles, an edge, a blueprint; hosting is not Marg's job |
| 16 | A one-line agent without a domain folder | decline | the folder is the product; the first screen says so |
| 17 | Tool-output guardrails as middleware (ADK's after_tool_callback, the OpenAI SDK's tool guardrails) | decline | the tool server owns its output; two-stage trimming and PII scrubbing in read tools cover the runtime's side |
5. What 0.4 is
Four items, in order of leverage, each with its acceptance test, in ROADMAP.md: the trace pane that shows what the gateway already knows and survives a reload; a model-played user beside the cooperative one; the "since" line and the live version on the site; the skill installable in one line anywhere. Everything else in the table above is either done in 0.3.0 or declined with its reason here.
Source: docs/reviews/0.3-review-2026-10.md — edit it there; the site mirrors the repository.