@ucsandman/legcli 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CHANGELOG.md +560 -0
  2. package/LICENSE +58 -0
  3. package/NOTICE +4 -0
  4. package/README.md +558 -0
  5. package/bin/fake-agent.mjs +143 -0
  6. package/bin/leg.mjs +449 -0
  7. package/docs/DECISIONS.md +119 -0
  8. package/docs/DEMO.md +214 -0
  9. package/docs/DEVIATIONS.md +182 -0
  10. package/docs/ERRORS.md +326 -0
  11. package/docs/README.md +40 -0
  12. package/docs/REUSE.md +289 -0
  13. package/docs/ROADMAP-v2.md +55 -0
  14. package/docs/VOCABULARY.md +243 -0
  15. package/docs/adapters.md +300 -0
  16. package/docs/board-guide.md +579 -0
  17. package/docs/cli-contracts.md +401 -0
  18. package/docs/concepts.md +426 -0
  19. package/docs/configuration.md +220 -0
  20. package/docs/faq.md +206 -0
  21. package/docs/getting-started.md +251 -0
  22. package/docs/real-run.md +80 -0
  23. package/docs/review-2026-09-14.md +72 -0
  24. package/docs/screenshots/board-400px.png +0 -0
  25. package/docs/screenshots/board-details-open.png +0 -0
  26. package/docs/screenshots/board-done.png +0 -0
  27. package/docs/screenshots/board-drawer.png +0 -0
  28. package/docs/screenshots/board-empty.png +0 -0
  29. package/docs/screenshots/board-handoff.png +0 -0
  30. package/docs/screenshots/board-running.png +0 -0
  31. package/docs/screenshots/demo-1-claude-running.png +0 -0
  32. package/docs/screenshots/demo-2-limit-hit.png +0 -0
  33. package/docs/screenshots/demo-3-handoff-bundle.png +0 -0
  34. package/docs/screenshots/demo-4-codex-running.png +0 -0
  35. package/docs/screenshots/demo-5-done.png +0 -0
  36. package/docs/screenshots/floor-final-1280.png +0 -0
  37. package/docs/screenshots/floor-final-400.png +0 -0
  38. package/docs/screenshots/floor-landing.png +0 -0
  39. package/docs/screenshots/floor.png +0 -0
  40. package/docs/screenshots/share-guest-1280.png +0 -0
  41. package/docs/screenshots/share-owner-1280.png +0 -0
  42. package/docs/screenshots/terminals-1280.png +0 -0
  43. package/docs/screenshots/thumb-done.jpg +0 -0
  44. package/docs/screenshots/thumb-handoff-details.jpg +0 -0
  45. package/docs/screenshots/thumb-limit-hit.jpg +0 -0
  46. package/docs/screenshots/youtube-thumbnail.jpg +0 -0
  47. package/fixtures/limits/agy/agy-resource-exhausted.json +11 -0
  48. package/fixtures/limits/claude/claude-budget-limit.json +11 -0
  49. package/fixtures/limits/claude/claude-max-turns.json +11 -0
  50. package/fixtures/limits/claude/claude-model-limit.json +11 -0
  51. package/fixtures/limits/claude/claude-session-limit.json +11 -0
  52. package/fixtures/limits/claude/claude-weekly-limit.json +11 -0
  53. package/fixtures/limits/codex/codex-quota-exceeded.json +11 -0
  54. package/fixtures/limits/codex/codex-rate-limit-exceeded.json +11 -0
  55. package/fixtures/limits/codex/codex-skills-notice.json +11 -0
  56. package/fixtures/limits/codex/codex-usage-limit-reached.json +11 -0
  57. package/fixtures/limits/codex/codex-usage-limit.json +11 -0
  58. package/fixtures/limits/generic/generic-429.json +11 -0
  59. package/fixtures/limits/generic/generic-overloaded.json +11 -0
  60. package/fixtures/limits/generic/generic-quota.json +11 -0
  61. package/fixtures/limits/generic/generic-rate-limit.json +11 -0
  62. package/fixtures/limits/generic/generic-resource-exhausted.json +11 -0
  63. package/fixtures/limits/generic/generic-usage-limit.json +11 -0
  64. package/fixtures/limits/grok/grok-not-logged-in.json +11 -0
  65. package/fixtures/limits/negative/auth-source-set.json +11 -0
  66. package/fixtures/limits/negative/compile-error.json +11 -0
  67. package/fixtures/limits/negative/empty-stdout-exit-0.json +11 -0
  68. package/fixtures/live/agy/attempt-1-scratch-workspace.out.log +1 -0
  69. package/fixtures/live/agy/cmd.txt +1 -0
  70. package/fixtures/live/agy/err.log +0 -0
  71. package/fixtures/live/agy/out.log +1 -0
  72. package/fixtures/live/agy/parsed.json +5 -0
  73. package/fixtures/live/agy/run.json +18 -0
  74. package/fixtures/live/agy/supervisor.log +2 -0
  75. package/fixtures/live/claude/cmd.txt +1 -0
  76. package/fixtures/live/claude/err.log +0 -0
  77. package/fixtures/live/claude/limit-rate_limit.json +21 -0
  78. package/fixtures/live/claude/out.log +1 -0
  79. package/fixtures/live/claude/parsed.json +11 -0
  80. package/fixtures/live/claude/run.json +18 -0
  81. package/fixtures/live/claude/supervisor.log +2 -0
  82. package/fixtures/live/codex/cmd.txt +1 -0
  83. package/fixtures/live/codex/err.log +1 -0
  84. package/fixtures/live/codex/last.md +2 -0
  85. package/fixtures/live/codex/limit-usage_limit_exceeded.json +25 -0
  86. package/fixtures/live/codex/out.log +8 -0
  87. package/fixtures/live/codex/parsed.json +15 -0
  88. package/fixtures/live/codex/run.json +18 -0
  89. package/fixtures/live/codex/supervisor.log +2 -0
  90. package/fixtures/live/grok/cmd.txt +1 -0
  91. package/fixtures/live/grok/err.log +32 -0
  92. package/fixtures/live/grok/out.log +7 -0
  93. package/fixtures/live/grok/parsed.json +5 -0
  94. package/fixtures/live/grok/run.json +18 -0
  95. package/fixtures/live/grok/supervisor.log +2 -0
  96. package/fixtures/verified.json +34 -0
  97. package/package.json +68 -0
  98. package/scripts/board-shots.mjs +69 -0
  99. package/scripts/build-docs-site.mjs +308 -0
  100. package/scripts/check-claims.mjs +150 -0
  101. package/scripts/clean-clone-check.sh +42 -0
  102. package/scripts/license-sign.mjs +23 -0
  103. package/scripts/limits-table.mjs +38 -0
  104. package/scripts/live-limits.mjs +36 -0
  105. package/scripts/privacy-check.mjs +63 -0
  106. package/scripts/probe.mjs +92 -0
  107. package/scripts/seed-fake-cards.mjs +34 -0
  108. package/scripts/seed-floor-board.mjs +69 -0
  109. package/scripts/seed-wes-board.mjs +91 -0
  110. package/scripts/stripe-setup.mjs +99 -0
  111. package/scripts/vercel-env.mjs +40 -0
  112. package/src/accounts.mjs +119 -0
  113. package/src/adapters/agy.mjs +56 -0
  114. package/src/adapters/claude.mjs +54 -0
  115. package/src/adapters/codex.mjs +73 -0
  116. package/src/adapters/common.mjs +32 -0
  117. package/src/adapters/fake.mjs +48 -0
  118. package/src/adapters/grok.mjs +51 -0
  119. package/src/adapters/index.mjs +27 -0
  120. package/src/adapters/resolve.mjs +40 -0
  121. package/src/attach.mjs +592 -0
  122. package/src/auth.mjs +85 -0
  123. package/src/board/board.css +543 -0
  124. package/src/board/board.js +1307 -0
  125. package/src/board/favicon.svg +1 -0
  126. package/src/board/floor.html +127 -0
  127. package/src/board/floor.js +670 -0
  128. package/src/board/fonts/OFL-atkinson-hyperlegible-next.txt +93 -0
  129. package/src/board/fonts/OFL-azeret-mono.txt +94 -0
  130. package/src/board/fonts/atkinson-board.woff2 +0 -0
  131. package/src/board/fonts/azeret-board.woff2 +0 -0
  132. package/src/board/index.html +251 -0
  133. package/src/board/sessions.js +1451 -0
  134. package/src/bundle.mjs +103 -0
  135. package/src/cards.mjs +114 -0
  136. package/src/chain.mjs +264 -0
  137. package/src/commands.mjs +79 -0
  138. package/src/contract.mjs +73 -0
  139. package/src/env.mjs +19 -0
  140. package/src/fsx.mjs +72 -0
  141. package/src/git-snapshot.mjs +152 -0
  142. package/src/handoff.mjs +171 -0
  143. package/src/hook.mjs +49 -0
  144. package/src/land.mjs +106 -0
  145. package/src/launcher.mjs +272 -0
  146. package/src/leases.mjs +86 -0
  147. package/src/ledger.mjs +369 -0
  148. package/src/license.mjs +168 -0
  149. package/src/limits.mjs +97 -0
  150. package/src/live-capture.mjs +69 -0
  151. package/src/mergequeue.mjs +225 -0
  152. package/src/orchestrator.mjs +365 -0
  153. package/src/pipeline.mjs +100 -0
  154. package/src/preferences.mjs +47 -0
  155. package/src/presets.mjs +23 -0
  156. package/src/ratelimit.mjs +49 -0
  157. package/src/redact.mjs +47 -0
  158. package/src/resume.mjs +354 -0
  159. package/src/runner.mjs +438 -0
  160. package/src/scheduler.mjs +118 -0
  161. package/src/server.mjs +845 -0
  162. package/src/session-detail.mjs +129 -0
  163. package/src/sessions.mjs +202 -0
  164. package/src/share.mjs +163 -0
  165. package/src/stations/agent.mjs +42 -0
  166. package/src/stations/build.mjs +9 -0
  167. package/src/stations/human.mjs +5 -0
  168. package/src/stations/land.mjs +6 -0
  169. package/src/stations/plan.mjs +8 -0
  170. package/src/stations/pr.mjs +31 -0
  171. package/src/stations/review.mjs +8 -0
  172. package/src/stations/test.mjs +27 -0
  173. package/src/store.mjs +90 -0
  174. package/src/sync/dashclaw.mjs +70 -0
  175. package/src/sync/index.mjs +54 -0
  176. package/src/sync/workboard.mjs +54 -0
  177. package/src/taps/agy.mjs +64 -0
  178. package/src/taps/claude-usage.mjs +67 -0
  179. package/src/taps/claude.mjs +170 -0
  180. package/src/taps/codex.mjs +286 -0
  181. package/src/trust.mjs +323 -0
  182. package/src/usage.mjs +179 -0
  183. package/src/wait.mjs +30 -0
  184. package/src/worktree.mjs +207 -0
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "agy-resource-exhausted",
3
+ "adapter": "agy",
4
+ "source": "docs-only",
5
+ "produced_by": "`agy changelog` (\"Fixed personal accounts hitting a resource-exhausted error at startup\"); agy --help documents no limit wording; falls back to the generic matchers",
6
+ "where": "any",
7
+ "text": "resource-exhausted",
8
+ "pattern": "resource.exhausted",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "claude-budget-limit",
3
+ "adapter": "claude",
4
+ "source": "docs-only",
5
+ "produced_by": "https://code.claude.com/docs/en/cli-reference (--max-budget-usd)",
6
+ "where": "any",
7
+ "text": "Budget limit reached",
8
+ "pattern": "Budget limit reached",
9
+ "exit_code": null,
10
+ "classification": "budget"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "claude-max-turns",
3
+ "adapter": "claude",
4
+ "source": "observed-live",
5
+ "produced_by": "fixtures/real-run/leg1/out.log: `claude -p --max-turns 2` on the real run, 2026-09-10 (docs: https://code.claude.com/docs/en/cli-reference --max-turns \"Exits with an error when the limit is reached\")",
6
+ "where": "stdout",
7
+ "text": "{\"type\":\"result\",\"subtype\":\"error_max_turns\",\"is_error\":true,\"stop_reason\":\"tool_use\",\"terminal_reason\":\"max_turns\",\"num_turns\":3}",
8
+ "pattern": "error_max_turns|\"terminal_reason\":\\s*\"max_turns\"",
9
+ "exit_code": 1,
10
+ "classification": "budget"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "claude-model-limit",
3
+ "adapter": "claude",
4
+ "source": "docs-only",
5
+ "produced_by": "https://code.claude.com/docs/en/costs (\"You’ve hit your Opus limit\" / \"You’ve hit your Sonnet limit\")",
6
+ "where": "any",
7
+ "text": "You’ve hit your Opus limit",
8
+ "pattern": "You.ve hit your (?!session |weekly |usage )[A-Za-z0-9.-]+ limit",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "claude-session-limit",
3
+ "adapter": "claude",
4
+ "source": "docs-only",
5
+ "produced_by": "https://code.claude.com/docs/en/costs (section: When a developer asks about a limit)",
6
+ "where": "any",
7
+ "text": "You’ve hit your session limit",
8
+ "pattern": "You.ve hit your session limit",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "claude-weekly-limit",
3
+ "adapter": "claude",
4
+ "source": "docs-only",
5
+ "produced_by": "https://code.claude.com/docs/en/costs (section: When a developer asks about a limit)",
6
+ "where": "any",
7
+ "text": "You’ve hit your weekly limit",
8
+ "pattern": "You.ve hit your weekly limit",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "codex-quota-exceeded",
3
+ "adapter": "codex",
4
+ "source": "docs-only",
5
+ "produced_by": "github.com/openai/codex codex-rs/response-debug-context/src/lib.rs (ApiError::QuotaExceeded => \"quota exceeded\")",
6
+ "where": "any",
7
+ "text": "quota exceeded",
8
+ "pattern": "quota exceeded",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "codex-rate-limit-exceeded",
3
+ "adapter": "codex",
4
+ "source": "docs-only",
5
+ "produced_by": "github.com/openai/codex codex-rs/codex-api/src/error.rs (#[error(\"rate limit exceeded: {message}\")])",
6
+ "where": "any",
7
+ "text": "rate limit exceeded: ",
8
+ "pattern": "rate limit exceeded",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "codex-skills-notice",
3
+ "adapter": "codex",
4
+ "source": "observed-live",
5
+ "produced_by": "fixtures/live/codex/out.log (item.completed, item.type=error) from scripts/probe.mjs --adapter codex, 2026-09-10",
6
+ "where": "stdout",
7
+ "text": "Skill descriptions were shortened to fit the skills context budget. Codex can still see every skill, but some descriptions are shorter.",
8
+ "pattern": "Skill descriptions were shortened",
9
+ "exit_code": 0,
10
+ "classification": "info"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "codex-usage-limit-reached",
3
+ "adapter": "codex",
4
+ "source": "docs-only",
5
+ "produced_by": "github.com/openai/codex codex-rs/tui/src/chatwidget/turn_runtime.rs (WorkspaceOwnerUsageLimitReached)",
6
+ "where": "any",
7
+ "text": "Usage limit reached. You've reached your usage limit. Increase your limits to continue",
8
+ "pattern": "Usage limit reached",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "codex-usage-limit",
3
+ "adapter": "codex",
4
+ "source": "docs-only",
5
+ "produced_by": "github.com/openai/codex codex-rs/protocol/src/error.rs (gh search code \"usage limit\" --repo openai/codex, 2026-09-10)",
6
+ "where": "any",
7
+ "text": "You’ve hit your usage limit for {limit_name}. Switch to another model now,",
8
+ "pattern": "You.ve hit your usage limit",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "generic-429",
3
+ "adapter": "*",
4
+ "source": "docs-only",
5
+ "produced_by": "generic HTTP matcher (429 Too Many Requests); lowest priority",
6
+ "where": "any",
7
+ "text": "429 Too Many Requests",
8
+ "pattern": "\\b429\\b|Too Many Requests",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "generic-overloaded",
3
+ "adapter": "*",
4
+ "source": "docs-only",
5
+ "produced_by": "generic matcher (Anthropic API 529 overloaded_error); lowest priority",
6
+ "where": "any",
7
+ "text": "overloaded_error",
8
+ "pattern": "overloaded",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "generic-quota",
3
+ "adapter": "*",
4
+ "source": "docs-only",
5
+ "produced_by": "generic matcher; lowest priority",
6
+ "where": "any",
7
+ "text": "quota",
8
+ "pattern": "\\bquota\\b",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "generic-rate-limit",
3
+ "adapter": "*",
4
+ "source": "docs-only",
5
+ "produced_by": "generic matcher; lowest priority",
6
+ "where": "any",
7
+ "text": "rate limit",
8
+ "pattern": "rate[ _-]?limit",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "generic-resource-exhausted",
3
+ "adapter": "*",
4
+ "source": "docs-only",
5
+ "produced_by": "generic matcher (gRPC RESOURCE_EXHAUSTED); lowest priority",
6
+ "where": "any",
7
+ "text": "RESOURCE_EXHAUSTED",
8
+ "pattern": "RESOURCE_EXHAUSTED|resource.exhausted",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "generic-usage-limit",
3
+ "adapter": "*",
4
+ "source": "docs-only",
5
+ "produced_by": "generic matcher; lowest priority",
6
+ "where": "any",
7
+ "text": "usage limit",
8
+ "pattern": "usage limit",
9
+ "exit_code": null,
10
+ "classification": "limit"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "grok-not-logged-in",
3
+ "adapter": "grok",
4
+ "source": "observed-live",
5
+ "produced_by": "fixtures/live/grok/err.log from scripts/probe.mjs --adapter grok, 2026-09-10 (stdout JSON stopReason: Cancelled, exit 0)",
6
+ "where": "stderr",
7
+ "text": "To sign in, open this URL in your browser:\n\n https://accounts.x.ai/oauth2/device?user_code=XXXX-XXXX\n\nConfirm this code in your browser:\n\nWaiting for authorization...",
8
+ "pattern": "To sign in, open this URL|Waiting for authorization",
9
+ "exit_code": 0,
10
+ "classification": "auth"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "auth-source-set",
3
+ "adapter": "*",
4
+ "source": "docs-only",
5
+ "produced_by": "project brief (Wes, 2026-09-10): stderr saying \"another auth source is set\" counts as a failed launch; wording not yet observed live",
6
+ "where": "stderr",
7
+ "text": "another auth source is set",
8
+ "pattern": "another auth source is set",
9
+ "exit_code": null,
10
+ "classification": "auth"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "compile-error",
3
+ "adapter": "*",
4
+ "source": "docs-only",
5
+ "produced_by": "synthetic negative fixture (a crashed agent is not a limit)",
6
+ "where": "stderr",
7
+ "text": "SyntaxError: Unexpected token )\n at compileSourceTextModule (node:internal/modules/esm/utils:318:16)",
8
+ "pattern": "SyntaxError",
9
+ "exit_code": 1,
10
+ "classification": "info"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "empty-stdout-exit-0",
3
+ "adapter": "*",
4
+ "source": "observed-live",
5
+ "produced_by": "fixtures/live/grok (exit 0, no work): silence is not a limit",
6
+ "where": "stdout",
7
+ "text": "",
8
+ "pattern": "^$",
9
+ "exit_code": 0,
10
+ "classification": "info"
11
+ }
@@ -0,0 +1 @@
1
+ {"conversation_id":"f7ff607d-9831-4f28-83d2-f50fb07ad8a1","status":"SUCCESS","response":"Done. Both files created in `~\\.gemini\\antigravity-cli\\scratch\\`:\n\n- [hello-agy.txt](file:///~/.gemini/antigravity-cli/scratch/hello-agy.txt) — contains `hi`\n- [.baton/DONE](file:///~/.gemini/antigravity-cli/scratch/.baton/DONE) — contains `done`\n","duration_seconds":17.670068,"num_turns":1,"usage":{"input_tokens":39133,"output_tokens":542,"thinking_tokens":0,"cache_read_tokens":37387,"total_tokens":39675}}
@@ -0,0 +1 @@
1
+ ~\AppData\Local\agy\bin\agy.exe -p "Working directory: ~\\AppData\\Local\\Temp\\claude\\C--Projects\\49952fac-5ff4-486c-8395-9973cebdfdcb\\scratchpad\\toy-probe\nEvery relative path in this task is relative to that directory; create files there, never in a scratch workspace.\n\nCreate a file named hello-agy.txt in the current directory containing exactly the word hi. Then create the directory .baton if it is missing and write the file .baton/DONE containing the single line: done. Do nothing else. Do not ask questions.\n" --output-format json --mode accept-edits --add-dir ~\AppData\Local\Temp\claude\C--Projects\49952fac-5ff4-486c-8395-9973cebdfdcb\scratchpad\toy-probe --print-timeout 90m
File without changes
@@ -0,0 +1 @@
1
+ {"conversation_id":"e36f7b41-8a0f-4666-a690-b49062d53de0","status":"SUCCESS","response":"Done. Created [hello-agy.txt](file:///~/AppData/Local/Temp/claude/C--Projects/49952fac-5ff4-486c-8395-9973cebdfdcb/scratchpad/toy-probe/hello-agy.txt) and [.baton/DONE](file:///~/AppData/Local/Temp/claude/C--Projects/49952fac-5ff4-486c-8395-9973cebdfdcb/scratchpad/toy-probe/.baton/DONE).\n","duration_seconds":36.3828431,"num_turns":1,"usage":{"input_tokens":39475,"output_tokens":600,"thinking_tokens":0,"cache_read_tokens":37477,"total_tokens":40075}}
@@ -0,0 +1,5 @@
1
+ {
2
+ "session_id": "e36f7b41-8a0f-4666-a690-b49062d53de0",
3
+ "last_message": "Done. Created [hello-agy.txt](file:///~/AppData/Local/Temp/claude/C--Projects/49952fac-5ff4-486c-8395-9973cebdfdcb/scratchpad/toy-probe/hello-agy.txt) and [.baton/DONE](file:///~/AppData/Local/Temp/claude/C--Projects/49952fac-5ff4-486c-8395-9973cebdfdcb/scratchpad/toy-probe/.baton/DONE).\n",
4
+ "stop_reason": "SUCCESS"
5
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "card_id": "card-20260911-0039-probe-agy",
3
+ "run": 1,
4
+ "adapter": "agy",
5
+ "mode": "accept-edits",
6
+ "max_turns": null,
7
+ "resume": null,
8
+ "cwd": "~\\AppData\\Local\\Temp\\claude\\C--Projects\\49952fac-5ff4-486c-8395-9973cebdfdcb\\scratchpad\\toy-probe",
9
+ "status": "exited",
10
+ "supervisor_pid": 62288,
11
+ "agent_pid": 62724,
12
+ "started_at": "2026-09-11T00:39:34.516Z",
13
+ "outcome": null,
14
+ "updated_at": "2026-09-11T00:40:15.642Z",
15
+ "exit_code": 0,
16
+ "session_id": "e36f7b41-8a0f-4666-a690-b49062d53de0",
17
+ "ended_at": "2026-09-11T00:40:15.123Z"
18
+ }
@@ -0,0 +1,2 @@
1
+ 2026-09-11T00:39:34.549Z spawning leg: adapter=agy run=1 mode=accept-edits cwd=~\AppData\Local\Temp\claude\C--Projects\49952fac-5ff4-486c-8395-9973cebdfdcb\scratchpad\toy-probe
2
+ 2026-09-11T00:40:15.643Z leg exited code 0, session e36f7b41-8a0f-4666-a690-b49062d53de0
@@ -0,0 +1 @@
1
+ ~\.local\bin\claude.exe -p --output-format json --permission-mode acceptEdits
File without changes
@@ -0,0 +1,21 @@
1
+ {
2
+ "agent": "claude",
3
+ "signal": "rate_limit",
4
+ "captured_at": "2026-09-11T07:46:37.143Z",
5
+ "session_id": "s-20260911-070526-claude-90b4",
6
+ "source": "observed-live",
7
+ "payload": {
8
+ "session_id": "6699ca09-6439-496d-a5a0-331999b3f646",
9
+ "transcript_path": "[redacted-home]\\.claude\\projects\\C--Projects-baton\\6699ca09-6439-496d-a5a0-331999b3f646.jsonl",
10
+ "cwd": "[redacted-repo]",
11
+ "scratchpad_dir": "[redacted-home]\\AppData\\Local\\Temp\\claude\\C--Projects-baton\\6699ca09-6439-496d-a5a0-331999b3f646\\scratchpad",
12
+ "prompt_id": "d0d87356-0947-45c7-a73b-2bc3ed8efb6d",
13
+ "effort": {
14
+ "level": "high"
15
+ },
16
+ "hook_event_name": "StopFailure",
17
+ "error": "rate_limit",
18
+ "error_details": "429 {\"type\":\"error\",\"error\":{\"type\":\"rate_limit_error\",\"message\":\"This request would exceed your account's rate limit. Please try again later.\"},\"request_id\":\"req_011CewHHg6eZrktkEjKYr2EK\"}",
19
+ "last_assistant_message": "You've reached your Fable limit. Run /usage-credits to continue or switch models with /model."
20
+ }
21
+ }
@@ -0,0 +1 @@
1
+ {"duration_api_ms":7804,"stop_reason":"end_turn","session_id":"d9e19d78-1502-4f88-8ded-81c5bbbda8c2","total_cost_usd":1.0015022500000001,"usage":{"input_tokens":34,"cache_creation_input_tokens":48486,"cache_read_input_tokens":47217,"output_tokens":372,"output_tokens_details":{"thinking_tokens":0},"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":48486,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":32,"output_tokens":45,"cache_read_input_tokens":47217,"cache_creation_input_tokens":1269,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1269},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-haiku-4-5-20251001":{"inputTokens":948,"outputTokens":18,"cacheReadInputTokens":0,"cacheCreationInputTokens":0,"webSearchRequests":0,"costUSD":0.0010379999999999999,"contextWindow":200000,"maxOutputTokens":32000,"thinkingTokens":0,"canonicalModel":"claude-haiku-4-5","provider":"firstParty","costBasis":"list"},"claude-fable-5-1":{"inputTokens":34,"outputTokens":372,"cacheReadInputTokens":47217,"cacheCreationInputTokens":48486,"webSearchRequests":0,"costUSD":1.00046425,"contextWindow":1000000,"maxOutputTokens":64000,"thinkingTokens":0,"canonicalModel":"claude-fable-5-1","provider":"firstParty","costBasis":"list"}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","fast_mode_disabled_reason":"sdk_opt_in_required","subagent_stats":{"spawned":0,"requested":{"background":0,"foreground":0,"unset":0},"started_in_background":0,"max_depth":0,"spawned_by_subagents":0,"completed":0,"failed":0,"killed":{"parent":0,"user":0,"system":0},"refused":{"depth_limit":0,"concurrency_limit":0,"budget":0},"by_type":{}},"is_error":false,"num_turns":3,"subtype":"success","api_error_status":null,"result":"Done. Both files exist:\n\n- `hello-claude.txt` contains `hi`\n- `.baton/DONE` contains `done`","ttft_ms":2791,"type":"result","duration_ms":11899,"uuid":"d70f3d4c-5a7f-4675-a734-d05edf37b1ed","ttft_stream_ms":1846,"time_to_request_ms":338,"first_content_frame_ms":1846,"queued_turn_count":0,"result_index":0}
@@ -0,0 +1,11 @@
1
+ {
2
+ "session_id": "d9e19d78-1502-4f88-8ded-81c5bbbda8c2",
3
+ "last_message": "Done. Both files exist:\n\n- `hello-claude.txt` contains `hi`\n- `.baton/DONE` contains `done`",
4
+ "stop_reason": "end_turn",
5
+ "subtype": "success",
6
+ "is_error": false,
7
+ "num_turns": 3,
8
+ "terminal_reason": "completed",
9
+ "api_error_status": null,
10
+ "permission_denials": 0
11
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "card_id": "card-20260911-0033-probe-claude",
3
+ "run": 1,
4
+ "adapter": "claude",
5
+ "mode": "acceptEdits",
6
+ "max_turns": null,
7
+ "resume": null,
8
+ "cwd": "~\\AppData\\Local\\Temp\\claude\\C--Projects\\49952fac-5ff4-486c-8395-9973cebdfdcb\\scratchpad\\toy-probe",
9
+ "status": "exited",
10
+ "supervisor_pid": 69268,
11
+ "agent_pid": 57828,
12
+ "started_at": "2026-09-11T00:33:13.367Z",
13
+ "outcome": null,
14
+ "updated_at": "2026-09-11T00:33:33.400Z",
15
+ "exit_code": 0,
16
+ "session_id": "d9e19d78-1502-4f88-8ded-81c5bbbda8c2",
17
+ "ended_at": "2026-09-11T00:33:33.001Z"
18
+ }
@@ -0,0 +1,2 @@
1
+ 2026-09-11T00:33:13.404Z spawning leg: adapter=claude run=1 mode=acceptEdits cwd=~\AppData\Local\Temp\claude\C--Projects\49952fac-5ff4-486c-8395-9973cebdfdcb\scratchpad\toy-probe
2
+ 2026-09-11T00:33:33.400Z leg exited code 0, session d9e19d78-1502-4f88-8ded-81c5bbbda8c2
@@ -0,0 +1 @@
1
+ ~\AppData\Roaming\npm\node_modules\@openai\codex\node_modules\@openai\codex-win32-x64\vendor\x86_64-pc-windows-msvc\bin\codex.exe exec --json -s workspace-write -C ~\AppData\Local\Temp\claude\C--Projects\49952fac-5ff4-486c-8395-9973cebdfdcb\scratchpad\toy-probe -c sandbox_workspace_write.network_access=false -o ~\AppData\Local\Temp\claude\C--Projects\49952fac-5ff4-486c-8395-9973cebdfdcb\scratchpad\baton-home\cards\card-20260911-0033-probe-codex\runs\1\last.md "Create a file named hello-codex.txt in the current directory containing exactly the word hi. Then create the directory .baton if it is missing and write the file .baton/DONE containing the single line: done. Do nothing else. Do not ask questions.\n"
@@ -0,0 +1 @@
1
+ Reading additional input from stdin...
@@ -0,0 +1,2 @@
1
+ Done.
2
+ `hello-codex.txt` now contains exactly `hi`, and `.baton/DONE` contains exactly `done`.
@@ -0,0 +1,25 @@
1
+ {
2
+ "agent": "codex",
3
+ "signal": "usage_limit_exceeded",
4
+ "captured_at": "2026-09-15T02:12:12.311Z",
5
+ "session_id": "s-20260915-005312-codex-4840",
6
+ "source": "observed-live",
7
+ "payload": {
8
+ "timestamp": "2026-09-15T02:12:12.109Z",
9
+ "ordinal": 1658,
10
+ "type": "event_msg",
11
+ "payload": {
12
+ "type": "task_complete",
13
+ "turn_id": "01a0a28f-046f-7b42-b865-a2fc96e06192",
14
+ "last_agent_message": null,
15
+ "error": {
16
+ "message": "Error running remote compact task: You've hit your usage limit. Visit https://chatgpt.com/codex/settings/usage to purchase more credits or try again at Sep 19th, 2026 10:11 PM.",
17
+ "codex_error_info": "usage_limit_exceeded"
18
+ },
19
+ "started_at": 1789433676,
20
+ "completed_at": 1789438332,
21
+ "duration_ms": 4655180,
22
+ "time_to_first_token_ms": 7145
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,8 @@
1
+ {"type":"thread.started","thread_id":"01a08de2-7611-7ff1-b0da-1e6e2cb7ca90"}
2
+ {"type":"turn.started"}
3
+ {"type":"item.completed","item":{"id":"item_0","type":"error","message":"Skill descriptions were shortened to fit the skills context budget. Codex can still see every skill, but some descriptions are shorter. Disable unused skills or plugins to leave more room for the rest."}}
4
+ {"type":"item.completed","item":{"id":"item_1","type":"agent_message","text":"`New-Item -ItemType File -Path hello-codex.txt -Value hi -Force` and `Set-Content` via `New-Item` in `.baton` (creating it only if missing), then writing `.baton/DONE` as `done`; I’m applying it now."}}
5
+ {"type":"item.started","item":{"id":"item_2","type":"command_execution","command":"\"~\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pwsh.exe\" -Command '$ErrorActionPreference = '\"'Stop'; Set-Content -Path .\\\\hello-codex.txt -NoNewline -Value 'hi'; if (-not (Test-Path .\\\\.baton)) { New-Item -ItemType Directory -Path .\\\\.baton | Out-Null }; Set-Content -Path .\\\\.baton\\\\DONE -NoNewline -Value 'done'\"","aggregated_output":"","exit_code":null,"status":"in_progress"}}
6
+ {"type":"item.completed","item":{"id":"item_2","type":"command_execution","command":"\"~\\\\AppData\\\\Local\\\\Microsoft\\\\WindowsApps\\\\pwsh.exe\" -Command '$ErrorActionPreference = '\"'Stop'; Set-Content -Path .\\\\hello-codex.txt -NoNewline -Value 'hi'; if (-not (Test-Path .\\\\.baton)) { New-Item -ItemType Directory -Path .\\\\.baton | Out-Null }; Set-Content -Path .\\\\.baton\\\\DONE -NoNewline -Value 'done'\"","aggregated_output":"","exit_code":0,"status":"completed"}}
7
+ {"type":"item.completed","item":{"id":"item_3","type":"agent_message","text":"Done. \n`hello-codex.txt` now contains exactly `hi`, and `.baton/DONE` contains exactly `done`."}}
8
+ {"type":"turn.completed","usage":{"input_tokens":58585,"cached_input_tokens":10880,"cache_write_input_tokens":0,"output_tokens":853,"reasoning_output_tokens":650}}
@@ -0,0 +1,15 @@
1
+ {
2
+ "session_id": "01a08de2-7611-7ff1-b0da-1e6e2cb7ca90",
3
+ "last_message": "Done. \n`hello-codex.txt` now contains exactly `hi`, and `.baton/DONE` contains exactly `done`.",
4
+ "stop_reason": "turn.completed",
5
+ "usage": {
6
+ "input_tokens": 58585,
7
+ "cached_input_tokens": 10880,
8
+ "cache_write_input_tokens": 0,
9
+ "output_tokens": 853,
10
+ "reasoning_output_tokens": 650
11
+ },
12
+ "errors": [
13
+ "Skill descriptions were shortened to fit the skills context budget. Codex can still see every skill, but some descriptions are shorter. Disable unused skills or plugins to leave more room for the rest."
14
+ ]
15
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "card_id": "card-20260911-0033-probe-codex",
3
+ "run": 1,
4
+ "adapter": "codex",
5
+ "mode": "workspace-write",
6
+ "max_turns": null,
7
+ "resume": null,
8
+ "cwd": "~\\AppData\\Local\\Temp\\claude\\C--Projects\\49952fac-5ff4-486c-8395-9973cebdfdcb\\scratchpad\\toy-probe",
9
+ "status": "exited",
10
+ "supervisor_pid": 64760,
11
+ "agent_pid": 51856,
12
+ "started_at": "2026-09-11T00:33:42.751Z",
13
+ "outcome": null,
14
+ "updated_at": "2026-09-11T00:34:10.756Z",
15
+ "exit_code": 0,
16
+ "session_id": "01a08de2-7611-7ff1-b0da-1e6e2cb7ca90",
17
+ "ended_at": "2026-09-11T00:34:10.269Z"
18
+ }
@@ -0,0 +1,2 @@
1
+ 2026-09-11T00:33:42.787Z spawning leg: adapter=codex run=1 mode=workspace-write cwd=~\AppData\Local\Temp\claude\C--Projects\49952fac-5ff4-486c-8395-9973cebdfdcb\scratchpad\toy-probe
2
+ 2026-09-11T00:34:10.757Z leg exited code 0, session 01a08de2-7611-7ff1-b0da-1e6e2cb7ca90
@@ -0,0 +1 @@
1
+ ~\.grok\bin\grok.exe -p "Create a file named hello-grok.txt in the current directory containing exactly the word hi. Then create the directory .baton if it is missing and write the file .baton/DONE containing the single line: done. Do nothing else. Do not ask questions.\n" --output-format json --permission-mode acceptEdits
@@ -0,0 +1,32 @@
1
+
2
+ To sign in, open this URL in your browser:
3
+
4
+ https://accounts.x.ai/oauth2/device?user_code=S3S6-5YEF
5
+
6
+ Confirm this code in your browser:
7
+
8
+ S3S6-5YEF
9
+
10
+ Only continue with a code you requested. Don't share it with anyone.
11
+
12
+ Waiting for authorization...
13
+ 2026-09-11T00:37:22.879885Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.aggregate server=mole reason=tool name 'mole__mole.aggregate' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
14
+ 2026-09-11T00:37:22.879980Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.citations server=mole reason=tool name 'mole__mole.citations' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
15
+ 2026-09-11T00:37:22.880166Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.claim_add server=mole reason=tool name 'mole__mole.claim_add' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
16
+ 2026-09-11T00:37:22.880194Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.claims_list server=mole reason=tool name 'mole__mole.claims_list' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
17
+ 2026-09-11T00:37:22.880215Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.connect_list server=mole reason=tool name 'mole__mole.connect_list' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
18
+ 2026-09-11T00:37:22.880237Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.dataset server=mole reason=tool name 'mole__mole.dataset' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
19
+ 2026-09-11T00:37:22.880264Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.edge_add server=mole reason=tool name 'mole__mole.edge_add' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
20
+ 2026-09-11T00:37:22.880280Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.fetch server=mole reason=tool name 'mole__mole.fetch' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
21
+ 2026-09-11T00:37:22.880298Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.pairs_candidates server=mole reason=tool name 'mole__mole.pairs_candidates' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
22
+ 2026-09-11T00:37:22.880319Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.rows_add server=mole reason=tool name 'mole__mole.rows_add' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
23
+ 2026-09-11T00:37:22.880339Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.search server=mole reason=tool name 'mole__mole.search' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
24
+ 2026-09-11T00:37:22.880354Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.session_close server=mole reason=tool name 'mole__mole.session_close' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
25
+ 2026-09-11T00:37:22.880412Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.session_open server=mole reason=tool name 'mole__mole.session_open' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
26
+ 2026-09-11T00:37:22.880437Z ERROR Skipping MCP tool with invalid name tool_name=mole__mole.verify_quote server=mole reason=tool name 'mole__mole.verify_quote' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
27
+ 2026-09-11T00:37:22.880460Z ERROR Skipping MCP tool with invalid name tool_name=mole__research.ask server=mole reason=tool name 'mole__research.ask' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
28
+ 2026-09-11T00:37:22.880482Z ERROR Skipping MCP tool with invalid name tool_name=mole__research.cancel server=mole reason=tool name 'mole__research.cancel' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
29
+ 2026-09-11T00:37:22.880502Z ERROR Skipping MCP tool with invalid name tool_name=mole__research.report server=mole reason=tool name 'mole__research.report' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
30
+ 2026-09-11T00:37:22.880519Z ERROR Skipping MCP tool with invalid name tool_name=mole__research.result server=mole reason=tool name 'mole__research.result' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
31
+ 2026-09-11T00:37:22.880541Z ERROR Skipping MCP tool with invalid name tool_name=mole__research.sessions.list server=mole reason=tool name 'mole__research.sessions.list' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
32
+ 2026-09-11T00:37:22.880557Z ERROR Skipping MCP tool with invalid name tool_name=mole__research.status server=mole reason=tool name 'mole__research.status' is invalid — must match ^[a-zA-Z_][a-zA-Z0-9_-]{0,63}$ (start with letter/underscore, max 64 chars)
@@ -0,0 +1,7 @@
1
+ {
2
+ "text": "Creating `hello-grok.txt` and `.baton/DONE`.",
3
+ "stopReason": "Cancelled",
4
+ "sessionId": "01a08de5-c64c-7a31-ac58-1c11c2dd7332",
5
+ "requestId": "fb815c5a-2e96-47c4-8bcc-30669f38e844",
6
+ "thought": "The user wants me to:\n\n1. Create a file named hello-grok.txt in the current directory containing exactly the word hi"
7
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "session_id": "01a08de5-c64c-7a31-ac58-1c11c2dd7332",
3
+ "last_message": null,
4
+ "stop_reason": null
5
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "card_id": "card-20260911-0036-probe-grok",
3
+ "run": 1,
4
+ "adapter": "grok",
5
+ "mode": "acceptEdits",
6
+ "max_turns": null,
7
+ "resume": null,
8
+ "cwd": "~\\AppData\\Local\\Temp\\claude\\C--Projects\\49952fac-5ff4-486c-8395-9973cebdfdcb\\scratchpad\\toy-probe",
9
+ "status": "exited",
10
+ "supervisor_pid": 70732,
11
+ "agent_pid": 12580,
12
+ "started_at": "2026-09-11T00:36:48.183Z",
13
+ "outcome": null,
14
+ "updated_at": "2026-09-11T00:37:45.845Z",
15
+ "exit_code": 0,
16
+ "session_id": "01a08de5-c64c-7a31-ac58-1c11c2dd7332",
17
+ "ended_at": "2026-09-11T00:37:45.380Z"
18
+ }
@@ -0,0 +1,2 @@
1
+ 2026-09-11T00:36:48.222Z spawning leg: adapter=grok run=1 mode=acceptEdits cwd=~\AppData\Local\Temp\claude\C--Projects\49952fac-5ff4-486c-8395-9973cebdfdcb\scratchpad\toy-probe
2
+ 2026-09-11T00:37:45.845Z leg exited code 0, session 01a08de5-c64c-7a31-ac58-1c11c2dd7332
@@ -0,0 +1,34 @@
1
+ {
2
+ "_comment": "The single source of truth for every dated, numbered claim Baton makes in public. scripts/check-claims.mjs asserts that each surface listed here states exactly these values, and --strict additionally compares the pinned CLI versions against what those CLIs currently publish. Re-verify on a real machine, then edit this file and every surface in the same commit.",
3
+ "verifiedOn": "2026-09-11",
4
+ "verifiedOnLong": "11 September 2026",
5
+ "tests": 473,
6
+ "clis": {
7
+ "claude": {
8
+ "label": "Claude Code",
9
+ "version": "2.1.268",
10
+ "npm": "@anthropic-ai/claude-code",
11
+ "probe": "claude --version"
12
+ },
13
+ "codex": {
14
+ "label": "codex-cli",
15
+ "version": "0.153.4",
16
+ "npm": "@openai/codex",
17
+ "probe": "codex --version"
18
+ },
19
+ "agy": {
20
+ "label": "agy",
21
+ "version": "1.2.0",
22
+ "npm": null,
23
+ "probe": "agy --version",
24
+ "note": "Antigravity CLI is a closed Go binary with no npm package, so drift is only visible from a machine that has it installed."
25
+ }
26
+ },
27
+ "surfaces": [
28
+ "README.md",
29
+ "site/llms.txt",
30
+ "site/index.html",
31
+ "docs/cli-contracts.md",
32
+ "docs/adapters.md"
33
+ ]
34
+ }