Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 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 Sterne⑂ 7 Forksseit Sept. 2025Auf GitHub ansehen ↗

CrispStrobe/CrisperWeaver erreicht einen Gesundheitsindex von 51 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (76/100) ab, am schwächsten bei Sustainability & Governance (33/100). Zuletzt vor 14 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

51
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer standardisierten Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr gewichtetes Mittel, kalibriert auf die Verteilung des öffentlichen Registers, sodass die Stufen Perzentilbedeutung tragen; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze Gefährdet von 34.

51
Außergewöhnlich93-100Die Spitzengruppe des Registers (≈ obere 5 %); erfüllt im Wesentlichen alle geprüften Kriterien
Exzellent80-92Durchgehend stark; geringfügige Lücken
Gut65-79Gesund; Lücken sind begrenzt und beherrschbar
Mittel50-64Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Schwach35-49Wesentliche Schwächen in mehreren Bereichen
Gefährdet20-34Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-19Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

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

Der gewichtete Gesamtwert 51 wird auf der veröffentlichten Indexskala auf 51 kalibriert (Register-Kalibrierung 2026-08-02).

Eigentümerschaft

CrispStrobePersönliches Konto
43 Follower142 öffentliche Reposseit Dez. 2023

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

Metriken nach Kategorie

Vitalität

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

76Gut · 21 % des Gesamtindex
Wie die Bewertung erfolgt
28.8/36Push-Aktualität — letzter Push vor 14 Tagen
9.7/36Commit-Rhythmus — 14/52 Wochen mit Commits
18/18Commit-Volumen — 522 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 26 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year522
human_commit_share1
days_since_last_push14
active_weeks_last_year14
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 86 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 15 Tagen
27/27Release-Rhythmus — ein Release etwa alle 1,6 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count86
latest_release_tagv0.9.5
releases_from_tagsnein
days_since_latest_release15
mean_days_between_releases1,6

Community & Verbreitung

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

40Schwach · 17 % des Gesamtindex
Wie die Bewertung erfolgt
26/60Stars — 41 Stars
6.5/25Forks — 7 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks7
stars41
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (AGPL-3.0)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
readme_badges
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
readme_badge_services
has_pull_request_templatenein

Nachhaltigkeit & Governance

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

33Gefährdet · 23 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
37.7/42Issue-Lösungsquote — 90 % der Issues geschlossen
0/30PR-Annahme — 0/2 entschiedene PRs gemergt
0/13Newcomer PR acceptance — kein PR eines Erstbeitragenden in 30 Tagen entschieden
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
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
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): newcomer_pr_acceptance. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
11.8/25Reichweite des Inhabers — 43 Follower von CrispStrobe
18.2/25Kontohistorie — 142 öffentliche Repos, Kontoalter ca. 2 Jahre
Verwendete Eingangsdaten
followers43
owner_typeUser
is_verified
owner_loginCrispStrobe
public_repos142
account_age_days951
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

66Gut · 19 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — keine Daten
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: CI-Tests. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 8 Topics
0/10Wiki
Verwendete Eingangsdaten
topicsasr, flutter, ggml, on-device, speech-to-text, transcription, whisper, crispasr
has_wikinein
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

35Schwach · 16 % des Gesamtindex
Wie die Bewertung erfolgt
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 — keine Daten
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.5Lizenz — 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 — keine Daten
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
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): ci_tests, packaging. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Trägt ein bewusst kleines Gewicht (4 %): Agenten-Tooling ist ein echtes Pflegesignal, doch ein Repository ohne jedes Signal kann weiterhin 100/100 erreichen.

58Mittel · 4 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 96 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,96
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — android/app/build.gradle.kts, android/build.gradle.kts (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Dart (statisch typisiert)
0/10Reproduzierbare Umgebung
10/10Belegte Agentenpraxis — 89 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,89
toolchain_manifestsandroid/app/build.gradle.kts, android/build.gradle.kts
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Dart (statisch typisiert)
53.7/55Handhabbare Dateigrößen — 7/304 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageDart
largest_source_bytes229.870
source_files_sampled304
oversized_source_files7

Eckdaten

41GitHub-Sterne
1Mitwirkende
522Commits, letzte 12 Monate
14Tage seit letztem Push
86Releases
1Bus-Faktor
3offene Issues
MavenPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 7 ⇿
0Sterne
7Forks
76Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

1234567712026-052026-062026-07
Major 0Minor 8Patch 67
OpenSSF Scorecard 3.5 / 10
3.5Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
k. A.CI-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
k. A.Packagingpackaging 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
Alle Abhängigkeiten nicht erhoben

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

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "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"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistiken.