公开记录
软件健康报告模式 0.30.0 · 指标 2.3.1 · 2026-08-03 02:40 UTC

skovtun / coherent-design-method

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

TypeScriptMIT★ 22 星标⑂ 1 复刻始于 2026年1月在 GitHub 上查看 ↗
类型命令行工具MCP 服务器如何判定

skovtun/coherent-design-method 的健康指数为 100 分中的 75 分,处于「良好」区间。 其得分最高的类别是Engineering Quality(90/100),最低的是Security(49/100)。 最近一次更新在 10 天前。 近期的大部分工作由 1 位贡献者完成。

75
总分 / 100
良好

软件健康指数

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

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

评分画像

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

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

所有权

Sergei Kovtun个人账户
7 关注者2 个公开仓库始于 2019年10月

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@getcoherent/cli0.26.05,35024510 天前design-systemclifrontendaicode-generationnextjsreactcoherent
npm@getcoherent/core0.26.05,66924410 天前design-systemfrontendaicode-generationcoherent

按类别列示的指标

活力

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

76良好 · 占总体的 21%
评分方式
28.8/36推送新近度 — 最近一次推送于 10 天前
9/36提交节奏 — 52 周中有 13 周有提交
18/18提交量 — 最近一年 693 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year693
human_commit_share1
days_since_last_push10
active_weeks_last_year13

发布纪律

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

社区与采用

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

50中等 · 占总体的 17%

流行度与采用

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

社区健康

70良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
readme_badges4
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_servicesshields.io
has_pull_request_template
评分方式
53.9/80月度下载量 — npm 合计每月 11,019 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@getcoherent/cli, @getcoherent/core
dependents
ecosystemsnpm
total_downloads
monthly_downloads11,019
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

54中等 · 占总体的 23%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
42/42议题解决 — 100% 的议题已关闭
29.6/30PR 接受 — 已裁定的 PR 中 148/150 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs148
open_issues0
closed_issues3
prs_merged_7d0
prs_decided_7d0
prs_merged_30d41
prs_decided_30d41
issue_closed_ratio1
closed_unmerged_prs2
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
6.5/25所有者影响力 — skovtun 有 7 位关注者
15.5/25既往记录 — 2 个公开仓库,账户约 6 年
所用输入
followers7
owner_typeUser
is_verified
owner_loginskovtun
public_repos2
account_age_days2,485
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 2 个软件包
35/35发布时效 — 最近一次发布于 10 天前
20/20版本历史 — 245 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@getcoherent/cli, @getcoherent/core
ecosystemsnpm
any_deprecated
min_days_since_publish10

工程质量

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

90优秀 · 占总体的 19%

工程实践

84优秀
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
16/16Linter 配置 — eslint.config.js
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 26 out of 26 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

100卓越
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://getcoherent.design
10/10仓库描述
10/10主题标签 — 10 个主题标签
10/10Wiki
所用输入
topicsai, cli, code-generation, code-generator, design-system, design-systems, nextjs, react, shadcn-ui, tailwindcss
has_wiki
homepagehttps://getcoherent.design
has_readme
has_docs_dir
has_description

安全

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

49薄弱 · 占总体的 16%

安全态势

36薄弱
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 26 out of 26 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 23 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3.6
已排除计分(无数据或不适用):signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
25/25间接依赖不含已知公告 — 没有间接依赖携带已知公告
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages162
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):没有长期未处理的公告。 其余权重已重新归一化。 比对的是 npm:@getcoherent/cli@0.26.0 的运行时依赖闭包——安装已发布的软件包时真正被拉取进来的内容——共 162 个软件包。 未对可达性进行分析。

AI 就绪度

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

69良好 · 占总体的 4%
评分方式
45/45代理指令 — .cursor/rules/safe-file-transforms.mdc, AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_files.cursor/rules/safe-file-transforms.mdc, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes15,048
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — eslint.config.js
11/11静态类型检查 — packages/cli/tsconfig.json, packages/core/tsconfig.json
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 87 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilespnpm-lock.yaml
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configspackages/cli/tsconfig.json, packages/core/tsconfig.json
agent_commit_share0.87
toolchain_manifests
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
54.4/55可控的文件大小 — 采样的 456 个源文件中有 5 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes125,127
source_files_sampled456
oversized_source_files5

机器可读接口

20存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
20/20MCP 服务器
0/40可运行示例
所用输入
example_dirs
has_mcp_signal
api_schema_files

关键数据

22GitHub 星标
1贡献者
693最近 12 个月提交数
10距最近推送天数
37发布版本数
1巴士系数(bus factor)
0开放议题
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.6 / 10
3.6综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-08-03 02:39 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests26 out of 26 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities23 existing vulnerabilities detected
直接依赖 12
注册表软件包版本约束清单文件
npm@anthropic-ai/sdk^0.32.0packages/cli/package.json
npm@getcoherent/coreworkspace:*packages/cli/package.json
npm@modelcontextprotocol/sdk^1.29.0packages/cli/package.json
npmchalk^5.3.0packages/cli/package.json
npmchokidar^4.0.1packages/cli/package.json
npmcommander^11.1.0packages/cli/package.json
npmdotenv^16.4.5packages/cli/package.json
npmopen^10.1.0packages/cli/package.json
npmora^7.0.1packages/cli/package.json
npmprompts^2.4.2packages/cli/package.json
npmzod^3.22.4packages/cli/package.json
npmzod^3.22.4packages/core/package.json
全部依赖 未采集

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

依赖安全公告 0

安装 npm:@getcoherent/cli@0.26.0 会引入 162 个包(直接与传递):其中 0 个存在已知公告,0 个为直接依赖。

没有已知公告影响已评估的依赖。

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

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

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

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

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