Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 2.5.0 · 2026-08-01 17:02 UTC

probelabs / maid

A lightweight Mermaid diagram linter which helps humans and AI with perfect diagrams

TypeScript · HTML · JavaScriptISC★ 27 Sterne⑂ 1 Forkseit Sept. 2025Auf GitHub ansehen ↗
ArtKommandozeilenwerkzeugBibliothekwie das ermittelt wird

probelabs/maid erreicht einen Gesundheitsindex von 56 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (64/100) ab, am schwächsten bei Security (41/100). Zuletzt vor 89 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

56
gesamt / 100
Mittel

Software-Gesundheitsindex

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

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

Eigentümerschaft

ProbeOrganisation
18 Follower27 öffentliche Reposseit Aug. 2025

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
npm@probelabs/maid0.0.2979.23626vor 135 Tagenmermaidlinterclidocsmarkdowndiagram

Metriken nach Kategorie

Vitalität

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

64Mittel · 21 % des Gesamtindex
Wie die Bewertung erfolgt
18/36Push-Aktualität — letzter Push vor 89 Tagen
10.4/36Commit-Rhythmus — 15/52 Wochen mit Commits
18/18Commit-Volumen — 128 Commits im letzten Jahr
1/10OpenSSF Scorecard: Maintained — 2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1
Verwendete Eingangsdaten
commits_last_year128
human_commit_share1
days_since_last_push89
active_weeks_last_year15
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 29 Releases veröffentlicht
27/36Release-Aktualität — letztes Release vor 135 Tagen
27/27Release-Rhythmus — ein Release etwa alle 16,3 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count29
latest_release_tagv0.0.29
releases_from_tagsnein
days_since_latest_release135
mean_days_between_releases16,3
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?

47Schwach · 17 % des Gesamtindex
Wie die Bewertung erfolgt
23/60Stars — 27 Stars
0/25Forks — 1 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks1
stars27
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (ISC)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
readme_badges
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
readme_badge_services
has_pull_request_templatenein
Wie die Bewertung erfolgt
65.3/80Downloads pro Monat — 79.236 Downloads/Monat über npm
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
packages@probelabs/maid
dependents
ecosystemsnpm
total_downloads
monthly_downloads79.236
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?

53Mittel · 23 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0.2/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 99 % der Commits
2.7/13.5Breite der Beitragenden — 2 Beitragende
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Verwendete Eingangsdaten
bus_factor1
contributors_sampled2
top_contributor_share0,992
Wie die Bewertung erfolgt
23.4/42Issue-Lösungsquote — 56 % der Issues geschlossen
28.3/30PR-Annahme — 65/69 entschiedene PRs gemergt
0/13Newcomer PR acceptance — kein PR eines Erstbeitragenden in 30 Tagen entschieden
0/15OpenSSF Scorecard: Code-Review — Found 1/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs65
open_issues4
closed_issues5
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0,556
closed_unmerged_prs4
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): newcomer_pr_acceptance. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
9.2/25Reichweite des Inhabers — 18 Follower von probelabs
12.5/25Kontohistorie — 27 öffentliche Repos, Kontoalter ca. 0 Jahre
Verwendete Eingangsdaten
followers18
owner_typeOrganization
is_verified
owner_loginprobelabs
public_repos27
account_age_days351

Paketpflege

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

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

61Mittel · 19 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 4 Workflow(s)
0/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
18/20OpenSSF Scorecard: CI-Tests — 22 out of 23 merged PRs checked by a CI test -- score normalized to 9
Verwendete Eingangsdaten
has_cija
has_testsnein
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://probelabs.com/maid
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepagehttps://probelabs.com/maid
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

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

41Schwach · 16 % des Gesamtindex

Sicherheitslage

32Gefährdet
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.2/2.5CI-Tests — 22 out of 23 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/30 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
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
0.8/7.5Maintained — 2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1
5/5Packaging — packaging workflow detected
1.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
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 — 47 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,2
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
8.8/25Indirekte Abhängigkeiten ohne bekannte Advisories — 1 betroffen: lodash-es 4.17.23 (high 8.1)
33.3/40Keine offenen Advisories — 1 Paket(e) mit Advisory seit über 90 Tagen unbehandelt; ältestes vor 121 Tagen veröffentlicht
Verwendete Eingangsdaten
sourceosv
advisories2
affected_packages1
assessed_packages35
unassessed_packages0
affected_by_severityhigh 1
direct_affected_packages0
Abgeglichen wurde die Laufzeit-Abhängigkeitshülle von npm:@probelabs/maid@0.0.29 — das, was die Installation des veröffentlichten Pakets nach sich zieht — mit 35 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.

60Mittel · 4 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 94 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,94
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7.040
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
0/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — packages/maid-mcp/tsconfig.json, tsconfig.json
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 24 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Verwendete Eingangsdaten
has_nixnein
has_testsnein
lockfilespackage-lock.json
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configspackages/maid-mcp/tsconfig.json, tsconfig.json
agent_commit_share0,24
toolchain_manifests
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — TypeScript (statisch typisiert)
53.8/55Handhabbare Dateigrößen — 2/94 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypeScript
largest_source_bytes448.582
source_files_sampled94
oversized_source_files2
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — examples
Verwendete Eingangsdaten
example_dirsexamples
has_mcp_signalnein
api_schema_files

Eckdaten

27GitHub-Sterne
2Mitwirkende
128Commits, letzte 12 Monate
89Tage seit letztem Push
29Releases
1Bus-Faktor
4offene 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.2 / 10
3.2Gesamtwert

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-01 17:02 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
9CI-Tests22 out of 23 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
1Maintained2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1
10Packagingpackaging workflow detected
3Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 3
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
0Vulnerabilities47 existing vulnerabilities detected
Direkte Abhängigkeiten 4
RegistryPaketVersionsvorgabeManifest
npm@types/dagre^0.7.53package.json
npmchevrotain^11.0.3package.json
npmdagre^0.8.5package.json
npmglobby^14.0.2package.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 1

Die Installation von npm:@probelabs/maid@0.0.29 zieht 35 Pakete nach sich, direkt und transitiv: 1 tragen bekannte Advisories, davon 0 direkte Abhängigkeiten.

