公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-23 18:10 UTC

ludo-technologies / polyscan

Multi-language code quality analysis — shared core algorithms (APTED, LSH, CFG, clone detection) and language scanners

GoMIT★ 0 星标⑂ 1 复刻始于 2026年2月在 GitHub 上查看 ↗

ludo-technologies/polyscan 的健康指数为 100 分中的 59 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(75/100),最低的是Community & Adoption(40/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

59
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

59
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

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

所有权

9 关注者8 个公开仓库始于 2025年8月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/ludo-technologies/polyscan/corev0.2.1-25 天前
Gogithub.com/ludo-technologies/polyscanv0.1.1-2158 天前

按类别列示的指标

活力

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

74良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
8.3/36提交节奏 — 52 周中有 12 周有提交
18/18提交量 — 最近一年 117 次提交
10/10OpenSSF Scorecard:Maintained — 29 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year117
human_commit_share1
days_since_last_push0
active_weeks_last_year12

发布纪律

78良好
评分方式
16.2/27有发布版本 — 2 个版本标签(无 GitHub 发布版本)
27/36发布时效 — 最近一次发布版本于 158 天前
27/27发布节奏 — 约每 0.7 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count2
latest_release_tagv0.1.1
releases_from_tags
days_since_latest_release158
mean_days_between_releases0.7
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

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

40存在风险 · 占总体的 18%
评分方式
0/60星标 — 0 个星标
0/25复刻 — 1 个复刻
0/15关注者 — 0 位关注者
所用输入
forks1
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

85优秀
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
13.5/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

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

52中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
33.4/46.8议题解决 — 71% 的议题已关闭
38.2/38.3PR 接受 — 已裁定的 PR 中 13/13 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs13
open_issues2
closed_issues5
issue_closed_ratio0.714
closed_unmerged_prs0
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
7.2/25所有者影响力 — ludo-technologies 有 9 位关注者
8.9/25既往记录 — 8 个公开仓库,账户约 0 年
所用输入
followers9
owner_typeOrganization
is_verified
owner_loginludo-technologies
public_repos8
account_age_days351
评分方式
25/25已发布且可解析 — go 上有 2 个软件包
35/35发布时效 — 最近一次发布于 5 天前
12/20版本历史 — 2 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/ludo-technologies/polyscan/core, github.com/ludo-technologies/polyscan
ecosystemsgo
any_deprecated
min_days_since_publish5

工程质量

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

75良好 · 占总体的 20%

工程实践

82良好
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml
0/9.6Pre-commit 钩子
0/6.4.editorconfig
18/20OpenSSF Scorecard:CI-Tests — 12 out of 13 merged PRs checked by a CI test -- score normalized to 9
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

65中等
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
0/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

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

49存在风险 · 占总体的 16%

安全态势

49存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2.2/2.5CI-Tests — 12 out of 13 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
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 — 29 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
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
5/5Security-Policy — security policy file detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate4.9
已排除计分(无数据或不适用):branch_protection, packaging, signed_releases。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

70良好 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 98 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.98
agent_instruction_files
agent_instruction_max_bytes
评分方式
18/18一条命令的引导启动 — jscan/Makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 76 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesjscan/Makefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.76
toolchain_manifestscore/go.mod, jscan/go.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 153 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes46,908
source_files_sampled153
oversized_source_files0

关键数据

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

数据采集警告

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

OpenSSF Scorecard 4.9 / 10
4.9综合

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

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
9CI-Tests12 out of 13 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained29 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
10Security-Policysecurity policy file detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
直接依赖 9
注册表软件包版本约束清单文件
Gogithub.com/ludo-technologies/polyscan/corev0.0.0jscan/go.mod
Gogithub.com/manifoldco/promptuiv0.9.0jscan/go.mod
Gogithub.com/sabhiram/go-gitignorev0.0.0-20210923224102-525f6e181f06jscan/go.mod
Gogithub.com/schollz/progressbar/v3v3.19.0jscan/go.mod
Gogithub.com/smacker/go-tree-sitterv0.0.0-20240827094217-dd81d9e9be82jscan/go.mod
Gogithub.com/spf13/cobrav1.10.1jscan/go.mod
Gogithub.com/spf13/viperv1.21.0jscan/go.mod
Gogolang.org/x/syncv0.19.0jscan/go.mod
Gogopkg.in/yaml.v3v3.0.1jscan/go.mod
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 708,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 1483855,
        "Makefile": 3318,
        "JavaScript": 1159
      },
      "pushed_at": "2026-07-23T17:13:25Z",
      "created_at": "2026-02-14T03:06:56Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-23T17:35:28Z",
      "description": "Multi-language code quality analysis — shared core algorithms (APTED, LSH, CFG, clone detection) and language scanners",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://www.ludo-tech.org",
      "name": "ludo-technologies",
      "type": "Organization",
      "login": "ludo-technologies",
      "company": null,
      "location": "Japan",
      "followers": 9,
      "avatar_url": "https://avatars.githubusercontent.com/u/225019636?v=4",
      "created_at": "2025-08-06T14:10:20Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 351
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-02-15T02:55:09Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-02-14T09:06:00Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "54ec3be9d169a78709a797c525eee12f576a63a8",
          "body": "pyscn completed polyscan#12 (Phase 3 core adoption), so every algorithm\nthat was \"sync\"-classified now lives directly in core/ for both tools.\nRemove rows for files deleted on both sides, reclassify thin\ncore-delegating wrappers to case-by-case, and note the core/lcom,\ncore/dfa, core/semantic landing spots for still-unported jscan features.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(jscan): retire SYNC.md sync rows now that pyscn adopts core",
          "author_name": "DaisukeYoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-23T17:13:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d768e6500119a69c619a6a3e28156b1383432e1",
          "body": "FindCandidatesLimit stops as soon as the cap is reached instead of\nmaterializing every colliding candidate, and guarantees deterministic\nband-order/insertion-order selection so capped queries keep the\nearliest-encountered candidates rather than an ID-sorted subset.\njscan's candidate index adapter no\n[…]\nate dropped previously-detected clone pairs\nand scaled with bucket density (~45x slower on a dense 8k-fragment\nindex with the default 1024 cap).\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core/lsh): capped, band-order candidate traversal (#20)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-23T13:36:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd59fe4a410eed4efbc94084432b7dfa04a3cfed",
          "body": null,
          "is_bot": false,
          "headline": "fix(core/apted): make prepared comparisons race-free (#19)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-21T16:30:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1393c66e4a497a98cdecd6afde4375a9ca5861d3",
          "body": "…uards (#18)\n\nReview follow-up on #4 and #6 (parity-neutral hardening only):\n\n- OptimizedAPTEDAnalyzer: override ComputeDistanceAndSimilarity and\n  ComputeDetailedDistance so they apply the early-stopping cap instead of\n  promoting the embedded uncapped methods; guard the size-diff early exit\n  agai\n[…]\np HealthScoreFromPenalties at 100 so negative\n  penalties cannot raise the score\n\nNo output change for valid inputs; jscan and core suites pass.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core): cap-consistent Optimized APTED results and scoring input g…",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-18T08:21:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba088964db15c4cf6fed05a9f7ac8ba0ff3b87ce",
          "body": "…action (#17)\n\nThe pre-monorepo pyscn and jscan feature extractors skipped label features\n(subtree hashes, k-gram members, type features) for identifier/literal\npayload nodes when includeLiterals was false, so renames and literal churn\ndid not perturb the feature set. core/clone's extractor was crea\n[…]\nnalyzers can inject\na fully configured extractor into the Type-2 gate, and restore jscan's\nJS/TS pattern and literal-like name wiring.\n\nRefs #12\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(core/clone): restore literal-like label filtering in feature extr…",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-18T07:29:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "be210fd3a483654825cf3f14541096c09cda41e9",
          "body": "* migrate: adopt core CFG graph and LSH in jscan\n\n* fix: preserve terminator control-transfer reachability\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>",
          "is_bot": false,
          "headline": "migrate: adopt core CFG, graph, and LSH in jscan (#16)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-18T03:22:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "117c79a65ab8cd8a979b237112c05a73508c2daa",
          "body": "Co-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>",
          "is_bot": false,
          "headline": "migrate: adopt core APTED in jscan (#15)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-17T17:28:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5d1c23fe13bd63e1e9d5326fc0bc94d61b887f5",
          "body": "APTED is still local in jscan; core/apted adoption is future work\n(issue #10). Align the wording with SYNC.md and the actual imports.",
          "is_bot": false,
          "headline": "docs(jscan): correct APTED status in ARCHITECTURE.md",
          "author_name": "DaisukeYoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-15T04:48:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b35d1f8ecd59abaab7daf1de115d1bacbe3757b0",
          "body": "Implementation landed in c57f3b4; update SYNC, architecture, and\nchangelog so they no longer describe deleted local clone kernels.",
          "is_bot": false,
          "headline": "docs(jscan): reflect core/clone adoption for issue #9",
          "author_name": "DaisukeYoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-15T04:14:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c57f3b4f5576937173586e3523d53e07f416b102",
          "body": null,
          "is_bot": false,
          "headline": "migrate: adopt core clone analysis in jscan (#9)",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-07-12T13:28:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf4faa99a12a8ed81d2e3da849a4e4c26f35697b",
          "body": null,
          "is_bot": false,
          "headline": "migrate: import jscan into monorepo (#8)",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-07-12T13:04:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c65ccbb8103cb9683619d628e269429a73e6df3",
          "body": "Port the kernel-level parts of pyscn's changes since 2026-02 (lcom\nchurn 514, dfa_builder 455, semantic 259 — the bulk of that churn is\nPython-AST adapter code that stays in pyscn):\n\nlcom:\n- MethodAccess gains Calls; ComputeLCOM4 unions methods connected by\n  intra-class method calls (calls to non-s\n[…]\nors, match-pattern def/use extraction, and Python semantic\nsignal extraction.\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "core/lcom,dfa,semantic: refresh kernels to current pyscn parity (#7)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-12T02:44:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "027416bd1570c1d6f3973626adbadca0bcf1a285",
          "body": "… scoring (#6)\n\nDead code (port of jscan changes since 2026-02, churn 100 — the merge\npass also exists in pyscn):\n\n- New line-level LineFinding type with SortLineFindings and\n  MergeContiguousFindings: collapses overlapping/adjacent same-reason\n  findings (compound statements span their bodies, so n\n[…]\normalization); pyscn-only cohesion and\n  community scoring also stay in pyscn\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "core/cfg,domain: refresh dead code post-processing and extract shared…",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-12T02:35:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1fc90f16f440ab04095b882bf6700194230f7cb",
          "body": "…ates (#5)\n\n* core/clone: refresh pair classification and add Type-1/2 similarity gates\n\nReplace the February cascade classifier with jscan's current gated\nclassification, and extract the similarity gates it depends on:\n\n- TextualSimilarityAnalyzer (Type-1 gate): whitespace normalization\n  preservin\n[…]\nm>\n\n* fix(clone): ignore punctuation whitespace in Type-1 matching\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "core/clone: refresh pair classification and add Type-1/2 similarity g…",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-12T02:22:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "98e1f0ed3a4646ceef681a464228ae6cb48b18e0",
          "body": "* core/apted: refresh to current jscan/pyscn parity\n\nPort jscan's apted.go changes since 2026-02 (churn 634 lines) while\nkeeping core's NormalizationMode and named constants:\n\n- Add label-profile approximate distance (cost-model-aware\n  delete/insert/rename matching with shared-label cancellation) a\n[…]\ny@anthropic.com>\n\n* fix: preserve edit costs for large tree shifts\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "core/apted: refresh to current jscan/pyscn parity (#4)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-11T14:23:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e2bcbc82abdf549513258945407bfa4a360b3ac",
          "body": null,
          "is_bot": false,
          "headline": "fix: harden clone grouping and monorepo docs",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-07-11T06:27:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5b87ac4720d937ca6a4fc32221c70c7f08b1b36",
          "body": "Rewrite the grouping framework as a faithful generic port of jscan's\ncurrent grouping_strategy.go (synced with pyscn up to 2026-07-07),\nreplacing the stale February extraction:\n\n- GroupableItem now exposes ItemLocation() instead of ItemKey(), so\n  location-aware passes work generically; ItemKey/Pair\n[…]\n\nTests ported from jscan's grouping_strategy_test.go and\ngroup_dedup_test.go.\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "core/clone: refresh grouping to current jscan/pyscn parity (#3)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-11T05:54:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7ad1db996868b660b45f916c4440e699cc2d0f0c",
          "body": "Rename repository from codescan-core to polyscan and restructure as a\nmonorepo. The shared algorithm library moves to core/ as the Go module\ngithub.com/ludo-technologies/polyscan/core. Language analyzers (jscan,\ngoscan) will live alongside it as sibling modules.\n\n- Move all packages and go.mod under\n[…]\nuild, vet, test -race for core)\n- Update docs to the new name and module path\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "restructure: convert to polyscan monorepo with core/ module (#2)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-11T05:38:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e53501e4f11f11e6ca1fb3329e5cb14f11f6d9f",
          "body": "Add 7 new packages and extend clone/ to extract all language-independent\nlogic from pyscn into codescan-core, enabling pyscn to import these\ndirectly instead of maintaining its own copies.\n\nNew packages:\n- domain/: shared error types, risk levels, clone types, default thresholds\n- dfa/: data flow an\n[…]\nructuralAnalyzer\n- classifier.go: cascade clone classifier (Type-1 → Type-4)\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add language-agnostic analysis packages for pyscn parity (#1)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-11T05:34:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d778956c2dcc34f3c1114656e452ac9fae2fb87",
          "body": null,
          "is_bot": false,
          "headline": "chore: update CHANGELOG for v0.9.0 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-07-11T03:09:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a1c88f210335e398db2866ac46448591f0bd744",
          "body": "* feat: add Claude Code plugin with Agent Skills (ported from pyscn)\n\nPort pyscn's Agent Skills mechanism to jscan:\n\n- .claude-plugin/marketplace.json + skills-only plugin manifest\n  (jscan has no MCP server, so no mcpServers entry)\n- 4 CLI-first skills adapted to jscan's CLI: health-check,\n  cli-an\n[…]\nimary path\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Claude Code plugin with Agent Skills (ported from pyscn) (#55)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-11T03:08:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f51dde8f515d7af0db438c03add7cf12f65e0069",
          "body": "Node 24's bundled npm (11.16.0) already satisfies the >=11.5.1\nrequirement for trusted publishing. The self-upgrade step\n(npm install -g npm@latest) intermittently drops the sigstore\noptional dependency, breaking npm publish with\n\"Cannot find module 'sigstore'\".\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: remove redundant npm self-upgrade in release workflow",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-07-10T16:37:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1700cc4a1beec9e1e1097c939fea4cb8867acbff",
          "body": "Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG for v0.8.0 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-07-10T14:44:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fa92705e03b5e03de230a53fce84c953bc3da740",
          "body": "* sync: port pyscn changes up to 249b121\n\nPorts clone-detection and duplication-metric fixes from pyscn\n(fb3fe92..249b121, 18 commits touching mapped files). CBO,\ncognitive-complexity-risk, and module-community-detection commits are\nrecorded as skipped in SYNC.md's Pending changes.\n\nCo-Authored-By: \n[…]\nnoreply@anthropic.com>\n\n* fix: address clone sync review findings\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Sonnet 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "sync: port pyscn changes up to 249b121 (#54)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-07-10T14:34:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f4ecf9d62d1e16bb568649c791b77fd234b9003",
          "body": "The NPM_TOKEN secret expired (npm granular tokens last at most 90\ndays), failing the v0.7.0 npm publish. Use OIDC trusted publishing\ninstead so no token is needed.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: switch npm publish to trusted publishing (OIDC)",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-06-11T18:28:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "74af9925f34ca051ce6dfc84a48f3828d85b1fc9",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG for v0.7.0 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-06-11T18:08:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8482a2c53a1d5d5ce3a9d2c4e9672f89d5ba25ff",
          "body": "Port pyscn changes in the misc area (lsh_index, reachability,\ncircular_detector, coupling_metrics, dead_code, domain/errors) up to\npyscn fb3fe92. Completes the initial catch-up; baseline moved to\nfb3fe92.\n\n- LSH index: int fragment IDs, WithMaxCandidates cap (default 1024),\n  deterministic sorted ca\n[…]\ntement)\n- Domain errors: add TIMEOUT/CANCELLED/NOT_IMPLEMENTED/INTERNAL codes\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "sync: catch up misc area with pyscn (initial catch-up 3/3) (#52)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-06-11T18:06:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c372c2998a6424641ff09358aff719f187074aa9",
          "body": "Port pyscn scoring changes to jscan per SYNC.md:\n\n- Duplication metric switched to K-Core clone-group density\n  (groups per 1000 lines * 20, capped at 10%) with a 0-10% penalty\n  scale (pyscn 0886cfb, 760bc87, 68b6d2b)\n- CBO coupling calibration softened: medium weight 0.5 -> 0.3,\n  saturation ratio\n[…]\nitecture style presets, AbstractClassCount,\nPython-specific default patterns.\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "sync: catch up scoring with pyscn (initial catch-up 2/3) (#51)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-06-11T16:49:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a9a4ff7e44f67a7b80e58b2b4d7fb2f088565aeb",
          "body": "* sync: catch up clone detection with pyscn\n\nInitial catch-up of the clone detection area against pyscn origin/main\n(73acc60), following SYNC.md. Ports language-independent algorithm fixes\nand improvements accumulated since the f0457d7 baseline:\n\nAPTED correctness:\n- Sort key roots ascending (leaves\n[…]\n v6 -> v9.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "sync: catch up clone detection with pyscn (initial catch-up 1/3) (#50)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-06-11T11:33:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2e06f848ba369817152af4b4d4a95e5a8273c9d3",
          "body": "Build a single ImportGraph (with precomputed suffix index, reverse edges,\nand forward edges) before running the three cross-file detect functions,\ninstead of each function independently rebuilding the import graph.\n\n- Add suffixIndex with O(1) alias path resolution, replacing the O(n)\n  full-file-sc\n[…]\nnctions, and\n  DetectOrphanFiles to accept *ImportGraph instead of rebuilding edges\n- DetectOrphanFiles BFS now uses precomputed forwardEdges\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf: optimize cross-file dead code analysis with shared ImportGraph",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-21T16:47:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a551ac5ad764abd7b1ed00e2132798e2b676d786",
          "body": "Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG for v0.6.2 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-18T17:50:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "197d35fa99a6d581c9f99cfe760600a088947f5c",
          "body": "* docs: fix README accuracy for CLI options\n\n* fix: reduce dead code false positives for Next.js and TS imports\n\n* chore: format dead code analyzer for lint\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>",
          "is_bot": false,
          "headline": "fix: reduce dead code false positives for Next.js and TS imports (#49)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-18T17:45:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6aa9bd2837fe81eed2e7fd52585755f2f1300358",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG for v0.6.1 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T14:02:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a7273ed69e6a8f612f5416a714d87ed6dc8df58c",
          "body": "Co-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>",
          "is_bot": false,
          "headline": "fix: tidy go.mod and set complexity function locations (#47)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-15T13:58:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fbab1a035934fd9cd17bc50dc78ff8c3a7c001c3",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG for v0.6.0 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T13:43:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cb7959aeecaeea5fbf2e9464fe7493679bd9d756",
          "body": "…ckages\n\nPlatform packages (jscan-darwin-arm64, etc.) declared the same bin entry\nas the main jscan package, causing npm to fail creating the symlink in\nnode_modules/.bin/. Also add files field to the main package to exclude\nplatform directories and reduce package size from 19.6MB to a few KB.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve npx \"command not found\" by removing bin from platform pa…",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T13:42:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ce0e4ec1cbfd47063f04a09e4e20104a94437aa0",
          "body": "The complexity visitor was descending into nested function bodies when\ncounting logical (&&, ||, ??) and ternary (?:) operators, inflating\nparent function complexity. For example, lodash's runInContext was\nreported as 1034 instead of the correct ~46.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: stop counting nested functions' operators in parent complexity",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T13:40:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "615c4486ebab611d7ddfca483286aa109a493ea2",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG and SECURITY for v0.5.0 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T13:22:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7e6581268b181921104d79278bf9252893013907",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add algorithm details to Features section",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T13:21:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f816dbe3d9b04e06998ee9163aee4e2599c7768d",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: remove emoji from Features section",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T13:14:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0367df07cb505647b35623b8b96f45ce4108b808",
          "body": "Restructure with centered header, Quick Start section, emoji features,\ncollapsible install methods, and organized command reference.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: redesign README to match pyscn style",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T13:11:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "28cb5e72ef4746d3b403e1a5567dddf6da6af5ea",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add video/ to .gitignore",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T13:04:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f281cfbf6c4342239c33c70fe2a26d2ec7722ae4",
          "body": "Added demo link to README and updated project description.",
          "is_bot": false,
          "headline": "Update README with demo link and project details",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-15T13:02:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d2bf24d0676d78e4ed41ae8017e0fbdded9b688",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG and SECURITY for v0.4.0 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T10:28:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a47b0668a84cfef1a670895d828abb440f784fd7",
          "body": "Co-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>",
          "is_bot": false,
          "headline": "fix: improve progress UX and speed up clone analysis (#46)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-15T10:24:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0a11e85d69d807e8cb16997aa3a814cacacd3e9",
          "body": "…n-and-arch-docs\n\nRefactor dead-code aggregation and align architecture docs",
          "is_bot": false,
          "headline": "Merge pull request #45 from ludo-technologies/fix/deadcode-aggregatio…",
          "author_name": "Luna",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-15T07:52:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c530de43fab135d07861bf29308af3f2ee3782eb",
          "body": null,
          "is_bot": false,
          "headline": "Refactor dead code aggregation and align architecture docs",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T07:47:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90b8b3baf4db23649700c31e76d899ccf008057c",
          "body": "* chore: add community health files for OSS release\n\n- Add CODE_OF_CONDUCT.md (Contributor Covenant v2.1)\n- Add Issue templates (bug report, feature request)\n- Add Pull Request template\n- Update SECURITY.md supported versions to 0.3.x\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n* chore\n[…]\n to 2026\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add community health files for OSS release (#44)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-15T06:09:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dfb5b4bd7ed2f1369019dd73bedf0fdd2b53a980",
          "body": "EdgeLoop is a back-edge from loop body to header, not a conditional\nbranch. Loop headers should use EdgeCondTrue/EdgeCondFalse for the\nloop-body vs exit decision. Counting EdgeLoop as a decision double-\ncounted loops in CFGs built by jscan and pyscan.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: exclude EdgeLoop back-edges from McCabe decision points",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-15T02:55:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3167eb931d56b1d4b8ab85b9038554a4f29dadc2",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: correct LICENSE copyright year to 2026",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-14T17:40:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7aac6ec8bcf24f7afbd867f9173e9e82fc875007",
          "body": "- LICENSE (MIT, Ludo Technologies)\n- .gitignore\n- CONTRIBUTING.md\n- CODE_OF_CONDUCT.md (Contributor Covenant 2.1)\n- SECURITY.md\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add OSS governance files for public release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-14T16:23:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "893f7836f6d970f5f192f33190431ece23d7556d",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG for v0.3.0 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-14T09:20:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6244afd2ae00a4d39cfc0a0498fc7ef559b337f2",
          "body": "…onfig-ci-hardening-pr\n\nfix: wire config loading and harden CI workflows",
          "is_bot": false,
          "headline": "Merge pull request #42 from ludo-technologies/fix/release-readiness-c…",
          "author_name": "Luna",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-14T09:18:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66a4a73e6a8e0a1b07544fbf6760f7b54ec1f319",
          "body": "Without this fix, the CLI default of 10 always wins over the config\nfile value because checkMaxComplexity is populated at flag-definition\ntime. Now we check cmd.Flags().Changed so the precedence is:\nexplicit CLI flag > config file > CLI default.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: apply config max_complexity when CLI flag is not explicitly set",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-14T09:13:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "212b2861f726e41fb5d65c9f53fa08f4d234c045",
          "body": "- Remove dead cache field from APTEDAnalyzer\n- Add godoc with type assertion examples to any fields\n- Extend Edge struct with Label and Data fields\n- Add error returns to ComputeCouplingMetrics and AbstractnessFunc\n- Restructure ComplexityContributor with structured contributions and Config\n- Wrap S\n[…]\nClassifier in ReachabilityConfig and DeadCodeConfig structs\n- Unify FeatureExtractor error returns (ExtractSubtreeHashes, ExtractNodeSequences)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: clean up public API for v0.1.0 tag",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-14T09:06:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e33e21d6c6d3a5ac7662e7c2b305d73a0f09c4f5",
          "body": "…etect_after_throw\n\nAlign all JSON struct tags with mapstructure/yaml tags (snake_case) so\nthat config files generated by templates can be correctly parsed via\nboth Viper and encoding/json. Rename detect_after_raise to\ndetect_after_throw to match JS/TS terminology.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: unify JSON keys to snake_case and rename detect_after_raise to d…",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-14T08:44:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8e7bfba8a9bf0fbfc4f7e9e430bb4f64f5cbf371",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add README for v0.1.0",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-14T08:34:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8695e115433f263eff6cbd71d693448b817a12a4",
          "body": "…d CFG analysis\n\nImplement language-agnostic interfaces and algorithms:\n- graph/: DirectedGraph interface + MapGraph, Tarjan SCC cycle detection, Robert Martin coupling metrics\n- clone/: 5 generic grouping strategies (Connected, KCore, StarMedoid, CompleteLinkage, Centroid) using Go generics\n- cfg/: Reachability analysis, McCabe cyclomatic complexity, dead code detection with severity levels\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add Tier 2 interface abstractions for graph, clone grouping, an…",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-14T08:23:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "99b4479f0b46ad4555055171ab8a85a8c6a5261f",
          "body": "Extract shared analysis algorithms from pyscn/jscan into codescan-core:\n- apted: APTED tree edit distance with Zhang-Shasha algorithm\n- lsh: Locality-Sensitive Hashing with MinHash signatures\n- cfg: Control Flow Graph data structures and traversal\n- clone: AST feature extraction for code clone detection\n- util: Environment detection and browser utilities\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: initial extraction of language-agnostic core algorithms",
          "author_name": "DaisukeYoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-14T03:08:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "efe5fc4206796ca9265405a53b7944beb39e19cd",
          "body": null,
          "is_bot": false,
          "headline": "fix: stop auto-discovering extensionless .jscanrc",
          "author_name": "DaisukeYoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-14T02:12:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0a4ed0bdb555a25f4d8922c76c5d99da79fa5bc",
          "body": null,
          "is_bot": false,
          "headline": "fix: wire config loading and harden CI workflows",
          "author_name": "DaisukeYoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-13T17:57:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01daf6c8e17aa03bf8d04ba82cb4625565ddf8cb",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG for v0.2.2 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-12T14:42:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "079ed952a87e7477f6ddb71b269e807ebbe28383",
          "body": "Replace the postinstall download-from-GitHub approach with platform-specific\nnpm packages (jscan-darwin-arm64, jscan-linux-x64, etc.) that bundle the\nbinary directly via optionalDependencies. This eliminates HTTP requests on\nevery npx invocation and makes installation faster and more reliable.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: switch npm distribution to per-platform packages (esbuild-style)",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-12T14:35:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0643ebbdbdefd2c205ff4328483e007d8447c2b6",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: embed version in release binaries via correct ldflags path",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-12T13:31:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f067bdbca24dc222e56c761b5211e4fbd7e7d610",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update CHANGELOG for v0.2.0 release",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-12T13:18:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5171504d2ca05cb3eb0369563a3f6325a6c8c2ca",
          "body": "* fix: improve dependency score accuracy with MSD and cycle penalties\n\nWire up MainSequenceDeviation from CouplingAnalysis to the health score\nsummary — it was calculated but never populated. Also replace the\nproportion-only cycle penalty with a log₂ floor so circular dependencies\nalways incur a mea\n[…]\n_test.go\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: improve dependency score accuracy (#41)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-12T13:16:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f2a44e07029ac2d93ec6b9d32d498a984c32514",
          "body": "Fix errcheck, unused code, gofmt, gosimple, and staticcheck warnings.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve golangci-lint errors across codebase",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-11T12:48:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d3e8c54cebbf00c73ba4e32590b501e4e8c67c9a",
          "body": "* fix: detect nested functions in BuildAll via recursive AST walk\n\nBuildAll() only scanned direct children of node.Body, missing functions\nnested inside expressions (arrow functions in variable declarations,\nfunction expressions in assignments, object methods, callbacks, exports).\nReplace the shallo\n[…]\nserver).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: detect nested functions in BuildAll via recursive AST walk (#40)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-11T12:25:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ebd26d01651d37c53c4328d098ae836fd829f4e4",
          "body": "resolveImportTarget could not match extensionless relative imports\n(e.g. require('./application')) to known graph nodes whose IDs include\nthe extension (e.g. lib/application.js). This caused all internal edges\nto create ghost external nodes, producing broken analysis results\n(Max Depth=1, Circular D\n[…]\nry index files when the normalized\npath doesn't match a known node directly.\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve extensionless imports in dependency graph builder (#39)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-10T13:51:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ad9d569dd1540f531b46149086fbff68aa49802",
          "body": "Add CI workflow, release Go version bump (1.23→1.24), changelog,\ncontributing guide, security policy, commit message template, and\narchitecture/development/testing documentation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add project infrastructure files",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-10T13:05:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c91c892b2d5e398c46fad384aebd0d450292b130",
          "body": "* feat: add CLI analysis summary and modernize README\n\nPrint a pyscn-style analysis summary to the terminal after HTML report\ngeneration, showing health score, grade, and per-category detailed\nscores with status indicators.\n\nAlso extract duplicated summary-building logic into BuildAnalyzeSummary\nhel\n[…]\n section\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add CLI analysis summary and modernize README (#38)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-10T10:50:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c71268fd43cbbaacd0470e8b7013e7cf5f36f796",
          "body": "* feat: detect orphan files and unused exported functions in dead code analysis\n\nAdd two cross-file detection capabilities that existing linters miss:\n\n- Orphan files: BFS from entry points to find files unreachable via\n  import chains. Skips test/config files. Entry points expanded to\n  include mai\n[…]\n values.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: detect orphan files and unused exported functions (#37)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-10T07:38:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "181545b4142e3b5e6100b15af1d8b902d754d7c8",
          "body": "* feat: detect unused imports and exports in dead code analysis\n\nDead code detection previously only found CFG-based unreachable code\n(after return/throw/break), resulting in findings=0 for most real\nprojects and a meaningless 100/100 score. Add unused import (warning)\nand unused export (info) detec\n[…]\nle types\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: detect unused imports and exports in dead code analysis (#36)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-10T06:02:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e1077c956099b183076d6d4e6fd72041c135329",
          "body": "* feat: Integrate clone, CBO, and deps analysis into analyze command\n\n- Add clone detection, CBO coupling analysis, and dependency analysis\n  to the analyze command via --select flag\n- Default analyses now include: complexity, deadcode, clone, cbo, deps\n- Run all analyses in parallel for better perf\n[…]\no 0/N/A.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: adjust health score thresholds and add score to text output (#35)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-09T17:14:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2df2dcf503c08ef1c2eb768feba6efe17f14d5f8",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Add test-repos to .gitignore",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-02T14:01:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "14de817b64bf26b17346ed5865939722a380e13c",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Extract binary to temp dir to avoid overwriting bin/jscan script",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-01T16:06:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "36a9dd6c1a7e622e073ddc521aaa8baa9565ea0a",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Use NPM token for initial publish",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-01T15:19:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "73840c09fedcc0f75b9a88b3299bb07fa96d8341",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Remove macOS Intel build (unsupported)",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-01T14:50:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "42dfa3f1f093f80c0b184c2fe9e98dac091e31c6",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Use macos-15-intel instead of deprecated macos-13",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-01T14:49:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "db928d2e3d4485870b6e6c029ae5f2b6bf967ee8",
          "body": "go-tree-sitter requires CGO, so cross-compilation doesn't work.\nBuild natively on each platform instead.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: Use native builds instead of cross-compilation",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-01T14:33:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "80f32be3a7d846e28f71a17e5a9d0f12365d1941",
          "body": "- Add npm package structure with postinstall binary download\n- Add GoReleaser config for multi-platform builds\n- Add GitHub Actions workflow for automated releases\n\nCloses #22\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add npm package distribution",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-01T13:59:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5fc481311277d3a33cf06b15c7aa60b6d4fa8b92",
          "body": "…verage\n\ntest: Improve test coverage across all packages",
          "is_bot": false,
          "headline": "Merge pull request #32 from ludo-technologies/feature/improve-test-co…",
          "author_name": "LudoTechnologies",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-02-01T12:42:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77c0ba962e2ba2d806a5614026064b9fb0f2125b",
          "body": "Add comprehensive tests for:\n- CFG data structures and builder (cfg_test.go, cfg_builder_test.go)\n- Complexity analyzer with decision point counting (complexity_test.go)\n- Dead code detector and reachability analysis (dead_code_test.go, reachability_test.go)\n- Parser with TypeScript support and AST \n[…]\n/analyzer: 59.1% -> 78.2%\n- internal/config: 0% -> 61.9%\n- service: 42.6% -> 56.2%\n- app: 19.3% -> 32.1%\n- cmd/jscan: 6.8% -> 16.0%\n\nCloses #19\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: Improve test coverage across all packages",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-02-01T12:38:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "826f085ea04ccaa0fb34aef7d6556f9b32f60a78",
          "body": "* feat: Add default exclude patterns for common directories\n\nAdd default exclude patterns to skip common non-source directories during\nfile collection, improving analysis performance on typical JS/TS projects.\n\nDefault excluded patterns:\n- node_modules (npm packages)\n- dist, build (build outputs)\n- \n[…]\nclusions\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Daisuke Yoda <daisukeyoda@DaisukenoMac-mini.local>\nCo-authored-by: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add default exclude patterns for common directories (#31)",
          "author_name": "Daisuke Yoda",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-01-31T19:06:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c8036268d882f7177b532dda4af07327ebb7abc8",
          "body": "- Default output is now HTML report (matching pyscn behavior)\n- Add --text flag for text output to stdout\n- Update help text and examples to reflect new defaults\n- JSON and text outputs remain available via --json and --text flags\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Change default output format to HTML for analyze command",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-31T18:14:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "586c43aab70a779387565139ef4476ae2aa46935",
          "body": "…e-progress-fix\n\nfeat: Add parallel execution and unified progress bar for analyze command",
          "is_bot": false,
          "headline": "Merge pull request #30 from ludo-technologies/feature/parallel-analyz…",
          "author_name": "LudoTechnologies",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-01-31T17:47:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b3824842b4b3ede8a784ae5f354ecaee16188c4",
          "body": "- Fix progress estimation for parallel execution (use single analysis\n  time instead of sum since they run concurrently)\n- Remove unused cfg parameter from runDeadCodeAnalysisInternal and\n  runDeadCodeAnalysisWithTask\n- Skip progress bar goroutine for non-interactive output (JSON mode)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: Address PR review feedback",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-31T17:44:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c671b2642055bc7989ecb4d83a4f7f4df63ac3d",
          "body": "…mand\n\n- Run complexity and dead code analyses in parallel using sync.WaitGroup\n- Replace multiple progress bars with a single time-based progress bar\n- Add estimateAnalysisDuration to estimate total analysis time\n- Add startTimeBasedProgressUpdater for smooth progress updates\n- Refactor analysis fu\n[…]\neck.go\n\nThis improves analysis performance by running analyses concurrently and\nfixes the issue where progress bars would overwrite each other.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add parallel execution and unified progress bar for analyze com…",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-31T17:38:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d7c95d806f469da477d4947ae03191a0e8a652df",
          "body": "…el-executor\n\nfeat: Add parallel executor for concurrent task execution (Issue #17)",
          "is_bot": false,
          "headline": "Merge pull request #29 from ludo-technologies/feature/issue-17-parall…",
          "author_name": "LudoTechnologies",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-01-31T17:17:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efd23b8bdbf8275a1a8ae9eaf36ff50d33b5c84f",
          "body": "- Remove unused wrapContextError function (dead code)\n- Add comment explaining DefaultMaxConcurrency vs runtime.NumCPU()\n- Replace custom containsSubstring with strings.Contains\n- Use shorter timeout in tests (100ms) for CI stability\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: Address PR review feedback",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-31T17:12:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0a2e18fa394e57807291509d660a5c9e2cf29b1",
          "body": "Implement ParallelExecutorImpl service that provides:\n- Concurrent task execution with configurable concurrency limit\n- Timeout management via context.WithTimeout\n- Error aggregation from all failed tasks (not just first failure)\n- Integration with optional ProgressManager\n- Thread-safe configuration updates\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add parallel executor for concurrent task execution (Issue #17)",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-31T17:06:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0d8559608321847369ba90253af541dd6c2c5d8b",
          "body": "…ss-manager\n\nfeat: Add progress manager for long-running analysis tasks (Issue #16)",
          "is_bot": false,
          "headline": "Merge pull request #28 from ludo-technologies/feature/issue-16-progre…",
          "author_name": "LudoTechnologies",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-01-31T16:45:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "060a087d75d34ab916568fe0cfdb74646358c79d",
          "body": "- Add sync.Mutex to ProgressManagerImpl for concurrent safety\n- Remove redundant nil checks by using NoOpTaskProgress as default\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: Add thread safety and remove redundant nil checks",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-31T16:44:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "da57ddb9116298507122dc9954b5a6d9bf3947ab",
          "body": "Add interactive progress bars for complexity and dead code analysis.\nProgress is automatically shown in TTY environments and hidden for\nJSON output or CI pipelines.\n\n- Add ProgressManager and TaskProgress interfaces to domain/output.go\n- Implement ProgressManagerImpl with schollz/progressbar/v3\n- Im\n[…]\nr for non-interactive environments\n- Integrate progress reporting into complexity service\n- Add progress tracking to analyze and check commands\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add progress manager for long-running analysis tasks (Issue #16)",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-31T16:38:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d724a5f7cee9854d24473bd509fc715e8d676eed",
          "body": "…ommand\n\nfeat: Add 'init' command for config file generation (Issue #15)",
          "is_bot": false,
          "headline": "Merge pull request #27 from ludo-technologies/feature/issue-15-init-c…",
          "author_name": "LudoTechnologies",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-01-31T07:46:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "579debe4532b9946433e0b2f0fca3fc737c5bf5f",
          "body": "- Remove global variables, use cmd.Flags() in RunE instead\n- Replace custom itoa() with strconv.Itoa()\n- Return configPath from runInteractiveSetup() instead of modifying global\n- Handle filepath.Abs error explicitly with fallback to relative path\n- Update tests to use cmd.SetArgs() instead of global variable manipulation\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: Address PR review feedback",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-30T13:12:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b0884c909884f58f985eb39c9b96568a66d4767f",
          "body": "Add jscan init command to generate documented configuration files with\nsensible defaults. Features include:\n\n- Full JSONC config template with inline documentation\n- Minimal config option (--minimal) for essential settings only\n- Interactive setup wizard (--interactive) for guided configuration\n- Pr\n[…]\nVue/Nuxt, Node.js)\n- Strictness level presets (Relaxed, Standard, Strict)\n- Force overwrite (--force) and custom output path (--config) options\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add 'init' command for config file generation (Issue #15)",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-29T17:10:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "79056609c8ac412521d42c37f014c1228e032efd",
          "body": "Implement jscan check command optimized for CI/CD pipelines with:\n- Configurable thresholds (--max-complexity, --max-cycles)\n- Allow flags (--allow-dead-code, --allow-circular-deps)\n- Exit codes: 0 (pass), 1 (quality issues), 2 (error)\n- CI-friendly output with optional JSON format (--json)\n- Verbose mode for detailed output (--verbose)\n- Selective analysis (--select complexity,deadcode,deps)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Add 'check' command for CI/CD integration (Issue #14)",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-22T15:33:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d8565e6ca849329017a12fe95b3cd02954342da",
          "body": "…rmat\n\nfeat: Add DOT format for dependency visualization (Issue #13)",
          "is_bot": false,
          "headline": "Merge pull request #26 from ludo-technologies/feature/issue-13-dot-fo…",
          "author_name": "LudoTechnologies",
          "author_login": "DaisukeYoda",
          "committed_at": "2026-01-22T09:29:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f9d4ed57b4e57a02273c658c027044cff2190c6",
          "body": "- Fix file Close error handling in deps.go to capture close errors\n- Add comments for nodeColors/edgeStyles indicating they are constants\n- Add comment explaining unused analysis parameter in filterByDepth\n- Add MaxDepth filter tests including edge case with no entry points\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: Address PR review feedback",
          "author_name": "Daisuke Yoda",
          "author_login": null,
          "committed_at": "2026-01-22T09:20:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 2,
      "commits_last_year": 117,
      "latest_release_at": "2026-02-15T02:55:09Z",
      "latest_release_tag": "v0.1.1",
      "releases_from_tags": true,
      "days_since_last_push": 0,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 158,
      "mean_days_between_releases": 0.7
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 75,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/ludo-technologies/polyscan/core",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/ludo-technologies/polyscan/core",
          "is_deprecated": false,
          "latest_version": "v0.2.1",
          "repository_url": "https://github.com/ludo-technologies/polyscan",
          "versions_count": 2,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T07:29:07Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "github.com/ludo-technologies/polyscan",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/ludo-technologies/polyscan",
          "is_deprecated": false,
          "latest_version": "v0.1.1",
          "repository_url": "https://github.com/ludo-technologies/polyscan",
          "versions_count": 2,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-02-15T02:55:09Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 158
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-07-06",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "jscan/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "core/go.mod",
        "jscan/go.mod"
      ],
      "largest_source_bytes": 46908,
      "source_files_sampled": 153,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "core/go.mod",
        "jscan/go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/ludo-technologies/polyscan/core",
          "manifest": "jscan/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0"
        },
        {
          "name": "github.com/manifoldco/promptui",
          "manifest": "jscan/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.9.0"
        },
        {
          "name": "github.com/sabhiram/go-gitignore",
          "manifest": "jscan/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20210923224102-525f6e181f06"
        },
        {
          "name": "github.com/schollz/progressbar/v3",
          "manifest": "jscan/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.19.0"
        },
        {
          "name": "github.com/smacker/go-tree-sitter",
          "manifest": "jscan/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20240827094217-dd81d9e9be82"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "jscan/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.1"
        },
        {
          "name": "github.com/spf13/viper",
          "manifest": "jscan/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.21.0"
        },
        {
          "name": "golang.org/x/sync",
          "manifest": "jscan/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.19.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "jscan/go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "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": 13,
        "open_issues": 2,
        "closed_ratio": 0.714,
        "closed_issues": 5,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "DaisukeYoda",
          "commits": 50,
          "avatar_url": "https://avatars.githubusercontent.com/u/27394393?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "jscan-release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 9,
            "reason": "12 out of 13 merged PRs checked by a CI test -- score normalized to 9",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 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": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": "29 commit(s) and 7 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": null,
            "reason": "packaging workflow not 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": 10,
            "reason": "security policy file 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": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "54ec3be9d169a78709a797c525eee12f576a63a8",
        "ran_at": "2026-07-23T18:09:59Z",
        "aggregate_score": 4.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": true,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-23T17:14:51Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-23T13:36:28Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 13,
          "created_at": "2026-07-12T04:48:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 14,
          "created_at": "2026-07-12T04:48:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ludo-technologies/polyscan",
    "host": "github.com",
    "name": "polyscan",
    "owner": "ludo-technologies"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 59,
      "inputs": {
        "security": 49,
        "vitality": 74,
        "community": 40,
        "governance": 52,
        "engineering": 75
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "commits_last_year": 117,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 12
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "12/52 weeks with commits",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "117 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 117
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "29 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "good",
            "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": 78,
            "inputs": {
              "releases_count": 2,
              "latest_release_tag": "v0.1.1",
              "releases_from_tags": true,
              "days_since_latest_release": 158,
              "mean_days_between_releases": 0.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "2 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 158 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 158
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.7
                    }
                  }
                ],
                "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": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 40,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 1,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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": "excellent",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "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": 13.5,
                "status": "met",
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 52,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 13,
            "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 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "merged_prs": 13,
              "open_issues": 2,
              "closed_issues": 5,
              "issue_closed_ratio": 0.714,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "71% of issues closed",
                "points": 33.4,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 71
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "13/13 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 13,
                      "decided": 13
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "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": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 46,
            "inputs": {
              "followers": 9,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "ludo-technologies",
              "public_repos": 8,
              "account_age_days": 351
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "9 followers of ludo-technologies",
                "points": 7.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 9,
                      "login": "ludo-technologies"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~0 yr old",
                "points": 8.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/ludo-technologies/polyscan/core",
                "github.com/ludo-technologies/polyscan"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "2 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "good",
        "name": "Engineering Quality",
        "value": 75,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 82,
            "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": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": "12 out of 13 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 49,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 49,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 4.9
            },
            "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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "12 out of 13 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "29 commit(s) and 7 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 not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 detected",
                "points": 5,
                "status": "met",
                "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": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 70,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.98,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "98 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 98,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "jscan/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.76,
              "toolchain_manifests": [
                "core/go.mod",
                "jscan/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "jscan/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "jscan/Makefile"
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "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": "76 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 76,
                      "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": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 46908,
              "source_files_sampled": 153,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/153 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 153,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T18:10:11.410674Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/l/ludo-technologies/polyscan.svg",
  "full_name": "ludo-technologies/polyscan",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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