Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 0 forksdesde may 2026Ver en GitHub ↗

townsendmerino/aikit tiene un índice de salud de 48 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (78/100) y la más baja, Security (1/100). Se actualizó por última vez hace 2 días. Una sola persona concentra la mayor parte del trabajo reciente.

48
global / 100
En riesgo

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

48
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

5 seguidores8 repositorios públicosdesde feb 2011

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/townsendmerino/aikitv1.11.0-30hace 2 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

78Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 2 días
3.5/36Cadencia de commits — 5/52 semanas con commits
18/18Volumen de commits — 227 commits en el último año
0/10OpenSSF Scorecard: Maintained — sin datos
Datos de entrada utilizados
commits_last_year227
human_commit_share1
days_since_last_push2
active_weeks_last_year5
Cómo se puntúa
27/27Publica versiones — 18 versiones publicadas
36/36Recencia de las versiones — última versión hace 2 días
27/27Cadencia de publicación — una versión cada ~4,5 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count18
latest_release_tagv1.11.0
releases_from_tagsno
days_since_latest_release2
mean_days_between_releases4,5

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 2 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars2
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

46En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.1/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
0/10OpenSSF Scorecard: Contributors — sin datos
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,996
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
5.6/25Alcance del propietario — 5 seguidores de townsendmerino
18.9/25Trayectoria — 8 repos públicos, cuenta de ~15 años
Datos de entrada utilizados
followers5
owner_typeUser
is_verified
owner_logintownsendmerino
public_repos8
account_age_days5638
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 2 días
20/20Historial de versiones — 30 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/townsendmerino/aikit
ecosystemsgo
any_deprecatedno
min_days_since_publish2

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

78Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yml
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

1Crítico · 16% del índice global
Cómo se puntúa
0/30Política de seguridad (SECURITY.md)
0/25Configuración de Dependabot
0/25Lockfiles de dependencias — biblioteca publicada — los lockfiles son cosa de las aplicaciones, no se esperan aquí
0/20Flujo de trabajo de CodeQL
Datos de entrada utilizados
sourcefile_signals
lockfilesgo.sum
manifestsbenchmarks/go.mod, go.mod, scripts/requirements.txt
has_codeql_workflowno
has_security_policyno
has_dependabot_configno
Excluidos de la puntuación (sin datos o no aplicable): Lockfiles de dependencias. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

67Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 99 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — benchmarks/go.mod, chunk/treesitter/go.mod, examples/embedded-corpus/go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 99 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_config
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
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
55/55Tamaños de archivo manejables — 0/296 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes36.183
source_files_sampled296
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

2estrellas de GitHub
2contribuidores
227commits en los últimos 12 meses
2días desde el último push
18versiones publicadas
1factor bus
0issues abiertas
Go, PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

Dependencias directas 2
RegistroPaqueteRestricción de versiónManifiesto
Gogolang.org/x/sysv0.47.0go.mod
Gogolang.org/x/textv0.40.0go.mod
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.