Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-29 12:37 UTC

usestapel / stapel-agent

LLM facade for the Stapel framework: provider-swappable completions & translation, prompt ledger with token accounting

PythonMIT★ 0 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

usestapel/stapel-agent tiene un índice de salud de 51 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (68/100) y la más baja, Sustainability & Governance (34/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

51
global / 100
Moderado

Í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.

51
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

usestapelOrganización
1 seguidor31 repositorios públicosdesde jun 2026

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
PyPIstapel-agent0.7.0-21hace 0 díasdjangostapelllmanthropicopenaitranslation

Métricas por categoría

Vitalidad

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

68Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
2.8/36Cadencia de commits — 4/52 semanas con commits
14.7/18Volumen de commits — 42 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year42
human_commit_share1
days_since_last_push0
active_weeks_last_year4
Cómo se puntúa
16.2/27Publica versiones — 24 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~0,6 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count24
latest_release_tagv0.7.0
releases_from_tags
days_since_latest_release0
mean_days_between_releases0,6
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?

40En riesgo · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
18/18Guía CONTRIBUTING
13.5/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributing
has_issue_templateno
has_code_of_conduct
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?

34En 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
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
2.2/25Alcance del propietario — 1 seguidores de usestapel
11.2/25Trayectoria — 31 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers1
owner_typeOrganization
is_verified
owner_loginusestapel
public_repos31
account_age_days35
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 21 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesstapel-agent
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

66Moderado · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
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_ci
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.
Cómo se puntúa
30/30README
25/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_dir
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?

47En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
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
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,7
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, signed_releases. 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.

57Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 45 de 45 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — py.typed
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 40 de los últimos 45 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 — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configspy.typed
agent_commit_share0,889
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
27/45Código verificable por tipos — Python con configuración de verificación de tipos (py.typed)
55/55Tamaños de archivo manejables — 0/119 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes48.597
source_files_sampled119
oversized_source_files0

Datos clave

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

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:stapel-agent@0.7.0; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 4.7 / 10
4.7agregado

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-29 12:37 UTC

10Binary-Artifactsno binaries found in the repo
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
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
10Security-Policysecurity policy file detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 2
RegistroPaqueteRestricción de versiónManifiesto
PyPIstapel-core>=0.15.11,<1.0pyproject.toml
PyPIpydantic>=2,<3pyproject.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": 858,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Shell": 383,
        "Python": 914198,
        "Makefile": 809
      },
      "pushed_at": "2026-07-29T12:34:21Z",
      "created_at": "2026-07-03T21:05:54Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-29T12:34:47Z",
      "description": "LLM facade for the Stapel framework: provider-swappable completions & translation, prompt ledger with token accounting",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "usestapel",
      "company": null,
      "location": null,
      "followers": 1,
      "avatar_url": "https://avatars.githubusercontent.com/u/296323797?v=4",
      "created_at": "2026-06-23T23:51:53Z",
      "is_verified": null,
      "public_repos": 31,
      "account_age_days": 35
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-29T12:34:11Z"
        },
        {
          "tag": "v0.6.7",
          "kind": "patch",
          "published_at": "2026-07-29T11:44:17Z"
        },
        {
          "tag": "v0.6.6",
          "kind": "patch",
          "published_at": "2026-07-29T10:39:49Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-07-26T16:23:06Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-07-26T15:21:06Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-07-26T14:20:33Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-07-26T10:13:27Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-07-26T01:01:28Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-25T08:53:21Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-24T10:29:34Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-07-24T07:51:44Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-24T07:48:15Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-23T07:29:06Z"
        },
        {
          "tag": "v0.2.11",
          "kind": "patch",
          "published_at": "2026-07-21T23:49:12Z"
        },
        {
          "tag": "v0.2.10",
          "kind": "patch",
          "published_at": "2026-07-17T01:23:16Z"
        },
        {
          "tag": "v0.2.9",
          "kind": "patch",
          "published_at": "2026-07-16T22:48:00Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-07-16T12:45:33Z"
        },
        {
          "tag": "v0.2.7",
          "kind": "patch",
          "published_at": "2026-07-11T19:09:18Z"
        },
        {
          "tag": "v0.2.6",
          "kind": "patch",
          "published_at": "2026-07-09T17:46:43Z"
        },
        {
          "tag": "v0.2.4",
          "kind": "patch",
          "published_at": "2026-07-09T13:33:36Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-07-07T23:47:19Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-07-06T00:48:07Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-07-05T00:50:07Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-03T20:41:52Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "771077bc48870802a728d9184edf126666773ab0",
          "body": "Каждая цена несёт источник и дату, которой её прочитали: цена без строки\nпровенанса — это число, которое кто-то запомнил, а прайс-карты двигаются.\nНеизвестная модель даёт 0.0 с предупреждением и cost_basis=unpriced — не\nдогадку и не «бесплатно»: выдуманная стоимость не остаётся изолированной,\nона су\n[…]\nрока реестра их сохраняла. То\nесть вызывающий видел число меньше того, что в счёте, — а reasoning\nоплачивается.\n\n880 тестов зелёные.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: учёт стоимости вызова — с провенансом цен и замеренной ловушкой",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-29T12:34:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c617f7ab098ecbce0a8f5204db28a888d99ab743",
          "body": "llm.complete теперь принимает schema. Ограниченное декодирование\nсуществовало внутри процесса и заканчивалось на границе сервисов: вызывающий\nиз другого сервиса мог только вежливо попросить JSON и надеяться. Это худшее\nместо для кривого ответа — у него нет доступа к провайдеру, нет способа\nповторить\n[…]\nии и функция без контракта). Дефектом были две копии одной правды;\nпочинка — один источник и производная копия.\n\n867 тестов зелёные.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: схема через comm + контракты функций стали генерируемыми",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-29T11:44:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d4d585a19fb55c80f5ec607939fb201f2d0c865e",
          "body": "Флаг strict — это то, что превращает структурированный вывод в ограничение\nдекодера, а не в пожелание. Но эндпоинты, которые его уважают, принимают\nузкое подмножество JSON Schema, и одно из его правил: каждый объект обязан\nперечислить ВСЕ свои свойства в required. Пайдантик опускает поля с\nдефолтом \n[…]\nосле живых вызовов, упавших ровно на той\nсхеме, которую пайдантик выдаёт по умолчанию, и померено на четырёх\nсемействах провайдеров.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: strict:true уходил со схемой, которую строгий режим отвергает",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-29T10:39:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "001b93f05b3f4c23b162952d639fcd2ed00a86dc",
          "body": "Вторая волна порта. Восемь таблиц ставок приехали с diff = 0: у каждой\nзаписано, когда ставка последний раз сверялась с прайс-листом вендора, и\nкакие надбавки НЕ смоделированы. estimate_cost() возвращает None для\nнепрайсованной модели, а не выдуманный $0.00 — выдуманный ноль хуже\nчестного «не знаю»,\n[…]\nе приехала —\nим нужны реестр моделей и реестр адаптеров, которых у нас ещё нет.\nОтмечено в ведомости построчно.\n\n816 тестов зелёные.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: прайсинг провайдеров Игоря + pydantic-модель как схема",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-26T16:23:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "88e77891bb3f856dfe4b5084ad48cb76f62790f5",
          "body": "…айтово\n\nПервая волна порта лаборатории. Девять модулей приехали с diff = 0 к\nисходнику: восемь валидаторов сырых ответов провайдеров (assemblyai,\ndeepgram, elevenlabs, gladia, soniox, speechmatics, xai_stt, pyannote) и\nдетектор инъекционных маркеров. Вместе с ними приехали 22 его теста.\n\nПочему поб\n[…]\nr в чужом деплое. Теперь это проверяется тестом в обе\nстороны — и на забытый пакет, и на призрак от удалённого.\n\n796 тестов зелёные.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: провайдерская валидация и safety-маркеры Игоря — перенесены поб…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-26T15:21:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e29a00043c1f53a266efac6c855b3b49849a150c",
          "body": "Igor's harness declares provider-response validation and LLM-authored\ncontracts as pydantic v2 models with extra=forbid plus field and model\nvalidators. That behaviour is the contract: an unknown field must fail\nloudly rather than be dropped. Re-expressing those models as dataclasses\nor DRF serializ\n[…]\n in and the models travel verbatim.\n\nLanded before the port itself so the modules arriving next do not each\nhave to touch this file.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "deps: pydantic — the ported contracts ARE their validators",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-26T15:05:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e86a0eb027c8edd3bd04bdc2d2f805694c76c4ee",
          "body": "…call\n\nPorted from the iron-benchmark harness, where the prompt-only path was\nmeasured failing in production (2026-07-03): asked for JSON in prose, a\nmodel returned valid JSON whose single `summary` field held the whole\nanswer as pseudo-XML while every structured field came back empty. It\nparsed. It\n[…]\nhe flag from a schema-capable parent turned\nthe guard into a TypeError until the subclass declared its own answer.\n\n772 tests green.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(providers): constrain the decoder to a JSON schema, or fail the …",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-26T14:20:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e97349cea1ccc79164a29c2d04f7f460feb16a1",
          "body": "check_providers доказывал, что DEFAULT_PROVIDER РЕЗОЛВИТСЯ, но не\nспрашивал, может ли он обслужить вызов. На стенде ironmemo дефолт был\n'anthropic' с ПУСТЫМ ключом и без бинаря claude: проверки зелёные, а\nкаждый llm.summarize падал — незаметно, потому что единственный\nпотребитель во флоте (шаг сумма\n[…]\nлать ни одного текстового вызова. Блокировать их — та же ложная\nтревога, что предупреждать о пире, с которым никто не разговаривает.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: stapel-agent 0.6.2 — зарегистрирован ≠ работоспособен (W009)",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-26T10:13:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68b7b8feb99eedb7ed164b16d126d245ec1361b4",
          "body": "`llm.embed` rejected the one field its only real caller sends. When vector\nsearch was switched on for app.ironmemo.com, stapel-recordings started\nputting `model` into the embed payload — and `EMBED_SCHEMA` declared\n`texts`/`provider`/`timeout_seconds`/`provider_options` with\n`additionalProperties: f\n[…]\n minor: a newly accepted optional field, a route addition and an\nimport-order fix — no existing caller or adapter changes behaviour.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix the two bugs that made every embed call and every deploy fail",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-26T01:01:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "efaf041508d4b93de52c35d15d8f52733f8c3b51",
          "body": "…ssemblyAI biasing coverage\n\nAdds `pyannote-cloud`, the billed api.pyannote.ai job API, next to the\nself-hosted `pyannote-http` shim: media/input → presigned PUT (skipped\nwhen the AudioRef already has an http(s) URL) → diarize (the billing\nevent) → job poll, normalized through the same turns contrac\n[…]\nect keep sending.\n\nVerified: full suite green (12 new cloud-adapter tests on mocked\nrequests, 4 new AAI coverage tests), ruff clean.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: stapel-agent 0.6.0 — pyannoteAI cloud diarization + honest A…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-25T08:53:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68ae2a6c79bfbe2f00e6ac3ae2db04288e265881",
          "body": "RerankProvider ABC + NormalizedRerank (index into input docs, score-desc,\ndocs never round-trip, dup/out-of-range index fatal); deepinfra-rerank\nadapter (paired-arrays inference API — LIVE-VERIFIED against\nQwen/Qwen3-Reranker-8B: правильный док 0.995, кросс-язычный 0.647, борщ\nотсечён top_n) + reran\n[…]\n the subpackage; the verb lives at\nservices.rerank (PEP-562 shadowing dodge, documented).\n\n724 tests (+89), ruff clean, wheel contents verified.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: stapel-agent 0.5.0 — generic rerank seam (llm.rerank)",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-24T10:29:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18820f97d311717144a9c36140e2fe6cb2837f0e",
          "body": "… were missing from the explicit packages list\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: 0.4.1 — fix wheel packaging: diarization/embeddings packages…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-24T07:51:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3445120fbcdc3308d5e6b5b408655d767a356d84",
          "body": "…rize / llm.embed)\n\nDiarizationProvider ABC + pyannote self-host HTTP adapter (speaker-count\nvalidation before the call, inverted-segment clamping, malformed-success\nfails loud — invariants ported from iron-benchmark a23d532; cloud job\nmachinery deliberately not ported). EmbeddingProvider ABC + open\n[…]\nP\nsurfaces, W-checks, PromptLog rows that never carry texts/vectors\n(privacy tested).\n\n635 tests green (+113), ruff clean, migration-lint clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: stapel-agent 0.4.0 — diarization + embeddings seams (llm.dia…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-24T07:48:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5ca4e0383e97c67e577acf64773c70334a2a7925",
          "body": "… provider adapters (deepgram/gladia/soniox/speechmatics/xai-stt)\n\nSeam: transcribe() keyterms + provider_options (caller-pin passthrough),\nsupports_keyterms capability, NormalizedTranscript.biasing counts-only\nmetadata (terms never leave the client-side block — privacy canon),\nschema/DTO/view/catal\n[…]\nm:weight rejected. Ported from the iron-benchmark\na23d532 reference pack (invariants, not harness plumbing).\n\n522 tests green (+73), ruff clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: stapel-agent 0.3.0 — generic STT vocabulary-biasing seam + 5…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-23T07:29:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bf5d7151460550e21a644445bfa7010085f9efc5",
          "body": "…em cap-widen)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: stapel-agent 0.2.11 — widen stapel-core cap to <1.0 (ecosyst…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-21T23:49:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a6f90eb8f9067e6f651abf33e1a3df101ebdd8ab",
          "body": "…-before-whitespace (studio L-1 live defects)\n\nReal haiku architect response broke both ways at once: the manifest's\ndocs/e2e markdown carried code fences inside a JSON string (non-greedy\nfence regex truncated it) and a shell-style line continuation between\nobject members. Strategy 5: greedy-fence/object/whole-text candidates,\nthen the same candidates with (?<!\\\\)\\\\(?=\\s) stripped — legitimate\nescaped backslashes survive.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "parsing: recover fenced JSON with inner ``` and repair lone backslash…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-19T02:18:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "997b2ddcae40e81081e75147789f262a08f3e50b",
          "body": "operations_total=5 (5 LLM facade APIViews, AST-counted HTTP methods).\n\nDerived mechanically from this repo's own conf.py DEFAULTS, urls.py/\nviews.py (router registrations, @action decorators, per-view HTTP\nmethod defs), README.md/MODULE.md and pyproject.toml dependencies —\nno invented capabilities. \n[…]\nnowledge index\n(stapel-studio studio_cto), which only covered 10/25+ modules because\nthe stack_index sweep only picks up docs/capabilities.json.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: author capabilities.json for the stapel-catalog sweep",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-19T02:15:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "80bda18bf63ed54cd2aaee39efbf4c246636d1c0",
          "body": "Fleet follow-up to core 0.12.0's legacy shim sweep. No source fixes\nneeded. Full suite green against core 0.12.0.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): 0.2.10 — raise stapel-core ceiling <0.12→<0.13",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-17T01:23:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e53c15efcabe11bf1b87b3949f748b54e7969968",
          "body": "… stale hardcoded tuple\n\nThe release-track step asserted the resolved stapel-core version against a\nhardcoded (0,8)/(0,10) tuple that went stale every time the pyproject pin was\nbumped, permanently failing main CI while publish stayed green. Same fix\nalready landed in stapel-auth (ae47f32): parse the declared >=X,<Y range out\nof pyproject.toml at run time and assert the resolved version falls inside it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: release-track reads core pin floor/ceil from pyproject instead of…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-16T23:25:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "05286d3ba79f98e210994d389ac1eaf2fb825c1f",
          "body": "stapel-core 0.11.2 is additive for modules; suite green as-is.",
          "is_bot": false,
          "headline": "chore: core ceiling <0.11 -> <0.12 (0.11 fleet re-pin), patch bump 0.2.9",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-16T22:48:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f13c6a5ccdbdf5cab44f9616d59814e3822b568",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: v1 canon sweep §60 — urls_v1.py + api/v1/ mount (0.2.8)",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-16T12:45:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b41f774ecea2c27bfc793339e01b2ca56961f84c",
          "body": "HEAD had advanced past the v0.2.6 tag (CONFIG.MD commit) without a\nrelease; bump patch to publish, and fix stapel-core pin to match the\npublished 0.10.0 (old >=0.8,<0.9 no longer resolves against PyPI).\n\nCo-Authored-By: Claude Sonnet <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: core pin >=0.10,<0.11 + patch bump 0.2.7",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-11T19:09:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c5923707c445cc209911cf0a7bd86a10361f34ce",
          "body": "Per-module config registry (GFM table on `## stapel-agent`): every key\nstapel-agent reads through its AppSettings namespace, with source (env|vault),\npurpose, required flag and default. assemble_scaffold aggregates this into a\nscaffolded project's root CONFIG.MD so the config-lint gate and the advisor\nconfig surface see this module's knobs.\n\nCo-Authored-By: Claude Sonnet <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(config): add CONFIG.MD registry (static-scaffold-and-config.md §2)",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-11T15:36:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b96dfa6d64b848ed6a7178378ed3e28ad6d53a4c",
          "body": "…eld to patch by studio <0.3 floor)\n\nSemver-strictly a MINOR (new comm verb + new ABC surface), held to a PATCH\nby studio's stapel-agent<0.3 floor. Safe: all changes additive and\nbackward-compatible (speech_model defaults None, built-ins unchanged when\nunpinned, llm.stt_catalog is a new verb). A dedicated 0.3.0 + studio floor\nbump is deferred until a change that warrants breaking the floor.\n\nCo-Authored-By: Claude Opus <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: release 0.2.6 — STT model pin + stt_catalog (additive; minor h…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-09T17:46:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "334d98722d3aea0516263e9af4bb615d92a641c1",
          "body": "…erb (G7)\n\nG6 — SttProvider.speech_model class-attr pins a model per registration\n(the STT mirror of fixing a model on an LLM registration): it overrides\nthe provider's configured default (WHISPER_MODEL / ELEVENLABS_STT_MODEL /\nASSEMBLYAI_MODEL); None keeps the settings-driven behaviour. New\neffecti\n[…]\n no commitment).\n\nTests: +17 (base pin matrix, per-adapter pin overrides, catalog service +\nverb + schema). Suite 445 green; new code 100% covered.\n\nCo-Authored-By: Claude Opus <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(stt): per-registration speech_model pin (G6) + llm.stt_catalog v…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-09T17:46:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c18441206bd35d68b47b9c5ed04d10d6c4cfa38c",
          "body": "…ive)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: release 0.2.5 — per-call max_tokens cap on llm.complete (addit…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-09T13:46:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8313ee8fa7793d6c997646e1e8bc9b932c1edf82",
          "body": "A single global MAX_TOKENS (default 4096) is the wrong shape for\nmulti-role callers: long structured outputs (file manifests, review\nfindings with inline repro tests) get truncated mid-file at\nstop_reason=max_tokens and fail to parse downstream, while a global bump\noverpays every small call.\n\n- COMP\n[…]\n stays on its default.\n- Text-keyed prompt cache does not key on the cap (documented; the\n  default policy caches translate only).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(comm): optional per-call max_tokens cap on llm.complete",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-09T13:45:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d0d16977d8d906690cc38e6084a072b69bea924e",
          "body": "…ive)",
          "is_bot": false,
          "headline": "chore: release 0.2.4 — role tag on llm.complete payload schema (addit…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-09T13:33:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "154e2d3e62af07080d28b3235da64ae5c301c726",
          "body": "…er tag\n\nMulti-role pipelines tag every llm.complete call with the calling role\n(override/scripted providers are content-addressed by it; observability\nsplits usage by it). COMPLETE_SCHEMA's additionalProperties:false refused\nany tagged payload the moment comm schema validation was on — callers hit\n\n[…]\n/functions/llm.complete.json), must be a string, and is\nignored by the default completion pipeline (never forwarded to providers).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(comm): llm.complete schema admits an optional opaque `role` call…",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-09T13:32:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ce9d78f75762c0283b4ff9c0e07b0e28e0972de7",
          "body": "Adds `make migration-lint` (stapel_tools.migration_lint . --strict) and a\nCI step next to Lint/Import check. The CI step ships commented-out with a\nTODO: no module repo's CI installs stapel-tools yet (not on PyPI under the\nnew org, no git-install mechanism wired anywhere) — same gap as every other\ns\n[…]\ndule, so this repo has zero migrations findings today. Run\n`make migration-lint` locally / at release-cut time until CI can fetch\nstapel-tools.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: wire migration-lint gate (release-management.md §3)",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-09T11:32:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c17187ce4666f2a151c88bee691c91a83b22b0fd",
          "body": null,
          "is_bot": false,
          "headline": "docs: add PyPI badge to README",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-08T14:29:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5c5a4a4b73498751806e90df189c6295c850fa4",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): 0.2.3",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-07T23:47:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "675eb27f6ab0847b0220b5bd13be9453ef5ea62b",
          "body": "No behavior change.",
          "is_bot": false,
          "headline": "docs: reword internal provenance comments for consistency",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-07T23:24:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9defb12aac9a3187623fd34f36bd065c03abcd47",
          "body": "Admin-suite AS-5 sweep: PromptLog is a delivery/audit-log ledger (the\ndoc's own NotificationLog shape) written exclusively by the services.py\ncompletion pipeline, so it is decorated @access.ops and PromptLogAdmin\nnow subclasses stapel_core.django.admin.base.StapelModelAdmin instead of\nthree hand-rol\n[…]\nrrides. No @access.secret model\nexists here — every LLM/STT/image-gen API key is read lazily from\nsettings and never persisted to a model field.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(access): AS-5 admin category rollout — PromptLog is @access.ops",
          "author_name": "Victor Pasenchuk",
          "author_login": "Pasenchuk",
          "committed_at": "2026-07-06T11:43:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "430d41aa199488eaed1558aaa729912b10d9937c",
          "body": "…lease-track (§7.5-7.6)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): editable test install + publish gated on tests + blocking re…",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-06T02:14:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b78e7825f324c480560066699294fc42f6281ec5",
          "body": "Add uniform Renovate config: weekly schedule, minor/patch updates\ngrouped into a single PR, stapel-* pins excluded from automation\n(release wave stays manual per library-standard §7), vulnerability\nalerts run outside the schedule.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: renovate convention (SEC-8)",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-06T01:17:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0f731bc6faac05fcba89a669869ea4fbc924652b",
          "body": "Repin onto the published stapel-core 0.8.0 per library-standard §7:\n- one minor window >=0.8,<0.9 (§7.1; floor 0.8.0 is on PyPI — no pin into the void)\n- add the release-track CI job (§7.4): installs as an end user (pip install .,\n  deps from PyPI by pin, no git-main core / no editable siblings), as\n[…]\n import smoke. Advisory until the whole graph is on\n  PyPI; then it becomes the blocking vX.Y.Z release gate.\n- patch bump to 0.2.2 + CHANGELOG.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): pin stapel-core >=0.8,<0.9 + CI release-track (v0.2.2)",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-06T00:48:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b51e1dc06a81eb54eec9a1c5b42cc53d2bc88ea9",
          "body": "Tests subpackage dropped from the wheel/sdist packages list; added\n[project.urls], completed trove classifiers (MIT/OSI, Python 3.13,\nTyping::Typed, OS Independent, 3::Only, Development Status) and a\n[tool.ruff] lint section shared with the git hooks/CI.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "packaging: tests out of wheel, complete metadata (0.2.0 -> 0.2.1)",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-05T20:39:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0a40674dee747fc35c032850eacb8ed0c0cf78c",
          "body": "Cover .ruff_cache/, .mypy_cache/, coverage.xml, junit.xml and .DS_Store\n(align with the stapel-tools library template). No code change.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: extend .gitignore with cache/artifact/editor hygiene",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-05T20:04:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fd2c84f379c4bf8b913d3f719973ab13d2056880",
          "body": "…minimum:1 (0.2.0)\n\nDefensive correctness fixes from internal code-review (review-agent-multimodal).\n\n- Cache key (breaking, minor bump): CachePolicy.lookup/store gain keyword-only\n  provider/model/model_size — a \"small\" answer no longer satisfies a \"large\"\n  request, an explicit provider no longer \n[…]\nTP-only).\n- MODULE.md: cache-key semantics, timeout semantics, image-size-limit design note.\n\nTests: 420 passed (406 base + 14 new); ruff clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: cache key by provider/model, STT unknown-name fallback, timeout …",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-05T19:09:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cd37fe0833ec11986edb647887d97f9977c4e5d4",
          "body": "…additive)\n\nllm.transcribe / llm.summarize / vision in llm.complete / llm.generate_image\n+ STT and Image provider registries. Backward-compatible (existing complete/\ntranslate unchanged; images param optional; supports_images guard keeps old\nproviders working) -> patch bump. 406 tests, cold-start verified. Queued for\nFable re-review (docs/fable-review-queue.md).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: release 0.1.1 — transcription, summarization, image surfaces (…",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-05T00:50:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3fc13b6bc2085abd93feae166892586e5a22e3ff",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: image surfaces — vision input in llm.complete, llm.generate_image",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-04T04:06:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4fc3724da0e7c0972934694db8bac67015d7b260",
          "body": "…summarize)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: transcription and summarization surfaces (llm.transcribe / llm.…",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-04T03:40:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f9c6116b2853eeba52ae5d20a17656614c37e5de",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: open provider registry, cache-policy seam, system checks",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-03T20:41:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bfcec4e00f0dc6e60e964d98ab21f750e6a53f78",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: initial Python port of iron-agent LLM facade",
          "author_name": "Victor Pasenchuk",
          "author_login": null,
          "committed_at": "2026-07-03T20:25:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 24,
      "commits_last_year": 42,
      "latest_release_at": "2026-07-29T12:34:11Z",
      "latest_release_tag": "v0.7.0",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 4,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 0.6
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 87,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "stapel-agent",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "django",
            "stapel",
            "llm",
            "anthropic",
            "openai",
            "translation",
            "Development Status :: 4 - Beta",
            "Framework :: Django",
            "Framework :: Django :: 5.2",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: MIT License",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3 :: Only",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Typing :: Typed"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/stapel-agent/",
          "is_deprecated": false,
          "latest_version": "0.7.0",
          "repository_url": "https://github.com/usestapel/stapel-agent",
          "versions_count": 21,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-07-07T23:48:50.931887Z",
          "latest_published_at": "2026-07-29T12:36:12.730328Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": 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": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "py.typed"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 48597,
      "source_files_sampled": 119,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "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": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "stapel-core",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.15.11,<1.0"
        },
        {
          "name": "pydantic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2,<3"
        }
      ],
      "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": "Pasenchuk",
          "commits": 33,
          "avatar_url": "https://avatars.githubusercontent.com/u/7511219?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 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": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 10,
            "reason": "security policy file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "771077bc48870802a728d9184edf126666773ab0",
        "ran_at": "2026-07-29T12:37:35Z",
        "aggregate_score": 4.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-29T12:36:16Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/usestapel/stapel-agent",
    "host": "github.com",
    "name": "stapel-agent",
    "owner": "usestapel"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 51,
      "inputs": {
        "security": 47,
        "vitality": 68,
        "community": 40,
        "governance": 34,
        "engineering": 66
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 68,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "commits_last_year": 42,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 4
            },
            "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": "4/52 weeks with commits",
                "points": 2.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "42 commits in the last year",
                "points": 14.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 42
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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": 24,
              "latest_release_tag": "v0.7.0",
              "releases_from_tags": true,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 0.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "24 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 13.5,
                "status": "met",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 34,
        "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": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 43,
            "inputs": {
              "followers": 1,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "usestapel",
              "public_repos": 31,
              "account_age_days": 35
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "1 followers of usestapel",
                "points": 2.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 1,
                      "login": "usestapel"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "31 public repos, account ~0 yr old",
                "points": 11.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 31
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "stapel-agent"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "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": "21 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 66,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "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": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": 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": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": 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": "at_risk",
        "name": "Security",
        "value": 47,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 47,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "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 dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "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": "moderate",
        "name": "AI Readiness",
        "value": 57,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "45 of 45 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 45,
                      "sampled": 45
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "py.typed"
              ],
              "agent_commit_share": 0.889,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": "py.typed",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "py.typed"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "40 of the last 45 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 40,
                      "sampled": 45
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 48597,
              "source_files_sampled": 119,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (py.typed)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "py.typed",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/119 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 119,
                      "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:stapel-agent@0.7.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T12:37:42.357479Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/u/usestapel/stapel-agent.svg",
  "full_name": "usestapel/stapel-agent",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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.