Make Goose a FREE runtime and open-source its adapter - #5000
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 41 of 66 comparison(s) flagged (>1% pixel diff).
Folder: e5855b20f7b4. 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. |
|
|
Automated sweep — 2026-08-19 All CI check runs are green on this PR. The only blocker is the The finding is that the "Extended Runtime Support" blueprint section doesn't yet document the tier rule for the 23rd runtime (Devin). The code is correct; the blueprint is stale from before Kimi (#4974) and Devin (#4974) landed. No code changes needed here. Once the blueprint is updated at factory.8090.ai, drift-bot will re-run and clear automatically. Generated by Claude Code |
854da98 to
194e4f8
Compare
Non-mergeable PR sweep — 2026-08-19Automated rebase sweep across all three repos (clawmetry, clawmetry-cloud, clawmetry-landing). Results
Per-bucket PR listRebased (conflict resolved):
Not conflicted (blocked/unstable — CI or required checks only, no merge conflict):
Skipped — bot-authored or title-filtered:
Skipped — external contributor (dibs rule):
Skipped — draft:
Generated by Claude Code |
|
| @@ -0,0 +1,788 @@ | |||
| """GooseAdapter — read Goose (Block / block/goose) sessions from its SQLite store. | |||
There was a problem hiding this comment.
The blueprint describes registering paid runtime adapters through PaidRuntimeExtension, but the Goose adapter is free and bundled directly in OSS, bypassing the paid extension mechanism. The blueprint should document the architectural rule: open-source runtimes get free, open-source adapters bundled in OSS; commercial vendor products use paid adapters in clawmetry-pro.
|
| @@ -0,0 +1,788 @@ | |||
| """GooseAdapter — read Goose (Block / block/goose) sessions from its SQLite store. | |||
There was a problem hiding this comment.
The blueprint describes extended runtime support as exclusively delivered through the PaidRuntimeExtension mechanism with free runtimes limited to "openclaw, nemoclaw". The code now implements a second pattern: open-source runtimes get free, open-source adapters bundled directly in OSS (Goose is first), bypassing the paid extension mechanism. This architectural tier rule is not documented in the blueprint.
|
| @@ -0,0 +1,788 @@ | |||
| """GooseAdapter — read Goose (Block / block/goose) sessions from its SQLite store. | |||
There was a problem hiding this comment.
The blueprint describes extended runtime support exclusively through the PaidRuntimeExtension mechanism with free runtimes limited to "openclaw, nemoclaw". This PR introduces a second architectural pattern: open-source runtimes get free, open-source adapters bundled directly in OSS (Goose is first), bypassing the paid extension mechanism entirely. This architectural tier rule ("open-source runtime → free adapter in OSS; commercial vendor product → paid adapter in clawmetry-pro") is not documented in the blueprint.
| # category already publish integration pages, so being the paid option loses | ||
| # the comparison before anyone installs us. | ||
| FREE_RUNTIMES = frozenset({"openclaw", "nemoclaw", "goose"}) | ||
|
|
There was a problem hiding this comment.
The blueprint specifies that RuntimeEntitlementGate returns locked=false for free runtimes (openclaw, nemoclaw), but the code now adds Goose as a third free runtime. The blueprint's system contract does not reflect this tier expansion, creating ambiguity about whether the gate properly handles all three free runtimes.
|
Merge blocker: drift-bot (4 findings) The What needs updating: To fix:
Generated by Claude Code |
|
| # category already publish integration pages, so being the paid option loses | ||
| # the comparison before anyone installs us. | ||
| FREE_RUNTIMES = frozenset({"openclaw", "nemoclaw", "goose"}) | ||
|
|
There was a problem hiding this comment.
The blueprint specifies that RuntimeEntitlementGate returns locked=false only for free runtimes (openclaw, nemoclaw), but the code now includes Goose as a third free runtime. The blueprint's component contract must be updated to reflect the expanded free runtime tier.
| @@ -0,0 +1,788 @@ | |||
| """GooseAdapter — read Goose (Block / block/goose) sessions from its SQLite store. | |||
There was a problem hiding this comment.
The blueprint describes runtime adapter registration exclusively through the PaidRuntimeExtension mechanism for paid runtimes, but this PR establishes a second architectural pattern: open-source runtimes get free, open-source adapters bundled directly in OSS (Goose is the first), bypassing the paid extension mechanism entirely. The blueprint should document this tier rule: open-source runtime → free adapter in OSS; commercial vendor product → paid adapter in clawmetry-pro.
1b07399 to
21d4711
Compare
|
| # category already publish integration pages, so being the paid option loses | ||
| # the comparison before anyone installs us. | ||
| FREE_RUNTIMES = frozenset({"openclaw", "nemoclaw", "goose"}) | ||
|
|
There was a problem hiding this comment.
The blueprint specifies that RuntimeEntitlementGate returns locked=false only for free runtimes (openclaw, nemoclaw), but the code now includes Goose as a third free runtime. The blueprint's component contract must be updated to reflect the expanded free runtime tier.
| @@ -0,0 +1,788 @@ | |||
| """GooseAdapter — read Goose (Block / block/goose) sessions from its SQLite store. | |||
There was a problem hiding this comment.
The blueprint describes runtime adapter registration exclusively through the PaidRuntimeExtension mechanism for paid runtimes. This PR establishes a second architectural pattern: open-source runtimes get free, open-source adapters bundled directly in OSS. The blueprint should document this tier rule explicitly.
There was a problem hiding this comment.
The blueprint specifies the free-only CTA text as "Continue free with OpenClaw + NanoClaw only", but NanoClaw is a paid runtime (not NemoClaw), and the code now correctly includes Goose as a third free runtime. The blueprint must be updated to reflect the current free tier.
|
PR janitor (auto): This PR is blocked solely by the To unblock: re-trigger the Generated by Claude Code |
|
| # category already publish integration pages, so being the paid option loses | ||
| # the comparison before anyone installs us. | ||
| FREE_RUNTIMES = frozenset({"openclaw", "nemoclaw", "goose"}) | ||
|
|
There was a problem hiding this comment.
The blueprint specifies that RuntimeEntitlementGate returns locked=false only for free runtimes (openclaw, nemoclaw), but the code now includes Goose as a third free runtime. The blueprint's component contract must be updated to reflect the expanded free runtime tier.
| @@ -0,0 +1,788 @@ | |||
| """GooseAdapter — read Goose (Block / block/goose) sessions from its SQLite store. | |||
There was a problem hiding this comment.
The blueprint describes runtime adapter registration exclusively through the PaidRuntimeExtension mechanism. This PR establishes a second architectural pattern: open-source runtimes get free, open-source adapters bundled directly in OSS. The blueprint should document this tier rule explicitly: open-source runtime → free adapter in OSS; commercial vendor product → paid adapter in clawmetry-pro.
|
CI is fully green (30/30 checks pass) but this PR has a merge conflict with main that needs manual resolution. Recent merges (#5012, #5011, #4974, #4972, #4707, #4965, #5015, #4971, #4970, #4969) appear to have conflicted with changes in this branch. Please rebase/resolve and re-push. Generated by Claude Code |
169dce8 to
d4bf89c
Compare
|
| # category already publish integration pages, so being the paid option loses | ||
| # the comparison before anyone installs us. | ||
| FREE_RUNTIMES = frozenset({"openclaw", "nemoclaw", "goose"}) | ||
|
|
There was a problem hiding this comment.
Blueprint specifies RuntimeEntitlementGate returns locked=false only for free runtimes (openclaw, nemoclaw), but the code now includes Goose as a third free runtime. The blueprint's component contract must be updated to reflect the expanded free runtime tier.
| @@ -0,0 +1,788 @@ | |||
| """GooseAdapter — read Goose (Block / block/goose) sessions from its SQLite store. | |||
There was a problem hiding this comment.
The blueprint describes runtime adapter registration exclusively through the PaidRuntimeExtension mechanism for paid runtimes. This PR establishes a second architectural pattern: open-source runtimes get free, open-source adapters bundled directly in OSS. This architectural tier rule is not documented in the blueprint and should be added to the Architecture Decision Records.
| var freeRuntimes = (state && Array.isArray(state.free_runtimes) && state.free_runtimes.length) | ||
| ? state.free_runtimes | ||
| : ['openclaw', 'nemoclaw']; | ||
| : ['openclaw', 'nemoclaw', 'goose']; |
There was a problem hiding this comment.
The blueprint specifies the free-only CTA text as "Continue free with OpenClaw + NanoClaw only", where NanoClaw is a paid runtime (not the free NVIDIA NemoClaw). The code now correctly says "Continue free with OpenClaw + NVIDIA NemoClaw + Goose". The blueprint's specification of free-runtime display text must be updated to reflect all three free runtimes and correct the runtime name.
A Goose maintainer offered to accept a ClawMetry tutorial into Goose's own docs on one condition: that it works without a paid plan (aaif-goose/goose#11282). He had read our own words -- docs/compatibility.md said "every other runtime needs a Starter or Pro plan." A production query settled the cost side: of every active paying account, ZERO depend on Goose or on any other open-source runtime. Every payer is anchored on OpenClaw (already free) or on a runtime that stays paid. So the revenue at risk is nil, and the free alternatives in this category already publish Goose integration pages -- being the paid option loses the comparison before anyone installs us. What changes: * goose moves PAID_RUNTIMES -> FREE_RUNTIMES. * clawmetry/adapters/goose.py moves out of the closed clawmetry-pro wheel into this package, with the derive_cost_usd helper it needs (clawmetry/adapters/cost.py). This is the half that matters: a runtime listed as free whose only reader lives in a licence-gated wheel is not free in any sense a user cares about. * sync._FAMILY_ADAPTER_SPECS carries a clawmetry.adapters.* path for it. * test_phase4_adapter_move.py pins the invariant both ways -- every FREE runtime has a bundled adapter, and no PAID adapter ships in the open package. The rule this sets, so the next runtime does not need the argument again: an open-source runtime gets a free, open-source adapter; a commercial vendor product stays paid. Claude Code, Codex, GitHub Copilot, Cursor, Antigravity and Grok are unchanged and now pinned as paid by a test. Recorded in docs/ENTITLEMENTS.md and FLYWHEEL's 1b decision tree, which until now sent every new adapter to clawmetry-pro unconditionally. Truth-sync across the surfaces that encode the split: the /api/runtimes fallback literal, the expired-trial screen's free-runtime list and labels (that screen tells a blocked user what they still get), and clawmetry/runtime_probe.py, which kept its OWN duplicate FREE_RUNTIMES and would have shown Goose as locked during onboarding while the gate allowed it. It imports the catalogue now instead of copying it. Also repairs a pre-existing red test unrelated to this change: test_onboard_runtime_detection.py asserted a hardcoded 19-runtime probe catalogue against the real 22, stale since deepseek_harness/exo/kimi landed. It derives from ALL_RUNTIMES and compares sets now. Verified: 24 ported adapter tests pass against the real-schema Goose fixture, and with clawmetry-pro absent sync._family_adapter_classes() returns exactly ['goose']. Runtime count unchanged at 22 -- a tier move, not a new runtime. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
test_oss_paid_runtime_packaging.py pinned "every _FAMILY_ADAPTER_SPECS row imports from clawmetry_pro.adapters.*", which the Goose move breaks by design. Relaxing it to "anything goes" would throw away the licence gate it exists to protect, so it now checks the property that actually matters: the import path must match the tier. * A PAID runtime pointed at clawmetry.adapters.* still fails — that is the original regression, it ships the paid adapter in the public wheel. * A FREE runtime pointed at clawmetry_pro.adapters.* now fails too. That is the mirror-image bug and it is what we just spent a PR fixing: a runtime advertised as free whose only reader sits behind a licence-gated wheel download. * A new test proves a free spec's module actually exists on disk, so the path claiming OSS cannot be a lie. Verified the guard by flipping claude_code's spec to the OSS path: two tests fail, and pass again on revert. Also allows cost.py and goose.py in the adapters-dir allowlist. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
d4bf89c to
c6b153f
Compare
|
| # category already publish integration pages, so being the paid option loses | ||
| # the comparison before anyone installs us. | ||
| FREE_RUNTIMES = frozenset({"openclaw", "nemoclaw", "goose"}) | ||
|
|
There was a problem hiding this comment.
Blueprint specifies RuntimeEntitlementGate returns locked=false only for free runtimes (openclaw, nemoclaw), but code now includes Goose as a third free runtime. The blueprint's component contract must be updated to reflect the expanded free runtime tier.
| @@ -0,0 +1,788 @@ | |||
| """GooseAdapter — read Goose (Block / block/goose) sessions from its SQLite store. | |||
There was a problem hiding this comment.
Blueprint describes runtime adapter registration exclusively through PaidRuntimeExtension for paid runtimes. This PR establishes a second architectural pattern: open-source runtimes get free, open-source adapters bundled directly in OSS. This tier rule (open-source runtime → free adapter; commercial vendor product → paid) is not documented in the blueprint.
| @@ -61,9 +61,27 @@ | |||
| _HARD_BLOCK_ESCAPE_ENV = "CLAWMETRY_HARD_BLOCK_ESCAPE" | |||
There was a problem hiding this comment.
Blueprint's TrialHardBlockPaywall specifies FREE_RUNTIMES scope includes only (openclaw, nemoclaw), but code now classifies Goose as a free runtime. The blueprint's specification of free versus paid runtime scopes must be updated to reflect the expanded free tier.
|
| # category already publish integration pages, so being the paid option loses | ||
| # the comparison before anyone installs us. | ||
| FREE_RUNTIMES = frozenset({"openclaw", "nemoclaw", "goose"}) | ||
|
|
There was a problem hiding this comment.
Blueprint specifies RuntimeEntitlementGate returns locked=false for free runtimes (openclaw, nemoclaw), but code now classifies Goose as a third free runtime. The blueprint's component specification must be updated to reflect the expanded free runtime tier and the new tier rule: open-source runtimes get free adapters in OSS; commercial vendor products stay paid.
There was a problem hiding this comment.
Blueprint's TrialHardBlockPaywall specifies FREE_RUNTIMES scope as (openclaw, nemoclaw) and lists goose in PAID_RUNTIMES scope, but code now classifies Goose as a free runtime and moves it out of paid scope. The blueprint's free/paid runtime scope classification and the paid-runtime list must be updated to reflect Goose's tier change and the tier rule (open-source runtime → free; commercial vendor → paid).
| @@ -0,0 +1,788 @@ | |||
| """GooseAdapter — read Goose (Block / block/goose) sessions from its SQLite store. | |||
There was a problem hiding this comment.
Blueprint describes runtime adapter registration exclusively through PaidRuntimeExtension for paid runtimes, but this PR establishes a second architectural pattern: free, open-source adapters are bundled directly in OSS (Goose is first). The blueprint's architecture decision records (ADR-001) must be updated to document this tier rule: "An open-source runtime gets a free, open-source adapter; a commercial vendor product stays paid."
|
Automated sweep — merge-readiness check All 35 CI check runs pass. The
These require updating the Extended Runtime Support and Local Agent Observability blueprints at factory.8090.ai — nothing in the code needs to change. The PR is in Generated by Claude Code |
Why
A Goose maintainer offered to accept a ClawMetry tutorial into Goose's own docs, on one condition — that it works without a paid plan (aaif-goose/goose#11282):
He had read our own words.
docs/compatibility.mdsaid "OpenClaw and NVIDIA NemoClaw are free in the OSS package; every other runtime needs a Starter or Pro plan."A production query settled the cost side. Of every active paying account, checked three independent ways (heartbeat
detected_runtimes, runtime-prefixedsession_ids, self-hosted licences): zero depend on Goose, or on any other open-source runtime. Every payer is anchored on OpenClaw (already free) or on a runtime that stays paid. The revenue at risk is nil — and the free alternatives in this category already publish Goose integration pages, so being the paid option loses the comparison before anyone installs us.What
goosemovesPAID_RUNTIMES→FREE_RUNTIMES.clawmetry/adapters/goose.pymoves out of the closedclawmetry-prowheel into this package, with thederive_cost_usdhelper it needs (clawmetry/adapters/cost.py). This is the half that matters: a runtime listed as free whose only reader lives in a licence-gated wheel is not free in any sense a user cares about.sync._FAMILY_ADAPTER_SPECScarries aclawmetry.adapters.*path for it.test_phase4_adapter_move.pypins the invariant both ways: every FREE runtime has a bundled adapter, and no PAID adapter ever ships in the open package.The rule this sets
An open-source runtime gets a free, open-source adapter. A commercial vendor product stays paid. Claude Code, Codex, GitHub Copilot, Cursor, Antigravity and Grok are unchanged, and are now pinned as paid by a new test — whoever pays a vendor for the agent will pay to observe it.
Recorded in
docs/ENTITLEMENTS.mdand in FLYWHEEL's §1b decision tree, which until now routed every new adapter toclawmetry-prounconditionally.Truth-sync
Surfaces that independently encoded the old split:
/api/runtimesfallback literal inroutes/entitlement.pytrial_enforcement.py,static/js/app.js) — that screen tells a blocked user what they still get, so a stale copy understates the productclawmetry/runtime_probe.py, which kept its own duplicateFREE_RUNTIMES = {openclaw, nemoclaw}and would have shown Goose as locked during onboarding while the gate happily allowed it. It imports the catalogue now instead of copying it.Also fixes a pre-existing red test
tests/test_onboard_runtime_detection.pyasserted a hardcoded 19-runtime probe catalogue against the real 22 — stale sincedeepseek_harness/exo/kimilanded, and failing onmainbefore this branch. It now derives fromentitlements.ALL_RUNTIMESand compares sets, so the failure names the missing runtime instead of printing two integers.Verified
clawmetry-proabsent,sync._family_adapter_classes()returns exactly['goose']— the promise, executed.scripts/sync_runtime_count.py: in sync at 22. This is a tier move, not a new runtime.node --checkclean onapp.js.Follow-ups (deliberately not in this PR)
clawmetry_pro/adapters/goose.pystays in the wheel and is simply no longer the ingest path. Deleting it is a separate clawmetry-pro PR, so a mid-rollout licensed install is never left with neither copy./pricingbullets and homepage hero still list Goose as paid — they must ship alongside this, or the guard intest_advertised_runtimes_match_catalogue.pyis pinning a claim the storefront contradicts.🤖 Generated with Claude Code