PaketVersionBeziehungSchweregradAdvisoriesBehoben in
lodash-es4.17.23indirekthoch24.18.0

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": [],
      "is_fork": false,
      "size_kb": 3725,
      "has_wiki": true,
      "homepage": "https://probelabs.com/maid",
      "languages": {
        "HTML": 166792,
        "Shell": 323,
        "Mermaid": 41949,
        "JavaScript": 135125,
        "TypeScript": 562695
      },
      "pushed_at": "2026-05-04T11:48:19Z",
      "created_at": "2025-09-29T07:36:29Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-14T16:00:59Z",
      "description": "A lightweight Mermaid diagram linter which helps humans and AI with perfect diagrams",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "ISC",
      "default_branch": "main",
      "license_spdx_raw": "ISC",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "HTML",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "probelabs.com",
      "name": "Probe",
      "type": "Organization",
      "login": "probelabs",
      "company": null,
      "location": null,
      "followers": 18,
      "avatar_url": "https://avatars.githubusercontent.com/u/226675185?v=4",
      "created_at": "2025-08-15T08:20:57Z",
      "is_verified": null,
      "public_repos": 27,
      "account_age_days": 351
    },
    "license": {
      "state": "standard",
      "spdx_id": "ISC",
      "raw_spdx": "ISC",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.0.29",
          "kind": "patch",
          "published_at": "2026-03-18T18:51:22Z"
        },
        {
          "tag": "v0.0.28",
          "kind": "patch",
          "published_at": "2026-03-14T16:02:28Z"
        },
        {
          "tag": "v0.0.27",
          "kind": "patch",
          "published_at": "2026-03-07T15:26:07Z"
        },
        {
          "tag": "v0.0.26",
          "kind": "patch",
          "published_at": "2026-03-02T15:51:35Z"
        },
        {
          "tag": "v0.0.25",
          "kind": "patch",
          "published_at": "2026-02-18T09:42:02Z"
        },
        {
          "tag": "v0.0.24",
          "kind": "patch",
          "published_at": "2026-02-13T13:16:02Z"
        },
        {
          "tag": "v0.0.23",
          "kind": "patch",
          "published_at": "2026-01-30T09:21:26Z"
        },
        {
          "tag": "v0.0.22",
          "kind": "patch",
          "published_at": "2025-11-28T07:55:44Z"
        },
        {
          "tag": "v0.0.21",
          "kind": "patch",
          "published_at": "2025-11-03T09:39:28Z"
        },
        {
          "tag": "v0.0.20",
          "kind": "patch",
          "published_at": "2025-10-22T15:29:18Z"
        },
        {
          "tag": "v0.0.19",
          "kind": "patch",
          "published_at": "2025-10-21T20:04:53Z"
        },
        {
          "tag": "v0.0.18",
          "kind": "patch",
          "published_at": "2025-10-21T18:49:10Z"
        },
        {
          "tag": "v0.0.17",
          "kind": "patch",
          "published_at": "2025-10-19T09:15:07Z"
        },
        {
          "tag": "v0.0.16",
          "kind": "patch",
          "published_at": "2025-10-17T17:10:35Z"
        },
        {
          "tag": "v0.0.15",
          "kind": "patch",
          "published_at": "2025-10-13T14:08:08Z"
        },
        {
          "tag": "v0.0.14",
          "kind": "patch",
          "published_at": "2025-10-13T06:32:04Z"
        },
        {
          "tag": "v0.0.13",
          "kind": "patch",
          "published_at": "2025-10-10T13:58:40Z"
        },
        {
          "tag": "v0.0.12",
          "kind": "patch",
          "published_at": "2025-10-10T13:52:18Z"
        },
        {
          "tag": "v0.0.11",
          "kind": "patch",
          "published_at": "2025-10-10T13:44:25Z"
        },
        {
          "tag": "v0.0.10",
          "kind": "patch",
          "published_at": "2025-10-07T15:57:57Z"
        },
        {
          "tag": "v0.0.9",
          "kind": "patch",
          "published_at": "2025-10-06T19:42:16Z"
        },
        {
          "tag": "v0.0.8",
          "kind": "patch",
          "published_at": "2025-10-05T14:44:15Z"
        },
        {
          "tag": "v0.0.7",
          "kind": "patch",
          "published_at": "2025-10-03T14:18:22Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2025-10-01T14:38:03Z"
        },
        {
          "tag": "v0.0.5",
          "kind": "patch",
          "published_at": "2025-10-01T11:25:26Z"
        },
        {
          "tag": "v0.0.4",
          "kind": "patch",
          "published_at": "2025-09-30T16:32:46Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2025-09-30T16:18:45Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2025-09-30T16:07:59Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2025-09-30T09:04:16Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "c30a4ec4fa77655ef6c89618480c864655bd0e54",
          "body": "Adds classDiagram style/classDef/cssClass parsing support and generated preview artifacts.",
          "is_bot": false,
          "headline": "feat(class): add style, classDef, and cssClass support",
          "author_name": "Michael Denyer",
          "author_login": "michael-denyer",
          "committed_at": "2026-05-04T11:48:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d57a9f071c87ee9bc61bdefb00744c0de253babf",
          "body": null,
          "is_bot": false,
          "headline": "fix(flowchart): accept encoded inline pipe labels (#75)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-05-04T10:53:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa97b33c5da9206b4a15847b945144d5bb09935e",
          "body": "* fix(flowchart): collapse unsupported note blocks\n\n* fix(flowchart): allow quoted pipe edge labels\n\n* refactor(flowchart): share note block parsing",
          "is_bot": false,
          "headline": "fix(flowchart): handle note blocks and quoted edge labels (#74)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-04-15T18:29:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3d5c10fe35fbf68d5bbd9eea6f7cac65b20697d",
          "body": "* fix(sequence): flag and fix unescaped semicolons in messages\n\n* ci(visor): switch review bot to glm-5 provider config\n\n* ci(visor): revert glm provider env override\n\n* chore(previews): regenerate sequence invalid previews for issue 69",
          "is_bot": false,
          "headline": "fix(sequence): reject unescaped semicolons in message text (#70)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-03-18T18:50:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c285351d0d19395f2b0fbf8c7d726d70f346af8",
          "body": null,
          "is_bot": false,
          "headline": "feat: support mermaid frontmatter in validation pipeline (#68)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-03-14T14:21:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70efec729c8c234d86141236e3ec2961bfe641fa",
          "body": "* test(flowchart): add edge-label bracket encoded-braces regression\n\n* fix(flowchart): handle quoted text inside pipe edge labels\n\n* fix(sequence): handle multiline note with hyphenated aliases\n\n* chore(previews): refresh sequence notes renderer snapshot",
          "is_bot": false,
          "headline": "test(flowchart): cover edge labels with bracket + encoded braces (#66)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-03-14T12:44:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26d4be98595e802ed2a0b60e14198ead6b67e17b",
          "body": "* fix(flowchart): flag brackets in unquoted labels\n\n* fix(flowchart): handle mixed bracket label hazards\n\n* fix(flowchart): normalize escaped-quote regex in label fixes",
          "is_bot": false,
          "headline": "fix(flowchart): reject unquoted labels with brackets (#64)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-03-07T15:25:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1136ea41e512614deeaa0ccb56bbb552aa3ec1d5",
          "body": null,
          "is_bot": false,
          "headline": "fix(flowchart): handle curly braces in labels (#65)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-03-06T16:12:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "338d26dd5e6d8cf56272597c86097c33fcccdcf1",
          "body": null,
          "is_bot": false,
          "headline": "fix(flowchart): flag leading slash in unquoted labels (#63)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-03-02T15:11:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffe529c4e3b2a34ec5416501ad865de575a59498",
          "body": "* test(flowchart): cover quoted edge labels\n\n* chore(previews): trim trailing newline in flowchart invalid\n\n* chore(previews): restore trailing separator newline\n\n* Revert \"chore(previews): restore trailing separator newline\"\n\nThis reverts commit e066c58f8e69293af7bb100bd2bb4fb6a8de4508.\n\n* chore(previews): add trailing newline to flowchart invalid",
          "is_bot": false,
          "headline": "test(flowchart): add quoted edge label fixture (#62)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-02-18T09:41:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15136d1f1356e5fe3d9a3adccb9bae9646e299c0",
          "body": null,
          "is_bot": false,
          "headline": "chore(previews): regenerate flowchart invalid previews (#61)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-02-13T13:15:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f81414933076dde8c5feb630e3b09c73a825c82",
          "body": null,
          "is_bot": false,
          "headline": "test(flowchart): add issue 60 parens fixtures",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-02-12T18:56:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7c13c58a13e80a942e1234670d05db8001d22e3",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): use npm install like probe/visor",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-01-30T09:20:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b6cf549a31eded5523bd9769c4320e420a91e09",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): align npm publish with visor/probe",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-01-30T08:22:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "537c2aa14cebde259f09e0c8d303fffbfeeb6335",
          "body": null,
          "is_bot": false,
          "headline": "chore(release): switch npm publish to trusted publishers",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-01-30T07:46:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2bc038ca7a407f7bef224e717a375f206240c479",
          "body": "* fix(flowchart): detect subgraph id collisions\n\n* fix(flowchart): heuristic rename for subgraph id collision",
          "is_bot": false,
          "headline": "fix(flowchart): detect subgraph id collisions (#59)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2026-01-29T06:24:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecb47ebfef772cc6b1b04915a499ad0c65a4613d",
          "body": "* fix(flowchart/validate): avoid double-handling single-quoted labels when sweeping for quotes\\n\\n- Skip FL-LABEL-QUOTE-IN-UNQUOTED for single-quoted labels to prevent double fixes\\n- Keeps targeted FL-LABEL-DOUBLE-IN-SINGLE handling intact\\n\\ntests(flowchart): adjust expected errors; add attribute-quotes case stays covered\\n\\npreviews(flowchart): regenerate INVALID_DIAGRAMS (47 cases) with stable autofix table\n\n* previews(flowchart): regen invalid page (mixed-brackets autofix now ✅ safe)",
          "is_bot": false,
          "headline": "fix(flowchart): stable quote sweep + regenerate previews (#57)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-11-28T07:55:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b7f168c2b0a640c1dfcf5af43aee1e877d19cd3",
          "body": "…cli parity)\n\n- Heuristic sweep now detects double quotes in unquoted [ ... ] labels (in addition to parens/@)\n- Dedupe ranges across quote/parens/@ diagnostics\n- Covers cases like data-trigger-visibility=true that mermaid-cli rejects\n\ntests(flowchart): add invalid fixture label-with-attribute-quotes; update expected errors\n\npreviews(flowchart): regenerate INVALID_DIAGRAMS (47 cases)",
          "is_bot": false,
          "headline": "fix(flowchart/validate): flag quotes inside unquoted labels (mermaid-…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-11-27T18:17:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0024fb9673b5717b2d8f7becbeb5c45f2aac65c",
          "body": "…nested + quoted-safe) (#56)\n\n* fix(flowchart/validate): robust bracket scan for parens-in-unquoted (nested + quoted-safe)\\n\\n- Track label range per [ ... ] segment to dedupe diagnostics\\n- Scan with nested-bracket depth; skip brackets inside quotes and escapes\\n- Keep skipping typed shapes ([/…/],\n[…]\nt 'No such shape' and unknown-type); regenerate flowchart invalid page; ensure '@' row shows ✅ safe\n\n* previews: regenerate INVALID pages for sequence/state/class with canonical errors to match CI env",
          "is_bot": false,
          "headline": "fix(flowchart/validate): robust bracket scan for parens-in-unquoted (…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-11-03T09:39:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3cdebd9f9f638d34903eec0ed92a0e76657f52da",
          "body": null,
          "is_bot": false,
          "headline": "Update visor.yml",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-30T18:40:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04437b5f096044f638cce0e534e77baf74cb6441",
          "body": null,
          "is_bot": false,
          "headline": "Update visor.yml",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-30T18:18:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ded763d4262827b965625277a612bfc959aa06e6",
          "body": "* feat(flowchart): add invalid fixture for method parens in unquoted label; test and previews\\n\\n- Invalid: method-parens-in-unquoted-label.mmd\\n- Test: wrap label with .Error() in quotes (FL-LABEL-PARENS-UNQUOTED)\\n- Regenerate previews\n\n* fix(flowchart/validate): ensure parens-in-unquoted labels a\n[…]\n fixtures unchanged; previews regenerated in prior commit\n\n* feat(flowchart): edge inline label brackets → encode [ ] to []; add invalid fixture; update diagnostics and autofix; regen previews",
          "is_bot": false,
          "headline": "fix(flowchart): wrap method parens in unquoted node labels (#54)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-22T15:28:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "63f4a3d0c76579bdaaf705ea7fb6814deee7a98e",
          "body": null,
          "is_bot": false,
          "headline": "Changes auto-committed by Conductor (#53)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-21T20:04:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7666a69ef655d6d7114ea868d7317c8cd9708cc5",
          "body": "* feat(flowchart): add invalid fixture for quotes inside unquoted label with emoji tip\\n\\n- Add test to ensure safe autofix encodes inner quotes to "\\n- Regenerate previews (invalid page updated)\n\n* fix(flowchart): detect '@' inside unquoted square-bracket labels and wrap via autofix\\n\\n- Diagn\n[…]\neviews and generator to fail only on --fix=all changes\n\n* tests/fixtures(flowchart): add invalid cases for '@' in unquoted label, emoji-quote tip, and backticked inline edge label; regenerate previews",
          "is_bot": false,
          "headline": "fix(flowchart): encode quotes in unquoted labels (emoji tip case) (#52)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-21T18:46:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "559daf87bdb841c0d9064e3b7fc694ea1c8df65a",
          "body": "…racters (#51)\n\n* feat(flowchart): enhance auto-fix for complex labels with special characters\n\n- Update FL-LABEL-PARENS-UNQUOTED auto-fix to wrap labels in quotes when they contain complex characters (quotes, curly braces, commas)\n- Encode special characters as HTML entities: ' and \" → &quot;, { → \n[…]\nrallelogram: wrap + encode only inner \" to &quot;\\n- Parallelogram/trapezoid: encode ( ) and \"; leave { } and ' intact\\n- Regenerate previews\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(flowchart): enhance auto-fix for complex labels with special cha…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-20T12:47:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7f33b02980a0106f8090eba5a0ca0f38ad4b9182",
          "body": "* Changes auto-committed by Conductor\n\n* Changes auto-committed by Conductor",
          "is_bot": false,
          "headline": "Move MCP server to separate package (#50)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-19T09:14:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb388115548726339b4cf1d79cee75e9d077d78a",
          "body": "* Changes auto-committed by Conductor\n\n* Changes auto-committed by Conductor\n\n* Changes auto-committed by Conductor\n\n* chore(previews): regenerate after autofix improvements for flowchart invalid fixtures\\n\\n- Ensure 'agent schema workflow' marked safe (mermaid-cli renders after --fix/--fix=all)\\n- Enforce mermaid-cli validation for auto-fix previews in generator\\n- No changes to fixture content; only preview markdown updated",
          "is_bot": false,
          "headline": "Fix: Improve flowchart node label parsing and auto-fixing (#49)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-17T17:10:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "968e21905cbc5d0cb5cc0b2c870d829040a9d5c7",
          "body": "…entities (#48)\n\nFixes issue where backticks in quoted labels were being converted to numeric\nHTML entities (&#96;) which Mermaid doesn't decode, causing them to render\nas literal text like \"&`\" instead of actual backticks.\n\n## Problem\n\nWhen a diagram contained backticks in a quoted label:\n```mermai\n[…]\nart TD\n  A[\"{% if %} template\"] --> B{Stage}\n```\nRenders as: `{% if %} template` (clean)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(flowchart/autofix): remove backticks instead of encoding to HTML …",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-16T17:58:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f983165db43aabe5ea02e442d7a961229432063d",
          "body": "…HTML in link labels; add heavy fixture (#47)\n\n* fix(flowchart): allow <br/> and HTML-like tokens in link labels; downgrade backticks to warning; add guardrails to quote auto-fixes; add agent-schema-workflow invalid fixture\n\n* chore(fixes): harden auto-fix guardrails for quote/backtick/curly cases o\n[…]\nnd dynamic code fences\n\n* fix(autofix): sanitize all quoted segments inside shape labels on a line when any hazard found; ensures multiple occurrences are fixed in one pass; previews already validated",
          "is_bot": false,
          "headline": "fix(flowchart/autofix): render complex invalid via --fix=all; accept …",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-16T11:16:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "80cf8cac00e0dce5abc5fdd2acb283a36e21fdc2",
          "body": "…OTED (#46)\n\n* flowchart: map inner parentheses in round-shape labels to FL-LABEL-PARENS-UNQUOTED; add fixture; tests + previews updated\n\n* flowchart: post-parse scan for quotes-in-unquoted labels; encode-only fix for FL-LABEL-QUOTE-IN-UNQUOTED; update test-fixes\n\n* flowchart: guard quotes-in-unquot\n[…]\ny '-' lines (redundant input) to SE-BULLET-LINE-UNSUPPORTED; add docs + previews\n\n* tests: adjust QUOTE-IN-UNQUOTED autofix expectation to include parens encoding when present; keep mermaid-cli parity",
          "is_bot": false,
          "headline": "Flowchart: inner parentheses in (round) labels → FL-LABEL-PARENS-UNQU…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-13T13:52:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "87c33bc3b6921550faccd3bb2f4103ea4a0aebc3",
          "body": "…-PARENS-UNQUOTED; add fixture; regenerate previews (#45)",
          "is_bot": false,
          "headline": "flowchart: map parentheses inside unquoted diamond labels to FL-LABEL…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-13T09:03:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6188f88d8b11deb00716d6731c82b73d7a83160c",
          "body": "…BGRAPH); update docs + previews; add test-fixes case (#44)",
          "is_bot": false,
          "headline": "flowchart: add --fix=all to remove unmatched 'end' (FL-END-WITHOUT-SU…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-13T07:12:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70b4bb4c0ab4d704ff507ef16fb1fa49c985aea4",
          "body": "…ust mapping) (#43)\n\n* flowchart: map unquoted parentheses inside [] to FL-LABEL-PARENS-UNQUOTED even when parser token not RoundOpen/Close; keep existing autofix (encode parens)\n\n* flowchart: add fixture for parens with backticks; refine mapping preference; regenerate flowchart invalid previews",
          "is_bot": false,
          "headline": "Flowchart: unquoted parentheses in [] → FL-LABEL-PARENS-UNQUOTED (rob…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-13T06:31:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f9a9d5953b3246d57289ba50b06e22ee6bf11dd",
          "body": null,
          "is_bot": false,
          "headline": "Update visor.yml",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-13T06:31:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e02bfcf7b544b57c80b5ed81b0e47c464ed876fd",
          "body": "…fix) (#42)\n\n* flowchart: flag unsupported 'title' directive (FL-META-UNSUPPORTED); autofix (--fix=all) removes the meta line; add fixture; update docs; regenerate previews (flowchart invalid only)\n\n* previews: update flowchart invalid page after adding FL-META-UNSUPPORTED",
          "is_bot": false,
          "headline": "Flowchart: unsupported 'title' directive → FL-META-UNSUPPORTED (+auto…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-11T05:17:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e19e1e07f0bb6566286599932f2b706825cfaaa",
          "body": "The probe repository has the package.json in the npm/ folder,\nso we need to cd into that directory before running npm install\nto update the @probelabs/maid dependency.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: run npm install in npm folder for probe update step",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-10T13:57:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d5dc161a60c45e5862d095618e091b49fd73f337",
          "body": "The update-probe job was failing because it checks out the probelabs/probe\nrepository which doesn't have a package-lock.json file when setup-node\ntries to enable npm caching. Removed the cache parameter since it's not\ncritical for this step.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove npm cache from probe update workflow step",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-10T13:51:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e5eeabe25db60bdc9c7d20b1a1f3648b7801da6a",
          "body": "… bot (#41)\n\n- Add new update-probe job to release workflow that automatically creates PR in probelabs/probe when new version is tagged\n- Use GitHub App credentials (APP_ID, APP_PRIVATE_KEY) for secure cross-repo access\n- Add visor.yml workflow for AI-powered PR reviews using probelabs/visor@main\n- Auto-update @probelabs/maid dependency in probe repo on each release\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add auto-PR workflow for probe repo updates and Visor PR review…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-10T13:44:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ce3f54bc52aead51ddad26f009f590b6585aa1d5",
          "body": "…#40)\n\n* sequence: add failing fixture for messages-with-activation inside box; groundwork for improved diagnostics\n\n* sequence: map messages-inside-box (with +/-) to SE-BOX-EMPTY; guard autofix so --fix/--fix=all only changes when final output likely valid; regenerate previews",
          "is_bot": false,
          "headline": "Sequence: add failing box-with-activation fixture; prep diagnostics (…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-10T13:05:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09536f67491c3cac0301de52bd55a8cdf0bb116c",
          "body": "…(#39)\n\n* flowchart: reject one-sided link markers (--x-->, --o-->) to match mermaid-cli; add invalid fixture and docs; autofix removes marker\n\n* docs: add FL-LINK-UNSUPPORTED-MARKER; previews: regenerate flowchart invalid page",
          "is_bot": false,
          "headline": "Flowchart: reject one‑sided x/o markers; add fixture, docs, previews …",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-10T11:29:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66a28bdf82356bd99023956be5bd71a0c41b9928",
          "body": "…#38)\n\n* feat: add namespace, title, and interface support to class diagrams\n\n- Add TitleKw, NamespaceKw, and InterfaceKw tokens to lexer\n- Add titleStmt, namespaceStmt, and interfaceLine rules to parser\n- Add validation for CL-INTERFACE-NAME-DOUBLE-QUOTED\n- Add validation for CL-NAMESPACE-MISSING-R\n[…]\ndifference in error messages.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add namespace, title, and interface support to class diagrams (…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-10T08:56:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "981690bbd2a3a5d77bc786061196724436d07099",
          "body": "… fix (#37)\n\n* flowchart: linkStyle parity + bracket fixes + docs/tests + previews\n\n* previews(flowchart): regenerate invalid page for 'invalid node syntax' all-level fix",
          "is_bot": false,
          "headline": "flowchart: linkStyle parity + bracket fixes + double-circle all-level…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-08T08:49:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02b44b149699d1a2ad6068f512768f608362409b",
          "body": "…#40;/&#41;) (#36)\n\n* flowchart: error on parentheses inside unquoted labels (FL-LABEL-PARENS-UNQUOTED) with HTML-entity autofix; update hint text; add expected errors entry\n\n* tests(flowchart): update expected error codes — parens in unquoted (x2); curly-in-quoted produces only a warning so expect \n[…]\ncted error for curly-in-quoted as FL-LABEL-QUOTE-IN-UNQUOTED to match current parser mapping\n\n* previews: regenerate VALID/INVALID pages for all diagram types after flowchart parens-in-unquoted change",
          "is_bot": false,
          "headline": "flowchart: fail on parentheses in unquoted labels + autofix (encode &…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-08T06:03:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c5ac2f13b32979636eda15519b0c2e2abf4231f0",
          "body": "…ne body to single-line) under SE-NOTE-MALFORMED; add invalid fixture; update fix tests; regenerate sequence invalid previews (#35)",
          "is_bot": false,
          "headline": "sequence: autofix multiline note headers by inserting colon (and inli…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-07T15:57:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0e6cbffc2185e68aad88ccc67b0016d948f6437",
          "body": "…{ }) (#34)\n\n* flowchart: warn when { or } appear inside quoted label text (FL-LABEL-CURLY-IN-QUOTED) with guidance to use &#123;/&#125;\n\n* tests(flowchart): add invalid fixture for curly braces inside quoted segment (curly-in-quoted.mmd) and expected error; initial case uses quotes inside unquoted \n[…]\nlid\n\n* tests: remove stray 'S2[Append' file; add fix test for FL-LABEL-CURLY-IN-QUOTED\n\n* previews(flowchart): regenerate VALID/INVALID previews to include curly-in-quoted case and updated diagnostics",
          "is_bot": false,
          "headline": "flowchart: add FL-LABEL-CURLY-IN-QUOTED + autofix (HTML entities for …",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-07T11:44:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "73ca0ddf39106b8682465ff6898c13753088ee83",
          "body": "* fix: improve error handling for quotes in flowchart node labels\n\n- Add specific error detection when quotes appear in unquoted labels\n- Replace misleading \"Unclosed bracket\" error with clear quote-specific message\n- Auto-fix correctly replaces quotes with HTML entities (&quot; or &apos;)\n- Add tes\n[…]\n the first error encountered.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: improve error handling for quotes in flowchart node labels (#33)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-06T19:41:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "08ebf20903c3910a0c3a2306c3ea545bf4244d75",
          "body": "* fix(flowchart): allow keywords in node labels\n\nFixed a parser issue where Mermaid keywords (end, subgraph, flowchart, etc.)\ninside node labels were incorrectly treated as syntax tokens instead of label text.\n\nThe lexer tokenizes these words as keywords with higher precedence than identifiers.\nWhen\n[…]\nto reflect the working state.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: support keywords and parentheses in flowchart node labels (#31)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-06T15:11:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7eaabd14dbe87abdf7bd1ef9dfc49003333d329b",
          "body": "…fix (#30)\n\n* fix: handle mixed single and double quotes in node labels during autofix\n\nThis fixes the autofix logic to correctly handle flowchart labels containing both single quotes (e.g., 'C') and double quotes (e.g., \"C\"). Previously, the autofix would mangle such diagrams by incorrectly detecti\n[…]\nixed-quotes-in-labels fixture\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: handle mixed single and double quotes in node labels during auto…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-06T11:47:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f0035051fdfd902d2fcc547dd44a5dffc36338a6",
          "body": "- Add clear error message when 'note' syntax is used in flowcharts\n  (notes are only valid in sequence diagrams)\n- Add detection and auto-fix for quoted edge labels to pipe syntax\n  -- \"Label\" --> becomes --|Label|-->\n- Update error messages to be more helpful and actionable\n- Bump version to 1.0.1\n\n[…]\n in flowchart diagrams, and using incorrect edge label\nsyntax (quotes instead of pipes).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: improve error messages and auto-fixes for flowchart diagrams (#29)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-06T07:54:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cad349b234df9cc0465115b3fb1d4aace6b6283b",
          "body": "* Add spec-gap features: flowchart click/linkStyle + top-level direction; sequence title/acc* + par over; state concurrency regions; compat-gaps + preview generator support; diagnostics guard for quotes; fixtures; regenerate previews\n\n* Spec parity round 2 wrap-up: align fixtures with CLI; typed-sha\n[…]\nckticks-in-label is a warning (parity); move fixture to valid; regen previews\n\n* fix(flowchart): improve FL-LINK-MISSING detection; skip 'direction' lines; pass autofix suite; regen flowchart previews",
          "is_bot": false,
          "headline": "feat/spec parity round1 (#28)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-05T14:43:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a07716f9eb359e72f3bcb5ba5aa97d7439c074c0",
          "body": "… only (#27)\n\n* feat(sequence): restrict box blocks to participant/actor declarations only\n\nFix parser to match Mermaid.js behavior where box blocks can only contain\nparticipant/actor declarations, not messages, notes, or other statements.\n\nChanges:\n- Parser: Modified boxBlock rule to only accept pa\n[…]\neviews have been regenerated.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sequence): restrict box blocks to participant/actor declarations…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-03T14:18:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "23c545664a6365e3bd243697d3f7073ba257ae08",
          "body": "…eviews (#26)\n\n* feat(renderer/sequence): add pluggable sequence renderer (builder+layout+SVG), theme support; wire into main renderer; enable previews; add test\n\n* feat(renderer/sequence): improve parity — lifeline dash, label pills, group title/branch pills; regenerate sequence previews\n\n* feat(re\n[…]\nto flowchart defaults; regenerate sequence previews\n\n* feat(sequence/layout): adjust lifeline top gap; expand blocks for title pill; dynamic note heights based on content; regenerate sequence previews",
          "is_bot": false,
          "headline": "feat(renderer/sequence): add pluggable sequence renderer, theming, pr…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-03T13:09:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "283feb83d47ad4aaa8bdef94be18d87755343a84",
          "body": "- Add createMermaidAPI() for drop-in Mermaid.js replacement\n- Create src/mermaid-compat.ts with compatible render() interface\n- Update browser bundle to export new API (~350KB)\n- Add checkbox to demo.html to toggle renderers\n- Move renderer checkbox to bottom before footer\n- Remove renderer badge te\n[…]\norker to point to browser-renderer-demo\n- Deploy to https://probelabs.com/maid/demo.html\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add browser renderer with Mermaid.js-compatible API (#25)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-03T09:15:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "42ea2788adbffd05a4276e16241cd7bbd2de14ea",
          "body": "… tests (#24)\n\n* renderer(pie): add pie chart renderer and preview integration\\n\\n- Pie model builder from pie CST\\n- SVG renderer for pie slices, labels, title, showData\\n- Enable pie in unified preview generator (two-column)\\n- Wire pie into MermaidRenderer.renderAny\\n- Build + validate pie previe\n[…]\ning and split cluster CSS; regenerate previews (flowchart/pie/sequence)\n\n* renderer(flowchart): make classDef/class/style win over defaults using inline style attrs; fix grouped shapes; regen previews",
          "is_bot": false,
          "headline": "feat(renderer/pie): frontmatter themeVariables + utils; leader lines;…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-03T06:35:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8951018375cf73975554abd4f0a6fa93247a67b",
          "body": "* feat(renderer): smooth edges, theme/markers, label pills; parser-driven parallelogram/trapezoid; subgraph nesting + cluster boxes; text wrapping tuning; previews regenerated\n\n* feat(renderer): basic HTML in labels (<br>, <b>/<i>/<u>); HTML-aware wrapping; cluster title layering; cluster-edge ancho\n[…]\nn't extend beyond boundaries.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Renderer parity: smoother edges, cluster boxes, shape parsing (#22)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-03T04:30:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "23e71998e39b6d7fb064516a0a85dfd85e0ddc09",
          "body": "- Add maid_info_illustration_white.png\n- Display illustration at the very top of README before title\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add Maid illustration to top of README (#21)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-01T16:59:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "140110fe370db4966f109c681389296814a65ef0",
          "body": "… when supported; regenerate all VALID/INVALID previews with timings\\n\\n- Add scripts/generate-previews.js (single entry)\\n- Remove legacy preview scripts\\n- package.json scripts use unified generator; ci:previews updated\\n- Valid pages show Mermaid+Maid only for supported types (flowchart)\\n- Invalid pages verify classification and auto-fix validity\\n- Regenerated all previews and added rendered SVGs\\n- Prints per-type and total generation timings (#20)",
          "is_bot": false,
          "headline": "feat(previews): unify into single generator, default to Maid renderer…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-01T15:16:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a2da8ee76c2e42fd7047856f4b55aee461c4943",
          "body": "…n autofix; tests+previews (#19)\n\n* fix(flowchart,sequence): align with Mermaid CLI for <br/> labels, escaped/double quotes, EOF newline; tighten link label chars; tests+previews regenerated\n\n* chore: ignore .tmp-* dirs; remove accidentally committed .tmp-issue18 assets\n\n* ci(previews): log elapsed time per preview generation (type + invalid)",
          "is_bot": false,
          "headline": "fix: Mermaid CLI parity (<br/>, quotes, EOF newline); prefer &quot; i…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-01T14:31:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7a251ffcb22b47560683677e8915aed43ef70d1",
          "body": "…tors, safe autofixes, tests) (#16)\n\n* feat(class,state): add first-class support for classDiagram and stateDiagram-v2\\n\\n- New validators: lexers/parsers/diagnostics for Class (CL-*) and State (ST-*)\\n- Router/types/index wired; SDK exports\\n- Fixtures (valid/invalid) + previews generation wired\\n-\n[…]\ngenerate\n\n* fix(package.json): resolve merge conflict markers; keep full preview scripts incl. class/state and renderer variant\n\n* fix(previews): unify preview script; default mermaid-only; regenerate",
          "is_bot": false,
          "headline": "feat(class,state): add classDiagram + stateDiagram-v2 support (valida…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-01T11:19:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e2baa34b87602970728c0060a6645cc766f45980",
          "body": "* feat: add lightweight Mermaid diagram renderer\n\n- Implement complete rendering pipeline using existing Chevrotain parser\n- Add GraphBuilder to transform CST into graph model\n- Create SVGGenerator for shape rendering (all Mermaid shapes supported)\n- Integrate dagre.js for automatic graph layout (14\n[…]\nbols ★☆♠\" (was \"★☆♠ Symbols\")\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add lightweight Mermaid renderer using Chevrotain + Dagre (#17)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-01T10:06:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a6c17a7e6fec901e76065a9784a2a0007557fc02",
          "body": "- Keep user's original diagram in input field, don't replace with auto-fixed version\n- Auto-fix only applies internally for validation and rendering\n- Update Cloudflare worker to latest deployment (f9f3677d.maid-cp6.pages.dev)\n- Better UX: users can see their original input alongside the fixed version\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: preserve original input in demo and update deployment",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-10-01T05:37:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9779c0f78281fd7ba19e19d5ef2e74db0eb7d6c1",
          "body": "- Remove \"No Progress on Core Issue\" and paywall references from README\n- Simplify validation gap explanation to be more factual\n- Move \"Why Maid Exists\" section before \"Supported Diagrams\" for better flow\n- Update hero button to link directly to interactive demo page\n- Use full URL for demo link to\n[…]\nctory routing\n- Update Cloudflare worker to new deployment (b62e7788.maid-cp6.pages.dev)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove negativity from README and update demo button",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T20:05:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b0749a888f42e2804cf8d024b7f0be15f10a98da",
          "body": "- Add comprehensive \"Why Maid Exists\" section to README explaining AI challenges\n- Update README to emphasize render guarantee and AI-first design\n- Enhance architecture section with modern parser details\n- Update website hero with render guarantee message\n- Add positive \"Why Maid Was Created\" secti\n[…]\nage from comparisons\n- Position Maid as making Mermaid more accessible, not replacing it\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: update Maid messaging for AI-first positioning",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T19:29:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a6370b25091842c3c97835a8af6f492b26b9dcb",
          "body": "…tics\n\n- Add Google Analytics tracking to index.html and demo.html\n- Restore comprehensive website design with all sections\n- Update fonts from Poppins/Inter to Space Grotesk/DM Sans\n- Add pink gradient background (#fef6f8) and hero background\n- Include complete sections: features, demo, getting sta\n[…]\nyout\n- Update Cloudflare worker to point to new deployment (4f8dd41c.maid-cp6.pages.dev)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: update Maid website with comprehensive content and Google Analy…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T19:14:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f7a9a75137e61d1bf496e4682d06933c6d83454a",
          "body": "* feat: add interactive browser demo for Maid\n\nAdd a fully functional browser demo that showcases Maid's auto-fix and validation capabilities directly in the browser.\n\nFeatures:\n- Auto-validation and auto-fixing with 1-second debounce\n- Side-by-side comparison: Standard Mermaid.js vs Maid\n- 2x2 grid\n[…]\n for the browser-demo branch.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add interactive browser demo for Maid (#15)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T18:23:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "61dbbf6f44aad1bd50a55bb0834777118fb0a33f",
          "body": "* feat: Update website design and content\n\n- Redesigned probe section with two-column layout\n- Moved logo to left with \"Explore Ecosystem\" button\n- Text aligned left in right column with hero section font styles\n- Renamed \"SDK Integration for AI Agents\" to \"SDK Integration\"\n- Replaced JavaScript SDK\n[…]\nxies to the latest deployment\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Website redesign and content updates (#14)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T17:02:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "68aaf6025a73daa580ed66b5017a354f66ab9c78",
          "body": "Adds the required id-token: write permission to the publish job to enable npm provenance generation. The --provenance flag requires this permission to create attestations that verify the package was built in GitHub Actions.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add id-token write permission for npm provenance (#13)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T16:32:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "83cfa7a4ee0d81180c5a002c58cf7a215d2d56c4",
          "body": "…ase (#12)\n\nThe release workflow was failing because it expected the package.json version\nto match the git tag version. Instead of manually keeping them in sync, the\nworkflow now dynamically updates package.json from the tag before building.\n\nThis allows package.json to remain at any version in the \n[…]\nhile ensuring\nthe published npm package always has the correct version from the git tag.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: dynamically update package.json version from git tag during rele…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T16:16:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "31336e36f3c811aab400649a61041e4e81be7f6a",
          "body": "* feat: add Model Context Protocol (MCP) server support\n\nAdd MCP server implementation with stdio transport for AI assistant integration.\nUsers can now run 'maid mcp' to start an MCP server that exposes mermaid\nvalidation and fixing capabilities.\n\nFeatures:\n- validate_mermaid: Validate diagrams and \n[…]\nonly want validation results.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Model Context Protocol (MCP) server support (#11)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T16:07:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "59a3731b78161cbdc1bf53a1dbb51d4169489474",
          "body": "* feat(sdk): add programmatic API (ESM), index.ts exports, types; update package exports; README SDK examples; add SDK smoke test in CI\n\n* chore: remove out-cjs artifacts (ESM-only SDK)\n\n* chore: ignore out-cjs/\n\n* docs: add SDK usage guide and cross-link from README\n\n* feat(router): treat unsupport\n[…]\n; add tests and docs\n\n* docs(README): add SDK Quick Example section and link to full SDK guide\n\n* docs(README): keep only SDK quick example near top; move detailed guidance deeper via docs/SDK.md link",
          "is_bot": false,
          "headline": "feat(sdk): programmatic API, types, and ESM exports (#10)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T15:05:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "73f87f708b1f71f962110e304973c6a2155d784e",
          "body": "…afe; complex brackets; slash/backslash shapes] (#9)\n\n* feat(cli,core): add autofix engine and --fix/--fix=all\\n\\n- CLI: --fix, --fix=all, --dry-run, --print-fixed; directory + markdown support\\n- Core: edits + fixes engines; apply Safe and All fix levels\\n- Diagnostics: mapping tweaks (PI-LABEL-REQ\n[…]\nlace colon correctly for SE-MSG-COLON-MISSING and SE-NOTE-MALFORMED; tests passing; parity green; regenerate previews\n\n* docs(previews): update sequence INVALID_DIAGRAMS after improved colon autofixes",
          "is_bot": false,
          "headline": "feat: autofix (--fix/--fix=all) + fixes engine + tests [wrap+encode s…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T14:15:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ea6fd946879b66a9b8a4f18a079c43bb2b85b29b",
          "body": null,
          "is_bot": false,
          "headline": "Rename package to @probelabs/maid",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T09:03:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5950133a213b03f96e72bfcfb1dbf2616f93010b",
          "body": "…, and no-diagrams-as-success (#8)\n\n* feat(cli): Markdown multi-diagram + directory scan\\n\\n- Extract mermaid code fences from Markdown; offset errors to file lines\\n- Directory mode: recursive scan via globby; --include/-I, --exclude/-E, --no-gitignore\\n- Keep stdin/single-file behavior; accurate s\n[…]\nesting/CI\n\n* docs(README): add GitHub Actions examples for full-tree lint and PR-changed files\n\n* docs(README): improve pre-commit hook to scan Markdown for mermaid fences in addition to .mmd/.mermaid",
          "is_bot": false,
          "headline": "feat(cli): Markdown multi-diagram + directory scan, globs, .gitignore…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T09:02:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f6b9530e7b5cb08628aebcf6970df45e8d57eeee",
          "body": "… (#7)\n\n* feat(sequence): add sequenceDiagram support (lexer+parser+diagnostics), fixtures, previews, docs; wire scripts and router\n\n* chore(previews): strip ANSI colors from our linter output in invalid previews\n\n* feat(cli): switch human output to simple caret snippets (no borders); regenerate inv\n[…]\n\\n- scripts/previews and generated markdown: display 'maid'\\n- tests remain green\n\n* docs/tests: clarify baseline vs comparison; update README and test harness comments; keep CI step naming consistent",
          "is_bot": false,
          "headline": "feat(sequence): add sequenceDiagram support, fixtures, previews, docs…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-30T08:10:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "be683864e4ababe8387415cd1d45ecbfebf7aefd",
          "body": "DX: clearer errors, new human output, strict mode, shared pipeline",
          "is_bot": false,
          "headline": "Merge pull request #6 from probelabs/feat/dx-error-messages-pipeline",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T19:54:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93bc84260a45e340db990e8bc2dfecf5939768bf",
          "body": "… format and new rules",
          "is_bot": false,
          "headline": "chore(previews): regenerate invalid/valid previews to match new human…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T19:52:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c43db511a4f1c91e1cc2926d3592f6fa89aa8ab",
          "body": "… map quotes-in-unquoted labels [FL-LABEL-QUOTE-IN-UNQUOTED]; add warning for parens in unquoted labels; add invalid fixture; regen previews",
          "is_bot": false,
          "headline": "feat(flowchart): allow semicolon terminators; allow -- inside labels;…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T19:45:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff30843df837e0bf1b31b21127fb0f7a4a21bf52",
          "body": "…rmat; keep --format rust as alias; update README",
          "is_bot": false,
          "headline": "feat(cli): make caret-underlined snippet style the default 'human' fo…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T19:40:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e937d5648240b1c3052f6bb426810735549ed634",
          "body": "…; add lengths in diagnostics; improve escaped-quote span; rebuild",
          "is_bot": false,
          "headline": "feat(cli): add --format=rust (Rust-like diagnostics with caret spans)…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T19:39:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa88cfc057aaeafadd43ecf835abcd532677849b",
          "body": null,
          "is_bot": false,
          "headline": "docs: add tip on using &quot; for quotes inside labels",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T19:34:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc2625f3260b3463578a7dbf57e031975d9d06d6",
          "body": "…-quote suggestion; regenerate previews",
          "is_bot": false,
          "headline": "docs/messages: fix quote examples and hints; remove misleading single…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T18:52:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "544e4c263a5b26707ca938169afd7d1640f3d181",
          "body": "…mat=json; docs + previews updated",
          "is_bot": false,
          "headline": "DX: actionable error messages, codeframes, shared pipeline; CLI --for…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T18:41:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d965e241c9b88d8589165c4ba5bc1487d67cfa7",
          "body": "fix(pie): fixtures aligned with docs; detect mermaid-cli error SVGs; support  + inline title",
          "is_bot": false,
          "headline": "Merge pull request #5 from probelabs/fix/pie-fixtures-and-preview-errors",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T18:00:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "763584947f7f35a5b12077290ee718bbab823f92",
          "body": "…kenTypeIdx); regenerate previews",
          "is_bot": false,
          "headline": "ci(previews): stop printing raw Chevrotain parser errors (unstable to…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T17:41:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ecd70f3b2fdf863acdcde19faafb149b36a6a99",
          "body": "…xtra token; parse as Identifier + Direction; keep tests green",
          "is_bot": false,
          "headline": "feat(flowchart): support 'direction <dir>' inside subgraphs without e…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T17:37:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "830a16014b51db5edea72052b5fc700f45a94b1f",
          "body": "…ammar minimal to avoid alt conflicts",
          "is_bot": false,
          "headline": "fix(flowchart): allow  inside subgraphs via DirectionKeyword; keep gr…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T17:35:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdf27732ccc9b54efd950f46979ab8d01ee065dd",
          "body": "…quotes-in-decision; support  inside subgraphs; regenerate previews",
          "is_bot": false,
          "headline": "feat(flowchart): add valid custom-auth subgraph; add invalid escaped-…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T17:31:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea53ec10ad138e7ef5c62fca8992e277ed3585dc",
          "body": null,
          "is_bot": false,
          "headline": "ci(previews): strip Node internal stack frames from captured errors",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T17:13:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d832972671bc64ad397afebe5837355fdef6369c",
          "body": "…egenerate",
          "is_bot": false,
          "headline": "ci(previews): remove commit/time footer for deterministic previews; r…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T17:08:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "765cbd1a0315a25cac61cde97d8c522d35308211",
          "body": "…te previews",
          "is_bot": false,
          "headline": "ci(previews): sanitize linter output paths to repo-relative; regenera…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T17:05:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c12aaf417cb2180e95e6f5e99b5b1b7e4d9f14eb",
          "body": "…; regenerate",
          "is_bot": false,
          "headline": "ci(previews): use relative paths in linter output for stable previews…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T17:01:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c26c1c2d04fee35d677bb0e2d8ef3b68ffa0911",
          "body": "…table diffs; regenerate previews",
          "is_bot": false,
          "headline": "ci(previews): normalize mermaid-cli stack paths to node_modules for s…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T16:57:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0131ce1ef3aa5c28e3094585ae89560c01650caa",
          "body": "…r mmdc; regenerate previews",
          "is_bot": false,
          "headline": "ci(previews): stable footers (commit-based) + Puppeteer no-sandbox fo…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T16:54:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5790f5c685d4667d74a4d3a7caa73ff37b6ae9b",
          "body": "…reviews",
          "is_bot": false,
          "headline": "feat(pie): support  header + inline title; add fixtures; regenerate p…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T15:24:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b285134ba6370687e67edba08d405d66623a6ce",
          "body": null,
          "is_bot": false,
          "headline": "docs(readme): add Diagram Type Coverage matrix (Mermaid vs our support)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T15:21:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a39d6b04ba38c6f3782731a0291e5aad971398cd",
          "body": null,
          "is_bot": false,
          "headline": "docs: update README for pie semantics, counts, and error-SVG detection",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T15:17:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "630c99ab563920d50a42e364c2a130d976566eeb",
          "body": "…detect mermaid-cli error SVGs in previews; regenerate pie previews",
          "is_bot": false,
          "headline": "fix(pie): correct fixtures, enforce quoted labels + required values; …",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T15:17:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12e68d0f7ab7cc001741e345c43a2a2316c9ccde",
          "body": "CI: Previews up-to-date check",
          "is_bot": false,
          "headline": "Merge pull request #4 from probelabs/feat/ci-previews",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T14:58:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd91513c62ed44a237c5b2fd8f7af7d114e92338",
          "body": "…codes\n\nModular router + Pie support + CST semantics + error codes + enriched invalid preview",
          "is_bot": false,
          "headline": "Merge pull request #2 from probelabs/feat/router-pie-semantics-error-…",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T14:58:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7bd9aea0b73a3763087e16262868730ff644e0db",
          "body": null,
          "is_bot": false,
          "headline": "ci: add previews check workflow and npm script (ci:previews)",
          "author_name": "Leonid Bugaev",
          "author_login": "buger",
          "committed_at": "2025-09-29T14:57:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 29,
      "commits_last_year": 128,
      "latest_release_at": "2026-03-18T18:51:22Z",
      "latest_release_tag": "v0.0.29",
      "releases_from_tags": false,
      "days_since_last_push": 89,
      "active_weeks_last_year": 15,
      "days_since_latest_release": 135,
      "mean_days_between_releases": 16.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@probelabs/maid",
          "exists": true,
          "license": "ISC",
          "keywords": [
            "mermaid",
            "linter",
            "cli",
            "docs",
            "markdown",
            "diagram"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@probelabs/maid",
          "is_deprecated": false,
          "latest_version": "0.0.29",
          "repository_url": "https://github.com/probelabs/maid",
          "versions_count": 26,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 79236,
          "first_published_at": "2025-09-30T16:33:49.728000Z",
          "latest_published_at": "2026-03-18T18:52:40.442000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 135
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 27,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-04-03",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": null,
      "open_issues_and_prs": 4
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/maid-mcp/tsconfig.json",
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 448582,
      "source_files_sampled": 94,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 7040
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "lodash-es",
            "direct": false,
            "version": "4.17.23",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 8.1,
            "advisory_ids": [
              "GHSA-f23m-r3pf-42rh",
              "GHSA-r5fr-rjxr-66jc"
            ],
            "fixed_version": "4.18.0",
            "advisory_count": 2,
            "oldest_advisory_days": 121
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 1
        },
        "advisory_count": 2,
        "affected_count": 1,
        "assessed_count": 35,
        "malicious_count": 0,
        "assessed_package": "npm:@probelabs/maid@0.0.29",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@types/dagre",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.53"
        },
        {
          "name": "chevrotain",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^11.0.3"
        },
        {
          "name": "dagre",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.8.5"
        },
        {
          "name": "globby",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^14.0.2"
        }
      ],
      "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": 65,
        "open_issues": 4,
        "closed_ratio": 0.556,
        "closed_issues": 5,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "buger",
          "commits": 127,
          "avatar_url": "https://avatars.githubusercontent.com/u/14009?v=4"
        },
        {
          "type": "User",
          "login": "michael-denyer",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/97485362?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.992
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": false,
      "ci_workflows": [
        "ci-previews.yml",
        "release.yml",
        "test.yml",
        "visor.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "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": 9,
            "reason": "22 out of 23 merged PRs checked by a CI test -- score normalized to 9",
            "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 1/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "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": 1,
            "reason": "2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1",
            "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": 3,
            "reason": "dependency not pinned by hash detected -- score normalized to 3",
            "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": "47 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "c30a4ec4fa77655ef6c89618480c864655bd0e54",
        "ran_at": "2026-08-01T17:02:35Z",
        "aggregate_score": 3.2,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-05-24T22:42:12Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-05-04T11:48:19Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 72,
          "created_at": "2026-04-03T22:43:59Z",
          "last_comment_at": "2026-05-05T05:37:55Z",
          "last_comment_author": "buger"
        },
        {
          "number": 76,
          "created_at": "2026-05-08T09:34:59Z",
          "last_comment_at": "2026-05-08T11:12:11Z",
          "last_comment_author": "pfarikrispy"
        },
        {
          "number": 77,
          "created_at": "2026-05-15T08:23:34Z",
          "last_comment_at": "2026-05-15T08:26:20Z",
          "last_comment_author": "Bengt"
        },
        {
          "number": 78,
          "created_at": "2026-05-24T22:40:55Z",
          "last_comment_at": "2026-05-24T22:41:59Z",
          "last_comment_author": "probelabs"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/probelabs/maid",
    "host": "github.com",
    "name": "maid",
    "owner": "probelabs"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": "The weighted overall 54 is calibrated to 56 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 54,
            "calibrated": 56,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 56,
      "inputs": {
        "security": 41,
        "vitality": 64,
        "community": 47,
        "governance": 53,
        "calibration": "2026-08-02",
        "engineering": 61,
        "ai_readiness": 60,
        "weighted_overall_raw": 54
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 64,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "weak",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 47,
            "inputs": {
              "commits_last_year": 128,
              "human_commit_share": 1,
              "days_since_last_push": 89,
              "active_weeks_last_year": 15
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 89 days ago",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 89
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "15/52 weeks with commits",
                "points": 10.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "128 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 128
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1",
                "points": 1,
                "status": "partial",
                "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": 29,
              "latest_release_tag": "v0.0.29",
              "releases_from_tags": false,
              "days_since_latest_release": 135,
              "mean_days_between_releases": 16.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "29 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 29
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 135 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 135
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~16.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 16.3
                    }
                  }
                ],
                "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": 92,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 92 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 92
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "weak",
        "name": "Community & Adoption",
        "value": 47,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 23,
            "inputs": {
              "forks": 1,
              "stars": 27,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "27 stars",
                "points": 23,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 27
                    }
                  }
                ],
                "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": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (ISC)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "ISC"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "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": 82,
            "inputs": {
              "packages": [
                "@probelabs/maid"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 79236
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "79,236 downloads/month across npm",
                "points": 65.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 79236,
                      "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": 53,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 18,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.992
            },
            "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 99% of commits",
                "points": 0.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "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": 59,
            "inputs": {
              "merged_prs": 65,
              "open_issues": 4,
              "closed_issues": 5,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 0.556,
              "closed_unmerged_prs": 4,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "56% of issues closed",
                "points": 23.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 56
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "65/69 decided PRs merged",
                "points": 28.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 65,
                      "decided": 69
                    }
                  }
                ],
                "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 1/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "followers": 18,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "probelabs",
              "public_repos": 27,
              "account_age_days": 351
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "18 followers of probelabs",
                "points": 9.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 18,
                      "login": "probelabs"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "27 public repos, account ~0 yr old",
                "points": 12.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 27
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@probelabs/maid"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 135
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 135 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 135
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "26 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 61,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "weak",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 42,
            "inputs": {
              "has_ci": true,
              "has_tests": false,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "22 out of 23 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://probelabs.com/maid",
              "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://probelabs.com/maid",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "weak",
        "name": "Security",
        "value": 41,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "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": 32,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.2
            },
            "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": "22 out of 23 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "status": "partial",
                "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 1/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "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": "2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1",
                "points": 0.8,
                "status": "partial",
                "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 3",
                "points": 1.5,
                "status": "partial",
                "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": "47 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:@probelabs/maid@0.0.29 runtime dependency closure — what installing the published package pulls in — 35 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:@probelabs/maid@0.0.29",
                  "assessed": 35
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 77,
            "inputs": {
              "source": "osv",
              "advisories": 2,
              "affected_packages": 1,
              "assessed_packages": 35,
              "unassessed_packages": 0,
              "affected_by_severity": "high 1",
              "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": "1 affected: lodash-es 4.17.23 (high 8.1)",
                "points": 8.8,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 1,
                      "packages": "lodash-es 4.17.23 (high 8.1)"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "1 advisory-carrying package(s) unaddressed past 90 days; oldest published 121 days ago",
                "points": 33.3,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_stale",
                    "params": {
                      "days": 90,
                      "count": 1,
                      "oldest": 121
                    }
                  }
                ],
                "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": 35,
              "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
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "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": "moderate",
        "name": "AI Readiness",
        "value": 60,
        "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": 0.94,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 7040
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "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": "94 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 94,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 34,
            "inputs": {
              "has_nix": false,
              "has_tests": false,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "packages/maid-mcp/tsconfig.json",
                "tsconfig.json"
              ],
              "agent_commit_share": 0.24,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/maid-mcp/tsconfig.json, tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/maid-mcp/tsconfig.json, 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": "24 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 24,
                      "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 3",
                "points": 3,
                "status": "partial",
                "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": 448582,
              "source_files_sampled": 94,
              "oversized_source_files": 2
            },
            "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": "2/94 source files over 60KB",
                "points": 53.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 94,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library",
        "application"
      ],
      "labels": [
        "cli",
        "library"
      ],
      "scores": {
        "cli": 6,
        "library": 6
      },
      "primary": "cli",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:npm",
          "weight": 6
        },
        {
          "tier": "description",
          "label": "cli",
          "source": "description:tool",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "cli",
          "source": "tag:cli",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "cli",
          "source": "tag:linter",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-01T17:02:50.793081Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/p/probelabs/maid.svg",
  "full_name": "probelabs/maid",
  "license_state": "standard",
  "license_spdx": "ISC"
}

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

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

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistikennpm.