Öffentliches Register
Software-GesundheitsberichtSchema 0.30.0 · Metriken 2.3.1 · 2026-08-03 02:40 UTC

skovtun / coherent-design-method

AI-powered design system generator — once designed, consistent UI everywhere.

TypeScriptMIT★ 22 Sterne⑂ 1 Forkseit Jan. 2026Auf GitHub ansehen ↗
ArtKommandozeilenwerkzeugMCP-ServerBibliothekwie das ermittelt wird

skovtun/coherent-design-method erreicht einen Gesundheitsindex von 75 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Engineering Quality (90/100) ab, am schwächsten bei Security (49/100). Zuletzt vor 10 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

75
gesamt / 100
Gut

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.

75
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 65 wird auf der veröffentlichten Indexskala auf 75 kalibriert (Register-Kalibrierung 2026-08-02).

Eigentümerschaft

Sergei KovtunPersönliches Konto
7 Follower2 öffentliche Reposseit Okt. 2019

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

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
npm@getcoherent/cli0.26.05.350245vor 10 Tagendesign-systemclifrontendaicode-generationnextjsreactcoherent
npm@getcoherent/core0.26.05.669244vor 10 Tagendesign-systemfrontendaicode-generationcoherent

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 10 Tagen
9/36Commit-Rhythmus — 13/52 Wochen mit Commits
18/18Commit-Volumen — 693 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year693
human_commit_share1
days_since_last_push10
active_weeks_last_year13
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 37 Releases veröffentlicht
27/36Release-Aktualität — letztes Release vor 95 Tagen
27/27Release-Rhythmus — ein Release etwa alle 0 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count37
latest_release_tagv0.17.1
releases_from_tagsnein
days_since_latest_release95
mean_days_between_releases0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

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

50Mittel · 17 % des Gesamtindex
Wie die Bewertung erfolgt
21.4/60Stars — 22 Stars
0/25Forks — 1 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks1
stars22
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
readme_badges4
has_contributingja
has_issue_templatenein
has_code_of_conductnein
readme_badge_servicesshields.io
has_pull_request_templatenein
Wie die Bewertung erfolgt
53.9/80Downloads pro Monat — 11.019 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packages@getcoherent/cli, @getcoherent/core
dependents
ecosystemsnpm
total_downloads
monthly_downloads11.019
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

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

54Mittel · 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
42/42Issue-Lösungsquote — 100 % der Issues geschlossen
29.6/30PR-Annahme — 148/150 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_prs148
open_issues0
closed_issues3
prs_merged_7d0
prs_decided_7d0
prs_merged_30d41
prs_decided_30d41
issue_closed_ratio1
closed_unmerged_prs2
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
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
6.5/25Reichweite des Inhabers — 7 Follower von skovtun
15.5/25Kontohistorie — 2 öffentliche Repos, Kontoalter ca. 6 Jahre
Verwendete Eingangsdaten
followers7
owner_typeUser
is_verified
owner_loginskovtun
public_repos2
account_age_days2.485
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Außergewöhnlich
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 2 Paket(e) auf npm
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 10 Tagen
20/20Versionshistorie — 245 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packages@getcoherent/cli, @getcoherent/core
ecosystemsnpm
any_deprecatednein
min_days_since_publish10

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

90Exzellent · 19 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — eslint.config.js
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 26 out of 26 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein

Dokumentation

100Außergewöhnlich
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://getcoherent.design
10/10Repository-Beschreibung
10/10Topics — 10 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsai, cli, code-generation, code-generator, design-system, design-systems, nextjs, react, shadcn-ui, tailwindcss
has_wikija
homepagehttps://getcoherent.design
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

49Schwach · 16 % des Gesamtindex
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 26 out of 26 merged PRs checked by a CI test -- score normalized to 10
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 3 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 23 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,6
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

Abhängigkeits-Advisories

100Außergewöhnlich
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
25/25Indirekte Abhängigkeiten ohne bekannte Advisories — keine indirekte Abhängigkeit trägt ein bekanntes Advisory
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages162
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von npm:@getcoherent/cli@0.26.0 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 162 Paketen. Erreichbarkeit wird nicht analysiert.

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.

69Gut · 4 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — .cursor/rules/safe-file-transforms.mdc, AGENTS.md, CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 100 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_files.cursor/rules/safe-file-transforms.mdc, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes15.048
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — eslint.config.js
11/11Statische Typprüfung — packages/cli/tsconfig.json, packages/core/tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 87 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
lockfilespnpm-lock.yaml
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configspackages/cli/tsconfig.json, packages/core/tsconfig.json
agent_commit_share0,87
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — TypeScript (statisch typisiert)
54.4/55Handhabbare Dateigrößen — 5/456 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes125.127
source_files_sampled456
oversized_source_files5
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
20/20MCP-Server
0/40Lauffähige Beispiele
Verwendete Eingangsdaten
example_dirs
has_mcp_signalja
api_schema_files

Eckdaten

22GitHub-Sterne
1Mitwirkende
693Commits, letzte 12 Monate
10Tage seit letztem Push
37Releases
1Bus-Faktor
0offene Issues
npmPaket-Ö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

OpenSSF Scorecard 3.6 / 10
3.6Gesamtwert

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-08-03 02:39 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests26 out of 26 merged PRs checked by a CI test -- score normalized to 10
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 3 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities23 existing vulnerabilities detected
Direkte Abhängigkeiten 12
RegistryPaketVersionsvorgabeManifest
npm@anthropic-ai/sdk^0.32.0packages/cli/package.json
npm@getcoherent/coreworkspace:*packages/cli/package.json
npm@modelcontextprotocol/sdk^1.29.0packages/cli/package.json
npmchalk^5.3.0packages/cli/package.json
npmchokidar^4.0.1packages/cli/package.json
npmcommander^11.1.0packages/cli/package.json
npmdotenv^16.4.5packages/cli/package.json
npmopen^10.1.0packages/cli/package.json
npmora^7.0.1packages/cli/package.json
npmprompts^2.4.2packages/cli/package.json
npmzod^3.22.4packages/cli/package.json
npmzod^3.22.4packages/core/package.json
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

Abhängigkeits-Advisories 0

Die Installation von npm:@getcoherent/cli@0.26.0 zieht 162 Pakete nach sich, direkt und transitiv: 0 tragen bekannte Advisories, davon 0 direkte Abhängigkeiten.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "ai",
        "cli",
        "code-generation",
        "code-generator",
        "design-system",
        "design-systems",
        "nextjs",
        "react",
        "shadcn-ui",
        "tailwindcss"
      ],
      "is_fork": false,
      "size_kb": 33569,
      "has_wiki": true,
      "homepage": "https://getcoherent.design",
      "languages": {
        "HTML": 8200,
        "Blade": 1381,
        "Shell": 14273,
        "JavaScript": 47120,
        "TypeScript": 3787073
      },
      "pushed_at": "2026-07-23T22:12:21Z",
      "created_at": "2026-01-26T21:16:29Z",
      "owner_type": "User",
      "updated_at": "2026-07-23T22:12:24Z",
      "description": "AI-powered design system generator — once designed, consistent UI everywhere.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Sergei Kovtun",
      "type": "User",
      "login": "skovtun",
      "company": null,
      "location": null,
      "followers": 7,
      "avatar_url": "https://avatars.githubusercontent.com/u/56520472?v=4",
      "created_at": "2019-10-13T21:03:48Z",
      "is_verified": null,
      "public_repos": 2,
      "account_age_days": 2485
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.17.1",
          "kind": "patch",
          "published_at": "2026-04-29T22:16:09Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-04-29T21:14:13Z"
        },
        {
          "tag": "v0.16.1",
          "kind": "patch",
          "published_at": "2026-04-29T20:51:37Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-04-29T20:32:06Z"
        },
        {
          "tag": "v0.15.5",
          "kind": "patch",
          "published_at": "2026-04-29T19:11:57Z"
        },
        {
          "tag": "v0.15.4",
          "kind": "patch",
          "published_at": "2026-04-29T18:53:45Z"
        },
        {
          "tag": "v0.15.3",
          "kind": "patch",
          "published_at": "2026-04-29T18:25:26Z"
        },
        {
          "tag": "v0.15.2",
          "kind": "patch",
          "published_at": "2026-04-29T18:07:58Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-04-29T17:51:58Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-04-29T17:03:50Z"
        },
        {
          "tag": "v0.14.4",
          "kind": "patch",
          "published_at": "2026-04-29T00:47:01Z"
        },
        {
          "tag": "v0.14.3",
          "kind": "patch",
          "published_at": "2026-04-28T21:55:14Z"
        },
        {
          "tag": "v0.14.2",
          "kind": "patch",
          "published_at": "2026-04-28T21:45:23Z"
        },
        {
          "tag": "v0.14.1",
          "kind": "patch",
          "published_at": "2026-04-28T21:24:58Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-04-28T20:52:24Z"
        },
        {
          "tag": "v0.13.10",
          "kind": "patch",
          "published_at": "2026-04-28T06:49:17Z"
        },
        {
          "tag": "v0.13.9",
          "kind": "patch",
          "published_at": "2026-04-28T05:52:30Z"
        },
        {
          "tag": "v0.13.8",
          "kind": "patch",
          "published_at": "2026-04-28T05:31:38Z"
        },
        {
          "tag": "v0.13.7",
          "kind": "patch",
          "published_at": "2026-04-28T05:11:07Z"
        },
        {
          "tag": "v0.13.6",
          "kind": "patch",
          "published_at": "2026-04-28T04:35:46Z"
        },
        {
          "tag": "v0.13.5",
          "kind": "patch",
          "published_at": "2026-04-28T01:16:04Z"
        },
        {
          "tag": "v0.13.4",
          "kind": "patch",
          "published_at": "2026-04-28T00:44:07Z"
        },
        {
          "tag": "v0.13.3",
          "kind": "patch",
          "published_at": "2026-04-27T23:57:33Z"
        },
        {
          "tag": "v0.13.2",
          "kind": "patch",
          "published_at": "2026-04-27T19:47:57Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-04-27T15:41:33Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-04-27T15:26:33Z"
        },
        {
          "tag": "v0.13.0-rc.1",
          "kind": "prerelease",
          "published_at": "2026-04-27T06:46:39Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-04-27T03:52:20Z"
        },
        {
          "tag": "v0.11.5",
          "kind": "patch",
          "published_at": "2026-04-26T04:44:59Z"
        },
        {
          "tag": "v0.11.4",
          "kind": "patch",
          "published_at": "2026-04-26T04:20:36Z"
        },
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-04-25T19:30:13Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-04-25T18:50:56Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-04-25T18:41:29Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-04-25T07:33:44Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-04-25T03:05:29Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-04-25T02:39:40Z"
        },
        {
          "tag": "v0.7.15",
          "kind": "patch",
          "published_at": "2026-04-20T06:47:05Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "3b7decbded989b70842cf2026dad7a097be8fdc3",
          "body": "…(#153)\n\nThe extractor captured 20 categories in its schema but populated 6-7 on\nreal sites: shadows/gradients/borders/z-index/glassmorphism came back\nempty and the type scale collapsed to 2 steps. Root cause: the sampler\nread ONE element per semantic role (<h1>, <section>, [class*=\"card\"]),\nand Str\n[…]\n16 new tests, 2587\ntotal. tsc/prettier/build/wiki clean.\n\n\nClaude-Session: https://claude.ai/code/session_01D27AXafYzbxx1QTnanA8fj\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.26.0 feat(extract): broad DOM harvest for real-site token breadth …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-23T22:12:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d73c8f989a7f8e28149c4bc51fb7474d4c1dfd0",
          "body": "… (#152)\n\nThe DTCG output from v0.23.8 used bare-string value forms\n($value: \"#3b82f6\", $value: \"1rem\"). Those are NOT conformant to the\nnow-stable 2025.10 spec (published 2025-10-28), which makes both `color`\nand `dimension` normative MUST-be-object types. Style Dictionary v5,\nTokens Studio and Fig\n[…]\new unit tests. 2571 pass. tsc/prettier/build/wiki clean.\n\n\nClaude-Session: https://claude.ai/code/session_01D27AXafYzbxx1QTnanA8fj\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.25.0 feat(export): conformant W3C DTCG 2025.10 object-value tokens…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-23T14:37:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1cd2efc8a88f1990c65fb6a203430f72aecfdd2d",
          "body": "…8 spec assessment (#151)\n\n* v0.24.1 test: coherent_extract coverage + capture-timing parity\n\n`coherent_extract` was the only MCP tool with no in-process coverage: it\nlaunches headless Chromium, so v0.24.0 shipped it on manual e2e alone. A\nregression in the SSRF gate or the driver lifecycle would ha\n[…]\ne Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01D27AXafYzbxx1QTnanA8fj\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.24.1 — coherent_extract coverage, capture-timing parity, 2026-07-2…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-22T20:13:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f4b027824fa90d148cec8d6ba97d438e0b767b6c",
          "body": "* refactor: extract pure builders from prompt/manifest/extract for CLI+MCP reuse\n\nbuildPromptPayload (prompt.ts), buildManifestDoc (manifest.ts), and\ncaptureExtraction (extract.ts) are now the single source of truth shared by\nthe CLI command actions and the upcoming MCP tools. CLI behavior is unchan\n[…]\ne Opus 4.8 (1M context) <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_011GEpWX96vh7dp3LPBcC4ba\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.24.0 feat: coherent mcp — MCP server (agent-contract P3) (#150)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-22T06:36:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a8b3a9a0a377df3c8f111a4e9fca22adbbf33790",
          "body": "One command → a single machine-readable design contract as JSON, so an AI agent\nhas a contract instead of guessing (the \"agent-ready\" pattern Meta astryx\npopularized; P2 of the agent-contract strategy, after export-tokens --format dtcg):\n\n- tokens: the project's design system in W3C DTCG format.\n- d\n[…]\n (agent-friendly), --out writes a file. Composes existing\nexports only (no design-constraints.ts touch). 1 test; suite 2516 green.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: v0.23.9 — `coherent manifest` (agent-contract surface) (#149)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-21T19:58:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb1226d09732e68e24a99669da9e0c714bfff472",
          "body": "`coherent export tokens --format dtcg` → design-system.tokens.json in the W3C\nDesign Tokens Community Group format (first stable spec 2025.10; consumed by\nFigma, Style Dictionary, Tokens Studio, Framer). Nested groups; each leaf is\n{ $type, $value } — color→hex, spacing/radius/fontSize→dimension,\nfo\n[…]\nstem's formats so a Coherent-extracted system drops\ninto any DTCG-aware tool. 5 new tests; suite 2515 green; tsc + prettier clean.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(export): v0.23.8 — W3C DTCG token format (`--format dtcg`) (#148)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-21T18:23:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da1bd30b4f88afa722754b2cc88d3526641d860f",
          "body": "…thesis)\n\nIsolates the constraint layer: both arms are the same model + same task, a\nsingle self-contained page, differing ONLY in whether the `coherent prompt`\nbundle is the system prompt. Any delta is Coherent's effect, not model noise.\n\n- Experiment 1 (slop index): deterministic count of the exac\n[…]\nlenged. Not wired into CI (costs ~$1.35 + a few min). Standalone:\nANTHROPIC_API_KEY=... node scripts/differentiation-benchmark.mjs\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bench): differentiation benchmark harness (puts a number on the …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-20T21:42:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "af1a4a642aa54c0c7097eec53f515607c1c87ce1",
          "body": "Per-command flag audit vs the live CLI. Added the user-facing flags a user\nwouldn't otherwise discover:\n- init --skill-mode / --api-mode / --both (setup rail selection)\n- check --page / --shared / --pages / --json (scope the quality check)\n- fix --dry-run (preview fixes without writing)\n- export --k\n[…]\n, cluster --eval-judge, baseline --compare, undo --list, update\n--patch-globals. Sync flags + env vars were already fully covered.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document high-value command flags in QUICK_REFERENCE",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-20T21:06:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e8521becd6d741834750f2133a77bf6fbc363acb",
          "body": "Command-tree audit vs the live CLI found two user-facing commands missing from\nthe reference:\n- `prefs set|show|clear` — persistent design preferences (design.style|density|\n  avoid|notes) injected into every chat run. Real user feature, was undocumented.\n- `ds regenerate` — regenerate the Design Sy\n[…]\nnt-chat rail, not user-typed. No phantom commands found in either\ndirection; hidden `wiki`/`baseline` remain correctly documented.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document `coherent prefs` + `ds regenerate` in QUICK_REFERENCE",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-20T19:25:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d099b3c1ec5de0f7242ea92b6a5b6b013a19d92b",
          "body": "- CLAUDE.md dev-workflow: \"Run all 2276 tests\" → \"Run the full test suite\"\n  (drift-proof; canonical count stays on the Tests: line, updated per release).\n- codes.ts header comment: error-code range \"through E020\" → \"E010\" (actual\n  max defined; error-codes.md already documents E001–E010 correctly).\n\nDoc/comment only — no behavior change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix two stale counts in always-read files",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-20T18:01:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f8136b2c19b6b988f337d7f574455a39101d5689",
          "body": "…pam (#147)\n\ncoherent extract deduped spacing but never sorted/outlier-filtered it, and had\nno breakpoint normalizer — so real computed CSS yielded a thin/noisy DESIGN.md:\na lone 208px hero margin in an otherwise 4–40px ramp, and a 23-row breakpoints\ntable dumping every declared media-query width (i\n[…]\ndth, sort. 23 rows -> sm/md/lg/xl. Wired into normalizeTokens.\n\nSuite 2510 green; tsc + prettier + wiki audit clean. Wiki: PJ-019.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(extract): v0.23.7 — drop spacing outliers + collapse breakpoint s…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-20T14:40:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3aa6440bca40bde51f4b4ea1cbdcf16388d8067a",
          "body": "…ng badge (#146)\n\nTwo rendering bugs found dogfooding the DESIGN.md gallery showcase; both made\na correct import/generation *look* broken.\n\n1. import design silently overridden on Tailwind v4. The scaffold leaves an\n   inline <style> critical-theme block (default palette) in app/layout.tsx; in\n   <h\n[…]\nge at\n   the top of the highlighted CardHeader.\n\nWiki: PJ-017 (badge), PJ-018 (v4 import). Suite 2503 green; tsc + prettier clean.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(import,constraints): v0.23.6 — v4 import override + clipped prici…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-20T04:56:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f8f1b14c2d1ae5b7122fd51f7d448b50e381f00",
          "body": "COHERENT_PLAN_MODEL (e.g. claude-haiku-4-5) routes ONLY the Phase 2\narchitecture-grouping call to a cheaper/faster model. Phase 2 groups\nalready-decided pages by layout — a structural, low-creativity step. Page code\ngeneration (Phase 3/6) and page planning (Phase 1, which decides which pages\nexist) \n[…]\nNCE env-var table (timeout default was stale at 180s,\nnow 300s since v0.22.8; documented COHERENT_NO_CACHE + COHERENT_PLAN_MODEL).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(chat): experimental model tiering for architecture planning (#145)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-19T07:43:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8871c9f6922e3fe6d28847af5ce0616efdfce6db",
          "body": "Extends the import round-trip (after radius + weight in v0.23.1):\n- parse.ts: parseBodyFontSize (## Typography `body` row) + parsePxScale\n  (## Spacing) → RawImport.bodyFontSizePx / spacingPx. Deduped parseRadiusScale\n  into parsePxScale.\n- adapter.ts: body size → fontSize.base (px→rem via pxToRem);\n[…]\n maps fontSize.base ← 16px and the full spacing\nscale alongside brand colors + heavy headings. 4 new unit tests. Suite 2502 green.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(import): carry body font size + spacing rhythm (#144)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-19T07:24:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d725506972750b2e21d1a77b89713a9ae4e654c3",
          "body": "…ource (#143)\n\ncheck's link scanner used a `href=` regex with no left boundary, so it matched\n`-href=\"/x\"` inside `data-stale-href=\"/x\"` — the auto-fixer's marker for an\nALREADY-repaired dead link (live href is \"#\"). Every repaired link was\ndouble-counted as broken, so a page whose dead links were a\n[…]\nrified: a project reporting 7 broken links now reports 0 (score 90); another\n3 → 0 (score 80). 3 new unit tests. Suite 2498 green.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(check): stop counting repaired links as broken; align fix route s…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-19T07:18:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b0b2a31b8e928b7d03940ec8ae25aca69d5c6e49",
          "body": "… app (#142)\n\ncoherent check charged 15 points per broken link with no cap, so ~7 links to\nroutes that failed to generate dropped a 7/7-clean-page project to 0/100\n\"Critical\". A misleading zero on a good app erodes trust. The console and --json\npaths also used different weights (JSON lacked a dead-r\n[…]\nscored 0/100 (6 broken links, full\npages) now scores 80/100. 6 new unit tests lock the calibration + regression.\nSuite 2495 green.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(check): honest quality score — broken links no longer zero a good…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-19T07:04:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b45c1f81e838d2b6d5c6c2745938afbe8a95e697",
          "body": "…ve) (#141)\n\nThe absence of an automated dogfood is why the v0.22.2 Sonnet 5 migration\nsilently broke `coherent chat` for a month (PJ-016). This adds both tiers:\n\n- Tier 1 (deterministic, every CI run, no API cost):\n  generation-canary.test.ts feeds every real Sonnet 5 response shape (flattened\n  re\n[…]\ncanary run reported\nhealthy (13 page files, score 100/100).\n\nNo runtime change to the published packages — tests + dev infra only.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(quality): add the generation quality canary (deterministic + li…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-19T06:59:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "84792a6fe5134ae9f791faf982789ec896952f31",
          "body": "coherent import design was lossy — an extracted DESIGN.md captures 12 sections\nbut only colors + font family were applied. A site's corner style and heading\nweight (both strong identity signals) were captured then dropped.\n\n- parse.ts: parseRadiusScale (## Radius) + parseWeightColumn (## Typography\n\n[…]\not just the brand blue.\n\n- 10 new unit tests (parse scale + adapter mapping); suite 2480 green\n- tsc + prettier + wiki audit clean\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(import): carry radius + heading weight through import design (#140)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-19T06:33:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e659a04c427b2d5ea4f73f91119739b14023b31c",
          "body": "Every page-generation call re-sent the same ~19K-token invariant constraint\npreamble (DESIGN_THINKING + CORE_CONSTRAINTS + per-type design quality +\nVISUAL_DEPTH + INTERACTION_PATTERNS). It's byte-stable per page type across a\nrun, so it now goes out once as an Anthropic prompt-cache system block\n(c\n[…]\nent in the cache-off run too.\n\n- 3 new unit tests (constraint-caching split); suite 2473 green\n- tsc + prettier + wiki audit clean\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(chat): prompt caching for the design-constraint preamble (#139)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-18T08:15:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c989a684036a9312c470531986ba176bb0dcc1a0",
          "body": "…ons (#138)\n\nFollow-up to the v0.22.8 fenced-TSX migration. The parser was too strict and\ndropped valid pages to empty templates when the model deviated slightly.\n\n- parseFencedTsxResponse: find the fence anywhere (not anchored start/end),\n  accept jsx/typescript/javascript/ts/js fence tags, tolerat\n[…]\nse\nfailure) — template fallback + regenerate cover those.\n\n- 6 new unit tests; suite 2470 green; tsc + prettier + wiki audit clean\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(chat): harden response parsing — tolerate Sonnet 5 output variati…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-18T07:45:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87b52e0eacc9feec3db7442bc294dc2e6709924e",
          "body": "…y pages (v0.22.8) (#137)\n\n* fix(chat): raise max_tokens so Sonnet 5 adaptive-thinking can't truncate full-file gens\n\nP0 regression from the v0.22.2 Sonnet 5 migration: every fresh multi-page\n`coherent chat` produced empty pages. Sonnet 5 runs adaptive thinking ON when\nthe `thinking` field is omitte\n[…]\nage `coherent chat` after the Sonnet 5 migration.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: repair Sonnet 5 generation — fresh multi-page chat produced empt…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-18T07:01:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c42d4ce0333c87d3d6f2561baf360eba944851e",
          "body": "…2.7) (#136)\n\nAudit finding: `coherent check` built validRoutes from config, so a route whose\npage generation was dropped (a double-failed page still gets a config + nav\nentry) passed link validation — and links to it looked valid — despite no\npage.tsx, shipping a runtime 404. The diagnostic couldn'\n[…]\nem in the score, and fails the exit code.\nVerified live: an orphaned route drops score 90→75. fileToRoute unit-tested.\n2457 tests.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(check): detect dead routes — config route with no page file (v0.2…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-18T01:32:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0222262eb9f3658b6e3d6b9e6cd1452b797f211c",
          "body": "…(#135)\n\nAudit efficiency finding: split-generator injected getDesignQualityForType(pageType)\ninto each page prompt, and buildModificationPrompt — which the same prompt flows\nthrough — injected it again (~1.5K tokens/page duplicated; marketing/auth pages\ncould get the wrong second copy since the two\n[…]\nate careful\nchange — it needs prompt reordering + content-block restructuring + live\ncache-hit verification, not a rushed bolt-on.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(chat): stop double-injecting the design-quality block (v0.22.6) …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-18T01:23:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0aa918d335c81777c2ca0065a5b1187a17aca5ad",
          "body": "…unified send() (v0.22.5) (#134)\n\nFrom the 2026-07-17 platform audit (docs/reviews/2026-07-17-platform-audit.md).\nAll three are live-API behaviors the 2455 unit tests never exercised.\n\n- Unified `send()` helper (utils/claude.ts): every Anthropic call now routes\n  through one path that applies withMo\n[…]\nmanual' control.\n2455 tests, tsc + prettier clean. Efficiency findings (prompt caching, double\nconstraint injection) tracked next.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: audit P1 cluster — truncation guard, SSRF redirect, no-swallow, …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-17T22:53:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2de97fd11ee78cf748682d49dd7ba2642b442c06",
          "body": "…0.22.4) (#133)\n\nextract --semantic computed color roles but they were discarded, and the brand\ndefinition was frequency-based — so a site's signature color (e.g. Stripe's\nindigo #533afd) got labeled `background` (it appears in CSS as a link-hover\nfill) and a high-frequency neutral got `brand`. Impo\n[…]\ndesign chain now yields a\nfaithful palette. Unblocks the M1 gallery (E1): brand color was the blocker, not\ngeneration. 2453 tests.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(extract): --semantic now correctly identifies the brand color (v…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-17T20:38:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b7fe0280e4d37e63bf0fe13a47b48ca2d4cc30a",
          "body": "…3) (#132)\n\nThe semantic LLM pass read response.content[0] as the text block. Under adaptive\nthinking (Sonnet 5 / Fable 5 emit a thinking block first when `thinking` is\nomitted — the default), the text is at index 1+, so the call threw \"no text\nblock\", the fail-soft wrapper caught it, and the run de\n[…]\nmantic completes the LLM pass and writes inferred\nvoice/density. Found dogfooding E1 (needed correct color roles for the gallery).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(extract): --semantic silently produced no semantic output (v0.22.…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-17T18:13:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c8615391eb1b40038ea66784aced7a2fdd94379",
          "body": "…odel) (v0.22.2) (#131)\n\n`coherent chat` and `extract --semantic` hardcoded claude-sonnet-4-20250514.\nAnthropic retired it on 2026-06-15 on the published schedule, so every\ngeneration on the API rail returned 404 not_found_error unless the user had set\nCLAUDE_MODEL by hand — for about a month. It hi\n[…]\nning thinking:disabled\n(which 400s on Fable 5).\n\nVerified end-to-end: coherent chat runs a real live generation again. 2452 tests.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(model): coherent chat was 404ing on every API-rail run (retired m…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-17T16:12:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d4dea925fadb853c22690bbcd378ba553ca53f79",
          "body": "… (v0.22.1) (#130)\n\n`coherent extract` could not extract stripe.com or figma.com AT ALL.\n\nNavigation used page.goto(url, { waitUntil: 'networkidle' }) with no fallback\n(browser-capture.ts:608). A site with persistent background chatter (analytics\nbeacons, websockets, polling) never reaches networkid\n[…]\ngo); linear.app still settles in 3.7s with no flag — no\nregression. Regression test locks the never-settles path. 2434 tests pass.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(extract): sites whose network never settles are extractable again…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-17T01:09:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "21db9c687c7dd268860f559dceaeb23df3f8e603",
          "body": "…ady files (E3/T5, v0.22.0) (#129)\n\nPromotes the internal E3 gallery artifact generator to a public command (TODOS\nT5). Any user exports THEIR design system to files that drop into any stack.\n\n`coherent export tokens [--format css|tailwind|json] [--out <dir>]` emits, all\nderived from the project's n\n[…]\nit tests + e2e verified (all formats, --format/--out, bad-format refusal,\n`coherent export` parent still intact). 2442 tests pass.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(export): coherent export tokens — one token model → framework-re…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-16T20:47:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d02ff4a5d0f4f28d6a7312775a7ba52cc32ccd9",
          "body": "….0) (#128)\n\nNew command `coherent import design <file>`: parse an external DESIGN.md into a\nproject's tokens. Closes the loop v0.18/ADR-0008 left open (DESIGN.md was\noutput-only; input was URL-only via `coherent extract`).\n\n- Two grammars, priority-ordered: Coherent extract (Atmosphere) first (gall\n[…]\n + full e2e on all three grammars against a live project. Adversarially\nreviewed (no P1; 9 P2/P3 findings fixed). 2424 tests pass.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(import): coherent import design — DESIGN.md as INPUT (F14, v0.21…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-16T16:25:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d9fbc4ce6d0ea959468454ccdfba8b1da275333",
          "body": "…(#127)\n\nBundles the full B-2c → R10-R12 → F13 arc landed on main today:\n- B-2c conservative DRIFT-REPORT.md + ADR-0009 (scan subsystem)\n- R10 eval v2 (split gate, must_be_generic, authoring cards)\n- R11/R11.1 run observability (provider errors surfaced, scaled\n  max_tokens, truncation detect)\n- R12\n[…]\ncost-banner range\n\nPilot eval gate PASSES (26/28, hard 3/3); --llm labeling validated,\nstays opt-in. Both packages 0.19.0 -> 0.20.0. 2366 tests.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v0.20.0 — Tool 2 (coherent scan/cluster) + eval gate closed …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-16T02:01:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d6795e78eb8d647355dadf321d6c24291dad738a",
          "body": "The --llm banner quoted a single number that was really the clean-pass\nFLOOR (e.g. $2.29). Real runs cost 2.6-3x that ($6.08): the repair ladder\nre-calls dropped-id chunks and every re-call re-sends the full DESIGN.md.\nThe banner now shows $2.31-$6.93 (clean pass -> with repair retries) + a\nnote tha\n[…]\nrisks the\nlabel quality we just got past the R10 gate; separate task with its own\neval.\n\n1 new banner test (range floor->ceiling). 2366 passing.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scan): cost banner shows an honest floor-to-ceiling range (#126)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-15T21:38:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "412b97c792c075d358c05df15e45e97798b1dd03",
          "body": "…luster-hash + dimensional tokens) (#125)\n\nThe default no-LLM label was '<token>-cluster-<hash>'\n(lb-label-cluster-1f1e1d12) -- redundant noise, since the stable id\nalready prints on its own line in COHERENT-DESIGN.md. It is now the\ncluster's clean class signature with pure spacing/sizing utilities\n\n[…]\nministic-label.test.ts + salientTokens/isDimensional unit tests;\nserialize/cluster tests updated off the old -cluster-hash format. 2365\npassing.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scan): free deterministic label = clean class signature (drop -c…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-15T19:24:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3749cc64d65635656bd3aa0b8137344fb4ad94aa",
          "body": "…e label (#124)\n\nRoot cause behind the stubborn grid-cols-a1a fallback and ~100 other\nsilent fallbacks in the labeler-v4 run. A single-cluster diagnostic\nshowed the model returned a PERFECT label:\n\n  human_label:    'Label Dotted Value Row'   (exactly what we want)\n  suggested_role: 'layout.label-va\n[…]\n\n\n4 reconcile tests updated/added (drop kebab role, drop Title-Case role,\ndrop 5+ segment role, required-field still invalidates). 2354 passing.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scan): R12.2 — malformed optional role drops, does not discard th…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-15T18:56:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9912aa735ff2fbadea457733a505030c690d72e9",
          "body": "The labeler-v4 validation run (2026-07-15) passed the representative eval\nsuite at 12% major but stayed gate-BLOCKED on ONE hard case: grid\ngrid-cols-a1a kept falling back to a deterministic label (raw cluster id\n-> judge 'wrong'). Not a labeling error: chunk poisoning. A couple of\njunk-token cluste\n[…]\ncheap).\n\n2 new tests (singleton rescue, singleton-also-fails -> fallback), provider-\nerror count test updated for the extra calls. 2352 passing.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scan): R12.1 — singleton retry defeats chunk poisoning (#123)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-15T18:21:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f1bf511e601b0140b627b3f8dbfde6d7299fbd55",
          "body": "…read (#122)\n\nThe R12 judge confirmed the remaining gate failures were real labeler\nover-specialization and pointed at the root cause: #120's high_spread\nflag keys off occurrence/file COUNTS, which cannot separate a widespread\ngeneric utility from a widespread structural recipe. Both pilot hard\ncase\n[…]\n\ntests), 2350 passing. No paid run in this PR — deterministic flag proven\noffline; the paid labeler-obeys-flag validation is a separate ~$6 run.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scan): F13.2 — token-nature generic_utility flag replaces high_sp…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-15T15:21:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a345fa5e7c819094e9af17f1113a323a7afd7780",
          "body": "After three rounds of string-matcher patching still failed correct labels\non wording, added a judge that grades MEANING against the human\nacceptable_labels, looking at the same code samples the labeler saw.\n\nReverses the 2026-07-13 codex 'no judge' verdict — but on evidence, and\nkeeping its bias con\n[…]\npage). The remaining gap is in the\nLABELER, not the ruler — do not loosen the eval.\n\n12 new tests, 2344 passing. No paid relabel run in this PR.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scan): R12 — eval LLM-judge lane (rescue-only, --eval-judge) (#121)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-14T23:13:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "69f69cb9e4e380e6703947b5ba7d71e16b1e5b6e",
          "body": "… truncation detect (#120)\n\nPostmortem of the labeler-v2 validation run (2026-07-14, full corpus).\n\nWHAT WORKED: the headline F13 case is fixed. The 47x/25-file subtle-text\ntoken now labels 'Subtle Text', not 'Breadcrumb Separator'.\n\nWHAT DIDN'T:\n1. v2 asked the model to compare occurrences/distinct\n[…]\nen the block was absent. FIX: LabelChunkResult.truncated\n   -> recorded as a provider error.\n\n7 new tests, 2327 passing. No paid run in this PR.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scan): F13.1 — deterministic high_spread flag + plural stemming +…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-14T19:19:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d45cfd794a9505818f859002862f7ec035b2fc8e",
          "body": "…nct_files + scope rule) (#119)\n\nThe 2026-07-14 eval run (first on the fixed R10/R11 harness) isolated the\nlabeler's one systematic error: all 3 remaining failures were high-spread\ngeneric utilities named after the single usage visible in samples\n('Breadcrumb Separator' on a 47x/25-file subtle-text \n[…]\nl cache invalidation\n\n6 new tests, 2326 passing. Validation run (~$2.5, full corpus) pending —\nflip --llm default only if both eval suites pass.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scan): F13 — spread-aware labeler prompt v2 (occurrences + disti…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-14T18:10:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "00c348af74b174688a379deae17ddbab3d54d4f3",
          "body": "…alize eval matching (#118)\n\n2026-07-13 pilot run postmortem: 533/1077 clusters silently fell back\nafter chunks 12-22 failed ALL ladder attempts — catch {} at\nllm-label.ts:256 swallowed every provider error, making a mid-run API\noutage indistinguishable from bad model output.\n\n- llm-label: providerE\n[…]\nkoff/circuit-breaker deliberately deferred until the next run shows\nthe actual error class (evidence over guessing).\n\n6 new tests, 2321 passing.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scan): R11 — surface provider errors, scale max_tokens, dash-norm…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-14T15:16:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6d08de515d22862c562c42a6ccb71ab9a48962d7",
          "body": "…s (codex-consulted) (#117)\n\nCodex consult 2026-07-13 (6 verdicts, 3 P1s):\n- Split gate: representative percentage gate + zero-tolerance hard-case\n  suite; a combined 25-case gate could pass with every known-hard case\n  failing.\n- must_be_generic: asymmetric matching so F13-class over-specialization\n[…]\nVersioned pilot gate: meta {corpus, eval_version, seed} echoed in report.\n\nBackward-compatible expected.json schema. 25 new tests, 2315 passing.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scan): R10 eval v2 — split gate, must_be_generic, authoring card…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-14T05:49:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4c24574b7c5115027cbd3288fe9c3e39ee2d2fe1",
          "body": "… ADR-0009 (#116)\n\nCodex Q6 verdict (locked 2026-05-11): NO auto semantic matching against\nfree-form DESIGN.md in v0. Report states the detected DESIGN.md path,\nlists top-20 clusters by occurrence, and defers comparison to manual\nreview. No-false-confidence is a tested invariant.\n\nAlso: ADR-0009 (sc\n[…]\narc, adapter contract, schema\nversioning, stable IDs), CHANGELOG B-2c section, QUICK_REFERENCE cluster\nlines refreshed from stale B-2a-era text.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scan): Tool 2 v0 (B-2c) — conservative DRIFT-REPORT.md emitter +…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-14T04:56:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3749ce4d7933fb6c401c1e985a7956a360b382dd",
          "body": "…erred, gated on F4 + M1 signal)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: T5 backlog entry — public 'coherent export tokens' command (def…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-14T04:11:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "585f493794f3e19b133664600e2d295c8d48d317",
          "body": "…ategy) + T3/T4 platform-play deferrals (#115)\n\n- F14: parser grammar priority (Coherent extract format first, Stitch second),\n  contrast repair policy DECIDED (accept-with-warning, recommendations in DS output),\n  Stitch superset strategy (valid core + Coherent extensions, spec-watch).\n- TODOS: T3 \n[…]\nbuilt-with-Coherent badge (E6, bundled into OQ6 trust review).\n- Source: office-hours + CEO review 2026-07-12/13, decision records in ~/.gstack.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: F14 amendments (grammar priority, contrast policy, superset str…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-13T14:06:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "97a3367862b3aca675bc5f0ab3da048ffed93235",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: gitignore .context/ (codex session state)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-12T22:08:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bb2a56fcd4a9f29cebd649cf1d0a1ef114407e0f",
          "body": "…ted scope + R9 corpus-economics update (#114)\n\n- New F14 entry: coherent import design <file> --dry-run, colors+font-family\n  only, dedicated ImportedDesignSeed schema, mapping/repair report.\n  Codex GO-WITH-CHANGES verdict encoded (session 019f585a, 2026-07-12):\n  no chat --design in v1 (Atmospher\n[…]\n R9 annotated: voltagent/awesome-design-md (101k stars, MIT, 73 files)\n  changes reference-corpus economics; F14 = R9-lite via user-picked seed.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(wiki): F14 — DESIGN.md as input (Stitch-format import), codex-ga…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-12T22:08:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f557a500f99bcdcfc24e8b26595b609ccbd96389",
          "body": "…ladder (#113)\n\n* feat(scan/cluster): foundation — constants + LabelProvider interface\n\nPinned MODEL_ID/PROMPT_VERSION/TEMPERATURE + per-chunk + per-cluster caps\nper codex consult 2026-05-11 (Q3/Q7/Q8). LabelProvider seam keeps SDK\ncalls out of CLI orchestration (Q9).\n\nCo-Authored-By: Claude Opus 4.\n[…]\nked until ground truth is context-authored (R10).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scan): Tool 2 v0 (B-2b) — Sonnet LLM labeler + 3-attempt repair …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-07-12T02:18:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7d474c1599d04f4f6a9054ad5e368090a205d0e5",
          "body": "…ENT-DESIGN.md (#112)\n\nNew `coherent cluster <evidence.json> --no-llm` command. Reads B-1 scan\nevidence, groups by exact normalized class-token signature, assigns stable\nsha256-derived cluster IDs (8-char hex), and serializes a DRAFT\nCOHERENT-DESIGN.md grouped by anti-pattern kind. LLM labeler ships\n[…]\n0).\n\nTests: +27 in scan/cluster + commands/cluster (precluster, signature\nnormalization, serializer determinism, CLI error gates).\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scan): Tool 2 v0 (B-2a) — deterministic clustering + DRAFT COHER…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-11T21:34:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fe8ec4249939188173c5992fab204bdba0d1935e",
          "body": "… (#111)\n\n`coherent scan [dir]` walks .blade.php files and emits B1-EVIDENCE.json\nwith 6 anti-pattern kinds (raw_button_tag, include_partial,\nx_component_usage, at_class_directive, conditional_class_array,\ninline_classes). Vendor / node_modules / storage / bootstrap excluded.\n\nPhase B-1 of the brown\n[…]\n\n\nMeasured on logbaza/source: 104 files, 2855 rows, 18 ms (62× under the\n30 s gate budget).\n\n16 unit tests; full suite 2150 green.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scan): Tool 2 v0 (B-1) — Blade L1 grep extractor + JSON evidence…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-11T19:06:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b57f38db98aa6d7160516da52e44660ee3add059",
          "body": "…(#110)\n\nThe regex `type:\\s*['\"]...['\"][\\s,\\n]+message:` in generate-rules-map.mjs\nsilently dropped any rule with an inline comment between type and message.\nCaught on PR #106 pre-merge — three rules vanished because comments\nrationalising a severity bump landed inline.\n\nReplace with TypeScript AST \n[…]\nests in generate-rules-map.test.mjs cover regression case +\nbasic shapes. Same 41 validator types reported on real validator code.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(wiki): M18 — AST-based validator-rule extraction for RULES_MAP …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-07T14:42:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "98b05c45eb8c284b026cbb0064d3da78b5c71e02",
          "body": "…guard (#109)\n\nCumulative release covering Week 1 of the URL-extract initiative\n(PRs #90 → #102) plus four post-#102 ships (#104-#108) since v0.18.0.\n\nHighlights:\n- coherent extract <url> ships as beta (Tool 1)\n- F11 BUTTON_NO_DISABLED_ON_MUTATING validator (state-design HARD RULE)\n- multi-page rail\n[…]\nfor animation-heavy sites\n- Wiki: PJ-013, PJ-014, PJ-015 + R7/R8/R9 + F11/F12/M18\n\nTest count: 2078 → 2124 (+46). All gates green.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v0.19.0 — coherent extract (Tool 1 beta) + F11 click-…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-07T08:03:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "39717a5f7379137ae9ce44130ed244c2c34e06df",
          "body": "…rd rule (#108)\n\nEmpirical: 2026-05-06 stratified n=3 benchmark scan found 0 instances of\ndisabled={...} across 171 .tsx files in 3 generated apps. Every form/action\nshipped without click-guard, so users double-submit on every demo run.\n\nNew validator rule fires error severity (gen-time AI fix loop \n[…]\n1 unit tests cover both signals + each skip case. Suite 2113 → 2124.\nPJ-015 + IDEAS_BACKLOG F11 marked resolved + RULES_MAP regen.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(validator): F11 BUTTON_NO_DISABLED_ON_MUTATING + state-design ha…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-07T07:54:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "767f13479268bdef07d709c999a5f549f21d7ec3",
          "body": "…#107)\n\nSession 2026-05-06 ran a stratified anti-slop benchmark to test whether\npeer recommendations (font/icon swap, anchor-as-string field, anti-AI\nlanding pivot) are real leverage. Codex consult + codex challenge mode\ndemolished n=1 conclusions and surfaced two real bugs.\n\nPATTERNS_JOURNAL additi\n[…]\nnames JSX text leak fix\n- #105: multi-page domain detection fix\n- #106: NO_EMPTY_STATE/NO_H1/STUCK_ON_SELECTION severity promotion\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(wiki): capture 2026-05-06 anti-slop benchmark session findings (…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-07T07:33:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eb5ecdb0b7de5ea82d356913fa8ac6ce3980003f",
          "body": "…o errors (#106)\n\nThree high-confidence quality rules were emitting at warning severity, so\nthe gen-time AI quality-fix retry loop (modification-handler.ts:742) skipped\nthem. Validator caught the issue, generation shipped it anyway. Confirmed\nempirically via benchmark scan on a fresh 20-page logisti\n[…]\nt\nnew validator infrastructure.\n\n3 new tests pin severity contract per type. Validator suite: 273 → 276\npassing. Full suite green.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(validator): promote NO_EMPTY_STATE / NO_H1 / STUCK_ON_SELECTION t…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-07T07:33:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "673447279b35abf495c5026aa272d3085a40005a",
          "body": "`isMultiPageRequest` was too narrow on two axes — both confirmed via\nbenchmark pilot 2026-05-06:\n\n1. BROAD_APP_INTENT_RE noun catalog was generic-SaaS-only. Prompts like\n   \"Build a B2B logistics dispatcher\" or \"Build a clinic scheduler\"\n   missed the trigger because \"dispatcher\" / \"scheduler\" / \"tr\n[…]\ns.\n\n15 new tests pin the fix vs 4 stratified benchmark prompts and 4 trivial\nmodification controls. Full suite: 2095 → 2110 (+15).\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(chat): route domain-specific app prompts to multi-page rail (#105)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-07T07:33:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "89dbe9c8aca70c899c54caf2f657b2222bd838af",
          "body": "…trings (#104)\n\n* feat(url-extract): --settle-ms flag for late-firing animations\n\nLarevoltosa.es and similar Lottie/fade-in heavy sites kick off opacity:0→1\ntransitions AFTER `networkidle`. captureSnapshot's hero detection lands inside\nthe transition window and picks footer copyright (16px) instead \n[…]\nplaceholder list. Validator suite\ngoes 273 → 277.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(validator): catch banned placeholder names in JSX text + longer s…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-07T07:33:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc80f1fc5c58d176b937e61720ebee97546e18c2",
          "body": "…al) (#102)\n\n* feat(url-extract): DOM-depth penalty for Tier 2 hero scoring (#96)\n\nCloses the awwwards-style \"project showcase IS above-the-fold AND largest\"\ncase left open by PR #99. The page hero is rarely deeply nested; widget\ncontent (carousels, project tiles, drawers) usually sits 6-12 elements\n[…]\nn the path. Same scoring math, real coverage now.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(url-extract): DOM-depth penalty for Tier 2 hero scoring (#96 fin…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-06T17:25:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7b6940cc3d1ca0af7302d99b4e389db31ed26d01",
          "body": "…101)\n\n* feat(url-extract): drop heading scale entries that match body size (#98)\n\nextractTypography took the FIRST occurrence of each heading role as the\ncanonical scale step. On h1-less / portfolio sites, the first <h2> on the\npage is often a tiny nav label or eyebrow — awwwards.com surfaced\nh2=14\n[…]\new test covers\nthe CSS-reset shape codex flagged.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(url-extract): drop heading scale entries that match body size (#…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-06T17:01:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "57f0f7bb78939f9e8842d4e7bc9aab28730df220",
          "body": "* feat(url-extract): synthesize z-N labels for non-layer roles (#97)\n\nThe deterministic z-index extractor used `ComputedStyleSample.role` verbatim\nas the layer name. For bare-tag roles (`a`, `p`, `h1`, `body`, `icon`, …)\nthat produces meaningless labels in DESIGN.md \"Z-index scale\" — awwwards.com\nsh\n[…]\nAuthored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n* chore: prettier fix for negative-z-index test (CI)\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(url-extract): synthesize z-N labels for non-layer roles (#100)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-06T16:38:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd9a062add7f9a7eb9b4a6a72dc6e3196a039c77",
          "body": "* feat(url-extract): hero topmost bias for Tier 2 detection (#96)\n\nTier 2 (largest-visible-text) previously ranked candidates by font-size\nalone. On sites with below-fold project showcases or promotional overlays\nlarger than the actual page hero, the rank picked the wrong text. The hero\nalmost alway\n[…]\nt covers\nthe phantom-above case. 2074 tests pass.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(url-extract): hero topmost bias for Tier 2 detection (#99)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-06T07:08:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b24aed5a609e61f0e3901c1b0dc99e1ff4ed0528",
          "body": "…k1 #6) (#95)\n\n* feat(url-extract): UX polish — --out - to stdout + hero truncation (Wk1 #6)\n\nTwo scriptability + readability fixes for `coherent extract`:\n\n1. **`--out -` writes the artifact to stdout.** No spinner pollution (ora\n   already streams to stderr), no success line. Honors the same .md/.\n[…]\n\nshouldSkipUpdateCheck stdout-sink). 2068 passed.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(url-extract): UX polish — --out - to stdout + hero truncation (W…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-06T04:31:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f11d91c3f12aea366e785fd653482d4093dbefd2",
          "body": "…ce/density (#94)\n\n* feat(url-extract): semantic inference — single LLM pass for roles/voice/density (Wk1 #2)\n\nNew SDK-free `semantic-inference.ts` in @getcoherent/core: builds prompt,\nzod-validates LLM output (`SemanticLlmOutputSchema`), retries once on schema\nfailure, propagates network errors imm\n[…]\nte unit + 2 serializer integration). 2037 passed.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(url-extract): semantic inference — Wk1 #2 LLM pass for roles/voi…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-06T01:43:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0016c7dfb898fa45b0802b07e2430e1f8f355cc8",
          "body": "Per design doc constraint: \"honor target-site robots.txt before extraction\n(skip if disallowed)\". RFC 9309-compliant parser, fail-open on fetch\nfailure (no robots.txt published = allowed; blocking on unavailability\nwould let any flaky origin DoS extraction).\n\nNew module: packages/core/src/url-extrac\n[…]\novering parser/matcher edge cases + 4 captureSnapshot wire-in tests\n(allow path, block path, opt-out, default-on with stub fetch).\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(url-extract): honor robots.txt before navigation (Wk1 #3) (#93)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-06T00:51:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "305cfa18d9c39afc5295443c41dfc6a7de95ac91",
          "body": "… (#92)\n\nWk1 #4 of Tool 1. Locks regression coverage for the deterministic extraction\nlayer using brand-representative HTML fixtures rather than raw site captures.\n\nFixtures (packages/core/src/url-extract/__fixtures__/):\n- stripe-like.html — Stripe purple #635BFF + ink #0a2540 + sohne-var\n- linear-l\n[…]\ntegration testing remains a separate concern handled by\n`coherent extract <url>` against live URLs (browser-capture + Playwright).\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(url-extract): hand-crafted HTML fixtures for regression coverage…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-06T00:51:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8b6bddb7c701ca6b93628130a63775f2d165ef88",
          "body": "…lization (#91)\n\n* feat(url-extract): token-normalizer — OKLCH ΔE merge + px/ms canonicalization\n\nWk1 #1 of Tool 1 deterministic layer. Refines extracted tokens before\nDESIGN.md serialization:\n\n- Color clustering: hand-rolled OKLCH conversion + ΔE merge at threshold 2.0\n  (just-noticeable). Centroid\n[…]\n background remap test + 3 background edge cases.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(url-extract): token-normalizer — OKLCH ΔE merge + px/ms canonica…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-06T00:51:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f4afaede880ae534e1fc61a0102ac51e5187b5b8",
          "body": "feat(url-extract): Tool 1 deterministic layer + DESIGN.md serializer",
          "is_bot": false,
          "headline": "Merge pull request #90 from skovtun/feat/url-extract-bootstrap",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T16:36:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2df696db6052c074ab12861031b5bde54a463458",
          "body": "…dual\n\nP2 — Hidden h1 with non-zero rect. The basic display/visibility/opacity\ncheck missed sr-only patterns that have positive box dimensions but are\noff-screen (position:absolute; left:-9999px) or clipped (clip:rect(0,0,0,0)\non 1px×1px). Detection now requires the h1's viewport-clamped intersectio\n[…]\nk 2 hosted-service hardening per Tool 1 design doc.\nInline comment in captureSnapshot's interception block names the limit.\n\nTests: +2 (off-screen position:-9999px h1, 1×1px clipped h1). 1929 passing.",
          "is_bot": false,
          "headline": "fix(url-extract): codex iter-5 — clip/off-screen h1 + doc rebind resi…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T16:23:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e710f63281e794686887859fd2c3bbeb448c72ac",
          "body": "P1 — IPv4 SSRF blocklist was incomplete. Pre-fix only covered RFC1918 +\nloopback + 169.254. Codex flagged that Alibaba metadata at 100.100.100.200\n(in CGNAT 100.64/10) and benchmarking 198.18/15 still passed, so a\nmalicious URL on those networks could probe internal services. Expanded\nassertNotPriva\n[…]\nllow-list cases (100.0/8 public,\n198.0/8 public public-side of benchmarking) + 3 hidden-h1 fallthrough cases\n(display:none, visibility:hidden, opacity:0). 1927 passing.\n\nSmoke on linear.app unchanged.",
          "is_bot": false,
          "headline": "fix(url-extract): codex iter-4 — IPv4 special ranges + h1 visibility",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T16:16:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bcc869fae47342406f182d39f0edc60066bcdfc0",
          "body": "…ules\n\nP1 — DNS rebinding via Chromium's separate resolver. Node's defaultSsrfGuard\nvalidates a hostname's A/AAAA records, then route.continue() lets Chromium\ndo its OWN fresh lookup before connecting. A short-TTL attacker domain can\nreturn a public IP to Node and 169.254.169.254 to Chromium millise\n[…]\nrvice hardening.\n\nTests: +7 (SsrfGuardResult shape for hostname/v4-literal/v6-literal,\nbuildHostResolverRules for v4 single, v4 multi, v6 brackets, empty).\n1909 passing. Smoke on linear.app unchanged.",
          "is_bot": false,
          "headline": "fix(url-extract): codex iter-3 — pin Chromium DNS via host-resolver-r…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T16:06:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b239677806d9a639674ef0ed6d28f87860126157",
          "body": "…de + meta\n\nFour findings from /codex review on 172fceb. Two more P1s + two P2s.\n\nP1 — IPv4-mapped IPv6 literal bypass. WHATWG URL canonicalizes\n[::ffff:127.0.0.1] to [::ffff:7f00:1] (compressed hex). Original v4-mapped\nregex only caught the dotted form, so the canonical hex form passed and a\nlitera\n[…]\ning contains no TS-only constructs.\n\nTests: +11 cases (v4-mapped literal+hex, subresource block + happy-path,\ntransparent-bg variants, meta description extraction + script-purity check).\n1902 passing.",
          "is_bot": false,
          "headline": "fix(url-extract): codex iter-2 — v4-mapped IPv6, subresource SSRF, mo…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T06:13:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "172fceb6ddac421d27e14d51d09a55c3f48bc826",
          "body": "Two P1 SSRF holes + one P3 dead-flag flagged by /codex review on PR #90.\n\nP1 #1 — DNS-resolved private IPs bypassed the guard. defaultSsrfGuard only\nchecked the literal hostname string, so `internal.example` resolving to 10.x\nor 169.254.x passed and Playwright fetched the private-network address.\nde\n[…]\nulti-A-record\npoisoning, v4-mapped v6, lookup failure, empty resolution) + 2 redirect\ninterception cases (abort on private-IP hop, happy path). 1891 passing.\n\nCodex re-review recommended before merge.",
          "is_bot": false,
          "headline": "fix(url-extract): codex P1 SSRF + P3 headless flag",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T05:59:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f83646f9c89f16ba833f4f5456eb17fa475ad4c8",
          "body": "Turns the JSON dump into the user-facing artifact: `coherent extract <url>\n--out linear-DESIGN.md` writes a clean markdown file that drops straight\ninto Claude Code / Cursor / v0 / Lovable as a design seed. This is the\n\"tech-demo → real tool\" milestone from the Tool 1 design doc.\n\n- packages/core/sr\n[…]\nS + prettier clean.\nPending: token-normalizer (color clustering + role inference),\nsemantic LLM pass, robots.txt, 3 HTML fixtures.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core+cli): design-md-serializer — pasteable DESIGN.md artifact",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T03:32:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43fd734a3565422dd1716f9ede48b9fa0748f1a7",
          "body": "Closes the gradients/patterns/breakpoints holes left by computed-style-extractor.\nPure module, no DOM, no LLM. ExtractDesignTokensOptions accepts mediaQueries\ncaptured by extractMediaQueriesInPage; CLI passes them through.\n\n- parseBreakpoints(mediaQueries[]) → { strategy, values[] }\n  - mobile-first\n[…]\n→ 1871 tests (+20). Build + TS + prettier clean.\nPending: token-normalizer (color clustering), semantic LLM, design-md serializer.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): stylesheet-parser fills the 3 deterministic stubs",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T03:18:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5229799d795f088e92bbf4a98160236f27b9033c",
          "body": "Wires Playwright into the url-extract chain. `coherent extract <url>` now\ncaptures, samples, and prints a deterministic atmosphere summary in one\ncommand. Smoke-tested on example.com: 1831ms total, Tier 1 hero (h1\n\"Example Domain\" 24px), 3 colors, 3 type families, body+h1 scale, spacing\nscale, radiu\n[…]\nng (no regression). Note: no unit test for\nplaywright-driver — mocking Playwright provides no signal; smoke test\nis the real gate.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): coherent extract — first end-to-end smoke pass",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T03:06:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "361cd5baaa46ba4d873b087fb7fe5606e0db456e",
          "body": "…ctor\n\nContinuation of bootstrap. Two scoped additions atop 3-tier hero detection.\n\n1. happy-dom in core devDeps + hero-detection.test.ts (8 tests, env directive\n   per-file). Proves Tier 2 works on the awwwards/larevoltosa-shaped DOM\n   that broke Tier 1 in the 5-site dogfood (h1 missing, custom di\n[…]\nzier(...) commas.\nBoth fixed; splitTopLevelComma is paren-depth-aware.\n\nNet: 1806 → 1851 tests (+45). Build + TS + prettier clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): url-extract — happy-dom hero tests + computed-style-extra…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T02:40:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cd8da59c0f9aad4d1949c99575263c3ca10bf8b0",
          "body": "First Week 1 module of Tool 1 (URL → DESIGN.md). Highest-risk piece per\n2026-05-04 5-site dogfood: 2/5 admired sites had `<h1>` null (custom\ndiv/SVG hero). Detection pivots to 3-tier — semantic h1 → largest visible\ntext → multimodal LLM stub.\n\n- types.ts: ExtractedAtmosphere Zod schema covering 20 c\n[…]\nxtractor, stylesheet-parser, token-normalizer, semantic LLM\npass, design-md serializer extension, CLI command + Playwright wiring.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(core): bootstrap url-extract package — 3-tier hero + Zod schema",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-05T02:33:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09321cc2e5e6c427ee8ea2567f79a9f79dae2e02",
          "body": "Two competitive-positioning gaps closed (per CEO review vs Aura.build + Refero\nStyles, 2026-05-03). Both reuse existing infrastructure.\n\nDESIGN.md output:\n- buildDesignMarkdown serializer (pure function, snapshot-stable)\n- Best-effort write at end of chatCommand — never blocks chat\n- Sections: atmos\n[…]\n in ADR-0008: visual editor, community marketplace,\nmulti-model SDK, multi-editor adapter parity. URL import deferred to TODOS T9.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "v0.18.0 — DESIGN.md output artifact + @-syntax for shared components",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-05-03T18:02:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "56158189342b5175d6bd8276a405335796726f3b",
          "body": "User feedback: proportional bars looked wrong. Show bars at literal px\nwidth matching the value (xs=4px, 3xl=64px) so the visualization is\n1:1 with the spec.",
          "is_bot": false,
          "headline": "v0.17.19 — spacing bars literal px width",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T08:25:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bef2d2e388a6991fc92af9f71084c1895e5ecb99",
          "body": "Bars on /design-system/tokens/spacing weren't visible because each was\nsized to the literal token value (0.25rem-4rem = 4-64px), with bg-primary/70\nbeing too faint against the dark surface. Replaced with proportional bars\nscaled to the largest spacing value (max = 100% of column), solid bg-primary,\nplus a px-equivalent column for designer reference.",
          "is_bot": false,
          "headline": "v0.17.18 — spacing tokens scaled bars",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T08:20:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7749a78f0679aeb526425e24745ff7690e03ab4d",
          "body": "…tail (#89)\n\nUser feedback: v0.17.16 'At a glance' showed dev-oriented info (LoC,\nexports, hooks, imports, Props interface) — the audience here is\ndesigners, not engineers. Designers care about visual + token usage,\nnot TypeScript metadata.\n\nReplace API-extracted meta with designer-relevant signals:\n[…]\nmuted-foreground colors, p-4 / gap-3 spacing, text-sm / font-medium\ntypography, has 2 buttons, 1 icon, and one interactive state.'\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.17 — designer-relevant meta on shared component de…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T08:00:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9acdc4631ccc3b759c68a0436967f64bbf46e59a",
          "body": "…source meta (#88)\n\nUser feedback: the v0.17.15 'see it live' card had identical generic\nboilerplate text for every shared component — useless. Replace with\nper-component truthful info extracted from the actual source code.\n\nAPI enhancement (/api/design-system/shared-components/[id]):\n- Returns new \n[…]\nhful representation\n\nEach component now shows unique info — LandingNav has different LoC,\nhooks, dependencies than CopyableInline.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.16 — replace generic 'see it live' with extracted …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T07:51:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b06f838fc635f4245a201a3311001988684cf1cb",
          "body": "…A (#87)\n\nIframe-based 'preview · in context' showed the entire host page for\neach shared component. When multiple shared components live on the\nsame page (e.g., landing has 5), every preview looked identical and\nmisled users into thinking the components weren't rendering.\n\nReplace with a metadata-r\n[…]\n/Footer/etc.), explain\nwhy any route is a valid preview surface.\n\nSource code remains the truthful representation of the component.\nFuture-ready for isolated render via previewProps in manifest entry.",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.15 — drop iframe preview, replace with link-out CT…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T07:35:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "35c84c12238d20e3d3796f9be897a31b97948245",
          "body": "…l API (#86)\n\nCoherent-generated next.config.js now includes outputFileTracingIncludes\nfor the design-system API routes. Vercel's automatic file tracing skips\nraw .tsx source files (they're imported as compiled JS, not text), so\nthe /api/design-system/shared-components/[id] route returns 404 in\nprod\n[…]\n for shared component detail pages — already patched on landing\nin a separate commit. This propagates the fix to all new projects.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(scaffold): v0.17.14 — bundle DS manifest + .tsx sources for Verce…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T07:25:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6a207d954ffe4d56ca6c6783cf2143263472c236",
          "body": "…nt.design (#85)",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.13 — Coherent Design Method clickable to getcohere…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T07:10:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90fcf97596d2e0e9210d2294eb38ff48b3e0f17c",
          "body": "…e dist) (#84)",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.12 — republish LinkedIn URL fix (v0.17.11 had stal…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T07:07:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96d449f15b2c8a87d1633051573161300abc3795",
          "body": null,
          "is_bot": false,
          "headline": "fix(viewer): v0.17.11 — author link → LinkedIn (#83)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T07:04:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18bf9ec572a9cfc0606f851decc4a5dd635acc3e",
          "body": null,
          "is_bot": false,
          "headline": "fix(viewer): v0.17.10 — attribution pb-4 (1rem bottom padding) (#82)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T07:02:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59a1941c812221a75844b1ab30bacb16e72d3646",
          "body": "User feedback: pb-4 lg:pb-5 still leaves visible empty space below\nthe attribution row. Drop bottom padding entirely so the row sits\nflush against the viewport edge.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.9 — drop attribution footer bottom padding (#81)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T06:57:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "15dd582ee8e73aaec3606140dcd34b570a21ff67",
          "body": "…(#80)\n\nPreviously coherent update bailed early with 'already up to date' when\nproject version matched CLI version. Templates change between patch\npublishes within the same SemVer (e.g., v0.17.5 → v0.17.6 → v0.17.7) —\nusers had no way to pull template fixes without manually editing the\nversion field\n[…]\nreshed at vX'\n\nVerified: landing regenerated end-to-end (20 overlay files), layout\ncorrectly applied v0.17.7 centered attribution.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): v0.17.8 — update force-regenerates overlay on same version …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T06:55:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7d33ff52fbe7c89400c640e4de1a1ac328fa37e0",
          "body": "User feedback on v0.17.6: too much bottom padding, justify-between\nspread author and GitHub chip too far apart, attribution should be\ncentered with chip inline next to author name.\n\nChanges:\n- pb-8 lg:pb-10 → pb-4 lg:pb-5\n- pt-5 → pt-4\n- justify-between → justify-center, single centered row\n- GitHub chip smaller (px-2 py-1, 12px Octicon)\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.7 — tighten attribution footer, center inline (#79)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T06:45:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fb38fa11c84bdb65c2f1a399b6e87ced5eb92a6e",
          "body": "…r (#78)\n\nUser feedback: v0.17.5 placed Coherent Design Method · by Sergei Kovtun +\nGitHub chip in the sidebar footer below version/generated, where they\ncompeted for space and felt cramped.\n\nMoved to the bottom of the main content column — horizontal layout\nbelow children, with top-border separator\n[…]\n the GitHub chip with a proper Octicon SVG + external-link\narrow.\n\nSidebar footer back to clean version + generated metadata only.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.6 — move attribution from sidebar to content foote…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T06:35:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c7900708e2fe4d2c6a83c18c5d486fa334e792a",
          "body": "…(#77)\n\n4 user-feedback fixes:\n\n1. Footer attribution restored (was in older versions, dropped in v0.17.0)\n   — \"Coherent Design Method · by Sergei Kovtun\" + linked GitHub chip in\n   sidebar footer below version/generated metadata.\n\n2. Shared Components table — Name primary clickable (font-medium\n  \n[…]\nopen-in-new-tab link.\n\nVerified: 1746 tests pass, typecheck clean, smoke regen 200 on all DS\nroutes including shared detail pages.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.5 — footer attribution + shared components polish …",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T06:06:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d5c2bdd05b24d654b685f97275cbfb1c01489a25",
          "body": "…s rewrite (#76)\n\n3 user-feedback fixes:\n\n1. Color page dark column wrapped in .dark bg-background so it visually\n   reads as the dark theme (not just light card with dark swatches)\n\n2. Sidebar:\n   - Subtle bg-muted/30 surface (was bg-background — same as content)\n   - Icons on all 6 main groups (Lu\n[…]\nly only the\nregenerate-docs subcommand did this).\n\nVerified: 1746 tests pass, typecheck clean, smoke regen 200 on all 6 DS\nroutes.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.4 — color dark surface + sidebar polish + docs/rec…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T04:07:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1052a5d4794d5389dd964f4bb3c4a0a5d18caf90",
          "body": "Bugs:\n- isGroupActive checks child link paths so Foundations expands on Voice\n- linkActive is exact match — \"All components\" no longer always selected\n- Drop overflow-hidden on Preview/Variants/Sizes blocks so dropdowns\n  break out without being clipped (rounded corners preserved via\n  rounded-t-md \n[…]\n hints (\"Surface — backgrounds and content layers\")\n\nVerified: 1746 tests pass, typecheck clean, smoke regen 200 on all DS\nroutes.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.3 — bugs + UX consistency + polish (8 feedback) (#75)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-30T00:11:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "799c9ef1cf3ed66c16862e92959d3c40ebe76c30",
          "body": "Four user-feedback fixes after v0.17.1 ship:\n\n1. Sidebar header reordered — brand block top, Back to App below\n2. IA flat (no numbering) — Foundations contains Color/Typography/Spacing/\n   Voice; Base Components + Shared Components renamed; Sitemap/Docs/\n   Recommendations as flat tail below soft di\n[…]\noverrides. Cleaner, theme-correct\nautomatically.\n\nVerified: 1746 tests pass, typecheck clean, smoke regenerated all DS\nroutes 200.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.2 — IA restructure + sidebar color rethink (#74)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-29T23:20:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b81a4fa4ce1c4d4705a099c303b57f9a796dbd93",
          "body": "User reviewed v0.17.0 live, surfaced 7 issues. All addressed.\n\n1. Two-level navigation. Top-level groups (01 Foundations, 02\n   Components, 03 Patterns, 04 Voice) clickable to overview, with\n   active group auto-expanding to show children. Components and\n   Shared blocks fetched dynamically + alphab\n[…]\nconsult ratified plan. Known limitation: dynamic home\n+ tokens pages still mono-heavy — deferred to v0.17.2.\n\nTests: 1746 passing.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(viewer): v0.17.1 — 7 user-feedback fixes after v0.17.0 ship (#73)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-29T22:15:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f5af57b032a986baed9156f84055aacb979cefe",
          "body": "Foundational redesign of the /design-system/ viewer in every generated\nproject. Per direction doc at\n~/.gstack/projects/skovtun-coherent-design-method/design-system-viewer-direction-2026-04-29.md\n(Primer + Atlassian + Geist references).\n\nLayout (design-system-layout.ts rewritten):\n- Permanent left s\n[…]\n- Existing dynamic home preserved for runtime data fetching\n\nTests: 1746 passing (template content, validated via build + review).\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(viewer): v0.17.0 — design-system viewer redesign (#72)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-29T21:11:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a2e77dadc25b91873b87afed0979f62fae9de512",
          "body": "… (#71)\n\nSidecar tokenUsage.colors mapping tells AI WHERE each token belongs:\n\n  tokenUsage: {\n    colors: {\n      primary: \"Primary actions, active nav, focus rings\",\n      muted: \"Subtle section backgrounds, inactive states\",\n    }\n  }\n\nSurfaces:\n- Modification prompt: COLOR USAGE block appended a\n[…]\n/prompt-builders/modification.ts: render\n  COLOR USAGE block\n- harness-context.test.ts: 4 new tests\n\nTests: 1746 passing (+4 new).\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(tokens): v0.16.1 — semantic color usage notes (Rollur borrow #2)…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-29T20:51:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "63d162959af6731bb6d5b108a25f22da65dbf0da",
          "body": "…aint (#70)\n\nAdds VoiceProfileSchema parallel to atmosphere. Where atmosphere shapes\nvisual, voice shapes COPY: tone, ctaStyle, copyRules, avoidWords,\ntransparencyRules.\n\nInjected into modification prompt as ## VOICE DIRECTIVE block between\nCORE_CONSTRAINTS and design-quality rules. Empty/absent voi\n[…]\ni/src/phase-engine/prompt-builders/modification.ts: inject\n- voice-directive.test.ts: 11 new tests\n\nTests: 1742 passing (+11 new).\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(voice): v0.16.0 — voice profile as first-class generation constr…",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-29T19:48:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a92a1ce49672194c36c4f35507005ec30df37aba",
          "body": "After verifying agentskills.io spec literally, codex was correct on\nall three deferred issues.\n\n1. metadata flat-string compliance. Spec literally: \"A map from\n   string keys to string values.\" v0.15.2's nested shape violated\n   that. Flattened to:\n     metadata:\n       coherent_phase_engine_protoco\n[…]\nall\n   design.* keys, renders strings and string arrays. Forward-compat\n   for fields we add later.\n\nTests: 1731 passing (+5 new).\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: v0.15.5 — three deferred codex findings (#69)",
          "author_name": "Sergei Kovtun",
          "author_login": "skovtun",
          "committed_at": "2026-04-29T19:11:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 37,
      "commits_last_year": 693,
      "latest_release_at": "2026-04-29T22:16:09Z",
      "latest_release_tag": "v0.17.1",
      "releases_from_tags": false,
      "days_since_last_push": 10,
      "active_weeks_last_year": 13,
      "days_since_latest_release": 95,
      "mean_days_between_releases": 0
    },
    "artifacts": {
      "collected": true,
      "structure": [],
      "declarations": [
        {
          "name": null,
          "path": "package.json",
          "tokens": [
            "npm.private"
          ],
          "ecosystem": "npm"
        },
        {
          "name": "@getcoherent/cli",
          "path": "packages/cli/package.json",
          "tokens": [
            "npm.bin",
            "npm.entry",
            "npm.peer_dependencies"
          ],
          "ecosystem": "npm"
        },
        {
          "name": "@getcoherent/core",
          "path": "packages/core/package.json",
          "tokens": [
            "npm.entry"
          ],
          "ecosystem": "npm"
        }
      ]
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "readme_badges": {
        "hosts": [
          "shields.io"
        ],
        "total": 4,
        "header": 4,
        "collected": true,
        "has_inspect_badge": false
      },
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@getcoherent/cli",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "design-system",
            "cli",
            "frontend",
            "ai",
            "code-generation",
            "nextjs",
            "react",
            "coherent"
          ],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@getcoherent/cli",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "0.26.0",
          "repository_url": "https://github.com/skovtun/coherent-design-method",
          "versions_count": 245,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 5350,
          "first_published_at": "2026-03-10T05:51:50.761000Z",
          "latest_published_at": "2026-07-23T22:12:34.372000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 10
        },
        {
          "name": "@getcoherent/core",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "design-system",
            "frontend",
            "ai",
            "code-generation",
            "coherent"
          ],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@getcoherent/core",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "0.26.0",
          "repository_url": "https://github.com/skovtun/coherent-design-method",
          "versions_count": 244,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 5669,
          "first_published_at": "2026-03-10T05:51:44.152000Z",
          "latest_published_at": "2026-07-23T22:12:31.846000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 10
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 22,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-06-26",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/cli/tsconfig.json",
        "packages/core/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 125127,
      "source_files_sampled": 456,
      "oversized_source_files": 5,
      "agent_instruction_files": [
        ".cursor/rules/safe-file-transforms.mdc",
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 15048
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 162,
        "malicious_count": 0,
        "assessed_package": "npm:@getcoherent/cli@0.26.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@anthropic-ai/sdk",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.32.0"
        },
        {
          "name": "@getcoherent/core",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "workspace:*"
        },
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.29.0"
        },
        {
          "name": "chalk",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.3.0"
        },
        {
          "name": "chokidar",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        },
        {
          "name": "commander",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.1.0"
        },
        {
          "name": "dotenv",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^16.4.5"
        },
        {
          "name": "open",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "ora",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.1"
        },
        {
          "name": "prompts",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.4.2"
        },
        {
          "name": "zod",
          "manifest": "packages/cli/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.22.4"
        },
        {
          "name": "zod",
          "manifest": "packages/core/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.22.4"
        }
      ],
      "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": 148,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 3,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "skovtun",
          "commits": 693,
          "avatar_url": "https://avatars.githubusercontent.com/u/56520472?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "publish.yml",
        "quality-canary.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.js"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "pnpm-lock.yaml"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "26 out of 26 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/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 3 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": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "23 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "3b7decbded989b70842cf2026dad7a097be8fdc3",
        "ran_at": "2026-08-03T02:39:47Z",
        "aggregate_score": 3.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 0,
        "decided_7d": 0,
        "merged_30d": 41,
        "authors_30d": 1,
        "decided_30d": 41,
        "sample_size": 60,
        "window_days": 30,
        "sample_exhausted": false,
        "authors_probed_30d": 1,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 0,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": "2026-08-02T08:29:51Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-23T22:12:19Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/skovtun/coherent-design-method",
    "host": "github.com",
    "name": "coherent-design-method",
    "owner": "skovtun"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 65 is calibrated to 75 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 65,
            "calibrated": 75,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 75,
      "inputs": {
        "security": 49,
        "vitality": 76,
        "community": 50,
        "governance": 54,
        "calibration": "2026-08-02",
        "engineering": 90,
        "ai_readiness": 69,
        "weighted_overall_raw": 65
      },
      "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": 693,
              "human_commit_share": 1,
              "days_since_last_push": 10,
              "active_weeks_last_year": 13
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 10 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "13/52 weeks with commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 13
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "693 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 693
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 3 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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 90,
            "inputs": {
              "releases_count": 37,
              "latest_release_tag": "v0.17.1",
              "releases_from_tags": false,
              "days_since_latest_release": 95,
              "mean_days_between_releases": 0
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "37 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 95 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 95
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": 10,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 10 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 10
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 50,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 21,
            "inputs": {
              "forks": 1,
              "stars": 22,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "22 stars",
                "points": 21.4,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 22
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": 4,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [
                "shields.io"
              ],
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 67,
            "inputs": {
              "packages": [
                "@getcoherent/cli",
                "@getcoherent/core"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 11019
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "11,019 downloads/month across npm",
                "points": 53.9,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 11019,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 54,
        "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": "excellent",
            "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": 82,
            "inputs": {
              "merged_prs": 148,
              "open_issues": 0,
              "closed_issues": 3,
              "prs_merged_7d": 0,
              "prs_decided_7d": 0,
              "prs_merged_30d": 41,
              "prs_decided_30d": 41,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 2,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "148/150 decided PRs merged",
                "points": 29.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 148,
                      "decided": 150
                    }
                  }
                ],
                "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": "weak",
            "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": 40,
            "inputs": {
              "followers": 7,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "skovtun",
              "public_repos": 2,
              "account_age_days": 2485
            },
            "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": "7 followers of skovtun",
                "points": 6.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 7,
                      "login": "skovtun"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "2 public repos, account ~6 yr old",
                "points": 15.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 2
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@getcoherent/cli",
                "@getcoherent/core"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 10
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 10 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 10
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "245 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 245
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 90,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.js",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "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": "26 out of 26 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ai",
                "cli",
                "code-generation",
                "code-generator",
                "design-system",
                "design-systems",
                "nextjs",
                "react",
                "shadcn-ui",
                "tailwindcss"
              ],
              "has_wiki": true,
              "homepage": "https://getcoherent.design",
              "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": "https://getcoherent.design",
                "points": 15,
                "status": "met",
                "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": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "weak",
        "name": "Security",
        "value": 49,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "26 out of 26 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/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 3 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 detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "23 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "exceptional",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:@getcoherent/cli@0.26.0 runtime dependency closure — what installing the published package pulls in — 162 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@getcoherent/cli@0.26.0",
                  "assessed": 162
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 162,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 162,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 69,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".cursor/rules/safe-file-transforms.mdc",
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 15048
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".cursor/rules/safe-file-transforms.mdc, AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".cursor/rules/safe-file-transforms.mdc, AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "pnpm-lock.yaml"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "packages/cli/tsconfig.json",
                "packages/core/tsconfig.json"
              ],
              "agent_commit_share": 0.87,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.js",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.js"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/cli/tsconfig.json, packages/core/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/cli/tsconfig.json, packages/core/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "87 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 87,
                      "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": "TypeScript",
              "largest_source_bytes": 125127,
              "source_files_sampled": 456,
              "oversized_source_files": 5
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "5/456 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 456,
                      "oversized": 5
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "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": {
      "labels": [
        "cli",
        "mcp-server",
        "library"
      ],
      "scores": {
        "cli": 12,
        "library": 6.6,
        "mcp-server": 7
      },
      "primary": "cli",
      "evidence": [
        {
          "tier": "declared",
          "label": "cli",
          "source": "npm.bin",
          "weight": 6
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.private",
          "weight": -6
        },
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:npm",
          "weight": 6
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.entry",
          "weight": 4.8
        },
        {
          "tier": "dependencies",
          "label": "cli",
          "source": "dep:commander",
          "weight": 4
        },
        {
          "tier": "dependencies",
          "label": "mcp-server",
          "source": "dep:@modelcontextprotocol/sdk",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "mcp-server",
          "source": "mcp_signal",
          "weight": 3
        },
        {
          "tier": "tags",
          "label": "cli",
          "source": "tag:cli",
          "weight": 2
        },
        {
          "tier": "declared",
          "label": "library",
          "source": "npm.peer_dependencies",
          "weight": 1.8
        }
      ],
      "artifacts": [
        {
          "path": "package.json",
          "labels": [],
          "ecosystem": "npm"
        },
        {
          "path": "packages/cli/package.json",
          "labels": [
            "library",
            "cli"
          ],
          "ecosystem": "npm"
        },
        {
          "path": "packages/core/package.json",
          "labels": [
            "library"
          ],
          "ecosystem": "npm"
        }
      ],
      "confidence": "high",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "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-08-03T02:40:03.471877Z",
  "schema_version": "0.30.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/skovtun/coherent-design-method.svg",
  "full_name": "skovtun/coherent-design-method",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikennpm.