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