公开记录
软件健康报告模式 0.27.0 · 指标 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 星标⑂ 1 复刻始于 2025年9月在 GitHub 上查看 ↗
类型命令行工具如何判定

probelabs/maid 的健康指数为 100 分中的 56 分,处于「中等」区间。 其得分最高的类别是Vitality(64/100),最低的是Security(41/100)。 最近一次更新在 89 天前。 近期的大部分工作由 1 位贡献者完成。

56
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

56
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

加权总体分 54 经校准后在公布的指数量表上为 56(记录校准 2026-08-02)。

所有权

Probe组织
18 关注者27 个公开仓库始于 2025年8月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@probelabs/maid0.0.2979,23626135 天前mermaidlinterclidocsmarkdowndiagram

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

64中等 · 占总体的 21%
评分方式
18/36推送新近度 — 最近一次推送于 89 天前
10.4/36提交节奏 — 52 周中有 15 周有提交
18/18提交量 — 最近一年 128 次提交
1/10OpenSSF Scorecard:Maintained — 2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1
所用输入
commits_last_year128
human_commit_share1
days_since_last_push89
active_weeks_last_year15

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 29 个发布版本
27/36发布时效 — 最近一次发布版本于 135 天前
27/27发布节奏 — 约每 16.3 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count29
latest_release_tagv0.0.29
releases_from_tags
days_since_latest_release135
mean_days_between_releases16.3
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

47薄弱 · 占总体的 17%

流行度与采用

23存在风险
评分方式
23/60星标 — 27 个星标
0/25复刻 — 1 个复刻
0/15关注者 — 0 位关注者
所用输入
forks1
stars27
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(ISC)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
readme_badges
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_services
has_pull_request_template
评分方式
65.3/80月度下载量 — npm 合计每月 79,236 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@probelabs/maid
dependents
ecosystemsnpm
total_downloads
monthly_downloads79,236
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

53中等 · 占总体的 23%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.2/22.5提交分布 — 头号贡献者编写了 99% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
6/10OpenSSF Scorecard:Contributors — project has 2 contributing companies or organizations -- score normalized to 6
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.992
评分方式
23.4/42议题解决 — 56% 的议题已关闭
28.3/30PR 接受 — 已裁定的 PR 中 65/69 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
0/15OpenSSF Scorecard:Code-Review — Found 1/30 approved changesets -- score normalized to 0
所用输入
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
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
9.2/25所有者影响力 — probelabs 有 18 位关注者
12.5/25既往记录 — 27 个公开仓库,账户约 0 年
所用输入
followers18
owner_typeOrganization
is_verified
owner_loginprobelabs
public_repos27
account_age_days351
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 135 天前
20/20版本历史 — 26 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@probelabs/maid
ecosystemsnpm
any_deprecated
min_days_since_publish135

工程质量

基础的工程与文档实践是否到位?

61中等 · 占总体的 19%

工程实践

42薄弱
评分方式
24/24CI 工作流 — 4 个工作流
0/24存在测试
0/16Linter 配置
0/9.6Pre-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
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://probelabs.com/maid
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepagehttps://probelabs.com/maid
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

41薄弱 · 占总体的 16%

安全态势

32存在风险
评分方式
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.5许可证 — 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 — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 47 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3.2
已排除计分(无数据或不适用):signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
8.8/25间接依赖不含已知公告 — 1 个受影响:lodash-es 4.17.23 (high 8.1)
33.3/40没有长期未处理的公告 — 1 个携带公告的软件包超过 90 天未处理;最早一条发布于 121 天前
所用输入
sourceosv
advisories2
affected_packages1
assessed_packages35
unassessed_packages0
affected_by_severityhigh 1
direct_affected_packages0
比对的是 npm:@probelabs/maid@0.0.29 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 35 个软件包。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

60中等 · 占总体的 4%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 94 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.94
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7,040
评分方式
0/18一条命令的引导启动
0/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — packages/maid-mcp/tsconfig.json, tsconfig.json
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 24 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
3/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
所用输入
has_nix
has_tests
lockfilespackage-lock.json
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configspackages/maid-mcp/tsconfig.json, tsconfig.json
agent_commit_share0.24
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
53.8/55可控的文件大小 — 采样的 94 个源文件中有 2 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes448,582
source_files_sampled94
oversized_source_files2
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

27GitHub 星标
2贡献者
128最近 12 个月提交数
89距最近推送天数
29发布版本数
1巴士系数(bus factor)
4开放议题
npm软件包生态系统数

数据采集警告

  • 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

更多细节

OpenSSF Scorecard 3.2 / 10
3.2综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。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
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities47 existing vulnerabilities detected
直接依赖 4
注册表软件包版本约束清单文件
npm@types/dagre^0.7.53package.json
npmchevrotain^11.0.3package.json
npmdagre^0.8.5package.json
npmglobby^14.0.2package.json
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

依赖安全公告 1

安装 npm:@probelabs/maid@0.0.29 会引入 35 个包(直接与传递):其中 1 个存在已知公告,0 个为直接依赖。

软件包版本关系严重程度公告数修复版本
lodash-es4.17.23间接24.18.0

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "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"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v2.5.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.