Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-25 20:49 UTC

townsendmerino / aikit

Portable Go AI building blocks — pure-Go, no-cgo packages (topk, ann, bm25, embed, encoder, chunk) extracted from townsendmerino/ken's code-search pipeline. Importable by any Go project.

Go · PythonMIT★ 2 Sterne⑂ 0 Forksseit Mai 2026Auf GitHub ansehen ↗

townsendmerino/aikit erreicht einen Gesundheitsindex von 48 von 100 und liegt damit im Bereich Gefährdet. Am stärksten schneidet es bei Vitality (78/100) ab, am schwächsten bei Security (1/100). Zuletzt vor 2 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

48
gesamt / 100
Gefährdet

Software-Gesundheitsindex

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

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

Bewertungsprofil

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

Eigentümerschaft

Francis Townsend-MerinoPersönliches Konto
5 Follower8 öffentliche Reposseit Feb. 2011

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

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Gogithub.com/townsendmerino/aikitv1.11.0-30vor 2 Tagen

Metriken nach Kategorie

Vitalität

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

78Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 2 Tagen
3.5/36Commit-Rhythmus — 5/52 Wochen mit Commits
18/18Commit-Volumen — 227 Commits im letzten Jahr
0/10OpenSSF Scorecard: Maintained — keine Daten
Verwendete Eingangsdaten
commits_last_year227
human_commit_share1
days_since_last_push2
active_weeks_last_year5

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 18 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 2 Tagen
27/27Release-Rhythmus — ein Release etwa alle 4,5 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count18
latest_release_tagv1.11.0
releases_from_tagsnein
days_since_latest_release2
mean_days_between_releases4,5

Community & Verbreitung

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

24Kritisch · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 2 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

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

46Gefährdet · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0.1/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
2.7/13.5Breite der Beitragenden — 2 Beitragende
0/10OpenSSF Scorecard: Contributors — keine Daten
Verwendete Eingangsdaten
bus_factor1
contributors_sampled2
top_contributor_share0,996
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
5.6/25Reichweite des Inhabers — 5 Follower von townsendmerino
18.9/25Kontohistorie — 8 öffentliche Repos, Kontoalter ca. 15 Jahre
Verwendete Eingangsdaten
followers5
owner_typeUser
is_verified
owner_logintownsendmerino
public_repos8
account_age_days5.638
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 2 Tagen
20/20Versionshistorie — 30 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/townsendmerino/aikit
ecosystemsgo
any_deprecatednein
min_days_since_publish2

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

78Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — .golangci.yml
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

1Kritisch · 16 % des Gesamtindex
Wie die Bewertung erfolgt
0/30Sicherheitsrichtlinie (SECURITY.md)
0/25Dependabot-Konfiguration
0/25Lockfiles für Abhängigkeiten — veröffentlichte Bibliothek — Lockfiles sind Sache der Anwendung, hier nicht erwartet
0/20CodeQL-Workflow
Verwendete Eingangsdaten
sourcefile_signals
lockfilesgo.sum
manifestsbenchmarks/go.mod, go.mod, scripts/requirements.txt
has_codeql_workflownein
has_security_policynein
has_dependabot_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Lockfiles für Abhängigkeiten. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

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

67Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 99 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — benchmarks/go.mod, chunk/treesitter/go.mod, examples/embedded-corpus/go.mod (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — .golangci.yml
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 99 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — keine Daten
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,99
toolchain_manifestsbenchmarks/go.mod, chunk/treesitter/go.mod, examples/embedded-corpus/go.mod, go.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
55/55Handhabbare Dateigrößen — 0/296 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes36.183
source_files_sampled296
oversized_source_files0
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

2GitHub-Sterne
2Mitwirkende
227Commits, letzte 12 Monate
2Tage seit letztem Push
18Releases
1Bus-Faktor
0offene Issues
Go, PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • OpenSSF Scorecard did not return a usable result (2026/07/25 20:49:36 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks

Weitere Details

Direkte Abhängigkeiten 2
RegistryPaketVersionsvorgabeManifest
Gogolang.org/x/sysv0.47.0go.mod
Gogolang.org/x/textv0.40.0go.mod
Alle Abhängigkeiten nicht erhoben

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

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 6131,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 1089858,
        "Shell": 4953,
        "Python": 163624,
        "Assembly": 30881
      },
      "pushed_at": "2026-07-23T03:32:19Z",
      "created_at": "2026-05-31T04:19:55Z",
      "owner_type": "User",
      "updated_at": "2026-07-23T02:34:41Z",
      "description": "Portable Go AI building blocks — pure-Go, no-cgo packages (topk, ann, bm25, embed, encoder, chunk) extracted from townsendmerino/ken's code-search pipeline. Importable by any Go project.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Francis Townsend-Merino",
      "type": "User",
      "login": "townsendmerino",
      "company": null,
      "location": null,
      "followers": 5,
      "avatar_url": "https://avatars.githubusercontent.com/u/620372?v=4",
      "created_at": "2011-02-16T02:25:11Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 5638
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": null,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2026-07-23T03:32:45Z"
        },
        {
          "tag": "v1.10.1",
          "kind": "patch",
          "published_at": "2026-07-20T15:14:39Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-07-18T15:56:39Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-06-17T22:51:54Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2026-06-15T04:02:39Z"
        },
        {
          "tag": "v1.7.3",
          "kind": "patch",
          "published_at": "2026-06-13T15:07:24Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2026-06-13T01:33:11Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2026-06-12T22:51:06Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-06-12T22:12:08Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-06-12T18:18:07Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-06-11T21:10:21Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-06-11T12:41:10Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-06-10T19:32:48Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-06-10T15:51:28Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-06-10T15:37:57Z"
        },
        {
          "tag": "chunk/treesitter/v1.0.0",
          "kind": "other",
          "published_at": "2026-06-06T22:34:05Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-06-06T22:33:50Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-06-03T17:25:04Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "cfda9684b68353a790ff4d6b1dfb9bff3dfce445",
          "body": "…Windows CI)\n\nTestEmbedderCoverage_fresh compared the committed docs/embedder-coverage.md\nbyte-for-byte against freshly generated markdown (always LF). With no\n.gitattributes, a Windows checkout stores the doc as CRLF, and bytes.TrimSpace\ndoes not touch interior newlines — so the gate reported the t\n[…]\n fighting the smudge filter.\n\nVerified by converting the doc to CRLF locally and confirming the gate still\npasses, then restoring LF (no diff).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(encoder): make the coverage freshness gate line-ending agnostic (…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-23T02:34:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b59e58c92e6dca341f43ff272c012b8df905dedb",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: set v1.11.0 CHANGELOG date to the release day",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-23T02:27:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7fc33df9a5e399a5052ae3547f25a78e7499e37c",
          "body": "… kit\n\nCodifies the rule the review2 §4 naming pass applied: a name is sized to its\nscope, consistent with its neighbours, and unambiguous in context — not long by\ndefault. Explains why M/N/K/q/k/v/ggml block fields are correct as-is in the\nkernels (they mirror the reference notation one-to-one), wh\n[…]\nd cases), and the house vocabulary a reviewer should leave\nalone. So the next reviewer flags the right things and stops \"make it longer\"\nchurn.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add why-short-variable-names — the naming philosophy behind the…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-23T02:24:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3769b9973c314e76ac284bb943135876834a3890",
          "body": "…nsumer\n\nlinalg.WeightMat was written to consolidate three open-coded wrappers that each\nheld an f32/int8/int4 weight plus scales plus a precision-dispatched MatmulBT.\nTwo had landed (aikit encoder.LayerWeightsQ8; goinfer decoder.weightMat, whose\ntype is now gone). vision.qmat was the last, and beca\n[…]\n what §2.7's note anticipated.\n\nCommits docs/task-native-gpu.md, until now untracked, since Phase 0 (\"finish\nthe seam\") is what this completes.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "vision,linalg: finish the WeightMat unification — migrate the last co…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-22T05:07:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7d5378a150ff0b3c8d24dbc326d69916ef13d49a",
          "body": "The embedder-coverage release: pure-Go SentencePiece/Unigram tokenizer, MoE FFN,\ndeclared pooling + explicit BERT loader variants, six newly certified embedders\n(certified set 2 -> 8), the generated coverage table, and encoder.MatryoshkaFloor.\n\nMinor, not patch: new exported API and new capabilities\n[…]\n a caller's perspective — apidiff confirms no incompatible\nchange in any Hard-tier package vs v1.10.1.\n\nPrep only; the tag is not created here.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add CHANGELOG section for v1.11.0",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-22T00:46:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d471b13c4567bbdc332ba3fff39c05a03864517c",
          "body": "… bad truncation\n\ndocs/embedder-coverage.md's Truncatable column already says a serve layer \"must\nnot honor a `dimensions` request blindly — check this column\", but the column was\ndocumentation plus a test-only registry (covRow.MRLMin), so nothing downstream\ncould actually check it.\n\nMatryoshkaFloor\n[…]\nrresponds to a certified row (no unmeasured claims), and\nthat bare names stay unambiguous. Break-it-first: changing a floor 64→32 turns it\nred.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(encoder): export the Matryoshka floor so serve layers can refuse…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T16:43:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "44b679f0ba4e93a22cc3b6c2faff9642273631dc",
          "body": "…e the caveats\n\nThe task doc's last open risk was advisory: \"Matryoshka dimensions semantics\ndiffer per model — honor each model's documented supported dims rather than\ntruncating blindly, or you'll return degraded vectors that look fine.\" Advice\ndoesn't stop anyone, so make it data.\n\nembedder-cover\n[…]\n.\n\nRemaining risk is noted where it actually lives — goinfer's resolveDimensions\ntruncates any model on request and should consult this column.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs,encoder: turn the Matryoshka caveat into a measured column; clos…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T16:31:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd5b39bc8f8d2f3358899ff6b46350c39db89df1",
          "body": "Closes the task doc's last item (\"coverage claim, generated not hand-maintained\").\ndocs/embedder-coverage.md is rendered from a registry in encoder/coverage_test.go\n— 8 certified embedders with architecture, loader, pooling, tokenizer, dims, and\nthe parity test that gates each one.\n\nA table is only \n[…]\n gitignored).\n\nThe freshness gate was itself break-it-first checked: appending a line to the doc\nturns it red, and regenerating turns it green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: generated embedder-coverage table, defended against rot three ways",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T16:20:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "70467a34c8dbbd183a26c2855957fb45b97a10c5",
          "body": "…cket C)\n\nThe last embedding-coverage bucket. Reading the config first corrected the\nplan twice: v2-moe is a nomic_bert (not a plain BERT), so RoPE/post-norm came\nfree from the certified v1.5 path and its XLM-R SentencePiece tokenizer came\nfree from the Phase-2 Unigram work — but it needed THREE new\n[…]\nd of top-2, and forcing all tokens to one expert, both diverge by\n~2-7 vs a 2e-05 baseline. All previously certified paths unchanged and green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: mixture-of-experts FFN — certify nomic-embed-text-v2-moe (Bu…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T16:10:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0820fb3e729044fd093e13f6adeeaee19da50131",
          "body": "… met\n\nDecoder-as-embedder landed and was certified in goinfer (9168f82):\nQwen3-Embedding-0.6B at cosine 1.0000000 via last-token pooling over a new\ndecoder.HiddenLast seam, behind a decoderEmbedder implementing aikit's\nencoder.Encoder — no aikit change required, as the bucket predicted.\nembeddingge\n[…]\nd B\nland\"), so note C as unblocked-but-not-started, with the standing reminder to\nread nomic-embed-text-v2-moe's config.json before scoping it.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: record Phase 3 (Bucket B) done in goinfer; C's precondition now…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T15:37:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c349859bfc0c0764aab2eb20c6f2dbf70bf35dc",
          "body": "Decoder-as-embedder is goinfer-side work (the seam is aikit's encoder.Encoder\ninterface, which a decoder-backed embedder implements), so the spec and status\nlive in goinfer docs/task-decoder-as-embedder.md. Cross-reference it so the\nbucket isn't orphaned. Nothing in aikit changes for it.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: point Bucket B at the goinfer task doc that now tracks it",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T15:05:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "555720136f537c5f198cab2f0eb9a9163ba13c6e",
          "body": "…er/pre-tokenizer\n\nbge-m3 (24-layer XLM-R, 1024-dim, CLS-pooled — the flagship multilingual\nretriever) uses two tokenizer.json shapes the initial Unigram port didn't cover,\nso generalize the parser (no change to the XLM-R/e5 path, which stays green):\n\n  - Normalizer as a Sequence: walk it, supportin\n[…]\n.\n\nbge-m3 ships only pytorch_model.bin — convert to model.safetensors for LoadBERT.\nWith this, every same-repo Phase-1/2 embedder is certified.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed,encoder: certify bge-m3 full-stack; generalize Unigram normaliz…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T14:17:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f780f2677024db112c2bd3d798574d6e8048bbd",
          "body": "…full stack\n\nThe XLM-R work so far certified the tokenizer (embed) and the forward+offset\n(xlm-roberta-base, a bare LM) separately. multilingual-e5-base closes it into\none gate: a genuine sentence-transformers embedder — XLM-R (posOff=2),\nSentencePiece/Unigram tokenizer, mean-pool head — so a single\n[…]\nnd to end).\nBreak-it-first: CLS-instead-of-mean and offset-zeroing both diverge.\n\nbge-m3 reuses this exact path (larger XLM-R, dense/CLS head).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: certify multilingual-e5-base — first multilingual embedder, …",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T04:33:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b586406a853c570aeef52ad763a494e43a9821c",
          "body": "…10.1)\n\nEvery finding (§2.1–2.6 incomplete-fixes, §3 F1–F5, §4 naming) was applied and\nreleased; the review artifact's job is done and its content lives in git history.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove CODE_REVIEW.md — 2nd-pass review items all shipped (v1.…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T04:27:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da0463b007bcb3905bce2fcb14f3f527db11d55e",
          "body": "aikit was WordPiece-only, which blocked end-to-end multilingual/XLM-R support\n(every XLM-R/bge-m3/multilingual-e5 tokenizer is SentencePiece/Unigram). Add a\npure-Go port of HF tokenizers' Unigram pipeline, dispatched from LoadTokenizer\nby tokenizer.json shape with no public API change:\n\n  - Precompi\n[…]\nencodeTokenizer certifies text→ids end-to-end\n(the forward on those ids was already certified). bge-m3 / multilingual-e5\nreuse this exact path.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed: pure-Go SentencePiece/Unigram tokenizer; certify XLM-R end-to-end",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T04:25:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b191dab8bd07bafd5e38f4415125d2ae804c1b8d",
          "body": "…okenizer\n\nXLM-R numbers learned positions from padding_idx+1 (posOff=2), where BERT\nstarts at 0 — a silent-wrong if missed. Certify that path against a real\nreference (FacebookAI/xlm-roberta-base): forward on golden HF input_ids,\nhidden-state maxΔ 1.7e-05 over 6 cases (incl. non-Latin), with break-\n[…]\npts/pin_xlmr.py: HF AutoModel golden (input_ids + last_hidden_state)\n- docs/task-embedding-coverage.md: correct tokenizer claim; status section\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: certify XLM-R position-id offset forward-only; best-effort t…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-21T03:38:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2d65885375ed0547a38105365d61bc38e46caa6e",
          "body": "… embedder (embedding-coverage §Phase1)\n\nSecond Phase-1 representative certified, and the one that exercises the Nomic\nloader's declared-pooling change (dbec090) on a real model. nomic-embed-text-v1.5\nis the same nomic-bert architecture as CodeRankEmbed (RoPE, SwiGLU) but pools\nMEAN instead of CLS —\n[…]\ntural shapes (BERT-cls, BERT-mean, nomic-rope-mean) are now gated\nagainst real references. go test ./encoder/ + golangci(0) green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: certify nomic-embed-text — the mean-pooled nomic-bert (RoPE)…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T23:41:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "27f3bb8ae0ddd1eb4aa5f12a5dca2f9b51bdf2a0",
          "body": "…real reference (embedding-coverage §Phase1)\n\nFirst Phase-1 representative taken from \"loader-ready\" to CERTIFIED. bge-small\n(BAAI/bge-small-en-v1.5) is the same BERT architecture as all-MiniLM (learned-\nabsolute positions, GELU FFN, WordPiece) but pools CLS instead of mean — so it\nexercises the dec\n[…]\nsafe). go test ./encoder/ +\ngolangci(0) green. This is the first model the task's gate discipline certifies\nas actually supported.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: certify bge-small — the CLS-pooled BERT embedder, against a …",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T16:58:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4228bafb6cce67cf76a28715f4ea4907ad754c93",
          "body": "…nal token_type (embedding-coverage §Phase1)\n\nPhase 1 item 1 (\"make the implicit explicit\"): the BERT loader baked in three\nassumptions. Two are now config-driven declarations, defaulting to BERT so\nall-MiniLM stays bit-identical (parity green):\n\n- **Position-id offset.** RoBERTa/XLM-R number learne\n[…]\n guard) and TestBERT_loaderVariantsFromFixture. The\nactual XLM-R / no-token-type models stay Phase-2, gated on their own fixtures.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: make BERT loader variants explicit — position offset + optio…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T16:10:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dbec090ab216584a8338e0cc43595e8b08a29c52",
          "body": "…e §Phase1)\n\nCompletes item 2 across both loader families: the Nomic/CodeRankEmbed path\n(LoadWeightsFromFS) also read no pooling — it left Config.pooling the zero value\n(CLS). nomic-embed-text pools MEAN, so it would have silently mispooled.\n\nAdded an fs.FS reader (poolingFromFS, sharing poolingFrom\n[…]\nonfig.json is present and\ndeclares mean — which CodeRankEmbed's isn't. build/vet/golangci(0) + the full\nlocal encoder suite green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: declared pooling for the Nomic loader too (embedding-coverag…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T15:50:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b402318dd36b09f3e6eaa0a573c80d24893094d5",
          "body": "…overage §Phase1)\n\nFirst step of the embedding-model coverage work (docs/task-embedding-coverage.md\nPhase 1, item 2): pooling was implicit — BERT.Embed hardcoded mean, so a CLS-\npooled embedder (BGE, and most rerankers) would silently pool the wrong token\nand return plausible-but-wrong vectors. Now \n[…]\nlangci(0) green.\n\nThis unblocks the CLS-pooled representatives (BGE) with no forward change — only\nthe declared reduction differs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: make BERT pooling a declared per-model property (embedding-c…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T15:47:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a5e9be1f184080c40f853d199bb6b7d6f3168773",
          "body": "The second-pass review fixes: the treesitter parse-timeout guard regressed by\n1.10.0's gotreesitter bump, the two matmul entries + three embed-gather sites\nthat missed the 1.10.0 M2/OOB-token fixes, the Qwen H7/H8 parity gaps, the\nsafetensors mmap-lifetime hole on the bare Tensor accessors, HNSW Load mL\nvalidation, and robustness/naming minors. Adds the [1.10.1] section + compare\nlink the release gate requires.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add CHANGELOG section for v1.10.1",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T15:12:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da0c723b3a43d5e556e563fa1ef7f0a0b600368f",
          "body": "The review found naming healthy overall (domain shorthand M/N/K, i/j/k, q/k/v,\nef/mL left alone) with friction in ~a dozen local spots. All renames below are\nunexported/local — purely syntactic, no behavior change (tests + golangci green):\n\n  encoder/bert.go     hd → headIdx        (head INDEX; hd i\n[…]\nlc → cmtMark (lc collided with line-chunker)\n  ann/hnsw_persist    (*hcur).count → readLen (clashed with (*HNSW).count = #vectors)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "all: local variable-naming clarity renames (review2 §4)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T15:06:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bf9700320de184517afaab25daa81d93c6e78724",
          "body": "…esitter bump (review2 F4)\n\nF4 flagged the gotreesitter 0.20→0.40 bump (shipped in v1.10.0) as carrying an\nunverifiable timeout-semantics assumption. Investigated: it silently changed.\n\n  - 0.20: pool.Parse returned a non-nil ERROR on timeout.\n  - 0.40: pool.Parse \"preserves tree-sitter's native par\n[…]\nte-fidelity + -race green.\n\nNote: v1.10.0 shipped with this latent regression — warrants a v1.10.1 alongside\nthe review2 §2 fixes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chunk/treesitter: restore the parse-timeout guard broken by the gotre…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T14:59:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2455e274b138603375c881a236b2198b7d750d3a",
          "body": "…2 §3)\n\n- F3 (encoder): BERT.hiddenStates now truncates ids/segs to maxSeq. The exported\n  Embed takes raw ids with no documented limit, so len(ids) > MaxPos gathered\n  posEmb out of range (Encode was safe — it truncates upstream; NomicBERT is\n  immune, RoPE has no fixed table). Single choke point c\n[…]\n.go's non-existent Config.Heuristic doc\n  refs fixed.\n\nTests: TestTensor_ElementsOverflow. go test ./... + golangci-lint(0) green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed,encoder,linalg,ann,mmap,chunk: fresh findings F1–F3, F5 (review…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T14:33:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "35846dbedaebfc74de08e6745113fec5358b00e3",
          "body": "§2.5 — H6 (mmap use-after-unmap) covered TensorF32 and RowDequantizer but left\nthe bare per-Tensor byte accessors open: `t, _ := f.Tensor(\"w\"); t.BFloat16sToF32()`\ndrops the file reference before the decode loop runs, so the finalizer could\nmunmap mid-read → SIGSEGV. Fixed structurally rather than p\n[…]\nAdd+Query clean). embed -race + ann suites green. §2.5 is a latent\nGC-timing guard (no deterministic test), verified structurally.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed,ann: close the two structural residuals (review2 §2.5, §2.6)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T14:28:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e1e03bb41fbc6962f012d49e2e2150d2b0d92cc",
          "body": "…2.4)\n\nH7/H8 lifted SigLIP + both towers' validate() to the text encoder's standard,\nbut the Qwen tower trailed on four points the mandate covered.\n\n- patch_embed.proj.weight was loaded with no want-dims while SigLIP passes its\n  conv shape. Now shape-checked against the 5-D Conv3d shape\n  [hidden, \n[…]\n Now rejected.\n\nTests: TestQwenEncoderConfig_validate extended with headDim%4 / temporal / bad-act\ncases. go test ./vision/ green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "vision: bring the Qwen2.5-VL tower to the H7/H8 parity bar (review2 §…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T14:21:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a6a9757820fe24eef6e9ec841054bd7273a993c",
          "body": "…s (review2 §2.1–2.3)\n\nThe first review's fixes were applied to the named site but not to structurally\nidentical siblings, reintroducing the exact classes they closed. Second-pass\nreview §2.1–2.3.\n\n§2.1 — MatmulBTW8A8Batch skipped the shape guard. MatmulBTQ8/W8A8/W8A8Into got\nthe pre-fan-out checkMa\n[…]\ntended to MatmulBTAcc64 + MatmulBTW8A8Batch;\nTestClampTokenID covers the small-vocab OOB case. go test ./encoder/ ./linalg/\ngreen.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg,encoder: finish the M2/OOB-token fixes at their missed sibling…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-20T14:18:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a4a69eec71a71db0a6fd155dd53b065770a4b53",
          "body": "The security-review hardening (H1–H8 untrusted-input boundary + M-series),\nthe additive API (MatmulBTW4A8Into, Close() on the text models), arm64 CI,\nstaticcheck, the BERT/W4A8 perf wins, and the toolchain/dependency refresh.\nAdds the [1.10.0] section + compare link the release gate requires.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add CHANGELOG section for v1.10.0",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T15:52:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f950e08b0c27b36166a2762ef1880c954c4a2d9",
          "body": "…ule)\n\nCatches the quarantined tree-sitter runtime up 20 minor versions. gotreesitter\nis pre-1.0 / single-maintainer (ADR-010), and the treesitter chunker's exact\nbyte boundaries are explicitly BEST-EFFORT, NOT 1.0-committed — so this can\nshift some chunk boundaries on real code. The load-bearing co\n[…]\nst/etc. smoke parses; build + -race green on the submodule.\nIsolated to the quarantined module, so the pure-Go core is unaffected.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(deps): bump gotreesitter 0.20.2→0.40.0 (chunk/treesitter submod…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T15:48:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cd65eec06acd33a2a2b5e59d09625fc746cb7c96",
          "body": "Routine dependency refresh ahead of the release. x/text is the only allowed\ncore dependency (release-gate invariant); x/sys is used by the mmap leaf on\ndarwin only (invisible to the Linux core-dep graph). No API changes touched;\nbuild/vet/golangci-lint(0)/-race green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(deps): bump golang.org/x/text 0.37.0→0.40.0, x/sys 0.45.0→0.47.0",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T15:48:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6dc3422a39e3ff37ef29cb9919b3029bb3785c9c",
          "body": "`go fix ./...` on the root + chunk/treesitter modules under the 1.26.5\ntoolchain. Mechanical, semantics-preserving modernizers:\n  - clamp if-blocks → min()/max() builtins (ann/flat_i8_mmap.go, mmap/align.go)\n  - `for i := 0; i < N; i++` → `for i := range N` (chunk/treesitter, vision)\n  - `for _, x :\n[…]\nhe_test.go — avoids the intermediate slice)\n\nNo behavior change. gofmt/vet/golangci-lint(0)/go test on the touched packages\ngreen.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: go fix — min/max builtins, range-over-int, strings.SplitSeq",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T15:40:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1b0633bd95ffe07503d1326ee0fd200c670f67b",
          "body": "…erred §5)\n\nForward's CPU path open-coded the exact im2col patch extraction that GridPatches\n(gpu_export.go) already implements — the resident path calls GridPatches, the\nCPU path had a verbatim copy. Call GridPatches from both. Byte-identical\nextraction (same (c,kh,kw)/(gh,gw) loop). Documented that Forward is safe to\ncall concurrently but not alongside EnableResident/Close, which write e.resident\nunsynchronized.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "vision: dedup Forward's im2col via GridPatches + concurrency doc (def…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T15:28:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "31eefe7f189758b09e07e7a767fecea6e132fb2f",
          "body": "…ew §4)\n\nMatmulBTW4A8 documented itself as the \"fast M=1 (decode) path\" yet allocated\naq := make([]int8, M*K) + aScales := make([]float32, M) every call, so an int4\ndecode loop paid ~K bytes × ~7 projections × layers per token in GC pressure —\nexactly the alloc the W8A8 path was re-engineered away w\n[…]\nloseToF32) green,\naikit_checks green. BenchmarkW4A8_allocVsInto at M=1 K2048×N2048: 2 allocs\n(2052 B) → 0 allocs, ~182µs → ~175µs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: add MatmulBTW4A8Into zero-alloc decode variant (deferred revi…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T15:23:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a857a1f3556ddbb23cee222a5e65ebea66589a69",
          "body": "The BERT forward (also SPLADE/CrossEncoder, which route through\nBERT.hiddenStates) allocated qH/kH/vHT plus an L² scores buffer per\n(layer, head) and Q/K/V/ctx/attnOut/inter/ffn per layer, all through the\nallocating matmulBT — ~432 small mallocs per single-sequence forward, the exact\nGC pressure the\n[…]\nine its own scratch).\n\nBenchmarkBERT_embed: 432→3 allocs/op (the forward now allocates only h, the\npooled vector, and its l2norm).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: BERT attention through the scratch arena (deferred review §4)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T15:17:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b2d8268f9fbc757c6034ba026e40542602c3ee4e",
          "body": "- linalg/dot.go: dotF32's panic said \"encoder:\" (every other panic says\n  \"linalg:\") and a comment named a private repo (\"ken's matmul shapes\").\n  Corrected the prefix and scrubbed the name.\n- linalg/doc.go: \"the parallel and blocked paths are bit-identical to the serial\n  scalar reference … exact e\n[…]\n/CrossEncoder/\n  SPLADE) so the following method's godoc isn't absorbed (ST1020).\n\ngofmt/vet/golangci-lint(0)/go test ./... green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "polish: doc scrubs, contract corrections, small guards (code review §5)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:58:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "629fda1127e7e92e90d080c3cd37c1d56d868a7f",
          "body": "…oc (§4)\n\n- Exported Close() on Model, BERT, CrossEncoder, SPLADE. The f32 text models\n  retained their mmapped safetensors for life — the only deterministic unmap was\n  the unexported st.Close() the tests reached into, so a long-running server\n  swapping models kept ~547 MB mappings alive until a G\n[…]\n]) rotates into itself, so\n  no scratch is needed; bit-identical (a+(-b)·s == a−b·s in IEEE).\n\ngo test ./encoder/ ./vision/ green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder,vision: lifecycle Close, longest_first truncation, rotary all…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:47:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20548bb6a9733d9e4572ea5b35f4362265f022b4",
          "body": "Defensive fixes so a mismatched/corrupt checkpoint errors or degrades cleanly\ninstead of panicking or silently miscomputing.\n\n- bert maxSeq: b.maxSeq took sentence_bert_config's max_seq_length verbatim with\n  no min(…, MaxPos) clamp, so a config exceeding max_position_embeddings indexed\n  posEmb OOB\n[…]\nps` entries and winIdx[g] indexed OOB.\n  Validate each grid entry (and reject negative dims).\n\ngo test ./encoder/ ./vision/ green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder,vision: checkpoint-robustness minors (code review §4)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:44:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "32a057538b7d72b71cb4435edb7aed75ac38b5c9",
          "body": "- ann/hnsw NewHNSW: Config{M:1} passed the `<= 0` default guard, then set\n  mL = 1/ln(1) = +Inf, so randomLevel's int(-ln(U)·mL) overflowed\n  (MinInt64/MaxInt64) and make([][]int32, level+1) panicked on the FIRST Add —\n  with a message giving no hint the cause was M=1. Clamp M to >= 2 (a\n  1-neighbo\n[…]\numped-over line starts record\n  the current depth.\n\nTests: TestHNSW_M1DoesNotPanic; go test ./ann/ ./chunk/... + regex fuzz green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ann,chunk: fix HNSW M=1 panic + regex line-continuation depth bug (§4)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:38:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "db7b99125cbbc2bfb641c6eac65e5561cc0848e2",
          "body": "- topk NaN (topk.go): at capacity, `score <= min` is false for NaN, so a NaN\n  item always evicted the true minimum and then poisoned every later sift (all\n  comparisons against NaN false) — Result could return NaN entries while real\n  high-scorers were dropped. BM25/dot scorers produce NaN from deg\n[…]\nmat it maps has an\n  ≥8-byte prefix).\n\nTests: topk NaN-rejection, DotI8 length-mismatch panic; go test ./... +\naikit_checks green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg,topk,mmap: correctness + perf minors (code review §4)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:32:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dda6edbfe467fff56ea350a8392013083aa797ef",
          "body": "Small hardening in the GGUF/safetensors parsers, matching the review.\n\n- gguf maxElems: the dim-overflow bound assumed ≥0.5 B/element (2×|data|), but\n  Q2_K is ~0.33 B/elem and IQ2_S ~0.32, so a legitimate Q2_K/IQ2_S tensor\n  occupying >~65% of the data section was falsely rejected (tensorBytes woul\n[…]\nbyte was corrupt.\n  Switched them (and parseShardIndex's two errors) to wrap ErrFormat.\n\ngo test ./embed/ + GGUF fuzz smoke green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed: parser-robustness minors (code review §4)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:27:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ce016632d8c3e2517fd65698c03e38ba6506255b",
          "body": "treesitter and markdown converted a span/chunk byte offset to a line number by\ncounting newlines from byte 0 every call — O(Σ offsets) ≈ O(N²/chunkSize).\nNegligible at 100 KB, ~0.5s at 1 MB, tens of seconds on a multi-MB generated\n.js/.ts file — dwarfing the 1-second parse timeout the treesitter pac\n[…]\nopment\nconfirmed an off-by-one in the section base line, since fixed). go test ./... +\n11s markdown fuzz + treesitter suite green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf: O(N) chunk line numbering (review M5)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:23:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9fa211aebe5dff93a3a30a132212e5fd786f27f7",
          "body": "The CI matrix was amd64-only (ubuntu + windows), yet arm64 is the primary\ndeployment arch — every tuning note references an M1 Pro. So on every CI run the\nNEON f32/i8/SDOT/W4A8 asm, the Dot2x8 pair path, packedFill, detectDotProd, and\n(critically) the exact-equality M-invariance / width-invariance /\n[…]\n vet, -race test, and the aikit_checks contract build, so\nthe NEON kernels and bit-identity gates run on real hardware at PR time.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: run the root module on arm64 (review M4)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:23:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "41d1b2c1b749ca07eff5cd9286dad742eab37c0e",
          "body": "M1 — arm64 Dot4x4/Dot8x4 godoc described a sums layout the kernel doesn't\nproduce. The exported doc claimed each row's full sum lands \"in the first lane\nof its 4-lane block (the rest zero)\" — true on generic/AVX2, FALSE on arm64,\nwhere dot_arm64.s leaves four raw partial-sum lanes. An external calle\n[…]\nenation is a superset, and a resolve-by-line consumer must tolerate the\noverlap on fallback files.\n\nDocs only; no behavior change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: correct two exported-contract docs (review M1/M3)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:23:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4892831b8ef8b840c4f38c4a19eab03a1b5552ba",
          "body": "The vision loaders skipped the validation the text encoder earned, so a\nmismatched or hostile checkpoint panicked (not errored) at load or Forward.\nBrought both towers (SigLIP LoadEncoder, Qwen2.5-VL LoadQwenVisionEncoder) up to\nthe text encoder's bar.\n\nH7 — pass known dims to TensorF32.\n  get()/qm(\n[…]\nnd asserts LoadEncoder returns an error rather than panicking.\ngofmt/vet/golangci-lint(0)/go test ./... and -race on vision green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "vision: shape-check tensor loads + validate config (review H7/H8)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T14:05:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06b781e0d464575f18c61e810367ffc808caccfa",
          "body": "The memory-safety pass from the 2026-07-18 review — the two places the\n\"pure-Go, memory-safe\" promise had a hole. Neither fires on the aligned,\nkept-alive common path (why the tests were green); both are reachable and are\nsegfaults/throws in otherwise-correct code.\n\nH3 — safetensors typed accessors \n[…]\nfensive guard covered by the\nexisting mmap/lifetime suites. gofmt/vet/golangci-lint(0)/go test ./... and\n-race on embed+ann green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed,ann: fix the two mmap/unsafe memory-safety holes (review H3/H6)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T13:50:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1f1dc82ae240a4fc92f51ca6eadba424f049a29c",
          "body": "…iew H2/M2)\n\nTwo coupled findings from the 2026-07-18 review. H2 makes a hostile safetensors\nheader fail at parse instead of at inference; M2 makes the shape-violation\npanics that H2-class inputs trigger *recoverable* instead of uncatchable\nworker-goroutine crashes. Per the review, kept the panic mo\n[…]\nr() catches the panic; overflow + constructor\nrejection. gofmt/vet/golangci-lint(0)/go test ./... and -race on linalg+embed\ngreen.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg,embed: shape/dtype validation + recoverable matmul panics (rev…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T13:42:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e289d92ec411560e2237bea8771a15a98903fdc4",
          "body": "Three self-contained parser guards from the 2026-07-18 code review — the\ncrash/traversal class. aikit is the untrusted-input boundary for the ecosystem\n(every hostile GGUF/safetensors byte and persisted index routes through here),\nand the clamp discipline the GGUF byte cursor already has was not uni\n[…]\nlangci-lint (0), go test ./... and -race on\nembed/+ann/ all green. Comments/guards only — no behavior change on\nwell-formed input.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed,ann: harden untrusted-input parsers (code review H1/H4/H5)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-18T13:14:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fbecab3988bead5d50f38ca605a8ec50bba6ca55",
          "body": "`go fix ./...` on both modules (root + chunk/treesitter). Purely mechanical,\nsemantics-preserving rewrites the 1.26.5 toolchain now applies:\n  - `for i := 0; i < N; i++` → `for i := range N` (range-over-int, Go 1.22)\n  - `for i := 0; i < N; i++` with an unused index → `for range N`\n  - a linear-sear\n[…]\ncturing\nthe kernels). Full suite + golangci-lint green after.\n\nKept separate from the docs/CI commits since it is unrelated churn.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: go fix — range-over-int and slices.Contains modernization",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-16T15:42:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "caf06a52b002e59c03c108564f3a744abc6dd426",
          "body": "Wires golangci-lint into the core CI job, pinned to the same action major and\nversion ken uses (golangci-lint-action@v9, v2.11.4) with a .golangci.yml\nmirroring ken's conservative posture — errcheck, govet, ineffassign,\nstaticcheck, unused — so the packages that moved between the two repos\n(ADR-034)\n[…]\nfiles by design.\n\ngo vet, go build, gofmt, go test ./... (root + treesitter submodule) and the\n-tags aikit_checks build all green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add staticcheck via golangci-lint",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-16T15:42:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c4fd1a04a8706522a384abf476a2cfb2809360b",
          "body": "Doc comments render on pkg.go.dev, but ~27 of them cited repo-relative\nmarkdown that does not exist in aikit: ann/, bm25/ and chunk/ came from ken\n(ADR-034) and kept pointing at ken's docs/DESIGN.md + docs/BENCH.md, vision/\npointed at goinfer's docs/multimodal.md, and encoder/ pointed at a ken memo.\n[…]\non): a ref to a gitignored-but-present file passes it while\nstill being a dead link. Audited with a git-tracked check too — clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix dangling doc refs after the ken→aikit package move",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-16T15:40:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d123d7569bd6ff972ec2a7b65a59f12b4fcf4a04",
          "body": "Matches ken's toolchain bump (GO-2026-5856, crypto/tls ECH leak). All four\nmodules move together — root, benchmarks, examples/embedded-corpus, and the\nchunk/treesitter submodule — so the workspace resolves a single toolchain.\n\ngo.work carries the same directive but is gitignored (local dev only).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump the go directive 1.26.3 → 1.26.5 across the modules",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-07-16T15:40:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "645e380c9995c652b6cb21dd347e87ae01810761",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add CHANGELOG section for v1.9.0",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-17T22:51:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "712864461d998ffc983e35a1347576107c2b4a6f",
          "body": "Lift the read-only mmap primitive that ann and embed each duplicated\n(and goinfer kept a third copy of) into a new zero-dependency leaf\npackage, github.com/townsendmerino/aikit/mmap, and build the residency\nmachinery on top of it. Three deliverables from\ndocs/prompts/aikit-mmap-residency-leaf.md:\n\nD\n[…]\n==resident\nwith evictions>0, and a -race concurrent-query check. go test ./...\ngreen; cross-compiles linux/darwin/windows/freebsd.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add mmap leaf, WeightMat.MappedSpan, and paged FlatI8 index",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-17T22:46:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "db13547c0c55d6b94d23a38336f4a7e737b45d8f",
          "body": null,
          "is_bot": false,
          "headline": "chore: new prompt",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-17T22:09:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66cc30de3562711fce2dc3ec6677ace3e803efe0",
          "body": "…1.8.0)\n\nThe GGUF metadata array parser preallocated make([]any, 0, n) at every nesting\nlevel, with n bounded only by the remaining input. For an array-of-arrays the\nnesting depth is itself ~input/12, so total preallocation was O(input^2) — a ~1 MB\nhostile file parsed in ~700 ms, which surfaced as a\n[…]\n cached it immutably — so it is\nretracted in go.mod and superseded by v1.8.1 (same Qwen2.5-VL vision tower + arm64\nW4A8 content plus this fix).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed: bound GGUF nested-array preallocation; release 1.8.1 (retract …",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-15T04:01:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e885750ce3a57527adc7982cfc7fec5fd54590cd",
          "body": "…ution)\n\nAdds vision.QwenVisionEncoder — a pure-Go fp32 forward of the Qwen2.5-VL\n`.visual` submodule, alongside the unchanged SigLIP Encoder. Unlike SigLIP\n(fixed resolution, learned absolute pos, LayerNorm, gelu-tanh MLP), this is\ndynamic-resolution: LoadQwenVisionEncoder + Forward(pixelValues, gr\n[…]\ndModel golden (scripts/pin_qwen25vl_vision.py,\ntransformers 5.12). Cross-checked against goinfer's independently-pinned golden.\n\nRelease 1.8.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "vision: add Qwen2.5-VL vision tower (second ViT family, dynamic resol…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-15T03:36:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b87e675aaa4273f899cf193ac874814e924f65ea",
          "body": "Planning doc (DEFERRED — execute on trigger) for extracting goinfer's\nweight-memory substrate (mmap + madvise + span-residency cache) into a\nzero-dependency aikit leaf, dedup'ing the three identical mmap copies\n(ann, embed, goinfer) and paging the FlatI8 index. No code change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add deferred plan for mmap + residency leaf package",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-15T00:53:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "52890f5884f9f07ae6aa134914deb569e9f6a81a",
          "body": "… Pro\n\nThe arm64 fold kernel (dotW4A8FoldSDOT) landed UNWIRED/UNVALIDATED in 36ce824\n(amd64 done, NEON draft). This wires dotW4A8 to it (mirroring the amd64 dispatch),\nvalidates it on an M1 Pro, and removes the old per-group dotW4A8GroupsSDOT path.\n\nNEON kernel correct on first hardware run — the WO\n[…]\n help while\nthe unpack, not bandwidth, is the limiter — the real lever is unpack throughput.\n\namd64, W8A8, f32 MatmulBT untouched.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: wire + validate W4A8 in-register-scale-fold NEON kernel on M1…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-15T00:26:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "36ce824642aed161a602811fb632beef4e4eb564",
          "body": "…raft)\n\nW4A8 (int4 weight × int8 activation) M=1 decode was ~2.25× slower than W8A8 on\nM1 Pro (2.07× reproduced on amd64) despite reading half the bytes. Diagnosis:\nnot the nibble-unpack — the kernel emitted one int32 per 32-wide group, forcing\na per-group horizontal reduce + SIMD→GP move + an int32\n[…]\nales = 5 bits/weight (not 4), so the bandwidth-bound\nceiling vs int8 is ~1.6×, not 2×; f16 scales or larger groups approach ~1.9×.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: fold W4A8 weight scales in-register (amd64 done; arm64 NEON d…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-14T21:28:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d60f7c93ea2f04255b23308fe9f4d740eae4e6d7",
          "body": "…oaded findings\n\nRecords the \"feature A\" spike (fused dequant-dot matmul on native GGUF K-quant\nblocks, Q6_K first) as DEFERRED before any asm, with the two near-free numbers\nfront-loaded since they narrow the case:\n\n- Footprint: Q6_K 6.5625 bits/weight — 18% smaller than int8-requant but 31%\n  LARG\n[…]\nd? NEON-first?), a resume order, and anchors — pick-up-ready.\n\nD (the transparent .giw cache) is independent and ships regardless.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(internal): defer the native-Q6_K fused-kernel spike with front-l…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-14T19:04:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "83febd6fcc7f15d32c225075689c89e77465de07",
          "body": "The register-blocked AVX2 kernels (dotFMA4/dotFMA8 in dot_amd64.s) consume two\n4-element groups per 256-bit YMM iteration; the trailing single group (n4 odd,\nn%8==4) was accumulated with an XMM/VEX.128 FMA, which zero-extends and so wiped\nthe upper 128 bits of each YMM accumulator — dropping the loo\n[…]\nonly exercised the single-row dotFMA, never the multi-row\nblocked kernels. Full -race ./... green; TestMatmulBT_MConsistent green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: fix amd64 AVX2 Dot8x4/Dot4x4 odd-n4 bug (v1.7.3)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-13T15:06:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "560ebd333c220bfe49f002b3eaf20edca6db91df",
          "body": "…infer's spec bug)\n\nThe 1.7.2 CHANGELOG entry and roadmap §1b.4 framed the MatmulBT M-invariance\nchange as fixing a same-model speculative-decoding parity regression in a\ndownstream consumer (goinfer). That was wrong, and it's the residue of the\noriginal mistake worth correcting in the record:\n\n- Th\n[…]\ne pointing at the\ndependency, and never put a downstream-effect claim in a release note when only the\nlocal property was verified.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: correct the 1.7.2 over-attribution (M-invariance did not fix go…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-13T05:03:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a78cc607c3ab4fd63ed369334404018404310b55",
          "body": "…ression\n\nMatmulBT's per-output f32 result must not depend on M: a row computed alone\n(M=1) must be bit-identical to the same row computed inside a batch (M>1).\n1.6.0's blocked-GEMM hoist left a MAC-count threshold in MatmulBT that routed\nsmall matmuls to a naive dot-per-output span — a DIFFERENT f3\n[…]\nroutes through MatmulBTInto, always blocked) — golden parity\n  unchanged (TestGoldenFixture_cosine + Q8 cosine 0.997 re-verified).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: make MatmulBT M-invariant — fix speculative-decode parity reg…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-13T01:30:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8419cf34305d9513689b6bc4b3344f3fbc31fe24",
          "body": "…tMat weights\n\nThe inverse of the Int8()/Int4() accessors: wrap caller-owned, already-quantized\nslices (int8 + per-row scales; or packed int4 nibbles + per-group scales + group)\nWITHOUT copying or re-quantizing, aliasing the backing arrays like WrapF32 does.\n\n1.7.0 shipped WeightMat with only quanti\n[…]\ns hand back the SAME backing slice (aliased, not copied), and shape\nmismatches panic. Additive to the Experimental linalg surface.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: add WrapInt8/WrapInt4 — zero-copy wrap of pre-quantized Weigh…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T22:49:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4b9a9b49ae6351d1d0498c12c867500687ad6091",
          "body": "The v1.7.0 release bundles two Experimental-tier additions (the `vision`\nSigLIP/ViT image encoder and `linalg.WeightMat`) plus the encoder Q8\nmigration onto WeightMat. That migration removes ten exported\n`LayerWeightsQ8` int8/scale fields — part of the `encoder.LoadQ8` /\n`ModelQ8` surface the README\n[…]\now green: `release-gate.sh 1.7.0` ✓ (Experimental changes excluded\nand listed; no Hard-tier breakage; dependency invariant holds).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: prep v1.7.0 — tier-aware release gate + CHANGELOG compare link",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T22:10:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f8d347e8f8f8e2e27d22138fb4641cc00a95eb3a",
          "body": "…rom goinfer\n\naikit gains image embeddings, making it the only cgo-free image-embedding\nretrieval library. The vision tower moves in from goinfer's vision package\n(same author, MIT), verbatim and parity-preserving:\n\n  decode (stdlib image/jpeg+png) → preprocess (resize+normalize, pre-decode\n  pixel-\n[…]\n to package multimodal, point gpu/vision_*.go at aikit/vision,\nbump the pin — validated green via go.work replace before deletion.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "vision: add pure-Go SigLIP/ViT image encoder (Experimental) — moved f…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T22:00:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba3d26bf3deb145d4af6f2073d44ebeffbc7f545",
          "body": "Adds linalg.WeightMat — a precision-hiding quantized-weight matrix\n(f32 / per-row int8 / group int4 behind a uniform MatmulBT + Row dequant\n+ Int8()/Int4()/F32() raw accessors). It consolidates the weight-matrix\nwrapper open-coded three times: aikit encoder.LayerWeightsQ8, goinfer\ndecoder.weightMat \n[…]\ngoinfer's fastest-moving internal type. goinfer's vision.qmat\nand decoder.weightMat migrate next against the released aikit minor.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg+encoder: add Experimental WeightMat, migrate encoder Q8 onto it",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T21:58:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c5998f56b004c08153aa0faf954e41fbc50f3677",
          "body": "…oken window)\n\nThe published ~21 texts/sec is single-short-text (~12 tokens) — the small-M,\nbandwidth-bound regime the v1.6.0 blocked GEMM doesn't touch (re-measured at 22,\nwithin noise). The GEMM win lives at large M, which that metric hides. Add a\nlong-context operating point to `go run ./inferenc\n[…]\ns. gitignore benchmarks/testdata/ (the\nper-machine MiniLM/Model2Vec model dirs the benches symlink in) so they can't be\ncommitted.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "benchmarks+docs: add MiniLM long-context throughput (710 tok/s, 256-t…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T19:28:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7cf428269fdd5fc9d7a509004ac2ced458c11fd1",
          "body": "v1.6.0: typed safetensors accessors (TensorF32/TensorI32), shared blocked\nMatmulBT + MatmulBTInto (public f32 GEMM 7%→69% of peak via cache blocking +\nB-packing), Dot2x8 register kernel. All additive to the Hard tier (apidiff\nclean); release-gate 1.6.0 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): roll [Unreleased] → [1.6.0]",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T18:16:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ee8ea6d6373ce0877e8acbc347d04f8b4d5fabe3",
          "body": "Result of `go fix ./...`: if-guarded clamps → max() (crossencoder pairIDs,\nscratch ensureDeqW) and a counted loop → range-over-int (linalg_q8). Semantically\nidentical, already covered by the existing tests. Comment tidied where go fix\nleft it mid-expression.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: apply go fix modernizations (max builtin, range-over-int)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T18:08:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d9ac839974fd477f53f3268c4106f08b068b0dc7",
          "body": "The large-M GEMM lever (from the §1b.3 packing work) was only noted in prose\nunder a DONE heading. Per the roadmap's own rule (new engineering enters through\n§2 triggers), promote it to §2.12 with its trigger — goinfer's multimodal\nimage-prefill latency, the one hot f32 MatmulBT consumer at M≥2048 — and record\nthe measured dead-ends (smaller kBlock, wide n-panels) so they aren't re-tried.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): promote 3-level Goto GEMM to a §2 gated item",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T18:08:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "341210715513513f84a3ca260bebb5c525d5a585",
          "body": "…(arm64)\n\nThe cache-blocked MatmulBT still left large-K shapes (M=512×4096×4096 at 46%)\nbelow the K=768 tiles' ~70%. Root cause isn't tile size — it's L1 associativity\nconflicts: the 8 b-rows a Dot2x8 reads simultaneously sit K·4 bytes apart and\nmap to the same cache sets. packedFill copies each 8-r\n[…]\nigger). Smaller kBlock and wide n-panels both measured worse. Full\nsuite + -race green, amd64/windows cross-build OK, gofmt clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: B-panel packing for large-K GEMM — prefill 46%→69%, fc2 +15% …",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T18:04:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86bc108c594591ec46e284914315347dc80138e8",
          "body": "The test asserted Dot2x8 == Dot8x4 within 1e-6. That holds on arm64 (both are\nthe NEON asm — bit-identical, same accumulation order) but fails on amd64/Windows\nCI: there Dot2x8 is the portable scalar fallback while Dot8x4 is the AVX2 asm, so\nthey compute the same math in different orders and agree o\n[…]\n guarantee that underpins encoder parity) and use an f32-appropriate 1e-4\nelsewhere. Seed is fixed, so the bound is deterministic.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: fix TestDot2x8_equalsDot8x4 on amd64 (arch-aware tolerance)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T18:03:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "24aec55e2281434cc2c61e6cc02b546a7deab586",
          "body": "…%→46–68%\n\nA cross-repo gate (goinfer) found the PUBLIC linalg.MatmulBT was a naive\ndot-per-output span with no cache blocking — re-streaming b from DRAM once per\na-row, ~7% of this M1 Pro's f32 peak at prefill shapes. That's a defect every\nkit consumer of MatmulBT inherits (goinfer's own f32 vision\n[…]\n + peak-fraction benches moved to linalg with the kernel. Full suite\n+ -race green, cgo-free, Windows cross-build OK, gofmt clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: hoist blocked GEMM into shared MatmulBT — fix public matmul 7…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T17:11:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e30eeb139d565038c5d2fd723ef34b293c3ac7ef",
          "body": "…(arm64)\n\nPhase 1 (gate): BenchmarkGEMMPeakFraction measures the encoder's blocked f32\nGEMM as a fraction of a MEASURED single-core ceiling — fmaPeakARM64, a register-\nsaturating FMA loop, clocks 95.4 GFLOPS (≈15 f32-FMA/cycle, settling the\n8-vs-16-FMA/cycle question empirically rather than from the\n[…]\n. Full suite + -race green, cgo-free, Windows cross-build OK.\narm64 NEON only; AVX2 port deferred to roadmap §2.4 (Zen 4+ access).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg/encoder: 2×8 register GEMM micro-kernel — 1.5–1.6× f32 matmul …",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T16:21:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e8c3343dc001c4cf10f5b82fb755490f87117d62",
          "body": "…e (§1b.1)\n\nThe 2026-06-12 goinfer cross-repo review found the same shape-checked typed-read +\ndtype-dispatch pattern hand-written ≥6× across goinfer (decoder/weights.go,\nvision/encoder.go, decoder/lora.go, decoder/gptq.go: tensorF32/loadF32/f16Tensor/\ni32Tensor) and once in aikit's own encoder. Lif\n[…]\nits next aikit bump.\n\nPermitted under roadmap v4's standing rule: measured deduplication for a named\nconsumer, not new capability.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed: typed tensor accessors TensorF32 / TensorI32 on SafetensorsFil…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-12T15:23:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f1a482cd109430b3c28de8f5b1dfb1f292b8f8d8",
          "body": "Cut [Unreleased] → [1.5.0] with compare links. Minor: adds the cross-encoder reranker\n(encoder.LoadCrossEncoder, new Experimental surface), the int8-reranker latency fix\n(q8 now ~f32 parity at ¼ weight storage — internal), and the blob format-stability\npolicy docs. apidiff v1.4.0..HEAD: zero Hard-tier incompatible changes (release-gate\nverified).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): cut [1.5.0] — 2026-06-11",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T21:03:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da799ebc963dce1f03668d516534918654a42650",
          "body": "…(latency parity)\n\nLoadQ8 was ~5× slower than Load on arm64 (ken's report, evaluating an int8 reranker\ndefault). Two causes, both fixed:\n\n1. Allocation churn. The q8 forward allocated every per-layer matmul output and\n   per-head attention temporary fresh (~4.4 GiB / 41k allocs for a 50-doc rerank),\n[…]\n8_cosineMatchesF32 (≥0.97) stays green; full encoder + -race + windows +\ncgo-free all pass. No exported API change (all internal).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: fix q8 reranker — pooled scratch + dequant-then-SIMD matmul …",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T20:01:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "62c54aea95c0bcb4ec8225c02f8405b9816a559b",
          "body": "The 93a170a comment additions tripped gofmt (comment alignment); no code change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ann: gofmt the format-bump checklist comments (CI gofmt fix)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T14:27:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "93a170aec0b525ef444340757adb7d0077020cfb",
          "body": "…n hygiene)\n\nFormats burned v1→v2→v3 in 48 hours — fine pre-circulation, but an adopter embedding\nblobs in their releases changes the calculus. Decide + document the contract now.\n\nDecision: rebuild-per-minor pre-1.0. A serialized index blob is not a stable\ncross-version interchange format; re-seria\n[…]\nurbs, and \"bundle into whatever bump\ncomes next\" defers it. No code/behavior change; build + ann round-trip/ErrFormat\ntests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: blob format-stability policy — rebuild-per-minor (pre-graduatio…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T14:20:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "839ffd4f1afec82ed978859ef7ce886a1d5856d0",
          "body": "…evidence)\n\nCross-referenced the exported surface against goinfer (pins v1.3.0) + aikit-internal\ncallers. DotI8 (ann) + MatmulBTAcc64 (goinfer MoE) are consumed; the four Workspace\nscoping methods are unconsumed but kept as deliberate forward-looking concurrency-safe\ndesign (conscious keep, re-evaluate at graduation). No code change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): linalg surface audit done — deliberate keep (consumer …",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T14:17:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7102f7613f186b6c0d7021ae5034484ca860dfbe",
          "body": "benchmarks/inference measures aikit's transformer path — all-MiniLM-L6-v2 — at\n~21 texts/sec (≈47 ms/text, single thread) on CPU, no ONNX Runtime / GPU / native\nlib, CGO_ENABLED=0; concurrent encoding scales ~linearly. (Primary dense retrieval\nis Model2Vec static embeddings — microseconds; the trans\n[…]\ny line; roadmap §1 benchmark-remainder marked done (with §1.1's BEIR slice,\nnDCG@10 0.638 on BeIR/scifact, from the prior commit).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "benchmarks: pure-Go MiniLM inference throughput (§1.1 remainder, a)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T13:45:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e256ea47bcd32eaf79cdfb235e73b3bcfc11e18f",
          "body": "A cross-referenceable absolute number: aikit's retrieval (potion-retrieval-32M\nembeddings + exact Flat cosine) on the canonical BeIR/scifact test set scores\nnDCG@10 0.638 (300 queries, 5183 docs) — right where a strong static retriever lands\n(near all-MiniLM-L6-v2's own SciFact nDCG@10), pure-Go, no\n[…]\nis the standard MTEB/BEIR protocol, so the number is directly\ncomparable to the leaderboard — credibility for the adoption assets.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "benchmarks: BEIR/scifact retrieval-quality eval (§1.1 remainder, b)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T13:34:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6a05385ceb06e7a0fa765b16b156f6895729218a",
          "body": "…map v3 §1)\n\nA cross-encoder (BertForSequenceClassification, e.g. cross-encoder/ms-marco-MiniLM-\nL-6-v2) scores a (query, document) pair jointly, the complement to the bi-encoder\nembedders. As the roadmap predicted, a small additive step on the v1.4.0 BERT trunk:\n\n- hiddenStates gained a token-type \n[…]\n modern reranking — bi-encoder (CodeRankEmbed/MiniLM)\nand cross-encoder — cgo-free, closing the last pipeline gap vs hugot/Antfly.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: BERT cross-encoder reranker — LoadCrossEncoder / Score (road…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T13:18:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0faaebc0f9a71aad2c2e1520330e4b1600c1a3e7",
          "body": "Cut [Unreleased] → [1.4.0] with compare links. v1.4.0 is a minor: the Hard tier only\ngains capability (embed.Load reads the standard Model2Vec format; embed.ErrFormat /\nann.ErrFormat sentinels) — apidiff v1.3.0..HEAD shows zero Hard-tier incompatible\nchanges (release-gate verified). Everything else \n[…]\nhead, Workspace parallel-knob scoping; the one\nExperimental removal — Workspace.Close, with the worker pool — is allowed pre-1.0).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): cut [1.4.0] — 2026-06-11",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T12:35:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "edc6528acf601dad65aa894af252735215e33602",
          "body": "`go fix ./...` over the main module and the three nested modules (benchmarks,\nexamples/embedded-corpus, chunk/treesitter). Two mechanical, behavior-preserving\nmodernizations: 23 counted `for i := 0; i < N; i++` → `for i := range N`\n(range-over-int, Go 1.22+) and one `for … range strings.Split(...)` \n[…]\n cosine unchanged at 1.0 / 0.997), -race clean on ann/linalg/sparse,\nall four modules build + test, windows + cgo-free unaffected.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: go fix across all modules (modernize loops + strings.SplitSeq)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T12:26:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "902cbecc1bfd760b956a7cca214b9e7fdad58d56",
          "body": "The persistent spin-then-park worker pool (pool.go, 154 lines) was built to reuse\nhot workers across a decode layer's back-to-back matmuls, but measured neutral and\nshipped unused: the serial-decode threshold keeps M=1 decode serial — exactly the\nregime where per-call fork/join would dominate — so t\n[…]\nk repurposed to sweep the width cap. The design + measurement\nremain in git (commit 2df6b52) if a future profile justifies a pool.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: delete the unused worker pool; SetWorkers → width cap (§4)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T12:14:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0881465942d039addf04369e5c42058f911a6ff7",
          "body": "…(§4)\n\nSetParallelThreshold/Width are process-wide mutable globals — a liability to settle\nbefore linalg graduates from Experimental (cheap now, breaking later). Workspace\nalready scoped width (SetWorkers/pool); this scopes the threshold too and makes the\nshape coherent: globals are the default, a W\n[…]\nzero\nincompatible changes. Remaining quant matmuls (Q8/W4A8/Q4) can gain Workspace\nmethods additively later; the shape is settled.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "linalg: scope the parallel knobs into Workspace; globals as defaults …",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T05:00:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ac071ec08cded37e6a28223e5c4eda2068adddc",
          "body": "Three versioned-blob Load paths (HNSW, FlatI8, FlatI8Mmap) plus the safetensors/GGUF\nloaders reported corrupt-blob and version-mismatch failures only as strings, so\ncallers had to string-match. Add a sentinel per package, wrapped at the parse sites.\n\n- ann.ErrFormat: wrapped by Load, LoadFlatI8, and\n[…]\n truncated → ErrFormat); full ann+embed suites, -race, and the\ncorrupt-blob fuzzers (FuzzLoadFlatI8, FuzzOpenGGUF) all stay green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ann, embed: typed sentinel errors for the blob loaders (§4)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T04:42:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2d5814d6506e5f4b095512cec877b13b910d0afa",
          "body": "A single self-contained binary that //go:embeds the Model2Vec model, a prebuilt int8\nindex, and the corpus, and answers Go/aikit questions over hybrid dense (int8 ANN) +\nlexical (BM25) → RRF search with zero external files and ~50 ms startup — the\n//go:embed-a-corpus, zero-deploy lane no Python or O\n[…]\nt\n(TestShowcase_query); results are spot-on across stdlib + aikit queries. Linked from\nthe README; root build verified unaffected.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "examples: embedded-corpus — zero-deploy hybrid-search showcase (§1.1)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T02:05:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a4f5a4eac38a44a02130876a553f8379dd1fcae4",
          "body": "Three tags in two days each leaked a small process gap (a missing 1.1.1 CHANGELOG\nentry; stale docs nearly tagged in 1.2.0; the v1.2.0/1.2.1 GitHub Release objects\nforgotten until prompted). This gate closes them.\n\nscripts/release-gate.sh <version> (testable locally, not trapped in YAML) checks:\n  1\n[…]\nor 1.3.0 (apidiff v1.2.1→tree clean, confirming the §2\nwork is additive), fails correctly for a version with no CHANGELOG section.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: tag-triggered release gate (§1.2)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T01:08:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "407c219d81b58040aa59abcf1b0c70da0dcfd965",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): mark §2.3 SPLADE head done (missed in a67711b)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T00:41:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a67711b7e5344963e2cd548202d6e20997be0690",
          "body": "A SPLADE model is a BERT encoder plus a masked-LM head, so §2.2's BERT forward makes\nthe full in-process head tractable (the roadmap only scoped an interim out-of-band\npin script). LoadSPLADE reuses LoadBERT — made prefix-aware so it also reads a raw\nBertForMaskedLM (the \"bert.\" tensor prefix senten\n[…]\n -race green; windows + cgo-free; apidiff additive (new\n  encoder → sparse edge, acyclic). CodeRankEmbed + MiniLM paths untouched.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: in-process SPLADE expansion head (§2.3)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T00:40:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7fc5cc9a7d48a0c393e56e9900e0b1ffa4d99d7",
          "body": "…-32M)\n\nThe roadmap assumed potion-retrieval-32M \"loads already, same format\"; it doesn't.\nembed required the vocabulary-quantized layout (embeddings + mapping + weights\ntensors, e.g. potion-code-16M), but potion-retrieval-32M — upstream's strongest\nstatic *retrieval* model — ships the standard layo\n[…]\node-16M, and document that Load reads both formats.\n\nAdditive: embed.Load (Hard tier) only gains capability — no signature change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "embed: support the standard Model2Vec format (§2.4 — potion-retrieval…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-11T00:25:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "962da0e386a180b68fb79245a4374445fed6abc8",
          "body": "encoder.LoadBERT / BERT / Encode in the README Experimental tier and a CHANGELOG\n[Unreleased] Added entry; roadmap §2.2 marked done.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: MiniLM-class BERT encoder (§2.2) — README + CHANGELOG + roadmap",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-10T23:52:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "92f0bb52b8391c15b4ac34a4f35d91965c98a2eb",
          "body": "…§2.2)\n\nWires the WordPiece tokenizer (the existing embed.Tokenizer + EncodeWithSpecials)\ninto the MiniLM forward, so LoadBERT(dir) + BERT.Encode(text) is the cgo-free\nequivalent of sentence-transformers' .encode() — text → [CLS]…[SEP] →\nlearned-pos/GELU/no-RoPE transformer → mean pool → L2. Max seq\n[…]\nERT family (MiniLM-class embedders/rerankers)\ncgo-free, parity-pinned — \"two specific models\" → \"the BERT family you already use.\"\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: BERT.Encode(text) — end-to-end MiniLM, tokenization parity (…",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-10T23:48:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e71b53f46df5799fe1a31a6a7b1640c93e084fb2",
          "body": "A second encoder architecture alongside CodeRankEmbed (NomicBert), implementing the\nthree axes a sentence-transformers BERT model differs on: learned ABSOLUTE position\nembeddings (not RoPE), a GELU FFN (intermediate→output dense, not SwiGLU), and mean\npooling (not CLS). Standard post-norm scaled-dot\n[…]\nor end-to-end use: WordPiece text→ids tokenization (a public Encode(text))\nand graduating the pooling knob to public — follow-ups.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "encoder: MiniLM-class BERT encoder — loader + forward, parity 1.0 (§2.2)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-10T23:39:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4cbe4720e83211702a97b8c71101b2f2a5f9ccd5",
          "body": "pin_minilm.py dumps testdata/minilm_golden.json from sentence-transformers/\nall-MiniLM-L6-v2 (fetched to testdata/minilm-model, gitignored): for 8 short cases,\nthe input_ids the model ate, the full last_hidden_state [L, 384] (the axis-by-axis\nforward oracle), and the mean-pooled L2-normalized senten\n[…]\nr the upcoming BERT loader + forward (phases 2–3);\nthe Go side feeds the golden's input_ids and pins its hidden states against it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "scripts: MiniLM parity golden — the §2.2 oracle (phase 1)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-10T23:19:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e32bcd0f516ea75882177806e16c1a2c07e28b80",
          "body": "The pin_*.py generators are aikit's parity oracle (design rule 3) but needed an\nenvironment that has torch + sentence-transformers + transformers; this pins that.\n\n- scripts/requirements.txt: the toolchain pinned to the versions that produced the\n  committed goldens (torch 2.12.0, sentence-transform\n[…]\n is the enabler for the model-blocked track — §2.2 (MiniLM\nencoder support) can now generate its golden and parity-pin against it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "scripts: stand up the Python parity toolchain (§2.1)",
          "author_name": "Francis Townsend-Merino",
          "author_login": "francistm-bu",
          "committed_at": "2026-06-10T22:53:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 18,
      "commits_last_year": 227,
      "latest_release_at": "2026-07-23T03:32:45Z",
      "latest_release_tag": "v1.11.0",
      "releases_from_tags": false,
      "days_since_last_push": 2,
      "active_weeks_last_year": 5,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 4.5
    },
    "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": "github.com/townsendmerino/aikit",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/townsendmerino/aikit",
          "is_deprecated": false,
          "latest_version": "v1.11.0",
          "repository_url": "https://github.com/townsendmerino/aikit",
          "versions_count": 30,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-23T02:34:34Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 2
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 2,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "benchmarks/go.mod",
        "chunk/treesitter/go.mod",
        "examples/embedded-corpus/go.mod",
        "go.mod"
      ],
      "largest_source_bytes": 36183,
      "source_files_sampled": 296,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "benchmarks/go.mod",
        "go.mod",
        "scripts/requirements.txt"
      ],
      "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": [
        "go",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "golang.org/x/sys",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.47.0"
        },
        {
          "name": "golang.org/x/text",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.40.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": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "francistm-bu",
          "commits": 226,
          "avatar_url": "https://avatars.githubusercontent.com/u/242265122?v=4"
        },
        {
          "type": "User",
          "login": "townsendmerino",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/620372?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.996
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "fuzz-nightly.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": null,
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-25T09:01:15Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/townsendmerino/aikit",
    "host": "github.com",
    "name": "aikit",
    "owner": "townsendmerino"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 48,
      "inputs": {
        "security": 1,
        "vitality": 78,
        "community": 24,
        "governance": 46,
        "engineering": 78
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 78,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "commits_last_year": 227,
              "human_commit_share": 1,
              "days_since_last_push": 2,
              "active_weeks_last_year": 5
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "5/52 weeks with commits",
                "points": 3.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "227 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 227
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "releases_count": 18,
              "latest_release_tag": "v1.11.0",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 4.5
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "18 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 18
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.5 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.5
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 2,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "2 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 46,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.996
            },
            "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.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "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": 43,
            "inputs": {
              "followers": 5,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "townsendmerino",
              "public_repos": 8,
              "account_age_days": 5638
            },
            "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": "5 followers of townsendmerino",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 5,
                      "login": "townsendmerino"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~15 yr old",
                "points": 18.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 15
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/townsendmerino/aikit"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 2
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 2 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "30 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 30
                    }
                  }
                ],
                "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": 78,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 1,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dependency lockfiles. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dependency_lockfiles"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "source": "file_signals",
              "lockfiles": [
                "go.sum"
              ],
              "manifests": [
                "benchmarks/go.mod",
                "go.mod",
                "scripts/requirements.txt"
              ],
              "has_codeql_workflow": false,
              "has_security_policy": false,
              "has_dependabot_config": false
            },
            "components": [
              {
                "key": "security_policy_security_md",
                "name": "Security policy (SECURITY.md)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "dependabot_config",
                "name": "Dependabot config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "dependency_lockfiles",
                "name": "Dependency lockfiles",
                "detail": "published library — lockfiles are an application concern, not expected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "lockfiles_not_expected",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "codeql_workflow",
                "name": "CodeQL workflow",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          }
        ],
        "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": 67,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "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": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.99,
              "toolchain_manifests": [
                "benchmarks/go.mod",
                "chunk/treesitter/go.mod",
                "examples/embedded-corpus/go.mod",
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "benchmarks/go.mod, chunk/treesitter/go.mod, examples/embedded-corpus/go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "benchmarks/go.mod, chunk/treesitter/go.mod, examples/embedded-corpus/go.mod"
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "99 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 99,
                      "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": "OpenSSF Scorecard unavailable",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 36183,
              "source_files_sampled": 296,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/296 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 296,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "OpenSSF Scorecard did not return a usable result (2026/07/25 20:49:36 Warning: PATs stored in env variables GITHUB_AUTH_TOKEN and GITHUB_TOKEN differ. Scorecard will use the former.); skipping Scorecard checks"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-25T20:49:57.504496Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/townsendmerino/aikit.svg",
  "full_name": "townsendmerino/aikit",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.