Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [
"agentic",
"agents",
"ai",
"anthropic",
"gemini",
"llm",
"openai",
"orchestration",
"sdk",
"structured-output",
"tool-calling",
"typescript",
"workflows"
],
"is_fork": false,
"size_kb": 11477,
"has_wiki": false,
"homepage": "https://www.npmjs.com/package/@axlsdk/axl",
"languages": {
"CSS": 2817,
"HTML": 1112,
"JavaScript": 56884,
"TypeScript": 4985640
},
"pushed_at": "2026-07-20T20:06:42Z",
"created_at": "2026-02-13T01:35:21Z",
"owner_type": "Organization",
"updated_at": "2026-07-20T20:07:34Z",
"description": "TypeScript SDK for orchestrating Agentic Systems — concurrency, structured output, cost control, and consensus as first-class primitives.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "main",
"license_spdx_raw": "Apache-2.0",
"primary_language": "TypeScript",
"significant_languages": [
"TypeScript"
]
},
"owner": {
"blog": null,
"name": null,
"type": "Organization",
"login": "axl-sdk",
"company": null,
"location": null,
"followers": 0,
"avatar_url": "https://avatars.githubusercontent.com/u/261329125?v=4",
"created_at": "2026-02-13T01:34:31Z",
"is_verified": null,
"public_repos": 1,
"account_age_days": 164
},
"license": {
"state": "standard",
"spdx_id": "Apache-2.0",
"raw_spdx": "Apache-2.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.20.0",
"kind": "minor",
"published_at": "2026-07-20T19:35:03Z"
},
{
"tag": "v0.19.1",
"kind": "patch",
"published_at": "2026-07-17T16:06:45Z"
},
{
"tag": "v0.19.0",
"kind": "minor",
"published_at": "2026-07-08T20:59:37Z"
},
{
"tag": "v0.18.2",
"kind": "patch",
"published_at": "2026-05-31T21:06:59Z"
},
{
"tag": "v0.18.1",
"kind": "patch",
"published_at": "2026-05-31T20:24:56Z"
},
{
"tag": "v0.18.0",
"kind": "minor",
"published_at": "2026-05-30T04:14:44Z"
},
{
"tag": "v0.17.9",
"kind": "patch",
"published_at": "2026-05-28T14:53:25Z"
},
{
"tag": "v0.17.8",
"kind": "patch",
"published_at": "2026-05-25T19:21:03Z"
},
{
"tag": "v0.17.7",
"kind": "patch",
"published_at": "2026-05-20T16:12:14Z"
},
{
"tag": "v0.17.6",
"kind": "patch",
"published_at": "2026-05-13T19:28:34Z"
},
{
"tag": "v0.17.5",
"kind": "patch",
"published_at": "2026-05-07T05:16:08Z"
},
{
"tag": "v0.17.4",
"kind": "patch",
"published_at": "2026-05-04T18:27:43Z"
},
{
"tag": "v0.17.3",
"kind": "patch",
"published_at": "2026-05-03T22:43:20Z"
},
{
"tag": "v0.17.2",
"kind": "patch",
"published_at": "2026-05-01T00:55:26Z"
},
{
"tag": "v0.17.1",
"kind": "patch",
"published_at": "2026-04-30T23:33:52Z"
},
{
"tag": "v0.17.0",
"kind": "minor",
"published_at": "2026-04-30T23:08:45Z"
},
{
"tag": "v0.16.1",
"kind": "patch",
"published_at": "2026-04-29T19:41:30Z"
},
{
"tag": "v0.16.0",
"kind": "minor",
"published_at": "2026-04-28T16:05:24Z"
},
{
"tag": "v0.15.0",
"kind": "minor",
"published_at": "2026-04-17T19:04:47Z"
},
{
"tag": "v0.14.0",
"kind": "minor",
"published_at": "2026-04-14T14:41:14Z"
},
{
"tag": "v0.13.8",
"kind": "patch",
"published_at": "2026-04-12T04:37:44Z"
},
{
"tag": "v0.13.7",
"kind": "patch",
"published_at": "2026-04-12T03:40:52Z"
},
{
"tag": "v0.13.6",
"kind": "patch",
"published_at": "2026-04-06T19:58:13Z"
},
{
"tag": "v0.13.5",
"kind": "patch",
"published_at": "2026-04-01T20:44:43Z"
},
{
"tag": "v0.13.4",
"kind": "patch",
"published_at": "2026-04-01T14:53:38Z"
},
{
"tag": "v0.13.3",
"kind": "patch",
"published_at": "2026-04-01T05:20:53Z"
},
{
"tag": "v0.13.2",
"kind": "patch",
"published_at": "2026-04-01T04:55:00Z"
},
{
"tag": "v0.13.1",
"kind": "patch",
"published_at": "2026-04-01T04:02:02Z"
},
{
"tag": "v0.13.0",
"kind": "minor",
"published_at": "2026-04-01T02:57:48Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2026-03-31T14:25:03Z"
},
{
"tag": "v0.11.6",
"kind": "patch",
"published_at": "2026-03-30T20:06:20Z"
},
{
"tag": "v0.11.5",
"kind": "patch",
"published_at": "2026-03-30T19:56:18Z"
},
{
"tag": "v0.11.4",
"kind": "patch",
"published_at": "2026-03-30T19:43:57Z"
},
{
"tag": "v0.11.3",
"kind": "patch",
"published_at": "2026-03-30T19:30:13Z"
},
{
"tag": "v0.11.2",
"kind": "patch",
"published_at": "2026-03-30T19:07:06Z"
},
{
"tag": "v0.11.1",
"kind": "patch",
"published_at": "2026-03-30T18:50:01Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2026-03-30T16:13:39Z"
},
{
"tag": "v0.10.4",
"kind": "patch",
"published_at": "2026-03-22T22:20:51Z"
},
{
"tag": "v0.10.3",
"kind": "patch",
"published_at": "2026-03-22T18:20:59Z"
},
{
"tag": "v0.10.2",
"kind": "patch",
"published_at": "2026-03-22T17:48:06Z"
},
{
"tag": "v0.10.1",
"kind": "patch",
"published_at": "2026-03-22T17:18:23Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2026-03-20T18:48:11Z"
},
{
"tag": "v0.9.1",
"kind": "patch",
"published_at": "2026-03-19T17:04:57Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2026-03-19T05:50:07Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2026-03-19T03:10:06Z"
},
{
"tag": "v0.7.6",
"kind": "patch",
"published_at": "2026-03-18T06:03:48Z"
},
{
"tag": "v0.7.5",
"kind": "patch",
"published_at": "2026-03-18T04:10:29Z"
},
{
"tag": "v0.7.4",
"kind": "patch",
"published_at": "2026-03-18T03:43:15Z"
},
{
"tag": "v0.7.3",
"kind": "patch",
"published_at": "2026-03-18T03:30:49Z"
},
{
"tag": "v0.7.2",
"kind": "patch",
"published_at": "2026-03-18T03:12:55Z"
},
{
"tag": "v0.7.1",
"kind": "patch",
"published_at": "2026-03-18T02:42:27Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2026-03-17T22:41:30Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-03-16T21:39:29Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-03-10T21:30:38Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-03-04T20:12:25Z"
}
],
"recent_commits": [
{
"oid": "71e209de7d0823c538668c6d645bc359264b3999",
"body": "Add plain-language guidance for reliable tool outcomes, safe failures, incomplete traces, Studio investigation, and eval evidence.\n\nCorrect the Studio capture note and name 0.20.0 in the migration guide.",
"is_bot": false,
"headline": "docs: Explain tool workflow benefits",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-20T20:03:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4dbf1a46a2c824d99ca03797192ed10e437b2e0e",
"body": "Release the breaking tool-lifecycle v2 and stream-first observation contracts.\n\nShip coordinated 0.20.0 versions for all four public packages.",
"is_bot": false,
"headline": "chore: Bump to 0.20.0",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-20T19:35:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f705d54f049b6d34f674f62cdd2c66c699463b78",
"body": "Emit a trusted-host runtime event when cancellation compensation cannot\nremove pending approval state without replacing the original workflow error.\n\nDocument store ordering and current Node 22, Redis, smoke, and SQLite\nverification evidence.",
"is_bot": false,
"headline": "fix(axl): surface approval cleanup failures",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-20T18:28:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "30c2e61ece84d432e97a4a588ea06ac75317dfd6",
"body": "Serialize approval publication, resolution, cancellation cleanup, and total deletion.\n\nPreserve incomplete observation status across streams, stores, recovery, and Studio.\n\nHarden decision validation, error causes, migrations, and adversarial coverage.",
"is_bot": false,
"headline": "fix(axl): close lifecycle review gaps",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-20T06:51:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a90fbbb5972645717545e2441b571aa64c98a134",
"body": "Make in-process approval resolution atomic and remove misleading resume APIs.\nBound branch finalization with explicit observation completeness, preserve strict\nqueue-overflow causes, and suppress late root and child trace mutation.\n\nExpand adversarial, Studio, and live-provider lifecycle coverage and document\nthe owner-approved release boundary.",
"is_bot": false,
"headline": "fix(axl): harden release lifecycle contracts",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-18T22:12:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "faf46360a4438997606e2807596856dc812a2306",
"body": "Reject hostile tool and approval boundary shapes.\n\nBound stream subscribers and finalize concurrent losers honestly.\n\nFail closed on unsafe cross-process approval replay.",
"is_bot": false,
"headline": "fix(axl): harden lifecycle edge cases",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-18T19:34:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b3cf69530ba5fffb2cef72dbe4e72bb49a0adc38",
"body": "Remove pair-aware queue retention and preserve explicit incomplete views.\n\nComplete lifecycle, projection, redaction, recovery, Studio, testing-runtime,\nand agent-as-tool acceptance coverage, including interrupted Playground rows.",
"is_bot": false,
"headline": "fix(axl): close lifecycle acceptance gaps",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T22:24:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f3eb5c9d4e5c16d5cc466791c73bb600b643fb76",
"body": "Switch live events and executions to schema v2 with explicit tool outcomes.\nRemove legacy callbacks and the dead ToolDenied error export.\nUpdate testing, Studio, history compatibility, docs, and migration gates.",
"is_bot": false,
"headline": "feat(axl)!: ship v2 tool lifecycle observation",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T21:31:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c92776f907d2e2daa38b4a9565c99573a422e7f8",
"body": "Persist explicit event schema carriers while preserving legacy payloads. Reject mixed or unsupported traces before they can poison history.\n\nTeach recovery, redaction, and Studio to consume the historical v1/v2 union before the v2 writer is activated.",
"is_bot": false,
"headline": "feat(axl): add event schema compatibility readers",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T20:24:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "73da0f735f8de5053784b428915ee295e08983b0",
"body": "Route non-handoff tool requests through typed parse, execution, message, and observation seams while preserving the v1 public lifecycle. Add characterization coverage for legacy event ordering, MCP malformed results, and detached override invocation.",
"is_bot": false,
"headline": "refactor(axl): centralize tool invocation outcomes",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T20:01:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5a223c14565021c0d858b9b563fa4534731f8ce3",
"body": "Warn once per process when createContext receives a legacy observation callback while preserving callback behavior for the compatible release. Migrate in-tree tests and guidance to ctx.events, explicit streams, and trace listeners.",
"is_bot": false,
"headline": "deprecate(axl): migrate legacy observation callbacks",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T19:48:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d5c3b84290099c61e70f4e45f227755540497ee3",
"body": "Use explicit inherited context state for runtime.stream transport selection. Keep legacy callback activation compatible while migrating internal and test sentinels to stream-first observation.",
"is_bot": false,
"headline": "refactor(axl): decouple streaming mode from callbacks",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T19:35:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d93a96118133cd311e07c7adfd9445976b9c725",
"body": "Add compile-only terminal, rejection, and schema-version types for the breaking lifecycle migration. Freeze legacy event fixtures and Studio snapshots before the runtime writer changes.",
"is_bot": false,
"headline": "feat(axl): lock v2 tool lifecycle contracts",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T19:29:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f349c807f84b6220649e2a18203db09e0fada0f3",
"body": null,
"is_bot": false,
"headline": "chore: Bump to 0.19.1",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T16:06:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af27ed931ed86eae02a9fc53715b00badb9b6306",
"body": "Keep mapper causes out of ordinary error serialization, centralize real and mocked tool finalization, and skip unusable projection work after cancellation. Document provider string-envelope semantics and track the legacy tool lifecycle redesign for the next major.",
"is_bot": false,
"headline": "fix(axl): harden projection lifecycle boundaries",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T14:10:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "70c9dabaccd9778e57fbca2f1270c78a95c1e906",
"body": "Keep Gemini function responses object-shaped, reject hidden thenables, and stop aborted tool loops before provider continuation. Add mixed-batch, retry, streaming, nested-composition, and history regressions plus contract guidance.",
"is_bot": false,
"headline": "fix(axl): close tool projection edge cases",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T06:41:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "536ef438ca1a5b1685b5a947beccd4578607e0ef",
"body": "Observe rejected async projectors, isolate legacy error sentinels from configured policies, and reject descriptor-map prototype pollution. Keep projectors receiver-free and preserve legacy mock timing while strengthening tests and guidance.",
"is_bot": false,
"headline": "fix(axl): harden tool output projection boundaries",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T06:04:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0366613453a955f9740c52cb3bd29804bd855509",
"body": "Add direct regression coverage for legacy serialization and failure ordering, type erasure and inference, configured mock bypass policy, accessor rejection, and mock telemetry classification.",
"is_bot": false,
"headline": "test(axl): lock projection acceptance boundaries",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T04:27:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e8cc2f798f76e797859e99f655bfc8699a3c720",
"body": "Document verbose message snapshots on agent_call_start, where the provider request is captured. Correct related redaction, buffering, and fixture guidance without changing runtime behavior.",
"is_bot": false,
"headline": "docs(axl): correct full trace request attribution",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T04:17:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "14b2cbd80f08f2a8590e34d90258258109a8ef89",
"body": "Allow local tools to expose a strict synchronous projection to the model while retaining complete host-observable results. Preserve sensitive, failure, direct-invocation, MCP, handoff, and legacy serialization semantics, including configured mock parity.",
"is_bot": false,
"headline": "feat(axl): add model-facing tool output projections",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T04:13:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8d39136b908babb96374696cda9a111fa4bf7f22",
"body": "Add Axl-specific Codex roles and an agent-neutral guidance entrypoint. Share the canonical Claude skill tree through a relative Codex symlink, align the cross-surface workflows, and add bounded live-API verification.",
"is_bot": false,
"headline": "chore(agents): share workflows across agent tools",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-17T01:55:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f0ba47c93f59563768480080399aac29583d5cc9",
"body": "… honesty)\n\nThe downstream type-export smoke fixture pinned `agent_call_end.cost` as a\nrequired `number` (spec/16 decision 10). The unpriced-cost honesty change in\nthis release made it `number | undefined` (undefined for a pricing-table miss /\nerror path) — a deliberate, documented breaking type cha\n[…]\noke job correctly caught the stale pin; update the fixture to the\nnew contract. Test-only; the published 0.19.0 types are correct.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(smoke): agent_call_end.cost is number | undefined (unpriced-cost…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T21:12:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "65558c0710a0104f292cc4cee783f67791bab0c6",
"body": null,
"is_bot": false,
"headline": "chore: Bump to 0.19.0",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T20:59:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aa4f391e3ec1ac0f09e9286bf756f7422f8dddad",
"body": "- Rewrite the section summary to cover BOTH themes (provider expansion +\n structured-output / ctx.ask pipeline) — it previously described only the\n provider work.\n- Consolidate the two fragmented prompt-rendering bullets (compact/$ref and the\n io:'input' fix) into one coherent entry; drop the orp\n[…]\n \"Repair recipes\" entry (Problem C) and point the structured-\n output entries at the new api-reference #structured-output anchor.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: tighten [Unreleased] changelog for the structured-output work",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T20:51:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "84dc1a4005df03f3c36c00d6b1ce488e0f4dcc70",
"body": "- api-reference.md: new \"## Structured Output\" section — the one-stop decision\n table for the default (prompt-guided + client-side Zod), schemaPrompt modes,\n nativeStructuredOutput + the per-provider capability tiers, the responseFormat\n wire summary, precedence/forwarding, repair, and related di\n[…]\nOADMAP, CHANGELOG all current;\narchitecture/security unaffected — verified no stale json_object/responseFormat\nreferences remain).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: consolidated Structured Output reference + session docs sweep",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T20:45:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1242a21b15a45b1dee4feb6ab1f25920789b3971",
"body": "… json_schema\n\nAdds end-to-end live-API coverage for the structured-output / ctx.ask pipeline\n(gated per key; run via pnpm test:integration), and fixes a real capability\nbug the new native path exposed.\n\nIntegration matrix (all verified against real APIs):\n- native-output truth-table across BOTH nat\n[…]\nmeout` to 60s (live reasoning models + schema\nretries exceed Vitest's 5s default — also fixes a pre-existing mistral-large flake).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(axl): live-API integration tier for spec 22 + fix Groq per-model…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T20:21:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a12ee032f8e56b4151006a87b3d173e10bb07111",
"body": "… through delegate handoff\n\nAdversarial review fixes for spec 22 Problem B (native structured output).\n\n- F1: the native json_schema was derived via zodToJsonSchema (OUTPUT mode),\n which collapsed any .transform()/.pipe() schema to an empty {} on the wire and\n contradicted the prompt for .default(\n[…]\nquired; a 2-candidate delegate forwards both the custom\nschemaPrompt text and the native json_schema format to the handoff target.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl): native structured output derives input-side schema; forward…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T19:58:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "519035385f9d3e1628486be5d4a99364f5042dfc",
"body": "…recipes\n\nProblem C of spec 22 (repair) ships as documentation, plus a correctness fix\nthe recipe depends on.\n\n- renderSchemaForPrompt now uses z.toJSONSchema's `io: 'input'` mode. The\n default 'output' mode collapses a `.transform()`/`.pipe()` schema to an empty\n `{}` — so a schema-in-prompt with\n[…]\nsform()` schema renders its input fields (name/email) and omits\nthe computed post-transform field (domain) in the appended prompt.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl): render prompt schemas from the input side; document repair …",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T19:47:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3a1130655bbf9d82fc947b6cdc74b1e16e908732",
"body": "Problem B of spec 22 — decouple the model-facing prompt contract from the\nparse schema, plus review fixes for Problems A/E.\n\nschemaPrompt (AskOptions + AgentConfig, forwarded through delegate):\n- 'json-schema' (default) — today's rendering.\n- 'none' — append zero prompt text; the Zod schema stays th\n[…]\nixes, streaming observer gate. Docs: api-reference, providers\n(prompt-guided vs native + support table), observability, CHANGELOG.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): schemaPrompt + provider-neutral nativeStructuredOutput",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T19:42:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a1bb2fac389bad941cd45dac0683cb4318d9e897",
"body": "Problem E of spec 22. Structured-output failures that fail quietly — a dropped\n.refine() the model never sees, a union root that silently disables streaming,\nan oversized appended schema paid every attempt — now surface as a first-class\n`schema_diagnostic` event (once per ask) plus, for the surprisi\n[…]\ns), every emit site, warn dedup + both silencing\npaths. Docs: observability.md (#schema-diagnostics), api-reference.md, CHANGELOG.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): schema_diagnostic events for silent structured-output cliffs",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T19:25:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "48252e0079b6bdbd95591c27cdddc598bcd172e1",
"body": "Problem A of spec 22. `ctx.ask({ schema })` appended the full JSON Schema\npretty-printed and inline-duplicated on every call — for an 8-arm union with\nshared sub-objects this was ~10× more prompt tokens than necessary, paid every\nattempt.\n\n- Add a private `renderSchemaForPrompt` that renders the sch\n[…]\nni-noregress (tool-def path stays\ninline). Docs: observability.md (prompt cost), providers.md (Gemini schema\nhandling), CHANGELOG.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): compact + $ref-hoisted structured-output prompt rendering",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T19:07:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2f838f0a163990260e419a32771fcd3a02cd88b5",
"body": "Four skills (tackle-plan, plan-doc, scenario-review, session-review) were\ncopied from a mobile/web-app repo and carried foreign references. Adapt them\nplus their supporting agents/rules to this SDK monorepo:\n\n- Add adversarial-code-reviewer and balanced-implementer agents (adapted from\n the source \n[…]\n -> axl landmines, doc paths -> .internal/spec/, drop nonexistent commitlint.\n- Track skills: add !.claude/skills/ to .gitignore.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(claude): adapt copied skills and agents to axl conventions",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T18:50:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0606976e2599f0eef2e2fe12ad02055a75126650",
"body": "Keep the Unreleased notes focused on user-visible provider, cost, and error-handling changes before merging the branch.",
"is_bot": false,
"headline": "docs: tighten provider compatibility changelog",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T17:18:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "87f1fc4cdae1ecd66235cbe091d6bbcf949dab29",
"body": "Normalize OpenAI-compatible content block responses to the ProviderResponse string contract.\n\nAdjust DeepSeek live coverage for unsupported forced tool_choice and make preset tests robust to ambient local-provider env vars.",
"is_bot": false,
"headline": "fix(axl): harden live preset integrations",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T17:11:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3a7c0a966a742e49cb03d7cf57998031f78df7be",
"body": "Align provider docs and comments with the implemented Bedrock and Azure auth surfaces.\n\nAdd opt-in local preset smoke tests for vLLM, LM Studio, llama.cpp, and SGLang alongside Ollama.",
"is_bot": false,
"headline": "test(axl): expand preset integration coverage",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T16:27:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e866db27b6d5f8b6c3fb97ef8a3c8e3ab55a4800",
"body": "Scope covers the full provider expansion plan diff review, not only the current session delta.\n\nFix typed error/lower-bound-cost propagation, provider-scoped reasoning metadata, unpriced aggregate surfacing, Azure bearer auth override, and OpenAI-compatible stream failure handling.\n\nAdd regression coverage across core providers, runtime hooks, testing runtime, eval artifacts, Studio aggregates, and gated preset round trips.",
"is_bot": false,
"headline": "fix(axl): harden provider compatibility review findings",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T16:19:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "835247d14820f1fedc45c5061058c6404a4aa0aa",
"body": "Promote the unpriced lower-bound signal from per-ask and budget surfaces to execution-level aggregates, trackExecution/trackCost, and AxlTestRuntime.\n\nShare the isUnpricedLeaf discriminator with Studio reducers, add focused regression coverage, and update docs for the new aggregate signal.",
"is_bot": false,
"headline": "feat(axl): surface unpriced execution aggregates",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-07-08T15:33:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "20074606100f70d9452a0eabb5d2063910bef1af",
"body": "…s, embedder msg parity\n\nMaintainability/DX follow-ups from the holistic multi-perspective review of 5633dab\n(verdict: sound; zero must-fix bugs). No behavior change to shipped features.\n\n- DRY: extract a single `BudgetContextState` type in context.ts, referenced by the\n init type + private field +\n[…]\nere declined\nas over-engineering (per-adapter extractErrorMessage varies; the compiler-guarded test\nalready covers the invariant).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(axl): spec-21 review polish — DRY budgetContext, harden type…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-03T14:10:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5633daba5a1d7ae9caab90132bfdaf77abab3f76",
"body": "Two paired additions from spec 21. Both are purely additive (patch under the\n0.x rule); multi-perspective-reviewed (verdicts sound / sound-with-fixes, all\nfindings folded in).\n\nPart A — Budget honesty. ctx.budget() now REPORTS unpriced spend instead of\nsilently understating it: BudgetResult gains `u\n[…]\nm-site network failures). Full\nmonorepo green; docs updated (api-reference, providers, security, observability,\nCHANGELOG, rules).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): budget honesty + typed provider errors (spec 21)",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-03T01:04:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f879251a5b91c133a4ab388aff953855bd93f604",
"body": "… Bedrock id/docs\n\nMulti-perspective review (verdict: T2.2 ship; T2.1/T2.5 ship-with-fixes; central\ndetection design validated — keep it). Fixes:\n\nM1 (verified bug) — T2.5 streaming false-positive. The streaming branch fabricated\na {0,0,0} usage object when the `done` chunk had none, so a no-usage s\n[…]\ntModel race, per-retry key re-resolution. Full suite green\n(axl 1706 · studio 693).\n\nRef: .internal/spec/20-provider-tier2-plan.md\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl): address Tier-2 review — streaming unpriced false-positive +…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T04:47:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "46d5934f8f1156a9f261042ac904ffde6477c9d8",
"body": "…gnal\n\n- Add a roundtrip-handoff cost-honesty test: the target ask_end (emitted at a\n different code site than the main loop) carries unpriced when the target turn is\n unpriced, while the source ask_end (priced turns) does not — closing the\n plan's MF-3 gap.\n- docs/observability.md: document ask_end.unpriced (cost as a lower bound;\n failures not flagged) and the agent_call_end.cost number|undefined widening.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(axl): cover handoff-roundtrip unpriced ask_end + document the si…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T04:27:57Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "04f5954f6264d9cde69d32ae1831e7ad98d1ba2e",
"body": "Renders the ask_end.unpriced signal so an ask/dashboard that used an unpriced\nmodel reads as a lower bound, not a misleading exact $0.00. Two carriers (the\ndashboard and the ask tree read different sources):\n\n- Dashboard: CostData.unpricedCalls, accumulated in reduceCost from\n agent_call_end/memory\n[…]\nreen\n(axl 1702 · studio 686 · e2e 75 · tests 159). CHANGELOG updated.\n\nRef: .internal/spec/20-provider-tier2-plan.md (T2.5 Studio)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl-studio): surface unpriced cost as a lower bound (T2.5 Studio)",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T04:09:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "70bf741c94b5fe4a6cfc3e9b93147448089b6325",
"body": "Tier 1 made per-call cost honest (undefined, not a fake $0). But the per-ask\nrollup (ask_end.cost) still summed unpriced calls as 0, so an ask that used an\nunpriced model reported an exact $0.00 — the same lie, relocated to the aggregate.\n\nCore fix, at the single emitEvent cost-rollup chokepoint:\n- \n[…]\nl suite green (1702). Studio rendering (the two carriers) follows next.\n\nRef: .internal/spec/20-provider-tier2-plan.md (T2.5 core)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): ask_end.unpriced signal for honest aggregate cost (T2.5 core)",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T03:59:37Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c8a085a16e8d086670b9197ff8e72b454c261ab7",
"body": "Bedrock's OpenAI-compatible endpoint for gpt-oss, via the generic engine:\n- bearer auth (AWS_BEARER_TOKEN_BEDROCK; short-term tokens via the T2.2 callback),\n no SigV4. Region-specific base URL (prefer bedrock-mantle) enforced by\n requireExplicitBaseUrl. Versioned model ids passed in full\n (bedroc\n[…]\nrt gating, unknown cost)\n+ gated integration block. Full suite green (1694).\n\nRef: .internal/spec/20-provider-tier2-plan.md (T2.1)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): AWS Bedrock preset (gpt-oss) + Tier-2 docs (T2.1)",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T03:51:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4d0f1ffc9908bfe9a720960a43e7be0601fb4155",
"body": "ProviderConfig.apiKey (and every provider constructor) now accepts\n`string | (() => string | Promise<string>)`. A function is resolved per request\n— supporting Azure-Entra, Databricks/IBM OAuth, and Bedrock short-term tokens —\nwith the callback owning its own refresh/caching (Axl never memoizes).\n\n-\n[…]\nesponses streaming-site guard, rejecting callback). Full suite green (1689).\n\nRef: .internal/spec/20-provider-tier2-plan.md (T2.2)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): async apiKey callback for expiring credentials (T2.2)",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T03:46:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eeb759dc73327d4240c6ca1e5917f8cbd5e87873",
"body": "Lists every supported key — the big three plus the Tier-1 OpenAI-compatible\npresets (OpenRouter, xAI, DeepSeek, Mistral, Groq), Azure (key + base URL +\ndeployment), self-hosted opt-in (OLLAMA_BASE_URL/MODEL), and the planned Bedrock\nbearer token — each with a \"where to get it\" URL and notes. Everything is\noptional; integration tests gate-skip per missing key. CONTRIBUTING points at it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: expand .env.example with all provider keys + how to obtain them",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T02:48:22Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b9bb05b9eeae12bf9a751303bde35f91e3f8bcf2",
"body": "…le presets\n\nPer-preset `skipIf(!<KEY>)` smoke tests (run via `pnpm test:integration`),\nmatching the existing integration-test pattern: cheapest models, tiny payloads.\n\nThe high-value assertions guard the riskiest part of the preset layer — the\nper-model reasoning_effort gating that produced three 4\n[…]\n test` (integration config glob); typechecks and\ngate-skips cleanly (13 skipped) without keys. Assertions run only with real keys.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(axl): gated live integration smoke tests for the OpenAI-compatib…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T02:22:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e9a7683673ef0a29b0b8d9e06bf4f8526b3f76fa",
"body": "Living-docs for the Tier-1 provider expansion (same change set):\n- docs/providers.md: new \"OpenAI-compatible providers & presets\" section (preset\n table, per-preset auth/reasoning/pricing matrix, self-hosted ports + caveats);\n presets added to the effort-mapping table with per-model omit/no-op foo\n[…]\npreset quick-start.\n- ROADMAP.md: provider expansion reframed as generic-engine + presets (replaces\n the stale per-adapter plan).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(axl): document OpenAI-compatible presets + cost-on-miss change",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T02:12:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fd732e82550e12e4abb72f20fe3f9aaee0b4e902",
"body": "…rden tool-call streaming\n\nMulti-perspective review found three preset bugs where the unified `effort`\nknob emitted an invalid `reasoning_effort` and caused a hard 400/422 (contra\nthe \"no silent 400\" guarantee), plus latent streaming/safety gaps.\n\nPreset fixes (each verified against current provider\n[…]\nallowlist, NaN\nguard, reasoning_details streaming, abrupt stream close, Azure throw). Full\nsuite green (1675); e2e + studio green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl): address Tier-1 review — gate reasoning_effort per model, ha…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T02:12:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e0bf3a2bde6bfdb35825351c32f998cad89eecf5",
"body": "…AI, DeepSeek, Mistral, Groq, self-hosted)\n\nEach preset is a ProviderProfile served by the generic engine — no new adapter\ncode. Registered in the registry under its provider name (lazy, env-key aware);\nthe native big-3 adapters keep precedence.\n\n- OpenRouter: reasoning object (effort XOR max_tokens\n[…]\nl. 22 preset tests + registry-wiring tests;\nfull axl suite green (1659).\n\nRef: .internal/spec/19-provider-expansion.md (T1.1–T1.4)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): add Tier-1 OpenAI-compatible presets (OpenRouter, Azure, x…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T01:08:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eb1c84fba2023e95b7fcf4fef911fc3ef86d140d",
"body": "…ProviderProfile\n\nIntroduces a single generic engine over the OpenAI /v1/chat/completions wire\nformat, parameterized by a ProviderProfile. OpenAIProvider becomes a thin\nsubclass with the canonical OpenAI profile; behavior is byte-for-byte unchanged\nexcept the deliberate cost-on-miss fix below.\n\nThe \n[…]\ne flipped test is the\ncost-on-miss contract. 52 new adversarial engine tests.\n\nRef: .internal/spec/19-provider-expansion.md (T1.0)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): generalize OpenAIProvider into OpenAICompatibleProvider + …",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-06-02T00:59:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a09fed17683e0ec41aa7d8a2650e2a9fce876f75",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: Bump to 0.18.2",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T21:06:59Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5294eb7fbd1990afc18cef5111b94f2fcee87495",
"body": "…ession)\n\nThe `applies?` field added to `Scorer`/`ScorerConfig` in 0.18.1 was declared as\na function-valued property, whose parameters `strictFunctionTypes` checks\ncontravariantly. That broke assignability of a concretely-typed\n`Scorer<…, TInput, TAnnotations>` to the `Scorer<unknown, unknown, unkno\n[…]\nerApplies` alias are\nunchanged. Adds `scorer-assignability.test-d.ts`, compiled by the `typecheck`\nCI gate, as a regression guard.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl-eval): declare Scorer.applies with method syntax (0.18.1 regr…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T21:06:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0508e4b89d176dcf67bc23f9dd5d08f22428afb7",
"body": "Split the 384-line CLAUDE.md into a lean 78-line index plus nine task-scoped rule files under .claude/rules/ — eight path-scoped so they load only when the matching package is touched, documentation.md always loaded. Drop brittle implementation detail (exact prices, versions, model lists, the per-fi\n[…]\nn docs/studio-api.md and the eval/studio rules.\n\nTrack .claude/rules/ via a !.claude/rules/ un-ignore, mirroring !.claude/agents/.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: modularize CLAUDE.md into .claude/rules/",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T20:51:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "410a6871fdfbe3e2dacd564da65c0f26f75648db",
"body": null,
"is_bot": false,
"headline": "chore: Bump to 0.18.1",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T20:24:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c8069a1f41fac97b9fc59eec3ce5d511041da0f6",
"body": "Match the 0.18.0 headline + tight-paragraph voice and write for the\nupgrader: lead with the capability, the no-provider-call win, the\nmean/gate-exclusion semantics, and the NaN deprecation. Drop the\nfield-by-field type enumeration and internal mechanics (PairedSampleNote,\naggregateRuns, always-populated n, advisory internals) — that lives in\napi-reference, not the changelog.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: tighten conditional-scorer CHANGELOG entry (~250→120 words)",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T20:19:59Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "432111960140fc596a68cd0911f8a15fced2d0c4",
"body": "Adds `seedConditionalScorerEval` to the Studio dev fixtures so the dev\nserver (and the release smoke checklist) exercises every UI surface that\nrenders the `applies` skip / N-A scorer state — previously unreachable\nbecause no fixture produced a skipped scorer:\n\n- run-detail Scorer Summary + Score Di\n[…]\ncandidate pair whose conditional scorer applies to different item\nsubsets. Visually verified end-to-end in the running dev server.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(studio): seed a conditional-scorer eval in dev fixtures",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T20:17:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bdcea9601bdb30da4419486be944b81b70e8da82",
"body": "Findings from a 3-lens review (correctness / architecture+types / UX) of the\nconditional-scorer work. No blockers were found; these close real edge cases,\none cross-surface inconsistency, and a DRY gap.\n\nCorrectness:\n- CLI `compare` skip NOTE missed the equal-but-disjoint case (both sides skip\n the\n[…]\nmean not red, failed-null tooltip, rich-vs-simple\nchip). Full suite green (eval 375, studio 686, e2e 159); all packages typecheck.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(axl-eval,studio): address final multi-perspective review",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T19:18:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "87fbed75aaaf6831b22ee3ccfb6c3d42fec840f8",
"body": "The compare row mixes two samples: the headline `delta` is the difference of\ntwo INDEPENDENT per-side means (each over that side's own scored items), while\nthe CI / significance are PAIRED over the items scored on both sides. Under\nasymmetric skips or failures these diverge — a delta can be a sample\n[…]\no\n(PairedSampleNote shows on divergence, hidden when symmetric / counts absent).\nFull suite green (eval 374, studio 677, e2e 159).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl-eval,studio): label per-side vs paired sample in compare view",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T18:55:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "09bd447829e4e88c89403c0df01fc427008ad417",
"body": "…very journey\n\nFollow-up to the `applies` predicate: close the journey gaps found by walking\nthe feature from each user's perspective (eval author, CI gatekeeper, Studio\noperator, comparison analyst, programmatic/back-compat consumer).\n\nCI/CD gatekeeper:\n- New non-fatal advisory `reportFullySkippedS\n[…]\nnent tests\n(detail N/A vs failed, list N/A cell, chips, compare non-comparable). Full suite\ngreen (eval 373, studio 671, e2e 159).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl-eval,studio): make conditional-scorer skips visible across e…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T18:23:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "82eafdb139cd4027bd11f343c8b903b01eb7df5a",
"body": "A scorer can legitimately not apply to every dataset item (a refusal judge\nfor refusal-expected items, a constraint judge for constrained items, …).\nAXL runs every scorer against every item, so the community workaround was to\nreturn a NaN sentinel for inapplicable items — which the 0.18.0 failure-ra\n[…]\n adversarial conditional-scorer tests + multi-run/Studio badge/\nredact coverage. Full suite green (eval 372, studio 661, e2e 159).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl-eval,studio): conditional scorers via `applies` predicate",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T17:58:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "62d6c5d5dba9ac0cb3388cca334500adfbf72ba7",
"body": "Rewrite the verbose recent and major-release entries (0.13.7–0.18.0)\nfor high signal: keep breaking changes, public APIs, defaults, and\nmigration notes; cut implementation archaeology, internal symbol\nnames, and exhaustive type-export enumerations. No content for\n0.13.6 and earlier changed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: tighten CHANGELOG for readability (35% shorter)",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-31T16:35:54Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ddfe3d8f017cb4cff7151343a102281314fb5628",
"body": "Minor release (0.x convention: minor = behavior change). Highlights: eval trust\nsignals (failure-rate gate, total-wipeout guard, per-scorer scored/failed counts)\n+ opt-in provider rate governor; latest flagships (gpt-5.5, Opus 4.8); launch-prep\ndocs. Three behavior changes warrant the minor: scorers\n[…]\nrect \"pre-0.17.10\" artifact references to \"pre-0.18.0\" (the scored/failed/\n degraded fields ship in 0.18.0; there is no 0.17.10).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: Bump to 0.18.0",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-30T04:14:44Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ff232d51f99c4f70596a473f9bf9c8aa2ce1acde",
"body": "…y pass\n\nDocumentation sweep (verified by a parallel docs-consistency agent), calibrated\nto each document's reader and depth:\n\n- api-reference.md (reader looks up exact API): documented the newly-exported\n `evaluateScorerErrorRateGate` and `evaluateScorerTolerance` (+ the\n `ScorerToleranceVerdict`\n[…]\nnto a bold lead + scannable sub-bullets instead of ~400-word paragraphs.\n- Fixed a stray blank line between two `Changed` bullets.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: final sweep for failure-signal + governor; CHANGELOG readabilit…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T21:52:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d941a5606dbf9af6c1373cb7c15a9951642b952f",
"body": "Outlined the user journeys the failure-signal + governor work must support\n(CI gatekeeper, eval author, infra operator, Studio user, programmatic\nconsumer), then verified the implementation against them with parallel agents.\nMost scenarios passed (notably the governor's cancellation chain is wired a\n[…]\nare run with no config can't set it — add a\nminimal `axl.config.ts`. (Assessed an env-var/flag as speculative surface; not built.)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl-eval,studio): close journey gaps found by scenario verification",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T21:26:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "102122fd85b8734f4c5cb6e899f6011ddb46142c",
"body": "…-signal + governor\n\nFour parallel review passes (concurrency, eval correctness, architecture,\nproduct/docs) on commits 7c308db + 25d8ed1. No critical bugs; this addresses\nevery major/minor finding plus the warranted improvements.\n\nEval failure-rate signal:\n- DRY: the type-aware tolerance arithmetic\n[…]\n, governor\nobserve-throws-still-releases + first-grant-immediate + release-underflow-warn,\nStudio degraded banner + consolidation.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl,axl-eval,studio): address multi-perspective review of failure…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T21:14:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "25d8ed1620d0f42c1f0d97a2aa3b22eb25a6104b",
"body": "Part 2 of the eval-trust effort. Provider pacing was purely reactive — the\n429/503/529 backoff only engaged after a request was rejected. A large\nfan-out on a shared API key (e.g. an eval issuing concurrency ×\nscorerConcurrency, up to 25, concurrent judge calls) could storm a provider\nbefore any bac\n[…]\nease-on-throw, nested\nno-deadlock, undefined-governor unchanged) + registry wiring. retry.test.ts:58\nmigrated to the options form.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): opt-in provider rate-limit governor at the fetch chokepoint",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T20:43:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7c308dba9247a76ee91554b85abd7be7bdc8726b",
"body": "Primary change — Part 1 of the eval-trust effort:\n\nConcurrent scorers can overrun a rate-limited judge model; when a judge\ncall exhausts the provider's retry backoff it throws, the item's score\nbecomes null, and the mean is computed over the survivors — so a\n--fail-on-regression gate can pass on a n\n[…]\n pass, examples/, docs/studio-api.md, gpt-5.5 +\nOpus-4.8 provider/pricing additions) per maintainer direction to land it\ntogether.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl-eval): scorer failure-rate trust signal + launch-prep docs",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T20:29:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ddb9f4ef8dcff04e945c10631f8a72679cdc265e",
"body": "The unit suite validates the concurrent-scorer mechanics deterministically with\nconstant scorers + MockProvider; nothing exercised the motivating case against a\nlive provider. Adds a gated integration test that does.\n\n- packages/axl-eval/src/__tests__/integration-scorer-concurrency.test.ts:\n descri\n[…]\n:integration` is now\n `pnpm -r test:integration` so it covers axl + axl-eval.\n- Docs: CLAUDE.md testing section + CHANGELOG note.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test(axl-eval): gated live-API integration test for concurrent scorers",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T17:19:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5a3180a7916b7e4951554ea890027163ca1b638a",
"body": "…scorers\n\nFindings from a concurrency / architecture / product review of 071f611.\n\nCorrectness:\n- mapWithConcurrency: coerce non-finite/fractional concurrency\n (Number.isFinite(c) ? Math.floor(c) : 1) before clamping. A raw config\n `concurrency: NaN` (e.g. Number(process.env.X)) made Math.max(1,Na\n[…]\no banner. Full suite green (eval 318, studio 627, core 1560, e2e/integ\n234) + typecheck + build. Docs/CHANGELOG/CLAUDE.md updated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl-eval,studio): address multi-perspective review of concurrent …",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T17:11:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "071f6117e8f269b8cae634e541d09420b35452f1",
"body": "Tackles three of the outstanding @axlsdk/eval feature requests (#4 already\nshipped). Reviewed the rest as an owner; deferred #2-items (needs item identity),\n#5 (annotations already round-trip; the gap was #4), and #6 (overlaps rescore +\nadds a stale-cache footgun).\n\n#1 — Concurrent scorers within an\n[…]\nd to cli-args.ts so it is unit-testable without firing\nmain(). Docs updated: README, api-reference, CHANGELOG, CLAUDE.md, spec/13.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl-eval): concurrent scorers + --concurrency / --scorers CLI flags",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T16:53:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3fc29b561cf435a880235556fbabeb9dbc6b8c1e",
"body": "Multi-perspective review surfaced real issues; this addresses them.\n\nCorrectness:\n- dataset(): gate drop-detection on the annotations schema being a ZodObject\n (isObjectSchema, via the public .shape getter). A .transform()/.preprocess()/\n pipe reshapes parsed output, so the raw-vs-parsed diff was \n[…]\nrror'+file; banner RTL (singular/plural/chips/cap/\nempty); multi-run aggregate propagation. Replaced `as never` with a typed stub.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl-eval,studio): address review of dropped-annotation-keys feature",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T15:03:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a3c8876abef6e96c646924bd9ae33b1c915f6682",
"body": "…ace in Studio\n\nZod object schemas strip undeclared keys by default, so an annotation\nfield missing from a dataset's `annotations` schema was silently dropped\nbefore reaching scorers — a scorer reading it saw `undefined` and quietly\nbecame a no-op while the eval still \"passed\". Worst on file-based d\n[…]\nfile/nested/all policies), runner metadata\npropagation, client helper. Docs: CHANGELOG, api-reference, axl-eval README,\nCLAUDE.md.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl-eval): flag annotation keys dropped by dataset schema + surf…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-29T14:38:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "99ce11411c9ffe2f54346cc7a0daa9df0a97accd",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: Bump to 0.17.9",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-28T14:53:25Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4466cbdb36689a28c415aaace02f174b79ec6270",
"body": "…pagation\n\nWidens `LlmScorerConfig` with six additive ChatOptions fields (`maxTokens`,\n`effort`, `thinkingBudget`, `includeThoughts`, `stop`, `providerOptions`) so\nreasoning-capable judges (gpt-5.x, Opus 4.5+/Sonnet 4.6+, Gemini 3.x) can be\ncalibrated through `effort: 'high'` without abandoning `llm\n[…]\ninterface from `@axlsdk/axl` instead of an inline subset, so\nany future `ChatOptions` field is automatically available to scorers.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl-eval): llmScorer ChatOptions surface + end-to-end signal pro…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-28T14:51:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bfaf6ef796c6dce60b8eeb54bbdf45df1b43d09a",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: Bump to 0.17.8",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-25T19:21:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "49eae199506a93226da61e774ff6dcb700c98e49",
"body": "Adds GA pricing for google:gemini-3.5-flash ($1.50/$9.00 per 1M tokens;\ncached input rides the standard 10% rule). Versioned identifiers\n(gemini-3.5-flash-001) resolve via the existing longest-prefix matcher.\n\nFixes a latent gap surfaced by 3.5 Flash and other Gemini 3.x models:\nthe provider dropped\n[…]\no on 3.x, 2.x back-compat (no id field), and the full parallel-call\ntwo-turn round-trip. 81/81 gemini tests pass; typecheck clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): Gemini 3.5 Flash support + functionCall.id round-trip",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-25T19:12:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "43650c1fe48503d39ad8e3fb671d3d1a5106e600",
"body": "GitHub flagged Node.js 20 actions as deprecated during the v0.17.7\npublish run — Node.js 20 will be forced off the runners on\nJune 2, 2026 (~1 week away). The v6 majors of all three actions\nsupport Node.js 24.\n\nVersions verified against upstream:\n- actions/checkout@v6 (v6.0.2, released 2026-01-09)\n-\n[…]\ntry-url`) is stable across the major bump.\n\nThis push triggers CI on main, which exercises all three actions\nacross the Node 20 + 22 matrix, lint, and smoke jobs — the validation\ngate for the v6 bump.",
"is_bot": false,
"headline": "ci: bump actions/checkout, actions/setup-node, pnpm/action-setup to @v6",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-25T18:07:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9357e1210ef5513274fecb8c296e2fae3ae56603",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: Bump to 0.17.7",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-20T16:12:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e250a963479737ed92f575368157a31088fe878d",
"body": "The two customer-ask planning docs (axl-team-asks.md,\naxl-team-asks-review.md) now live under .internal/ — already gitignored\nas a whole — instead of being listed individually in .gitignore. One\nrule covers them, consistent with how the rest of the internal planning\nmaterial (specs, roadmap, competitive analysis) is kept out of the\npublished repo. Reverts the per-file .gitignore entries added in the\nprevious commit.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: move customer-ask working docs into .internal/",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-20T16:10:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e5e05e62b6ac6998c711193314344f543ab26f71",
"body": "Pre-publish documentation pass. Three things: CHANGELOG finalization,\nversion-number correction, and untracking the customer-ask working docs.\n\nVersion correction: 0.18.0 → 0.17.7\n- The release is 100% additive (spec/18 confirms no breaking changes).\n Per the project's pre-1.0 semver convention — p\n[…]\nng docs, not part of the published repo.\n\nNo code changed this turn — docs only. The redis.ts zRange migration\nshipped in f39a29b.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: finalize CHANGELOG for 0.17.7 release + version-ref sync",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-20T16:00:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f39a29be3da04d9130c7ea0a17136caf6a293247",
"body": "Owner-judgment test coverage pass. Identifies and closes coverage gaps\nacross the entire 0.18.0 surface, AND catches a real production bug\n(node-redis v5 API mismatch) that mock-based tests couldn't surface.\n\nThe bug, caught by the integration tests\n- `RedisStore.listExecutions(limit)` and `listEval\n[…]\n).\n- tests/studio: 159 passed (unchanged).\n- redis-integration with REDIS_URL set: 11/11 passing against\n redis://localhost:6379.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: 19 new tests across E2E + REDIS_URL-gated integration",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-19T23:11:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "87c3eb14f7c911cd9526d50282c7e9ebffb00142",
"body": "…r reactivity\n\nOwner judgment on the spec/18 §12 deferred list. Three items were\ntrivial-to-medium cost with real customer-visible value; the rest stay\ndeferred for lack of a concrete pull (cross-process lease, tags-field\nseparation, per-event size guard, promise-chain cap, RedisClient type\nrefactor\n[…]\ne items to \"Shipped\n in 0.18.0\" with check marks; remaining deferred items annotated\n with workaround / customer-pull rationale.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): pull forward 3 deferred items — audit symmetry + aggregato…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-19T20:25:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eb65ebf541206fbf50759159922d88083d1020ae",
"body": "Pre-release documentation pass. Two new anchor docs serve as\nsource-of-truth for the design; nine existing docs gain targeted\nupdates that cross-link the anchors rather than duplicating the deep\ncontent.\n\nNew anchor docs\n- `docs/migration/state-store-durability.md` — customer-facing migration\n guid\n[…]\numan` signal-abort wiring.\n\nInternal specs (next commit) and internal docs (commit after) still\npending — anchor doc `.internal/spec/18-state-durability.md` and\nspec README index entry already landed.",
"is_bot": false,
"headline": "docs: sweep external + READMEs + CLAUDE.md for 0.18.0 release",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-19T17:46:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4eff9be496e19b8c53ed4b9acbcc25947b008868",
"body": "Walked through 30+ user scenarios across six personas (compliance, operator,\ndeveloper, SRE, performance, migrating-user). Spawned a verification agent\nto cross-check each against the implementation. Six new gaps found and\nfixed; all interlocking on the GDPR-delete + awaitHuman path.\n\nCritical: awai\n[…]\n\n- Updated: deleteExecution MULTI queue-length assertion 8→9.\n- Total: 1550 axl + 603 studio inline + 226 e2e/integration passing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl): scenario-driven gaps from owner-level review",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-19T03:27:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5bfd367e1fd3e56a19b50d3e4617a3a74d0fae1c",
"body": "Smaller cleanups + documentation updates rounding out the multi-perspective\nreview of the 0.18.0 work.\n\nOperator hygiene (RedisStore)\n- `listPendingExecutions` self-prunes stale ids whose `executionState`\n blob has TTL-evicted. Without this, the pending-set bloats forever\n in deployments that age \n[…]\nthe live id AND the dead id is\n SREM'd from the pending set.\n- Total: 1543 axl + 603 studio inline + 226 e2e/integration passing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(axl): operator-hygiene fixes + docs sync from review",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-19T02:53:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6dc3ec54ea5461aed10629ce832bccef2fef43f8",
"body": "Targeted improvements raised by the post-implementation review of the\n0.18.0 release work. Each is independently small; bundling because they\ntouch the same files and share test fixtures.\n\nMemory + session TTL semantics\n- getMemory's race-safe legacy migration now applies the configured\n `memory` T\n[…]\nstudio inline + 226 e2e/integration passing\n (1542 axl reflects +2 net new tests; the renamed assertions stayed\n count-neutral).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl): strong-suggestion fixes from multi-perspective review",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-19T02:45:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1d5f62f8b28982730367af9618a14099b9388416",
"body": "Bundles 9 fixes uncovered by the post-implementation review of the 0.18.0\nrelease work. Each is independently testable; bundling because they share\ntest infrastructure and are interlocking.\n\nState store consistency\n- deleteExecution now sweeps every per-execution surface: checkpoint blob,\n exec-sta\n[…]\ntest.ts:145\n (history array widening for ChatMessage union).\n- Total: 1540 axl + 603 studio inline + 226 e2e/integration passing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl): critical correctness fixes from multi-perspective review",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-19T02:38:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9e64025a1735b28e0f9b0855b684a19c05d403d7",
"body": "Without streaming, events are buffered in memory and only persist at the\nterminal done/error event — if the process crashes mid-run, the events\nare lost. With state.persist: 'streaming', events are batched and flushed\nto a streaming buffer throughout the run; on crash, the next process\ncalls runtime\n[…]\n, string_delta\n(high-volume, reconstructable from persisted agent_call_end.data).\n\nAddresses ask #1 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): state.persist: 'streaming' for in-flight trace durability",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-18T21:52:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cc7cb0564c3645c841974dbc9070dbc19e4307b9",
"body": "Without TTLs, every save on RedisStore accumulates forever and Redis\neventually OOMs. New options:\n\n- `defaultTtl`: TTL in seconds applied to every TTL-capable category.\n- `ttls`: per-category overrides (seconds, or `null` to opt out even\n when defaultTtl is set).\n\nCategories: `session`, `sessionMe\n[…]\nMULTI overhead). With a TTL, hSet + EXPIRE queue\nin a single MULTI for atomicity.\n\nAddresses ask #3 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): RedisStore TTL config (defaultTtl + per-category overrides)",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-18T21:33:49Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8fc39094f84f94d6dea20dff5c5797aff1183a9b",
"body": "Symmetric to `runtime.deleteEvalResult` / `DELETE /api/evals/history/:id`.\n\n- New optional `StateStore.deleteExecution?(id): Promise<boolean>`\n interface method. All three built-in stores implement it.\n- `RedisStore.deleteExecution` removes from all three indexes\n (legacy SET, sorted-set, data blo\n[…]\nbulk eviction by age, use\n`RedisStore` TTLs (coming in #3 from the same review).\n\nAddresses ask #10 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): runtime.deleteExecution and Studio DELETE /api/executions/:id",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-18T21:21:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a689340dc59ebc9a3ca8b0bffd774f7ad4e60e77",
"body": "Thread caller-supplied `ExecuteOptions.metadata` verbatim onto the\n`ExecutionInfo` snapshot from both `runtime.execute()` and\n`runtime.stream()`. Gives users a stable, queryable surface for tags\nlike `userId`, `tenantId`, or correlation ids without parsing the\nevent timeline.\n\nPersisted by all three\n[…]\nilter via `runtime.getExecutions()` + an in-process\n`.filter()`, or mirror executions into their own datastore for richer\nqueries.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): lift ExecuteOptions.metadata onto ExecutionInfo.metadata",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-18T21:10:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bee51eff88a2376a88f1abf1c9e8b0514543c6e3",
"body": "…ast path\n\nPre-patch, both methods scanned `SMEMBERS` + N×`GET` + JS-sort. Fine at\na few hundred entries, painful at 10k+. Now each `saveExecution` /\n`saveEvalResult` dual-writes the ID into a Redis sorted-set scored by\n`startedAt` / `timestamp` (inside the same MULTI as the data blob — so\natomicity\n[…]\nhe ZSET, not SREM on the legacy SET, to\navoid racing with the slow-path fallback.\n\nAddresses ask #4 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "perf(axl): RedisStore listExecutions/listEvalResults use sorted-set f…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-18T21:08:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0554f0217f16e3c79420ec7c6487520d3cd2fb66",
"body": "Every write path that touched more than one Redis key — `saveSession`,\n`deleteSession`, `saveExecutionState`, `saveExecution`, `saveEvalResult`,\n`deleteEvalResult`, `deleteMemory` — now queues all its commands in a\nsingle `client.multi()` chain and commits atomically.\n\nBefore this fix, a crash betwe\n[…]\nlags the need\nfor WATCH if a future contributor adds a read-modify-write pattern.\n\nAddresses ask #6 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl): RedisStore wraps every multi-key write in MULTI/EXEC",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-18T20:46:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e5a87010a1583a7bfee87a4ac342ef78a16c6f92",
"body": "…migration\n\nBefore this fix, `ctx.remember()` against `RedisStore` silently took a\n`saveSessionMeta`-based fallback path inside `MemoryManager` which (a)\ndropped the optional `metadata` arg, (b) made entries invisible to\n`getAllMemory` (so `session.fork()` silently skipped memory migration),\nand (c)\n[…]\nrs on custom\n`StateStore` impls that haven't implemented the four memory methods.\n\nAddresses ask #2 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(axl): RedisStore implements memory methods with race-safe legacy …",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-18T20:39:19Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "07c6b32c478d940d2906b242d6f7bb11010e86ea",
"body": "`RedisStore.create()` now accepts an options object with a `keyPrefix`\nfield, defaulting to `'axl:'` for backward compatibility. Useful when\nmultiple Axl deployments coexist on one Redis cluster (e.g. `'axl:prod:'`\nvs `'axl:staging:'`) or when sharing a cluster with other applications.\n\n- No normali\n[…]\ninst `this.keyPrefix` — factored out a `sessionIdsKey()`\n helper for uniformity.\n\nAddresses ask #8 from the customer-team review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): RedisStore keyPrefix option for shared-cluster deployments",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-18T20:27:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "85417e85bd6e2f3df505d572c0a9159bad2e2a70",
"body": "Adds first-class support for claude-opus-4-7 ($5/$25 per 1M, same as 4.6)\nwith adaptive thinking + output_config.effort. Promotes 'xhigh' to the\npublic Effort enum, positioned between 'high' and 'max'. Maps natively\nto Opus 4.7 (output_config.effort: 'xhigh') and OpenAI gpt-5.2+\n(reasoning_effort: '\n[…]\n that mirrors the OpenAI pattern.\n\nAnthropic task budgets (public beta) intentionally deferred pending\nthe official API reference.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): Claude Opus 4.7 + cross-provider 'xhigh' effort tier",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-13T19:28:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "dfb1e46f36969a682f894b70d403c16704929078",
"body": "Adds the GA identifier alongside the existing -preview entry at the same\nrate ($0.25 / $1.50 per 1M tokens). The 3.x code paths (isGemini3x regex,\nthinkingLevel mapping, minThinkingLevel) already covered the GA\nidentifier — this release adds pricing only. Preview continues to work\nuntil Google's shu\n[…]\n5-25; migrate before then.\n\nAlso swaps the live-API integration test from preview → GA so it doesn't\nsilently break post-shut-off.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(axl): GA pricing for google:gemini-3.1-flash-lite (0.17.6)",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-13T19:00:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "794d65661022fa042fa2df70f8e2ecb6e78e3f5f",
"body": "Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: Bump to 0.17.5",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-07T05:16:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1474d58b136c763120a1a7632d197e0c194530d4",
"body": "…n hover\n\nUser-reported: hovering over a collapsed `JsonViewer` (e.g. a chat\nbubble showing `> { title, summary, bulletPoints, confidence }`) made\nthe floating \"Expand\" + \"Copy\" buttons visually merge with the\nunderlying tree text — the buttons had a border but no fill, so the\nJSON preview showed th\n[…]\nExpand/Collapse and Copy buttons. Affects every\nJsonViewer surface (chat bubbles, tool inspector, trace bodies, etc.)\nidentically.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(studio): JsonViewer toolbar buttons no longer overlay tree text o…",
"author_name": "Erik Portillo",
"author_login": "erikportillo",
"committed_at": "2026-05-07T04:33:20Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 55,
"commits_last_year": 392,
"latest_release_at": "2026-07-20T19:35:03Z",
"latest_release_tag": "v0.20.0",
"releases_from_tags": true,
"days_since_last_push": 6,
"active_weeks_last_year": 17,
"days_since_latest_release": 6,
"mean_days_between_releases": 7.6
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 75,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "@axlsdk/axl",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"ai",
"agents",
"llm",
"typescript",
"orchestration",
"agentic"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@axlsdk/axl",
"is_deprecated": false,
"latest_version": "0.20.0",
"repository_url": "https://github.com/axl-sdk/axl",
"versions_count": 59,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 835,
"first_published_at": "2026-02-17T17:32:09.269000Z",
"latest_published_at": "2026-07-20T19:45:32.912000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
},
{
"name": "@axlsdk/eval",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"ai",
"evaluation",
"scoring",
"agents"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@axlsdk/eval",
"is_deprecated": false,
"latest_version": "0.20.0",
"repository_url": "https://github.com/axl-sdk/axl",
"versions_count": 59,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 769,
"first_published_at": "2026-02-17T17:32:17.220000Z",
"latest_published_at": "2026-07-20T19:45:34.466000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
},
{
"name": "@axlsdk/studio",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"ai",
"studio",
"developer-tools",
"agents",
"debugging"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@axlsdk/studio",
"is_deprecated": false,
"latest_version": "0.20.0",
"repository_url": "https://github.com/axl-sdk/axl",
"versions_count": 57,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 879,
"first_published_at": "2026-02-18T21:41:22.612000Z",
"latest_published_at": "2026-07-20T19:45:38.542000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
},
{
"name": "@axlsdk/testing",
"exists": true,
"license": "Apache-2.0",
"keywords": [
"ai",
"testing",
"mock",
"agents"
],
"ecosystem": "npm",
"matches_repo": true,
"registry_url": "https://www.npmjs.com/package/@axlsdk/testing",
"is_deprecated": false,
"latest_version": "0.20.0",
"repository_url": "https://github.com/axl-sdk/axl",
"versions_count": 59,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": 1,
"monthly_downloads": 731,
"first_published_at": "2026-02-17T17:32:15.122000Z",
"latest_published_at": "2026-07-20T19:45:35.877000Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
}
]
},
"popularity": {
"forks": 0,
"stars": 2,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"examples/tsconfig.json",
"packages/axl-eval/tsconfig.json",
"packages/axl-studio/tsconfig.json",
"packages/axl-testing/tsconfig.json",
"packages/axl/tsconfig.json",
"tests/tsconfig.json"
],
"toolchain_manifests": [],
"largest_source_bytes": 188417,
"source_files_sampled": 389,
"oversized_source_files": 8,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 5234
},
"dependencies": {
"manifests": [
"examples/package.json",
"package.json",
"tests/package.json"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"npm"
],
"dependencies": [
{
"name": "@axlsdk/axl",
"manifest": "packages/axl-eval/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@axlsdk/axl",
"manifest": "packages/axl-studio/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
},
{
"name": "@hono/node-server",
"manifest": "packages/axl-studio/package.json",
"ecosystem": "npm",
"version_constraint": "^1.13.0"
},
{
"name": "@hono/node-ws",
"manifest": "packages/axl-studio/package.json",
"ecosystem": "npm",
"version_constraint": "^1.1.0"
},
{
"name": "hono",
"manifest": "packages/axl-studio/package.json",
"ecosystem": "npm",
"version_constraint": "^4.7.0"
},
{
"name": "tsx",
"manifest": "packages/axl-studio/package.json",
"ecosystem": "npm",
"version_constraint": "^4.19.0"
},
{
"name": "ws",
"manifest": "packages/axl-studio/package.json",
"ecosystem": "npm",
"version_constraint": "^8.0.0"
},
{
"name": "@axlsdk/axl",
"manifest": "packages/axl-testing/package.json",
"ecosystem": "npm",
"version_constraint": "workspace:*"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 1
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "erikportillo",
"commits": 392,
"avatar_url": "https://avatars.githubusercontent.com/u/6964428?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"publish.yml"
],
"has_docs_dir": true,
"linter_configs": [
"eslint.config.js"
],
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"pnpm-lock.yaml"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 10,
"reason": "packaging workflow detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "80 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "71e209de7d0823c538668c6d645bc359264b3999",
"ran_at": "2026-07-27T05:57:51Z",
"aggregate_score": 4.4,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-20T20:09:32Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/axl-sdk/axl",
"host": "github.com",
"name": "axl",
"owner": "axl-sdk"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 57,
"inputs": {
"security": 44,
"vitality": 81,
"community": 45,
"governance": 32,
"engineering": 84
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 81,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"commits_last_year": 392,
"human_commit_share": 1,
"days_since_last_push": 6,
"active_weeks_last_year": 17
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 6 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 6
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "17/52 weeks with commits",
"points": 11.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 17
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "392 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 392
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 88,
"inputs": {
"releases_count": 55,
"latest_release_tag": "v0.20.0",
"releases_from_tags": true,
"days_since_latest_release": 6,
"mean_days_between_releases": 7.6
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "55 version tags (no GitHub releases)",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "version_tags_no_releases",
"params": {
"count": 55
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 6 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 6
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~7.6 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 7.6
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 45,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 2,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "2 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 2
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (Apache-2.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Apache-2.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 13.5,
"status": "met",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 58,
"inputs": {
"packages": [
"@axlsdk/axl",
"@axlsdk/eval",
"@axlsdk/studio",
"@axlsdk/testing"
],
"dependents": null,
"ecosystems": "npm",
"total_downloads": null,
"monthly_downloads": 3214
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "3,214 downloads/month across npm",
"points": 46.8,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 3214,
"ecosystems": "npm"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 32,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"issue_closed_ratio": null,
"closed_unmerged_prs": 1
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "0/1 decided PRs merged",
"points": 0,
"status": "missed",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 0,
"decided": 1
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "at_risk",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 33,
"inputs": {
"followers": 0,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "axl-sdk",
"public_repos": 1,
"account_age_days": 164
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "0 followers of axl-sdk",
"points": 0,
"status": "missed",
"details": [
{
"code": "owner_followers",
"params": {
"count": 0,
"login": "axl-sdk"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "1 public repos, account ~0 yr old",
"points": 3.1,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 1
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"@axlsdk/axl",
"@axlsdk/eval",
"@axlsdk/studio",
"@axlsdk/testing"
],
"ecosystems": "npm",
"any_deprecated": false,
"min_days_since_publish": 6
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "4 package(s) on npm",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 4,
"ecosystems": "npm"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 6 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 6
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "59 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 59
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 84,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 80,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": "eslint.config.js",
"points": 16,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.js"
}
}
],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [
"agentic",
"agents",
"ai",
"anthropic",
"gemini",
"llm",
"openai",
"orchestration",
"sdk",
"structured-output",
"tool-calling",
"typescript",
"workflows"
],
"has_wiki": false,
"homepage": "https://www.npmjs.com/package/@axlsdk/axl",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://www.npmjs.com/package/@axlsdk/axl",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "13 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 13
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 44,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, CI-Tests, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"ci_tests",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 44,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 15,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 3,
"scorecard_aggregate": 4.4
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "80 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 1
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 72,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"AGENTS.md",
"CLAUDE.md"
],
"agent_instruction_max_bytes": 5234
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md, CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md, CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 64,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"pnpm-lock.yaml"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [
"examples/tsconfig.json",
"packages/axl-eval/tsconfig.json",
"packages/axl-studio/tsconfig.json",
"packages/axl-testing/tsconfig.json",
"packages/axl/tsconfig.json",
"tests/tsconfig.json"
],
"agent_commit_share": 0.7,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": "eslint.config.js",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "eslint.config.js"
}
}
],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "examples/tsconfig.json, packages/axl-eval/tsconfig.json, packages/axl-studio/tsconfig.json, packages/axl-testing/tsconfig.json, packages/axl/tsconfig.json, tests/tsconfig.json",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples/tsconfig.json, packages/axl-eval/tsconfig.json, packages/axl-studio/tsconfig.json, packages/axl-testing/tsconfig.json, packages/axl/tsconfig.json, tests/tsconfig.json"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "70 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 70,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 99,
"inputs": {
"primary_language": "TypeScript",
"largest_source_bytes": 188417,
"source_files_sampled": 389,
"oversized_source_files": 8
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "TypeScript (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "TypeScript"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "8/389 source files over 60KB",
"points": 53.9,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 389,
"oversized": 8
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": false,
"api_schema_files": []
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
},
{
"key": "mcp_server",
"name": "MCP server",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "runnable_examples",
"name": "Runnable examples",
"detail": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "examples"
}
}
],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-27T05:57:57.747248Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/axl-sdk/axl.svg",
"full_name": "axl-sdk/axl",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}