Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-29 22:27 UTC

stevenmburns / momwire

Pure-Python method-of-moments antenna simulator with C++ accelerators (pybind11). Extracted from antenna_designer.

Python · C++MIT★ 0 Sterne⑂ 0 Forksseit Mai 2026Auf GitHub ansehen ↗

stevenmburns/momwire erreicht einen Gesundheitsindex von 54 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (72/100) ab, am schwächsten bei Security (26/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

54
gesamt / 100
Mittel

Software-Gesundheitsindex

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

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

Bewertungsprofil

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

Eigentümerschaft

Steve BurnsPersönliches Konto
31 Follower100 öffentliche Reposseit März 2012

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
PyPImomwire0.19.014.95019vor 0 Tagen

Metriken nach Kategorie

Vitalität

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

72Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
6.2/36Commit-Rhythmus — 9/52 Wochen mit Commits
18/18Commit-Volumen — 382 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Verwendete Eingangsdaten
commits_last_year382
human_commit_share1
days_since_last_push0
active_weeks_last_year9
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 24 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 1,9 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count24
latest_release_tagv0.19.0
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases1,9

Community & Verbreitung

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

35Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 0 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein
Wie die Bewertung erfolgt
55.7/80Downloads pro Monat — 14.950 Downloads/Monat über pypi
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packagesmomwire
dependents
ecosystemspypi
total_downloads
monthly_downloads14.950
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

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

55Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
32.5/46.8Issue-Lösungsquote — 70 % der Issues geschlossen
37.5/38.3PR-Annahme — 152/155 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/21 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs152
open_issues7
closed_issues16
issue_closed_ratio0,696
closed_unmerged_prs3
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
10.8/25Reichweite des Inhabers — 31 Follower von stevenmburns
25/25Kontohistorie — 100 öffentliche Repos, Kontoalter ca. 14 Jahre
Verwendete Eingangsdaten
followers31
owner_typeUser
is_verified
owner_loginstevenmburns
public_repos100
account_age_days5.257
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf pypi
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 19 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesmomwire
ecosystemspypi
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

71Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 15 out of 15 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

26Kritisch · 16 % des Gesamtindex

Sicherheitslage

26Kritisch
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 15 out of 15 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
0/7.5Code-Review — Found 0/21 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 13 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate2,6

AI Readiness

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

51Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 100 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — site/tsconfig.json
10/10Reproduzierbare Umgebung — Dockerfile, lockfile
10/10Belegte Agentenpraxis — 94 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfileja
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configssite/tsconfig.json
agent_commit_share0,94
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
27/45Typprüfbarer Code — Python mit Typprüfungs-Konfiguration (site/tsconfig.json)
52/55Handhabbare Dateigrößen — 5/91 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePython
largest_source_bytes166.448
source_files_sampled91
oversized_source_files5
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

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

Warnungen zur Datenerhebung

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

Weitere Details

OpenSSF Scorecard 2.6 / 10
2.6Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-29 22:27 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests15 out of 15 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/21 approved changesets -- score normalized to 0
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
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities13 existing vulnerabilities detected
Direkte Abhängigkeiten 7
RegistryPaketVersionsvorgabeManifest
PyPInumpy>=1.21pyproject.toml
PyPIscipy>=1.7pyproject.toml
npm@astrojs/check^0.9.4site/package.json
npm@astrojs/starlight^0.34.0site/package.json
npmastro^5.6.0site/package.json
npmsharp^0.33.5site/package.json
npmtypescript^5.7.0site/package.json
Alle Abhängigkeiten nicht erhoben

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

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 4143,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "C++": 215222,
        "CSS": 2936,
        "MDX": 3235,
        "Shell": 2306,
        "Python": 1263554,
        "Dockerfile": 506,
        "JavaScript": 3700,
        "TypeScript": 270
      },
      "pushed_at": "2026-07-29T22:14:00Z",
      "created_at": "2026-05-27T15:36:24Z",
      "owner_type": "User",
      "updated_at": "2026-07-29T22:13:59Z",
      "description": "Pure-Python method-of-moments antenna simulator with C++ accelerators (pybind11). Extracted from antenna_designer.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python",
        "C++"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Steve Burns",
      "type": "User",
      "login": "stevenmburns",
      "company": null,
      "location": "Portland, Oregon",
      "followers": 31,
      "avatar_url": "https://avatars.githubusercontent.com/u/1512574?v=4",
      "created_at": "2012-03-07T17:50:31Z",
      "is_verified": null,
      "public_repos": 100,
      "account_age_days": 5257
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-07-29T22:25:16Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-07-27T02:49:13Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-07-26T00:04:54Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-07-21T14:10:18Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-07-20T01:25:08Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-07-16T17:49:07Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-07-15T23:01:56Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-07-15T01:03:43Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-07-12T19:21:43Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-07-12T17:21:47Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-09T16:34:23Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-07-08T03:24:57Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-07-07T17:55:03Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-07-07T10:01:02Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-06T23:28:07Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-07-06T11:15:50Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-06T08:20:33Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-07-05T18:43:05Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-06-29T20:26:06Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-06-27T15:30:54Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-26T04:25:59Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-24T17:56:57Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-06-23T22:54:48Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2026-06-23T05:23:11Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a27772cf2dfa79a390c36f378948f54fdb7cbc24",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.19.0 (Array Block solver diagnostics)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-29T22:13:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c229b5cd228bcf50448423ba94cc72ba760d4f43",
          "body": "ArrayBlockSolver.solver_diag() surfaces the operator type (LatticeArrayBlock\n/ ArrayBlock / HMatrix), n_elem, n_shapes, and lattice_fft from the operator\nalready built by compute_impedance()/compute_y_matrix() (self._hmatrix) — no\nre-solve needed. When the FFT path did not engage, `reason` names the\n[…]\nedence\nare unchanged, only the accompanying diagnostic is new.\n\nCompanion to antennaknobs#613 (issue that asked for this) and antennaknobs#612.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(array_block): solver_diag() — report which coupling path engaged",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-29T21:40:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48b9c90cf9835a6bb31fc58fb4903516e225efe2",
          "body": "At the deep restarts resonant lattices need, ~90% of per-iteration time was\nKrylov bookkeeping: a Python-loop modified Gram-Schmidt (k rank-s updates)\nand a from-scratch O(k^3) lstsq on a Hessenberg rebuilt in O(k^2) Python\nevery step. Replace with:\n\n- classical Gram-Schmidt done twice (CGS2) over O\n[…]\nn cost is ~1/3\noperator+preconditioner, ~2/3 the O(k N) orthogonalisation gemms.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01YPQBxTv46asiT2hAczUZoK",
          "is_bot": false,
          "headline": "perf(hmatrix): CGS2 + incremental Hessenberg QR in the block GMRES",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-29T14:34:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "003e0c27940b3f72dd74330e365028d7d52ea964",
          "body": "… stall at 50\n\nA 32x32 half-wave-dipole lattice converges in 226 unrestarted iterations\nbut stalls indefinitely (maxiter, wrong answer) at the generic restart\ndepth of 50: truncation discards exactly the slowly-converging\nedge-resonance directions the Floquet preconditioner cannot represent.\n_block_\n[…]\nlat once\ntruncation is gone. Includes a ruff format pass over the touched files.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01YPQBxTv46asiT2hAczUZoK",
          "is_bot": false,
          "headline": "fix(hmatrix): operator-hinted GMRES restart depth — resonant lattices…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-29T14:34:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c2ef1c5d7e999e48e228ef30a7b2e92dc88d2b01",
          "body": "Records the candidate exploration for issue #168 against the driving example\n(10,000-element 100x100 lattice, ~70-100 wl aperture): KIFMM and H2 both hit\noscillatory-rank growth at this electrical size (the MLFMA-shaped problem),\nwhile lattice translation invariance is exact at any frequency — so th\n[…]\n (16x16:\n80 s -> 1.9 s end-to-end), and scripts/lattice_scaling.py to reproduce.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01YPQBxTv46asiT2hAczUZoK",
          "is_bot": false,
          "headline": "docs: lattice-FFT design plan — resolves the FMM scoping toward BTTB/FFT",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-29T14:34:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4465c14aa611a3986b6dcc89cade4730e1ea5291",
          "body": "…conditioner\n\nFor a regular lattice of same-shape elements the coupling block depends only\non the element displacement, so the coupling operator is block-Toeplitz per\nlattice dimension. Represent it as a dense displacement-block kernel in FFT\nform (LatticeArrayBlock) and apply it as an FFT convoluti\n[…]\n\ndocs/lattice-fft-plan.md (next commit) for the design and candidate\ncomparison.\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01YPQBxTv46asiT2hAczUZoK",
          "is_bot": false,
          "headline": "feat(array_block): lattice-FFT (BTTB) coupling operator + Floquet pre…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-29T14:34:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f1590063f3558b9cdf49825f819de02fbd97957d",
          "body": "…s, memory\n\nThe script still imported the pre-rename pysim/BSplinePySim names and could\nnot run. Update to momwire/BSplineSolver/HMatrixSolver, add argparse (--ns,\n--dense-max, --aca-tol/eta/degree), a 'screen' wire-grid geometry alongside\nthe classic straight wire, per-N H-matrix MB + peak-RSS repo\n[…]\nng, and skip\nthe dense reference above --dense-max (issue #168 phase-1 tooling).\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01YPQBxTv46asiT2hAczUZoK",
          "is_bot": false,
          "headline": "fix(scripts): modernise hmatrix_scaling.py — momwire names, geometrie…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-29T14:34:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da8caaa4dba686d983170f639775e6caa65f67d7",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.18.0 (junction ports)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-27T02:36:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4de51265fce0a7bc8974266943b0ebd9208a02a5",
          "body": "A solve driven entirely through junction ports needs no gap feed; the\nback-compat feed_wire_index/feed_arclength scalars become None in that\ncase. Surfaced immediately by antennaknobs#579's PortAtEnd plumbing\n(a BalancedLine-fed structure whose only sources are virtual ports).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01WURGJupsPPBTToicCuTVoa",
          "is_bot": false,
          "headline": "fix(bspline): allow feeds=[] when junction_ports drive the solve (#172)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-26T22:38:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "74e05ca4a60b3d8fed2729369811eb25a1e76a53",
          "body": "…des (#172)\n\nA junction port promotes a junction group to a network port: its KCL\nclosure row leaves the constraint set (the grounded-junction #151 move)\nand becomes the port's Galerkin drive/readout vector — voltage V excites\nv += V*A_p and the port current reads I_p = A_p*coeffs, the same\nreciproc\n[…]\ngap physical difference Richardson-extrapolating to\n< 1.5%.\n\nCloses #172\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01WURGJupsPPBTToicCuTVoa",
          "is_bot": false,
          "headline": "feat(bspline): junction ports — voltage-drivable ports at junction no…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-26T22:20:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ce76ffe8f583eb425680a37a40f5ef349df232ca",
          "body": "…model)\n\nThe #167 series lands the image-reaction blocks that let the K>=3\nsingular-enrichment bases solve over PEC image, fast-finite (refl-coef),\nand Sommerfeld grounds -- previously enrichment was free-space only.",
          "is_bot": false,
          "headline": "chore: bump version to 0.17.0 (singular enrichment over every ground …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-25T23:52:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "584dfa29221700d9b38fb56e5aa7c53daa9bca53",
          "body": "Stage 3, the last ground model. Sommerfeld = the C2 exact-image part plus\nthe smooth remainder-field reaction. The exact-image part reuses the\ngeneralized enrichment image kernel with constant c2=(eps_t-1)/(eps_t+1)\nweights (w_A=c2*td_img, w_Phi=c2). The remainder reaction is new:\n_Q_sommerfeld_rema\n[…]\nwithin a\nfew percent (the remainder is the exact correction, not a blow-up); two-\nport Y stays reciprocal. 470 momwire tests pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bspline): Sommerfeld ground for enrichment bases (#167 complete)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-25T18:51:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e4e36f1617563018c6f19090594b299a5b188e0b",
          "body": "…167)\n\nStage 2 of #167. Generalise the enrichment ground-image reaction from PEC\nto per-segment-pair complex weight tables, exactly as the polynomial image\npath unifies the two grounds through _image_Z_weighted(w_A, w_Phi):\n  Z = jωμ·w_A·I_A + w_Φ·I_Φ/(jωε).\nPEC passes w_A = mirror tangent-dot, w_Φ \n[…]\nnd-limit check, now reachable for enrichment), two-port Y\nstays reciprocal, and PEC results are unchanged. 463 momwire tests pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bspline): fast finite (refl-coef) ground for enrichment bases (#…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-25T18:37:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f226cc7cb6ec42a358732713e3a0bb640bc3a9a",
          "body": "Unpinned `pip install ruff` pulls the latest release, so a new ruff\nversion silently turns CI red on pre-existing code with no repo change\n(observed: latest ruff flags 185 pre-existing issues across validation/\nthat 0.15.x does not). Pin to 0.15.21, the same version antennaknobs'\nruff.yml uses, so lint is deterministic; bump deliberately alongside the\nrepo-wide cleanup a newer ruff implies.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: pin ruff to 0.15.21 (matches antennaknobs)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-25T18:23:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "54f93a3e8bfd0f3f2ef3d2639c0545e2ae379744",
          "body": "Enrichment over a PEC ground plane was hard-blocked because the border\nblocks (Z_pe, Z_ep, Z_ee) carried no image contribution. Add the image\nreaction as the direct counterpart of the polynomial image path\n(_assemble_Z with td_all=td_img): the same Galerkin kernel with the\nsource-side quadrature pos\n[…]\nr-plane limit returns to\nfree space, and the hentenna X convergence rate stays above 2.5 over a\nPEC plane. 457 momwire tests pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bspline): PEC image reaction for singular-enrichment bases (#167)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-25T18:23:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "57bd98f99a4a0e393b047d32d5bca74dd9081fe8",
          "body": "…ix path)",
          "is_bot": false,
          "headline": "chore: bump version to 0.16.0 (singular enrichment through the Y-matr…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-21T14:01:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "255885b2e35ff97ec6cabeb40fe343d3a34a96fc",
          "body": "compute_y_matrix / compute_y_matrix_swept no longer raise\nNotImplementedError with use_singular_enrichment: the port solve composes\nthe same augmented system as compute_impedance — [[Z, Z_pe], [Z_ep,\nZ_ee]] with zero RHS rows and zero KCL columns on the enrichment block,\ntikhonov's lambda*s*I on Z_e\n[…]\nTL/network/virtual-driver design through compute_y_matrix).\n\nCloses #165\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01TmgjJwcpzBa3sUzpKj7tKw",
          "is_bot": false,
          "headline": "feat(bspline): wire singular enrichment into the Y-matrix path (#165)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-21T13:42:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "29e38229a65f8123a0e70435c1d0937436bbd3cf",
          "body": "The three golden gn 2 gates (dipole/inverted_l/yagi) only ran at the\nconstructor-default degree 2. Degree 1 is the batched-swept basis the\nantennaknobs web frequency sweep serves, and it was unpinned against the\nphysical oracle on Sommerfeld ground — its accuracy there was fine\nempirically but not r\n[…]\nies a per-degree gate (2.0 / 1.5)\nto keep degree 2 strict.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01KV3q7Q9hGKQL4xfbw5qbdt",
          "is_bot": false,
          "headline": "test(sommerfeld): pin degree-1 bspline against the nec2c gn 2 golden",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-20T23:17:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0bec8b4f8117bb37b7dcc222547673821895c05b",
          "body": "… + frequency-axis reuse)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01TmgjJwcpzBa3sUzpKj7tKw",
          "is_bot": false,
          "headline": "chore: bump version to 0.15.0 (Sommerfeld grid fill: linear in extent…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-20T00:53:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "693fd5889bf261b9c8eaa06a369b6e28e805365f",
          "body": "…per sweep point (#159)\n\nPhase 6 (near/far split) fixed the extent axis; the frequency axis\nremained: the grid cache keyed on k2, so every sweep point and every\nfrequency-knob tick paid a cold fill — and sub-4-lambda geometries (most\nof the antennaknobs catalog) get no help from the split because th\n[…]\nnnaknobs ground\n  oracles pass.\n- docs: sommerfeld-perf-plan.md Phase 7.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01TmgjJwcpzBa3sUzpKj7tKw",
          "is_bot": false,
          "headline": "perf(sommerfeld): frequency-axis grid reuse — one fill per band, not …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-19T17:46:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7b8a10b92a7b410b74fd396a14c246697176ec30",
          "body": "…xtent (#159)\n\nantennaknobs' full-catalog benchmark measured the SommerfeldGrid fill as\n85-96% of every cold Sommerfeld solve (momwire ~13x slower than PyNEC gn 2,\nwith the Phase-4b remainder assembly already near-free), and the node count\ngrowing ~quadratically with geometry extent: region 2's thet\n[…]\nknobs ground oracles 63 passed.\n- docs: sommerfeld-perf-plan.md Phase 6.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01TmgjJwcpzBa3sUzpKj7tKw",
          "is_bot": false,
          "headline": "perf(sommerfeld): near/far grid split — fill no longer quadratic in e…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-19T15:48:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "57a8b22aa86f00ac0246cee57540aa31bbe7c721",
          "body": "The Sommerfeld remainder grid is sized to the geometry's largest image-\npoint distance, and its region-2 theta spacing is keyed to that extent\n(dth2_target = deg(0.07 lambda / r1_max)), so the node count grows\n~quadratically in r1_max. A wire parked hundreds of wavelengths away — the\nNEC TL-anchor i\n[…]\nds test updated to the\n  clamp contract. Full sommerfeld/ground suite green (428 passed).\n- docs: sommerfeld-perf-plan.md Phase 5.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sommerfeld): cap grid r1_max to bound far-pair fill (#157)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-17T23:27:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60d324fafb1c1a3fe0058584193b516f67ae8e6d",
          "body": "The mixed-potential refl-coef path's Φ-term approximation is validated\nfor 0.1–0.5λ heights; the #153 height sweep quantified the edges\n(|ΔΓ| 0.019 at 0.1λ, 0.127 at 0.05λ, divergent at contact) while the\nfield-based sinusoidal solver matches NEC's dyad exactly at every\nheight. Constructor comment a\n[…]\nhere, contact-\ncapable since #151) or the sinusoidal basis.\n\nCloses #153\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BSnmgGZUgDsMWkQHNpTogu",
          "is_bot": false,
          "headline": "docs: refl-coef validity window — guidance from the #153 study",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-16T20:47:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d4dc1ed9d215998fdab7470f718491b9f406ae59",
          "body": "…403 class)\n\nThe v0.14.0 primer deploy reported success while the machine actually\nserving traffic kept a days-old image (the freshly-updated machine sat\nstopped) — the same silent green-but-skewed failure antennaknobs#403\ndocumented on the simulator. Port antennaknobs' verify_fly_fleet.sh and\nrun i\n[…]\n public page and its hashed asset are\nfetched through the load balancer.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BSnmgGZUgDsMWkQHNpTogu",
          "is_bot": false,
          "headline": "ci: verify Fly fleet convergence after the docs deploy (antennaknobs#…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-16T20:22:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "adc1c363f8986491fff0a60270ac998a24639d5b",
          "body": "… touching the ground plane)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BSnmgGZUgDsMWkQHNpTogu",
          "is_bot": false,
          "headline": "chore: bump version to 0.14.0 (ground-junction end conditions — wires…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-16T17:37:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c851a08fdad620df14557c0d5caecde47deddbaf",
          "body": "…s chapter (#151)\n\nChapter 8 kept every antenna clear of the plane; the canonical payoff of\nimage theory — the quarter-wave monopole driven against the ground — was\nunsolvable before #151. New section: vertical currents image unreversed\n(the mirror finishes the wire instead of fighting it), a ground\n[…]\nover two). Numbers verified\nagainst the snippet. Site builds (16 pages).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BSnmgGZUgDsMWkQHNpTogu",
          "is_bot": false,
          "headline": "docs(site): 'The grounded end' — monopole section in the mirror-world…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-16T17:29:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d535a5306730397730bc4434f7024da0264062dd",
          "body": "…sts, docs (#151)\n\n- The three identical 'strictly above ground_z' Sommerfeld checks relax\n  to at-or-above: the ground-junction basis handles contact and the\n  remainder quadrature's Gauss nodes are strictly interior to segments,\n  so z+z' > 0 holds pointwise even for a wire ending in the plane.\n  \n[…]\n.\n- Plan docs de-staled; solver module docstrings document the junction.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BSnmgGZUgDsMWkQHNpTogu",
          "is_bot": false,
          "headline": "feat(ground): allow Sommerfeld ground contact + validation parity, te…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-16T17:29:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9e5b7be44b075b2c0eee5750067e18b784eafd71",
          "body": "…ect each member, no inter-wire entries (#151)\n\nAt a junction lying in the ground plane, nec2c's conect() connects each\ntouching end to ground and SKIPS the real-partner search entirely\n('icon1[i] = i; jump = TRUE') — members couple through their images,\nnot through junction bookkeeping. Keeping the\n[…]\nnow fires at geometry build\nfor every ground model (test match updated).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BSnmgGZUgDsMWkQHNpTogu",
          "is_bot": false,
          "headline": "fix(sinusoidal): grounded junctions follow NEC conect() — ground-conn…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-16T17:29:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7473d8da4231f27baf202e321838e4f9d393ab80",
          "body": "…151)\n\nA wire end in the ground plane took the free-end X=0 branch (Eqs 54-61),\npinning I=0 where a grounded end carries maximum current — a ground-\nmounted monopole read 33 -11031j instead of 34 -20j. Following nec2c's\ntbf ground-connection path (jcox == i) exactly:\n\n- _build_geometry marks ground-\n[…]\nent profile matches BSpline d=2 to 4 digits; elevated control\nunchanged.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BSnmgGZUgDsMWkQHNpTogu",
          "is_bot": false,
          "headline": "feat(sinusoidal): NEC-faithful ground-junction basis at z=ground_z (#…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-16T17:29:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "af22e01e619e697db99a31ef9eb3428c1c40d2d9",
          "body": "…z=ground_z (#151)\n\nA wire endpoint in an active ground plane was classified free, dropping\nthe value-1 boundary basis and pinning I(end)=0 — a ground-mounted\nquarter-wave monopole read ~33 -10600j instead of ~34 -20j (the open\nend acts as a tiny series capacitor; R survived, X was ~500x off). The\ni\n[…]\n55j / d2 33.66-20.43j vs PyNEC\n33.59-20.35j; elevated control unchanged.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01BSnmgGZUgDsMWkQHNpTogu",
          "is_bot": false,
          "headline": "feat(bspline): ground-junction end condition — keep the end basis at …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-16T17:29:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2865c47f79cfdfe5566cedba4a38a73b60543552",
          "body": "…s, #147)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.13.0 (per-wire radius across all solver base…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-15T22:52:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dde3e02db2bf9dbaacd7a49b105f7a5ccf602dc2",
          "body": "…rnels per observer-row run (#147)\n\nBackports the bspline kernels' per-run dispatch to the sinusoidal field\ntensors, closing the last numpy-fallback gap of #147: the scalar-radius\nC++ kernels (sinusoidal_field_tensor, sinusoidal_field_tensor_refl) are\ncalled once per contiguous constant-radius run o\n[…]\nntical; the stitched\nmixed path agrees with the numpy reference at ~1e-12 rel (asserted at\n1e-9 in tests, free space and Fresnel finite ground).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sinusoidal): serve mixed per-wire radii through the C++ field ke…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-15T22:45:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8a40dd14e15c2d39234b9e1d80418b5fe1a19827",
          "body": "…k fills (#147)\n\nHMatrixSolver and ArrayBlockSolver now accept mixed per-wire radii,\ncompleting the solver-family scope of #147 (SinusoidalSolver and\nBSplineSolver landed earlier). The observer-surface convention is\ninherited unchanged from the dense Galerkin build:\n\n- The H-matrix context carries s\n[…]\n dense at <1e-4 for radius-alternating lines and internally\nmixed elements; cache-aliasing and transpose-gate behavior pinned by\nACA-run counts.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hmatrix): per-wire radius in the fast solvers via per-group bloc…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-15T22:45:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6edb0c7fd374184b7af9938750db91cd2ff1caa9",
          "body": "…r-row kernels (#147)\n\nBSplineSolver.wire_radius now accepts a length-n_wires sequence. The\na²-regularized moment kernel applies the observer-surface convention\noracle-validated on the sinusoidal solver: each observer ROW of\n_seg_seg_full_moments_offedge (and its swept variant) uses its wire's\nown r\n[…]\neometries meanwhile. Singular\nenrichment + mixed radii likewise guarded.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01LzumziErt42mhUQBPrR1tP",
          "is_bot": false,
          "headline": "feat(bspline): per-wire radius in the Galerkin family via per-observe…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-15T22:01:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6ee1a38f7732f73c5204e24633e636fc89f1aa9",
          "body": "…NEC (#147)\n\nSinusoidalSolver.wire_radius now accepts a length-n_wires sequence\nalongside the scalar. Mixed radii follow the two NEC2 conventions,\ntranscribed from nec2c/necpp source and validated live against PyNEC:\n\n- basis end-condition constants (TBF): each segment's log-constant uses\n  its OWN \n[…]\nrtical/thin-radials K=5 junction\ngroundplane at N=31, both within 0.5 Ω.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01LzumziErt42mhUQBPrR1tP",
          "is_bot": false,
          "headline": "feat(sinusoidal): per-wire radius arrays, oracle-validated against Py…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-15T22:01:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ea100120cabe3eee4993cfdd99e5cf9767d694a8",
          "body": "Chunked dense fill+assemble drops the (d+1,d+1,N,N) J tensor (#136),\nH-matrix admissibility boxes mask zero-weight padding wings (#137),\nArrayBlockSolver degrades to the parent H-matrix on degenerate\npartitions instead of one whole-matrix zblock (#143), and the\nsinusoidal adjoint oracle stashes LU f\n[…]\ne over ground); ArrayBlock previously\ndied allocating a 21.6 GiB gather.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01QUtqSdTwXJxBzms3jmV16u",
          "is_bot": false,
          "headline": "chore: bump version to 0.12.0 (whip-benchmark memory hardening)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-15T00:54:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e03bd5e28a4aaef882b9633f26930e33c7d6058a",
          "body": "…ions\n\nOn a mesh with no repeated-block structure, build_array_blocks degenerated\nto a single group holding every basis and fed the whole index set to one\nzblock(g, g) call — whose wing gather materializes an\n(n_basis, n_basis, d+1, d+1) complex intermediate: 21.6 GiB on the whip\nbenchmark deck (12,\n[…]\n154 s at 2,147 MB peak RSS — the parent\nH-matrix footprint.\n\nCloses #143\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01QUtqSdTwXJxBzms3jmV16u",
          "is_bot": false,
          "headline": "fix(array_block): degrade to the parent H-matrix on degenerate partit…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-14T23:20:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "662598acf7d1fcec49ea07aae23e5910b1b0da4c",
          "body": "…d tests\n\nSequel to 3efb455: the grounded equalities got margin, the free-space\nones stayed at 1e-12 because they were green on all three wheel\nplatforms that run — zero-margin thinking. The next main wheels run\n(29350220998) had MSVC land the end-to-end free-space equality at\n1.02e-12. Same policy everywhere now: 1e-10 pins the chunked-vs-tensor\nalgebra with headroom for compiler reduction order.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: extend the 1e-10 cross-compiler margin to the free-space chunke…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-14T16:43:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3efb4557baa1afc797bbdaba80bb6cdfadbee576",
          "body": "…piler)\n\nThe three grounded equivalence tests pinned chunked == tensor at 1e-12,\nwhich only gcc's reduction order satisfies. MSVC and AppleClang round\nthe weighted windowed kernel's complex accumulation to 2e-12..8e-12\n(wheels run 29345985527: windows-latest and macos-14 red on main).\n1e-10 still pi\n[…]\nfive orders of margin below physical\ntolerance. Free-space tests stay at 1e-12 — real-weighted accumulators,\ngreen on all three wheel platforms.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: loosen grounded chunked-vs-tensor tolerance to 1e-10 (cross-com…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-14T16:34:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c731ed1f6c1e0d50c618632070c7b3f4229f8ae5",
          "body": "…nt oracle\n\ncompute_impedance factored G twice over: scipy.linalg.solve internally\nLU-factored a copy (G is C-ordered; LAPACK wants column-major), and the\nwire-loading adjoint-oracle test then factored G AGAIN for w = G^-T r.\nFactor G^T instead — G.T is an F-ordered view of the C-ordered G, so\ngetrf\n[…]\n solve (~9.9 -> 9.3 s at\nN=4671), no second O(N^3) factorization in the adjoint test, and a\nfactored-form API that serves both solve directions.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(sinusoidal): stash LU factors, not the raw matrix, for the adjoi…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-14T16:24:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "975fb1c31efdca51482ca06a01e3b2fc9f425336",
          "body": "Ground scope of #136: new C++ kernel assemble_Z_bspline_weighted_windowed\n— the weighted counterpart of the windowed accumulator, with complex\nper-pair tables on both terms and a complex scale on each window's\ncontribution — accumulates the ground-image subtraction (scale = -1)\nstraight into Z. PEC \n[…]\np\ndeath before); refl-coef ground completes for the first time.\nGrounded chunked-vs-tensor equality pinned to 1e-12 for all three\nground models.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(bspline): chunked ground-image builds + in-place KCL LU",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-14T15:35:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6727d34ca622d8d3fa3d40b48afac7a6fee5470",
          "body": "… tensor\n\nThe free-space single-k dense path built the full polynomial moment\ntensor (3.14 GB at 4,671 segments, degree 2) before contracting it into\nZ. The (zA, zPhi) -> Z mixing is linear, so observer-row windows of the\nrectangular full-kernel fill can accumulate straight into Z instead:\nnew C++ k\n[…]\n see #138). Chunked-vs-tensor equality pinned to 1e-12 with\nforced 1-row windows on a junction + short-wire geometry, both degrees.\n\nCloses #136\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(bspline): chunked dense fill+assemble — drop the (d+1,d+1,N,N) J…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-14T15:35:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a75f598c3ed31abd8f270d27470fb7eece16394",
          "body": "_build_basis_polynomials zero-pads unused supp_seg wing slots with global\nsegment 0 (zero poly weight, numerically inert). The H-matrix context\ntrusted supp_seg raw when computing per-basis bounding boxes, so on meshes\nwith wires shorter than degree+1 segments every padded basis's box\nstretched to s\n[…]\n wires (every basis pads\nat degree 2) asserts boxes stay on their own wire and the partition\ncompresses; it fails without the mask.\n\nCloses #137\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hmatrix): mask zero-weight padding wings from basis bounding boxes",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-14T14:46:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "96ae77c57b4ad16c0bc4d94bd2e0f7cdfadacb60",
          "body": "…c wire-material exports)",
          "is_bot": false,
          "headline": "chore: bump version to 0.11.0 (sinusoidal-solver wire loading + publi…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-12T19:11:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38329fca7f804dbc42f2016e2214bfd5f28c2afe",
          "body": "The point-matched (NEC collocation) system takes the loading as NEC's\nimpedance boundary condition at the segment-centre match points --\nE_scat(n) - Z'_w*I(n) = -E_app(n) -- a sparse subtraction of\nZ'*sigma(A+C) from G in _assemble_Z, which every consumer (impedance,\nY-matrix, both swept loops) funn\n[…]\nternal_impedance + insulation_inductance\nfrom the momwire top level (antennaknobs' NEC LD-5/LD-2 emission\ncurrently imports the private module).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: SinusoidalSolver distributed wire loading (closes #134)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-12T19:08:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fa70a94f0164845b5368c16dab7f2347d931dd03",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.10.0 (distributed series wire impedance)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-12T17:12:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec59144798a529d90b609178dc736ab4e65fd7c4",
          "body": "… loading\n\nReal antenna wire is not PEC (#131). Adds a per-wire distributed series\nimpedance Z'(ω) = Z'_int(ω) + jωL'_ins entering the MoM as\nZ_mn += Σ_w Z'_w(ω)·S_w[m,n] over same-wire basis overlaps:\n\n- Z'_int: exact round-conductor internal impedance via scaled Bessels\n  (ive ratio — overflow-saf\n[…]\nn limits,\nfirst-order perturbation ΔZ = c₀ᵀLc₀/I₀², R'·L/2 and ωL'·L/2 physics\nwindows on the 28 AWG 20 m dipole, all-path parity.\n\nCloses #131.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: distributed series wire impedance — conductor loss + insulation…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-12T15:59:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0b147cbfd272692afbaf0c7a82f915b7a1851e4b",
          "body": "…e feed\n\nA numerical experiment (smoothed cos² feed on the pulse toy + a\nconvergence-form EDA) shows the ~1 Ω reactance gap the primer discussed is\na basis-limit difference, not the feed:\n\n- Feed smoothing on the pulse basis changes neither the reactance\n  convergence rate nor its extrapolated limit\n[…]\n-gap feed was crude.\"\n- index: Act I card says \"what the delta-gap feed supplies,\" dropping the\n  false \"read the feed off the reactance\" line.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(site): attribute the pulse reactance offset to the basis, not th…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-11T05:00:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "253c38fae282c805a73ba8de98ac29d15042c782",
          "body": "Every \"chapter N\" / \"Act X\" pointer was plain text. Wrap the first\noccurrence of each distinct target per page in a link to that page, so\nreaders can jump between chapters. 48 links across 14 chapters.\n\nPolicy: first occurrence per distinct target per page (repeats stay\nplain to avoid noise); no sel\n[…]\nks; frontmatter, headings, code\nspans, and figure alt-text left untouched. index.mdx already carries\n\"Start here\" nav cards, so it's unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(site): hyperlink cross-chapter references throughout the primer",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-11T05:00:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "404cbdbeabdfc773dbcb47a186107acbeafbde78",
          "body": "Full read-through of the 14-chapter primer for consistency:\n\n- ch1: the toy no longer \"wrecked\" by the sharp kernel — it converges,\n  slowly (matches ch1's own later \"watched it work, just slowly\" and\n  ch2's \"working solver\"). \"wrecked\" was a leftover from the pre-rework\n  pulse-fails framing.\n- ch\n[…]\no factor,\" not literally \"two\n  numbers\" (matches the figure's \"rank 2\").\n- ch13: \"twelve to three\" was in code font mid-prose; now plain text.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(site): cohesion pass — correct stale references and framing",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-11T01:13:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f7f5e58a1bafb5c6dbde3d04ed56cb80dda6e6c",
          "body": "All 14 chapters have shipped, but the landing-page Act cards still\ntagged Act II \"Coming next.\" and Acts III/IV \"Planned.\" with no links.\nDrop the tags and add \"Start here →\" links to the first chapter of\neach act (act-2/sinusoids, act-3/mirror-worlds, act-4/scaling).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(site): front page — link all four acts, drop stale status tags",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-11T01:13:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3d44c795a3a8d35ffa1b8ec23e489419ee5c2bdb",
          "body": "The MoM primer site — \"A voltage in a gap\" (Acts I–IV, 14 chapters)",
          "is_bot": false,
          "headline": "Merge pull request #128 from stevenmburns/mom-primer",
          "author_name": "Steve Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T19:02:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4521eb707e927df3bc6ab233dd511f9b75739ab2",
          "body": null,
          "is_bot": false,
          "headline": "docs: mark the primer plan build order complete (all 14 chapters landed)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "503be21a83f06a5861e67b0fec199c40b5a15abd",
          "body": "…lete)\n\nClose the primer. \"The same math, twice\": the readable Python spec (every\nchapter linked into source) mirrored by a compiled C++ extension computing the\nidentical kernels with the GIL released — one is the other's oracle, and a\npure-Python fallback keeps the spec executable. \"Production\" mea\n[…]\n-it-finish vs cancel)\n- new act-4/epilogue.md; sidebar completes Act IV\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act IV ch14 — Epilogue: the same math, twice (primer comp…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ee80f1bc80cea3ff60440957078b273e1e33b22f",
          "body": "Where the H-matrix is geometry-blind, an array hands you structure: a P-element\narray's Z is a P×P grid of blocks — dense self-blocks (one per shape class,\ncopies identical to ~2e-12) and weak low-rank coupling. Free-space translation\ninvariance makes it block-Toeplitz: coupling depends only on\n(sha\n[…]\n + the\n  pairs→unique dedup bars\n- new act-4/arrays.md; sidebar updated\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act IV ch13 — Arrays know their own symmetry",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c60d132937a3316e396f40a32ec7db22b4b742d0",
          "body": "…atrix)\n\nCash chapter 2's heatmap hunch: a block coupling well-separated wire chunks is\nlow rank — a real far 60×60 block is rank ~2 (SVD collapses below machine\nprecision by index 7) while the diagonal block stays full rank 60. ACA peels the\nlow-rank factorization one cross at a time in O(rank·N) w\n[…]\nuoted from docs/hmatrix.md)\n- new act-4/compression.md; sidebar updated\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act IV ch12 — Matrices that are secretly small (ACA / H-m…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "690f9b83d518f83f96d69e5c180b2d05ab954cbc",
          "body": "Open Act IV on cost. The dense moment matrix scales on three axes: fill O(N²),\nfactor O(N³), storage O(N²) — measured climbing between N² and N³ from 64 to\n2048 unknowns. Sweeps multiply it, but the frequency-independent work (geometry\n+ ch6's static moments — \"static\" because k-independent) is shar\n[…]\ne\n  swept solver\n- new act-4/scaling.md; sidebar gains the Act IV group\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act IV ch11 — N² is the enemy",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8337614f6229c1f4622220ecbbbe2f96e28efa53",
          "body": "…complete)\n\nThe exact ground: solve the air-earth boundary-value problem via Sommerfeld's\nspectral integrals (six oscillatory contour integrals; momwire re-derives them\nclean-room from the NEC-2 manual). Naively N² per-pair integrals — ruinous. The\nescape: subtract the closed-form exact image, and t\n[…]\nmerfeld cold/warm)\n- new act-3/sommerfeld.md; sidebar completes Act III\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act III ch10 — Sommerfeld, or paying full price (Act III …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dbefcac157549916dfb0b5e88b8a37b33da557d9",
          "body": "…cient)\n\nReal earth is a lossy dielectric, not a perfect mirror. Weight the ch8 image by\nthe Fresnel reflection coefficient Γ (complex, angle- and polarization-\ndependent; the pseudo-Brewster dip for vertical pol) — same image machinery,\none complex weight per interaction, no new unknowns (momwire g\n[…]\nhe sub-0.1λ divergence shaded\n- new act-3/real-dirt.md; sidebar updated\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act III ch9 — Real dirt, cheap (Fresnel reflection coeffi…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "046281089f1c2efcaf93785af915fc963bbd3b7f",
          "body": "Open Act III with the cheapest physics upgrade: a perfect ground via the method\nof images. One extra kernel term (segment n's image field at segment m), no new\nunknowns — momwire's ground_z argument. The payoff is the classic height\noscillation: R collapses toward 0 at low height (the reversed image\n[…]\n- tees up ch9: real dirt reflects imperfectly — the Fresnel coefficient\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act III ch8 — Mirror worlds (PEC ground)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cb01a61f7070ab1a7d41943478ce23fe1047d1bb",
          "body": "The credibility anchor: a solver number is a claim, verified two ways.\nInternal — the convergence knee: momwire's bases sit on NEC by N=5-7 while the\nAct I pulse crawls past N=300 (necessary but not sufficient; a solver can\nconverge to a wrong number, e.g. ch3's feed-model offset). External —\ncross-\n[…]\nw before it shipped\n- new act-2/validation.md; sidebar completes Act II\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act II ch7 — How do you know it's right? (Act II complete)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d245c9ac9540d6a1de43e2cc1cb65a1e820f0c1",
          "body": "The spline (unlike ch4's sinusoid) doesn't self-integrate, so every entry is a\nreal kernel integral. Split by distance: far pairs are smooth (Gauss nails them\nat 4 points; momwire caps n_qp_pair at 8 because more is pointless); self/near\npairs are near-singular (the 1/R spike is 0.5mm wide in a 258m\n[…]\n split has nothing to prove)\n- new act-2/quadrature.md; sidebar updated\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act II ch6 — Integrals done honestly",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "52ed5164beaa9d04093913d07dd72e8c211b7951",
          "body": "B-splines trade the sinusoid's per-segment cleverness for one basis that stays\nsimple on any shape. Frame the degree ladder (pulse d0 / tent d1 / quadratic\nd2) as the same continuity ladder from Act I, restated in the charge: dI/ds\ngoes deltas -> pulses -> continuous as d climbs, and the charge is w\n[…]\nnds by teeing up ch6: splines don't self-integrate, unlike the sinusoid\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act II ch5 — Splines and junctions",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2cf29d237178208938a949cd0918c8e77cfd2ae",
          "body": "Open Act II by cashing Act I's cliffhanger: a continuous current fixes the\nconcentrated-charge problem that made pulses crawl. The three-term basis\n(constant + sin + cos per segment, NEC-2's, continuity + KCL baked in) nails\nthe specimen dipole in five segments (70.4-20.7j vs pulses' 120+308j at N=5\n[…]\nulses nowhere)\n- new act-2/sinusoids.md; sidebar gains the Act II group\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act II ch4 — Sinusoids, NEC's bet",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6859b2e694919cc70c79fa2acc6cd84acf8b2a35",
          "body": "The three opening chapters: the antenna question as an integral equation for\nthe current; the two-step retreat to Z·I = V on the 2n+1-point grid, with a\nworking pulse toy (Harrington's mixed-potential scheme) that converges on the\nreal thin specimen; and the delta-gap feed with Z_in = V/I(feed). Eve\n[…]\nlink pinned to v0.9.0 and\nverified by scripts/check_site_permalinks.py.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MDV7U4AWPyJvcw2iuF6q9Q",
          "is_bot": false,
          "headline": "feat(site): Act I — from a wire to a matrix",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T18:58:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "02b0316280136c37f9f12787fbe81e6f2d379e47",
          "body": "…e pipeline, Act I figures\n\nAstro+Starlight mirroring the antennaknobs docs stack (same theme CSS),\nfly.toml/Dockerfile for a momwire-docs Fly app (momwire.antennaknobs.dev),\ntag-fired deploy workflow gated on FLY_API_TOKEN_DOCS, and the checked-in\nfigure scripts (toy pulse solver + chapter figures, instrument-panel style).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "feat(site): bootstrap the MoM primer site — Starlight scaffold, figur…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T03:36:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "edc4fdd0df86d2908ae6f87b2a70862c46ce44c6",
          "body": "…list\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "docs: MoM primer site plan — story arc, figure lists, bootstrap check…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-10T03:20:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "43300d979c2451f697a47ba08246d5982af43b26",
          "body": "…atched sweeps; sinusoidal refl-kernel perf)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "chore: bump version to 0.9.0 (triangular retired into bspline d=1 + b…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T16:25:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "423323b4935387f0f2314c0e7a9e48a4fb1dcd57",
          "body": "…rings\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "test+docs: refl-kernel equivalence pin, de-stale the pre-kernel docst…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:49:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3562cad73c0e5a7ed38fb75435c8f7730028a691",
          "body": "… ground\n\nThe refl-coef ('fast') finite-ground image block was the last sinusoidal\nfill running in pure numpy — _field_components at 72% of a moxon N=81\nsolve (450 ms vs 12.8 ms for the C++ kernel at the same 568-segment\nsize), and super-quadratic past ~300 segments as its ~30 (M,N) complex\ntemporar\n[…]\nh\nretained as the bit-close reference/fallback (matches to ~1e-13 on Z).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "perf(sinusoidal): C++ Fresnel-weighted field tensor for the refl-coef…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:49:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f0ad8b02055d86174c3edf5386aef048a9df633",
          "body": "One knob instead of two: the batched-sweep memory budget is now an\nexplicit BSplineSolver constructor arg (default 256 MB, inherited by\nHMatrix/ArrayBlock via kwargs), so the policy lives with the caller —\nantennaknobs will thread it through its engine config in the pin-bump\nPR. MOMWIRE_SWEPT_MEM_MB\n[…]\nd allowlists\nforward it; the tiny-budget regression test uses the kwarg.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "refactor(bspline): swept_mem_mb constructor kwarg replaces the env var",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "24d16724ce78de0c3faf9d0c4137503dfd22136a",
          "body": "…transient memory\n\nThe 256 MB J-chunk budget didn't cap peak memory: the full-sweep\nsame-edge reg-moment hoist was budget-independent and dominated on\nlong-wire shapes (~940 MB on a 41-pt sweep of a single 400-seg wire,\n1.5 GB peak RSS). Now one budget counts BOTH per-k transients (all-pairs\nJ + per\n[…]\n.55 s).\nCorrectness is budget-independent (new chunk=1 regression test).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "feat(bspline): MOMWIRE_SWEPT_MEM_MB — budget-cap the batched sweep's …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0643803415782b3b30a919484fbd2da73bed56bb",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "style: ruff-format drift in perf_refl_coef_sweep script",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ecaa4a7321bb5e93bd751591af0a318080736236",
          "body": "…solver, now with the batched sweep\n\nDeletes triangular.py (1091 lines), _triangular_kernels.py (272), the\nfour triangular-only C++ kernels (seg_seg_quad_batch_3d,\nseg_seg_reg_quad_batch_1d, assemble_Z, assemble_Z_general) and their\nregistrations, the TriangularSolver export, and the triangular-purp\n[…]\nding the GIL for\ntheir whole fill (caught by the re-targeted GIL probe).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "feat!: retire TriangularSolver — BSplineSolver(degree=1) is the same …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "00026f10044b20b2f514ef1815d6a5be9abff0a6",
          "body": "Formatting-only — no code changes; brings these files back under\nruff format --check ahead of the retirement PR.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "style: ruff-format drift on untouched modules",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1f81af9b7294aee857cd862b2a30c7505fedb6bb",
          "body": "…path\n\nThe assembly was already general (junction directional bases live in\nsupp_seg/polys, consumed as-is by assemble_Z_bspline_swept), so the\nbatched path needed no new C++ — only the KCL constraint solves:\n- _solve_with_kcl_batch / _solve_with_kcl_swept_ports ported verbatim\n  from TriangularSolv\n[…]\nd2's floor is 2.25x (9 vs 4 moment channels). Batched == per-k to 1e-11.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "feat(bspline): batch junctions + multi-port Y through the swept fast …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6df4a85b32a89f0f9ea3ada36c96c4255c7de83",
          "body": "…e / PEC, no junctions)\n\nPost-cherry-pick integration of PR #101's kernels onto post-#125 main:\n- fall back to the per-k loop when ground_eps is set (finite grounds\n  carry per-k ε̃(ω) weights / sommerfeld grids the fast path predates)\n- cancel checkpoint per k-chunk\n- drop the offedge_full/image_fu\n[…]\n\n  × {single, multi-feed}; measured 2.8e-11 worst, 1.8-3.9x on dipole400\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "feat(bspline): guard + test the revived batched swept path (free spac…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6fd1da8ed309621381a5c28b6d6f3e2757ce4a54",
          "body": "…9a+19b)\n\nProof-of-concept of the triangular-style batched swept path for BSplineSolver:\nbuild the whole sweep's J / Z in batched C++ calls and do one stacked LAPACK\nsolve, instead of looping the single-frequency compute_impedance per k. This\nis items 19a + 19b from NEXT_STEPS.\n\nNew C++ kernels (bot\n[…]\nl multi-wire matrices\nbenefit; large single edges are compute-bound and don't. bit-exact (|Δz|~1e-10).\nAll 158 momwire tests pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bspline): fully batched swept solve for the common case (WIP / 1…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f25a861c9ab78753e9fe510e33d1b28c07e37d91",
          "body": "…at production scale\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "docs: phase 0 baselines — bspline swept 7-11x slower than triangular …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1352348719f73f6c9eec282b30ab480632410ad2",
          "body": "…-fed meshes\n\nGate 0 of docs/triangular-retirement-plan.md: 11 transfer-of-trust tests\ncovering dipole/yagi/V/PEC-ground/K=3-junction/multi-feed-Y/swept, plus\nthe odd-N feed-snap convention pin.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "test: tent-parity pins — triangular ≡ bspline d=1 to roundoff on knot…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84b4cb112b8913445a36efee3d3dca3038d08798",
          "body": "…nreachable via the app [skip ci]\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "docs: note antennaknobs enforces d=1 even parity — odd-N feed split u…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bc4f18fb285f779c4be3705d2ab7d52ab084673a",
          "body": "…gs, kernels bit-identical [skip ci]\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "docs: triangular-vs-d1 5% scare resolved — feed convention at odd nse…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "87b3ad7997a272e5bc713edae86d1da9f6bbe4c5",
          "body": "…adrature gate [skip ci]\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "docs: triangular plan — hold behind PR #125, build on PR #101, d=1 qu…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6223310938d9ab5370f6c77684d61f5482567c46",
          "body": "…[skip ci]\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Xx4NrK5t4Xo98jf1MHs8rF",
          "is_bot": false,
          "headline": "docs: triangular retirement plan — batched-sweep transfer to bspline …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T14:32:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "092ff61b4b847b2a5c0169aef726fd846a995bd7",
          "body": "…ed kernel\n\nGeneralizes sommerfeld_remainder_bspline_Q to a rectangular obs/src form\n(separate obs/src node/tang/W + local support maps loc_I/pI, loc_J/pJ).\nThe dense b-spline block is now its symmetric obs==src, loc==supp_seg\ncase; the ACA rectangular sampler _zblock_sommerfeld_remainder (shared by\n[…]\ne fused\npath; added a fused-vs-numpy parity test for each.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013S7p6ZMd8NTiAbU6DLKE7S",
          "is_bot": false,
          "headline": "feat(sommerfeld): route the fast solvers' ACA sampler through the fus…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T05:14:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "237678478c4ca07ebcadd0aa413adeadb44759e3",
          "body": "…se 4b stage 2)\n\nAdds sommerfeld_remainder_bspline_Q: folds the moment quadrature and the\nbasis assembly into the C++ kernel, returning the (n_basis, n_basis) Q\nblock directly. Removes the Jf tensor, both Galerkin einsums\n(piq,iqjr,Pjr and mp,pPmn,nP), and the large J_blk fancy-index gather\nthat the\n[…]\ngn 2\ngates unchanged; full sommerfeld/bspline suite green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013S7p6ZMd8NTiAbU6DLKE7S",
          "is_bot": false,
          "headline": "feat(sommerfeld): fully-fused b-spline Galerkin remainder kernel (Pha…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T05:14:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b26aa1d83e846180be79f29c9ae82b78e82b26a",
          "body": "Ports _sommerfeld.remainder_field_proj (incl. SommerfeldGrid.eval) to a\nnew accelerator kernel remainder_field_proj_batch: per (observer, source)\npair it does the 4x4 Lagrange interpolation of the four grid surfaces and\nthe eqs 143-147 azimuth/tangent projection inline, with no materialized\n(4,n,4,4\n[…]\nalerkin projection (Jf + two einsums), the next increment.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013S7p6ZMd8NTiAbU6DLKE7S",
          "is_bot": false,
          "headline": "feat(sommerfeld): C++ fused remainder-field-projection kernel (Phase 4b)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T05:14:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ca9176573c4de9cbcdd8310d9e779c3fa48953e",
          "body": "Adds Phase 4 to sommerfeld-perf-plan.md. After Phases 1-3 drove the grid\nfill to near-zero (module cache + C++ fill kernel), a fresh profile shows\nthe per-pair remainder assembly (surface interpolation + eqs 143-147\nprojection + Galerkin quadrature) is now ~90% of a warm Sommerfeld solve\nand the who\n[…]\nmpiled fused kernel (4b), landed\nin the following commits.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_013S7p6ZMd8NTiAbU6DLKE7S",
          "is_bot": false,
          "headline": "docs: Sommerfeld perf Phase 4 plan (compiled remainder assembly)",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-09T05:14:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "db93d3aeb55fae598d236b465cad1037f6b9f74e",
          "body": "… pin checklist [skip ci]\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: /release skill — momwire release flow + antennaknobs three-site…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-08T13:41:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "96ef6efb8fbe19d9928b61078f30ef5f5c79cef1",
          "body": "…t solvers)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.8.0 (sommerfeld everywhere: sinusoidal + fas…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-08T03:17:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84804b23bbed42c6d7919251ae29ea12003b7f8f",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "style: ruff format the sommerfeld-everywhere files",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-08T02:31:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "047d0f049a0012cdedb46fd60c0790a6ebb4bea4",
          "body": "…paths\n\nThe NEC decomposition maps cleanly onto the block machinery: the\nsingular part is C2 x the PEC image (one scalar through the existing\nfully-accelerated PEC-image block fills — near dense, far ACA, array\nself/coupling blocks), and the smooth remainder — smooth EVERYWHERE,\nthe image absorbed t\n[…]\nger.\nFast-vs-dense agreement 5e-6 .. 6e-5. Self-block and operator cache\nkeys grew ground_model so sommerfeld blocks never alias refl-coef\nones.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(fast-solvers): Sommerfeld ground on the HMatrix/ArrayBlock fast …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-08T02:31:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7097443a0c9dd2c066ff6bf8e45c7ed12212c2f1",
          "body": "… dyad algebra\n\nOne home for the azimuth/projection combination of the four grid\nsurfaces; the bspline Galerkin block and the sinusoidal remainder\ntensor both consume it, and the fast solvers' rectangular sampler is\nabout to. No behavior change (both sommerfeld suites green).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(sommerfeld): shared remainder_field_proj for the eqs 143-147…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-08T02:31:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7f0bb7133ff3b82a472c710d769fa94eda08cdaa",
          "body": "…erfeld\")\n\nNEC's C2-image + smooth-remainder decomposition on the field-based\nsolver: the exact image is a constant C2 scalar on the projected\nPEC-image tensor (the C++ field-tensor kernel keeps serving it), and\nthe interpolated SommerfeldGrid F dyad becomes a remainder tensor via\nsource-side GL qua\n[…]\nagi 0.21 — the\nsame-basis ~0.1 ohm floor, 20x sharper than bspline's cross-solver\nfloor. Remainder sign pinned by the 0.05 wl cross-solver test.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sinusoidal): Sommerfeld/Norton finite ground (ground_model=\"somm…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-08T02:31:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fe8158047cfa82cc06cee93f96adbd229b1b54d3",
          "body": "Module-level FIFO cache + r1 bucketing move from bspline.py to\n_sommerfeld.py so SinusoidalSolver and the fast solvers can share grid\nfills with BSplineSolver (sommerfeld-everywhere plan Phase 1). Pure\nrefactor: same key, same bound, same eviction; BSplineSolver._somm_grid\ndelegates. Tests repointed at the new home.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(sommerfeld): hoist the grid cache into _sommerfeld.get_grid",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-08T02:31:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7314d234f9a13798317049f972d61d5e0f7a1227",
          "body": "…d simplification)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: sommerfeld-everywhere plan (sinusoidal + fast solvers + fronten…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-08T02:31:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1642a6892d2a5729450473bbd67b04ecea623b62",
          "body": "…kernel)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016thQg6NoZB9ETiWPcyTT25",
          "is_bot": false,
          "headline": "chore: bump version to 0.7.0 (sommerfeld perf: grid cache + C++ fill …",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-07T17:46:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5561a52d1752054e07ea502fa06694ee9f827b83",
          "body": "…des [skip ci]\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016thQg6NoZB9ETiWPcyTT25",
          "is_bot": false,
          "headline": "docs: sommerfeld plan postmortem — default-cost audit on engine upgra…",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-07T17:46:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d6fd405edacc09c223ca0942fea02fc185a463d9",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016thQg6NoZB9ETiWPcyTT25",
          "is_bot": false,
          "headline": "docs: check off phase 6 in the sommerfeld ground plan [skip ci]",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-07T17:46:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "baf682d2a19cf6c2763a9b2f1d1a2bbe0a17b06d",
          "body": "somm_six_integrals_batch takes the standard trailing cancel_flag\n(drain-pattern poll per node, registered in _CANCELLABLE_KERNELS); the\nPython fallback loop polls the same address, _Z_sommerfeld_remainder\ncheckpoints per observer chunk, and a cancelled fill raises before the\ngrid-cache insert so no partial grid is cached.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_016thQg6NoZB9ETiWPcyTT25",
          "is_bot": false,
          "headline": "feat(sommerfeld): cooperative cancellation for the C++ fill kernel",
          "author_name": "Steven Burns",
          "author_login": "stevenmburns",
          "committed_at": "2026-07-07T17:43:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 24,
      "commits_last_year": 382,
      "latest_release_at": "2026-07-29T22:25:16Z",
      "latest_release_tag": "v0.19.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 9,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 1.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "momwire",
          "exists": true,
          "license": null,
          "keywords": [
            "License :: OSI Approved :: MIT License",
            "Operating System :: MacOS",
            "Operating System :: Microsoft :: Windows",
            "Operating System :: POSIX :: Linux",
            "Programming Language :: Python :: 3"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/momwire/",
          "is_deprecated": false,
          "latest_version": "0.19.0",
          "repository_url": "https://github.com/stevenmburns/momwire",
          "versions_count": 19,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 14950,
          "first_published_at": "2026-06-29T20:26:26.627709Z",
          "latest_published_at": "2026-07-29T22:25:48.942392Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 8
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "site/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 166448,
      "source_files_sampled": 91,
      "oversized_source_files": 5,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml",
        "setup.py",
        "site/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "numpy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.21"
        },
        {
          "name": "scipy",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=1.7"
        },
        {
          "name": "@astrojs/check",
          "manifest": "site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.9.4"
        },
        {
          "name": "@astrojs/starlight",
          "manifest": "site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.34.0"
        },
        {
          "name": "astro",
          "manifest": "site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.6.0"
        },
        {
          "name": "sharp",
          "manifest": "site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.33.5"
        },
        {
          "name": "typescript",
          "manifest": "site/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.7.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": 152,
        "open_issues": 7,
        "closed_ratio": 0.696,
        "closed_issues": 16,
        "closed_unmerged_prs": 3
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "stevenmburns",
          "commits": 434,
          "avatar_url": "https://avatars.githubusercontent.com/u/1512574?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy-docs.yml",
        "wheels.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "15 out of 15 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": 0,
            "reason": "Found 0/21 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "13 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "a27772cf2dfa79a390c36f378948f54fdb7cbc24",
        "ran_at": "2026-07-29T22:27:02Z",
        "aggregate_score": 2.6,
        "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-29T22:25:52Z",
      "oldest_open_prs": [
        {
          "number": 102,
          "created_at": "2026-06-24T17:12:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-29T21:40:02Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 156,
          "created_at": "2026-07-16T22:04:28Z",
          "last_comment_at": "2026-07-16T22:28:03Z",
          "last_comment_author": "stevenmburns"
        },
        {
          "number": 159,
          "created_at": "2026-07-19T15:00:51Z",
          "last_comment_at": "2026-07-19T16:10:50Z",
          "last_comment_author": "stevenmburns"
        },
        {
          "number": 161,
          "created_at": "2026-07-19T15:29:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 168,
          "created_at": "2026-07-23T19:23:49Z",
          "last_comment_at": "2026-07-29T10:47:58Z",
          "last_comment_author": "stevenmburns"
        },
        {
          "number": 175,
          "created_at": "2026-07-28T21:24:55Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 176,
          "created_at": "2026-07-28T21:25:18Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 177,
          "created_at": "2026-07-29T02:29:54Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/stevenmburns/momwire",
    "host": "github.com",
    "name": "momwire",
    "owner": "stevenmburns"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 54,
      "inputs": {
        "security": 26,
        "vitality": 72,
        "community": 35,
        "governance": 55,
        "engineering": 71
      },
      "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": 60,
            "inputs": {
              "commits_last_year": 382,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 9
            },
            "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": "9/52 weeks with commits",
                "points": 6.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "382 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 382
                    }
                  }
                ],
                "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": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 24,
              "latest_release_tag": "v0.19.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 1.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "24 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 35,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "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": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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": "good",
            "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": 70,
            "inputs": {
              "packages": [
                "momwire"
              ],
              "dependents": null,
              "ecosystems": "pypi",
              "total_downloads": null,
              "monthly_downloads": 14950
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "14,950 downloads/month across pypi",
                "points": 55.7,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 14950,
                      "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": 55,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "merged_prs": 152,
              "open_issues": 7,
              "closed_issues": 16,
              "issue_closed_ratio": 0.696,
              "closed_unmerged_prs": 3
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "70% of issues closed",
                "points": 32.5,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 70
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "152/155 decided PRs merged",
                "points": 37.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 152,
                      "decided": 155
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/21 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "followers": 31,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "stevenmburns",
              "public_repos": 100,
              "account_age_days": 5257
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "31 followers of stevenmburns",
                "points": 10.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 31,
                      "login": "stevenmburns"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "100 public repos, account ~14 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 100
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "momwire"
              ],
              "ecosystems": "pypi",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "19 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 71,
        "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": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "15 out of 15 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 26,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 26,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 2.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "15 out of 15 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": "Found 0/21 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "13 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "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": 2
            },
            "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": 51,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "site/tsconfig.json"
              ],
              "agent_commit_share": 0.94,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": "site/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "site/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "94 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 94,
                      "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": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 79,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 166448,
              "source_files_sampled": 91,
              "oversized_source_files": 5
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (site/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "site/tsconfig.json",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "5/91 source files over 60KB",
                "points": 52,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 91,
                      "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:momwire@0.19.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T22:27:15.758445Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/stevenmburns/momwire.svg",
  "full_name": "stevenmburns/momwire",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPyPI.