Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 2.5.0 · 2026-07-30 23:55 UTC

CrispStrobe / CrisperWeaver

On-device speech-to-text Flutter app powered by CrispASR (ggml / Whisper) — offline, multi-platform, AGPL-3.0.

DartAGPL-3.0★ 41 estrellas⑂ 7 forksdesde sept 2025Ver en GitHub ↗

CrispStrobe/CrisperWeaver tiene un índice de salud de 51 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (76/100) y la más baja, Sustainability & Governance (33/100). Se actualizó por última vez hace 14 días. Una sola persona concentra la mayor parte del trabajo reciente.

51
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala estandarizada de 1 a 100. El resultado global parte de su media ponderada, calibrada contra la distribución del registro público para que las bandas tengan significado percentil; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe un límite «En riesgo» de 34.

51
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas 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.

El resultado global ponderado 51 se calibra a 51 en la escala publicada del índice (calibración del registro 2026-08-02).

Titularidad

CrispStrobeCuenta personal
43 seguidores142 repositorios públicosdesde dic 2023

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.

Métricas por categoría

Vitalidad

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

76Bueno · 21% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 14 días
9.7/36Cadencia de commits — 14/52 semanas con commits
18/18Volumen de commits — 522 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 26 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year522
human_commit_share1
days_since_last_push14
active_weeks_last_year14
Cómo se puntúa
27/27Publica versiones — 86 versiones publicadas
36/36Recencia de las versiones — última versión hace 15 días
27/27Cadencia de publicación — una versión cada ~1,6 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count86
latest_release_tagv0.9.5
releases_from_tagsno
days_since_latest_release15
mean_days_between_releases1,6

Comunidad y Adopción

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

40Débil · 17% del índice global
Cómo se puntúa
26/60Estrellas — 41 estrellas
6.5/25Forks — 7 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks7
stars41
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 (AGPL-3.0)
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
readme_badges
has_contributingno
has_issue_templateno
has_code_of_conductno
readme_badge_services
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?

33En riesgo · 23% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
37.7/42Resolución de issues — 90% de issues cerradas
0/30Aceptación de PR — 0/2 PR decididos fusionados
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues3
closed_issues26
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0,897
closed_unmerged_prs2
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Excluidos de la puntuación (sin datos o no aplicable): newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
11.8/25Alcance del propietario — 43 seguidores de CrispStrobe
18.2/25Trayectoria — 142 repos públicos, cuenta de ~2 años
Datos de entrada utilizados
followers43
owner_typeUser
is_verified
owner_loginCrispStrobe
public_repos142
account_age_days951
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.

Calidad de Ingeniería

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

66Bueno · 19% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
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_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.
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
10/10Topics — 8 topics
0/10Wiki
Datos de entrada utilizados
topicsasr, flutter, ggml, on-device, speech-to-text, transcription, whisper, crispasr
has_wikino
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?

35Débil · 16% del índice global
Cómo se puntúa
6.8/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — sin datos
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 26 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,5
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, packaging. 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? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

