Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-30 06:32 UTC

outshift-open / ioc-protocols-models

PythonApache-2.0★ 4 stars⑂ 0 forkssince Jun 2026View on GitHub ↗

outshift-open/ioc-protocols-models holds a health index of 52 out of 100, placing it in the Moderate band. It scores highest on Vitality (72/100) and lowest on Community & Adoption (23/100). It was last updated today. A single contributor accounts for most of its recent work.

52
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

52
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

OutshiftOrganization
12 followers12 public repossince Sep 2025

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
PyPIioc-l9-all-models0.0.8380312 days agoiocl9protocolsai

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

72Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
6.9/36Commit cadence — 10/52 weeks with commits
18/18Commit volume — 178 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year178
human_commit_share1
days_since_last_push0
active_weeks_last_year10
How it's scored
16.2/27Ships releases — 4 version tags (no GitHub releases)
36/36Release recency — latest release 12 days ago
27/27Release cadence — a release every ~7.3 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count4
latest_release_tagv0.0.8
releases_from_tagsyes
days_since_latest_release12
mean_days_between_releases7.3
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

23Critical · 18% of overall
How it's scored
7.7/60Stars — 4 stars
0/25Forks — 0 forks
0/15Watchers — 2 watchers
Inputs used
forks0
stars4
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
0/22.5README
22.5/22.5License — recognized license (Apache-2.0)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeno
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
34.4/80Monthly downloads — 380 downloads/month across pypi
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesioc-l9-all-models
dependents
ecosystemspypi
total_downloads
monthly_downloads380
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

54Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
10.2/22.5Commit distribution — top contributor authored 55% of commits
13.5/13.5Contributor breadth — 11 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled11
top_contributor_share0.548
How it's scored
5.8/46.8Issue resolution — 12% of issues closed
33.8/38.3PR acceptance — 30/34 decided PRs merged
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Inputs used
merged_prs30
open_issues7
closed_issues1
issue_closed_ratio0.125
closed_unmerged_prs4
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
8/25Owner reach — 12 followers of outshift-open
9.8/25Track record — 12 public repos, account ~0 yr old
Inputs used
followers12
owner_typeOrganization
is_verified
owner_loginoutshift-open
public_repos12
account_age_days315
How it's scored
25/25Published & resolvable — 1 package(s) on pypi
35/35Publish recency — latest publish 12 days ago
12/20Version history — 3 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesioc-l9-all-models
ecosystemspypi
any_deprecatedno
min_days_since_publish12

Engineering Quality

Are baseline engineering and documentation practices in place?

45At risk · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
0/16Linter config
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
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

10Critical
How it's scored
0/30README
0/25Documentation directory
0/15Documentation / homepage site
0/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeno
has_docs_dirno
has_descriptionno

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

62Moderate · 16% of overall
How it's scored
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.5License — 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 — no data
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate5.3
Excluded from scoring (no data or not applicable): signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages85
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
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.

AI Readiness

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.

50Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 95 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.95
agent_instruction_files
agent_instruction_max_bytes
How it's scored
18/18One-command bootstrap — Makefile
22/22Automated tests
0/11Lint / format config
0/11Static type checking
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 85 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilespoetry.lock
has_dockerfileno
typed_languageno
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0.85
toolchain_manifestsSSTP/language_bindings/golang/go.mod, SSTP/subprotocol/sab/language_bindings/golang/go.mod, tests/language_bindings/golang/go.mod
dependency_bot_commit_share0
How it's scored
0/45Type-checkable code — Python without a type-check config
52.5/55Manageable file sizes — 5/111 source files over 60KB
Inputs used
primary_languagePython
largest_source_bytes115,681
source_files_sampled111
oversized_source_files5
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

4GitHub stars
11contributors
178commits, last 12 months
0days since last push
4releases
1bus factor
7open issues
PyPIpackage ecosystems

Data collection 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

More detail

OpenSSF Scorecard 5.3 / 10
5.3aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-30 06:31 UTC

10Binary-Artifactsno binaries found in the repo
6Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests4 out of 4 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
7Vulnerabilities3 existing vulnerabilities detected
Direct dependencies 7
RegistryPackageVersion constraintManifest
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
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Dependency advisories 0

Installing pypi:ioc-l9-all-models@0.0.8 pulls in 85 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsPyPI.