Skip to content

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:

FeatureOn the siteProofGuard
Nine packages on npm, create-marg-appQuickstartnpx create-marg-app@latest demo && npm install && npm run gatewaycheck: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 projectcheck:create runs it
The site, search, the comparison page, the FAQmarg-adk.github.io/margsearch finds readYesNothe pages workflow builds every PR; a dead link fails it
The playground as the dev UI: draft and trace panes, openers, a phone layoutGet started → The playgroundthe six-turn journey; the trace shows create_ticketnpm test (the widget under a fake DOM), the image job serves the page
The build-a-domain skill for coding agentsBuild → Build with a coding agenta created project has .claude/skills/build-a-domain and AGENTS.mdcheck:create asserts the files
A page per model provider and per integrationModels, Integrationsthe env lines on each pagea unit test resolves every preset from the environment
Simulated users in the evalsBuild → Evals, "Simulated users"the simulated-user scenario in both example suitesthe example suites in CI
The bookings example and two-domain routingBuild → The bookings examplenpm run evals:bookingsCI
The English reader core, Hinglish as an opt-in lexiconBuild → Readers, "Registers"AGENT_LEXICONS=hinglish; the gateway logs what it loadedreply-words.test.ts, lexicons/hinglish.test.ts
A Python tool-server templateBuild → Tools in Pythonmarg new bookings --lang pythonSCAFFOLD_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.xpip 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
Margnpx 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 keyModel-judgedSimulated user
ADKtrajectory and ROUGE criteria, conformance recordings, adk eval in CIrubric, hallucination, safety, multi-turn (Vertex)a generative user with personas and a stop signal; no model-free mode
OpenAI Agents SDKScriptedModel, call inspection, drift detection (the SDK's "Testing")the platform's trace grading, being wound down in late 2026none
LangGraphLangSmith's pytest/Vitest integrations with cached cassettesLLM-as-judge, pairwiseopenevals: scripted turns, then an LLM user with a persona; not claimed deterministic
Pydantic AITestModel, FunctionModel, trajectory evaluators over spansLLMJudgenone
Margscenarios against a writes-off gateway, the scripted mock model, flake classification, the gate in CInonecooperativeUser, 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 webchat, sessions, state, events with function calls and responses, a trace tab with latency, evals from the UI, a visual builder; confirmation as a dialog
OpenAInone local; the Traces dashboard; a terminal REPL
LangSmith Studiothe 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 weba local chat with a model picker and approve/reject prompts for requires_approval tools
Marg playgroundone 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_confirmation response that code reads. Graph workflows gained RequestInput with a response_schema, documented as not validating the structure, and require_confirmation on workflow nodes.
  • The OpenAI SDK pauses on needsApproval and resumes through state.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, DeferredToolRequests and ToolApproved / ToolDenied make 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.

#GapClassWhat was done or will be
1The published 0.2.1 cannot back three site claims (Python tools, simulated users, lexicons)fix now0.3.0 released from this review
2A partial form submit came back empty and unmarkedfix nowthe engine fix, formRow, the scenario strengthened
3marg new … --lang python silently wrote a TypeScript server on the older CLIfix nowunknown flags are an error; the template is checked before writing; --version; verdict --help
4The trace pane lacks tool arguments and results, the route decision with its confidence, a step's stateroadmap 0.4item 1
5The Draft and Trace panes are empty after a reloadroadmap 0.4item 1
6The quickstart, the playground page, the README and the FAQ said things the visitor does not seefix nowreworded
7A fresh scaffold's placeholders appeared as suggested openersfix nowskipped on the empty state
8No model-played simulated user shipsroadmap 0.4item 2
9No llms.txtfix nowwritten by the sync
10No "since" line per page; nothing on the site says which version is liveroadmap 0.4item 3
11The skill has no one-line install outside create-marg-approadmap 0.4item 4
12Evals from the dev UI (ADK)declinea scenario is code in a suite that runs in CI; a UI that writes scenarios would make them a second artefact to keep green
13A model judge in the evalsdeclinea judge cannot be a merge gate; the checks assert what must always hold
14Time travel over checkpoints, durable graph executiondeclinethe draft is the unit of resumption; "Change something" is the user's time travel; sessions are already durable with fallback
15marg deploy, a hosted runtimedeclineone image, Compose profiles, an edge, a blueprint; hosting is not Marg's job
16A one-line agent without a domain folderdeclinethe folder is the product; the first screen says so
17Tool-output guardrails as middleware (ADK's after_tool_callback, the OpenAI SDK's tool guardrails)declinethe 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.

Apache-2.0. The docs are mirrored from the repository on every merge.