58Moderado · 4% 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 — 96 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,96
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — android/app/build.gradle.kts, android/build.gradle.kts (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Dart (tipado estático)
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 89 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 — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,89
toolchain_manifestsandroid/app/build.gradle.kts, android/build.gradle.kts
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Dart (tipado estático)
53.7/55Tamaños de archivo manejables — 7/304 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageDart
largest_source_bytes229.870
source_files_sampled304
oversized_source_files7

Datos clave

41estrellas de GitHub
1contribuidores
522commits en los últimos 12 meses
14días desde el último push
86versiones publicadas
1factor bus
3issues abiertas
Mavenecosistemas 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

Más detalle

Historial de estrellas y forks 0 ★ / 7 ⇿
0Estrellas
7Forks
76Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

1234567712026-052026-062026-07
Mayor 0Menor 8Parche 67
OpenSSF Scorecard 3.5 / 10
3.5agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-30 23:54 UTC

9Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
n/dCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 26 issue activity found in the last 90 days -- score normalized to 10
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
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": [
        "asr",
        "flutter",
        "ggml",
        "on-device",
        "speech-to-text",
        "transcription",
        "whisper",
        "crispasr"
      ],
      "is_fork": false,
      "size_kb": 21919,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "C": 1488,
        "C++": 28261,
        "Dart": 3315848,
        "HTML": 142529,
        "Ruby": 21737,
        "CMake": 20341,
        "Shell": 69606,
        "Swift": 46683,
        "Kotlin": 21809,
        "Python": 32930,
        "Batchfile": 768,
        "PowerShell": 16123,
        "Objective-C": 38
      },
      "pushed_at": "2026-07-16T21:38:56Z",
      "created_at": "2025-09-11T06:36:05Z",
      "owner_type": "User",
      "updated_at": "2026-07-28T22:12:45Z",
      "description": "On-device speech-to-text Flutter app powered by CrispASR (ggml / Whisper) — offline, multi-platform, AGPL-3.0.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "AGPL-3.0",
      "default_branch": "main",
      "license_spdx_raw": "AGPL-3.0",
      "primary_language": "Dart",
      "significant_languages": [
        "Dart"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "CrispStrobe",
      "company": null,
      "location": null,
      "followers": 43,
      "avatar_url": "https://avatars.githubusercontent.com/u/154636388?v=4",
      "created_at": "2023-12-22T21:17:49Z",
      "is_verified": null,
      "public_repos": 142,
      "account_age_days": 951
    },
    "license": {
      "state": "standard",
      "spdx_id": "AGPL-3.0",
      "raw_spdx": "AGPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-07-15T07:29:12Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2026-07-15T07:05:36Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-07-15T06:46:20Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-07-15T06:06:04Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-14T07:24:41Z"
        },
        {
          "tag": "main",
          "kind": "other",
          "published_at": "2026-07-12T07:32:23Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-10T08:22:32Z"
        },
        {
          "tag": "v0.8.8",
          "kind": "patch",
          "published_at": "2026-07-04T17:58:15Z"
        },
        {
          "tag": "v0.8.7",
          "kind": "patch",
          "published_at": "2026-07-01T10:37:45Z"
        },
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2026-06-30T19:23:08Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-06-30T18:25:14Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-06-24T18:34:57Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-06-24T17:43:21Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-06-24T17:02:59Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-22T04:34:21Z"
        },
        {
          "tag": "v0.7.9",
          "kind": "patch",
          "published_at": "2026-06-12T16:00:36Z"
        },
        {
          "tag": "v0.7.8",
          "kind": "patch",
          "published_at": "2026-06-10T04:30:14Z"
        },
        {
          "tag": "v0.7.7",
          "kind": "patch",
          "published_at": "2026-06-09T21:47:29Z"
        },
        {
          "tag": "v0.7.6",
          "kind": "patch",
          "published_at": "2026-06-09T20:29:10Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-06-08T10:21:48Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-06-06T18:52:31Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-06-05T19:41:39Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-06-05T18:42:01Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-06-05T18:00:58Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-06-05T16:20:23Z"
        },
        {
          "tag": "v0.6.50",
          "kind": "patch",
          "published_at": "2026-06-01T14:52:50Z"
        },
        {
          "tag": "v0.6.46",
          "kind": "patch",
          "published_at": "2026-05-30T09:00:47Z"
        },
        {
          "tag": "v0.6.45",
          "kind": "patch",
          "published_at": "2026-05-30T07:11:10Z"
        },
        {
          "tag": "v0.6.44",
          "kind": "patch",
          "published_at": "2026-05-29T21:30:18Z"
        },
        {
          "tag": "v0.6.43",
          "kind": "patch",
          "published_at": "2026-05-29T19:56:10Z"
        },
        {
          "tag": "v0.6.42",
          "kind": "patch",
          "published_at": "2026-05-29T12:01:26Z"
        },
        {
          "tag": "v0.6.41",
          "kind": "patch",
          "published_at": "2026-05-29T05:21:18Z"
        },
        {
          "tag": "v0.6.40",
          "kind": "patch",
          "published_at": "2026-05-28T14:45:31Z"
        },
        {
          "tag": "v0.6.39",
          "kind": "patch",
          "published_at": "2026-05-28T09:43:52Z"
        },
        {
          "tag": "v0.6.38",
          "kind": "patch",
          "published_at": "2026-05-28T09:32:43Z"
        },
        {
          "tag": "v0.6.37",
          "kind": "patch",
          "published_at": "2026-05-28T08:03:02Z"
        },
        {
          "tag": "v0.6.36",
          "kind": "patch",
          "published_at": "2026-05-28T07:52:41Z"
        },
        {
          "tag": "v0.6.35",
          "kind": "patch",
          "published_at": "2026-05-28T07:46:50Z"
        },
        {
          "tag": "v0.6.34",
          "kind": "patch",
          "published_at": "2026-05-28T07:40:41Z"
        },
        {
          "tag": "v0.6.33",
          "kind": "patch",
          "published_at": "2026-05-28T06:43:39Z"
        },
        {
          "tag": "v0.6.32",
          "kind": "patch",
          "published_at": "2026-05-28T06:22:09Z"
        },
        {
          "tag": "v0.6.31",
          "kind": "patch",
          "published_at": "2026-05-28T06:11:09Z"
        },
        {
          "tag": "v0.6.30",
          "kind": "patch",
          "published_at": "2026-05-28T05:57:30Z"
        },
        {
          "tag": "v0.6.29",
          "kind": "patch",
          "published_at": "2026-05-27T17:30:17Z"
        },
        {
          "tag": "v0.6.28",
          "kind": "patch",
          "published_at": "2026-05-27T13:04:34Z"
        },
        {
          "tag": "v0.6.27",
          "kind": "patch",
          "published_at": "2026-05-27T12:59:29Z"
        },
        {
          "tag": "v0.6.26",
          "kind": "patch",
          "published_at": "2026-05-27T12:29:53Z"
        },
        {
          "tag": "v0.6.25",
          "kind": "patch",
          "published_at": "2026-05-27T09:27:23Z"
        },
        {
          "tag": "v0.6.24",
          "kind": "patch",
          "published_at": "2026-05-27T09:25:32Z"
        },
        {
          "tag": "v0.6.23",
          "kind": "patch",
          "published_at": "2026-05-27T09:16:23Z"
        },
        {
          "tag": "v0.6.22",
          "kind": "patch",
          "published_at": "2026-05-27T09:08:25Z"
        },
        {
          "tag": "v0.6.21",
          "kind": "patch",
          "published_at": "2026-05-27T05:44:23Z"
        },
        {
          "tag": "v0.6.20",
          "kind": "patch",
          "published_at": "2026-05-27T05:16:40Z"
        },
        {
          "tag": "v0.6.19",
          "kind": "patch",
          "published_at": "2026-05-27T05:02:42Z"
        },
        {
          "tag": "v0.6.18",
          "kind": "patch",
          "published_at": "2026-05-27T04:37:25Z"
        },
        {
          "tag": "v0.6.17",
          "kind": "patch",
          "published_at": "2026-05-26T13:06:50Z"
        },
        {
          "tag": "v0.6.13",
          "kind": "patch",
          "published_at": "2026-05-26T10:25:42Z"
        },
        {
          "tag": "v0.6.12",
          "kind": "patch",
          "published_at": "2026-05-26T09:35:44Z"
        },
        {
          "tag": "v0.6.11",
          "kind": "patch",
          "published_at": "2026-05-26T08:45:25Z"
        },
        {
          "tag": "v0.6.10",
          "kind": "patch",
          "published_at": "2026-05-26T08:27:29Z"
        },
        {
          "tag": "v0.6.9",
          "kind": "patch",
          "published_at": "2026-05-26T07:53:38Z"
        },
        {
          "tag": "v0.6.8",
          "kind": "patch",
          "published_at": "2026-05-25T19:33:01Z"
        },
        {
          "tag": "v0.6.7",
          "kind": "patch",
          "published_at": "2026-05-25T18:17:57Z"
        },
        {
          "tag": "v0.6.6",
          "kind": "patch",
          "published_at": "2026-05-25T17:48:16Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-05-25T14:19:02Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-05-24T14:39:54Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-05-24T11:33:34Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-05-24T09:59:54Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-05-23T21:49:23Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-05-16T22:19:22Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-05-12T06:13:04Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-05-10T21:32:06Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-05-03T11:24:20Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-02T10:01:48Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-05-02T07:57:59Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-05-02T04:36:06Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2026-04-20T07:31:55Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-04-20T06:56:00Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-04-18T23:27:45Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-04-18T09:11:55Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-04-18T08:10:07Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-04-18T06:27:13Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-04-18T05:38:09Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-04-18T05:29:40Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-04-18T05:00:40Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-04-17T20:10:07Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7eccfdefd907ccd7cc08b037bec47a486fbf15ae",
          "body": "The engine reads advanced.chunkSeconds but AdvancedTranscribeOptions\ndidn't have the field yet. Added it + wired the two construction\nsites in transcription_screen.dart. 141 key tests pass.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add chunkSeconds to AdvancedTranscribeOptions + construction sites",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-16T21:38:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "41a766ba5c4c8664d0b7b73d54375ee137241585",
          "body": "…d, §14.3l, §13.3m)\n\n- AdvancedOptions.chunkSeconds slider (0-120s) wired through engine\n  + worker pool to transcribeChunked() — reduces peak memory on\n  long Parakeet files\n- ColBERT late-interaction scoring in SemanticSearchService when\n  embedder.hasColbert — encodeMultivec + colbertScore MaxSim\n[…]\n not yet exposed\n- OmniVoice TTS-steps already wired (§11.3); GPU codec not in C API\n- Localized EN/DE/ZH for chunk-seconds slider\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: chunk-seconds setting, ColBERT search, C2PA verification (§14.2…",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-16T21:11:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "55ed2b01fe82d6865b64f86eaa80d9cf05f1c575",
          "body": "§14.1a/b done (deps pulled, version updated), §14.2g/14.3h/j/k\ndone (engine-side improvements, automatic with dep update).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: mark completed §14 items in PLAN.md",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-16T20:30:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "30aa05b1b702b9007180caff8cf029ea1931dabf",
          "body": "…14.3i)\n\n- docs/DPIA.md: Data Protection Impact Assessment for biometric\n  voice embedding processing (GDPR Art. 35)\n- docs/AI_ACT_TECHNICAL.md: Annex IV technical documentation\n  (intended purpose, architecture, testing, data governance,\n  risk management, post-market monitoring)\n- ModelKind.omr + \n[…]\nes: SMT++ Grandstaff, SMT++\n  Full-Page, Polyphonic-TrOMR, Flova, Transcoda-59M\n- PLAN.md §13.3k/l marked done, §14.3i marked done\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: DPIA + Annex IV docs, OMR music engines in catalog (§13.3k/l, §…",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-16T20:29:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d620a6ca78914c255e015d6295e6b0165c437f22",
          "body": "…, consent gates (§13)\n\nWire real COSE/X.509 C2PA signing via CrispASR's c2pa-audio FFI,\nreplace easy disclaimer opt-out with burden-shift attestation,\nadd voice-clone consent gate in wizard + server (403), Art. 52\nfirst-use transparency dialog, default syntheticDisclosure=true\nin all exports, risk classification doc, PRIVACY.md biometric\nsection. 53 compliance tests (up from 14), 1164 pass / 0 fail.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: EU AI Act full compliance — C2PA signing, mandatory disclaimers…",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-16T20:19:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "879204085c0488db53790dba97c20517ce786ff2",
          "body": "…exit 143)\n\nci.yml's \"Build macOS (.app)\" runs build_macos.sh with an unbounded\n`--parallel`, so the ever-growing libwhisper.dylib link now OOM-kills the\nmacos-latest runner (\"runner received a shutdown signal\", exit 143) — it\npassed at 40d04cb and broke once CrispASR@main grew. release.yml's macOS \n[…]\nburning 6 h.\nNot related to the glint_audio rename (the failure is in CrispASR's native\nlink, which builds separately from glint).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): cap macOS build parallelism (JOBS=2) — libwhisper link OOM (…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-15T09:48:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b049be0ad3f65619a58ab6d99390e4d7e2a8b371",
          "body": "…ore upload\n\nv0.9.4 finally archived + signed + validated + reached Apple's servers, which\nrejected the binary: UIBackgroundModes listed 'background-processing' and\n'background-fetch', which are Xcode capability *labels*, not valid plist\nvalues (the real values are 'processing' / 'fetch'). The app s\n[…]\n error (altool reported exactly 2, both\nUIBackgroundModes); privacy strings, icon, and encryption declaration all\nalready present.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios): drop invalid UIBackgroundModes values (ITMS-90112) — App St…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-15T07:21:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48a2508a4dd1f48436ff3b29ca72d678ab3c29dc",
          "body": "…visory\n\nv0.9.3 archived + Distribution-signed + exported a valid IPA, but the\nValidate step failed: `altool --validate-app` was missing `--apple-id`, so\nit couldn't resolve the app (\"Cannot determine the Apple ID from Bundle ID\ncom.crispstrobe.crisperweaver\"), which then skipped Upload. Pass\n--appl\n[…]\n— the\nUpload step re-validates server-side and is the real gate, so a validate\nquirk must never block the actual App Store upload.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios): give altool --validate-app the --apple-id; make validate ad…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-15T06:57:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "db5c8aeb2c7ef93f36441aedba648fb4c375bc57",
          "body": "…ner.ipa)\n\nThe v0.9.2 iOS run got all the way through archive + Distribution-signed\n-exportArchive (a 45 MB signed IPA was produced), but the guard hardcoded\n`Runner.ipa` while xcodebuild names the export after PRODUCT_NAME\n(crisper_weaver.ipa), so the guard exit-1'd on a *successful* export and\nVal\n[…]\nt L9PHHNLY9Y — the two\nApp Store profiles are now bound to BOTH dist certs (secrets refreshed), and\nthe export cert error is gone.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios): export globs the real IPA name (crisper_weaver.ipa, not Run…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-15T06:38:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d059e133867bea28929790d33691456061143867",
          "body": "…o rename\n\nTwo release-blockers fixed:\n\n1. iOS App Store upload silently never happened. Build 71's release run\n   went green but ASC shows 0 builds: `flutter build ipa` used *automatic*\n   signing, which on a headless runner has no Apple account and no profile\n   (\"No profiles for com.crispstrobe.c\n[…]\norting file; symbols (GlintCodec, GlintDecodedAudio, encode/decode)\n   unchanged. Native lib names (libglint/glint.dll) unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios+glint): real App Store signing (manual profiles) + glint_audi…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-15T05:57:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "40d04cb3c2cbe511d46ef5be4e4a728ccedc6f7e",
          "body": "…sing reject\n\nCrisperWeaver's iOS build showed no App Store icon and build 70 was\nrejected during processing (never registered in App Store Connect). Root\ncause: ios/Runner/Info.plist carried legacy CFBundleIcons +\nCFBundleIcons~ipad dicts whose CFBundleIconFiles arrays listed\n`Icon-App-1024x1024@1x\n[…]\ndy has the valid 1024² no-alpha icon,\nso the asset catalog is the sole, correct source. Bump build 70 -> 71 for\na clean re-upload.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios): remove legacy CFBundleIcons — fixes App Store icon + proces…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-15T04:44:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c5fb59dcd8dda8c475dfe41f5043a3a28a65a448",
          "body": "…alse-flag)\n\nThe new dumpbin guard hard-failed the Windows build on WINHTTP.dll, which\nis a core Windows system DLL (always in System32) that crispasr.dll imports\n— a false positive from the hand-maintained allowlist. Replace the allowlist\nwith a robust check: a dependency is fine if it's bundled ne\n[…]\ntself is confirmed working — the build logs show\n\"kokoro/piper: espeak-ng via dlopen at runtime (MIT-clean)\", i.e. no espeak\nlink.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): Windows dep guard — treat System32 DLLs as system (WINHTTP f…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T13:34:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5423db6e14e7c8f6cbe4b6dc5346d7bced6a31e7",
          "body": "App Store distribution can't include GPL, and we don't want the GPL\nredistribution burden on desktop either. Make every shipped build GPL-free\nwhile keeping user-provided espeak working:\n\n- Build CrispASR WITH_ESPEAK_NG=AUTO on all platforms (dlopen at runtime,\n  NOT linked) — kokoro/piper use the b\n[…]\nD-3, Xiph), glint (MIT), libmpv (LGPL-2.1+, Win/Linux).\n\nThe Windows dumpbin guard verifies crispasr.dll no longer imports espeak.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(license): GPL-free builds (drop espeak-ng bundling) + attributions",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T13:07:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "55c9ac8c151865053a61ab8cb7fdba654e05b117",
          "body": "… runs\n\nThe dependency check no-op'd ('dumpbin not on PATH') because dumpbin lives\nin the MSVC toolchain, not on PATH without a vcvars shell. Resolve it via\nvswhere (present on GitHub windows runners) so the guard actually verifies\ncrispasr.dll's imports are bundled.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): locate dumpbin via vswhere so the Windows dep guard actually…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T11:46:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "464f63c0a31f5dbc68db063e716eebb23fe9daab",
          "body": "…, #30)\n\nReported on #30 after v0.9.1: on Windows, loading a non-whisper model\ncrashed with \"Failed to load dynamic library 'crispasr.dll' ... (error\ncode: 126)\". crispasr.dll IS present, but 126 means one of ITS imports\ncan't be resolved. Root cause: CRISPASR_OPUS_FETCH=ON + BUILD_SHARED_LIBS\n=ON m\n[…]\n DLL crispasr.dll imports is missing from the bundle (mirrors the Android\n  NEEDED-deps check), so this can't ship silently again.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): bundle opus.dll + ogg.dll on Windows (crispasr.dll error 126…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T11:26:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3398d1f5832257132055f54fa61f03152a213971",
          "body": "The App Store `.p8` secret (APPSTORE_API_KEY_P8) is malformed — it decodes\nto neither a valid base64 .p8 nor a valid raw PEM, so signing can't work\nuntil it's re-set (a secret only the owner can fix). Previously that hard-\nfailed the whole iOS job, so NO iOS artifact shipped even though the job's\nna\n[…]\nestore App Store upload: re-set APPSTORE_API_KEY_P8 as base64 of the\nAuthKey_9RMU3C7422.p8 (fleet convention, see ../appstore.md).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): iOS release always ships the unsigned sideload IPA",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T08:17:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4a132e8ca352fc5eeb5db330306e9e3479dd901",
          "body": "…release)\n\nThe v0.9.1 release build failed on two platforms — both unrelated to the\nrelease's code changes:\n\n- **iOS** \"Export signed IPA\" → `Invalid authentication key credential\n  (truncatedASN1Field)`. The App Store `.p8` secret is stored\n  base64-encoded (fleet convention, same as IOS_DIST_P12 a\n[…]\ncheckouts were\n  missing `submodules: recursive` (every other platform has it), so the\n  ggml submodule never populated. Added it.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): iOS .p8 base64-decode + Android CrispASR submodules (v0.9.1 …",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T07:49:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a0b5ea322517dc5dafd93bb5bec3db005388b143",
          "body": "Bump version 0.9.0+69 -> 0.9.1+70. Add RELEASE_NOTES_v0.9.1.md; record\nthe release in CHANGELOG.md and PLAN.md (§5.24 H/I).\n\nCovers everything since v0.9.0: on-device MP3/AAC/Opus via glint,\nCrispASR 0.8.10 backend catch-up (MOSS-Diarize/TTS, OmniVoice,\nIrodori-TTS, Voxtral-TTS, Canary-Qwen, Nemotro\n[…]\nto-routing\nfix + detectBackendFromGguf binding-bug fix, the iOS App Store signing\npipeline, widget tests, and CI robustness fixes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v0.9.1 — codecs, MOSS + 5 backends, #30 fix",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T07:07:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48fa99d017087007de9ff8c66412692e051d7eac",
          "body": "It transcribed 2 s of silence through PLAIN whisper-tiny and asserted a\nnear-empty result, but whisper hallucinates on silence (\"you\", \"Thank\nyou.\", subtitle credits) so the assertion was flaky; worse, unlike every\nother live test it wasn't gated on the opt-in and didn't pass libPath, so\nit ran duri\n[…]\nb via\nlibPath, so the default gate skips it (green) and run_live_tests.sh runs\nit. Full `flutter test` now 1160 passed / 0 failed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(test): make the §12.1e VAD-silence live test deterministic + opt-in",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T07:04:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2c3c65479065d78e071d141bfbad0db3494e1925",
          "body": "The backend_dispatch guard (which only runs with the real dylib present)\nflagged engine backends the catalog had fallen behind on. Add them so\nthey surface in the app, and reconcile the guard's allowlists.\n\nAdded (BackendRepo + ModelDefinition + recommendedDefault, + kindForBackend\nfor TTS):\n- omniv\n[…]\nend transcribes jfk.wav\n(alt_asr_backends_live_test). backend_dispatch + catalog invariants green\nagainst the built v0.8.10 dylib.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: catalog v0.8.10 engine backends (omnivoice, irodori-tts, +3)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T06:55:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6e94d91dbffc0b0ece7f26f6d35e77588068ce0",
          "body": "The `crispasr` package's detectBackendFromGguf checks `if (rc != 0)\nreturn null`, but the C ABI returns strlen(name) (>0) on a successful\narchitecture match and 0 on no-match — so the package wrapper returned\nnull for EVERY backend it detected. That made the GGUF-metadata\nauto-routing dead: the #30 \n[…]\nere arm without the\n  \"Model uses the whisper backend\" crash.\n\nVerified live (arch metadata reads `cohere-transcribe` → `cohere`).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: correct detectBackendFromGguf so #30 auto-routing actually works",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-14T06:54:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f4207a1f3a64ba4707ca76d4c1bb0fa6d0ede5b",
          "body": "Both are already compiled into the CrispASR flutter-bundle library\n(unconditional add_library + auto-pulled into crispasr-lib), so this is\npure catalog/UI wiring.\n\n- moss-diarize (backend `moss-diarize`, cstr/MOSS-Transcribe-Diarize-GGUF):\n  single-pass ASR + speaker diarization + timestamps (Whispe\n[…]\nranscribe_diarize in the build-script BACKEND_TARGETS for early\nerror surfacing. Catalog invariant + parity guard tests pass (40).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add MOSS-Diarize + MOSS-TTS backends to the model catalog",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-13T16:30:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f177c5fa3b0fb4c76df0256925ed3a5f87f4941",
          "body": "The Linux smoke build (ci.yml) and release Linux job compiled CrispASR\nwith unbounded `cmake --build --parallel`, spawning one heavy g++ per\ncore and getting OOM-killed on the runner — a pre-existing failure on\nevery recent commit. Cap to --parallel 2 (JOBS=2 for the script path),\nthe same guard the macOS release job already uses.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): cap Linux CrispASR build parallelism to avoid OOM (exit 143)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-13T16:19:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e0e02a2b7bdc28f8b7a6f1733d8c492a4c4e64ed",
          "body": "flutter pub get resolves the new glint path dependency on every platform,\nincluding web, so the deploy-web job needs the sibling checkout or pub get\nfails. (The web build itself uses the dart:ffi-free glint stub.)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): check out ../glint in the web-deploy workflow too",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-13T14:13:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "de8e5cc506e75db7ddb402ecb5748ca9a46b2760",
          "body": "Wire the sibling `glint` clean-room codec suite (MIT, dependency-free)\ninto the app so compressed audio encodes/decodes on-device, closing the\nlong-standing \"WAV-only export, ffmpeg-punt decode\" gap.\n\nDart layer\n- lib/native/glint_native{,_stub,_import}.dart: conditional-import wrapper\n  (same patte\n[…]\n: MP3 + Opus encode->decode round-trips\nagainst the real libglint.dylib (test/glint_codec_test.dart). Other\nplatforms build in CI.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: on-device MP3 / AAC-LC / Opus codec via bundled glint (no ffmpeg)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-13T14:11:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "282482889c5fc18d9945570405735f363b38cdc8",
          "body": "…ng (#30)\n\nThe \"Add from HuggingFace repo\" dialog collapsed `auto` to the whisper\nbackend for the probe pass and only ran the GGUF-metadata auto-detect on\n*download*, so a manually-placed / linked non-whisper model (e.g. Cohere\nASR) stayed tagged `whisper` and crashed the whisper pipeline at load.\nO\n[…]\ns offers an explicit\n  override (incl. cohere) even when the dylib underreports.\n- tests: regression coverage for overrideBackend.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: auto-route non-whisper GGUFs from HF-repo link instead of crashi…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-13T13:46:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d296b2fb33de2acd7a9a9b5b880d4c73204d17fa",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): use flutter build ipa for archive instead of raw xcodebuild",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-12T13:56:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2c4145ba304ba741bf04896d49a5f2b92bb64d29",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): import Distribution .p12 into build keychain",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-12T09:47:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "273279a2cbed960015c68ea1bb5bdc772f98552d",
          "body": "The APPSTORE_API_KEY_P8 secret contains raw .p8 content, not base64.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): write API key as raw PEM, not base64",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-12T08:15:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "052e989725cf595e78105eec510be9c010d2a2cc",
          "body": "Following the proven appstore.md playbook (CrispChess/CrispSudoku/\nCrispDeck pattern):\n\n- ExportOptions.plist: method app-store → app-store-connect\n- pbxproj: delete 3x stale CODE_SIGN_IDENTITY[sdk=iphoneos*]\n  overrides that conflict with Automatic signing (Step 4 gotcha)\n- .gitignore: add .appstor\n[…]\n app record in App Store Connect (browser)\n  2. App Privacy nutrition label (browser)\n  3. Set APPSTORE_APP_ID secret after step 1\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: iOS App Store signing pipeline (API-key-driven)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T13:50:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "30e7997e56eaa98183cf59327393355f60931eec",
          "body": "- TranscriptionScreenProvider: 7 tests (defaults, advanced options,\n  language, diarization, model name, file path, tag languages)\n- SynthesizeScreen: 11 tests (provider defaults, speed, s2s, advanced,\n  speaker selection, emotion tag insertion, tag data)\n- Fix m2m100 HF repo path in Kaggle kernel (cstr/m2m100-418m-GGUF)\n- PLAN.md: zero unchecked items remaining\n\n19 new tests, all passing.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: widget tests for transcription + synthesize screens (§8.7)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T12:10:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c26f10084cd2db12505c785c9c83295c587ab88d",
          "body": "Kaggle GPU kernel results (P100, CUDA):\n- whisper-tiny ASR: PASS\n- gemma4-e2b-it local LLM chat: PASS\n- lfm2-audio-1.5b speech-to-speech: PASS (27.4x realtime)\n- m2m100 translation: SKIP (repo path issue, not a code bug)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: mark LLM cleanup + S2S live tests as DONE (Kaggle validated)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T11:45:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d76eda9908b7132c42091628697b6c99372cbbaa",
          "body": null,
          "is_bot": false,
          "headline": "fix: Kaggle kernel — resolve_hf_token not hf_token",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T11:11:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d98b9dca417500d02e6a015cca57f22a930c781",
          "body": null,
          "is_bot": false,
          "headline": "fix: Kaggle kernel — update harness + fix build_heartbeat label arg",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T10:42:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "814b9435a4d013f516aaf5a0a447dc9f452e4eb8",
          "body": null,
          "is_bot": false,
          "headline": "fix: Kaggle kernel — recurse submodules + switch to chr1str account",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T10:18:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc78d910430a70ad26e004d1cc57fcec7a7b1128",
          "body": null,
          "is_bot": false,
          "headline": "test: Kaggle GPU kernel for live validation (§5.24D, §9.2)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T09:17:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "23d55091946b7912bd567c717c2c80250055bed6",
          "body": "- AudioData constructor needs required channels/duration/sampleRate\n- verification_matrix_live_test: use session.close() not dispose(),\n  remove unused imports, simplify translation test\n- Depends on CrispASR fix for Pointer.elementAt deprecation\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: CI lint errors in tests (AudioData params, CrispasrSession API)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T08:08:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f0b21f8d86e173dbeac3eb4dfae5f08b9476526a",
          "body": "…ification tests\n\n- TTS speaker preview: play button on speaker dropdown synthesizes a\n  short sample with the selected voice (#173)\n- Global-scope diarization: diarizeFullAudio() creates uniform segments\n  from raw PCM and runs full-audio Pyannote/sherpa diarization (#110)\n- Per-token streaming: wi\n[…]\nd M2M100 EN→DE/FR translation (§5.24D)\n- PLAN.md: mark Wyoming, BidirLM-Omni, streaming, TTS preview,\n  global diarization as done\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: TTS voice preview, global diarization, per-token streaming, ver…",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T08:01:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc08a1ab205aa5c3ed6a73178b1c32be944ed42f",
          "body": "- PRIVACY.md: comprehensive privacy policy (required by both stores)\n- Fix privacy policy URL in app_constants.dart\n- Android: release signing via key.properties (debug fallback when\n  absent), .gitignore for keystore files, expanded ProGuard rules\n- iOS: remove unused NSCameraUsageDescription and\n \n[…]\ne\n- STORE_LISTING.md: pre-formatted descriptions, keywords, categories,\n  content rating answers, screenshot specs for both stores\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: app store readiness — privacy policy, signing, permissions",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-10T06:28:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d824d6e2b1b615b835dcbe3cae48af11bd2d78b2",
          "body": null,
          "is_bot": false,
          "headline": "Add app-marketplace additional permission (AGPLv3 §7)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-07-10T04:30:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b295c64e4deffd0acf286091db4b4cd81cad835",
          "body": "- ic_launcher.png: rounded corners (~22% radius) at all densities\n- ic_launcher_round.png: circular variant at all densities\n- ic_launcher_round.xml: adaptive round icon for API 26+\n- AndroidManifest: android:roundIcon added\n- app_logo_rounded.png: 1024x1024 rounded source asset\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: rounded app icons for Android + source logo",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-06T18:56:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "48c905f3bd590ddef73a4f0d8f91613990cf521d",
          "body": "- pubspec version: 0.8.7+68 → 0.9.0+69 (versionCode bump fixes\n  Android \"App not installed\" when upgrading from v0.8.8 APK)\n- msix_version: 0.8.6.0 → 0.9.0.0\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.9.0+69 for release",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-06T13:36:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "944757402648bfbd7336d7bc3508311ea7e1d41c",
          "body": "- Add CrispasrSession.transcribeChunked to web stub (fixes dart2js)\n- Fix Wyoming onError type annotation (inference_failure_on_untyped_parameter)\n- Remove unused imports: dart:math, dart:convert, crispembed_stub.dart\n- Remove unused elements: _sine440, _harness\n- Add RELEASE_NOTES_v0.9.0.md\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: CI lint errors + add transcribeChunked stub + release notes",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-04T19:32:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c70a8a47532d2b6625a6898acd824e4441cb6c41",
          "body": "End-to-end tests with real GGUF models confirm:\n- all-MiniLM-L6-v2 IQ4_XS: 384-dim L2-normalized vectors, cosine\n  similarity correctly ranks semantically similar texts higher\n- ms-marco-MiniLM-L-6-v2 IQ4_XS: isReranker=true, cross-encoder\n  scores relevant documents above irrelevant, rerankBiencode\n[…]\nurns false\n\nAlso validates CrispASR streaming segment symbols are exported\n(nm confirmed 4 new symbols in rebuilt libcrispasr.so).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add live validation for embedding, reranker, and LoRA APIs",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-04T18:08:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "780cec06c630401d20de319845ccd21edfad51a8",
          "body": "Poll crispasr_drain_streamed_segments() during session transcription\nto fire onSegment callbacks in real-time as LLM-ASR backends\n(Qwen3/ARK/MOSS) commit segments. Previously onSegment only fired\nafter the full transcription completed.\n\nAdds stub functions (getStreamedSegmentCount, drainStreamedSegments,\nresetStreamedSegments) for web/test compatibility.\n\nDepends on CrispASR feat/streaming-segment-callback (1f48dfc7).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: wire streaming segment polling from CrispASR 0.8.8",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-04T14:53:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1353c0783f45d9b56f5a82fb9bab04d76da94ec5",
          "body": "Integrate new capabilities from both sibling repos into CrisperWeaver:\n\n- Add .amr audio format support, Qwen3-ASR-1.7B-JA catalog entry\n- Chatterbox emotion tag [laugh]/[whispering]/[angry] quick-insert buttons\n- CrispEmbed stub parity: reranker, sparse, ColBERT, vision, LoRA, config APIs\n- Reranke\n[…]\ncaching\n- Rebaked catalog.json (369 entries from 120 repos)\n- Engine version bump 0.8.0 → 0.8.7\n\n1103 tests pass, 23 skip, 0 fail.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: CrispASR 0.8.7 + CrispEmbed 0.13.0 integration sweep (§12)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-04T13:44:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "95c4e26bf2cd8557b60538380e76170ae584f7a3",
          "body": "Switch from session.transcribe() to session.transcribeChunked() in the\nengine and worker isolate. This activates CrispASR's bounded\noverlapping-window path for Parakeet and other CTC backends, preventing\ndropped sections on files >30s. Falls back to transcribe() on\nnon-Parakeet backends and older dylibs. Progress polling already wired.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: use transcribeChunked for long-form audio (#208)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-02T12:18:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "81d606e93fc9afdedc01dbc297bbf11a8c710206",
          "body": "New TTS backend from latest CrispASR — Tacotron-lite + HiFi-GAN,\n13M params, 22 kHz output, character-level (no phonemizer needed).\nEnglish and German locales, ~38 MB Q8_0 each. Apache-2.0.\n\nLive-tested: synthesizes \"Hello world...\" to 4.5s WAV at 22050 Hz.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add BananaMind-TTS V2.1 backend to model catalog",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-02T12:00:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "368bb61f1566619bfa6d3834ec4467767840d090",
          "body": "CLI tests (3 failures): Process.run('dart', ['run', ...]) hung inside\nflutter test because Platform.resolvedExecutable returns flutter_tester,\nnot dart. Now resolves the real dart binary from the Flutter SDK cache\nand runs the CLI entrypoint directly (no build hooks).\n\nHotwords test (1 failure): was\n[…]\nport\n- Bump action-gh-release v2→v3, setup-java v4→v5, setup-android v3→v4\n  (fixes Node.js 20 deprecation warnings in release CI)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve 4 test failures + bump CI action versions",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-02T09:17:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "004e2d608a56e8876203c5df2a7aaf572d609551",
          "body": "1. Enable CRISPASR_OPUS_FETCH=ON in ALL platform build scripts (macOS,\n   Linux, Windows, iOS) and release CI — not just Android. Ensures\n   native .opus decode works everywhere, not only where pkg-config\n   happens to find libopusfile.\n\n2. Add post-build symbol verification to release CI (Android +\n[…]\n + backend enumeration\n   - Android MediaCodec platform channel (decodeToWav)\n   - test_driver/ + scripts/run_integration_tests.sh\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: CI symbol guards + integration test infra for audio decode",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-02T08:44:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0452ca1da4bcbbb86496630be983dda1e946383b",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.8.7+68 for release",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-01T10:31:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8496987211f6f400284eeafd2b2fe5d7635e591d",
          "body": "Enable CRISPASR_OPUS_FETCH=ON in the CI Android build so libopus/opusfile\nare statically linked into libcrispasr.so. Add an Android MediaCodec\nplatform-channel fallback for older builds without native opus support.\nFixes WhatsApp .opus audio files failing to decode on Android.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(android): native opus decoding + MediaCodec fallback (#26)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-07-01T10:30:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2def320468dc1bc85edb52a53a87244a2068b291",
          "body": "…rols (PLAN §11)\n\nAdd model catalog entries for dots-tts, higgs-stt, ark-asr,\nmoss-transcribe, gemma4-e4b, reazonspeech, parakeet-ctc-1.1b-ja\nwith BackendRepo + companion models.\n\nWire 6 new TTS session setters (topK, doSample, ttsNumCandidates,\nsetSpeakerId, g2pDict, ttsNoiseTemp) through FFI stubs\n[…]\neamSize().\n\nAdd diarized_json server response format and --diarize-speakers\nCLI alias. 47 new unit tests (1017 total, 0 failures).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: CrispASR 0.8.x parity — 7 new backends, 6 TTS setters, ASR cont…",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-30T19:22:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c7d9663de4e20c5b27f5b0e1042cebd81ef2c2a1",
          "body": "Picks up CrispASR 0.8.5 (granite long-audio fixes) and transitive\ndependency updates.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump version to 0.8.5+66 for release",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-30T18:23:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "af7facb5a572c479f3d91ca5bfae13356dee5101",
          "body": "The manual re-link step that creates the single libcrispasr.so from\nall static archives was missing -lmediandk. Since CrispASR v0.8.2\nthe NDK media decode path is compiled when __ANDROID__ is defined,\nbut without linking the system library the .so has unresolved\nAMEDIAFORMAT_KEY_* symbols, causing d\n[…]\nso whitelist libmediandk.so in the NEEDED-dep sanity check (it's\na system library on Android API 21+, like liblog.so).\n\nCloses #29\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(android): link libmediandk in all-in-one .so build (#29)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-30T14:26:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e078246d410d70f0f11f5b35f8f834cb0eb8463b",
          "body": "…ed\" (#28)\n\nThe _startTranscription catch block was displaying \"model not downloaded\"\nfor every loadModel failure — backend mismatches, checksum errors, OOM,\netc. Now it checks the error type and shows the real message for\nnon-download failures, matching the existing init-time error handling.\n\nAlso fixes diagnostic path construction in crispasr_engine to use\npath.join instead of string concatenation.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(android): show actual error instead of always \"model not download…",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-29T13:18:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2d38038e11a3ac3e788f9c4fed5a5f8c6579793",
          "body": null,
          "is_bot": false,
          "headline": "Fix web watermark verification file handling",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-25T07:11:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "42f01d42b1f5b281340f715ef43a0ceb28568eec",
          "body": null,
          "is_bot": false,
          "headline": "Add export and responsive utility tests",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-25T06:51:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3dc490a23443582d68af40966e848e628402831e",
          "body": null,
          "is_bot": false,
          "headline": "Enable Chinese interface locale",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-25T06:49:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "224fe397c961d173e09493dbdf4f1b619ffa0c4b",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump version to 0.8.4+65",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-24T18:28:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10f5f6d2a637b8d4e1e838d26d6d2d6290053859",
          "body": "crispasr_audio.cpp uses ExtAudioFileOpenURL/Read/etc on Apple platforms.\nThe xcframework combine() step omitted -framework AudioToolbox, causing\nan arm64 link failure. Also adds it to the module.modulemap link directive\nso downstream consumers inherit the transitive dependency.",
          "is_bot": false,
          "headline": "fix(ios): link AudioToolbox for ExtAudioFile* symbols",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-24T18:28:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "814423f35e5efc6de4aafd0eaf948a86db4accc5",
          "body": "xoroshiro128+ and splitmix64 seeding now use Int64 from package:fixnum,\nwhich wraps 64-bit arithmetic correctly on both native and dart2js/web.\nRemoves the conditional export split (_native/_web stubs); single file\nworks on all platforms. Promotes fixnum from transitive to direct dep.",
          "is_bot": false,
          "headline": "feat(watermark): proper dart2js-compatible PRNG via package:fixnum",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-24T17:22:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cf281fbdba638db56fc855990afd9cbc120a167",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: bump version to 0.8.2+63",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-24T16:44:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c29f46d90ae323c124aea7c92d09cdf79b5d17c1",
          "body": "dart2js cannot represent int literals larger than 2^53 (e.g. 0x437269737041535F,\nsplitmix64 constants). Use a conditional export so native builds keep the full\nxoshiro128+ implementation and web builds get a no-op stub (embed returns pcm\nunchanged, detect returns 0.0).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): stub out 64-bit watermark math for dart2js",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-24T16:43:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91b9141545a0f8bd43f9d4e28fc42d1a10b3fa77",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: bump version to 0.8.1+62",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-24T16:34:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e65c343b11a0b73c6d37676650510dc967748223",
          "body": "Full translation of all ~380 UI strings. Generated via flutter gen-l10n;\napp_localizations_zh.dart auto-generated.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(i18n): add Chinese Simplified (zh) locale",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-24T16:32:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d7bd9d85e1302b8d2841a9030c58034efeebc681",
          "body": "Port the frequency-domain spread-spectrum watermark from CrispTTS to\npure Dart. Uses the same xoshiro128+ PRNG, bin pattern generation, and\nSTFT overlap-add approach as CrispASR's C implementation, so watermarks\nembedded by any of the three codebases are cross-detectable.\n\nTTS pipeline now applies s\n[…]\nand heuristic\nAI detection.\n\n7 new unit tests (embed/detect round-trip, SNR, short-audio edge cases).\n912 tests total, 0 failures.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: pure-Dart spread-spectrum watermark (CrispASR/CrispTTS compat)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-22T10:00:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "523d8922018386409ee88a27583ec936a6221c3b",
          "body": "AudioService.loadAudioFile now falls back to ffmpeg when CrispASR's\nminiaudio backend rejects a file (opus, webm, m4a/aac, mp4, wma).\nConverts to 16kHz mono WAV via pipe, then re-decodes through the\nnative path. Gracefully degrades when ffmpeg isn't installed.\n\nNew test: audio_format_decode_test.dar\n[…]\nASR 0.8.0 + ffmpeg fallback.\n\nAlso: removed EU AI Act references from source comments and docs,\ncleaned up duplicate doc comments.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: ffmpeg fallback for opus/webm/m4a + format decode tests",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-22T09:19:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "757e54f71b8011faf1ebb65ccbc3160e1c1286af",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update HISTORY.md and PARITY.md with EU AI Act compliance",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-22T07:33:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "547a7ba4bef95231d30098306f9e95a275c26dd7",
          "body": "Export disclosure: syntheticDisclosure now wired through saveTranscription\nto all export formats (SRT/VTT/JSON/Markdown). Enabled by default via\nAppConstants.enableSyntheticDisclosure.\n\nSynthesize screen: compliance indicator card shows which AI provenance\nmarkers are embedded (watermark, WAV metada\n[…]\nVerify Watermark dialog alongside watermark +\nC2PA detection for a three-layer verification result.\n\n905 tests passed, 0 failures.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: EU AI Act Art. 50 compliance — full provenance chain",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-22T07:20:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "80eeea95840e331fc2168e96fba86f76d9aa333f",
          "body": "permission_handler_windows 0.2.1 uses <experimental/coroutine>\nwhich MSVC 14.51 (Visual Studio 18) rejects with a static_assert.\nThe plugin hasn't migrated to C++20 <coroutine> yet. Add the\n_SILENCE_EXPERIMENTAL_COROUTINE_DEPRECATION_WARNINGS define to\nwindows/CMakeLists.txt to unblock the build.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(windows): suppress MSVC experimental coroutine deprecation",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-22T04:28:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "74e6c6af6a27dc0e950e6b9b808651bb6f2e76ae",
          "body": "libtool -static kept ALL .o files causing duplicate symbol errors.\nRevert to ar-based combining but with a smarter dedup: prefix each\n.o with its source library name (avoiding cross-lib collision for\nsame-named files like nemotron.o), then deduplicate by md5 content\nhash (collapsing true duplicates like ggml symbols that appear in\nmultiple archives with identical content).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios): content-hash dedup for static lib combining",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-21T20:50:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e6815477ebaedc06237717a90331aa1ff1b52684",
          "body": "The ar-based dedup step dropped identically-named .o files from\ndifferent libraries (nemotron.o from libnemotron.a vs nemotron.o\nfrom libcrispasr-llama-core.a), causing undefined symbol errors.\n\nSwitch to Apple's libtool -static which handles duplicate basenames\ncorrectly by renaming them internally in the combined archive.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios): use libtool instead of ar for static lib combining",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-21T20:39:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1ef69d91e585d197aed58ae5b9b1bd4cfbc4d5f1",
          "body": "The Xcode generator places per-target .a files in deeply nested paths\n(src/crispasr.build/Release-iphoneos/<target>.build/...) rather than\nflat under src/Release-iphoneos/. Replace the targeted find with a\nbroad recursive search of the entire build directory, excluding only\ntemp/dedup scratch dirs. This catches nemotron, truecaser_lstm, and\nany future targets regardless of Xcode's output layout.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios): broad find for all static libs in Xcode build tree",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-21T20:28:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5283ab919d3f6156aeb7c22cd9dc2acf9ca08039",
          "body": "The Xcode generator places some static libs (nemotron, truecaser_lstm)\nin nested subdirectories under src/Release-*/ rather than at maxdepth 1.\nRemove the maxdepth constraint and also search Build/Products/ for any\nlibs placed at the project root by Xcode.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios): broaden lib search for Xcode generator layout",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-21T20:17:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e5b4a4c32525bb7ad20cd588ef562bd6cf0572a5",
          "body": "The iOS xcframework build_ios_xcframework.sh only globbed\nsrc/Release-*/lib*.a for backend static libs. But fireredpunc,\npcs, truecaser, and text_lid are built under their own cmake\nsubdirectories (crisp_punc/ and crisp_lid/), causing undefined\nsymbol errors at the simulator link step.\n\nAdd the same glob pattern for crisp_punc/ and crisp_lid/ that\nalready existed for crisp_audio/.\n\nFixes the v0.8.0 Release CI iOS job failure.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ios): link crisp_punc + crisp_lid into xcframework",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-21T20:06:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5c0e8d652d39915ba61fcc3d009fb05ac228c0e1",
          "body": "CLI: transcribe gained 13 new flags (temperature, best-of, hotwords,\nseed, max-new-tokens, frequency-penalty, beam-size, ask, translate,\nvad, word-timestamps, vtt, target-language, initial-prompt). stream\ngained hotwords + temperature. synthesize gained temperature + seed.\n\nServer: WebSocket streami\n[…]\nx).\n\nTests: 905 passed, 0 failures. CrispEmbed §9.7 blocker resolved.\nFixed canary_ctc_aligner + lid_dispatch test API mismatches.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: v0.8.0 — full CLI/server/GUI parity + CrispASR 0.8.0",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-21T19:55:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "069afa63e6b8ea5a83e22efc8b9b5d5ba842a571",
          "body": "Verified the reachability sweep's flagged orphans: S2S is GUI-wired (s2sMode toggle + tts.speechToSpeech), aligner runs via the Settings word-timestamps toggle, watermark-detect is covered by CLI+server. Only an optional GUI watermark-verify button remains as minor UX. Recorded in docs/PARITY.md.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: §9.5 orphan audit — no true orphans (S2S/aligner GUI-reachable)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T17:07:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0c4740c9bf9f4edc0c63eabb00622a33aca663ab",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: §9.4 CLI complete + server diarize/watermark (PLAN/PARITY)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:53:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a34a221861aeaa4537a6e191a642e3c225dd2236",
          "body": "POST /v1/audio/diarize (transcribe + pyannote speaker labels) and POST /v1/audio/watermark (provenance watermark detect on the uploaded WAV). Tested in server_service_test (incl. a real watermarked:false on a plain WAV).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): add diarize + watermark-detect endpoints (§9.4)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:53:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "35a3da6711a311bae477ae637d145ebc96e21755",
          "body": "Completes the CLI capability surface: stream (rolling-window ASR), align (forced word timings), diarize (transcribe+pyannote), speaker enroll/match (TitaNet+SpeakerDB), s2s (speech-to-speech). Smoke-tested live: align word timings, speaker match→1.000, stream full JFK quote.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): add stream/diarize/align/speaker/s2s commands (§9.4)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:53:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b49388d2e0a2fa1ddbcdbe8c9c75c4cb84736c6",
          "body": "The engine links backends the catalogue hadn't registered (the backend_dispatch parity guard caught it against a freshly-built dylib). Added ModelDefinitions: nemotron-3.5-asr-streaming-0.6b (ASR), vibevoice-1.5b-tts (TTS + voicepack companion), tada-tts-3b-ml + tada-codec (TTS + codec companion). o\n[…]\nasr-ctc-300m model (catalogued under backend 'omniasr'), so it's added to the parity test's engineOnly set rather than duplicated.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(catalog): register nemotron / tada / vibevoice-1.5b backends",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:31:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aacc1083f01a6708b7f180d05ec20d010b993663",
          "body": "…ng (§9)\n\nRecords why VadService was a silent no-op (CrispASR ctor loads aux models as a whisper ctx → dispose SIGABRT; vad() returns -2, vadSlices() works) and why the CLI wraps package:crispasr directly instead of the Flutter service layer.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(learnings): VAD ctx/entrypoint FFI gotchas + CLI dart-run coupli…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:15:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "eb1e177bf2ce2e2fa859499be2041e25464ec5da",
          "body": "…RITY)\n\nPLAN §9 task tracker, HISTORY + CHANGELOG entries, and docs/PARITY.md (capability × {GUI,CLI,server} matrix + orphan notes). Records the VadService fix and the two FFI gotchas (open ctx on an ASR model; verify the entrypoint — vadSlices not vad).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: §9 test-coverage + CLI/server parity (PLAN/HISTORY/CHANGELOG/PA…",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:13:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7c261f40ae8521dbae426da2db1aea13e9b9900e",
          "body": "Shared model locator (test/support/crispasr_models.dart, opt-in via CRISPASR_LIB/RUN_LIVE_TESTS) + scripts/run_live_tests.sh. New live tests (validated green vs on-disk q4_k models): VAD, LID, punctuation, forced alignment, diarization, streaming ASR, 5 non-whisper ASR backends, translation, watermark detect. Plus pure-Dart unit tests for audio DSP, fingerprinting, watermark/ID3 metadata.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: live-test harness + 9 live tests + unit tests (§9.1-9.3)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:13:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "211889b5323de44d03fc8ead341dd9942427cdf0",
          "body": "POST /v1/audio/vad, /v1/audio/language (LID), /v1/text/punctuate — routed through the app's Riverpod services, toward GUI/CLI parity. Routing + validation covered by test/server_service_test.dart.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(server): add vad/language/punctuate endpoints (§9.4)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:13:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4e3efca7276660bdccafe79e5b7e921fe340ecd2",
          "body": "New bin/crisperweaver.dart (dart run crisper_weaver:crisperweaver): backends, transcribe (+--srt), vad, lid (audio/--text), punctuate, translate, synthesize (+--voice), watermark (embed/--detect). Wraps the FFI binding directly (no Flutter/Riverpod). Smoke-tested in test/cli_test.dart.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): headless crisperweaver CLI over package:crispasr (§9.4)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:13:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4f5dd380e9d30ddd1b7bf15674932bcaea0eb8ee",
          "body": "VadService called the legacy vad() entrypoint, which returns -2 (model init failed) for the bundled Silero and whisper-vad models, and SIGABRT'd on dispose (the CrispASR ctor loads modelPath as a whisper context). Now calls the free crispasr_vad_slices dispatcher directly via a new web-stubbed lib/native/vad_native.dart — no whisper context. Speech-span detection works again.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(vad): VadService silent no-op — use crispasr_vad_slices (§9.5)",
          "author_name": "CrispStrobe",
          "author_login": "CrispStrobe",
          "committed_at": "2026-06-20T16:13:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0b38b1a949b07f25722bd6799efd052627436f0d",
          "body": "When the device language is neither English nor German, the app\ndefaulted to German because 'de' was first in supportedLocales.\nAdd a localeResolutionCallback that explicitly falls back to English.\n\nFixes #25\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: fall back to English when system locale is unsupported",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-19T11:57:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1b0393ab9bf7d6718f7163afbd53611198c263e5",
          "body": "pubspec.yaml depends on ../CrispEmbed but the README only mentioned\ncloning CrispASR, and only build_linux.sh (after a recent edit) validated\nCrispEmbed's presence. Add the clone instruction to the README and a\nconsistent pre-flight check to all three build scripts.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add CrispEmbed to setup docs and pre-flight checks in build scripts",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-14T19:28:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "844ff83d21ae7c81ee7eaeab8094ae1a8e569e0c",
          "body": "Re-ran bake_models_catalog.dart to pick up the newly uploaded\nvibevoice-realtime-0.5b-q4_k.gguf variant. Orpheus q4_k still\npending on HF. Updated PLAN.md §5.18 accordingly.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: rebake catalog — vibevoice q4_k now available (636 MB)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T12:51:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "39234ba6f543aba52b2148730a2d3846deaae7c6",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: keep one-time catalog conversion script for reference",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T12:40:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dbd9b9acb7197eb5e1f32472b44158ba3b3eac20",
          "body": "§8.4 — Model catalog migrated from compiled Dart to JSON asset:\n- baked_models_catalog.dart deleted (−3,746 LOC)\n- Bake script emits assets/models/catalog.json (310 entries)\n- BakedCatalogLoader loads + caches JSON at startup\n- fromJson/toJson added to ModelDefinition\n- 15 new tests (13 unit + 2 liv\n[…]\nutable state + copyWith()\n- 143 new provider unit tests across 7 test files\n\nFull suite: 838 pass, 0 fail. dart analyze: 0 issues.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf: §8.2 setState reduction + §8.4 catalog-as-JSON",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T12:15:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f5cd76584f285ec4d1b11d74bfadf0a489794e9e",
          "body": "Match the local dev SDK (Dart 3.12.1). All 3 workflows updated:\nci.yml, deploy-web.yml, release.yml.\n\nAlso mark §5.22 item 8 (PrivacyInfo.xcprivacy) as shipped — manifest\nalready exists with all required-reason API declarations.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: bump Flutter 3.38.5 → 3.44.1 across all workflows",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T07:21:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff1f04abd08c9686fd9b9dbc4a071af4e8765dd5",
          "body": "CHANGELOG: add §8 summary under [Unreleased] — file splits, asset\ncompression, CI caching, +100 tests, analyzer clean.\n\nLEARNINGS: add 3 entries — file-size split threshold, HTTP client\nconsolidation trade-off, optipng -o2 sweet spot.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update CHANGELOG + LEARNINGS for §8 optimization pass",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T06:33:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0e0592e3de92e2dcc51ead21323b1f83bf849f91",
          "body": "Test count: 595 → 695 (+17%). All pure-logic services, models,\nand utility functions now have dedicated test coverage. Remaining\ngaps are widget tests for screens (lower priority).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update §8.7 test coverage — +100 tests in 8 new files",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T06:28:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aab625b5c9da3592a4dac36332d6595ac7e87a74",
          "body": "33 new tests:\n- AudioUtils (25): isSupportedAudioFile, formatDuration, formatFileSize,\n  float32↔bytes round-trip, normalizeAudio, calculateRMS, calculatePeak,\n  isSilence with threshold, stereoToMono, generateSineWave\n- FileUtils (8): sanitizeFilename (invalid chars, whitespace collapse,\n  underscore dedup, passthrough), generateUniqueFilename\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add AudioUtils + FileUtils tests (§8.7)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T06:23:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0bad256ed85362e3cf5ae20382c9953fc7b64561",
          "body": "11 new tests covering:\n- LogLevel rank ordering + 3-char tag invariant\n- LogEntry.format: timestamp/level/tag, error append, structured\n  key=value fields, space-quoting, stack trace toggle, toString\n- Log singleton: stability, stream emission, snapshot\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add LogService tests — entry formatting, levels, singleton (§8.7)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T06:06:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df42a8293734daa52a1e1f962ac164d58808267a",
          "body": "15 new tests:\n- SegmentTag (8): JSON round-trip, list serialization, unknown/null\n  handling, enum count regression guard\n- WatchFolderService (7): start/stop lifecycle, nonexistent dir safety,\n  audio file detection with debounce, non-audio extension filter,\n  dispose idempotency\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add SegmentTag + WatchFolderService tests (§8.7)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T06:01:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a280c93835223c75fdbbccbd12c2b23bddd8fdff",
          "body": "12 new tests covering:\n- JSON round-trip (with and without terms)\n- mergeForSpeakers: identified-only filtering, deduplication, unknown\n  speaker skip, empty set\n- File I/O: save/load round-trip, missing file, delete, listAll with\n  noise files, corrupt file skip, nonexistent directory\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add SpeakerVocab model tests — JSON, merge, file I/O (§8.7)",
          "author_name": "crispasr integration",
          "author_login": null,
          "committed_at": "2026-06-13T05:54:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 86,
      "commits_last_year": 522,
      "latest_release_at": "2026-07-15T07:29:12Z",
      "latest_release_tag": "v0.9.5",
      "releases_from_tags": false,
      "days_since_last_push": 14,
      "active_weeks_last_year": 14,
      "days_since_latest_release": 15,
      "mean_days_between_releases": 1.6
    },
    "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": []
    },
    "popularity": {
      "forks": 7,
      "stars": 41,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-01",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-06-13",
            "count": 1
          },
          {
            "date": "2026-07-10",
            "count": 1
          },
          {
            "date": "2026-07-11",
            "count": 1
          },
          {
            "date": "2026-07-25",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 7,
        "total_forks": 7
      },
      "star_history": null,
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "android/app/build.gradle.kts",
        "android/build.gradle.kts"
      ],
      "largest_source_bytes": 229870,
      "source_files_sampled": 304,
      "oversized_source_files": 7,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "android/build.gradle.kts"
      ],
      "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": [
        "maven"
      ],
      "dependencies": [],
      "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": 3,
        "closed_ratio": 0.897,
        "closed_issues": 26,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "CrispStrobe",
          "commits": 338,
          "avatar_url": "https://avatars.githubusercontent.com/u/154636388?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy-web.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 9,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 26 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "7eccfdefd907ccd7cc08b037bec47a486fbf15ae",
        "ran_at": "2026-07-30T23:54:56Z",
        "aggregate_score": 3.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-16T21:59:23Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 20,
          "created_at": "2026-06-09T16:05:05Z",
          "last_comment_at": "2026-06-11T06:43:59Z",
          "last_comment_author": "CrispStrobe"
        },
        {
          "number": 21,
          "created_at": "2026-06-09T16:06:36Z",
          "last_comment_at": "2026-06-11T06:44:08Z",
          "last_comment_author": "CrispStrobe"
        },
        {
          "number": 22,
          "created_at": "2026-06-09T16:14:24Z",
          "last_comment_at": "2026-06-11T06:49:34Z",
          "last_comment_author": "CrispStrobe"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/CrispStrobe/CrisperWeaver",
    "host": "github.com",
    "name": "CrisperWeaver",
    "owner": "CrispStrobe"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": "The weighted overall 51 is calibrated to 51 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 51,
            "calibrated": 51,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 51,
      "inputs": {
        "security": 35,
        "vitality": 76,
        "community": 40,
        "governance": 33,
        "calibration": "2026-08-02",
        "engineering": 66,
        "ai_readiness": 58,
        "weighted_overall_raw": 51
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 76,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "commits_last_year": 522,
              "human_commit_share": 1,
              "days_since_last_push": 14,
              "active_weeks_last_year": 14
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 14 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "522 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 522
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 26 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 86,
              "latest_release_tag": "v0.9.5",
              "releases_from_tags": false,
              "days_since_latest_release": 15,
              "mean_days_between_releases": 1.6
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "86 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 86
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 15 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 18,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 18 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 18
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "weak",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "forks": 7,
              "stars": 41,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "41 stars",
                "points": 26,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 41
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "7 forks",
                "points": 6.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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,
              "readme_badges": null,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "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 (AGPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "AGPL-3.0"
                    }
                  }
                ],
                "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": 33,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "weak",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 43,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 3,
              "closed_issues": 26,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 0.897,
              "closed_unmerged_prs": 2,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "90% of issues closed",
                "points": 37.7,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 90
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "0/2 decided PRs merged",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 0,
                      "decided": 2
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "followers": 43,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "CrispStrobe",
              "public_repos": 142,
              "account_age_days": 951
            },
            "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": "43 followers of CrispStrobe",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 43,
                      "login": "CrispStrobe"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "142 public repos, account ~2 yr old",
                "points": 18.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 142
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 66,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "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": [
                "asr",
                "flutter",
                "ggml",
                "on-device",
                "speech-to-text",
                "transcription",
                "whisper",
                "crispasr"
              ],
              "has_wiki": false,
              "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": "8 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "weak",
        "name": "Security",
        "value": 35,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 35,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.5
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 26 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "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": 58,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "weak",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.96,
              "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": "96 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 96,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 56,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.89,
              "toolchain_manifests": [
                "android/app/build.gradle.kts",
                "android/build.gradle.kts"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "android/app/build.gradle.kts, android/build.gradle.kts (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "android/app/build.gradle.kts, android/build.gradle.kts"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Dart (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Dart"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "89 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 89,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Dart",
              "largest_source_bytes": 229870,
              "source_files_sampled": 304,
              "oversized_source_files": 7
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Dart (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Dart"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "7/304 source files over 60KB",
                "points": 53.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 304,
                      "oversized": 7
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [],
      "labels": [],
      "scores": {},
      "primary": null,
      "evidence": [],
      "artifacts": [],
      "confidence": "none",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": false
    },
    "metrics_version": "2.5.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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T23:55:03.400354Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/CrispStrobe/CrisperWeaver.svg",
  "full_name": "CrispStrobe/CrisperWeaver",
  "license_state": "standard",
  "license_spdx": "AGPL-3.0"
}

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 v2.5.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 agregadas.