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

ongjin / garu

초경량 한국어 형태소 분석기 — 1MB 모델로 브라우저에서 실행(WASM). Ultra-lightweight Korean morphological analyzer in the browser. npm: garu-ko

Python · RustMIT★ 159 星标⑂ 7 复刻始于 2026年3月在 GitHub 上查看 ↗

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

56
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

zerry个人账户
4 关注者37 个公开仓库始于 2021年6月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npmgaru-ko0.9.115,150635 天前koreanmorphological-analysiskorean-nlppos-taggingtokenizerkorean-tokenizerhangulnlpwasmwebassemblylightweightbrowseroffline

按类别列示的指标

活力

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

85优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 5 天前
11.1/36提交节奏 — 52 周中有 16 周有提交
18/18提交量 — 最近一年 376 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year376
human_commit_share1
days_since_last_push5
active_weeks_last_year16

发布纪律

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

社区与采用

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

50中等 · 占总体的 18%

流行度与采用

42存在风险
评分方式
35.7/60星标 — 159 个星标
6.5/25复刻 — 7 个复刻
0/15关注者 — 2 位关注者
所用输入
forks7
stars159
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/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
评分方式
49.5/80月度下载量 — npm 合计每月 5,150 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesgaru-ko
dependents
ecosystemsnpm
total_downloads
monthly_downloads5,150
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

50中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0/22.5提交分布 — 头号贡献者编写了 100% 的提交
1.4/13.5贡献者广度 — 1 位贡献者
0/10OpenSSF Scorecard:Contributors — project has 0 contributing companies or organizations -- score normalized to 0
所用输入
bus_factor1
contributors_sampled1
top_contributor_share1
评分方式
38.9/46.8议题解决 — 83% 的议题已关闭
0/38.3PR 接受 — 没有已裁定的拉取请求或无数据
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs0
open_issues1
closed_issues5
issue_closed_ratio0.833
closed_unmerged_prs0
已排除计分(无数据或不适用):PR 接受。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
5/25所有者影响力 — ongjin 有 4 位关注者
21.7/25既往记录 — 37 个公开仓库,账户约 5 年
所用输入
followers4
owner_typeUser
is_verified
owner_loginongjin
public_repos37
account_age_days1,863
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 63 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgaru-ko
ecosystemsnpm
any_deprecated
min_days_since_publish5

工程质量

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

58中等 · 占总体的 20%

工程实践

30存在风险
评分方式
0/24CI 工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 无数据
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config
已排除计分(无数据或不适用):OpenSSF Scorecard:CI-Tests。 其余权重已重新归一化。

文档

100优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://garu.zerry.co.kr
10/10仓库描述
10/10主题标签 — 13 个主题标签
10/10Wiki
所用输入
topicsbrowser, hangul, korean, korean-nlp, korean-tokenizer, morphological-analysis, nlp, pos-tagging, rust, tokenizer, typescript, wasm, webassembly
has_wiki
homepagehttps://garu.zerry.co.kr
has_readme
has_docs_dir
has_description

安全

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

28危急 · 占总体的 16%

安全态势

28危急
评分方式
6.8/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 无数据
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — 无数据
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
0/5Pinned-Dependencies — 无数据
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — 无数据
2.2/7.5Vulnerabilities — 7 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2.8
已排除计分(无数据或不适用):ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions。 其余权重已重新归一化。

AI 就绪度

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

