Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 · GoSin licencia detectada★ 1 estrella⑂ 0 forksdesde feb 2026Ver en GitHub ↗

darrenoakey/daz-agent-sdk tiene un índice de salud de 39 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (79/100) y la más baja, Community & Adoption (12/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

39
global / 100
En riesgo

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

39
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

Darren OakeyCuenta personal
10 seguidores92 repositorios públicosdesde ene 2013Inside Mind

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
PyPIdaz-agent-sdk0.2.20-19hace 0 días
Gogithub.com/darrenoakey/daz-agent-sdk/gov0.2.18-2hace 7 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

79Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
9.7/36Cadencia de commits — 14/52 semanas con commits
17.1/18Volumen de commits — 80 commits en el último año
10/10OpenSSF Scorecard: Maintained — 27 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year80
human_commit_share1
days_since_last_push0
active_weeks_last_year14
Cómo se puntúa
16.2/27Publica versiones — 3 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 7 días
27/27Cadencia de publicación — una versión cada ~0,1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count3
latest_release_tagv0.2.19
releases_from_tags
days_since_latest_release7
mean_days_between_releases0,1
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

12Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 1 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
0/22.5Licencia — no se detectó ningún archivo de licencia
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

36En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues, Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
7.5/25Alcance del propietario — 10 seguidores de darrenoakey
25/25Trayectoria — 92 repos públicos, cuenta de ~13 años
Datos de entrada utilizados
followers10
owner_typeUser
is_verified
owner_logindarrenoakey
public_repos92
account_age_days4946
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 2 paquete(s) en go, pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 19 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesdaz-agent-sdk, github.com/darrenoakey/daz-agent-sdk/go
ecosystemsgo, pypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

38En riesgo · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

50Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

21Crítico · 16% del índice global
Cómo se puntúa
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 — sin datos
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 — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Licencia — 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 — sin datos
0/5Pinned-Dependencies — sin datos
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
0/7.5Vulnerabilities — 49 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2,1
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

76Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
30.6/40Historial de commits legible — 47 de 82 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,573
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes8535
Cómo se puntúa
12.6/18Arranque con un solo comando — go/go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — src/daz_agent_sdk/py.typed
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 66 de los últimos 82 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configssrc/daz_agent_sdk/py.typed
agent_commit_share0,805
toolchain_manifestsgo/go.mod
dependency_bot_commit_share0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
27/45Código verificable por tipos — Python con configuración de verificación de tipos (src/daz_agent_sdk/py.typed)
55/55Tamaños de archivo manejables — 0/86 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes44.487
source_files_sampled86
oversized_source_files0

Datos clave

1estrellas de GitHub
1contribuidores
80commits en los últimos 12 meses
0días desde el último push
3versiones publicadas
1factor bus
0issues abiertas
Go, PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

OpenSSF Scorecard 2.1 / 10
2.1agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dCI-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
n/dDangerous-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
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
0Vulnerabilities49 existing vulnerabilities detected
Dependencias directas 13
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "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
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasPyPI, Go.