原始 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"
}