68中等 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7,784
评分方式
12.6/18一条命令的引导启动 — Cargo.toml, crates/garu-core/Cargo.toml, crates/garu-tools/Cargo.toml(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — integrations/minisearch-tokenizer/tsconfig.json, integrations/orama-tokenizer/tsconfig.json, js/tsconfig.json
10/10可复现环境 — lockfile
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — 无数据
所用输入
has_nix
has_tests
lockfilesCargo.lock, package-lock.json
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configsintegrations/minisearch-tokenizer/tsconfig.json, integrations/orama-tokenizer/tsconfig.json, js/tsconfig.json
agent_commit_share0
toolchain_manifestsCargo.toml, crates/garu-core/Cargo.toml, crates/garu-tools/Cargo.toml, crates/garu-wasm/Cargo.toml
dependency_bot_commit_share0
已排除计分(无数据或不适用):OpenSSF Scorecard:Pinned-Dependencies。 其余权重已重新归一化。
评分方式
27/45可类型检查的代码 — Python,已配置类型检查(integrations/minisearch-tokenizer/tsconfig.json, integrations/orama-tokenizer/tsconfig.json, js/tsconfig.json)
54.3/55可控的文件大小 — 采样的 159 个源文件中有 2 个超过 60KB
所用输入
primary_languagePython
largest_source_bytes232,330
source_files_sampled159
oversized_source_files2

机器可读接口

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

关键数据

159GitHub 星标
1贡献者
376最近 12 个月提交数
5距最近推送天数
46发布版本数
1巴士系数(bus factor)
1开放议题
crates.io, npm, PyPI软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:garu-ko@0.9.11; advisories assessed against the repository dependency graph instead

更多细节

Star 与 Fork 历史 0 ★ / 7 ⇿
0Star
7Fork
42发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

1234567732026-032026-052026-07
主版本 0次版本 7修订 35
OpenSSF Scorecard 2.8 / 10
2.8综合

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

9Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
不适用CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
不适用Dangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
不适用Pinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
不适用Token-PermissionsNo tokens found
3Vulnerabilities7 existing vulnerabilities detected
全部依赖 未采集

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "browser",
        "hangul",
        "korean",
        "korean-nlp",
        "korean-tokenizer",
        "morphological-analysis",
        "nlp",
        "pos-tagging",
        "rust",
        "tokenizer",
        "typescript",
        "wasm",
        "webassembly"
      ],
      "is_fork": false,
      "size_kb": 87097,
      "has_wiki": true,
      "homepage": "https://garu.zerry.co.kr",
      "languages": {
        "HTML": 9133,
        "Rust": 329417,
        "Shell": 2809,
        "Python": 589154,
        "JavaScript": 15126,
        "TypeScript": 23905
      },
      "pushed_at": "2026-07-18T11:50:40Z",
      "created_at": "2026-03-27T04:21:32Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T04:18:51Z",
      "description": "초경량 한국어 형태소 분석기 — 1MB 모델로 브라우저에서 실행(WASM). Ultra-lightweight Korean morphological analyzer in the browser. npm: garu-ko",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python",
        "Rust"
      ]
    },
    "owner": {
      "blog": "https://zerry.co.kr",
      "name": "zerry",
      "type": "User",
      "login": "ongjin",
      "company": null,
      "location": "Seoul, Republic of Korea",
      "followers": 4,
      "avatar_url": "https://avatars.githubusercontent.com/u/86001644?v=4",
      "created_at": "2021-06-16T12:43:08Z",
      "is_verified": null,
      "public_repos": 37,
      "account_age_days": 1863
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.9.11",
          "kind": "patch",
          "published_at": "2026-07-18T11:50:53Z"
        },
        {
          "tag": "v0.9.10",
          "kind": "patch",
          "published_at": "2026-07-16T07:32:55Z"
        },
        {
          "tag": "v0.9.9",
          "kind": "patch",
          "published_at": "2026-07-13T01:55:58Z"
        },
        {
          "tag": "v0.9.8",
          "kind": "patch",
          "published_at": "2026-07-02T02:49:19Z"
        },
        {
          "tag": "v0.9.7",
          "kind": "patch",
          "published_at": "2026-07-01T05:24:53Z"
        },
        {
          "tag": "v0.9.6",
          "kind": "patch",
          "published_at": "2026-06-24T02:53:35Z"
        },
        {
          "tag": "v0.9.5",
          "kind": "patch",
          "published_at": "2026-06-23T02:45:48Z"
        },
        {
          "tag": "v0.9.4",
          "kind": "patch",
          "published_at": "2026-06-19T07:36:30Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-06-02T01:49:18Z"
        },
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-06-01T02:33:56Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-05-21T09:17:17Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-05-21T06:22:48Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-05-20T08:09:03Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-05-20T04:23:46Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-05-20T02:44:18Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-05-19T11:43:20Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-05-19T09:32:40Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-05-19T09:08:08Z"
        },
        {
          "tag": "v0.6.11",
          "kind": "patch",
          "published_at": "2026-05-08T01:10:57Z"
        },
        {
          "tag": "v0.6.10",
          "kind": "patch",
          "published_at": "2026-05-07T06:54:39Z"
        },
        {
          "tag": "v0.6.9",
          "kind": "patch",
          "published_at": "2026-05-07T06:38:23Z"
        },
        {
          "tag": "v0.6.8",
          "kind": "patch",
          "published_at": "2026-05-06T08:00:25Z"
        },
        {
          "tag": "v0.6.7",
          "kind": "patch",
          "published_at": "2026-05-06T07:02:27Z"
        },
        {
          "tag": "v0.6.6",
          "kind": "patch",
          "published_at": "2026-04-29T06:39:16Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-04-28T04:28:27Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-04-28T04:28:28Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-04-28T04:30:21Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-04-28T04:30:12Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-04-28T04:30:13Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-04-28T04:30:14Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-04-28T04:30:16Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-04-28T04:30:17Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-04-28T04:30:18Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-04-28T04:30:19Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-04-28T04:30:20Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-04-28T04:33:07Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-04-28T04:33:08Z"
        },
        {
          "tag": "v0.3.7",
          "kind": "patch",
          "published_at": "2026-04-28T04:33:09Z"
        },
        {
          "tag": "v0.3.6",
          "kind": "patch",
          "published_at": "2026-04-28T04:33:11Z"
        },
        {
          "tag": "v0.3.5",
          "kind": "patch",
          "published_at": "2026-04-28T04:33:12Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-04-28T04:33:13Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-04-28T04:33:14Z"
        },
        {
          "tag": "v0.2.10",
          "kind": "patch",
          "published_at": "2026-04-28T04:33:15Z"
        },
        {
          "tag": "v0.2.8",
          "kind": "patch",
          "published_at": "2026-04-28T04:33:16Z"
        },
        {
          "tag": "v0.2.3",
          "kind": "patch",
          "published_at": "2026-04-28T04:33:17Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-04-28T04:33:18Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "70e7648fd8fdebd6e9877c136a9e40703f0d9468",
          "body": null,
          "is_bot": false,
          "headline": "release: 0.9.11 — 단일 명사 과분해 수리 (대박 캐시·의상실·의대), bump to 0.9.11",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-18T11:50:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a51c6fab252d1c3d0f38cb34f2aa963e36bf714c",
          "body": "- 어절 캐시 신규 2건: 실화냐→[실화,냐/EF], 추신수도→[추신수,도/JX]\n  (대박 캐시 교정의 문맥 커플링으로 밀리던 viterbi 랭킹을 캐시로 고정)\n- 9000문장 예측 diff: 개선 3문장(의대·실화냐·추신수도) 외 파급 0\n- v15k 0.9580 (R 0.9577→0.9578, SNS 0.9400), held-out 0.9100 무회귀\n- 실화냐 정확 분석 테스트 #[ignore] 해제 — 24 통과 (ignored 2는\n  기존 재순위 tradeoff만 잔존)",
          "is_bot": false,
          "headline": "fix(model): 대박 수리 tradeoff 2어절 캐시 추가로 해소 — 실화냐·추신수도",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-18T11:47:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3e0d5dcd2a912452ae8c969b62f0a57972f41cdd",
          "body": "- 어절 캐시 낡은 항목 대박→[대/XPN,박/NNG]를 [대박/NNG]로 in-place 교정\n  (0.9.10 supplement 5000은 사전만 고쳐 단독·문두 어절('대박 났다')이\n  계속 깨졌음 — 대/XPN+박/NNG 경로는 캐시에서만 생성 가능)\n- 의상실/NNG supplement 200: freq 3(cost 23.0)이 의/JKG+상실에 지던\n  저빈도 과분해 수리 (v15k 9000문장 예측 파급 0)\n- 의대/NNG supplement 480: suffix-충돌 제거가 사전 항목을 삭제하던\n  오폭 수리 (\n[…]\npp·뉴스 -0.01pp), held-out 0.9100 무회귀\n- 실화냐→실화+이/VCP 문맥 플립 tradeoff는 #[ignore] 분리, 회귀 가드\n  테스트 추가 (재순위 재학습 시 해결 대상)\n- 문두 J* 페널티(BOS 조사 시작 제약)는 연구 후 기각 — 이득 +0.01pp가\n  재순위 빔 파급과 등가 (research-history #38)",
          "is_bot": false,
          "headline": "fix(model): 단일 명사 과분해 3종 수리 — 대박 캐시 교정 + 의상실·의대 supplement",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-18T11:37:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bbbfed4103de2947337c4eec336fddcf7b2bba89",
          "body": "… 0.9575→0.9579), bump to 0.9.10",
          "is_bot": false,
          "headline": "release: 0.9.10 — 사전·코드북 커버리지 수리(대박·ㄷ불규칙 과거·구요) + nbest arena 최적화 (F1…",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-16T07:32:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61df059375b771a33efcea0dffb6d44047daf675",
          "body": null,
          "is_bot": false,
          "headline": "docs: 연구 이력 37 갱신 — 잠복 회귀 처리 결과 반영",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-16T07:25:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "decf9a768196f11b5c0687d2661f4812a909a443",
          "body": "- 대박/NNG 110→5000 (골드 7:1, '이거 실화냐 대박' 대/XPN+박 분해 수리 —\n  supplement 항목, v15k 0.9579 유지·SNS +0.03pp·held-out 0.9100 무회귀)\n- 갈리없는데·인가(認可) wrong-override 2건은 가드 차단이 순손실로 실측되어\n  (해당 플립 클래스가 v15k 순이익 +1.7/+1.66) ignore 주석으로 분리 —\n  재순위 재학습 시 해결 대상",
          "is_bot": false,
          "headline": "fix(dict): 대박 freq 보정으로 0.9.9 잠복 회귀 수리 + 잔존 재순위 tradeoff 2건 명시",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-16T07:24:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7510bdaaa824b828d08afb4422fd9d83670078a",
          "body": "…회귀 3건 문서화",
          "is_bot": false,
          "headline": "docs: 트랙③ Phase 0+1 기록 (연구 이력 37) — F1 95.8%, 모델 픽스처 분기 사고와 0.9.9 잠복 …",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-16T07:14:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eca490f06b15c7aa748589881a8ad719330247cc",
          "body": "…문학 +0.14pp)\n\n- ㄷ불규칙 분기에 었/었다 케이스 추가 (모음조화 포함). 듣·묻은 들다/물다\n  동형어 압도로 순회귀 실측되어 과거형 생성서 제외\n- 뒀=두+었 hardcoded 축약 추가\n- dump_arcs_batch 디버그 예제 추가 (래티스 커버리지 배치 측정용)\n- models/codebook.gmdl 픽스처가 0a36108 이후 처음 동기화됨 — 재순위 포함\n  모델 기준으로 integration 테스트 3건이 0.9.9부터 잠복 실패였음이 드러남 (별도 추적)",
          "is_bot": false,
          "headline": "feat(model): ㄷ불규칙 과거형 코드북 생성 (걷·싣·깨닫·일컫) + 뒀 축약 (v15k 0.9577→0.9579, …",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-16T07:11:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50c850dff9075c38209151567d7815bceedaa5a6",
          "body": "…freq bump (v15k 0.9575→0.9577, 기술 +0.22pp)",
          "is_bot": false,
          "headline": "feat(dict): 골드 검증 통과 항목 보강 — 최적화·감수성·장중·그쵸 supplement, 웹툰 NNG, 구요/EF …",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-16T07:05:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8080071e78a8e1eacbb60f961e9f49ae1280d95c",
          "body": "…held-out Kiwi 역전 기록",
          "is_bot": false,
          "headline": "docs: 연구 이력 36 — 재순위 feature v2 No-Go (surface feature 정보 한계 확정), 구어 …",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-16T06:44:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25b7a96875f1dc7c5b222968ced34678ae9720dc",
          "body": null,
          "is_bot": false,
          "headline": "build: WASM 리빌드 — nbest DP arena (raw 401KB, gzip 172KB)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-16T06:29:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37a1d68127d50ab966d9eaf00efe6f982cd44b85",
          "body": "…가속, byte-identical)",
          "is_bot": false,
          "headline": "perf(core): viterbi_nbest DP를 stride arena로 교체 — state별 힙 할당 제거 (~3% …",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-16T06:29:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6770d5e4ade2e1204f417817b06ae7751bdfb60e",
          "body": null,
          "is_bot": false,
          "headline": "docs: npm version 서브디렉토리 태그 미생성 함정 기록 (수동 태그 절차)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-13T01:55:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89cda5f5942cd8a55d31526febdf7b368478e058",
          "body": "… 0.9.9",
          "is_bot": false,
          "headline": "feat: 문맥 재순위 perceptron 도입 (v15k F1 0.9575, held-out 0.9100), bump to…",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-13T01:55:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f6e1761361270a7c75419f632baebae5ea922e9",
          "body": null,
          "is_bot": false,
          "headline": "docs: 재순위 perceptron 채택 반영 — F1 95.7%, 모델 1.4MB, WASM 399KB, 연구 이력 34",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-13T01:46:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10995fe6f27e8c9ec7445a4bd799d5412c202c55",
          "body": null,
          "is_bot": false,
          "headline": "build: WASM 리빌드 — 재순위 perceptron 포함 (raw 399KB, gzip 172KB)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-13T01:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a1df180f5f19cdbe5240190a30780d52ebdb589",
          "body": "… 구어 held-out 0.9010→0.9100)",
          "is_bot": false,
          "headline": "feat(model): 재순위 perceptron 가중치 Section 14 탑재 (v15k F1 0.9544→0.9575,…",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-13T01:43:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "422045aa9655843559a270decda969c56184bf1c",
          "body": "…(k=10 37% 가속, byte-identical)",
          "is_bot": false,
          "headline": "perf(core): viterbi_nbest state별 비용 hoist + rank 루프 조기종료 + 무할당 DP 접근 …",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-13T01:38:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6d7d50e0bf0b7aa47ff94fa57d584d363f9a568",
          "body": null,
          "is_bot": false,
          "headline": "docs: GMDL Section 14 재순위 perceptron 문서화 (미채택 상태)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-13T01:29:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10a0c86321ea54aac67437fc1971d710599b5e19",
          "body": null,
          "is_bot": false,
          "headline": "feat(core): N-best 재순위 perceptron 지원 (GMDL Section 14, 섹션 없으면 무동작)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-13T01:28:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62d79d399af84a32864a8825bb26949e51684cc3",
          "body": "…in/sim)",
          "is_bot": false,
          "headline": "feat(training): NIKL 재순위 perceptron 학습 파이프라인 (prep/feature/train/marg…",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-13T01:12:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f66c7e6a5f582201d2b6f701e6eff9c3176660d",
          "body": null,
          "is_bot": false,
          "headline": "release: 0.9.8 — 후처리 룰 5종 + 무손실 속도 2.35× (F1 0.9528→0.9544)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:48:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc3b882a9c819eb876b4828568d7fd4fd9a07210",
          "body": null,
          "is_bot": false,
          "headline": "docs: F1 95.4%·WASM 391KB·held-out 평가 반영, 연구 이력 31-33 추가",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:43:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18220da7e012022800beca1ad06e2632a809360a",
          "body": "크기 최적화(opt-level=z)가 문장당 분석 속도의 최대 병목이라 속도 최적화로\n전환. 출력·정확도 불변(v15k F1 0.9544 유지, WASM/native 9000문장 byte-identical),\ncargo test 전체 통과. WASM 리빌드 포함.\n\nWASM 크기: raw 341,351→391,029 (+14.6%), brotli 111,920→121,172 (+8.3%, +9KB).",
          "is_bot": false,
          "headline": "build: 릴리스 opt-level z→3 + wasm-opt -Oz→-O3 (속도 우선)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:35:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a57c1fd05ee2a991c5d3a9b6972dff38eb33d434",
          "body": "내부 Viterbi 루프에서 (arc × start-state)마다 String 해싱으로 word_bigrams를\n조회하던 것을 arc당 1회로 hoist하고, 모듈 HashMap을 기본 SipHash 대신\n인라인 FxHash 해셔로 교체. 핫패스(word bigram·DP 상태) 해싱 비용 제거.\n\n출력 불변: v15k 9000문장 analyze_batch --json byte-identical, F1 0.9544 유지.\ncargo test 전체 통과.",
          "is_bot": false,
          "headline": "perf(core): word_bigram 조회를 arc당 1회로 hoist + FxHash 해셔로 교체",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:33:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6246349741cb6d38de07a893de506c5af3bceece",
          "body": "모음 명사 뒤 영형태 계사(최고다=최고/NNG+이/VCP+다/EF)를 삽입.\n야는 계사(최고야)와 호격(철수야)이 동형이라 제외. v15k F1 0.9543→0.9544.",
          "is_bot": false,
          "headline": "feat(codebook): 명사+다/JX 어절끝을 현재계사 이/VCP+다/EF로 복원 (fix_present_copula)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:27:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06bb26ee26bb584d75d1ba088b8647b8fed0eb1f",
          "body": "이거든요(이/VCP+거든/EF+요)·그때거든요(NNG+거든+요) 등 계사 생략 구어 패턴을\n병합하도록 stem 조건 완화. 구(양립 15:8)·는데(분리 우세 1:6)는 제외 유지.\nv15k F1 0.9541→0.9543.",
          "is_bot": false,
          "headline": "feat(codebook): 요/JX 병합의 stem 가드에 계사-생략 명사·VCP·EC 추가 (fix_yo_jx_merge)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:27:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5e5f4cf65fe5ac1ac70069ee4cd2560dd6fa61a",
          "body": "…크립트)",
          "is_bot": false,
          "headline": "feat(training): NIKL 2025 구어 held-out 평가셋 도입 (2025→2021 역변환기 + eval 스…",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:27:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "008762d622a9e3031d5f63c7edb461e7969b0aea",
          "body": null,
          "is_bot": false,
          "headline": "feat(codebook): 절/VV+는 오분석을 대명사 저/NP+는/JX로 복원 (fix_jeoneun_np)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:27:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41edecbbe17a2e440b6b691f3377a43261d54153",
          "body": "축약 존대 종결어미(주세요=주/VV+세요/EF)를 골드 컨벤션(단일 EF 47:0)에 맞춰 복원.\n-시- 분리 원칙(드시=들+시)과 무충돌. v15k F1 0.9534→0.9538.",
          "is_bot": false,
          "headline": "feat(codebook): 시/EP+아요류를 융합 종결어미 세요/으세요 EF로 병합 (fix_seyo_merge)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:15:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18274c450ec3193c770f1b578c8dbcdd61e5f052",
          "body": "래티스가 관형사를 용언+관형형어미로 분해하는 것을 골드 컨벤션(단일 MM)에 맞춰 복원.\nETM ㄹ/는 및 색채어·한 제외. v15k F1 0.9528→0.9534.",
          "is_bot": false,
          "headline": "feat(codebook): 그렇/VA+ㄴ류를 관형사 그런/이런/저런/어떤 MM으로 병합 (fix_geureon_mm)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T02:14:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a26126799114344f9d8ce5da7d70492d828b2be1",
          "body": null,
          "is_bot": false,
          "headline": "docs: NIKL 2025 천장 측정 결과 기록 (kiwi 0.8165, 2025 점수 목표 금지)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T01:07:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a54d209916d8e14327220273cfe302bedc66fd4",
          "body": null,
          "is_bot": false,
          "headline": "docs: README 상단에 npm·스타 뱃지 추가",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T00:58:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a3d7a691643531cb2a947137ed0a7c0dbab8933",
          "body": null,
          "is_bot": false,
          "headline": "docs: README에 Star History 차트 추가",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-02T00:48:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c471c0310669e3b5b3ccd29f9c180f8865326b40",
          "body": "0.9.6 이후 분석 정확도 개선:\n- 불규칙 활용 과거형·존댓말 코드북 복원 (ㅂ/ㅅ/ㅡ 탈락 + 으시)\n- 인용격조사 JKQ 후처리 (닫는 따옴표 직후 고/라고/이라고)\n- 절단 코드북 키 표면환각 방지 (로드 시점 정합성 필터)\n- OOV 한자 → SH + 연속 한자 SH span 병합\n- 수사/수관형사 뒤 분류사 → NNB 승격 (23종)\n- 명사 뒤 계사 이었다를 잇다로 오분석하던 버그 교정\n\nCargo core/wasm 0.9.7 + WASM 리빌드 + tsc. 하드코딩 수치 동기화\n(F1 95.3%, accuracy 0.953, NIKL 93.9%). base.gmdl 1,039,020 bytes.",
          "is_bot": false,
          "headline": "release: 0.9.7 — 동형이의·불규칙·기호 분류 개선 6건 (F1 0.9514→0.9528)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T05:23:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71d26dfb4940099abd18ef4befa8956987d310cb",
          "body": "fix_it_copula 추가로 analyze 24→25·analyze_topn 34→35. model.rs Analyzer가\nanalyze_topn만 쓰므로 analyze에만 등록하면 무발동하는 함정 문서화.",
          "is_bot": false,
          "headline": "docs: fix_* 체인 개수 갱신(25/35) + model.rs=analyze_topn 함정 명시",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T05:10:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b94c4f7f10c9227681606ea73e35588467e8d41e",
          "body": "형이었다(형 + 이/VCP + 었 + 다) 어절을 잇다(연결)+었다로 오분석하던\n동형어 버그. 잇/VV + EP 후행 + 같은 어절 명사 선행 3중 가드로 계사만\n교정 — 실을 이었다(독립 어절 연결동사)·맛잇어(EC)는 유지. 골드\n잇/VV+EP=0 vs 이/VCP+EP=89라 반례 없음. analyze/analyze_topn 양 체인에\n추가(N-best 체인 누락 시 무발동). v15k F1 0.9528 무회귀, 전 테스트 통과.\n코어 변경이므로 배포 시 WASM 리빌드 필요.",
          "is_bot": false,
          "headline": "feat(codebook): 명사 뒤 잇/VV+EP를 계사 이/VCP로 교정 (fix_it_copula)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T05:09:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e5298bd107db28831eb47adb757bd493800f968",
          "body": "fix_nnb에 수치 분류사 분기 추가 — SN/NR/수관형사(한·두·세…) 뒤의\n분류사(년·일·명·원·시·번·권 등 골드 ≥90% NNB 화이트리스트 23종)를\nNNG/XSN/NNP→NNB로 교정. 숫자 뒤 미발동이던 시/NNB 문서화 구멍 해소.\n애매 분류사(대·점·세·조·시간)와 일반 관형사(새·그·각) 제외.\nv15k F1 0.9527→0.9528, 전 도메인 무회귀, 전 테스트 통과.\n코어 변경이므로 배포 시 WASM 리빌드 필요.",
          "is_bot": false,
          "headline": "feat(codebook): 수사 뒤 분류사 NNB 승격 (fix_nnb 확장)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T05:02:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a57659aff18c82181ccd2cae89c4864910704c3",
          "body": "classify_oov_char의 CJK 표의문자를 NNG→SH로 변경 (골드 컨벤션: SH 89건\nvs NNG-한자 1건). 연속 한자를 merge_sl_sn_tokens에서 하나의 SH span으로\n병합 (公海·善意·大國往事·湯問篇 등 골드 다음절 SH 30건, contiguous-separate\n巨野 1건뿐이라 30:1 net positive). paper.md가 이미 문서화한 SH(한자) OOV\n폴백과 코드 정합. v15k F1 0.9518→0.9527 (+0.09pp), 전 테스트 통과.\n코어 변경이므로 배포 시 WASM 리빌드 필요.",
          "is_bot": false,
          "headline": "feat(codebook): OOV 한자를 SH로 분류 + 연속 한자 SH span 병합",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T04:55:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "619914d596e567e1aae157d31d364cd791a250b7",
          "body": "Strategy C 국소 가드(b5b4989)를 대체 — parse_suffix_codebook에서 로드 시\nsuffix_analysis_stem_fits로 stem 접두 표면 > 키 길이인 analysis를 제거.\n접미사 코드북 sourced 절단 아크를 A2/A3/C 모든 strategy에서 일괄 차단\n(골드 스캔 11588→590, 잔여는 content_dict 조합·별개). stem은 어미로 축약될\n뿐 확장 안 되므로 초과=truncated key. v15k F1 0.9518 무회귀, 전 테스트 통과.",
          "is_bot": false,
          "headline": "fix(codebook): 절단 코드북 엔트리를 로드 시점에 제거 (P0 근본 완결)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T04:33:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0411f4a9df52555c757a19ffb768a67e1433bf89",
          "body": null,
          "is_bot": false,
          "headline": "docs: 절단 코드북 키 표면환각 함정 + 가드 문서화",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T04:26:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5b4989e18a79664851099a7db39f544ba39933e",
          "body": "접미사 코드북에 키 표면 ≠ 재구성 표면인 절단 엔트리(배→[배우,었],\n표→[표,하,었], 확대→[확대,되,었])가 있어, Strategy C가 이를 span을 넘는\n아크로 주입 → '2.2배다.'가 '배출/하/았/다'로 분석되는 등 출력 표면이 입력과\n불일치. stem 접두(첫 어미 전까지: 내용+하/되 XSV·계사 이)의 표면 길이가\nspan을 넘으면 스킵하는 가드 추가. stem은 어미로 축약될 뿐 확장되지 않으므로\nspan 초과는 불가능.\n\nv15k F1 0.9517→0.9518(무회귀), 통합테스트 추가. 재현: 2.2배다.·3배다.",
          "is_bot": false,
          "headline": "fix(codebook): 절단된 코드북 키로 인한 표면 환각 방지 (정합성 버그)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T04:26:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10b9ce590852a84ed215ed16205a60947e8563cc",
          "body": "rule 2를 적/XSN 단일에서 파생접미사 화이트리스트(적·성·화·권·율·률·치·급·\n층·력·계·생·상·형·님·별)로 일반화. 2025 병합률 ≥0.9 접미사만, 굴절 XSN(들 등)\n제외. 병합형 POS는 gold 95.5%가 NNG. garu가 XSN으로 태깅한 것만 병합해 대칭·무위험.\n2025 garu 0.8760→0.8806, 2021 0.9357→0.9363. 단위테스트 4개 추가.",
          "is_bot": false,
          "headline": "feat(eval): NIKL 2025 정규화에 파생접미사 XSN 병합 확장 (적→16종)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T02:12:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02c59c057b28f92a9b5e57678b54a94202d7ecfc",
          "body": "2025는 보조용언 되(게 되다)를 VX(~48%)로 구분하나 2021/gold는 VV로 병합\n(2021 되/VX ×4≈0, gold ×0). 분석 오류가 아닌 컨벤션 시프트라 양쪽 canonical(VV)로.\n2025 garu 0.8741→0.8760, 2021 garu 0.9357 불변. 단위테스트 4개 추가.",
          "is_bot": false,
          "headline": "feat(eval): NIKL MP 2025 정규화에 되/VX→VV canonical 추가",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T01:59:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e91b5f2419af9ed5cc3092a6ab672b71189acdd5",
          "body": "저빈도 인용동사 문맥에서 트라이그램이 직접인용 고/EC로 오분석하던 것을\nfix_quote_jkq로 보정. 닫는 따옴표(SS)에 붙은 고/라고/이라고를 JKQ로,\ncopula-split(이/VCP+라고/EC)은 이라고/JKQ로 병합. 양쪽 체인 등록.\n\nv15k JKQ recall 0.930→1.000 (FN 6→0), 전체 F1 0.9516→0.9517.\n골드 반례 0 (SS+고/라고/이라고은 항상 JKQ). 단위테스트 5개.",
          "is_bot": false,
          "headline": "feat(model): 인용격조사 JKQ 후처리 — 닫는 따옴표 직후 고/라고/이라고 교정",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T01:58:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a36108cd2d6dc8223e6f8c73ae08626f6771f59",
          "body": "augment_irregular_conjugations가 일부 어미만 펼쳐, 불규칙 어간의 과거형·\n존댓말이 어절 통째 NNG로 붕괴하던 문제 해결:\n- ㅂ불규칙 `었` 분기 추가: 추웠다=춥+었, 무거웠다=무겁+었 (곱/돕은 왔)\n- ㅅ불규칙 분기 신설(IRREG_SIOT_STEMS 짓/젓/긋/낫/붓): 저었다=젓+었.\n  잇은 계사 이었다 충돌 회피로 제외\n- ㅡ탈락 `었` ㅆ-병합 버그 수정: 아프+었다 → 아팠다 (기존 아파었다 생성)\n- augment_irregular_honorific 신설: ㅂ/ㄷ/ㅅ 어간+으시 어절 복\n[…]\n미 ~99%였으나 과거형은 코드북 수록률 3~19%로 대량 누수던 것.\nv15k F1 0.9514→0.9516 무회귀. 정칙 ㅂ(좁았다)·계사(이었다) 과대생성 무해\n확인. 회귀 가드 test_irregular_restore.py (과거6·존댓말4·정칙가드3).\n\n모델 리빌드 포함(gzip 1004→1015KB). Rust 무변경이라 WASM 리빌드 불요.",
          "is_bot": false,
          "headline": "feat(model): 불규칙 활용 과거형·존댓말 코드북 복원 (ㅂ/ㅅ/ㅡ탈락 + 으시)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T01:35:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ca65b65fb7db5417c77d66b9c82e8cbac691ed62",
          "body": "normalize_for_2025에 두 대칭 규칙 추가 (gold·pred 동일 적용):\n- 적/XSN: (NNG|NNP|XR)+적/XSN → X적/NNG. 2025 gold는 X적을 단일 NNG로\n  매김(×2063)·2021은 분리(적/XSN ×5885) → 병합 방향이 캐노니컬.\n- 인용: EF+{고/JKQ·며/EC·는/ETM} → 다고/다며/다는(EC/ETM) 병합, 직접인용\n  라(고)/이라(고)/JKQ는 canonical 라고/라며/라는으로. 간접 복사문은 2025가\n  이/VCP+라/EF+고/JKQ로 계사를 별토큰 유지\n[…]\n에서 회귀-안전\n(2021은 EF+clitic 인접이 없어 near no-op).\n\n측정(n=2000, seed=42, garu): 2021+norm 0.9354 불변 / 2025 0.8618→0.8741.\n잔차 진단: 적/XSN FP 127→4, 고/JKQ FN 132→5. 되/하 VX↔VV·구어 그/IC는\n진짜 차이라 미정규화. 단위테스트 21개 추가.",
          "is_bot": false,
          "headline": "feat(eval): NIKL MP 2025 정규화에 적/XSN 병합 + 인용 EF+고·며·는 병합 완성",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-07-01T00:16:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6e07a17e2673e2927ce54bd30eaa73dc554dda1d",
          "body": null,
          "is_bot": false,
          "headline": "docs: CLAUDE.md 벤치마크에 NIKL 2025 컨벤션 함정·--norm-2025·kkma gotcha 반영",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-30T23:41:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b275cb06b820b79b750c3f9166343712b6803bb",
          "body": "- 데이터 경로 NIKL_MP_DIR env override (기본 ~/workspace/data/nikl_mp_2021), 하드코딩 파일명 → *.json glob (12개 학습/평가 스크립트)\n- 2025 스키마 대응: 형태소 배열 키 MP/morpheme 양쪽 호환\n- eval_nikl_mp --norm-2025: 2025의 거친 분절을 gold·pred에 대칭 정규화 (명사/어근+XSV/XSA 병합, _복합어 un-join). 입력 _→공백\n- 효과: 2021 채점 불변(0.9373→0.9355), 2025 0.8045→0.8618. 잔차(적/XSN·인용 고/JKQ)는 후속\n\nCo-Authored-By 없음 — 프로젝트 규칙",
          "is_bot": false,
          "headline": "feat(eval): NIKL MP 2025 코퍼스 지원 + 분절 컨벤션 정규화 레이어",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-30T23:40:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56936ae605d1781ad05ed2bdf006fc35f85ce316",
          "body": null,
          "is_bot": false,
          "headline": "chore: 통합패키지 0.4.1 — description 수치 정정(1.9MB→1MB) 반영 republish",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-24T02:54:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f17084f654e1c11877519365a5f3a19bdceba223",
          "body": "…4 동일)",
          "is_bot": false,
          "headline": "release: 0.9.6 — README FAQ + npm 키워드/통합패키지 설명 정비 (메타데이터 패치, F1 0.951…",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-24T02:53:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5c90cfb72b0bd4db60bf7cf93c7d7b5a11ff56b",
          "body": null,
          "is_bot": false,
          "headline": "docs: AI 검색 노출용 README FAQ 추가 + 통합패키지 설명 수치 정정(1.9MB→1MB) + npm 키워드 보강",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-24T02:32:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "66e58d23fcb7cc2fe3c6bd654c01c3e731eee9c0",
          "body": null,
          "is_bot": false,
          "headline": "release: 0.9.5 — WASM 리빌드 + CHANGELOG (문맥 POS 규칙·골드 정정, F1 0.9514)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-23T02:45:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4cb78a48c53e870721c20bf7d7ddcf490eb28c9",
          "body": "연구로 확정한, 골드 다수·표준국어대사전·Kiwi 근거의 클린 규칙만 반영:\n- 하/VV → VX: 어야/아야 + 하 (…해야 한다 의무 보조용언, fix_vx 확장)\n- 하/XSV → XSA: 형용사 어근 44개 ADJ_ROOTS 추가 (미안/깔끔/복잡/당연 등)\n- 시/NNG → NNB: 명사+시 의존명사 \"~할 때\" (fix_si_dependent_noun)\n- 시간명사 오늘/어제/지금: 조사앞 NNG, 그 외 MAG (model.rs R1/R2 교정)\n  기존 R1이 오늘이→MAG, R2가 어제→NNG로 오분류하던 것 수정. 내일→NNG 유지\n\n골드 27건 정정: 해야한다 하 VV→VX 16건(골드 오라벨), 시간명사 컨벤션 11건.\n골드 F1 0.9501 → 0.9514. 전 테스트 통과. 문서 수치 동기화(95.1%, accuracy 0.951).\n그렇게/그래·거↔것·하 after 게/도 등은 골드가 분해/양방향 선호라 의도적 제외.",
          "is_bot": false,
          "headline": "feat: 문맥 POS 클린 규칙 4종 + 시간명사 컨벤션 교정 (F1 95.1%)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-23T02:34:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e5108753b0871559a5e39e0f040d4a23ec97292",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix_geuraeseo_maj 추가에 따른 fix_ 체인 개수 갱신 (22/32)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-23T01:59:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4cd8cfc38102e628e6d013910ab57e87528ff4fd",
          "body": "- gold_testset: 뉴스 148건 빈 morphemes 복원 (선택:kiwi 109→Kiwi, 선택:garu 39→garu).\n  빈 골드가 garu 토큰을 전부 FP로 처리해 precision을 0.949→0.925로 왜곡하던 문제 제거\n- ep_norm: 곡선↔직선 따옴표 통일(SS 계열) — 입력 보존 vs 골드 정규화 혼재 측정 갭 보정\n- codebook: fix_geuraeseo_maj — 그래서/그래도(그렇VA+아서/아도) → MAJ 어휘화.\n  골드 다수 컨벤션(그래서 94:5, 그래도 10:1). 그렇게/그래는 골드가 분해 선호라 제외\n- 골드 F1 0.9368 → 0.9501 (대부분 골드/측정 보정, 그래서 코드 기여 +0.013pp)\n- 문서 F1 수치 동기화(95.0%) + modelInfo accuracy 0.937→0.950. NIKL MP 93.7% 유지",
          "is_bot": false,
          "headline": "feat: 골드 빈 morphemes 148건 복원 + 따옴표 정규화 + 그래서/그래도 어휘화 (F1 95.0%)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-23T01:58:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "690bfe58eb538b405d8c251dc794d28d30e1929e",
          "body": "- frame(빈 테두리)+불릿 → box(파스텔 hachure 채움)+중앙 라벨, 어휘자원은 cylinder\n- 제목·부제·라벨 화살표 추가, 단일 cream 시트로 정리 (paper-1.png)\n- README·paper.md를 <picture>(light/dark) → 단일 <img>, 구 light/dark png 제거",
          "is_bot": false,
          "headline": "docs: 아키텍처 다이어그램 채움 박스 스타일로 재작업",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-19T08:11:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f9209e90172b2582cdb9a55dac6e065db318d9f",
          "body": "- README API Reference에 garu.nouns() 항목 추가 (js/README·코드와 일치)\n- 아키텍처 다이어그램을 rough.js 편집 소스(docs/paper-1.html)로 재작성, 파일명 유지로 README·paper.md 자동 반영\n- 내용 현행화: 래티스에 활용형 재구성 불릿, 후처리에 NNG-hint 225개 명시\n- 다크 모드 입출력 pill을 solid 채움+고정 라벨로 가독성 수정",
          "is_bot": false,
          "headline": "docs: README nouns() API 추가 + 아키텍처 다이어그램 편집소스화·현행화",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-19T08:03:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "601adff17b000c7cb02c790f6d087b8f1384288b",
          "body": "- 동형이의에 가린 동사 어간 dual-POS 주입 (박/팔/추 등 15개): 박았다→박/VV+았+다\n- 모음축약 활용형 재구성 A3v: 권했다→권하+았, 비쳤다→비치+었, 권해서→권하+아서\n- 골드 v15k F1 0.9364→0.9368 (회귀 없음). base.gmdl 1,030,352 bytes\n- WASM/TS 리빌드, 하드코딩 F1 수치 93.6→93.7% 동기화",
          "is_bot": false,
          "headline": "feat: 복합·동음이의 분석 개선 (박/VV 클래스 + 축약 A3v), bump to 0.9.4",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-19T07:36:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1d299493daf14e3bc0df93211968c767a22a81f",
          "body": "A3v에 현재·연결형(jongseong 0) 추가. 권해서→권하/VV+아서,\n비쳐서→비치/VV+어서, 잊혀→잊히/VV+어 등 교정.\n단음절 해→하/VV·펴→피/VV 노이즈는 prefix_len>=2 가드로 차단\n(해/NNG·올해/NNG 명사 읽기 보존 확인).\n골드 F1 0.9365→0.9368 (precision 0.9246→0.9249, recall +0.0003,\n7개 도메인 중 6개 상승). cargo test 24 pass.",
          "is_bot": false,
          "headline": "feat(lattice): A3v 현재/연결형 모음축약 확장 (해→하+아, ㅕ→ㅣ+어)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-19T07:25:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "477b0d489b17c13e1019d67cb11ea3cee9894bb4",
          "body": "다음절 술어 어간의 축약 과거형이 NNG span으로 붕괴하던 문제 수정.\nA3(종성분리)는 했→해/렸→려로 모음을 안 풀어 진짜 어간(하/리)을 못 찾음.\nA3v가 어간 끝모음 복원 후 앞 음절에 병합해 VV/VA/VX 사전 조회.\n권했다→권하+았+다, 비쳤다→비치+었+다, 뿌렸다→뿌리+었+다 등 교정.\n골드 F1 0.9364→0.9365 (무회귀, precision 0.9244→0.9246). cargo test 24 pass.\n\n과거형(jongseong ㅆ)만 처리 — 현재/연결형(권해서/비쳐서)과 ㅒ/ㅖ 어간은\n회귀 위험·심각도 고려해 제외.",
          "is_bot": false,
          "headline": "feat(lattice): 모음축약 과거형 재구성 A3v (했→하+았, ㅕㅆ→ㅣ+었)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-19T07:21:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd81603b9c778b171c54b205bc26645bc0dfa07a",
          "body": "content_dict가 명사 POS만 담아(사전은 단어당 2 POS pack) 동사 읽기가\n생성조차 안 되던 어간을 HOMOGRAPH_VERB_DUAL로 secondary POS 강제 주입.\n박았다→박/VV+았+다, 팔았다→팔/VV+았+다 등 교정. 골드 F1 0.9364 무회귀.\n\n- build_codebook_model.py: HOMOGRAPH_VERB_DUAL 15개(박/팔/추/패/젖/빌/널/\n  파/번지/비치/반기/내치/망치/우기/배우). 명사 primary 보존, freq 보수적.\n  고빈도 한자어 단음절(주/사/서/자/적/비)은 명사 회귀, 축약 과거형 전용\n  (재/뿌리/조이=쟀다/뿌렸다/조였다)은 모음축약 재구성 갭으로 무효과 → 제외.\n- find_missing_verb_stems.py: 후보 조사 (Garu collapse vs Kiwi VV/VA+어미)\n- examples/dump_arcs.rs: raw lattice 아크 비용순 덤프 디버그 바이너리",
          "is_bot": false,
          "headline": "fix(dict): 동형이의에 가린 동사 어간 dual-POS 주입 (박/VV 클래스)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-19T06:48:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5395749dfad1b75671628fd77f9466af063551a9",
          "body": null,
          "is_bot": false,
          "headline": "docs(claude): 문서 자동 갱신 규칙 추가 (지시 없이도 변경 시 동기화)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-10T04:35:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b32ad19481937bf82951e8b317eee33c6ed21464",
          "body": "- WASM 크기 332KB → 337KB (실제/논문과 통일)\n- 거짓 배타 주장 스코프: \"세계 최초\"→\"가장 가벼운(1MB)\", 브라우저 실행 \"유일\"은 초경량 축으로 한정\n- 경쟁사 \"서버/네이티브 전용\" 프레이밍 완화 (WASM 포트 존재)\n- 마케팅 본문의 Kiwi·MeCab·Komoran 직접 언급 제거\n- 비교표: 40~50MB→수십 MB, \"npm 없음\"→\"모델 번들: 별도 로드 vs npm 포함\"\n- 결정적 디코더 설명에 문장 N-best 명시",
          "is_bot": false,
          "headline": "docs(readme): 수치·포지셔닝 정합화 (paper 개정 반영)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-09T05:00:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "231b4778ff67d31a72002ab86cff33e90eedd07c",
          "body": "- 다이어그램을 docs/paper-1-*.png(신규)로 교체\n- 구 다이어그램 docs/light.png·dark.png 삭제",
          "is_bot": false,
          "headline": "docs(readme): 아키텍처 다이어그램을 현행 파이프라인 버전으로 교체",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-09T04:53:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5951a3d89285502d19427546cd7e60b42788d714",
          "body": "- F1 93.6%(gold v15k)/93.7%(NIKL MP), 모델 1.0MB(brotli q=11), WASM 337KB로 통일\n- CNN 폐기 반영: 도입 후 제거, POS 보정은 distill 규칙으로만 잔존\n- ep_norm 평가 보정 절 추가 (보정 후 Kiwi 95.2% 우위로 정정)\n- Kiwi 아키텍처 통계 LM(KnLM)+Skip-Bigram로 정정, MeCab ~28MB\n- 관련 연구(kiwi-nlp/mecab-ko-wasm/khaiii.js) 비교 추가\n- 포지셔닝을 \"초경량 WASM 번들 유일\"로 한정\n- 3.1절 ASCII 파이프라인을 다크/라이트 다이어그램 이미지로 교체",
          "is_bot": false,
          "headline": "docs(paper): 논문 전면 개정 — 현행 수치·포지셔닝 정정 및 다이어그램 이미지화",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-09T04:53:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f1fb3ed8f94635ad0f0cedb7bd9f522daa3cdde",
          "body": "…lize 추가)",
          "is_bot": false,
          "headline": "docs(claude): JS/TS 진입점 맵 갱신 (index.ts→core/browser/node, nouns·norma…",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-02T02:18:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d136bf24d11af574873bb504672ad984e3f1b5d4",
          "body": "- analyzer-internals.md: codebook.rs 아크 출처(사전/코드북/캐시/재구성 전략),\n  viterbi vs nbest 불일치, fix_* 체인이 analyze/analyze_topn에서 다른 점, 디버깅 방법\n- morphology-conventions.md: 표준국어대사전 우선 원칙, 높임 -시- 분리(기본형↔보충법),\n  ㅂ불규칙 모음조화, 으시 OOV, ep_norm (개인 메모리에서 repo 공용으로 이관)\n- CLAUDE.md 인덱스 2줄 추가",
          "is_bot": false,
          "headline": "docs(claude): analyzer-internals + morphology-conventions 추가",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-02T02:14:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d2ad41f5c17fecd423540e3158a62f9136f7b59",
          "body": "modelInfo 0.94 / README 93.29% / CLAUDE.md 93.6% 3중 불일치를 실측(0.9364) 기준\ncanonical 93.6%로 통일. js/src/core.ts accuracy 0.936, README/js/README 93.6%.\nrelease.md의 불일치 경고 문구를 canonical 동기화 안내로 교체.",
          "is_bot": false,
          "headline": "docs: F1 헤드라인 수치 통일 93.6% (modelInfo accuracy 0.936)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-02T02:07:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5213321e94378fbe5f004baddde2aaafa2b18f3c",
          "body": "배포 전 cargo test + 골드 F1 측정(회귀 확인) 선행 단계 명시.\nF1/모델크기 변경 시 손으로 갱신할 하드코딩 위치 표로 정리\n(core.ts modelInfo.accuracy, README ×2, js/README, CLAUDE.md, CHANGELOG).\n현재 수치 불일치(0.94/93.29/93.6/실측 0.9364) 경고도 기재.",
          "is_bot": false,
          "headline": "docs(release): 배포 전 F1/골드 검증 + modelInfo·README 수치 동기화 단계 추가",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-02T02:04:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "db76bd676a0975162d277e9f422659b2ccfc9dde",
          "body": "…-history)\n\n- 릴리스 절차·통합 패키지 동기화 → docs/claude/release.md\n- GMDL 섹션 구성·학습 파이프라인 → docs/claude/model-build.md\n- 연구 이력 30항목 + 폐기된 CNN 모델 테이블 → docs/claude/research-history.md\n- CNN 폐기 반영: 파이프라인 다이어그램/cnn.rs 참조/CNN 재순위 모델 섹션 제거\n- 각 doc 첫 줄 '> 언제 읽나' trigger + CLAUDE.md 인덱스 한 줄 포맷 (blog 컨벤션)\n- 195줄 → 75줄",
          "is_bot": false,
          "headline": "docs: CLAUDE.md lean화 + docs/claude/ 분할 (release/model-build/research…",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-02T02:02:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90e51c3d829c4a63ac9edffb410475feb1702e61",
          "body": null,
          "is_bot": false,
          "headline": "chore: 0.9.3 — ㅂ불규칙 모음조화 + 드시다 높임 분해/으시 OOV (issue #4, #5)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-02T01:48:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe0b6e7c9da915691e9f51ee9666682e121818a6",
          "body": "표준국어대사전 기준 '드시다'는 표제어 미등재 → 들다(먹다의 높임 특수어휘)\n+ 주체높임 선어말어미 -시-. 따라서 들/VV + 시/EP로 분해해야 한다(가다→가시다와\n동일 원리). 보충법 높임(주무시다/계시다/잡수시다)은 기본형 *주무다/*계다가\n없어 표제어로 등재되므로 통째 유지.\n\n- codebook: fix_deusi_honorific 후처리 추가. 드시/VV → 들/VV + 시/EP (동음이의어\n  없어 무조건 분해). analyze/analyze_topn 양쪽 적용.\n- build_codebook_model: augme\n[…]\nnorific에 ㄴ/ㄹ 병합 으시 어미 추가\n  (으신다/으신/으실/으신다고/으신데/으신지/으실까/으실래/으신다는).\n  잡으신다·앉으신다·읽으신다·찾으신다가 단일 NNG로 붕괴하던 OOV 해소.\n- gold: 드시/VV 10건을 들/VV+시/EP로 동기화, reason 5건 정정.\n- F1 0.9364 무회귀, 단위테스트 44개 통과. 모델 1005KB.",
          "is_bot": false,
          "headline": "feat(honorific): 드시다=들+시 분해 + 자음어간 으시 OOV 수정 (표준국어대사전 기준, issue #4)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-02T01:39:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0c32cafa53beb6055a7b7a7c6f2eb7a9b9c09c61",
          "body": "모음조화 후처리가 어간의 표기상 끝모음(ㅏ/ㅗ)만 보고 EC/EF 어미를\n어→아로 변환해, ㅂ불규칙(ㅂ→우)에서 아름답+어가 아름답+아로 깨짐.\n\n표면형으로 정규/불규칙 ㅂ를 구분(정규는 표면이 어간을 그대로 포함:\n잡아⊃잡, 불규칙은 ㅂ가 우/오로 흡수돼 미포함: 아름다워⊅아름답)하여\n불규칙만 어를 유지. 단음절 곱/돕은 와/왔(아/았)로 예외 처리.\n\n- 교정: 아름다워/새로워/반가워/외로워/괴로워/가까워/차가워(+어서/어요)\n- 보존: 정규 ㅂ(잡아/좁아/잡았다), 곱/돕(도와)\n- F1 0.9363(norm)/0.9141(raw) 무회귀, 단위테스트 44개 통과",
          "is_bot": false,
          "headline": "fix(codebook): ㅂ불규칙 용언 모음조화 어미 교정 (아름다워→아름답+어, issue #5)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-02T01:29:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87d92f15d8f63053604e1423b6d89a2d87b179d4",
          "body": "2음절 저빈도 어간 FST 누락(len>=2 floor) + 자음 어간 으시- 축약형\ncodebook 보강(augment_honorific 16종). 골드 v15k F1 0.9363 무회귀.\nCargo/WASM/TS 0.9.2 리빌드.",
          "is_bot": false,
          "headline": "chore: 0.9.2 — 존대 표현 분석 버그 2건 수정 (편찮으시다/편찮으십니다 NNG collapse)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-01T02:32:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89e3ad4c4a8bbc0a83a147dd37b880b8b0c6e9c2",
          "body": "으셔서/으십니다/으셨다 등 자음 어간 + 축약 존대 어미(셔/셨/십) surface가\nsuffix codebook에 없어 어절 통째로 NNG로 collapse. 16개 으- 축약형을\n골드 컨벤션(으시/EP + 비축약 어미)대로 추가:\n  으십니다 → 으시/EP+ㅂ니다/EF, 으셔서 → 으시/EP+어서/EC,\n  으셨다 → 으시/EP+었/EP+다/EF.\n모음 어간(가셔서)·XSV(공부하셨다)는 기존에 정상 동작이라 미포함.\n으- 접두 surface만 추가해 명사 충돌 위험 0 (content_dict 부재 확인).\n\n골드 9000(v15k, ep_norm) F1 0.9363 동일 — 회귀 없음. cargo test 24개 통과. 모델 +0.5KB.",
          "is_bot": false,
          "headline": "feat(dict): 자음 어간 존대 으시- 축약형 codebook 보강 (편찮으십니다 등)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-01T01:57:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "739d166a497b8ae99f2ff649d348bcb1bea081e6",
          "body": "편찮/VA(freq 6) 등 2음절 저빈도 어간이 FST 빌드 필터의 저빈도 구제\nfloor(len>=3)에 걸려 누락 → 어절 통째로 OOV NNG 스팬으로 collapse.\nfloor 조건을 len>=2로 완화해 ~105개 2음절 VV/VA/VX 어간을 포함.\n\n골드 9000(v15k, ep_norm) F1 0.9363 동일 — 회귀 없음. 모델 +2KB.",
          "is_bot": false,
          "headline": "fix(dict): 2음절 저빈도 동사/형용사 어간 FST 누락 수정 (편찮으시다→NNG)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-06-01T01:42:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8311fafc900d0a69378d529031c898c002ceaf2",
          "body": null,
          "is_bot": false,
          "headline": "docs: 헤드라인 F1 93.3→93.6% (canonical 9000 v15k + ep_norm 보강 반영)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T05:40:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb3bd5dcd4dedbb5b7baa6fc4eb2e598d47865c1",
          "body": "기존 gold_testset.jsonl(8000)은 엣지케이스 누락된 stale 버전.\nv15k 9000(기존 8000 라벨 동일 + 엣지케이스 1000)으로 교체해\n15개 평가 스크립트가 동일 canonical 골드를 보게 정합.\n\n5분석기 다수결 클렌징본은 도메인별 블라인드 검증(PRE 58% vs cleansed 42%,\n5/7 도메인 우세)에서 net-negative로 확인되어 미채택.",
          "is_bot": false,
          "headline": "data(gold): canonical 골드를 9000 v15k로 갱신 (엣지케이스 1000 추가)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T05:39:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bb7e8c51e4b80150efc809455f370ccad841528",
          "body": "첨예/XR+하/XSA ≡ 첨예하/VA. 어근 분리(kiwi)와 결합(garu/구골드)이\n어휘별로 갈리는 차이를 흡수. XR+하 인접에서만 트리거(대하/위하 등 bound 무영향).",
          "is_bot": false,
          "headline": "feat(eval): ep_norm XR+하 결합 정규화 (split↔join 컨벤션 통일)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T05:29:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4488f89634d9f7bd65634ef5a26cfafd9c790aa0",
          "body": "였/여를 았/아와 동치 처리해 하다 과거/연결 표기 선택이 F1에 안 잡히게.\ncleansed 골드 측정 시 가짜 페널티 ~0.9pp 제거.\neval_f1.py에 --gold 인자 추가(기본값 gold_testset.jsonl 유지).",
          "is_bot": false,
          "headline": "feat(eval): ep_norm 하다 여불규칙(였/여) 정규화 + eval_f1 --gold 인자",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T05:25:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f0af27c77368f48e2830846aaebc592f24f9695",
          "body": null,
          "is_bot": false,
          "headline": "feat(cleansing): Stage 4 최종 병합 — 9000 단일 라벨 클렌징 골드",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T04:52:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf6d0a2913cfc597caeafe468fa8d8b7687d110d",
          "body": null,
          "is_bot": false,
          "headline": "data(cleansing): Stage 3 Claude 모호성 검토 결정 8884건",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T04:42:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "919f4736f369ca996a8bbcc4e9c0422316491c5f",
          "body": null,
          "is_bot": false,
          "headline": "feat(cleansing): Claude 검토용 청크 생성",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T03:29:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5dcd50a887465430db76632432e1247f69774ff",
          "body": null,
          "is_bot": false,
          "headline": "feat(cleansing): Stage 1 규칙 수렴 — resolved/still 분리 + 리포트",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T03:26:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47f20919ef99347e4005da617d49e315624daaee",
          "body": null,
          "is_bot": false,
          "headline": "docs(cleansing): 잔여 is_merge_of 주석 정리",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T03:22:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e76579e3dac57eea88f6e05389892dd2fe0348e",
          "body": null,
          "is_bot": false,
          "headline": "refactor(cleansing): 입도 정규화 수렴 제거 — EP 통일만 유지 (false convergence 방어)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T03:21:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3708a9656bf07c31dd6173e5681a673f59d8c37",
          "body": null,
          "is_bot": false,
          "headline": "test(cleansing): EP통일+입도 복합 경로 수렴 None 가드",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T02:42:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5e2d8efe9ef363dd3808cebc5d60a221d222b6f",
          "body": null,
          "is_bot": false,
          "headline": "feat(cleansing): 입도 정규화 + 후보 수렴 판정",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T02:38:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "75dc0ab6061db6ee37a30f04e12b467faa7b731c",
          "body": null,
          "is_bot": false,
          "headline": "fix(cleansing): EP 양성 복합모음(ㅘ/ㅙ) 모음조화 보정",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T02:36:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b3ef3fcfdc910b448774f8c3beae8ee958cad4b1",
          "body": null,
          "is_bot": false,
          "headline": "feat(cleansing): EP 모음조화 세종 표준 통일",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T02:32:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0c964afc1bd1c31025a55d070624e5f8b7ce535",
          "body": null,
          "is_bot": false,
          "headline": "feat(cleansing): 한글 자모 분해/조합 유틸",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T02:28:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6072a24acc7c7d1e5a7df8251e0b21d624c1e569",
          "body": "어절 단위 의심율 18.4% (8888/48349), 그 중 82%가 분해 입도 차이.\nbackup_v15k_pre_voting.jsonl로 원본 9000 보존 (기존 gold_testset.jsonl 미변경).",
          "is_bot": false,
          "headline": "data(gold): v15k 5분석기 다수결 클렌징 — voted 3208 / suspicious 5792 분리",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T01:45:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2921f1554c20363a26899d456acb9eef7198b7fb",
          "body": null,
          "is_bot": false,
          "headline": "perf(cleansing): Garu wrapper batch — 어절별 호출 → 문장당 1회 (~10x)",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T01:30:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c73005c1907f4ba9b74104bed93ad99a297e09d4",
          "body": null,
          "is_bot": false,
          "headline": "feat(cleansing): voting 결과 통계 리포트 생성기",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T01:17:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "37782dfba36aa622e4380c916c9079bc7fc32376",
          "body": "- analyzer 예외를 silently 삼키지 않고 첫 3건 stderr 로그 + 카운트를 stats에 포함\n- 입력 라인 파싱 실패(JSONDecodeError/KeyError) 시 라인만 건너뛰고 bad_lines 카운트\n- 기존 출력 파일 존재 시 SystemExit (1-3시간 기 실행 결과 보호)\n- 100문장마다 fv/fs flush (SIGKILL/OOM 대비 부분 출력 보존)\n- 스모크 테스트: 단일 명사 2개 + 의심 보장 입력 2개로 양 분기 결정적 자극 + try/finally 정리",
          "is_bot": false,
          "headline": "fix(cleansing): run_voting 신뢰성 — 에러 로깅 + 출력 보호 + 테스트 강화",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T01:15:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80bbb80e4b3ec2737fcb97dbfee8c21a3945d76b",
          "body": null,
          "is_bot": false,
          "headline": "feat(cleansing): 9K 어절 단위 voting 메인 파이프라인",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T01:06:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5caf540d0ab1746468c7a55566a5c7c60e9a62f7",
          "body": null,
          "is_bot": false,
          "headline": "fix(cleansing): eojeol_voter 문서/테스트 정합화 — 빈 출력 그룹 동작 명시",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T01:04:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6feaa9a5fd707ef6f335cea654216974f01e792a",
          "body": null,
          "is_bot": false,
          "headline": "feat(cleansing): 어절별 5분석기 다수결 voting 로직",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T00:59:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "022a50185c1e83291bc1ab6c0d35fd5bf0b39895",
          "body": null,
          "is_bot": false,
          "headline": "feat(ensemble): pos_normalize에 Kkma/Kiwi/Mecab 매핑 확장",
          "author_name": "조용진",
          "author_login": "ongjin",
          "committed_at": "2026-05-29T00:52:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 46,
      "commits_last_year": 376,
      "latest_release_at": "2026-07-18T11:50:53Z",
      "latest_release_tag": "v0.9.11",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 16,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 5.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "garu-ko",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "korean",
            "morphological-analysis",
            "korean-nlp",
            "pos-tagging",
            "tokenizer",
            "korean-tokenizer",
            "hangul",
            "nlp",
            "wasm",
            "webassembly",
            "lightweight",
            "browser",
            "offline",
            "한국어",
            "형태소-분석",
            "형태소-분석기"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/garu-ko",
          "is_deprecated": false,
          "latest_version": "0.9.11",
          "repository_url": "https://github.com/ongjin/garu",
          "versions_count": 63,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 5150,
          "first_published_at": "2026-03-30T01:04:39.901000Z",
          "latest_published_at": "2026-07-18T11:50:47.401000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 7,
      "stars": 159,
      "watchers": 2,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-05-24",
            "count": 1
          },
          {
            "date": "2026-07-01",
            "count": 3
          },
          {
            "date": "2026-07-02",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 7,
        "total_forks": 7
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "integrations/minisearch-tokenizer/tsconfig.json",
        "integrations/orama-tokenizer/tsconfig.json",
        "js/tsconfig.json"
      ],
      "toolchain_manifests": [
        "Cargo.toml",
        "crates/garu-core/Cargo.toml",
        "crates/garu-tools/Cargo.toml",
        "crates/garu-wasm/Cargo.toml"
      ],
      "largest_source_bytes": 232330,
      "source_files_sampled": 159,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 7784
    },
    "dependencies": {
      "manifests": [
        "Cargo.toml",
        "js/package.json",
        "package.json",
        "requirements.txt"
      ],
      "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": [
        "crates",
        "npm",
        "pypi"
      ],
      "dependencies": [],
      "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": 0,
        "open_issues": 1,
        "closed_ratio": 0.833,
        "closed_issues": 5,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "ongjin",
          "commits": 376,
          "avatar_url": "https://avatars.githubusercontent.com/u/86001644?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "Cargo.lock",
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 9,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 6 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": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 3,
            "reason": "7 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "70e7648fd8fdebd6e9877c136a9e40703f0d9468",
        "ran_at": "2026-07-23T19:15:50Z",
        "aggregate_score": 2.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-18T11:50:40Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 2,
          "created_at": "2026-04-29T05:06:32Z",
          "last_comment_at": "2026-04-29T06:40:17Z",
          "last_comment_author": "ongjin"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/ongjin/garu",
    "host": "github.com",
    "name": "garu",
    "owner": "ongjin"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 56,
      "inputs": {
        "security": 28,
        "vitality": 85,
        "community": 50,
        "governance": 50,
        "engineering": 58
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 85,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "commits_last_year": 376,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 16
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "16/52 weeks with commits",
                "points": 11.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 16
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "376 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 376
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 46,
              "latest_release_tag": "v0.9.11",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 5.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "46 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 46
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "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": "moderate",
        "name": "Community & Adoption",
        "value": 50,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 42,
            "inputs": {
              "forks": 7,
              "stars": 159,
              "watchers": 2,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "159 stars",
                "points": 35.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 159
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "7 forks",
                "points": 6.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "2 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "packages": [
                "garu-ko"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 5150
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "5,150 downloads/month across npm",
                "points": 49.5,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 5150,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 50,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 63,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 1,
              "closed_issues": 5,
              "issue_closed_ratio": 0.833,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "83% of issues closed",
                "points": 38.9,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 83
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "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": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 46,
            "inputs": {
              "followers": 4,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "ongjin",
              "public_repos": 37,
              "account_age_days": 1863
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "4 followers of ongjin",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 4,
                      "login": "ongjin"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "37 public repos, account ~5 yr old",
                "points": 21.7,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 37
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 5
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "garu-ko"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "63 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 63
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 58,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "at_risk",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 30,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "browser",
                "hangul",
                "korean",
                "korean-nlp",
                "korean-tokenizer",
                "morphological-analysis",
                "nlp",
                "pos-tagging",
                "rust",
                "tokenizer",
                "typescript",
                "wasm",
                "webassembly"
              ],
              "has_wiki": true,
              "homepage": "https://garu.zerry.co.kr",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://garu.zerry.co.kr",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "13 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 28,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 28,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 2.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 6 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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "7 existing vulnerabilities detected",
                "points": 2.2,
                "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": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 68,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 7784
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "Cargo.lock",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "integrations/minisearch-tokenizer/tsconfig.json",
                "integrations/orama-tokenizer/tsconfig.json",
                "js/tsconfig.json"
              ],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "Cargo.toml",
                "crates/garu-core/Cargo.toml",
                "crates/garu-tools/Cargo.toml",
                "crates/garu-wasm/Cargo.toml"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Cargo.toml, crates/garu-core/Cargo.toml, crates/garu-tools/Cargo.toml (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "Cargo.toml, crates/garu-core/Cargo.toml, crates/garu-tools/Cargo.toml"
                    }
                  }
                ],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "integrations/minisearch-tokenizer/tsconfig.json, integrations/orama-tokenizer/tsconfig.json, js/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "integrations/minisearch-tokenizer/tsconfig.json, integrations/orama-tokenizer/tsconfig.json, js/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 232330,
              "source_files_sampled": 159,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python with type-check config (integrations/minisearch-tokenizer/tsconfig.json, integrations/orama-tokenizer/tsconfig.json, js/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "integrations/minisearch-tokenizer/tsconfig.json, integrations/orama-tokenizer/tsconfig.json, js/tsconfig.json",
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/159 source files over 60KB",
                "points": 54.3,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 159,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? 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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:garu-ko@0.9.11; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T19:16:18.674047Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/o/ongjin/garu.svg",
  "full_name": "ongjin/garu",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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