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

darrenoakey / daz-agent-sdk

Provider-agnostic Python library for AI model routing with tier-based fallback, multi-provider streaming, and unified conversation management across Claude, Gemini, Ollama, and OpenAI.

Python · GoKeine Lizenz erkannt★ 1 Stern⑂ 0 Forksseit Feb. 2026Auf GitHub ansehen ↗

darrenoakey/daz-agent-sdk erreicht einen Gesundheitsindex von 39 von 100 und liegt damit im Bereich Gefährdet. Am stärksten schneidet es bei Vitality (79/100) ab, am schwächsten bei Community & Adoption (12/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

39
gesamt / 100
Gefährdet

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.

39
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

Darren OakeyPersönliches Konto
10 Follower92 öffentliche Reposseit Jan. 2013Inside Mind

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
PyPIdaz-agent-sdk0.2.20-19vor 0 Tagen
Gogithub.com/darrenoakey/daz-agent-sdk/gov0.2.18-2vor 7 Tagen

Metriken nach Kategorie

Vitalität

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

79Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
9.7/36Commit-Rhythmus — 14/52 Wochen mit Commits
17.1/18Commit-Volumen — 80 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 27 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year80
human_commit_share1
days_since_last_push0
active_weeks_last_year14
Wie die Bewertung erfolgt
16.2/27Liefert Releases aus — 3 Versions-Tags (keine GitHub-Releases)
36/36Release-Aktualität — letztes Release vor 7 Tagen
27/27Release-Rhythmus — ein Release etwa alle 0,1 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count3
latest_release_tagv0.2.19
releases_from_tagsja
days_since_latest_release7
mean_days_between_releases0,1
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?

12Kritisch · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 1 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
0/22.5Lizenz — keine Lizenzdatei erkannt
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licensenein
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

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

36Gefä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
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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 — keine entschiedenen Pull Requests oder keine Daten
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_prs0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote, PR-Annahme. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
7.5/25Reichweite des Inhabers — 10 Follower von darrenoakey
25/25Kontohistorie — 92 öffentliche Repos, Kontoalter ca. 13 Jahre
Verwendete Eingangsdaten
followers10
owner_typeUser
is_verified
owner_logindarrenoakey
public_repos92
account_age_days4.946
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 2 Paket(e) auf go, pypi
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 19 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesdaz-agent-sdk, github.com/darrenoakey/daz-agent-sdk/go
ecosystemsgo, pypi
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

38Gefährdet · 20 % des Gesamtindex
Wie die Bewertung erfolgt
0/24CI-Workflows
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cinein
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirnein
has_descriptionja

Sicherheit

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

21Kritisch · 16 % des Gesamtindex

Sicherheitslage

21Kritisch
Wie die Bewertung erfolgt
6.8/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
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/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — keine Daten
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Lizenz — license file not detected
7.5/7.5Maintained — 27 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — keine Daten
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — keine Daten
0/7.5Vulnerabilities — 49 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2,1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. 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.

76Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
30.6/40Lesbare Commit-Historie — 47 von 82 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,573
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes8.535
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — go/go.mod (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — src/daz_agent_sdk/py.typed
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 66 der letzten 82 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — keine Daten
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configssrc/daz_agent_sdk/py.typed
agent_commit_share0,805
toolchain_manifestsgo/go.mod
dependency_bot_commit_share0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Pinned-Dependencies. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
27/45Typprüfbarer Code — Python mit Typprüfungs-Konfiguration (src/daz_agent_sdk/py.typed)
55/55Handhabbare Dateigrößen — 0/86 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes44.487
source_files_sampled86
oversized_source_files0

Eckdaten

1GitHub-Sterne
1Mitwirkende
80Commits, letzte 12 Monate
0Tage seit letztem Push
3Releases
1Bus-Faktor
0offene Issues
Go, PyPIPaket-Ö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
  • deps.dev does not index pypi:daz-agent-sdk@0.2.20; advisories assessed against the repository dependency graph instead

Weitere Details

OpenSSF Scorecard 2.1 / 10
2.1Gesamtwert

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:09 UTC

9Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
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
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
k. A.Dangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
10Maintained27 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
k. A.Pinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
k. A.Token-PermissionsNo tokens found
0Vulnerabilities49 existing vulnerabilities detected
Direkte Abhängigkeiten 13
RegistryPaketVersionsvorgabeManifest
Gogithub.com/google/uuidv1.6.0go/go.mod
Gogithub.com/openai/openai-gov1.12.0go/go.mod
Gogolang.org/x/sysv0.34.0go/go.mod
Gogoogle.golang.org/genaiv1.51.0go/go.mod
Gogopkg.in/yaml.v3v3.0.1go/go.mod
PyPIpyyaml>=6.0pyproject.toml
PyPIpydantic>=2.0pyproject.toml
PyPIaiohttp>=3.9pyproject.toml
PyPIPillow>=10.0pyproject.toml
PyPIsetproctitle>=1.3pyproject.toml
PyPIkeyring>=25.0pyproject.toml
PyPIclaude-agent-sdkpyproject.toml
PyPIarbiter-clientpyproject.toml
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": [],
      "is_fork": false,
      "size_kb": 38534,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 365384,
        "Shell": 6704,
        "Python": 369961
      },
      "pushed_at": "2026-07-27T04:14:57Z",
      "created_at": "2026-02-27T06:07:59Z",
      "owner_type": "User",
      "updated_at": "2026-07-27T04:16:01Z",
      "description": "Provider-agnostic Python library for AI model routing with tier-based fallback, multi-provider streaming, and unified conversation management across Claude, Gemini, Ollama, and OpenAI.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Python",
      "significant_languages": [
        "Python",
        "Go"
      ]
    },
    "owner": {
      "blog": "https://www.insidemind.com.au",
      "name": "Darren Oakey",
      "type": "User",
      "login": "darrenoakey",
      "company": "Inside Mind",
      "location": null,
      "followers": 10,
      "avatar_url": "https://avatars.githubusercontent.com/u/3224679?v=4",
      "created_at": "2013-01-09T10:28:38Z",
      "is_verified": null,
      "public_repos": 92,
      "account_age_days": 4946
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.19",
          "kind": "patch",
          "published_at": "2026-07-19T18:42:50Z"
        },
        {
          "tag": "v0.2.18",
          "kind": "patch",
          "published_at": "2026-07-19T18:21:55Z"
        },
        {
          "tag": "v0.2.17",
          "kind": "patch",
          "published_at": "2026-07-19T15:31:39Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e5d8d20554720da2f659b3968a7cfbcc7c52fa6f",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.2.20 for category alias release",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-27T04:14:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "60d7c08e2b6505f8c33c362036d9f0b92e299e5e",
          "body": "… aliases\n\nReplace bare model names (gemma4-26b, qwen3.6-27b, qwen3.6-35b) in SDK\ndefault tier chains with arbiter semantic categories (local-chat,\nlocal-coder, local-summariser) so the arbiter can remap the underlying\nmodel without reconfiguring every SDK caller.\n\n- Py and Go default tiers: low->lo\n[…]\nb\n- Docs updated to reflect category-based defaults\n\nPre-existing unrelated: go/capability TTS-absent test fails because a tts\nCLI is now installed at ~/bin/tts (environmental, not migration-related).",
          "is_bot": false,
          "headline": "feat: migrate default tiers and arbiter provider to semantic category…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-27T01:58:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "06901e75fe13c96decbee1d94241e41ac8765889",
          "body": null,
          "is_bot": false,
          "headline": "Make image CLI failures friendly and fail closed",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-19T18:42:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a30a45a68e33b6e4698983e43c6f5c9dcfdb8b77",
          "body": null,
          "is_bot": false,
          "headline": "Make durable Codex images uncancellable",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-19T18:21:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4da96f84efd3fd4c4d6628b3514dc78ff044375",
          "body": null,
          "is_bot": false,
          "headline": "Make still image generation durable and Codex-only",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-19T15:31:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee42956d125bb658dd8d177c73a89d789da89f47",
          "body": null,
          "is_bot": false,
          "headline": "Route image generation through loopback tunnel",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-12T06:38:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7fc279c51aeaded80fde4a0136d0182c55db7741",
          "body": null,
          "is_bot": false,
          "headline": "Document local image service routing",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-12T06:12:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36d5bf2049270a1c302fa9ba242f90052f33b476",
          "body": null,
          "is_bot": false,
          "headline": "Use loopback for local image service calls",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-12T06:11:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f65257c676b11033b407b64910d17cf9ac0da59f",
          "body": null,
          "is_bot": false,
          "headline": "Document shared image generation boundary",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-12T05:33:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fc9ef8ae80ae130c55f512fe8a1bd8fb5b3bac3",
          "body": null,
          "is_bot": false,
          "headline": "Route image generation through shared Mac mini service",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-12T05:32:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b24312cb6656ce2c48a2405d3e3366f50669e49",
          "body": "Root cause of deterministic mid-sentence truncation in long-form generation:\nno caller could influence the completion budget — agent.ask had no\nmax_tokens parameter, so every request rode the serving default (the arbiter\nworker caps completions at 4096 tokens). Reasoning models spend that budget\non \n[…]\nonse or the\nempty-content guard firing — the uncapped default would return a long one).\n\n281 passed, 5 skipped; ruff clean on all touched files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: max_tokens plumbing through ask() to all providers",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-11T08:35:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "59324a5d9b4fd8c4a7b5ba8846e7c9ce5fafc04d",
          "body": "When a reasoning model's generation is interrupted (worker killed mid-job,\ntimeout, thinking budget exhausted), the response has chain-of-thought in\n`reasoning` but an EMPTY `content`. The provider silently returned the\nreasoning as if it were the answer — observed live: a novel-generation\npipeline \n[…]\nso the chain retries/falls over;\nboth-empty stays \"\" (existing behavior). Unit tests for all three branches.\n\n280 passed, 5 skipped, ruff clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: arbiter provider must not substitute reasoning for a missing answer",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-11T04:14:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a66ab4b4e9da7de4006fe7da83c00a4b6997fed",
          "body": "…emini account drift\n\nThree independent fixes surfaced by a live novel-generation run through the\narbiter provider:\n\n1. validate_structured_json (types.py): shared schema-validation helper used\n   by both the arbiter and ollama providers, replacing their duplicated\n   inline parse blocks. Coerces tw\n[…]\nability probe,\n   same convention as every other unreachable-backend skip in the suite.\n\n277 passed, 5 skipped, ruff clean on all touched files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: structured-output robustness + retryable parse failures; codex/g…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-11T03:15:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9137a3d7b97f812f8cb44a51ef621df5680d4b46",
          "body": null,
          "is_bot": false,
          "headline": "Route image generation through mac mini service",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-07-05T23:13:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1550c2e950fe1589bdb47f88bd4b946fcf7549cc",
          "body": "… back\n\ngenerate_image() built the chain [codex, spark, nano-banana-2, mflux] and fell\nthrough to spark (flux/z-image) when codex failed — which silently degraded\noutput to lower-quality, off-style flux frames (the cause of the mid-video\nstyle seam in the image-driven-character render). Per explicit\n[…]\n flux/z-image image path) raises immediately as a\n  second line of defence. (_remove_background_spark is separate and unaffected.)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "image: permanently ban flux (spark) as an image provider — never fall…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-06-09T20:31:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c89140ff5d1eaacec84cb6cc9c52f73a46b345c",
          "body": "Follow-up to the session-dir fix, which was still heuristic: \"session id\" +\n\"newest fresh mtime\" can pick the WRONG image when codex finishes out of\norder or another codex job writes concurrently. Per-call directory isolation\nremoves the guesswork entirely.\n\nEach _generate_codex call now creates a p\n[…]\nmpletion order. The temp home is removed in a finally.\n\nFixes digest-render frames leaking into a music video (boundaries 5/9/13).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "codex image: isolate each call in a private CODEX_HOME (bulletproof)",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-06-08T08:24:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b92b45d8124cfb70dd48396eb14ed3a4aee934ce",
          "body": "The codex image collector fell back to scanning the SHARED\n~/.codex/generated_images pool (rglob ig_*.png) and taking the globally\nnewest image that passed a 2s freshness gate whenever it couldn't parse\nthis call's session id. That gate is NOT job-isolated: when two codex\nimage jobs run concurrently\n[…]\nhared pool for the global newest; raise if the session can't be\ndisambiguated. Cross-contamination is now structurally impossible.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix codex image cross-contamination under concurrent renders",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-06-08T08:12:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5409ac06ee18fc304e215292e133ebefffc2f794",
          "body": "Follow-up to dropping -m: the caller still read cfg.image.codex_model,\nwhich older deployed configs lack (AttributeError). Drop the model arg\nfrom the codex path entirely — codex uses its own config.toml default\nmodel, which is the supported one for the account.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "image(codex): stop passing model entirely (use codex config default)",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-06-04T05:20:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bb7d5d8c26653b95332572afd2e0adeaafa36b88",
          "body": "codex changed default-model availability for ChatGPT accounts; a pinned\nmodel (gpt-5.3-codex) became unsupported and broke all image gen. Use the\naccount's default model instead of pinning one.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "image(codex): drop pinned -m model, use codex default",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-06-04T02:22:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0b3e053eaecc8fa6010379099446e5906aea0691",
          "body": "…model\n\nThe codex image path hardcoded `-m gpt-5.3-codex`, which a ChatGPT-account\ncodex login rejects (\"model is not supported when using Codex with a ChatGPT\naccount\"), silently falling back to spark. Add image.codex_model (default\nunchanged) so such logins can point at a supported model (e.g. gpt-5.5).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "image(codex): make the codex exec model configurable via image.codex_…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-06-03T23:29:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0df24d2b4d0bee9d3d18af14fa77be699c83abb5",
          "body": "Boringstack (Darren-Boringstack) runs a dedicated Ollama instance hosting\nthe larger local models, notably qwen3.6:35b-a3b. Expose it as a first-class\nprovider so tier chains can target it without disturbing the localhost ollama\nprovider used by other projects. Thin OllamaProvider subclass + registry entry.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "providers: add boringstack provider (remote Ollama on 10.0.0.237)",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-06-03T23:21:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "be36cf638055a7da15b71eaf8f9075d10bb27cf4",
          "body": "Thread an optional setting_sources param through Agent.complete -> provider\n.complete -> the claude provider. An empty collection loads nothing global\n(lean/fast session); a populated list restores the full environment; None\ninherits the SDK default. Other providers accept-and-ignore the param.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "core/providers: add setting_sources to control Claude CLI config loading",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-06-01T14:47:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5b47359fde3c4b92d80f4789f29bdf0b2cad4f2c",
          "body": "Two anti-fabrication fixes to the codex image path (Python + Go):\n\n1. Freshness gate: only accept an image written AFTER this call launched.\n   The old recovery grabbed the newest image from ANY prior session as a\n   fallback, so a failed/safety-blocked call silently returned a stale\n   image as \"su\n[…]\ne still produces no image, raise rather than fabricate.\n\nTests: stale-refusal, fresh-accept, self-heal-success, all-rewrites-fail.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "image(codex): never return a stale image; self-heal safety refusals",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-06-01T09:25:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b2125ee53997166efd5c0ac01e6865df6e8c57eb",
          "body": "The Python library and Go GenerateImage already defaulted to codex, but the\nsurrounding code disagreed:\n\n- Python CLI --provider help text claimed 'default: spark'\n- Go GenerateImage doc comment claimed 'default: \"spark\"'\n- Go's default-provider test still asserted spark and FAILED (since commit\n  a\n[…]\niring a separate pre-existing\n  failing test in the same package\n\ngo vet clean; go test ./capability/ green; ruff + pyright clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "make codex the consistent default image provider across Python + Go",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-05-24T13:14:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "45c6b9fd77659ff0b4058ac9d4ce7948c563008c",
          "body": "…er never blocks the default codex provider\n\nThe top-level 'from arbiter_client import ...' executed at module load,\nso a stale arbiter_client editable-install path (left over from the T9\ndrive evacuation) raised ImportError during import of the image module\nand took down ALL image generation — incl\n[…]\ne module imports and\ncodex (default) generates successfully; explicit --provider spark still\nworks when arbiter_client is present.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(image): make arbiter_client import lazy so a broken/missing arbit…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-05-24T12:00:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73b0fea534021de4ffc7a41c6278af7ac0800421",
          "body": "- image_gen.imagegen schema accepts only `prompt` (no size params)\n- exact prompt wording needed to avoid codex refusing or shelling out\n- output recovery: --json thread.started → ~/.codex/generated_images/<id>/\n- -i FILE (repeatable) for edits\n- required codex exec flags for batch image gen\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: capture codex image gen reliability lessons in CLAUDE.md",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-05-21T21:35:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a538fe38b48f611c0706e919f54fa62b32b8b1d6",
          "body": "- Python and Go image gen now route to `codex exec` invoking the built-in\n  image_gen.imagegen tool by default, with the existing spark / nano-banana /\n  mflux providers used only as fallbacks.\n- Reliable prompt: explicit \"you DO have access\" anti-refusal language, plus\n  hard ban on the generate_im\n[…]\nP that was already staged in this tree (fallback.go,\n  registry tests, config tweaks) per the standing \"commit-everything\" policy.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make codex the default image provider; support multi-image edits",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-05-21T21:27:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7d1d1b165b08f288e131b14f56360adf6f8c5e0",
          "body": "- Add Tier.SUMMARIES (\"summaries\") to Python and Go SDK\n- Map qwen3.6-27b → TierSummaries in both Python and Go arbiter providers\n- Add gpt-oss-20b (FreeFast) and qwen3.6-35b (FreeThinking) to knownArbiterTiers\n- Extend allTiers list in Agent.Models() to include TierSummaries\n- Add Embed capability \n[…]\n Fix flaky ollama structured-output test (assert structure, not exact int)\n- Update capability count test: 6 → 7 (added Embedding)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add summaries tier (arbiter:qwen3.6-27b) for long-form text generation",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-04-25T23:03:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c319ab4708f7b301a8d499d74f70240d44758c43",
          "body": "Codex CLI 0.124.0 exposes a stable `image_generation` tool that runs\nagainst the OpenAI backend and writes PNGs to\n~/.codex/generated_images/<session_id>/ig_*.png. Wire it in as a new\nprovider (\"codex\") and promote it to the default, so image calls no\nlonger hit arbiter/z-image-turbo unless codex is unavailable.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add codex native image_generation provider, make it the default",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-04-24T11:54:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "844c457468942dd0da15f4ba45cf44ea938ed52d",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix spark image model display name — z-image-turbo is not flux-schnell",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-04-07T03:02:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "47c3f7dc806d3712da09e59b09b15e2c74ff060a",
          "body": "…icit\n\n- model without provider is now an error (a model lives on one provider)\n- explicit provider bypasses the config fallback chain entirely\n- only the specified provider is tried, config primary/fallback not touched\n\nFixes: nano-banana-2 errors when z-image-turbo+spark is requested.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Enforce provider requirement for image model, skip fallback when expl…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-04-07T00:39:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc388688900291c48587331a59f779971630aae2",
          "body": "resolveOutputPath temp files now use .jpg extension. PNG was causing\nissues with downstream consumers expecting JPEG thumbnails.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Default image output to JPEG, not PNG",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-04-03T06:51:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6e67dbd7ba0802ce284e2bec97bd91aafb6d196e",
          "body": "submitArbiterImageJob rejected HTTP 202 (Accepted), treating it as an\nerror. Arbiter returns 202 for cached completed jobs. This caused the\nspark provider to fail instantly and fall through to nano-banana-2.\n\nAlso add log.Printf logging in generateSpark and GenerateImage for\ndebugging provider chain decisions.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix: accept HTTP 202 from arbiter (cached completed jobs)",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-04-03T06:34:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eeaf865d24a4bf4a95b754aea155cda9683e24c1",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rebuild agent-sdk binary — arbiter-only image gen",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-28T12:43:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eebac4ac1bf6eac8c606d44fa920b49dc4508596",
          "body": "spark:8100 is dead. All image generation now goes through the arbiter\njob API at spark:8400, which supports model selection (z-image-turbo,\nflux-schnell) via the top-level model field.\n\nGo: generateSpark() now submits image-generate/image-edit jobs to\narbiter and polls for completion. Removed sparkB\n[…]\nhon: _generate_spark() now submits jobs to arbiter instead of\nposting directly to spark:8100. Uses same submit+poll pattern as\n_remove_background_spark.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Switch all spark image gen from spark:8100 to arbiter:8400",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-28T12:43:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06ecf35b7f57c3f6bb8d152e383d0f93d2e35535",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rebuild agent-sdk binary with all provider and image changes",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-28T11:14:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "64b266a716114e239dd15809afcf35954cfa7006",
          "body": "Both Python and Go now accept an explicit steps override:\n- Python: agent.image(steps=8) or generate_image(steps=8)\n- Go: ImageOpts{Steps: 8}\n\nWhen steps is 0/None, falls back to tier-based lookup via config\n(typically 4 for high, 2 for low).\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add steps parameter to image generation (spark/mflux)",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-28T11:10:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d6a7f3a34188c2a0eec21eedb50dff0566bf3c31",
          "body": "The Claude provider was using anthropic-sdk-go (HTTP API requiring\nANTHROPIC_API_KEY). This is wrong — the entire point of claude_agent_sdk\nis ambient subscription login via the Claude CLI.\n\nRewrote Go Claude provider to wrap the `claude` CLI subprocess, matching\nthe Python implementation:\n- Finds c\n[…]\nics/anthropic-sdk-go dependency entirely.\n\nAdded auth policy documentation to CLAUDE.md: NO API KEYS except\nNano Banana 2 image generation (Gemini API).\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Replace Claude API provider with CLI wrapper — no API key needed",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-28T11:07:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d025263ecbfec8aa340c7979f0c1a74466b519dd",
          "body": "…field\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update docs: image model selection, Go feature parity, arbiter model …",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-28T10:51:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c146ffc95057619ff03b824b2cddbaa5a968b675",
          "body": "…ma, agent opts\n\nGo image generation:\n- Spark backend (spark:8100) with model selection (z-image-turbo, flux-schnell)\n- Nano Banana 2 backend (Gemini 3.1 Flash) with aspect ratio mapping\n- Background removal via arbiter (spark:8400)\n- Image fallback chain from config\n- Image-to-image via multipart f\n[…]\nl parameter in generate_image/Agent.image\n- Spark requests use configurable model instead of hardcoded z-image-turbo\n\n241 Go tests passing (up from 184)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Go feature parity: image backends, model selection, conversation sche…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-28T10:39:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ec835fdebf92f2b2c41044a468486f509e36d64",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update CLAUDE.md: Go providers, native structured output docs",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-27T22:39:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3e341473fad68ba060c08b13b36c2202881a0bf2",
          "body": "Python:\n- Claude provider now uses native output_format/StructuredOutput tool\n  instead of file-based extraction workaround\n- Captures structured_output from both ResultMessage.structured_output\n  and StructuredOutput ToolUseBlock\n- Falls back to parsing response text if native output unavailable\n\nG\n[…]\nni provider using google.golang.org/genai (v1.51.0)\n- Add structured output (JSON schema format) to Ollama provider\n- 184 Go tests passing (up from 102)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add native structured output and Go providers for Claude, OpenAI, Gemini",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-27T22:38:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ce8c6d5ab1c484b6a597cf0abc42e0010948e76",
          "body": "- Implements sdk.Provider interface: Name, Available, ListModels, Complete, Stream\n- Static model catalog: claude-opus-4-6 (HIGH), claude-sonnet-4-6 (MEDIUM), claude-haiku-4-5-20251001 (LOW)\n- Structured output via OutputConfigParam.Format (JSONOutputFormatParam) when opts.Schema is set\n- Streaming \n[…]\n false (not error) when ANTHROPIC_API_KEY is absent\n- 16 tests: 10 unit tests always run, 6 integration tests skip when key absent\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Go-native Claude provider using anthropic-sdk-go",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-27T22:28:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bfaa663cf9ce1d63a543b514070beb2f92f5f577",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update CLAUDE.md: conversation no longer uses fallback chain",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-27T22:04:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "707f5fe86d1375fb8b71cdc436bda16644375ead",
          "body": "- Remove error message truncation in fallback (was splitting to first\n  line and capping at 200 chars, losing useful multi-line API errors)\n- Conversations now call provider directly instead of going through\n  fallback chain (conversations are tied to one provider's state)\n- Increase conversation timeout to 3600s and max_turns to 10000\n- Remove empty response guard from Claude provider (valid for tool-only turns)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix truncated error messages and simplify conversation provider path",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-27T22:03:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91488a4027f414e52018cf4a424520f7438d835f",
          "body": "Claude provider:\n- Raise AgentError on empty non-structured responses (triggers retry/fallback)\n- Set max_turns>=2 for structured output so file-write tools execute\n- Only swallow parse errors if text was already collected\n- Debug logging for skipped content blocks (ThinkingBlock etc.)\n\nOllama provi\n[…]\nrdcode model ID\n- Update fallback tests for max_retries=3 attempt counts\n- Fix cascade timing test to use NOT_AVAILABLE (no retry)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix empty response handling, structured output, and stale tests",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-27T04:43:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "28ab90374cb0182a559101a446cd6fe5d86c7ee4",
          "body": null,
          "is_bot": false,
          "headline": "Update license link to darren-static.waft.dev/license",
          "author_name": "Darren Oakey",
          "author_login": "darrenoakey",
          "committed_at": "2026-03-26T23:52:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d1fbe145131f1786a9791a298ce0a2bab4f9e91",
          "body": null,
          "is_bot": false,
          "headline": "Add license section linking to CC BY-NC 4.0",
          "author_name": "Darren Oakey",
          "author_login": "darrenoakey",
          "committed_at": "2026-03-26T01:46:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2ef6830e868dfc0b58b5c41216e9784bec3cfb5",
          "body": "Expose arbiter-based BiRefNet background removal as a standalone\nAgent method. Update CLAUDE.md with image fallback chain docs.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Agent.remove_background and update fallback docs",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-25T03:48:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "52c0ea024b9018330c29ff8ab9b9a5812cdded13",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 0.2.9",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-24T22:22:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b9695179658f4553affc4ed6433a9969f587738a",
          "body": "Refactors generate_image into _generate_one (per-provider dispatch) and\na fallback loop that tries [primary] + cfg.image.fallback on failure.\nConfig already supported image.fallback list — now it's wired up.\n\nExample config:\n  image:\n    fallback:\n      - nano-banana-2\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add configurable image provider fallback chain",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-24T22:16:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "35b1d05a90f4f537e3cfdb6c8302c0e123a817a8",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 0.2.8",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-24T21:51:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aa815d20695cc608be4a32041cfff2fe6a33d720",
          "body": "The spark image server doesn't handle --transparent server-side.\nNow submits a background-remove job to arbiter (spark:8400) which\nruns BiRefNet on the GPU instead of running it locally.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Use arbiter BiRefNet on spark for transparent background removal",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-23T23:14:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c0fafb9c289cccba25528561ed47294e24d8116d",
          "body": "The installed 0.2.6 package still defaulted to mflux for image generation,\nso spark (CUDA FLUX.1-schnell on GB10) was never being used. This deploys\nthe spark provider as default, which was already in the working tree.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Switch default image provider from mflux to spark",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-23T22:56:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0864c594fd842b37020bee360bfc9e168ae1b4d",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update CLAUDE.md with mflux lock, py.typed, and deploy docs",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-16T23:02:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3c086353e163df37308906c59eeb8ae3aa57c0b4",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 0.2.6",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-16T23:01:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "40728951a7a1a35278a56270be621f79bfaf66e1",
          "body": "- fcntl.flock exclusive lock ensures only one mflux generation at a time across all processes\n- Add PEP 561 py.typed marker so callers get type info from the package\n- Make extract_result generic (T instead of BaseModel) fixing pyright errors for callers\n- Fix claude.py import ordering (E402 ruff errors)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add system-wide mflux lock, py.typed marker, and fix type errors",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-16T23:00:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "00d10ebf2c2071942ac7ea728d63849870c9a75d",
          "body": "Python: Replace Nano Banana 2 (Gemini API) with mflux ZImageTurbo as\ndefault image provider. 3 steps for high/medium tiers. Nano Banana 2\nremains available via provider=\"nano-banana-2\".\n\nGo: Full port of daz-agent-sdk as go/ subdirectory with 102 tests.\nIncludes types, config (shared YAML), Ollama provider, registry,\nfallback engine, conversation, agent, structured output, image gen\n(via Ollama z-image-turbo), TTS/STT subprocess wrappers, and CLI.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Switch image gen to mflux Z-Image-Turbo default and add Go port",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-15T20:21:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "472b326535191999e5b37bcfd3f1af1b6ad761bf",
          "body": "Claude's agentic mode writes the JSON file but it's ephemeral — not\npersisted to the temp cwd. Updated schema_instructions to ask the AI\nto also include JSON in its response text. Made parse_json_from_llm\nsmarter: tries direct parse, then markdown fences anywhere in text,\nthen scans backwards for the last JSON object in prose.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Improve JSON extraction from prose responses",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-08T05:31:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b82f94e7f1e0d8b596593d69bc752546f6dcb28b",
          "body": "Schema handling moved from inline _build_prompt to dedicated structured.py\nmodule. Providers append file-writing instructions via schema_instructions(),\nthen extract_result() reads from file (agentic) or response text (non-agentic).\nAll 3 providers pass real structured output integration tests.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add file-based structured output extraction",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-08T01:04:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fbe509ab26b1c4fefd4662a6f37c04647c9a8720",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 0.2.4",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-02T20:23:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ce7338b35448aee11ad78d98a29f035987a0d132",
          "body": "…ht errors\n\ngenerate_image(), Agent.image(), and CLI all accept --image for passing\nan input image to Nano Banana 2 for image editing. Also fixes 9 pyright\nerrors in claude.py (private import usage, possibly unbound variables).\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add image input parameter for img2img editing and fix claude.py pyrig…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-02T20:22:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e464986f553f2ddfc094ad612cb09d57117e76f2",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add CLI provider patterns and model compatibility notes to CLAUDE.md",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T09:04:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "69dfabcbdb8b2a942f4bf9277d0011101b930b34",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 0.2.3",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T09:03:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "42bd08c1ccd4735dcf1a4b5b800c15a050b0a22f",
          "body": "Both providers now use subprocess calls to their respective CLI tools\n(codex exec --json, gemini -p -o json) instead of requiring API keys.\nAuth is handled by the CLI tools themselves (ChatGPT/Google accounts).\nRemoves google-genai dependency. Fixes all pyright warnings.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rewrite Codex and Gemini providers to use CLI tools instead of API SDKs",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T09:01:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5be1c954dd2af2ac089553af9f00e0a8f613e2b9",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update CLAUDE.md with ResultMessage handling and mflux v0.16.6 patterns",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T05:58:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f08bccf86cafb4bebe99fe33225f22b6fe1a16c9",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Bump version to 0.2.2",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T05:56:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b38f2a9b818068b814f2de75ac776cee691fe791",
          "body": "Claude provider now extracts text from ResultMessage (the definitive final\nanswer after tool use), not just AssistantMessage TextBlocks. Also updates\nmflux imports for v0.16.6 API changes and fixes pyright errors in image.py.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix empty response from agent.ask() in agentic mode and update mflux API",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T05:55:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "06dcb925987c375423768a18ad7b102747d65b20",
          "body": null,
          "is_bot": false,
          "headline": "`docs: rewrite README for clarity and improved onboarding flow`",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T05:05:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e43bed1175475299b5cb83b19eac772b33dd846",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update CLAUDE.md to reflect new image generation architecture",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T00:08:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4b051f0a087c13a0f7fcf02939fa2cad8d92a7ed",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add dist/ and build/ to gitignore",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T00:06:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "70a93955559eabb46fe21f3708a71f7ccc8dc615",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update README with PyPI install, image CLI, and new features",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-03-01T00:00:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "57ac947a4080a646635f1874a288860ecbb3e397",
          "body": "- Add ./run deploy: bump version, build, upload to PyPI, install globally\n- Fix test_missing_api_key_error to properly mock keyring\n- Version 0.2.1 published to PyPI\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add deploy command, fix test, bump to 0.2.1",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-28T23:56:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dac6aed6d72b225c3b1304a4f8aa6a13553fd678",
          "body": "…lux optional\n\n- Replace subprocess-based background removal with inline BiRefNet (ZhengPeng7/BiRefNet_HR)\n- Add provider parameter (None=Nano Banana 2, \"mflux\"=local mflux) to generate_image and Agent.image()\n- Add CLI image subcommand: daz-agent-sdk image --prompt \"...\" --width N --height N [--tra\n[…]\noml: [transparent] for torch/BiRefNet, [mflux] for local generation\n- Add google-genai and keyring to base dependencies\n- Bump version to 0.2.0\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Overhaul image generation: Nano Banana 2 default, inline BiRefNet, mf…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-28T23:52:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ccfa10c3ef942d1ff8819ae6d07a764b55734d7",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add egg-info to gitignore",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-28T22:50:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f5d4373b448001048f47790e39ae27080dfbc42b",
          "body": "Rename Python module agent_sdk → daz_agent_sdk, update all internal\nimports, config paths (~/.daz-agent-sdk), pyproject.toml package name,\nCLI entry point, and documentation references.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rename package from agent-sdk to daz-agent-sdk",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-28T22:40:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4c2de0c079da4f8e975134e78c669093e74dc607",
          "body": null,
          "is_bot": false,
          "headline": "Update project files",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-28T22:24:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "816316fd207ce009fc2c9f4e4b877d01acbf4944",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add egg-info to gitignore and remove from tracking",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-27T07:33:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "29cb17dc1f0b9f2bbae0838f7e25a49f0cba5ab4",
          "body": "…age, add mcp_servers support to conversations\n\n- Created pyproject.toml with setuptools build and editable install support\n- Added __version__ = \"0.1.0\" and install command to run script\n- Image generation now passes --transparent flag directly to generate_image instead of separate remove-background step\n- Conversation and Claude provider accept mcp_servers parameter for MCP tool integration\n- Updated image tests to cover transparent flag behavior\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add pyproject.toml for pip install, pass --transparent to generate_im…",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-27T07:33:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1378016ac5ebf7c0a79f50a8154f9fb442f78eaf",
          "body": null,
          "is_bot": false,
          "headline": "Initial commit of agent-sdk project",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-27T06:10:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff85b8af115dd02be6c1138f05b5b75eac0cab5e",
          "body": "Co-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add CLAUDE.md with project architecture and conventions",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-27T05:48:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "59f33f6fb2936a8bd839e0e4ef91d2b488cc34aa",
          "body": "Tier-based routing (HIGH/MEDIUM/LOW/FREE) across Claude, Codex, Gemini,\nand Ollama providers with automatic cascade on rate limits. Includes\nstructured output, conversations, image gen, TTS, STT, and JSONL logging.\n231 tests passing, pyright and ruff clean.\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add agent-sdk: provider-agnostic AI library with tier-based fallback",
          "author_name": "Darren Oakey",
          "author_login": null,
          "committed_at": "2026-02-27T05:47:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 3,
      "commits_last_year": 80,
      "latest_release_at": "2026-07-19T18:42:50Z",
      "latest_release_tag": "v0.2.19",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 14,
      "days_since_latest_release": 7,
      "mean_days_between_releases": 0.1
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "daz-agent-sdk",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3"
          ],
          "ecosystem": "pypi",
          "matches_repo": null,
          "registry_url": "https://pypi.org/project/daz-agent-sdk/",
          "is_deprecated": false,
          "latest_version": "0.2.20",
          "repository_url": null,
          "versions_count": 19,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-02-28T22:41:49.613011Z",
          "latest_published_at": "2026-07-27T01:59:04.877864Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "github.com/darrenoakey/daz-agent-sdk/go",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/darrenoakey/daz-agent-sdk/go",
          "is_deprecated": false,
          "latest_version": "v0.2.18",
          "repository_url": "https://github.com/darrenoakey/daz-agent-sdk",
          "versions_count": 2,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-19T18:21:55Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 7
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "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": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "src/daz_agent_sdk/py.typed"
      ],
      "toolchain_manifests": [
        "go/go.mod"
      ],
      "largest_source_bytes": 44487,
      "source_files_sampled": 86,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 8535
    },
    "dependencies": {
      "manifests": [
        "go/go.mod",
        "pyproject.toml",
        "requirements.txt"
      ],
      "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": [
        "go",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "github.com/google/uuid",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/openai/openai-go",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.12.0"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.34.0"
        },
        {
          "name": "google.golang.org/genai",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.51.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "pyyaml",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=6.0"
        },
        {
          "name": "pydantic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0"
        },
        {
          "name": "aiohttp",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=3.9"
        },
        {
          "name": "Pillow",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=10.0"
        },
        {
          "name": "setproctitle",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.3"
        },
        {
          "name": "keyring",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=25.0"
        },
        {
          "name": "claude-agent-sdk",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        },
        {
          "name": "arbiter-client",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": null
        }
      ],
      "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": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "darrenoakey",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/3224679?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 9,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "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": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "27 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": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "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": 0,
            "reason": "security policy file not 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": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "49 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "e5d8d20554720da2f659b3968a7cfbcc7c52fa6f",
        "ran_at": "2026-07-27T05:09:50Z",
        "aggregate_score": 2.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T04:14:58Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/darrenoakey/daz-agent-sdk",
    "host": "github.com",
    "name": "daz-agent-sdk",
    "owner": "darrenoakey"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 39,
      "inputs": {
        "security": 21,
        "vitality": 79,
        "community": 12,
        "governance": 36,
        "engineering": 38
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 79,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "commits_last_year": 80,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 14
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "80 commits in the last year",
                "points": 17.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 80
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "27 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": 3,
              "latest_release_tag": "v0.2.19",
              "releases_from_tags": true,
              "days_since_latest_release": 7,
              "mean_days_between_releases": 0.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.1
                    }
                  }
                ],
                "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": "critical",
        "name": "Community & Adoption",
        "value": 12,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 36,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "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": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "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": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 53,
            "inputs": {
              "followers": 10,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "darrenoakey",
              "public_repos": 92,
              "account_age_days": 4946
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "10 followers of darrenoakey",
                "points": 7.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 10,
                      "login": "darrenoakey"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "92 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 92
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "daz-agent-sdk",
                "github.com/darrenoakey/daz-agent-sdk/go"
              ],
              "ecosystems": "go, pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on go, pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "go, pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "19 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 38,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "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": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 21,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 21,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 2.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "27 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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 not detected",
                "points": 0,
                "status": "missed",
                "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": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "49 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "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": 76,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "good",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.573,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 8535
            },
            "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": "47 of 82 human commits state their intent (structured subject or explanatory body)",
                "points": 30.6,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 47,
                      "sampled": 82
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 73,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "src/daz_agent_sdk/py.typed"
              ],
              "agent_commit_share": 0.805,
              "toolchain_manifests": [
                "go/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go/go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go/go.mod"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "src/daz_agent_sdk/py.typed",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "src/daz_agent_sdk/py.typed"
                    }
                  }
                ],
                "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": "66 of the last 82 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 66,
                      "sampled": 82
                    }
                  }
                ],
                "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 44487,
              "source_files_sampled": 86,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (src/daz_agent_sdk/py.typed)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "src/daz_agent_sdk/py.typed",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/86 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 86,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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",
    "deps.dev does not index pypi:daz-agent-sdk@0.2.20; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T05:09:58.241668Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/darrenoakey/daz-agent-sdk.svg",
  "full_name": "darrenoakey/daz-agent-sdk",
  "license_state": "absent",
  "license_spdx": null
}

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 StatistikenPyPI, Go.