Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 1 forkdesde sept 2025Ver en GitHub ↗
TipoHerramienta de línea de comandosBibliotecacómo se determina

probelabs/maid tiene un índice de salud de 56 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (64/100) y la más baja, Security (41/100). Se actualizó por última vez hace 89 días. Una sola persona concentra la mayor parte del trabajo reciente.

56
global / 100
Moderado

Índice de salud del software

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

56
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

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

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

Titularidad

ProbeOrganización
18 seguidores27 repositorios públicosdesde ago 2025

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@probelabs/maid0.0.2979.23626hace 135 díasmermaidlinterclidocsmarkdowndiagram

Métricas por categoría

Vitalidad

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

64Moderado · 21% del índice global
Cómo se puntúa
18/36Recencia de push — último push hace 89 días
10.4/36Cadencia de commits — 15/52 semanas con commits
18/18Volumen de commits — 128 commits en el último año
1/10OpenSSF Scorecard: Maintained — 2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1
Datos de entrada utilizados
commits_last_year128
human_commit_share1
days_since_last_push89
active_weeks_last_year15
Cómo se puntúa
27/27Publica versiones — 29 versiones publicadas
27/36Recencia de las versiones — última versión hace 135 días
27/27Cadencia de publicación — una versión cada ~16,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count29
latest_release_tagv0.0.29
releases_from_tagsno
days_since_latest_release135
mean_days_between_releases16,3
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

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

47Débil · 17% del índice global
Cómo se puntúa
23/60Estrellas — 27 estrellas
0/25Forks — 1 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks1
stars27
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (ISC)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
readme_badges
has_contributingno
has_issue_templateno
has_code_of_conductno
readme_badge_services
has_pull_request_templateno
Cómo se puntúa
65.3/80Descargas mensuales — 79.236 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@probelabs/maid
dependents
ecosystemsnpm
total_downloads
monthly_downloads79.236
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

53Moderado · 23% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.2/22.5Distribución de commits — el principal contribuyente firma el 99% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,992
Cómo se puntúa
23.4/42Resolución de issues — 56% de issues cerradas
28.3/30Aceptación de PR — 65/69 PR decididos fusionados
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
0/15OpenSSF Scorecard: Code-Review — Found 1/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
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
Excluidos de la puntuación (sin datos o no aplicable): newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
9.2/25Alcance del propietario — 18 seguidores de probelabs
12.5/25Trayectoria — 27 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers18
owner_typeOrganization
is_verified
owner_loginprobelabs
public_repos27
account_age_days351
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 135 días
20/20Historial de versiones — 26 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@probelabs/maid
ecosystemsnpm
any_deprecatedno
min_days_since_publish135

Calidad de Ingeniería

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

61Moderado · 19% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 4 flujo(s) de trabajo
0/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
18/20OpenSSF Scorecard: CI-Tests — 22 out of 23 merged PRs checked by a CI test -- score normalized to 9
Datos de entrada utilizados
has_ci
has_testsno
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://probelabs.com/maid
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepagehttps://probelabs.com/maid
has_readme
has_docs_dir
has_description

Seguridad

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

41Débil · 16% del índice global
Cómo se puntúa
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.5Licencia — 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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 47 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,2
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
8.8/25Dependencias indirectas libres de avisos conocidos — 1 afectados: lodash-es 4.17.23 (high 8.1)
33.3/40Sin avisos pendientes — 1 paquete(s) con avisos sin atender más allá de 90 días; el más antiguo publicado hace 121 días
Datos de entrada utilizados
sourceosv
advisories2
affected_packages1
assessed_packages35
unassessed_packages0
affected_by_severityhigh 1
direct_affected_packages0
Se cotejó el cierre de dependencias en tiempo de ejecución de npm:@probelabs/maid@0.0.29 —lo que arrastra la instalación del paquete publicado—: 35 paquetes. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

60Moderado · 4% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 94 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,94
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7040
Cómo se puntúa
0/18Arranque con un solo comando
0/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — packages/maid-mcp/tsconfig.json, tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 24 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Datos de entrada utilizados
has_nixno
has_testsno
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configspackages/maid-mcp/tsconfig.json, tsconfig.json
agent_commit_share0,24
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
53.8/55Tamaños de archivo manejables — 2/94 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes448.582
source_files_sampled94
oversized_source_files2
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

27estrellas de GitHub
2contribuidores
128commits en los últimos 12 meses
89días desde el último push
29versiones publicadas
1factor bus
4issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 3.2 / 10
3.2agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-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
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities47 existing vulnerabilities detected
Dependencias directas 4
RegistroPaqueteRestricción de versiónManifiesto
npm@types/dagre^0.7.53package.json
npmchevrotain^11.0.3package.json
npmdagre^0.8.5package.json
npmglobby^14.0.2package.json
Todas las dependencias no recopilado

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

Avisos de dependencias 1

Instalar npm:@probelabs/maid@0.0.29 arrastra 35 paquetes, directos y transitivos: 1 tienen avisos conocidos, de los cuales 0 son dependencias directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
lodash-es4.17.23indirectaalta24.18.0

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

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

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

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

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