Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-30 06:32 UTC

outshift-open / ioc-protocols-models

PythonApache-2.0★ 4 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

outshift-open/ioc-protocols-models tiene un índice de salud de 52 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (72/100) y la más baja, Community & Adoption (23/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

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

52
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

OutshiftOrganización
12 seguidores12 repositorios públicosdesde sept 2025

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
PyPIioc-l9-all-models0.0.83803hace 12 díasiocl9protocolsai

Métricas por categoría

Vitalidad

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

72Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
6.9/36Cadencia de commits — 10/52 semanas con commits
18/18Volumen de commits — 178 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_year178
human_commit_share1
days_since_last_push0
active_weeks_last_year10
Cómo se puntúa
16.2/27Publica versiones — 4 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 12 días
27/27Cadencia de publicación — una versión cada ~7,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count4
latest_release_tagv0.0.8
releases_from_tags
days_since_latest_release12
mean_days_between_releases7,3
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?

23Crítico · 18% del índice global
Cómo se puntúa
7.7/60Estrellas — 4 estrellas
0/25Forks — 0 forks
0/15Observadores — 2 observadores
Datos de entrada utilizados
forks0
stars4
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
0/22.5README
22.5/22.5Licencia — licencia reconocida (Apache-2.0)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readmeno
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
34.4/80Descargas mensuales — 380 descargas/mes en pypi
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesioc-l9-all-models
dependents
ecosystemspypi
total_downloads
monthly_downloads380
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

54Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
10.2/22.5Distribución de commits — el principal contribuyente firma el 55% de los commits
13.5/13.5Amplitud de contribuyentes — 11 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled11
top_contributor_share0,548
Cómo se puntúa
5.8/46.8Resolución de issues — 12% de issues cerradas
33.8/38.3Aceptación de PR — 30/34 PR decididos fusionados
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Datos de entrada utilizados
merged_prs30
open_issues7
closed_issues1
issue_closed_ratio0,125
closed_unmerged_prs4
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
8/25Alcance del propietario — 12 seguidores de outshift-open
9.8/25Trayectoria — 12 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers12
owner_typeOrganization
is_verified
owner_loginoutshift-open
public_repos12
account_age_days315
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 12 días
12/20Historial de versiones — 3 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesioc-l9-all-models
ecosystemspypi
any_deprecatedno
min_days_since_publish12

Calidad de Ingeniería

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

45En riesgo · 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
20/20OpenSSF Scorecard: CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

10Crítico
Cómo se puntúa
0/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
0/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readmeno
has_docs_dirno
has_descriptionno

Seguridad

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

62Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
4.5/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.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 — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5,3
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages85
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de pypi:ioc-l9-all-models@0.0.8 —lo que arrastra la instalación del paquete publicado—: 85 paquetes. No se analiza la alcanzabilidad.

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.

50Moderado · 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 — 95 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,95
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
0/11Verificación estática de tipos
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 85 de los últimos 100 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
lockfilespoetry.lock
has_dockerfileno
typed_languageno
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,85
toolchain_manifestsSSTP/language_bindings/golang/go.mod, SSTP/subprotocol/sab/language_bindings/golang/go.mod, tests/language_bindings/golang/go.mod
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
52.5/55Tamaños de archivo manejables — 5/111 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes115.681
source_files_sampled111
oversized_source_files5
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

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

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Más detalle

OpenSSF Scorecard 5.3 / 10
5.3agregado

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-30 06:31 UTC

10Binary-Artifactsno binaries found in the repo
6Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests4 out of 4 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update 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
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
Dependencias directas 7
RegistroPaqueteRestricción de versiónManifiesto
PyPIpydantic>=2.0pyproject.toml
PyPIjson-schema-for-humans>=0.47.0pyproject.toml
PyPIlitellm>=1.89.3pyproject.toml
PyPIurllib3>=2.7.0pyproject.toml
PyPIlanggraph>=1.1.4pyproject.toml
PyPIpython-dotenv>=1.0.0,<2.0pyproject.toml
PyPIa2a-sdk^1.1.0pyproject.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

Avisos de dependencias 0

Instalar pypi:ioc-l9-all-models@0.0.8 arrastra 85 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 3538,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 39421,
        "Shell": 77295,
        "Python": 1073029,
        "Makefile": 12553
      },
      "pushed_at": "2026-07-29T14:15:04Z",
      "created_at": "2026-06-24T20:25:07Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-29T14:21:54Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "https://outshift.cisco.com",
      "name": "Outshift",
      "type": "Organization",
      "login": "outshift-open",
      "company": null,
      "location": null,
      "followers": 12,
      "avatar_url": "https://avatars.githubusercontent.com/u/232867219?v=4",
      "created_at": "2025-09-17T16:23:15Z",
      "is_verified": null,
      "public_repos": 12,
      "account_age_days": 315
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.0.8",
          "kind": "patch",
          "published_at": "2026-07-17T18:59:46Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2026-06-30T21:52:52Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2026-06-25T23:15:12Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2026-06-25T19:42:17Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "d4f9e64be40f9f3fbe72a1e5bbe2fd01c1cf8d27",
          "body": "docs: L9 formal spec + full documentation suite audit and fixes",
          "is_bot": false,
          "headline": "Merge pull request #43 from outshift-open/pbosch-local",
          "author_name": "Peter Bosch",
          "author_login": "pb10006",
          "committed_at": "2026-07-29T14:15:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b818a23cee8b408edcb42faa25d46e34cc93a6a",
          "body": "Resolves modify/delete conflicts on three SKILLS.md placeholder files\nthat were inadvertently removed in the doc rename sweep.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: merge main — restore tfp skills placeholder stubs",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-29T06:52:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c690c6c18b5516101d2b52aab49c7c64a7de01d8",
          "body": null,
          "is_bot": false,
          "headline": "Add SAB and TFP subprotocol skills (#31)",
          "author_name": "Shridhar Saurin Shah",
          "author_login": "Shridhar-2205",
          "committed_at": "2026-07-28T19:44:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "361be1e3e74ad8408f1de7532236e64dcd9a8af8",
          "body": "Accidentally removed during section-numbered file renames in 9cda9e3.\nRequired by the Python wheel build (poetry reads it as readme).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): restore PACKAGE.md deleted in doc rename commit",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T16:29:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "16dc3767201a271f89d6d9b7ca6d8e8a272f24d3",
          "body": "Adds a new §Message Flows section to 11-l9-formal.md with grammar-line\nannotations (intent → exchange* → commit style) and per-step tables for:\nsession open, taskwork prior declaration, SIEP task panel, CIP repair cycle,\nand the full TP→TW→T lifecycle summary.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(formal): add message flows section with annotated grammar tables",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T16:13:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d932615da374b2722312fe932013b345445ef3d2",
          "body": "… API, code bugs\n\nDocs fixed:\n- 05-subprotocols: phase threshold table (TP=forced_accept, TW=0.15, T=0.10);\n  snp-convergence fields (profile/operation/participant_ids/mpc/gar/scr/episode_id);\n  deliberation_pass operation label → accept + deferred_to non-null\n- 11-l9-formal: version 0.0.6→0.1; prop\n[…]\nix key path header[\"context\"][\"kind\"] → header[\"kind\"]\n  (kind lives at header root; context.kind never exists — branch was permanently dead)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs+code): third-pass audit — phase thresholds, wire format, ToM…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T14:23:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e45c13bdea9afc8eed7aa40cfc47b65c5094ae91",
          "body": "Fix API signatures across all docs to match actual code:\n- pivot_fn: counter_list/accept_list are position dicts, not agent ID strings\n- commit_fn: returns tuple[dict, str] | None, not dict | None\n- repair_fn: 9 keyword args (controller_id, member_id, concept_id, task_goal,\n  proposal_msg_id, assess\n[…]\n- both structural and LLM failure paths now set grounding_failure: True in\n  result dict so _run_cip_repair in negotiation.py fires correctly\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: second-pass audit fixes — API signatures, defaults, layout, bug",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T13:24:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "323ded2304195f753e053223eb4b03e16caaa184",
          "body": "Wire isolation fixes:\n- specialists.py: _taskwork_assessment private attr removed; TW accept path\n  now carries full assessment fields (rationale, supporting_evidence,\n  likely_cause, posterior) on the wire so orchestrator reads only from\n  tw_result.specialist_positions\n- orchestration.py: all_posi\n[…]\nemory → team-memory throughout\n- TFP/SAB no-reference-implementation warnings added\n- 13-l9-getting-started-legacy.md deprecated notice added\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): enforce wire isolation + correct all subprotocol docs",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T12:51:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "009bcb9cfa58f9c1eabb6eb3006585b88d2ba118",
          "body": "…per manuals\n\nCIP, SIEP, SAB, and TFP spec files rewritten as verbose developer manuals with:\n- Developer-facing rationale for each design decision\n- Full annotated JSON wire examples for every protocol scenario\n- Field-by-field payload reference tables\n- Formal protocol flows with invariants\n- Inte\n[…]\nm 7-line tables to\nsub-protocol introductions with purpose summary, key concepts,\nepisode grammar, and ordered where-to-start reading guides.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(subprotocols): expand all four sub-protocol specs to full develo…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T11:56:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da0d60ab0c7b088565c1cdeb3d077749131f6769",
          "body": "…nd 05-subprotocols\n\n00-readme.md: add Sub-protocols section with linked table (CIP/SIEP/SAB/TFP),\n  anchor links in Key Concepts glossary row.\n\n05-subprotocols.md:\n- CIP: add full payload structure (utterance/grounding/belief sub-blocks with\n  all fields), revision_cause table, step-by-step repair \n[…]\nidate/selection/commit flow, tfp payload type\n  table, discovery model comparison, greedy set-cover algorithm, relationship\n  to TP/CIP/SIEP.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(documentation): link + expand all four sub-protocols in readme a…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T10:47:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "41a30376c84e7dd89ef2440d0665b48f4a64982d",
          "body": "Every document in SSTP/documentation/ rewritten from field-listing stubs to\nverbose developer manuals explaining the why, invariants, failure modes, and\nhow receivers use each construct. Covers all 11 files not already expanded:\n\n- 00-readme.md: index with concept map, reading paths, key-terms table\n[…]\nng install, typed construction, schema validation\n- 15-l9-a2a.md: CF architecture, CEResponse contract, skill plugin interface, module layout\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(documentation): expand all SSTP docs to full developer manuals",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T10:41:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "573e21bc5b1eb2c5b47bc8173b9eb36df9da920b",
          "body": "…urce\n\nEvery header field, kind/subkind value, participant/actor field, message\nfield, context sub-block (topic, epistemic, semantic), policy field,\nattributes field, and all 13 payload types (utterance, siep, cip,\ncip-repair, snp-convergence, belief, winning-position, individual-\npositions, case_co\n[…]\nhow receivers use them.\nSourced from l9_schema.json, builder.py, emit functions, negotiation.py\ncommit assembly, and cip/siep payload models.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(l9): expand 03-l9-message-structure with per-field prose from so…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T10:08:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b3e83f1c0c7eb30846672279c5d00947750c1863",
          "body": "All three phases use SIEP + CIP (StarNegotiator from siep.src.negotiation\nwith CIP gating every exchange). TFP and SAB are not used by hcpanel.\n\n- Phase 1 (Team Process): SIEP panel_name=\"team_process\", not TFP\n- Phase 2 (Taskwork): SIEP panel_name=\"taskwork\" + CIP, not CIP-only\n- Phase 3 (Task): SI\n[…]\nrotocol=SIEP not subprotocol=CIP\n- Add explanation of why taskwork accept_threshold is 0.05 (collect\n  independent priors, not converge them)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs): correct sub-protocol assignments in getting-started",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T09:56:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e4ed722bd08a178b2484141bc022c8283b36dcf3",
          "body": "…quality metrics\n\nFull rewrite of 02-getting-started.md:\n- Verbose intro explaining why HCPanel is the reference application and what\n  each of the four sub-protocols (TFP, CIP, SAB, SIEP) contributes per phase\n- Per-phase walkthrough: TFP role assignment + CIP gating in TP, CIP-only\n  prior declara\n[…]\noutput schema\n- Wire trace rendering instructions with links to pre-rendered traces\n- Expanded Next Steps with one-line descriptions per link\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(getting-started): major expansion with sub-protocol details and …",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T09:51:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9cda9e3c29f6fca61a807c216867246a41dd44db",
          "body": "- Rename all .md files with section-number prefixes (00-readme.md through\n  15-l9-a2a.md in SSTP/documentation/; 01-* in all subprotocol/skill dirs;\n  root README → 00-readme.md through LICENSE → 06-license.md)\n- Add 00-readme.md index files to every directory that contains docs\n- Write 7 new SSTP/d\n[…]\nols,\n  rich documentation table, verbose quick-start and sessions/episodes example\n  with per-line commentary covering CIP/SIEP/SAB/TFP roles\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: section-numbered file renames, new core docs, expanded 00-readme",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-28T09:48:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5e1251588d3d5dc1e8a45c14ba017ad1b069417d",
          "body": "feat(hcpanel): local model offload, TP/TW split, commit_fn + app-layer callback hooks",
          "is_bot": false,
          "headline": "Merge pull request #42 from outshift-open/pbosch-local",
          "author_name": "Peter Bosch",
          "author_login": "pb10006",
          "committed_at": "2026-07-27T15:14:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e455f6addae38744ce49e960abf6756c6b0aba92",
          "body": "- case_context now on both TW and T panel intents (removed taskwork-only\n  guard in StarNegotiator; added case_context to RingNegotiator intent)\n- case_context on outer session:close commit:converged via _emit_episode_close\n- case_context dict expanded to full PatientProfile (locality, medication_al\n[…]\nrender_trace.py: case_context rendered inline (not collapsed), belief and\n  snp-convergence also rendered inline on commit:converged messages\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(siep): full case_context coverage on all wire boundaries",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-27T13:22:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "65d7009679b3ba5875f5b9f2c6992fb1ef9c1d2b",
          "body": "Add case_context param to L9.open_task(), L9.run_task(), and\nTaskSession.run_task() so the T-phase StarNegotiator receives the patient\ncase and emits case_context on the T commit:converged wire message.\n\nWire is now self-contained for both TW and T phases.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(siep): thread case_context through T-phase run_task",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-27T10:36:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "daf37347b72efae504d7cb81346174ceae6863ab",
          "body": "…essages\n\nAdd {prior, likelihood, posterior} belief triplet and case_context payload\npart to commit:converged (Star + Ring negotiators) and knowledge messages.\nbelief is team-level: prior = mean of initial_priors, posterior = mpc,\nlikelihood = posterior / prior. case_context carries the full patient case\non TW and T knowledge announcements, absent on TP.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(siep): belief + case_context on commit:converged and knowledge m…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-27T10:11:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "545b4c4945267a4a4a21506965da9ec752f44ffd",
          "body": "…messages\n\nCarry the full patient case over the L9 wire in a case_context payload\npart on the taskwork panel intent (symptoms, health_history, meds,\nchat_history). Specialists reconstruct PatientProfile from wire data\nrather than in-process app state, fixing health_history always-empty.\n\nAdd structu\n[…]\n every SIEP\nexchange message (propose + specialist response). likelihood = posterior\n/ prior, enabling per-exchange Bayesian update tracking.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(siep): case_context on wire + Bayesian belief block on exchange …",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-27T09:08:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8df6732acb67f0d4d859138ee89976522186b2e0",
          "body": "Thread on_intent_hook/on_debate_round_hook/on_commit_hook through\nHCPanelSystem → SpecialistAgent; commit_fn through HCPanelSystem →\nDebateOrchestrator → session.run_task. All hooks are optional and\nnull-safe. run1pt.py wires simple CB_LOG logging functions to every\nslot to verify end-to-end firing.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hcpanel): app-layer callback hooks on all three callback slots",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-25T10:10:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "17b6e9ac7f351b2acda5e3b83795fbc0868a7ab1",
          "body": "Move commit_fn (controller) and on_commit (specialist) invocation into\nStarNegotiator.run() before the commit:converged message is appended to\nthe wire, matching the pivot_fn pattern. Return value from the callback\nshapes winning_position/resolution_label in the emitted envelope.\n\n- NegotiationConte\n[…]\n to l9.handle();\n  _on_commit_converged wired via l9.on_commit()\n- run1pt.py: single-patient local+remote run script (pt-1008, qwen2.5+Haiku)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(siep): commit_fn/on_commit fired before commit:converged wire emit",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-24T15:26:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2663ffd8599ad8cb6a0c646b4c42dad95becc913",
          "body": "Run team_process once as a standalone L9 session (phases=[\"team_process\"]);\nreuse the frozen TeamProcessResult across N patient taskwork+task sessions.\nTP wire trace captured before bus reset and included as tp_trace in the result\nJSON. Renderer opens with a full TP section before patient episodes.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hcpanel): TP/TW split — separate sessions, TP wire trace in output",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-23T16:39:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6d63215e679f6987769b87472d5d64f3f75904f4",
          "body": "…ordering\n\nSession-open handshake:\n- Remove forged wire_received receipts emitted by controller on behalf of\n  participants in open_session() — these were fake, specialists had not yet\n  received anything\n- Suppress emit_wire_received in deliver.py for intent and received: messages,\n  eliminating th\n[…]\n\n  now inherit the preceding wire message timestamp rather than sorting to end;\n  this keeps them in wire-append order in the rendered output\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(siep): proper session-open handshake, ToM prediction loop, trace …",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-23T12:16:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a716366f54f21563c2974e6460cd89aa7b71f0b9",
          "body": "Add _to_float() helper in specialists.py that maps 'high'/'medium'/'low'\nto float and falls back to a default rather than raising ValueError.\nReplace all bare float(result.get(...)) call sites with _to_float().\n\nAlso fix build_llm_client('local') to pass model=None when constructing\nthe inner fronti\n[…]\n10 (Tier 1/2), anthropic=41 (Tier 3), 0 routing violations.\n  gar=0.80, mpc=0.668, resolution=stale_majority — matches pure-anthropic output.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): tolerate word-valued confidence fields from local models",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-21T16:18:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba0f0b19566b4df9e9068d773e76ebdb2f2f4f64",
          "body": "Add OllamaHealthcareLLMClient (OpenAI-compat, targets localhost:11434/v1),\nTaskRoutingLLMClient (dispatches by task tier), and _LOCAL_TASKS frozenset\n(tom_belief_seed, tom_peer_predict, tom_belief_update, diagnostics_assessment,\nteam_prior_reasoning, team_prior_commit, insurance_coverage_review).\n\nb\n[…]\nenv vars).\ndrain_trace() on TaskRoutingLLMClient merges both inner buffers so llm_trace\nbackend field shows 'ollama' vs 'anthropic' per call.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hcpanel): local model offload for hot-path ToM tasks via Ollama",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-21T15:45:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "22b4eb6f97b571961ca4ebc8cd4456288e407ba9",
          "body": "fix(siep/hcpanel): genuine GAR/SCR metrics + counter-proposal position extraction",
          "is_bot": false,
          "headline": "Merge pull request #25 from outshift-open/pbosch-hcpanel-merge",
          "author_name": "Peter Bosch",
          "author_login": "pb10006",
          "committed_at": "2026-07-21T14:14:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81f80a8f6c572deedf347a018fbec70ce6f9cbe8",
          "body": "Replace per-agent phase-filtered queue with a unified timestamp-sorted\ntimeline so every LLM call (tp_case_frame, tp_debate_accept_or_counter,\ntp_process_commit, diagnostics_assessment, debate_pivot_synthesis, etc.)\nappears at its natural chronological position alongside wire messages.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hcpanel): interleave LLM calls by timestamp in trace renderer",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-21T11:59:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3894cd150388100492f6d6e7d05b20cafad6a049",
          "body": "Signed-off-by: Mohamed Elidrisi <melidris@cisco.com>",
          "is_bot": false,
          "headline": "finish the L9 to Base move",
          "author_name": "Mohamed Elidrisi",
          "author_login": "melidriscisco",
          "committed_at": "2026-07-21T06:12:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "044aa35ee942e40a3aa2bfbaba0ed567408e4df7",
          "body": "Signed-off-by: Mohamed Elidrisi <melidris@cisco.com>",
          "is_bot": false,
          "headline": "moving SSTP/l9 to SSTP/base",
          "author_name": "Mohamed Elidrisi",
          "author_login": "melidriscisco",
          "committed_at": "2026-07-21T06:07:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2457c883b3a95c238fa8ace97f5ae9d7eab57d6d",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into pbosch-hcpanel-merge",
          "author_name": "Mohamed Elidrisi",
          "author_login": "melidriscisco",
          "committed_at": "2026-07-21T05:54:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df98a46a1b4fff07d3b1e5dbdf3361cdd283cfcc",
          "body": "Knowledge payload now shows a collapsible value_detail block in the\nrendered trace, exposing supporting evidence, role assignments, and\nreasoning summaries that were previously invisible.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hcpanel): render value_detail in knowledge trace blocks",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-20T16:13:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0f89725ea911226baa204393f483aa1a5a90a5ed",
          "body": "- negotiation.py: star negotiator panel-broadcast kind=commit:converged-knowledge\n  (was kind=knowledge) — only session.announce_knowledge() writes to team-memory\n- orchestration.py: always apply specialist diagnostics_assessment confidence\n  as T-phase starting position, not shared TW prior (was collapsing GAR to 0)\n- llm_backends.py: add call-level logging for network hang diagnosis\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): GAR=0 + duplicate knowledge messages",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-20T13:35:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec0f5acdc0bb791f6c48c59c2f0624b0b379279e",
          "body": "…phases\n\nRemove automatic knowledge announcement from L9 infrastructure layer. All\nthree phases (TP, TW, T) now have auto-announce removed; orchestration.py\nexplicitly calls session.announce_knowledge() after each phase with full\napplication-assembled content (concept_id URN, value, value_detail).\n\n\n[…]\ns.append()\n- stores.py: TeamGroundedTruth gains clinical_context field\n- main.py: remove _write_knowledge_to_tem loop from _node_coordination\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hcpanel): application-controlled knowledge announcement for all …",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-20T09:03:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b6b4dc251e0f4facefc75cc5fda976154a7040f2",
          "body": "Signed-off-by: akanjosh <akanjosh@cisco.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.0.8 (#36)",
          "author_name": "akanksha276",
          "author_login": "akanksha276",
          "committed_at": "2026-07-17T18:59:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5203966912f4daa7358d0909ef89ad94a0d83b75",
          "body": "… (schema 0.1.1) (#34)\n\n* feat(sab): add issues/options_per_issue to Negotiate + Commit semantic contexts\n\nSigned-off-by: akanjosh <akanjosh@cisco.com>\n\n* feat(sab): add round_messages to negotiate payload; bump schema+binding to 0.1.1\n\nSigned-off-by: akanjosh <akanjosh@cisco.com>\n\n* docs(sab): rege\n[…]\nm>\n\n* refactor(sab): keep options_memory_blob on NegotiateSemanticContext only (drop from commit)\n\nSigned-off-by: akanjosh <akanjosh@cisco.com>\n\n---------\n\nSigned-off-by: akanjosh <akanjosh@cisco.com>",
          "is_bot": false,
          "headline": "feat(sab): canonical payload fields — issues/options + round_messages…",
          "author_name": "akanksha276",
          "author_login": "akanksha276",
          "committed_at": "2026-07-17T18:52:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a9239c13cfd5400bf9537dc8618a2e7838501608",
          "body": "* Adding common drfit_detection\n\nSigned-off-by: Mohamed Elidrisi <melidris@cisco.com>\n\n* feat: Drift Detection output schema (rename + flesh out)\n\nRename drift_dectection.py → drift_detection.py and replace the\nplaceholder with the real source-of-truth output schema:\n\n  * SeverityLevel enum (low / m\n[…]\no-authored-by: Mohamed Elidrisi <melidris@cisco.com>\nCo-authored-by: cathewan <cathewan@cisco.com>\nCo-authored-by: Claude Opus 4.7 <noreply@anthropic.com>\nCo-authored-by: akanjosh <akanjosh@cisco.com>",
          "is_bot": false,
          "headline": "Feat/drift data model (#17)",
          "author_name": "cathewan1",
          "author_login": "cathewan1",
          "committed_at": "2026-07-16T21:55:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a996368839df7d50cae810d71ae9b69b86c12eb",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main' into pbosch-hcpanel-merge",
          "author_name": "melidriscisco",
          "author_login": "melidriscisco",
          "committed_at": "2026-07-16T18:12:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "534f9da2cabe9d19a60ea7d18a8580d2e9ca1cf4",
          "body": "…change Protocol (#35)\n\nSigned-off-by: Mohamed Elidrisi <melidris@cisco.com>",
          "is_bot": false,
          "headline": "Adding and Updting SIEP to the correct format Semantic Information Ex…",
          "author_name": "melidriscisco",
          "author_login": "melidriscisco",
          "committed_at": "2026-07-16T17:37:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "974b24a1527a0485cc87a776b95b88b3ab96840d",
          "body": "_T_STRIP was removing reasoning_summary and other fields that carry\nspecialist rationale into the T-phase debate. Strip only team_process\n(raw patient data embedded for TW); role/panel/etc. are already excluded\nat the siep-ctx wire boundary by _POS_KEYS in negotiation.py.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): strip only team_process from positions, not all metadata",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-16T17:04:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca3ff0a7d9464bad33d633fefb3aa4dcda23d480",
          "body": "getattr(round_ep, \"turn\", 0) always returned 0 because DebateRoundEpisode\nhad no turn property — the field lives on DebateRoundContext (_ctx).\nAdded turn @property that delegates to _ctx.turn, and simplified the\nround_idx call to round_ep.turn + 1.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(siep): expose turn property on DebateRoundEpisode",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-16T16:46:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad465eae63d26202087cd565b847bdc9d75684ed",
          "body": "turn from siep-ctx is 0-based (round_idx from negotiation loop).\nConvert to 1-based before passing as round= to the LLM call so that\nthe instruction \"in round >= 2, be specific\" activates correctly.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): correct round number passed to debate_accept_or_counter",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-16T15:56:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "abbc5441060c3b3985100cc32791dbd3ead74948",
          "body": "_POS_KEYS was stripping team_process from TW ctrl_pos, breaking patient\ninjection in _tw_accept_or_counter (_session.patient stayed None, so\ndiagnostics_assessment never fired and all specialists accepted at seed).\n\nteam_process and concept_id are needed in TW; they are already stripped\nfrom T-phase\n[…]\norchestration.py.\n\nValidated: diagnostics_assessment fires (10 calls), GAR=1.00 SCR=0.00,\nT-phase 7.3 min (7× faster than 53.4 min baseline).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(siep): restore team_process + concept_id in siep-ctx wire filter",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-16T14:50:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "41aa67d4717c1c961e325328cd6a48092fc63ec9",
          "body": "Two cuts:\n- Build compact case_summary from TW output at TW close; attach to\n  controller position so T-phase specialists get patient context as a\n  single string (~80 tokens) instead of raw patient data embedded in\n  ctrl_pos.team_process.\n- Strip ctrl_pos/member_pos in siep-ctx wire payload to ess\n[…]\nst round-trip.\n- Remove session_objective and prior_argument_history from\n  debate_accept_or_counter payload; stop spreading tom_ctx blindly.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(hcpanel): reduce T-phase specialist call context ~60%",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-16T13:12:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a21cf792d1a8c791dbbd0c0357f08fd21c919056",
          "body": "…ssages\n\nTerminology cleanup: all internal references to \"SNP\" in builder.py,\npanel.py, epistemic stores, vocabulary, and local_replica now say \"SIEP\".\nAdds subprotocol=\"SIEP\" field to emit_wire_received trace entries.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(siep): rename SNP→SIEP in comments, docstrings, and error me…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-16T13:00:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7e14323fc7466895536615a6732dc6b3ae349c10",
          "body": "Replace the hard round ceiling in StarNegotiator with a dynamic loop:\n- max_rounds: minimum rounds always run (default 2)\n- max_extra_rounds: additional rounds allowed while debate is shifting (default 3, hard ceiling 5 total)\n- Extra rounds only fire if the pivot produced genuine movement: position\n[…]\nide SessionAbortedError\n- orchestration.py passes max_extra_rounds=3 and catches DebateTimeoutError as a system error with structured logging\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(siep): dynamic max_rounds + DebateTimeoutError",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-16T11:35:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "92518dd04acc7c49b4aa63d11bc6c606c815136b",
          "body": "…pecialist output\n\ndebate_pivot_synthesis was receiving the full specialist position dict for all 10\ncountering agents (~6250 tokens), causing empty HTTP 200 responses from the Bedrock\ncross-region proxy on large-TTFT calls.\n\nTwo changes:\n1. _pivot_fn trims each counter to {agent_id, likely_cause, c\n[…]\nt_synthesis instruction updated to match trimmed payload shape\n   and constrains its own output to 2-3 sentence rationale + 4 evidence items.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): shrink debate_pivot_synthesis payload 82% + constrain s…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-16T08:52:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46f747db7484f51a48e3f663ce08342f90291e05",
          "body": "…ic fallback\n\ndebate_pivot_synthesis is the only call that aggregates all 10 specialist\npositions (~5600 tokens) into one request.  Bedrock cross-region routing\nreturns empty HTTP 200 bodies under load when token generation starts late,\nwhich causes JSONDecodeError on every attempt.  The previous 3-\n[…]\nback_response_for_task now registers debate_pivot_synthesis fallback\n- Both AnthropicHealthcareLLMClient and AzureHealthcareLLMClient updated\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): retry debate_pivot_synthesis with backoff + determinist…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-16T08:35:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5e2ddf3d59eebc42ebabb9b4fd7721fefeaa266",
          "body": "…s_params\n\n- Extract responsible_for from tp_case_frame; add role_assignments to\n  current_team_process so each specialist sees their concept ownership\n  during the TP governance debate\n- Replace _tp_commit_fn no-op: write process_params per-specialist with\n  case-specific role_assignment, session_o\n[…]\nfn\n\nBefore: tp_process_commit=0 calls, role_assignment=[] everywhere\nAfter:  tp_process_commit=10, role_assignment=case-specific concept list\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(app): wire tp_case_frame responsible_for into TP debate + proces…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-15T15:55:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87ef2373a9ffd061beee9f03e6cb838ea8ac5cd5",
          "body": "Two bugs caused tp_debate_accept_or_counter to never fire:\n\n1. negotiation.py reused the panel-open intent header as the per-round\n   propose header for TP panels. The intent kind caused the specialist\n   bus handler to route to dispatch_intent instead of dispatch_propose,\n   so the SIEP round conte\n[…]\nds, but TP episode IDs are\n   urn:ioc:healthcare:panel:team_process:... — the substring \":tp\" is\n   absent. Changed to \"team_process\" in eid.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tp): wire TP specialist debate rounds through LLM",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-15T14:30:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cd5c0ff8fc8d44e1ffb4e703eb1200b88c23add6",
          "body": "…nvergence records\n\nnegotiation.py writes full TeamGroundedTruth (individual_priors/posteriors) into\nconvergence_store at panel close. Milliseconds later, the knowledge wire message\nfires _handle_knowledge, which rebuilt a bare skeleton with empty dicts and\ncalled convergence_store.record() — overwr\n[…]\ny.json.\n\nFix: skip the skeleton write if convergence_store already holds a non-empty\nentry for the same concept_id, regardless of episode_id.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): prevent _handle_knowledge from clobbering negotiation co…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-15T09:56:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "04116f1abec157d413bd458a67246b61d33b8a94",
          "body": "Specialists who accepted during TW kept the empty seed position\n(rationale empty, supporting_evidence empty, confidence=0.5). That\nseed became member_pos in the T-phase debate_accept_or_counter prompt\nso the LLM saw no clinical rationale for ~7/10 agents.\n\nStore _taskwork_assessment on the agent aft\n[…]\npporting_evidence and likely_cause into T phase.\nAlso reset _taskwork_assessment in reset_session() to avoid bleed across\nmulti-patient runs.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): carry taskwork assessment into T-phase member_pos",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-15T08:05:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bbae12a187ecbb2929808a5b597b4ca8f579296c",
          "body": "…sition\n\nTwo bugs caused the opinion table and convergence_store to be meaningless:\n\n1. On accept, position = ctrl_pos (a shared dict). Every accepting specialist\n   was overwritten with the controller's position verbatim, losing their own\n   supporting_evidence, reasoning_summary, and likely_cause \n[…]\n actual posterior. The convergence_store\nindividual_posteriors will reflect per-agent beliefs rather than the\nuniform winning-position value.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): specialist opinions show own beliefs, not controller po…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-15T07:37:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2faa79728817b4cdac70e80aaf6b39b91b4403b4",
          "body": "…fallbacks\n\nThree bugs in task_accept_or_counter caused all round-2 counter-proposals\nto silently use default 0.5 confidence:\n\n1. Task name mismatch: called complete_json(\"task_accept_or_counter\") but\n   the instruction table only has \"debate_accept_or_counter\" — LLM received\n   \"Return valid strict\n[…]\n5 (genuine posterior estimates)\n  SCR: 0.10  → 0.00–0.10   (fewer rubber-stamps)\n  GAR: 0.30  → 0.20–0.50   (broader genuine belief movement)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): fix MPC stuck at 0.5 — correct task name and posterior …",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-14T21:19:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "88c698abae2e09d010406c0477b7561bce1e0e3f",
          "body": "Merged position dicts from proposal_payload carry posterior not confidence;\nthe %.4f format on None crashed the logger. Read both fields.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): read posterior as confidence fallback in panel_open log",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-14T16:12:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "87b3abdc0b4d1861b893604c6e0b586a66a034e1",
          "body": "proposal_payload carries posterior/evidence but no likely_cause; the concept\nkey is in siep.content (a string). Merge them into a single dict so\n_position_key and _confidence both work without the caller having to know\nwhich format the model used. Fixes None controller_position crash when TW\nwinning position had no likely_cause field.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(siep): merge siep.content key into proposal_payload position dict",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-14T15:54:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "67711048470045893c77dcc8acc21973797e71f1",
          "body": "…sition extraction\n\nSonnet (and other models) return counter-proposal positions in siep.proposal_payload\nwith only a posterior field, not confidence. Two bugs caused these to be silently\ndiscarded:\n\n- resp_pos_raw fell through to member_pos when content_detail/content were not dicts\n- _confidence() \n[…]\nior), so GAR=0 and SCR=0 even when all 10 specialists genuinely counter-proposed\nwith divergent diagnoses at 0.62-0.72. Both reads now fixed.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(siep): read proposal_payload and posterior in counter-proposal po…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-14T15:33:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ced32c7dbf21a8a0aa49004a9166988ec16b1617",
          "body": "…-only GAR/SCR\n\n- CONTINGENCY_THRESHOLD 0.5 to 0.4: reduces false-positive grounding failures\n- _position_utterance includes rationale + evidence for better token-overlap signal\n- Accept responses skip verify_grounding_bilateral (structurally contingent by definition)\n- GAR/SCR over specialist member_ids only, excluding controller (bypass site 1)\n\nResult (Haiku): CIP repairs 9 to 6, total messages 220 to 202.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(siep): lower CIP threshold, skip grounding on accepts, specialist…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-14T15:06:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "be63bf7b836faa5aea2d6ece02cc9a8c5d5690fc",
          "body": "…cycle\n\n- Add SessionPlan dataclass, SessionAbortedError, PlanAdherenceError to L9 API\n- open_session() emits session:open intent with plan payload + per-participant ACKs\n- L9Session.run_task() emits session:close commit on bare session URN after task converges\n- Drop redundant outer _emit_intent fr\n[…]\nsuffixes\n- Trace renderer: phase detection driven purely by utterance content + panel URN segment;\n  no false-triggers on inner panel intents\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(l9): SessionPlan wire protocol + correct session open/close life…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-14T13:53:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10c97230ad058561ce6b2c0385e6fc7f018e5160",
          "body": "…hases\n\nverify_grounding_bilateral now returns the assessment dict so callers can\nact on grounding_failure.  StarNegotiator._run_cip_repair emits the full\nCIP wire sequence (contingency → epistemic_clarification → reaffirm →\ncommit:resolved) whenever a specialist response fails grounding — covering\n\n[…]\nectly for\nthe same reason (controller has no grounding-turn handler).\n\nAlso: render_trace.py now surfaces rationale and LLM reasoning inline.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(siep): wire CIP contingency repair into StarNegotiator for all p…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-14T07:14:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8c6c15a5f3a067af1b0ed8caea4bc3705ba4fc6d",
          "body": "SNP labels all outer-session messages (TP/TW/T phase frames, ready signals,\nknowledge announcements, rule_update, and wire-received ACKs).  CIP and SIEP\nare untouched — they remain the correct labels for bilateral grounding turns\nand inner panel debate exchanges respectively.\n\nAlso: add subprotocol \n[…]\nlt without going through build_l9_header directly; fix render_trace.py\nphase preambles to show correct protocol hierarchy (SNP → SIEP → CIP).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(l9): set subprotocol=SNP on all session-envelope emitters",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-14T06:19:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4757419cb48aa09166418943101d0dd3effbbac4",
          "body": "Registers grounding_judge in SimulatedHealthcareLLMClient (structural\ncontingency + semantic token-overlap blend), AzureOpenAIHealthcareLLMClient,\nand AnthropicHealthcareLLMClient _instruction_for_task dicts.\n\nThe combined grounding_judge call (added to cognition.py assess_utterance\nhas_concepts path) now reaches a fully instructed backend instead of\nfalling through to an empty instruction.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hcpanel): add grounding_judge task to all LLM backends",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-13T21:08:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "29b7906efd0a112b0475d39fbd22e9d43f4b424b",
          "body": "GAR: replace tautological formula (always True at conf=0.5) with\nabs(final - initial) > 0.05 — genuinely engaged = belief actually moved.\n\nSCR: replace hardcoded 0.0 with fraction of agents who accepted without\nupdating their belief (rubber-stamped).\n\nassess_utterance has_concepts path: replace stru\n[…]\n returns\nalignment, ambiguity, and derailment in one completion. Structural score\nis a lower bound — LLM can only tighten it, not inflate it.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(siep): genuine GAR/SCR metrics + combined grounding_judge LLM call",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-13T18:23:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d0948c78bb30a7d65d34a89dcb1629c94991fb1d",
          "body": "- Add L9Session wrapper class + L9.open_session() enforcing TP→TW→T ordering\n- Fix :tw routing bug: use 'taskwork' in eid instead of ':tw' in _on_debate_round\n- Emit outer intent on open_taskwork and open_task (previously missing)\n- Fix StarNegotiator: deliver intent via network.send() not bare mess\n[…]\ntor orchestration.py to use L9Session throughout\n- Fix render_trace.py: partition outer envelope only (:tp/:tw/:t), inner SIEP panel excluded\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hcpanel): L9Session, outer episode intents, wire protocol fixes",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-13T16:49:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "32c1cce8ba933677358ce7f9a6ede088bb41ce1e",
          "body": "RLock (reentrant) guards send(), _next_msg_id(), and _deliver() as one\natomic operation — covers the message counter race, append/deliver\nordering, and _protocol_context flag used by _lifecycle_emit.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): make MessageBus thread-safe with RLock",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-13T08:00:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "081255ceae89e50361f68c3288d7274ea202cb7c",
          "body": "It guarded l9/emit.py all along — now it lives there.\nExported via l9/__init__.py.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(l9): move ProtocolViolation from hcpanel into l9/emit",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-13T07:52:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e6377f949d8b1c2afb3d18864d216a7cdde132ca",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(hcpanel): delete unused get_cip_repair helper",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-13T07:50:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "27858dcf417f4582e8629a9d1fb7a417537649b4",
          "body": "- agent_bus.py: drop AgentBus and HCPanelAgentBus aliases, shrink __all__\n- tem.py: import MessageBus directly instead of AgentBus alias\n- episode.py: import NetworkHandle directly, drop `as AgentBus` rename\n- emit.py: update stale HCPanelAgentBus comment\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: remove all backward-compat aliases across the stack",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-13T07:46:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "88fe685c996deb64d565a064303527ff52fa8333",
          "body": "HCPanelAgentBus only hardcoded use_case/sensitivity defaults and added\ntaskwork_episode_id — all now params on MessageBus.__init__.  The subclass\nis gone; HCPanelAgentBus kept as a compat alias.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(hcpanel): collapse HCPanelAgentBus into MessageBus",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-13T07:44:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d98517c5f821b09efe69d3edb8ab4b8f4cffa9fd",
          "body": "…ode layer\n\nMessageBus is now vocabulary-free — its only job is hold self.messages,\nimplement NetworkHandle (register_handler/get_handler/send), and delegate\ndelivery to l9/deliver.py.  All L9 header construction and grounding logic\nlives in the episode layer:\n\n  l9/emit.py      — 20 emit_* free fun\n[…]\nom l9/emit, l9/deliver, or l9/grounding directly.\n\nAlso adds abstract send() to NetworkHandle and exposes the new modules\nvia l9/__init__.py.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(l9): move all L9 emit vocabulary out of MessageBus into epis…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-11T08:16:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c63f8c520575aeb9df8085ca66c32fdf66d95a4e",
          "body": "…t→unresolved (#32)\n\nSigned-off-by: akanjosh <akanjosh@cisco.com>",
          "is_bot": false,
          "headline": "refactor(sab): rename commit subkinds converged→resolved, disagreemen…",
          "author_name": "akanksha276",
          "author_login": "akanksha276",
          "committed_at": "2026-07-10T18:59:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "775a0fdcdd94de0b4f2074a5aff123df420facb8",
          "body": "Each per-agent decision (TP accept/counter, task accept/counter, taskwork\nassessment) is now owned by the agent's own L9 dispatch path via on_intent,\non_debate_round, and on_taskwork hooks. The orchestrator retains only\ncoordinator-side logic: _tp_pivot_fn, _tp_commit_fn, and _pivot_fn.\n\nKey changes\n[…]\nremove accept_or_counter_fn/assess_fn params from all episode types\n- panel_bus.py: deleted — replaced by siep/panel.py + siep/negotiation.py\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(hcpanel): per-agent L9 dispatch — remove orchestrator closures",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-10T15:01:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eff7c81625493a25b564750ef957bb6d8cd3e15b",
          "body": "…quired (v0.0.6) (#29)\n\n* move python base classes\n\n* update docs\n\n* clean up todos",
          "is_bot": false,
          "headline": "refactor: Move L9 classes to dedicated module + make message field re…",
          "author_name": "shanchunyang0919",
          "author_login": "shanchunyang0919",
          "committed_at": "2026-07-09T18:51:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "136092a6c5d92adb0d909d5942289a9b6d109059",
          "body": "… (#28)\n\n* refactor(sab): drop SABHeader, build on the canonical L9 envelope\n\nSAB now follows the SIEP/CIP/TFP pattern: it defines payload-only models and\nreuses the canonical L9Header instead of redeclaring the envelope.\n\n- Add src/sab_models.py (self-contained payload.data models + NegMAS SAO\n  sn\n[…]\n-off-by: akanjosh <akanjosh@cisco.com>\n\n* docs(sab): trim retrospective SABHeader-removal wording\n\nSigned-off-by: akanjosh <akanjosh@cisco.com>\n\n---------\n\nSigned-off-by: akanjosh <akanjosh@cisco.com>",
          "is_bot": false,
          "headline": "refactor(sab): drop SABHeader, build SAB on the canonical L9 envelope…",
          "author_name": "akanksha276",
          "author_login": "akanksha276",
          "committed_at": "2026-07-08T20:35:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a35ce65c43fb8d206add7d118880cebacfadd3df",
          "body": "  Consolidate L9 header building: remove duplicate l9.py/l9_base.py in favor of builder.py",
          "is_bot": false,
          "headline": "Merge pull request #27 from outshift-open/pbosch-hcpanel-merge-update",
          "author_name": "Peter Bosch",
          "author_login": "pb10006",
          "committed_at": "2026-07-07T14:06:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16c9a000ec2fc3ef62cc7952cd0bac748613ceb0",
          "body": "…_base.py\n\nRemoves the second, parallel L9-header-building implementation. hcpanel's\npanel_bus.py/agent_bus.py now call build_l9_header()/build_snp_l9_header()/\nget_topic() from CIPMessageBuilder/SIEPMessageBuilder (builder.py) -- the\nsame pydantic-based builders processor.py/engine.py use in produc\n[…]\nn) import and behave unchanged, and the full regression suite\n(25/25) passes.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nSigned-off-by: Mohamed Elidrisi <melidris@cisco.com>",
          "is_bot": false,
          "headline": "refactor(hcpanel): migrate off l9.py onto builder.py, delete l9.py/l9…",
          "author_name": "Mohamed Elidrisi",
          "author_login": "melidriscisco",
          "committed_at": "2026-07-07T12:45:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5b01a1a92dbc22c8f3d8dde0686d00ae529173c",
          "body": "SSTP/l9_base.py:\n- L9HeaderBuilder is now concrete and parameterised by per-protocol lookup\n  tables (kind_by_event_type, schema_topic_by_event_type,\n  default_epistemic_by_event_type, short_ttl_event_types, aliases) supplied\n  at construction time, instead of an abstract class that each subprotocol\n[…]\nnel_bus.py/\nagent_bus.py imports, and all 25 regression tests pass unchanged.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nSigned-off-by: Mohamed Elidrisi <melidris@cisco.com>",
          "is_bot": false,
          "headline": "refactor(l9): config-driven L9HeaderBuilder, no per-protocol subclassing",
          "author_name": "Mohamed Elidrisi",
          "author_login": "melidriscisco",
          "committed_at": "2026-07-07T12:45:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a4658eaaca0dd58a7fd6eaea633f0bc5f5dc0c8",
          "body": "Delete cip_l9.py, siep_l9.py, l9_base.py, episode.py from hcpanel/ —\nthese were local copies added by PR #23; package-level modules in\nSSTP.subprotocol.cip/siep are used instead.\n\nRemove ioc-cfn-protocols-models repo name from docstrings in\ncip/src/l9.py and siep/src/l9.py.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(hcpanel): remove local l9 copies, clean ioc-cfn docstring refs",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:38:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bfba7fe80b2ad71434ecc454b1d4324fd283c16d",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hcpanel): remove healthcare_ie_snp reference from panel_bus comment",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bf02e3ad31ab2a3cd64217419e6eb1014260e406",
          "body": "…sage flow\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(L9): update L9.md with expanded intro, team process section, mes…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0e7744aed03c889e0646ecb32e9b99696f8b82d1",
          "body": "Adds 'How a message flow works' section to L9.md covering the episode\ngrammar, direct agent-to-agent flow, and CF-routed flow with annotated\nsequence diagrams. Also ignores and removes L9-old.md.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(L9): add message-flow section + gitignore L9-old.md",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8dab50826966530b7c4212e5d578d307c786b7f",
          "body": "…/ClinicalDebateOutcome\n\ntask_name rename left two kwarg mismatches: PanelBus and StarNegotiation still\nexpect panel_name=, and ClinicalDebateOutcome still has panel_episode_id.\nPass self._task_name as panel_name= at the call sites; map task_episode_id →\npanel_episode_id in the orchestrator return value.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(l9): pass panel_name/panel_episode_id to PanelBus/StarNegotiation…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "05e4f74a7a95f9c1161b0c84d20a9b659cea3549",
          "body": "…kEpisode\n\nThree episode subclasses now own all protocol mechanics internally:\n- TeamProcessEpisode.run() — proposal/accept loop + ToM per specialist\n- TaskworkEpisode.run() — belief seed + say + ToM assess + repair per participant\n- TaskEpisode.run() — full SIEP star negotiation (was PanelEpisode)\n\n[…]\node/open_panel/panel_ep renamed to TaskEpisode/open_task/task_ep throughout.\nDocumentation (L9api.md, L9getting-started.md) updated to match.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(l9): fully symmetric Episode API + rename PanelEpisode → Tas…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba403c4366b2ea727563ad72669d10159eb589cf",
          "body": "…Episode\n\nAdd TeamProcessEpisode and TaskworkEpisode as protocol-encapsulating\nsubclasses of Episode, symmetric with the existing PanelEpisode.\n\nTeamProcessEpisode.run() owns the proposal/acceptance loop and ToM\nassessment per specialist. TaskworkEpisode.run() owns belief seeding,\nexchange emission,\n[…]\nested: simulated (GAR=0.7273 SCR=0.2273 MPC=0.7049 consensus) and\nanthropic backend (GAR=0.7273 SCR=0.0000 MPC=0.7414 majority). Both exit 0.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(l9): fully symmetric episode API — TeamProcessEpisode + Taskwork…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3eaf98781b77bb52dfdb06da349fa6e46d3f15f0",
          "body": "… the package boundary\n\nAdd PanelEpisode subclass of Episode that wraps PanelBus + StarNegotiation\nentirely inside run(), so the orchestrator only sees open_panel → run → announce.\nAdd Episode._set_commit() so PanelEpisode can harvest commit metrics from the\nalready-emitted wire messages without emi\n[…]\npanel → run → announce pattern for episode C.\n\nTested with --llm-backend simulated: GAR=0.7273, SCR=0.2273, MPC=0.7049,\nresolution=consensus.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(l9+hcpanel): PanelEpisode + open_panel — SIEP negotiation inside…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d8d51e91ce2223907eb783ca8a46e5679d820b8d",
          "body": "…ng-started\n\n- Add SSTP/documentation/L9api.md — full reference for L9/Episode/blend_prior,\n  build_l9_header (CIP), build_snp_l9_header/build_snp_payload (SIEP),\n  and L9HeaderBuilder base; event_type→kind tables, all parameters documented\n- Revise L9getting-started.md: strip inline API detail, rep\n[…]\namespace)\n- Update orchestration.py: team-process and taskwork episodes now use L9/Episode\n  API instead of calling bus emit helpers directly\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(docs+api): L9api.md reference, Episode/L9 app API, revised getti…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73d85e699c10a0d8afd9184daa9291014e77cb93",
          "body": "…subject to change\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(getting-started): note that Python wheel is not yet in use, API …",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2adf5274a8db96e79c747843a4373b910f83115e",
          "body": "… note\n\nNew section covers L9HeaderBuilder, build_l9_header (CIP), build_snp_l9_header\n(SIEP), their event_type→kind mappings, code examples, and the hcpanel call\nchain from DebateOrchestrator down to the builders. Bus section gains a\nblockquote noting AgentBus/PanelBus are placeholders for the A2A/CF integration.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(getting-started): add L9 message API section and A2A placeholder…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb141e456080606aaf4eff4d121833bc120b94c2",
          "body": "…ture\n\nCovers: prerequisites, CLI flags, LLM backends, patients file, session\nflow (3 LangGraph nodes), module table, bus layer, specialist agent\nstores, ToM engine, output format, and links to all related docs.\nL9.md gains a pointer to the new file.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add L9getting-started.md — HCPanel how-to and software architec…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "940da063622c74533c9c5e8fa62d845ea15c4d97",
          "body": "…mit:converged\n\nSIEP panel:open now carries controller opening position, participant count, and\nconfidence in the utterance rationale. SIEP commit:converged interprets GAR/SCR\nmetrics in plain language. Doc examples in L9teamtasks.md updated to match.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hcpanel): add rationale + thought_summary to SIEP intent and com…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc957ee6bfb3f186e099e4838d6afde5d35b06c2",
          "body": "- agent_bus: emit_grounding_phase_converged and emit_team_process_close\n  now accept rationale/thought_summary; passed through to utterance part\n- orchestration: team process close states all roles acknowledged + gate open;\n  taskwork close states all priors on record + proceeding to debate\n- L9teamtasks.md: team process commit:converged and taskwork commit:converged\n  examples updated with rationale and thought_summary fields\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(protocol): rationale+thought_summary on all commit messages",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "345c3709ee1e01a512ce22ca46ff57b2a61c52c5",
          "body": "…nge/contingency examples to docs\n\n- agent_bus: emit_taskwork_phase_intent + emit_taskwork_open accept patient_complaint dict;\n  embeds symptoms, medications, and chat history as second type=utterance part with\n  rationale and thought_summary\n- orchestration: pass patient.symptoms/medications/chat_h\n[…]\nhange (specialist prior), SIEP exchange (counter-proposal),\n  and CIP contingency examples — all with rationale and thought_summary populated\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(taskwork): embed patient complaint in taskwork intent; add excha…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "12b6d6fc50fac467a49b67de3b8e68a86a64dc40",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(L9): cip-repair belongs to CIP subprotocol — add CIP.md ref",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ddee7233ddc2bb8dd5617921032850d0fdd589d6",
          "body": "…ip-repair\n\n- agent_bus: type=ie → type=cip; type=ie-repair → type=cip-repair; rename get_ie_repair → get_cip_repair\n- panel_bus: type=snp → type=siep (emit and read paths)\n- L9.md, L9header.md, L9-formal.md: type=process → type=team_process; message.id UUIDv5 → UUIDv4; add cip-repair payload type; fix broken link L9teamtask.md → L9teamtasks.md\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(wire): align payload type names to spec — cip/siep/team_process/c…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b178ca23f0739e91584e18355a7880ec330bb0aa",
          "body": "…ast actors\n\n- l9_base.py: version=0.0.5, participants.actors with participant_type sender/recipient,\n  context nesting (topic/epistemic/semantic under context key)\n- cip/src/l9.py: get_topic() reads from context.topic / context.epistemic.concept_id\n- siep/src/epistemic/local_replica.py: read topic \n[…]\nall 4 broadcast emit calls\n- panel_bus.py: pass recipients on SIEP intent and commit:converged\n- patients.json, traces/: add hcpanel run data\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(wire): v0.0.5 wire format — participants, context nesting, broadc…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6237bbeeebb9593d8de4fec6e2652e475bf1a292",
          "body": "Regenerated from L9-old.md formalisms against current implementation:\n- Notation, definitions (ε, π, ρ, contingency, GAR, SCR, MPC, W)\n- Message schema: v0.0.5 wire format with participants.actors, context nesting,\n  participant_type, subkind=resolved\n- CIP payload schema (ring_round + repair_depth \n[…]\nn\n- 8 well-formedness conditions covering repair closure, parent graph acyclicity,\n  prior-before-grounding ordering, actor sender uniqueness\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(l9): add L9-formal.md — updated formal protocol definitions v0.0.5",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "75e69c0d648e583ab3477cb9e00ecb2fa4bbbabb",
          "body": "L9-new.md (the new plain-English introduction) becomes the canonical L9.md.\nThe previous technical spec is preserved as L9-old.md for reference.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(l9): rename L9.md → L9-old.md; promote L9-new.md → L9.md",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bf468d29fdcaaaa35de993505d479e2392904b6a",
          "body": "…ad detail\n\n- Add episode lifecycle section covering intent→exchange→contingency→\n  commit→knowledge flow in plain English, with traceability explanation\n- Header section: protocol identity, episode linkage, participants with\n  participant_type, context block, kind/subkind — with link to L9header.md\n- Payload section: all six typed part kinds explained, links to CIP.md\n  and SIEP.md\n- Closing pointers to L9lifecycle.md and L9teamtasks.md\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(l9): expand L9-new.md — episode lifecycle section + header/paylo…",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cd9e69251d2e22910d7a3ab08527490e6495c7be",
          "body": "…L9teamtasks\n\n- L9-new.md: new plain-English introduction covering syntactic→semantic→epistemic\n  progression, MAS failure analysis tied to NeurIPS 2026 position paper, three\n  L9 phases (team process / taskwork / task execution), non-linear bounce pattern,\n  and extensible sub-protocol design ratio\n[…]\n\n- L9header.md: restore version field to \"0.0.5\" (was incorrectly reverted to 0.0.3)\n- L9teamtasks.md: updated with real pt-1008 run messages\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(l9): add L9-new.md intro; fix L9header version to 0.0.5; update …",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f89c887098c9fa9d44846e84494b31ded16bd7a9",
          "body": "- L9header.md: full header field reference, kind/subkind/subprotocol\n  tables, epistemic block values, payload part types\n- L9lifecycle.md: plain-English message kind descriptions with topic\n  and utterance content per kind, episode grammar, nested episode\n  model, and full 3-episode call flow from \n[…]\nk / task message flow with\n  annotated real wire examples from pt-1008 run\n- L9.md: updated to reflect current wire format and actor list fix\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(l9): add L9header, L9lifecycle, L9teamtasks; update L9.md",
          "author_name": "Peter Bosch (pbosch)",
          "author_login": "pb10006",
          "committed_at": "2026-07-03T09:37:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 4,
      "commits_last_year": 178,
      "latest_release_at": "2026-07-17T18:59:46Z",
      "latest_release_tag": "v0.0.8",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 10,
      "days_since_latest_release": 12,
      "mean_days_between_releases": 7.3
    },
    "community": {
      "has_readme": false,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 12,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ioc-l9-all-models",
          "exists": true,
          "license": "Apache-2.0",
          "keywords": [
            "ioc",
            "l9",
            "protocols",
            "ai",
            "License :: OSI Approved :: Apache Software License",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Topic :: Scientific/Engineering :: Artificial Intelligence"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/ioc-l9-all-models/",
          "is_deprecated": false,
          "latest_version": "0.0.8",
          "repository_url": "https://github.com/outshift-open/ioc-protocols-models",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 380,
          "first_published_at": "2026-06-25T23:22:00.346812Z",
          "latest_published_at": "2026-07-17T19:01:15.901802Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 12
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 4,
      "watchers": 2,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 8
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "SSTP/language_bindings/golang/go.mod",
        "SSTP/subprotocol/sab/language_bindings/golang/go.mod",
        "tests/language_bindings/golang/go.mod"
      ],
      "largest_source_bytes": 115681,
      "source_files_sampled": 111,
      "oversized_source_files": 5,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 85,
        "malicious_count": 0,
        "assessed_package": "pypi:ioc-l9-all-models@0.0.8",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "pydantic",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0"
        },
        {
          "name": "json-schema-for-humans",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.47.0"
        },
        {
          "name": "litellm",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.89.3"
        },
        {
          "name": "urllib3",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.7.0"
        },
        {
          "name": "langgraph",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.1.4"
        },
        {
          "name": "python-dotenv",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.0.0,<2.0"
        },
        {
          "name": "a2a-sdk",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": "^1.1.0"
        }
      ],
      "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": 1,
        "merged_prs": 30,
        "open_issues": 7,
        "closed_ratio": 0.125,
        "closed_issues": 1,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "pb10006",
          "commits": 97,
          "avatar_url": "https://avatars.githubusercontent.com/u/94856513?v=4"
        },
        {
          "type": "User",
          "login": "melidriscisco",
          "commits": 44,
          "avatar_url": "https://avatars.githubusercontent.com/u/157047312?v=4"
        },
        {
          "type": "User",
          "login": "Shridhar-2205",
          "commits": 14,
          "avatar_url": "https://avatars.githubusercontent.com/u/42818678?v=4"
        },
        {
          "type": "User",
          "login": "akanksha276",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/27768206?v=4"
        },
        {
          "type": "User",
          "login": "shanchunyang0919",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/71080192?v=4"
        },
        {
          "type": "User",
          "login": "snarasar",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/172419829?v=4"
        },
        {
          "type": "User",
          "login": "eti-sre-cicd",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/82837437?v=4"
        },
        {
          "type": "User",
          "login": "ssmails",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/43550938?v=4"
        },
        {
          "type": "User",
          "login": "panyuenlau",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/29384080?v=4"
        },
        {
          "type": "User",
          "login": "MarwaOuledElHadjAli",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/30328476?v=4"
        }
      ],
      "contributors_sampled": 11,
      "top_contributor_share": 0.548
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yaml",
        "publish.yaml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "poetry.lock"
      ],
      "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": 6,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
            "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": 10,
            "reason": "all changesets reviewed",
            "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": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 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": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 9,
            "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": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "d4f9e64be40f9f3fbe72a1e5bbe2fd01c1cf8d27",
        "ran_at": "2026-07-30T06:31:52Z",
        "aggregate_score": 5.3,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-29T14:16:58Z",
      "oldest_open_prs": [
        {
          "number": 39,
          "created_at": "2026-07-21T16:19:34Z",
          "last_comment_at": "2026-07-21T21:28:55Z",
          "last_comment_author": "shanchunyang0919"
        }
      ],
      "last_merged_pr_at": "2026-07-29T14:15:02Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 19,
          "created_at": "2026-06-30T20:01:41Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 24,
          "created_at": "2026-07-02T02:33:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 30,
          "created_at": "2026-07-09T18:21:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 33,
          "created_at": "2026-07-14T14:55:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 37,
          "created_at": "2026-07-17T22:21:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 40,
          "created_at": "2026-07-21T21:56:56Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 41,
          "created_at": "2026-07-22T00:00:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/outshift-open/ioc-protocols-models",
    "host": "github.com",
    "name": "ioc-protocols-models",
    "owner": "outshift-open"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 52,
      "inputs": {
        "security": 62,
        "vitality": 72,
        "community": 23,
        "governance": 54,
        "engineering": 45
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 72,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "commits_last_year": 178,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 10
            },
            "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": "10/52 weeks with commits",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "178 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 178
                    }
                  }
                ],
                "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": 4,
              "latest_release_tag": "v0.0.8",
              "releases_from_tags": true,
              "days_since_latest_release": 12,
              "mean_days_between_releases": 7.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "4 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 12 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~7.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 7.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 23,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "forks": 0,
              "stars": 4,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "4 stars",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "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": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": false,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "at_risk",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 43,
            "inputs": {
              "packages": [
                "ioc-l9-all-models"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 380
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "380 downloads/month across pypi",
                "points": 34.4,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 380,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 54,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 11,
              "top_contributor_share": 0.548
            },
            "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 55% of commits",
                "points": 10.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 55
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "11 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "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": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "merged_prs": 30,
              "open_issues": 7,
              "closed_issues": 1,
              "issue_closed_ratio": 0.125,
              "closed_unmerged_prs": 4
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "12% of issues closed",
                "points": 5.8,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 12
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "30/34 decided PRs merged",
                "points": 33.8,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 30,
                      "decided": 34
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "all changesets reviewed",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "followers": 12,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "outshift-open",
              "public_repos": 12,
              "account_age_days": 315
            },
            "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": "12 followers of outshift-open",
                "points": 8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 12,
                      "login": "outshift-open"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "12 public repos, account ~0 yr old",
                "points": 9.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 12
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "ioc-l9-all-models"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 12
            },
            "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 12 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 12
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "3 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "at_risk",
        "name": "Engineering Quality",
        "value": 45,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "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": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "critical",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": false,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "moderate",
        "name": "Security",
        "value": 62,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 53,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 5.3
            },
            "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 is not maximal on development and all release branches",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "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": "all changesets reviewed",
                "points": 7.5,
                "status": "met",
                "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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "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": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the pypi:ioc-l9-all-models@0.0.8 runtime dependency closure — what installing the published package pulls in — 85 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "pypi:ioc-l9-all-models@0.0.8",
                  "assessed": 85
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 85,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 85,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 5
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 50,
        "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": 0.95,
              "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": "95 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 95,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "poetry.lock"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.85,
              "toolchain_manifests": [
                "SSTP/language_bindings/golang/go.mod",
                "SSTP/subprotocol/sab/language_bindings/golang/go.mod",
                "tests/language_bindings/golang/go.mod"
              ],
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "85 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 85,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 115681,
              "source_files_sampled": 111,
              "oversized_source_files": 5
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "5/111 source files over 60KB",
                "points": 52.5,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 111,
                      "oversized": 5
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T06:32:12.445404Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/o/outshift-open/ioc-protocols-models.svg",
  "full_name": "outshift-open/ioc-protocols-models",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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.