Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-27 05:57 UTC

axl-sdk / axl

TypeScript SDK for orchestrating Agentic Systems — concurrency, structured output, cost control, and consensus as first-class primitives.

TypeScriptApache-2.0★ 2 Sterne⑂ 0 Forksseit Feb. 2026Auf GitHub ansehen ↗

axl-sdk/axl erreicht einen Gesundheitsindex von 57 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Engineering Quality (84/100) ab, am schwächsten bei Sustainability & Governance (32/100). Zuletzt vor 6 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

57
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

57
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

axl-sdkOrganisation
0 Follower1 öffentliches Reposeit Feb. 2026

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
npm@axlsdk/axl0.20.083559vor 6 Tagenaiagentsllmtypescriptorchestrationagentic
npm@axlsdk/eval0.20.076959vor 6 Tagenaievaluationscoringagents
npm@axlsdk/studio0.20.087957vor 6 Tagenaistudiodeveloper-toolsagentsdebugging
npm@axlsdk/testing0.20.073159vor 6 Tagenaitestingmockagents

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

81Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 6 Tagen
11.8/36Commit-Rhythmus — 17/52 Wochen mit Commits
18/18Commit-Volumen — 392 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year392
human_commit_share1
days_since_last_push6
active_weeks_last_year17
Wie die Bewertung erfolgt
16.2/27Liefert Releases aus — 55 Versions-Tags (keine GitHub-Releases)
36/36Release-Aktualität — letztes Release vor 6 Tagen
27/27Release-Rhythmus — ein Release etwa alle 7,6 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count55
latest_release_tagv0.20.0
releases_from_tagsja
days_since_latest_release6
mean_days_between_releases7,6
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

45Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 2 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
18/18CONTRIBUTING-Leitfaden
13.5/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductja
has_pull_request_templatenein
Wie die Bewertung erfolgt
46.8/80Downloads pro Monat — 3.214 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packages@axlsdk/axl, @axlsdk/eval, @axlsdk/studio, @axlsdk/testing
dependents
ecosystemsnpm
total_downloads
monthly_downloads3.214
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

32Gefährdet · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
0/38.3PR-Annahme — 0/1 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
0/25Reichweite des Inhabers — 0 Follower von axl-sdk
3.1/25Kontohistorie — 1 öffentliche Repos, Kontoalter ca. 0 Jahre
Verwendete Eingangsdaten
followers0
owner_typeOrganization
is_verified
owner_loginaxl-sdk
public_repos1
account_age_days164

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 4 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 6 Tagen
20/20Versionshistorie — 59 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packages@axlsdk/axl, @axlsdk/eval, @axlsdk/studio, @axlsdk/testing
ecosystemsnpm
any_deprecatednein
min_days_since_publish6

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

84Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — eslint.config.js
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://www.npmjs.com/package/@axlsdk/axl
10/10Repository-Beschreibung
10/10Topics — 13 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsagentic, agents, ai, anthropic, gemini, llm, openai, orchestration, sdk, structured-output, tool-calling, typescript, workflows
has_wikinein
homepagehttps://www.npmjs.com/package/@axlsdk/axl
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

44Gefährdet · 16 % des Gesamtindex

Sicherheitslage

44Gefährdet
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — keine Daten
0/2.5CI-Tests — keine Daten
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 80 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4,4
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): branch_protection, ci_tests, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

72Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 100 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes5.234
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — eslint.config.js
11/11Statische Typprüfung — 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
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 70 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespnpm-lock.yaml
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configsexamples/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_share0,7
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — TypeScript (statisch typisiert)
53.9/55Handhabbare Dateigrößen — 8/389 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes188.417
source_files_sampled389
oversized_source_files8
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

2GitHub-Sterne
1Mitwirkende
392Commits, letzte 12 Monate
6Tage seit letztem Push
55Releases
1Bus-Faktor
0offene Issues
npmPaket-Ökosysteme

Warnungen zur Datenerhebung

  • 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

Weitere Details

OpenSSF Scorecard 4.4 / 10
4.4Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-27 05:57 UTC

10Binary-Artifactsno binaries found in the repo
k. A.Branch-Protectioninternal 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
k. A.CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities80 existing vulnerabilities detected
Direkte Abhängigkeiten 8
RegistryPaketVersionsvorgabeManifest
npm@axlsdk/axlworkspace:*packages/axl-eval/package.json
npm@axlsdk/axlworkspace:*packages/axl-studio/package.json
npm@hono/node-server^1.13.0packages/axl-studio/package.json
npm@hono/node-ws^1.1.0packages/axl-studio/package.json
npmhono^4.7.0packages/axl-studio/package.json
npmtsx^4.19.0packages/axl-studio/package.json
npmws^8.0.0packages/axl-studio/package.json
npm@axlsdk/axlworkspace:*packages/axl-testing/package.json
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikennpm.