Add Muse Code as the 31st runtime (protocol-read, not file-read) - #5761
Conversation
✅ Drift Bot (ClawMetry): no drift detectedDrift Bot analyzed the changed files against this project's blueprints and requirements and found no drift. |
Visual diffComparing 48 of 72 comparison(s) flagged (>1% pixel diff).
Folder: 3c97f36a6802. Full PNGs also attached as a workflow artefact. Generated by visual-diff bot. Pixel diffs >1% flagged; eyeball the table before merging. This check is non-blocking — fail = bot bug, not a code problem. |
…rom it The blurb opened with OpenClaw and NVIDIA NemoClaw — the names someone who already knows us recognises, not the names a stranger searches for. Claude Code and Codex now lead, then Hermes, then OpenClaw. NemoClaw drops out of the marquee: a strong logo but a weak search term, and every name in the tuple costs one from the "& N more" tail. It keeps its free-tier billing in the README's "What's free" row and its own grid link. NAMED_IN_TAGLINE was a literal 4 — the same bug one layer down, since it would not have followed the marquee anywhere. It is now len(marquee()), and a new test pins the README tagline to RUNTIME_MARQUEE in order, so the tagline and the About blurb cannot name different runtimes while sharing the same "& N more" arithmetic. Muse Code is not added here: an id in the marquee must exist in the catalogue, or the blurb names a runtime nobody can install. It goes in on the branch that lands the runtime (#5761). Verified red: growing the marquee by one without touching the README fails the tagline test and the export check, and --check reports the stale "& 26 more". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F6yVfSnXoSNgz1E55dm3NC
|
Heads-up from #5762, which adds The marquee is now ordered for conversion — Claude Code, Codex, Hermes, OpenClaw — and Muse Code belongs in it, but it can't be added there: an id in that tuple must exist in the catalogue, or the blurb names a runtime nobody can install ( Whichever of us merges second, add one line to RUNTIME_MARQUEE: tuple[str, ...] = (
"claude_code",
"codex",
+ "muse_code",
"hermes",
"openclaw",
)Then Result once both are in — 31 runtimes, 5 named, and the tail arithmetic stays put:
That string is what Not pushing it here: this worktree has uncommitted changes from another session ( |
|
|
|
||
| ## What is this? | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. |
There was a problem hiding this comment.
The CLAUDE.md file states "31 AI agent runtimes" but describes them as "Goose free in OSS, the other 27", which totals only 30 (3 free + 27 paid). With Muse Code added as the 31st runtime, the text should say "the other 28" paid runtimes.
|
|
||
| ## Quick context | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`; never hardcode the list or the count. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`; never hardcode the list or the count. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. |
There was a problem hiding this comment.
The AGENTS.md file states "31 AI agent runtimes" but describes only "Claude Code, Codex, Cursor and 24 more" paid runtimes, totaling 27 paid (3 + 24). With Muse Code added as the 31st runtime, the text should say "25 more" for a total of 28 paid runtimes.
|
|
|
||
| ## What is this? | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. |
There was a problem hiding this comment.
CLAUDE.md states "31 AI agent runtimes" but describes "the other 27" paid runtimes (3 free + 27 = 30 total). With Muse Code as the 31st, it should say "the other 28" for 3 + 28 = 31.
|
|
||
| ## Quick context | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`; never hardcode the list or the count. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`; never hardcode the list or the count. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. |
There was a problem hiding this comment.
AGENTS.md states "31 AI agent runtimes" but lists "Claude Code, Codex, Cursor and 24 more" (3 + 24 = 27 paid). Should say "25 more" for 28 paid runtimes to total 31.
|
✨ auto-fixed: merged latest main into branch (was BEHIND; no conflicts) Generated by Claude Code |
|
|
|
||
| ## What is this? | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. |
There was a problem hiding this comment.
CLAUDE.md states "31 AI agent runtimes" but describes "the other 27" paid runtimes (3 free + 27 = 30 total). With Muse Code as the 31st, it should say "the other 28" to correctly total 31 runtimes.
|
|
||
| ## Quick context | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`; never hardcode the list or the count. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`; never hardcode the list or the count. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. |
There was a problem hiding this comment.
AGENTS.md states "31 AI agent runtimes" but lists "Claude Code, Codex, Cursor and 24 more" (3 + 24 = 27 paid). Should say "25 more" for 28 paid runtimes to total 31.
…s from (#5762) * Make SUPPORTED_RUNTIMES.txt the one runtime list every surface derives from The GitHub "About" blurb said "26 AI agent runtimes" while the catalogue had 30, and every guard in this repo was green. It is repo *metadata* — no file, no diff, no CI could see it. The same shape held in the sibling repos, each carrying its own hand-typed list frozen at whatever the number was the day someone last edited it: clawmetry-pro said 22, clawmetry-landing 21, clawmetry-cloud 14. Four lists, four numbers, none visible to the others. This repo already derived the *count* (entitlements.py -> RUNTIME_COUNT -> sync_runtime_count.py). What it never exported was the *list*, so nothing outside it could derive anything. - SUPPORTED_RUNTIMES.txt: generated export of the catalogue — id, label, free/paid tier, clawmetry.com path per runtime, plus COUNT and the canonical one-line BLURB. Deliberately trivial grammar (comments, KEY = value, TAB-separated rows) so a five-line parser in any language reads it; parse_export() is the reference implementation. - entitlements.RUNTIME_MARQUEE: the runtimes named by name in short copy, so "& N more" has one definition instead of one per surface. - sync_runtime_count.py grows --about (prints the blurb) and generates + --checks the export alongside the prose counts it already guarded. - sync-github-about.yml pushes the derived blurb to the repository description on main, so the surface with no CI finally has one. It warns and prints the text rather than failing when REPO_ADMIN_TOKEN is unset. - README tagline: linked OpenClaw and NemoClaw but not Claude Code or Codex, which read as "those two are more supported". Links dropped from the tagline (the grid below links all 30) and pointed at the list instead. - FLYWHEEL/CLAUDE/AGENTS point at the file as the single source. tests/test_supported_runtimes_file.py pins the export against the imported catalogue, the metadata against its own rows, the blurb under GitHub's 350 character cap, and "& N more" against the names actually printed. Verified red first: adding a runtime to entitlements.py alone fails 3 of its 7 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F6yVfSnXoSNgz1E55dm3NC * Lead the marquee with Claude Code and Codex, and derive the tagline from it The blurb opened with OpenClaw and NVIDIA NemoClaw — the names someone who already knows us recognises, not the names a stranger searches for. Claude Code and Codex now lead, then Hermes, then OpenClaw. NemoClaw drops out of the marquee: a strong logo but a weak search term, and every name in the tuple costs one from the "& N more" tail. It keeps its free-tier billing in the README's "What's free" row and its own grid link. NAMED_IN_TAGLINE was a literal 4 — the same bug one layer down, since it would not have followed the marquee anywhere. It is now len(marquee()), and a new test pins the README tagline to RUNTIME_MARQUEE in order, so the tagline and the About blurb cannot name different runtimes while sharing the same "& N more" arithmetic. Muse Code is not added here: an id in the marquee must exist in the catalogue, or the blurb names a runtime nobody can install. It goes in on the branch that lands the runtime (#5761). Verified red: growing the marquee by one without touching the README fails the tagline test and the export check, and --check reports the stale "& 26 more". Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F6yVfSnXoSNgz1E55dm3NC --------- Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
|
|
|
||
| ## What is this? | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. |
There was a problem hiding this comment.
CLAUDE.md states "31 AI agent runtimes" but describes "the other 27" paid runtimes (3 free + 27 = 30 total). With Muse Code as the 31st, it should say "the other 28" to correctly total 31 runtimes.
|
|
||
| ## Quick context | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`; never hardcode the list or the count. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`; never hardcode the list or the count. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. |
There was a problem hiding this comment.
AGENTS.md states "31 AI agent runtimes" but lists "Claude Code, Codex, Cursor and 24 more" (3 + 24 = 27 paid). Should say "25 more" for 28 paid runtimes to total 31.
| <a href="https://www.producthunt.com/products/clawmetry?embed=true&utm_source=badge-top-post-badge&utm_medium=badge&utm_campaign=badge-clawmetry-for-openclaw" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=1081207&theme=light&period=daily&t=1771491508782" alt="ClawMetry - #5 Product of the Day on Product Hunt" width="250" height="54" /></a> | ||
|
|
||
| **Observa a tu agente pensar.** Observabilidad en tiempo real para **30 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex y 26 más. Un solo panel para toda tu flota de agentes. | ||
| **Observa a tu agente pensar.** Observabilidad en tiempo real para **31 runtimes de agentes de IA**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex y 26 más. Un solo panel para toda tu flota de agentes. |
There was a problem hiding this comment.
Spanish README updated runtime count to 31 but still says "Claude Code, OpenAI Codex y 26 más" instead of "27 más", totaling only 30 (3 + 26). Should increment the descriptive count from 26 to 27.
Meta ships two products called Muse. The consumer personal agent runs
wholly inside Meta's "Muse Secure VM" with no API and no local
footprint, so it cannot be observed and is deliberately NOT a runtime
here; a guard asserts it never enters the catalogue. Muse Code, Meta's
terminal coding agent on Muse Spark, is a local process with a
documented protocol, and that is what this adds.
It is the first runtime read over a PROTOCOL rather than off disk.
Muse publishes no session-log schema, so rather than reverse-engineer
one the adapter (clawmetry-pro) spawns `muse serve` and calls the two
documented read-only MSP surfaces: session/list ("read-only, never
touches leases") and session/read (a point-in-time cold read that never
subscribes). MSP also reports each session's own durable log path, so
nothing is guessed. The adapter requests no capabilities -- in
particular not `userShell`, which would let the connection run commands
in the workspace -- and MSP's control half (turn/start,
approval/decide) is deliberately not wired: that would be a fifth way
to affect an agent and needs the CLAUDE.md locks.
OSS side:
* catalogue, loader tuple, labels, landing path and every session-prefix
set that splits "muse_code:<id>"
* pricing: the muse-spark entries were a $1.00/$3.00 placeholder with a
comment asking to be updated once Meta published rates. Meta has, so
they now carry the published Meta Model API figures. The two 1.3
variants are listed separately because contributor is 12.5x cheaper on
input and ~21x on output -- one family rate would misreport whichever
tier the user is not on. Before this, every muse-spark model fell
through to the (1.0, 3.0) unknown-provider default.
* MCP: Muse speaks MCP, so it is registered rather than declared
MCP-less, with a `json_muse` writer for its own mcp_servers/transport
shape. Creating the settings file seeds `schema_version: 1` -- without
it Muse FAILS AT STARTUP, so a bare {"mcp_servers": ...} would leave a
user unable to launch Muse at all. Uninstall never seeds.
* control: Muse Code runs a real local process tree, but MSP reports no
pid anywhere, so a resolver would have to match argv+cwd and that has
not been verified against a real `muse`. It is therefore `unknown`,
not `unsupported` -- "unsupported" asserts no per-session process
exists here ever, which would be false -- and no buttons are offered.
A resume hint covers the gap.
* runtime_records declares tokens on-disk, cost derived, and names the
one honest gap: MSP's counted-once prompt total rides a live view
notification a cold read does not serve, so our input figure is the
raw provider counter and cached tokens are never added to it.
Runtime count 30 -> 31 via scripts/sync_runtime_count.py.
No-PRD: adding a vendor runtime adapter to an existing, documented
extension seam; no new product surface or user-facing behaviour beyond
one more runtime in the existing catalogue.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019cGLYe3MnE6pfMupvvnTJK
Installed muse 1.0.3 and ran the adapter against it. The handshake, session/list and session/read all work as written, but two path facts taken from the docs were wrong and would have shipped: * The muse HOME is `$XDG_DATA_HOME/muse` (default `~/.local/share/muse`) — `InitializeResult.museHome` returns exactly that — and it holds `session-index.db` plus `sessions/YYYY/MM/DD/<uuid>/session.jsonl`. `~/.config/muse` holds only settings.json and auth.json. The adapter had these as one directory and looked for settings in the store. * macOS follows XDG here; it does NOT use ~/Library/Application Support. `MUSE_HOME` is not honoured by the binary at all (setting it changes nothing) — `XDG_DATA_HOME` is the only lever. The probe now leads with `session-index.db`, because that is the only one of these that proves Muse actually RAN: `~/.config/muse` is created by a first launch that FAILED for want of credentials (observed), so the bare directory proves installation at most and is no longer listed. detect() reports museHome, configDir, hasSessionIndex and hasSettings separately, so a reader can see which evidence was found rather than trusting one boolean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019cGLYe3MnE6pfMupvvnTJK
test_phase4_adapter_move: bump expected adapter count 28 → 29 for Muse Code. test_self_diagnostics: _seed / _foreign_present / _ours_present / test_hand_written_entry_is_never_deleted all used the generic mcpServers fallthrough for muse_code, but json_muse format stores servers under mcp_servers. Add explicit json_muse branches so install, status, and uninstall round-trips work correctly for the new runtime. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A6He4362SAvFvEgXV5rZv2
scripts/sync_runtime_count.py --check was failing because app.js still referenced 30 runtimes after the 31st was added. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N2PaCRunX6NzsP9KADLJBw
2d3cf90 to
54982a7
Compare
Non-mergeable PR sweep — 2026-09-09Automated sweep across all 3 repos (clawmetry, clawmetry-cloud, clawmetry-landing).
What was done on this PR
Generated by Claude Code |
|
…rge) I left the Meta cache arm out of estimate_event_cost_usd on the grounds that MSP documents `cachedTokens` as sitting either inside or beside `inputTokens` depending on provider, and wiring a rate on a guessed convention moves real dollars on a guess. Running a real Muse Code turn settled it. Each `session/tokenUsage` leg's `cumulative.promptTokens` delta equals that leg's `inputTokens` exactly, cache included — so for Meta the cached tokens are INSIDE input, the OpenAI convention, and the cached slice replaces its ordinary input charge rather than adding to it. It matters more than the usual rounding: 82.7% of the measured turn's input was cache reads, so the flat input rate over-charged 5.1x ($0.016280 vs the correct $0.003204). A flat multiplier cannot serve both tiers either — standard's cached rate is 0.12x its input rate and contributor's is 0.02x — hence an explicit _META_CACHED_RATES table with longest-prefix matching, mirroring MODEL_OVERRIDES. Also corrects the runtime_records evidence sentence, which claimed token counters ride each transcript item. They do not; that was the bug. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019cGLYe3MnE6pfMupvvnTJK
|
|
||
| ## What is this? | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. **Never type that number or that list anywhere new: [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) is the generated single source every surface derives from** (`python3 scripts/sync_runtime_count.py`; `--check` fails CI on drift). `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. **Never type that number or that list anywhere new: [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) is the generated single source every surface derives from** (`python3 scripts/sync_runtime_count.py`; `--check` fails CI on drift). `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. |
There was a problem hiding this comment.
CLAUDE.md states "31 AI agent runtimes" but describes "the other 27" paid runtimes. With Muse Code as the 31st, it should say "the other 28" to correctly total 31 runtimes (3 free + 28 paid).
|
|
||
| ## Quick context | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`, exported to [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) — the single file every marketing surface and sibling repo reads. Never hardcode the list or the count; regenerate with `python3 scripts/sync_runtime_count.py`. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`, exported to [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) — the single file every marketing surface and sibling repo reads. Never hardcode the list or the count; regenerate with `python3 scripts/sync_runtime_count.py`. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. |
There was a problem hiding this comment.
AGENTS.md states "31 AI agent runtimes" but lists "Claude Code, Codex, Cursor and 24 more" (totaling 27 paid). Should say "25 more" for 28 paid runtimes to correctly total 31.
#5762 made SUPPORTED_RUNTIMES.txt the one list every other repo reads, and it landed on main after this branch opened, so Muse Code was in the catalogue but missing from the generated export — exactly the "in one list, absent from the other" split that file exists to close. Regenerated from entitlements.py rather than hand-edited. RUNTIME_MARQUEE is deliberately left alone: it is the curated short list of names used in tweet-length copy, not a membership roll, and a 31st runtime does not belong in a four-name marquee. Also exempts one line the regenerator rewrote by mistake. The comment above RUNTIME_MARQUEE narrates a PAST bug — the README once said "& 26 more" next to "30 runtimes" — and bumping that 30 to 31 makes the sentence describe a state that never happened. There was already a precedent for this ("historic bug narrative" on runtime_memory.py), so this joins it rather than reshaping the prose. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019cGLYe3MnE6pfMupvvnTJK
|
|
|
||
| ## What is this? | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. **Never type that number or that list anywhere new: [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) is the generated single source every surface derives from** (`python3 scripts/sync_runtime_count.py`; `--check` fails CI on drift). `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** — [OpenClaw](https://github.com/openclaw/openclaw), NVIDIA NemoClaw and Goose free in OSS, the other 27 (Claude Code, Codex, Cursor, Copilot, Gemini CLI, Hermes, Aider, opencode, ...) with the optional Pro plugin. **Never type that number or that list anywhere new: [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) is the generated single source every surface derives from** (`python3 scripts/sync_runtime_count.py`; `--check` fails CI on drift). `pip install clawmetry && clawmetry` — that's it. Zero config, observation by default. |
There was a problem hiding this comment.
CLAUDE.md states "31 AI agent runtimes" but describes "the other 27" paid runtimes (3 free + 27 = 30 total). With Muse Code as the 31st, it should say "the other 28" to correctly total 31 runtimes.
|
|
||
| ## Quick context | ||
| ClawMetry is an open-source, real-time observability and governance layer for **30 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`, exported to [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) — the single file every marketing surface and sibling repo reads. Never hardcode the list or the count; regenerate with `python3 scripts/sync_runtime_count.py`. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. | ||
| ClawMetry is an open-source, real-time observability and governance layer for **31 AI agent runtimes** (OpenClaw, NemoClaw and Goose free in OSS; Claude Code, Codex, Cursor and 24 more with the Pro plugin). The catalogue is `entitlements.FREE_RUNTIMES | PAID_RUNTIMES`, exported to [`SUPPORTED_RUNTIMES.txt`](./SUPPORTED_RUNTIMES.txt) — the single file every marketing surface and sibling repo reads. Never hardcode the list or the count; regenerate with `python3 scripts/sync_runtime_count.py`. `pip install clawmetry && clawmetry` — zero config, observation by default. It's a Flask app with an embedded, no-build vanilla-JS frontend; a sync daemon ingests filesystem/gateway/OTLP data into a local **DuckDB** store, and the app reads from DuckDB to serve the UI. |
There was a problem hiding this comment.
AGENTS.md states "31 AI agent runtimes" but lists "Claude Code, Codex, Cursor and 24 more" (3 + 24 = 27 total). Should say "25 more" for 28 paid runtimes to correctly total 31.
Drift Bot flagged 8 surfaces claiming 31 runtimes while their prose still
added up to 30, and it was right on every one.
sync_runtime_count.py updates the headline number but deliberately does
not touch the localised "and N more" phrasings — it prints them as a
note instead, because the wording varies too much per locale to rewrite
unattended. I read that note when I ran it and did not act on it, which
is precisely how a note-only warning decays into drift.
Each i18n tagline names 4 runtimes, so N is 31 - 4 = 27, matching the
English README's auto-derived "& 27 more":
ar de es es-419 fil fr hi pt-BR pt-PT 26 -> 27 more
ar de hi 30 -> 31 runtimes (the localised
headline the regex never matched)
CLAUDE.md 3 free + "the other 27" -> 28
AGENTS.md 3 free + 3 named + 24 -> 25
Drift Bot flagged 6 of these; ar, de and hi were stale in the other
direction (still "30 runtimes", so internally consistent and invisible to
a check that only compares the two numbers on one line) and are fixed
here too.
Follow-up worth having, not taken in this PR: the number IS derivable
(total minus names) and the script already locates every one of these
lines, so it could rewrite just the digit rather than printing a note
nobody acts on.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019cGLYe3MnE6pfMupvvnTJK
|
| <a href="https://www.producthunt.com/products/clawmetry?embed=true&utm_source=badge-top-post-badge&utm_medium=badge&utm_campaign=badge-clawmetry-for-openclaw" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=1081207&theme=light&period=daily&t=1771491508782" alt="ClawMetry - #5 Product of the Day on Product Hunt" width="250" height="54" /></a> | ||
|
|
||
| **Δες τον agent σου να σκέφτεται.** Παρατήρηση σε πραγματικό χρόνο για **30 runtimes AI agent**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex & 26 ακόμη. Ένας πίνακας ελέγχου για ολόκληρο τον στόλο σου από agents. | ||
| **Δες τον agent σου να σκέφτεται.** Παρατήρηση σε πραγματικό χρόνο για **31 runtimes AI agent**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex & 26 ακόμη. Ένας πίνακας ελέγχου για ολόκληρο τον στόλο σου από agents. |
There was a problem hiding this comment.
Greek README updated runtime count to 31 but still says "& 26 ακόμη" instead of "27 ακόμη", totaling only 30. The descriptive count was not incremented to match the new total.
| <a href="https://www.producthunt.com/products/clawmetry?embed=true&utm_source=badge-top-post-badge&utm_medium=badge&utm_campaign=badge-clawmetry-for-openclaw" target="_blank"><img src="https://api.producthunt.com/widgets/embed-image/v1/top-post-badge.svg?post_id=1081207&theme=light&period=daily&t=1771491508782" alt="ClawMetry - #5 Product of the Day on Product Hunt" width="250" height="54" /></a> | ||
|
|
||
| **ดูความคิดของเอเจนต์คุณแบบเรียลไทม์** ระบบสังเกตการณ์แบบเรียลไทม์สำหรับ **30 AI agent runtimes**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex และอีก 26 ตัว แดชบอร์ดเดียวสำหรับกองเอเจนต์ทั้งหมดของคุณ | ||
| **ดูความคิดของเอเจนต์คุณแบบเรียลไทม์** ระบบสังเกตการณ์แบบเรียลไทม์สำหรับ **31 AI agent runtimes**: [OpenClaw](https://github.com/openclaw/openclaw), [NVIDIA NemoClaw](https://github.com/NVIDIA/NemoClaw), Claude Code, OpenAI Codex และอีก 26 ตัว แดชบอร์ดเดียวสำหรับกองเอเจนต์ทั้งหมดของคุณ |
There was a problem hiding this comment.
Thai README updated runtime count to 31 but still says "อีก 26 ตัว" instead of "27 ตัว", totaling only 30. The descriptive count was not incremented to match the new total.
Drift Bot flagged 2 more (el, th). Fixing only those would have repeated
the mistake that produced them: I hand-listed the phrasings I expected
("y 26 más", "et 26 autres", ...) instead of sweeping every locale, so I
fixed the ones I could think of and missed the rest.
Swept all 35 instead, matching on the NUMBER rather than the wording, and
found 24 stale — Drift Bot could only see 2 of them. The other 22 said
"30 runtimes ... 26 more": internally consistent, so invisible to a check
that compares the two numbers on one line, and wrong against a catalogue
of 31.
Two more were invisible to the sweep itself: bn and fa write their
numerals in native script (২৬/৩০, ۲۶/۳۰), which no ASCII \d pattern
matches. Those are fixed by mapping digit VALUES to codepoints rather
than typing glyphs, and the final check normalises Bengali, Persian,
Arabic-Indic and Devanagari digits before comparing.
All 35 locales now read 31 runtimes / 27 more, agreeing with the English
README's auto-derived "& 27 more" (31 total - 4 named).
Replacement is guarded: a tagline where the number appears more than once
is skipped and reported rather than rewritten, so a locale whose sentence
happens to contain another 26 is left for a human.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019cGLYe3MnE6pfMupvvnTJK
✅ Drift Bot (ClawMetry): no drift detectedDrift Bot analyzed the changed files against this project's blueprints and requirements and found no drift. |
Adds Meta's Muse Code — its terminal coding agent on Muse Spark — as a supported runtime. Pairs with clawmetry-pro#238, which carries the adapter.
Two products called Muse; only one is observable
The consumer Muse personal agent runs wholly inside Meta's "Muse Secure VM": no API, no SDK, no local footprint, and Meta says it cannot be self-hosted. There is nothing on the machine to ingest and no process to signal, so it is deliberately not a runtime and
test_the_consumer_muse_agent_is_not_claimed_as_a_runtimekeeps it out of the catalogue.Muse Code is the opposite: a local process tree, an open-source CLI, real hooks, and a documented protocol.
The first runtime read over a protocol
Muse publishes no session-log schema, so the adapter spawns
muse serveand calls the two documented read-only MSP surfaces (session/list,session/read) rather than reverse-engineering a file format. Details in the pro PR; what OSS owns is everything below.What changed here
Catalogue + loader.
PAID_RUNTIMES,_FAMILY_ADAPTER_SPECS, labels, landing path, and every session-prefix set that splitsmuse_code:<id>(local_store,routes/usage,routes/attention,routes/harness). Both lists are required and independent — 11 adapters once shipped in the wheel while absent from the loader tuple, so those runtimes were never ingested and nothing raised.Pricing — the placeholder finally has real numbers. The
muse-sparkentries carried a$1.00/$3.00placeholder with a comment asking to be updated once Meta publishes official pricing. Meta has, so they now carry the published Meta Model API rates:muse-spark-1.3muse-spark-1.3-contributorThe two variants are listed separately because contributor is 12.5× cheaper on input and ~21× on output — one family rate would misreport whichever tier the user is not on. Before this, every
muse-sparkmodel fell through to the(1.0, 3.0)unknown-provider default: the same dollars for every model, i.e. a guess wearing a number's clothes.MCP — registered, with a bricking hazard closed. Muse Code speaks MCP, so declaring it MCP-less would be a false statement about the runtime. Added a
json_musewriter for its ownmcp_servers/transportshape (themcpServers/typespelling every other runtime uses would be silently ignored by Muse).The trap: Muse's settings file must contain
"schema_version": 1or the app fails at startup, and_read_json_filereturns{}for a missing file — so an install on a machine with no settings file would have written a bare{"mcp_servers": ...}and left the user unable to launch Muse at all. Specs now carry aseedapplied only when creating the file from nothing, never merged into a file the user already has, and never on uninstall.Control —
unknown, notunsupported. Muse Code runs a real local process per session, so Stop and Kill would work — but MSP reports no pid anywhere, so a resolver would have to match argv+cwd, and that has not been verified against a realmuse.unsupportedasserts no per-session process exists here ever, which would be false;unknownis the module's own documented third answer. No buttons are offered rather than offered and inert, and a resume hint covers the gap.Declared records.
runtime_recordssays tokens on-disk, cost derived, model on-disk, and names the one honest gap: MSP's counted-once prompt total — the figure that resolves whether cached tokens sit inside or beside the input count — rides a live view notification that a cold read does not serve, so our input figure is the raw provider counter and cached tokens are never added to it.docs/compatibility.mdcarries the same row.Not in
context_coverage— deliberately. Muse Code emits real compaction items, so a zero blowout count here is a real zero and must not be labelled "absence proves nothing".Runtime count 30 → 31 via
scripts/sync_runtime_count.py(that is the bulk of the diff: prose across README, docs, i18n, CLI, device page).Testing
tests/test_muse_code_runtime_wiring.py(23 tests, registered inci.yml) covers the catalogue/loader pair, the pricing rows and prefix precedence, the MCP writer including theschema_versionseed and the uninstall case, the control verdict, and the declared records. 470 tests pass across the affected OSS files.make lintfails identically on cleanorigin/main(228 pre-existing ruff errors indashboard.pyetc.); the files added here are clean.Follow-ups
approval/decidewould let Guard resolve a pending approval rather than only signalling a process — better than what we have for any other runtime, and a separate change needing the three intervention locks.unknowninto working buttons; needs a livemuse./runtimes/muse-codemust exist and the hero count needs 30 → 31, in the landing repo.No-PRD: adding a vendor runtime adapter to an existing, documented extension seam; no new product surface or user-facing behaviour beyond one more runtime in the existing catalogue.
🤖 Generated with Claude Code
https://claude.ai/code/session_019cGLYe3MnE6pfMupvvnTJK