Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 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 estrellas⑂ 7 forksdesde mar 2026Ver en GitHub ↗

ongjin/garu tiene un índice de salud de 56 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Vitality (85/100) y la más baja, Security (28/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

56
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

56
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

zerryCuenta personal
4 seguidores37 repositorios públicosdesde jun 2021

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npmgaru-ko0.9.11515063hace 5 díaskoreanmorphological-analysiskorean-nlppos-taggingtokenizerkorean-tokenizerhangulnlpwasmwebassemblylightweightbrowseroffline

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

85Excelente · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
11.1/36Cadencia de commits — 16/52 semanas con commits
18/18Volumen de commits — 376 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 6 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year376
human_commit_share1
days_since_last_push5
active_weeks_last_year16
Cómo se puntúa
27/27Publica versiones — 46 versiones publicadas
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~5,3 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count46
latest_release_tagv0.9.11
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases5,3
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

50Moderado · 18% del índice global
Cómo se puntúa
35.7/60Estrellas — 159 estrellas
6.5/25Forks — 7 forks
0/15Observadores — 2 observadores
Datos de entrada utilizados
forks7
stars159
watchers2
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
49.5/80Descargas mensuales — 5150 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesgaru-ko
dependents
ecosystemsnpm
total_downloads
monthly_downloads5150
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

50Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
38.9/46.8Resolución de issues — 83% de issues cerradas
0/38.3Aceptación de PR — sin PR decididos o sin datos
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs0
open_issues1
closed_issues5
issue_closed_ratio0,833
closed_unmerged_prs0
Excluidos de la puntuación (sin datos o no aplicable): Aceptación de PR. Los pesos restantes se han renormalizado.
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
5/25Alcance del propietario — 4 seguidores de ongjin
21.7/25Trayectoria — 37 repos públicos, cuenta de ~5 años
Datos de entrada utilizados
followers4
owner_typeUser
is_verified
owner_loginongjin
public_repos37
account_age_days1863
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 63 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgaru-ko
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

58Moderado · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — sin datos
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: CI-Tests. Los pesos restantes se han renormalizado.

Documentación

100Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://garu.zerry.co.kr
10/10Descripción del repositorio
10/10Topics — 13 topics
10/10Wiki
Datos de entrada utilizados
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

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

28Crítico · 16% del índice global
Cómo se puntúa
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 — sin datos
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 — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — 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 — sin datos
0/5Pinned-Dependencies — sin datos
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
2.2/7.5Vulnerabilities — 7 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate2,8
Excluidos de la puntuación (sin datos o no aplicable): ci_tests, dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

68Moderado · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes7784
Cómo se puntúa
12.6/18Arranque con un solo comando — Cargo.toml, crates/garu-core/Cargo.toml, crates/garu-tools/Cargo.toml (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — integrations/minisearch-tokenizer/tsconfig.json, integrations/orama-tokenizer/tsconfig.json, js/tsconfig.json
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilesCargo.lock, package-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
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
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
27/45Código verificable por tipos — Python con configuración de verificación de tipos (integrations/minisearch-tokenizer/tsconfig.json, integrations/orama-tokenizer/tsconfig.json, js/tsconfig.json)
54.3/55Tamaños de archivo manejables — 2/159 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes232.330
source_files_sampled159
oversized_source_files2
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

159estrellas de GitHub
1contribuidores
376commits en los últimos 12 meses
5días desde el último push
46versiones publicadas
1factor bus
1issues abiertas
crates.io, npm, PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

Historial de estrellas y forks 0 ★ / 7 ⇿
0Estrellas
7Forks
42Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

1234567732026-032026-052026-07
Mayor 0Menor 7Parche 35
OpenSSF Scorecard 2.8 / 10
2.8agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dCI-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
n/dDangerous-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
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
3Vulnerabilities7 existing vulnerabilities detected
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.