Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 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 зірок⑂ 0 форківз трав. 2026 р.Переглянути на GitHub ↗

stevenmburns/momwire має індекс здоров’я 54 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (72/100), найнижчий — Security (26/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

54
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

54
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Steve BurnsОсобистий обліковий запис
31 підписник100 публічних репозиторіївз бер. 2012 р.

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
PyPImomwire0.19.014 950190 днів тому

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

72Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
6.2/36Ритм комітів — 9/52 тижнів із комітами
18/18Обсяг комітів — 382 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Використані вхідні дані
commits_last_year382
human_commit_share1
days_since_last_push0
active_weeks_last_year9
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 24 релізів
36/36Свіжість релізів — останній реліз 0 дн. тому
27/27Ритм релізів — реліз кожні ~1,9 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count24
latest_release_tagv0.19.0
releases_from_tagsні
days_since_latest_release0
mean_days_between_releases1,9

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

35У зоні ризику · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 0 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
55.7/80Щомісячні завантаження — 14 950 завантажень/місяць у pypi
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagesmomwire
dependents
ecosystemspypi
total_downloads
monthly_downloads14 950
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

55Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
32.5/46.8Вирішення issue — закрито 70% issue
37.5/38.3Прийняття PR — злито 152/155 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/21 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs152
open_issues7
closed_issues16
issue_closed_ratio0,696
closed_unmerged_prs3
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
10.8/25Охоплення власника — 31 підписників у stevenmburns
25/25Послужний список — 100 публічних репозиторіїв, вік облікового запису ~14 р.
Використані вхідні дані
followers31
owner_typeUser
is_verified
owner_loginstevenmburns
public_repos100
account_age_days5 257
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у pypi
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 19 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesmomwire
ecosystemspypi
any_deprecatedні
min_days_since_publish0

Інженерна якість

Чи наявні базові інженерні практики та документація?

71Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 3 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 15 out of 15 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

26Критичний · 16% загального індексу

Стан безпеки

26Критичний
Як обчислюється оцінка
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.5Ліцензія — 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
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate2,6

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

51Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 100 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — site/tsconfig.json
10/10Відтворюване середовище — Dockerfile, lockfile
10/10Підтверджена практика роботи з агентами — 94 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilespackage-lock.json
has_dockerfileтак
typed_languageні
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configssite/tsconfig.json
agent_commit_share0,94
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
27/45Типізований код — Python з конфігурацією перевірки типів (site/tsconfig.json)
52/55Керовані розміри файлів — 5/91 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languagePython
largest_source_bytes166 448
source_files_sampled91
oversized_source_files5
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

Ключові факти

0зірок GitHub
1контриб'юторів
382комітів за останні 12 місяців
0днів від останнього пушу
24релізів
1бас-фактор
7відкритих issue
npm, PyPIпакетних екосистем

Попередження щодо збору даних

  • 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

Докладніше

OpenSSF Scorecard 2.6 / 10
2.6сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).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
Прямі залежності 7
РеєстрПакетОбмеження версіїМаніфест
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
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "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"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаPyPI.