Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-30 06:32 UTC

outshift-open / ioc-protocols-models

PythonApache-2.0★ 4 Sterne⑂ 0 Forksseit Juni 2026Auf GitHub ansehen ↗

outshift-open/ioc-protocols-models erreicht einen Gesundheitsindex von 52 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (72/100) ab, am schwächsten bei Community & Adoption (23/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

52
gesamt / 100
Mittel

Software-Gesundheitsindex

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

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

Bewertungsprofil

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

Eigentümerschaft

OutshiftOrganisation
12 Follower12 öffentliche Reposseit Sept. 2025

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

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
PyPIioc-l9-all-models0.0.83803vor 12 Tageniocl9protocolsai

Metriken nach Kategorie

Vitalität

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

72Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
6.9/36Commit-Rhythmus — 10/52 Wochen mit Commits
18/18Commit-Volumen — 178 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year178
human_commit_share1
days_since_last_push0
active_weeks_last_year10
Wie die Bewertung erfolgt
16.2/27Liefert Releases aus — 4 Versions-Tags (keine GitHub-Releases)
36/36Release-Aktualität — letztes Release vor 12 Tagen
27/27Release-Rhythmus — ein Release etwa alle 7,3 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count4
latest_release_tagv0.0.8
releases_from_tagsja
days_since_latest_release12
mean_days_between_releases7,3
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

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

23Kritisch · 18 % des Gesamtindex
Wie die Bewertung erfolgt
7.7/60Stars — 4 Stars
0/25Forks — 0 Forks
0/15Watcher — 2 Watcher
Verwendete Eingangsdaten
forks0
stars4
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
0/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmenein
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
34.4/80Downloads pro Monat — 380 Downloads/Monat über pypi
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesioc-l9-all-models
dependents
ecosystemspypi
total_downloads
monthly_downloads380
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

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

54Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
10.2/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 55 % der Commits
13.5/13.5Breite der Beitragenden — 11 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled11
top_contributor_share0,548
Wie die Bewertung erfolgt
5.8/46.8Issue-Lösungsquote — 12 % der Issues geschlossen
33.8/38.3PR-Annahme — 30/34 entschiedene PRs gemergt
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Verwendete Eingangsdaten
merged_prs30
open_issues7
closed_issues1
issue_closed_ratio0,125
closed_unmerged_prs4
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
8/25Reichweite des Inhabers — 12 Follower von outshift-open
9.8/25Kontohistorie — 12 öffentliche Repos, Kontoalter ca. 0 Jahre
Verwendete Eingangsdaten
followers12
owner_typeOrganization
is_verified
owner_loginoutshift-open
public_repos12
account_age_days315

Paketpflege

92Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf pypi
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 12 Tagen
12/20Versionshistorie — 3 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesioc-l9-all-models
ecosystemspypi
any_deprecatednein
min_days_since_publish12

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

45Gefährdet · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

10Kritisch
Wie die Bewertung erfolgt
0/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
0/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmenein
has_docs_dirnein
has_descriptionnein

Sicherheit

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

62Mittel · 16 % des Gesamtindex
Wie die Bewertung erfolgt
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.5Lizenz — 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 — keine Daten
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5,3
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
25/25Indirekte Abhängigkeiten ohne bekannte Advisories — keine indirekte Abhängigkeit trägt ein bekanntes Advisory
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages85
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von pypi:ioc-l9-all-models@0.0.8 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 85 Paketen. Erreichbarkeit wird nicht analysiert.

AI Readiness

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

50Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 95 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,95
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Makefile
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 85 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespoetry.lock
has_dockerfilenein
typed_languagenein
bootstrap_filesMakefile
has_devcontainernein
has_linter_confignein
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
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Python ohne Typprüfungs-Konfiguration
52.5/55Handhabbare Dateigrößen — 5/111 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes115.681
source_files_sampled111
oversized_source_files5
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

4GitHub-Sterne
11Mitwirkende
178Commits, letzte 12 Monate
0Tage seit letztem Push
4Releases
1Bus-Faktor
7offene Issues
PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

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

Weitere Details

OpenSSF Scorecard 5.3 / 10
5.3Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-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
k. A.Signed-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
Direkte Abhängigkeiten 7
RegistryPaketVersionsvorgabeManifest
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
Alle Abhängigkeiten nicht erhoben

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

Abhängigkeits-Advisories 0

Die Installation von pypi:ioc-l9-all-models@0.0.8 zieht 85 Pakete nach sich, direkt und transitiv: 0 tragen bekannte Advisories, davon 0 direkte Abhängigkeiten.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

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

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPyPI.