Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-29 06:31 UTC

kwakseongjae / oh-my-design

Give your AI coding agent a design system. One command installs 400+ quality-graded company DESIGN.md references + skills into Claude Code, Codex, Cursor, and OpenCode. Free, MIT, zero AI calls.

HTML · TypeScriptMIT★ 396 estrellas⑂ 35 forksdesde abr 2026Ver en GitHub ↗

kwakseongjae/oh-my-design tiene un índice de salud de 68 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (86/100) y la más baja, Sustainability & Governance (57/100). Se actualizó por última vez hace 7 días. Una sola persona concentra la mayor parte del trabajo reciente.

68
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.

68
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

곽성재Cuenta personal
34 seguidores48 repositorios públicosdesde jul 2021HONGIK UNIVERSITY

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
npmoh-my-design-cli1.9.0348531hace 7 díasdesign-systemdesign-mdai-agentclaude-codecodexopencodecursorskillsdesign-skillsgoogle-stitchvibe-coding

Métricas por categoría

Vitalidad

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

80Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 7 días
10.4/36Cadencia de commits — 15/52 semanas con commits
18/18Volumen de commits — 287 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year287
human_commit_share1
days_since_last_push7
active_weeks_last_year15
Cómo se puntúa
16.2/27Publica versiones — 16 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 7 días
27/27Cadencia de publicación — una versión cada ~5,1 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count16
latest_release_tagv1.9.0
releases_from_tags
days_since_latest_release7
mean_days_between_releases5,1
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?

57Moderado · 18% del índice global
Cómo se puntúa
42.1/60Estrellas — 396 estrellas
12.8/25Forks — 35 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks35
stars396
watchers1
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
6.3/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_template
Cómo se puntúa
47.2/80Descargas mensuales — 3485 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesoh-my-design-cli
dependents
ecosystemsnpm
total_downloads
monthly_downloads3485
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?

57Moderado · 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
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
33.2/46.8Resolución de issues — 71% de issues cerradas
38.2/38.3Aceptación de PR — 7/7 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/20 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs7
open_issues11
closed_issues27
issue_closed_ratio0,711
closed_unmerged_prs0
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
11.1/25Alcance del propietario — 34 seguidores de kwakseongjae
22.4/25Trayectoria — 48 repos públicos, cuenta de ~5 años
Datos de entrada utilizados
followers34
owner_typeUser
is_verified
owner_loginkwakseongjae
public_repos48
account_age_days1843
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 7 días
20/20Historial de versiones — 31 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesoh-my-design-cli
ecosystemsnpm
any_deprecatedno
min_days_since_publish7

Calidad de Ingeniería

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

86Excelente · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — eslint.config.mjs
0/9.6Hooks de pre-commit
0/6.4.editorconfig
12/20OpenSSF Scorecard: CI-Tests — 3 out of 5 merged PRs checked by a CI test -- score normalized to 6
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

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://oh-my-design.kr
10/10Descripción del repositorio
10/10Topics — 12 topics
10/10Wiki
Datos de entrada utilizados
topicscli, design-md, design-system, design-tokens, google-stitch, nextjs, open-source, react, shadcn-ui, tailwindcss, typescript, vibe-coding
has_wiki
homepagehttps://oh-my-design.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?

61Moderado · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — sin datos
1.5/2.5CI-Tests — 3 out of 5 merged PRs checked by a CI test -- score normalized to 6
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/20 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 3 contributing companies or organizations -- score normalized to 10
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
7.5/7.5Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
0/7.5Vulnerabilities — 33 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate5,1
Excluidos de la puntuación (sin datos o no aplicable): branch_protection, signed_releases. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
25/25Dependencias indirectas libres de avisos conocidos — ninguna dependencia indirecta tiene un aviso conocido
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages5
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejó el cierre de dependencias en tiempo de ejecución de npm:oh-my-design-cli@1.9.0 —lo que arrastra la instalación del paquete publicado—: 5 paquetes. No se analiza la alcanzabilidad.

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.

72Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md, agents/AGENT.md, web/AGENTS.md, web/CLAUDE.md
15/15Documentación legible por máquinas (llms.txt) — llms.txt presente
40/40Historial de commits legible — 96 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txt
legible_history_share0,96
agent_instruction_filesAGENTS.md, CLAUDE.md, agents/AGENT.md, web/AGENTS.md, web/CLAUDE.md
agent_instruction_max_bytes9815
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
11/11Configuración de lint / formato — eslint.config.mjs
11/11Verificación estática de tipos — packages/mcp/tsconfig.json, tsconfig.json, web/tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 86 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_config
typecheck_configspackages/mcp/tsconfig.json, tsconfig.json, web/tsconfig.json
agent_commit_share0,86
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
27/45Código verificable por tipos — HTML con configuración de verificación de tipos (packages/mcp/tsconfig.json, tsconfig.json, web/tsconfig.json)
54.2/55Tamaños de archivo manejables — 6/424 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageHTML
largest_source_bytes1.312.548
source_files_sampled424
oversized_source_files6
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
0/40Ejemplos ejecutables
Datos de entrada utilizados
example_dirs
has_mcp_signal
api_schema_files

Datos clave

396estrellas de GitHub
1contribuidores
287commits en los últimos 12 meses
7días desde el último push
16versiones publicadas
1factor bus
11issues abiertas
npmecosistemas 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

Más detalle

Historial de estrellas y forks 0 ★ / 35 ⇿
0Estrellas
35Forks
15Versiones

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.

01325383552026-042026-062026-07
Mayor 0Menor 3Parche 12
OpenSSF Scorecard 5.1 / 10
5.1agregado

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-29 06:31 UTC

10Binary-Artifactsno binaries found in the repo
n/dBranch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
6CI-Tests3 out of 5 merged PRs checked by a CI test -- score normalized to 6
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/20 approved changesets -- score normalized to 0
10Contributorsproject has 3 contributing companies or organizations -- score normalized to 10
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
3Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 3
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
0Vulnerabilities33 existing vulnerabilities detected
Dependencias directas 22
RegistroPaqueteRestricción de versiónManifiesto
npm@clack/prompts^0.9.1package.json
npmcommander^13.1.0package.json
npmpicocolors^1.1.1package.json
npm@anthropic-ai/sdk^0.98.0web/package.json
npm@base-ui/react^1.3.0web/package.json
npm@upstash/redis^1.37.0web/package.json
npmclass-variance-authority^0.7.1web/package.json
npmclsx^2.1.1web/package.json
npmframer-motion^12.38.0web/package.json
npmlucide-react^1.8.0web/package.json
npmlz-string^1.5.0web/package.json
npmmixpanel-browser^2.80.0web/package.json
npmnext16.2.6web/package.json
npmnext-themes^0.4.6web/package.json
npmreact19.2.4web/package.json
npmreact-dom19.2.4web/package.json
npmreact-markdown^10.1.0web/package.json
npmrehype-raw^7.0.0web/package.json
npmrehype-sanitize^6.0.0web/package.json
npmremark-gfm^4.0.1web/package.json
npmtailwind-merge^3.5.0web/package.json
npmzod4.4.3web/package.json
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

Avisos de dependencias 0

Instalar npm:oh-my-design-cli@1.9.0 arrastra 5 paquetes, directos y transitivos: 0 tienen avisos conocidos, de los cuales 0 son dependencias directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "cli",
        "design-md",
        "design-system",
        "design-tokens",
        "google-stitch",
        "nextjs",
        "open-source",
        "react",
        "shadcn-ui",
        "tailwindcss",
        "typescript",
        "vibe-coding"
      ],
      "is_fork": false,
      "size_kb": 22337,
      "has_wiki": true,
      "homepage": "https://oh-my-design.kr",
      "languages": {
        "CSS": 13451,
        "HTML": 6151670,
        "Shell": 10684,
        "Python": 176910,
        "JavaScript": 415603,
        "TypeScript": 4983797
      },
      "pushed_at": "2026-07-21T07:49:10Z",
      "created_at": "2026-04-13T09:57:10Z",
      "owner_type": "User",
      "updated_at": "2026-07-29T01:28:54Z",
      "description": "Give your AI coding agent a design system. One command installs 400+ quality-graded company DESIGN.md references + skills into Claude Code, Codex, Cursor, and OpenCode. Free, MIT, zero AI calls.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "HTML",
      "significant_languages": [
        "HTML",
        "TypeScript"
      ]
    },
    "owner": {
      "blog": "https://lambda-log.tistory.com/",
      "name": "곽성재",
      "type": "User",
      "login": "kwakseongjae",
      "company": "HONGIK UNIVERSITY",
      "location": "Seoul, Republic of Korea",
      "followers": 34,
      "avatar_url": "https://avatars.githubusercontent.com/u/87296259?v=4",
      "created_at": "2021-07-12T05:50:21Z",
      "is_verified": null,
      "public_repos": 48,
      "account_age_days": 1843
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-07-21T07:40:08Z"
        },
        {
          "tag": "v1.8.7",
          "kind": "patch",
          "published_at": "2026-06-29T05:19:10Z"
        },
        {
          "tag": "v1.8.2",
          "kind": "patch",
          "published_at": "2026-06-17T08:14:19Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2026-06-10T16:10:42Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-06-10T12:20:58Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2026-06-10T07:55:08Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-06-09T09:45:22Z"
        },
        {
          "tag": "v1.6.7",
          "kind": "patch",
          "published_at": "2026-06-05T09:56:34Z"
        },
        {
          "tag": "v1.6.6",
          "kind": "patch",
          "published_at": "2026-06-05T09:18:41Z"
        },
        {
          "tag": "v1.6.5",
          "kind": "patch",
          "published_at": "2026-06-05T09:06:27Z"
        },
        {
          "tag": "v1.6.4",
          "kind": "patch",
          "published_at": "2026-06-05T09:00:18Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2026-06-01T17:41:12Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-05-28T06:24:36Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2026-05-27T07:10:06Z"
        },
        {
          "tag": "v1.0.2",
          "kind": "patch",
          "published_at": "2026-05-07T08:19:03Z"
        },
        {
          "tag": "v1.0.1",
          "kind": "patch",
          "published_at": "2026-05-07T08:09:36Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "0a7f3a1e17814c8a1b000ce075b3b2620b70db9e",
          "body": "Record the successful Web and npm v1.9.0 release.",
          "is_bot": false,
          "headline": "Merge pull request #49 from codex/record-v1.9-release",
          "author_name": "곽성재",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-21T07:49:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8bbae98c8200d28ab7acdcff73be0fd7cfd19f4",
          "body": null,
          "is_bot": false,
          "headline": "docs: record v1.9 production release",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-21T07:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce6636c1f1bb82ee50311f1383cebe8c9ceb3f69",
          "body": "Fix npm pack JSON parsing in the Node 18 release smoke.",
          "is_bot": false,
          "headline": "Merge pull request #48 from codex/fix-v1.9-release-smoke",
          "author_name": "곽성재",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-21T07:40:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bff1aea853504fee34002103adaa627e406cc93",
          "body": null,
          "is_bot": false,
          "headline": "fix: parse npm pack output in release smoke",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-21T07:37:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "072f5d9455204935d2b6c89768b10617fc03d5df",
          "body": "Ship CLI v1.9 and the CLI-first activation flow.",
          "is_bot": false,
          "headline": "Merge pull request #47 from agent/v2-440-release",
          "author_name": "곽성재",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-21T07:30:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2ebc3175ce5d1f4a23a5cccd898a77f6aef65f2",
          "body": null,
          "is_bot": false,
          "headline": "docs: record CLI v1.9 push gate",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-21T07:20:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21a908d41c31385b66db9822603a8652ef44e9cd",
          "body": null,
          "is_bot": false,
          "headline": "feat: complete CLI-first activation flow",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-21T07:18:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee89e4669392af0b3dc0464a32a42fa2842d9197",
          "body": null,
          "is_bot": false,
          "headline": "feat: prepare CLI v1.9 release candidate",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-21T03:59:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e99a4ef69a45c5b53d1ca427e375d4bebbc6245",
          "body": null,
          "is_bot": false,
          "headline": "record v2 production validation",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-14T03:24:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "764607203d491faaa32af60c5aed11c03258fae6",
          "body": null,
          "is_bot": false,
          "headline": "fix canonical reference paths in CI",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-14T03:21:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13d8f17a03b5ef93ea58668ed0a507f3539eefe5",
          "body": null,
          "is_bot": false,
          "headline": "fix npm 10 release lockfile",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-14T03:18:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4bb3ace0682084ab98c40dca2af35bf71c1496f",
          "body": null,
          "is_bot": false,
          "headline": "release v2 reference catalog and builder",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-14T03:08:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "812211f1aeaa264ac7a1a75eec82ecf7923da2ba",
          "body": "Single source of truth for the next-gen reference preview renderer:\ntwo-pane layout, 14 specimen sections, REAL/SUBSTITUTE/SYSTEM webfont\npolicy, provenance badges, TokenSheet contract, section-renderer\nfactory, 7-step migration plan off the two preview monoliths.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(spec): add preview-v2 build-target spec",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-06T10:40:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7bd006da71b96239fdba4dccf22ef7a871b8dedb",
          "body": "…t Inter fallback\n\nextractPrimaryFont() parsed only §3 prose and ended in a hardcoded\n'Inter' — system-font stacks (baemin) and Korean font names defeated\nevery regex, so the API confidently rendered an Inter card for brands\nthat never use it. Same fallback hid in reference/[id] and\ndesign-systems/[\n[…]\nname (SF Mono, SFMono-Regular → one card)\n- 7 new tests on real fixtures: baemin→System+BMHANNA Pro,\n  linear.app/channeltalk keep genuine Inter\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): resolve reference fonts from frontmatter tokens, drop silen…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-06T10:40:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6affe6592aa7ee3cb8c803fe0367a834100779f",
          "body": "…g logo\n\nGrows the catalog to exactly 400 via the full recommend→build pipeline.\nAll 44 pass verify-reference 27/27 + catalog-integrity (16 files / 638 tests).\n\n- 44 new KR refs: AI 10 · consumer-tech 6 · fintech 6 · healthcare 5 ·\n  ecommerce 4 · marketing 4 · education 3 · design-tools 2 · automot\n[…]\n); llms-full regenerated.\n- version 1.8.7 → 1.8.8; audit data/reference-audits/2026-07-02-kr44.md\n  (13 High / 29 Medium / 2 Low).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(catalog): add 44 Korean company references (356→400) + fix daban…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-07-02T06:42:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "289abc4e414faea64427c3e46427810ec25da3fc",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: regenerate version.generated.ts for 1.8.7",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-29T05:19:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e5688e99f6b641f23485c27be36d856fbab543ce",
          "body": "@modelcontextprotocol/sdk@1.29.0 peer-requires zod \"^3.25 || ^4.0\"; the old\n^3.23.8 floor admitted versions that violate it (worked only by resolving to\n3.25.x). Pin the declared floor to match.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(mcp): raise zod floor to ^3.25.0 to satisfy SDK peer",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-29T05:19:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51860b00ebb6747c986a1b3dc06e91449144b819",
          "body": "Removed gray-matter, shadcn, @vercel/og, tw-animate-css, react-fast-marquee,\nremark-unwrap-images — all zero runtime imports (frontmatter is hand-rolled\nregex; shadcn/tw-animate CSS is vendored locally; og route uses next/og).\nDropped the now-dead next.config transpilePackages.\n\nReplaced gsap's sing\n[…]\nm audit 5 -> 0 vulnerabilities (clears both\njs-yaml chains + vite/hono/babel). Verified: tsc clean, 594 tests pass,\nnext build ok.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(web): prune 6 unused deps + replace gsap with framer-motion",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-29T05:19:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1035893adc4764513a1f538ad2c7eaf2690118e5",
          "body": "30 new KR refs steered toward under-covered categories — AI 7, marketing 4, education 3, SaaS 3, ecommerce 3, dev-tools 2, backend-devops 2, consumer-tech 2, fintech 2, automotive 1, healthcare 1. Built via the 탐색→선발→수집→검수→배포 pipeline (8-agent discovery → category-balanced curation → per-brand CREAT\n[…]\nute .max cap). KR refs 119→149. Audit: data/reference-audits/2026-06-26-kr30.md (23 High / 7 Medium / 0 Low). Version 1.8.6→1.8.7.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(catalog): add 30 Korean company references (326→356)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-26T02:55:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d7fb3338f05b011fe78766a917b88be696a35f31",
          "body": "Naver Search Advisor was registered against www.oh-my-design.kr, which\n308-redirects to the apex — so Yeti only ever saw a redirect and flagged\nthe property as 수집제한 (색인 0, 노출 0). Register the canonical apex\nhost instead; this adds its verification token alongside the legacy www\none. Next renders one <meta> per array entry, so both properties verify\noff the same deployment.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(seo): add apex oh-my-design.kr Naver verification token",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-25T01:38:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "93afc42c2ececdde4962d9f3292f13020ecb59c8",
          "body": "feat(builder): locale-aware reference sort modes (Recommended/Popular/A–Z/New)",
          "is_bot": false,
          "headline": "Merge pull request #42 from kwakseongjae/feat/reference-sort-modes",
          "author_name": "곽성재",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-24T11:21:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79cb6a8429afa945d00d4267efdd3ff05f33d2ed",
          "body": "- Swift-style segmented control: a single primary pill slides between\n  Recommended/Popular/A–Z/New via framer-motion shared layout (layoutId), on a\n  glassmorphism container (translucent + backdrop-blur + inset ring).\n- Sort/filter changes swap to a skeleton instead of animating cards to new\n  posi\n[…]\n with no skeleton.\n- Live search keeps filtering instantly (no per-keystroke skeleton); the async\n  geo resolve re-sorts silently.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(builder): sort toggle UI — glass sliding control + skeleton swap",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-24T11:09:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bd9d787f9eb9a8a0a4bd967b573e0e7764747482",
          "body": "Replaces the hardcoded KR→TW→JP country pin in /api/references (which buried\nglobally iconic refs like Apple/Anthropic after the HOT 5) with four sort modes,\ncomputed client-side so \"Recommended\" can be locale-aware without per-locale\nserver caching.\n\n- /api/references now exposes per-ref sort signa\n[…]\ncaleBoost.\nKR visitors get a home-region nudge; global visitors surface global icons by\nmerit — neither country is blanket-pinned.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(builder): locale-aware sort modes for the reference grid",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-24T11:09:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09b1f79bba352c6d4f941fcff0791a41bf0816ac",
          "body": "feat(analytics): server-side DAU tracking + radius preview fix",
          "is_bot": false,
          "headline": "Merge pull request #41 from kwakseongjae/feat/server-side-dau-tracking",
          "author_name": "곽성재",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-24T09:32:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c957c74ee6e4435f179b0b3f753c8b153dc7c0ac",
          "body": "Deletes the pre-2026-06-23 renamed key events (copy_designmd, download_designmd,\nds_copy_md, ds_download_md, cli_install_cta_click) that lingered in the GA4\nconversions list. Explicit delete-list + dry-run default so live events\n(cta_click) and GA4 defaults (purchase) can't be removed by accident. Already\napplied to the property; this commits the reusable tool.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(analytics): add GA4 stale key-event prune tool",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-24T09:26:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9820d414763dd3b09f9464a22e3a372f187baf03",
          "body": "GA4/Mixpanel DAU is consent-gated (EU fail-closed) and ad-blocker-lossy, so it\nunder-counts and swings whenever dashboards/config change — which is how the\n2026-06-23 taxonomy reset reads as a \"decline\" that isn't real. Add a stable,\nconsent-independent active-user floor for the DAU=1000 north-star:\n[…]\nreads DAU/WAU/MAU + device + 30-day series from Upstash.\n- Doc: funnel-analytics.md active-users section + surface enum drift fix.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(analytics): consent-independent server-side DAU/WAU/MAU via HLL",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-24T09:26:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06d8c2a5773d24cec316b24e78058b7ae8c55acf",
          "body": "Structured `tokens.components` frontmatter writes `radius: 12`, which reaches\nthe preview as the string \"12\". React only auto-appends px to numeric style\nvalues, not numeric strings, so `borderRadius: \"12\"` was invalid CSS and\nrendered sharp corners (affected ~131 refs incl. kakao). normalizeRadius \n[…]\nsingle, pill 9999, asymmetric), leaving units/%/\nkeywords untouched; VariantSpec mirrors it so the spec column reads consistently.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): apply px to unit-less component radius in reference preview",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-24T09:26:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "671ec9c55e3135e5d7fba732aa6ebf84ffa9793a",
          "body": "Idempotent Admin API (v1alpha reportingDataAnnotations) helper used to mark the\n2026-06-23 funnel taxonomy reset. Companion to setup-ga4.mjs.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(analytics): add GA4 cutover-annotation tool",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-24T01:21:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "55a94e77ae6fe36870b0501ddaf8836215f3ea3a",
          "body": "…stomize\n\nCuration quiz + share surfaces removed — 28d data falsified the viral\nhypothesis (0 shares, 0 shared_view; ~53 completers = ~2% of builder users).\nDeleted /curation, /result/[typeCode], all of components/survey/; added 308\nredirects (/curation->/builder, /result/:typeCode->/design-systems)\n[…]\nREST\n+ public npm/GitHub pull and digest tooling that drove the analysis.\n\ntsc --noEmit clean · next build green (1050 pages) · 553 tests pass.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(analytics): remove curation, redesign funnel taxonomy, demote cu…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-23T13:38:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0ec0e1ea26db8da6cbf7acbbd690f24b9bd3c780",
          "body": "… audit)\n\nNew skill omd:feel turns the design/frontend industry's gut-feel into 113\nprovenance-graded, machine-checkable interface rules (17 dimensions),\nextending jakub/make-interfaces-feel-better with Apple HIG / Material 3 /\nWCAG / design-system tokens + practitioner research. Provenance tier →\ne\n[…]\nard + dynamic per-section skill counts (fix stale \"9\")\n- fix stale reference count 286 → 326 across READMEs + site metadata + llms\n- bump 1.8.6\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(skills): add omd:feel — quantified interface-feel rules (apply +…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-23T06:58:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b352e5ed3bd610dbeace9c815f5cfce4346937d",
          "body": "…kens\n\nAdds a per-reference assertion that no entry-level field (ds/logo/verified/etc.)\nis nested inside the `tokens:` block. This is the class of error that broke the\nVercel build (samsung `ds` under tokens → invalid registry tokens type → tsc\nfail), which previously passed verify-reference + npm test since neither runs tsc.\nVerified the guard fails on the broken input and passes once de-indented.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(catalog): guard against entry-level frontmatter nested inside to…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-23T03:09:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "31c317c59fbf9db240bd12e08a856b750e73b9aa",
          "body": "…e Vercel tsc\n\nThe samsung DESIGN.md `ds:` block was indented 2 spaces, making it a child of\n`tokens:` in YAML. build-registry then serialized it as `\"ds\":{...}` inside the\ntokens JSON, which fails the registry tokens type during `next build`'s TypeScript\ncheck — the Vercel deploy error. (verify-ref\n[…]\ny local gate.) De-indented `ds` to top level (sibling of `tokens`,\nmatching the other 71 refs). `next build` now green: 1066/1066 static pages.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(build): samsung frontmatter `ds` was nested under `tokens` — brok…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-23T03:06:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d228061bcaaa3ee1824c6823473cf55761f62b38",
          "body": "Four-country expansion round, curated by brand prominence (HQ-country rule):\n- KR: samsung, hyundai, kia, naverpay, kbpay, hana, shinhanbank, ssg, kakaopage, liner\n- TW (Taiwan-HQ): esunbank, fubon, ipassmoney, easywallet, openpoint, bahamut, icook, taiwanmobile, chunghwa, 591\n- US: paypal, zoom, as\n[…]\norrect).\n\nAudits: data/reference-audits/2026-06-22-{kr,tw,us,uk}10.md +\n2026-06-23-qa-designlang-benchmark.md. 553 tests pass. v1.8.2 -> 1.8.5.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(catalog): +40 references (KR/TW/US/UK ×10) + QA pass — 286→326",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-23T01:52:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7be4afcdd0db4fea281ccf2f6c0677f022aa491c",
          "body": "Make the static/prose surfaces (README, llms.txt, SEO layout metadata) that\ncan't import the TS constants impossible to silently drift.\n\n- sync-catalog.mjs: replace the brittle oldCount->newCount incremental\n  replace (which froze once a file drifted) with phrase-anchored, computed\n  rules applied u\n[…]\n so drift fails the commit.\n\nSub-counts (\"15 specialists\", \"6 skills (v0.2 layer)\") use distinct phrasing\nand are intentionally left untouched.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: self-healing count sync + pre-commit drift guard",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-22T09:00:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abc683745e422732c488d7675d576c53a5e9630d",
          "body": "The \"17 skills\" / \"16 sub-agents\" literals were hand-maintained across many\nsurfaces and synced for none of them (only the reference count was), so they\ndrifted (llms.txt had frozen at \"15 skills\").\n\n- build-registry.mjs emits web/src/data/catalog-meta.generated.ts with\n  SKILL_COUNT (= package.json\n[…]\n.)\n- llms.txt: 15 -> 17 skills and add the two missing skills (omd:taste,\n  claude-design) so the list matches the count; regenerate llms-full.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): derive skill/sub-agent counts from build — kill count drift",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-22T09:00:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "417474870de012845b52370c3e07cb69d5dcc07b",
          "body": "…idge\n\nMake the catalog citable by Claude/Brave and connect the client builder\nfunnel to the indexable server-rendered pages.\n\n- design-systems/[id]: emit Article + FAQPage JSON-LD (server-computed,\n  dateModified from registry `verified`) and a visible answer-first summary\n  band (the JSON-LD descr\n[…]\ne reference page\n  + raw .md so shared previews reach citable content.\n- Add the AEO/.md strategy brief (web/docs/aeo-and-public-design-md.md).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): per-reference AEO structured data + builder<->canonical br…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-22T09:00:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d5a58e23382131f644f1e0fcee23e8390b235cd",
          "body": "The reference count was hardcoded as \"221\" across ~11 surfaces and only a\nfixed file list was kept in sync by sync-catalog.mjs, so every other surface\nfroze at a stale number (real catalog = 286).\n\n- Add SSOT web/src/lib/catalog-count.ts (REFERENCE_COUNT = REGISTRY.length)\n  and wire it into what-is\n[…]\ng skill cards (omd:taste, claude-design) so the visible list matches\n  the \"17 skills\" claim. 16 sub-agents / 286 references confirmed correct.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): derive reference count from registry; refresh docs",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-22T09:00:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7b54f6cd6f59dcb80d0561da6985f453c829de4",
          "body": "Migrate the public raw-markdown URL from /design-systems/<id>.md to the\nVercel-shaped /<id>/design.md (e.g. oh-my-design.kr/toss/design.md).\n\n- next.config: rewrite /:id/design.md -> /r/:id; 308 permanent redirect\n  from the old shape so published links (llms.txt, npm copy, agent caches)\n  keep reso\n[…]\nt.\n\nVerified on dev: new URL -> 200 text/markdown, old -> 308, dotted ids\n(/linear.app/design.md) -> 200, /docs un-shadowed, unknown id -> 404.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): serve raw DESIGN.md twins at /<id>/design.md",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-22T09:00:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d1d3f2524c6fa5a5e7980e1a336d04416e95cb23",
          "body": "The remote MCP connector returns 404 unless OMD_MCP_ENABLED=true, so it\nstays dormant in production while the Connectors Directory submission is\npaused. Flip the env var (dev/preview) to re-enable.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): gate /api/mcp behind OMD_MCP_ENABLED dev flag",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-22T09:00:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "54422b50095de677755110cd54cc7bff458a5464",
          "body": "…ance, form-fill status\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(web): submission packet — add ToS URL, page-6 legal checklist st…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-19T16:29:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "deb15e22d6badfd7b3e52c61007deab08810e2a3",
          "body": "Connectors Directory submission requires \"Terms of service are published and\naccessible\" — we only had a privacy policy. Add:\n- /terms and /terms/ko: plain-language ToS for the open-source catalog, site,\n  CLI, and read-only Claude connector (acceptable use, brand/IP disclaimer,\n  no-warranty, liabi\n[…]\narch, unknown id, 429 rate limit, support) so the docs cover setup + tools\n  + troubleshooting as the directory checklist expects.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): add Terms of Service (EN+KO) + connector troubleshooting",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-19T16:22:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ea6f840688f15a08964356b06062963fcda06988",
          "body": "search_by_vibe sends the user's query to OpenRouter (bge-m3) to compute an\nembedding. Disclose it accurately for the Connectors Directory submission:\n- connector section (EN + KO) now states the search phrase is sent to OpenRouter\n  (US) to compute a vector, used only for ranking and not stored.\n- add OpenRouter to the processor lists (EN \"who processes the data\"; KO 위탁 +\n  국외이전 transferee list).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(web): disclose OpenRouter embedding data flow in privacy policy",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-19T15:54:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0d2ae1ab4fcb4f8dd77c5a9d7d53f4df63d1b657",
          "body": "Earlier packet under-specified the form. Map every field of the actual submission\nflow (Connection / Tools / Listing / Use Cases / Company / Authentication / Data\nHandling / Test & Launch / Compliance / Review) to oh-my-design's concrete values,\nwith char limits (tagline ≤55, desc ≤2000), the perman\n[…]\n), reviewer test steps, all 7 compliance acknowledgements\nwith our stance, and the allowed-link-URI tip for provenance permalinks.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(web): rewrite Connectors Directory packet to the real 11-step form",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-18T12:37:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "783f2d1fb4d2af0f2d99e5d4075722fd1f938971",
          "body": "Public unauthenticated connector whose search_by_vibe makes a paid OpenRouter\ncall — cap abuse with a fixed-window 60 req/60s/IP limiter. Upstash-backed\n(shared across serverless instances; the font in-memory limiter is per-instance\nand too weak here), process-local fallback when KV is absent, fails\n[…]\nconnector down. Enforced in the\nroute gate after Origin validation; returns 429 + Retry-After. Verified: exactly\n60 pass then 429.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): per-IP rate limit on /api/mcp (Redis-backed, fail-open)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-18T12:22:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5b3213d233770dd6222ea8c336efef1da2a37c49",
          "body": "Adversarial pre-submission review against the live endpoint found 7 blockers; all fixed:\n- serverInfo now { name: \"oh-my-design\", version: \"1.0.0\" } (was the mcp-handler\n  \"mcp-typescript server on vercel\" template default the directory would display).\n- Origin validation (MCP Streamable HTTP spec M\n[…]\ndk 1.26.0 / zod 4.4.3.\n- Finalize the Connectors Directory submission packet (standalone form channel,\n  listing copy, checklist).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): harden /api/mcp for Connectors Directory submission",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-18T10:02:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "42eee51b0a85212c6beb42202f478c0ce0aca68e",
          "body": "…ng scaffold\n\n- Streamable HTTP MCP connector (mcp-handler, stateless, nodejs runtime) exposing\n  the 286-ref catalog as 3 read-only tools: list_references / search_by_vibe /\n  get_design_md, each annotated readOnlyHint for the Connectors Directory.\n- Every result carries a provenance permalink + ve\n[…]\nn import guide (leg B) + Connectors Directory packet.\n- refresh llms.txt/llms-full.txt to the current 286-ref catalog (was stale).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): remote MCP connector at /api/mcp + provenance + v2 embeddi…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-18T09:44:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "78414584a7dc6b5770835fa4c59c327fdd8699ac",
          "body": "layout.tsx's unregioned Consent Mode v2 default re-grants\nanalytics_storage='granted' on every page load, before AnalyticsConsent\nmounts. The stored===\"denied\" branch only re-opted-out Mixpanel, so a\nreturning visitor who previously clicked Decline was silently re-tracked\nby GA — a GDPR-correctness \n[…]\nd session\nspike — that is JS-executing LLM crawlers (no Referer) landing in GA,\naddressed via GA4 console bot filtering, not code.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): re-apply stored GA opt-out for returning decliners",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-17T09:52:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8b392dc5176e116cb3b7085d79a4d5109b8432cd",
          "body": "국가별 10개씩, 미수록 IT 기업 디자인 레퍼런스 신규 추가. 전 항목 live CDP\ninspect + Proof Gate 통과, token↔prose 정합, KR/TW는 brand-owned Tier-1\n소스 ≥2 충족. 후보는 4개국 어드버서리얼 검증(parent-HQ 국가 + 디자인 가치)으로\n큐레이션 — Typed(종료)·iCook/BlendVision(모회사 HQ JP)·Disquiet/PopDaily(일반 UI) 등 탈락.\n\n- KR: nhn wrtn tmap ncsoft spoqa stibee zepeto shift\n[…]\ngency-jp dmm pepabo gaudiy speeda cybozu goodpatch nintendo mikan\n- 배치별 audit: data/reference-audits/2026-06-17-{kr,us,tw,jp}10.md\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v1.8.2 — catalog +40 (KR/US/TW/JP IT) → 286",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-17T08:14:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f2450ba45f1196f1ac9bf6acfec356f5296084a2",
          "body": "/privacy (EN, canonical) + /privacy/ko (PIPA: 처리방침 12조, 국외이전 6요소), friendly no-login scope. Linked from the consent banner and the footer. Per-provider transfer safeguards (Google DPF / Mixpanel SCC), retention worded to match the GA4 setting, withdrawal control embedded.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(web): add EN + KR privacy policy pages",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-16T17:51:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "043af994ebb7e37c728c98b5b7df002cd13f451b",
          "body": "Run GA4 (acquisition) + Mixpanel US (product/funnel) in parallel, dual-fired\nfrom the single gtag.ts event() wrapper so all named events mirror with zero\ncall-site changes. Upstash stays the popularity source of truth.\n\nConsent gate (GDPR + PIPA):\n- GA Consent Mode v2: EEA/UK/CH denied by default, g\n[…]\ngn-systems detail: pair the missing trackRef('copy'|'download') with the\n  GA events so Upstash counts the highest-intent surface.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): add Mixpanel alongside GA4 behind a consent gate",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-16T17:51:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "84b3a5a299038403848749bd1846d07c7d1b9eaf",
          "body": "Group the Country dropdown + Hot toggle into one non-wrapping flex unit so HOT no longer strands on its own wrapped line at the tail of the facet row (invisible on small screens) — it now wraps together with Country.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): keep the Hot filter visible beside Country on mobile",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-16T17:50:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a49f78f1f3322653f65dfea6e00d88c6ed946abb",
          "body": "…eview polish\n\nHome / landing:\n- Replace \"Open Builder\"/\"Build\" CTAs with \"Get Started\" (nav, hero, final CTA band)\n- Live GitHub star count: cached /api/github-stars route + shared useGithubStars\n  hook (one fetch, module-cached); compact [icon · count · star] pill in the nav\n- Drop the redundant \"\n[…]\nthe Back button with a \"<- reference > <Brand>\" breadcrumb\n- Remove the redundant brand <h2> and the \"N components · N lines\" line\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): landing CTA refresh + live GitHub star button + builder pr…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-16T08:38:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f96fc36db0e3109192e5fd6508d9049e11024e1",
          "body": "…line\n\n- KR 10: 3o3, teamblind, miricanvas, imweb, modusign, ringle, postype, laundrygo, greeting, danawa\n- JP 5: rakuten, wantedly, abema, stores, timee\n- TW 5: accupass, funnow, firstory, omnichat, greenvines\n- US 5: google, microsoft, adobe, salesforce, dropbox\n- new gates: web/scripts/verify-ref\n[…]\nuctions.md; omd:batch-launch delegates to the same pipeline\n- fix: favicon logo slugs must be full URLs (3 refs), stores tokens YAML parse error\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v1.8.1 — catalog +25 (KR/JP/TW/US) + scripted reference pipe…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T16:10:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "778d7db985514b3df17275544c76bca55d0f32dd",
          "body": "…osed-status handling, single-writer rule, status-flip guards (#25 #26)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): final-review prose fixes — trigger disambiguation, prop…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T12:20:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aa1f3ea55bc31b690c408d02b6e27700c05f065f",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v1.8.0 — close the taste loop",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T11:17:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bf12f61d3cd84ee2b256acebbf8e7d7f7e92b6db",
          "body": "…-LD (refs #28)\n\ndocs/page.tsx's FAQ array and layout.tsx's JSON-LD FAQPage duplicated Q&A\ncontent. New src/data/faq.ts exports the canonical EN list with a jsonLd\nflag: layout renders the flagged subset (rendered FAQPage schema verified\nbyte-equivalent — same 6 questions/answers/order), /docs rende\n[…]\n with\na header note pointing at the shared EN module. llms-full.txt refreshed by\nthe build (also catches up the SKILL.md edits from this issue).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(web): single-source the EN FAQ for /docs and the layout JSON…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T11:14:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d65d173bcea67ac9dbd862763bfe0082eeaf61d7",
          "body": "… (refs #28)\n\nAudit P2 leftovers for npx users:\n- omd-reference-capture no longer cites .claude/skills/omd-add-reference\n  (ships nowhere) — inspect pattern described inline, with honest fallback\n  prose pointing to oh-my-design.kr/design-systems and the dev-repo-only\n  omd-add-reference workflow.\n-\n[…]\n a fictional example.\n- omd-init Phase 6B: omd-sync template path now uses the installed\n  .claude/skills/... location with a dev-repo fallback.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills,agents): remove dangling dev-only paths from shipped docs…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T11:11:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "969befa988c03c28ba4d30a5ce7057f442ef19e6",
          "body": "… loops (refs #28)\n\nThe target→dir mapping (claude-code→.claude, codex→.codex, cursor→shared\n.claude data, opencode→none) was repeated as if-else/ternary chains in\nthree places: the data-JSON loop, the reference-catalog loop, and the\nctx-prime helper copy. Extracted CHANNEL_DATA_DIRS + dataDirFor(),\n[…]\nataFile's target param is now explicit at every call\nsite. New test asserts cursor+claude-code combined install doesn't\ndouble-copy the catalog.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(cli): single channel→data-dir lookup for install-skills copy…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T11:08:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "63db247f610753cf061df5f3c8f91ab6fc26bd48",
          "body": "… test (refs #28)\n\nThe .claude/data → node_modules → web/references → oh-my-design.kr fetch\norder was prose-duplicated across omd-init/omd-harness/omd-reference-capture\nSKILL.md and agents/omd-master.md with drifting paths (harness cited the\ndev-only web/references path directly; reference-capture l\n[…]\n to identical paths/order, anchored\nby an omd:catalog-resolution-order marker, and a unit test parses all four\nand fails CI on any future drift.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): normalize catalog 4-tier resolution order + drift-guard…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T11:06:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0b18efd95ab09ddcc889614e60138cfe3bd68bf8",
          "body": "omd:designer-review and omd:final-qa gain a final phase after the\nreport/verdict: scan this run's findings for recurring patterns — same\naxis (radius/color/spacing/typo/voice) >=2 times in the run, or a finding\nmatching an existing pending preference scope in .omd/preferences.md —\nand propose record\n[…]\nrubric items (a11y/perf/links) are excluded from\ncandidates. Each section carries a one-line 수동 검증 note (prose skills\n— no unit tests possible).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(skills): reviewer findings feed the taste loop (#26)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T10:57:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eba39d51b7358ce218605f8ace49b23d5fcff2cb",
          "body": "New skill renders everything the taste loop knows in one read-only view:\napplied (with DESIGN.md § routing from omd:learn), pending (recurrence,\nconfidence, distance to the fold-in threshold), snoozed proposal scopes,\nand 1-2 axes the system has never heard a preference about. Inline action\nguidance\n[…]\n17 incl. layout.tsx JSON-LD featureList, docs, faq, CTA).\n\nTest: installer places omd-taste with frontmatter-first format (47 unit\ntests green).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(skills): omd:taste — taste dashboard for the learning loop (#25)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T10:55:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "30174dcc61fbdd6fff41d139ad34433e9abf4ed4",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: bump checkout/setup-node to v5 — Node 24 runners (#29)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T10:48:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6a3c1b47b165e0d7feabaaa1feeed4ab0d210e6f",
          "body": "…nline styles (#24)\n\nLive bench found two real-world blind spots: omd:harness emits .html\nprototypes (excluded by the file filter) and React inline styles use\ncamelCase quoted values (borderRadius: \"9999px\") which the kebab-only\nregexes missed. Both axes (radius/motion) now match either form.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hooks): ambient capture detects .html outputs and camelCase JSX i…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T09:26:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9595f39e25027532762b9eb38533eded7543989b",
          "body": "…oc (#27)\n\nscripts/bench/score-taste.mjs scores operator-driven headless artifacts\n(does not invoke claude itself): canonical pending entry(2) / correct\nscope(1) / shipped parser roundtrip(1) / conflict-with-reference flagged\nin transcript(1, 0.5 default without --transcript) / second-run artifact\nr\n[…]\ntaste-loop\". README documents the 2-bench release routine\n(first-60s baseline 10/10 @1.7.2 + taste-loop) with exact operator commands.\n\nRefs #27\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: taste-loop runtime benchmark scorer + 2-bench release routine d…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T09:19:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b236a1c1a6e607a94ea360bcb5ac927a5d3b150e",
          "body": "…tart (#23)\n\nsession-end-foldin now also writes .omd/foldin-proposal.json\n({ created_at, status, scopes[{scope,count,score,entry_ids,summary}] })\nwhen scopes cross the existing threshold — prior proposal is overwritten\nunless snoozed with no new recurrence since snoozed_at. session-state-loader\ninje\n[…]\n\nomd-learn SKILL.md documents the fold-in invocation path\n(applied / partial / snoozed status updates). Threshold semantics unchanged.\n\nRefs #23\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hooks): auto-fold gate — foldin proposal asked at next session s…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T09:17:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c738845f318ccea141df117bf2203b2fde9e4030",
          "body": "post-edit-watch now records detected drift to .omd/preferences.md via the\nnew shared lib/preferences-writer.cjs (canonical omd:remember format —\nsignal: ambient, confidence: inferred, 24h scope+body dedup) while keeping\nthe one-line alert. Detection expands beyond hex colors to radius\n(rounded-* / b\n[…]\ndup + future consumers).\nWriter shipped via installer hook list (package.json files allowlist\nalready covers .claude/hooks/lib/*.cjs).\n\nRefs #24\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hooks): ambient capture persists + radius/motion axes (#24)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T09:16:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab6d3027fe9a9516d6503981d75e555ac4d8443c",
          "body": "…el additionalContext holdout (#18 class)\n\nRuntime taste-loop verification found the pending-count message was\nemitted as top-level JSON, which SessionStart parses and drops. Same\nfix as post-edit-watch / skill-activation. Ships with v1.7.3.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hooks): session-state-loader SessionStart envelope — last top-lev…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T08:54:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "323a132e769b493aeae8f73066dd0cef54cfdbed",
          "body": "…red 10pt deterministic\n\nRun per release: clean install → claude -p '<ref>-style setup' →\nscore-init.mjs --dir <d> --ref <id>. Catches the fabrication failure\nmode (#16) via reference-hex presence check. Ledger: research/bench-results.jsonl.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: first-60s runtime benchmark scorer — headless omd:init flow sco…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T08:37:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8d64c9a96f89cb3741a9182fe7a58f61571048b8",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: npm publish workflow on version tags (provenance, tag/version gate)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T07:55:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5f3f95481dcc2bded6816f7fe30594943b432f44",
          "body": "…tmatter tolerance, single-source first prompt\n\n- skill-activation.cjs: gate message was emitted as top-level\n  { additionalContext }, which UserPromptSubmit parses as JSON and drops;\n  now wrapped in hookSpecificOutput (same class as the post-edit-watch\n  fix in #18, this hook was missed)\n- withMan\n[…]\nce moved to lib/core/builder-prompt\n  as the single source; install-cta imports them (base sentence and\n  provenance format can no longer drift)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: code-review findings — UserPromptSubmit hook envelope, CRLF fron…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T07:40:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a86bf3ad3769a60aca9dbdb0849b6e213d019d7e",
          "body": "Build artifacts re-emitted by build-registry.mjs / gen-llms-full.cjs\nafter the version bump and README/CHANGELOG restructure.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(web): regenerate version + llms-full.txt for v1.7.2",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T07:31:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d51064da6f46dbff9de74d0c16d2cddc8e37cb47",
          "body": "…init\n\nCHANGELOG entry summarizing the growth-sprint-d1 branch: installed-skill\nmarker below frontmatter, local reference catalog + ctx-prime, website\n.md fallback, cursor install channel, hook revival, omd:init apply-mode\nconfirmation, builder prompt handoff; site-only notes for .md twins,\ncollections, install funnel, The Wall fix, README restructure.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v1.7.2 — first-run install fixes, cursor channel, safer omd:…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T07:30:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f4e6c4425482290152d3a7aef36c0f1e6cf9adce",
          "body": "…ollections, builder handoff\n\n- docs quick-start documents --agent cursor as a first-class channel;\n  install-layout table adds the .cursor/rules row and fixes stale\n  codex/opencode paths (.agents/skills, .opencode/skills)\n- FAQ: cursor answer reflects the dedicated install channel; new\n  entries f\n[…]\n handoff\n- CliStrip output line lists all four channel paths incl. .cursor/rules\n- layout.tsx JSON-LD + KR /faq mirror the updated cursor answer\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(web): sync docs page + landing with cursor channel, .md twins, c…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T07:29:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b2e6463367482b6906acfdbc8ef44a93c8324ab",
          "body": "…e path\n\nEN 231→~130 lines: header → what-is → install → first-60-seconds →\nsupported agents (Cursor now a first-class --agent cursor channel) →\ncompact what's-inside (16 skills · 16 agents · 221 references · hooks,\ndeep reference moved to oh-my-design.kr/docs) → upgrading → links.\nKO/JA/ZH-TW mirror the same structure and drop the stale v0.1-era\ncontent (107-reference tables, philosophy deep-dive, project layout).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): restructure all four READMEs around the install→activat…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T07:26:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f76128976ff9aaaec855746b321d50a3b6f1f33e",
          "body": "Tiles are now static brand chips — keep hover tilt/sheen/spotlight and\nthe mobile show-more collapse, drop the click-to-zoom FillPanel overlay,\nnudge pulse, and all dead state/handlers.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): remove buggy card-expand interaction from The Wall",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T07:23:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ec6631d1a45cd7c9b465aa16dca9eb60a93dcbec",
          "body": "…lder URL, copy full text (#19)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(web): cap install-cta prompt pill width — show prompt without bui…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T06:26:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4e81e3daa3a7531cc78c9d39985c1e35757acb1a",
          "body": "The preview step's InstallCta copied a generic 'Set up our design\nsystem — <brand>-style.' line, dropping the user's step-2\ncustomizations encoded in the cfg param. The prompt is now built from\nthe in-memory config via a pure buildBuilderPrompt() helper: base\nsentence + only non-default axes (compon\n[…]\nrompt and GA4 prompt_copy is\nunchanged. omd-init Phase 4.3 notes recording requested_components\nand treating the builder URL as provenance only.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(builder): compose first prompt from live builder config (#19)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T06:19:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "171c9f160d6e8eeb703476dd385bc02b4ba1943a",
          "body": "…-only, ask before replacing existing DESIGN.md (#21)\n\nPhase 3.5 added: after reference selection, ask (AskUserQuestion on\nClaude Code) whether to bootstrap the project DESIGN.md or save the\noriginal as design-references/<id>.md for consultation only. When a\nroot DESIGN.md already exists, replacement now requires explicit\nconfirmation (backup to DESIGN_DEPRECATED.md is stated up front).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(omd-init): apply-mode confirmation — root bootstrap vs reference…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T06:09:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5f49f3510fa7d1963b86cbb6d93f8fc572a0693b",
          "body": "…el (#21)\n\n- omd:init Phase 2.4: on Claude Code, present the top-5 reference pick\n  via one AskUserQuestion (5 candidate ids as options, 1-line fingerprint\n  descriptions: category + tone keywords; free-text ids still accepted\n  via the auto 'Other'). Codex/OpenCode keep the existing prose format.\n \n[…]\nde Code with multiSelect where a question\n  allows multiple answers; prose single-batch fallback elsewhere.\n  Question budget unchanged (max 4).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skills): selectable-option clarification UI on Claude Code chann…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T05:16:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ba7dc19d94fad10c763c320679de06d4bc66eeb",
          "body": "…og (#20)\n\n- install-skills accepts `--agent cursor` and offers Cursor in the TUI\n  channel multiselect (auto-detected when .cursor/.cursorrules exists).\n- Cursor channel writes .cursor/rules/omd-design.mdc with the EXACT\n  omd:sync cursor template (body-hash marker included, so a later\n  omd:sync r\n[…]\nwrites shim + catalog and leaves\n  .claude/skills, hooks, settings.json, agents absent; drift-guarded\n  user rule files survive without --force.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): cursor install channel — .cursor/rules shim + shared catal…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T05:15:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a361a5e33862bcdcb0d1f087450f033bae8e8783",
          "body": "- Builder preview step now renders InstallCta as the same sticky bottom\n  bar as the reference detail pages (variant='bar', source='builder';\n  install_copy/prompt_copy events unchanged). Main content gets pb-24 on\n  preview and ScrollToTop lifts to bottom-20 so the two floating controls\n  never ove\n[…]\n  and the preview header DS chip. Fixes logos vanishing when a brand's\n  primary color matches its logo color (e.g. toss/tossbank blue-on-blue).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): builder floating install CTA + neutral logo nameplate (#19)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T05:10:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5d5c006d854d288a44b9455c0d78f3f22a1635d6",
          "body": "Builder is the main funnel surface (hero/nav/FAQ + cards all route here), so\nclose the loop: add InstallCta(source='builder') to the preview step — fires\ninstall_copy{source:'builder',reference} / prompt_copy{reference}. Add a\n'builder' source variant to install-cta. Also fire GA4 builder_export\n{reference,format} alongside both trackRef('generate') Redis calls.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): InstallCta + GA4 funnel events on builder preview (#4)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T04:43:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2dd9b63c0505162e83b0f88985d0009f37561ded",
          "body": "- post-edit-watch: read snake_case tool_input (camelCase fallback) and emit\n  hookSpecificOutput.additionalContext per the PostToolUse contract (top-level\n  additionalContext was silently dropped).\n- preferences: add shared lib/preferences-parser.cjs that parses the CANONICAL\n  omd:remember format (\n[…]\natching for\n  Latin cues; drop bare 색 → 색상; never crash on malformed stdin.\n- hook unit tests with realistic snake_case / prompt-field payloads.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hooks): revive dead hooks on clean installs (#18)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T04:42:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "046569ff250285b1a3f56aed292bfa0e02dfdb1a",
          "body": "… install (#16)\n\nClean npx installs have no node_modules and no dev web/references, so all\nreference-resolution paths missed. Now install-skills copies each\nweb/references/<id>/DESIGN.md into .claude/data/references/<id>/DESIGN.md\n(DESIGN.md only, --skills-only skips it) and prints a count line. Als\n[…]\n\nomd-harness (.claude/data first, then node_modules, then dev, then website\nfetch). Fix harness OMD_DIR to try local node_modules before global.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(install): copy reference catalog + ctx-prime into .claude/data on…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T04:38:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc0b73df39465013d031a95dfd926d3a1c4a57f0",
          "body": "Claude Code registered the leading HTML comment as the skill description,\nkilling description-based trigger routing for all installed skills. Move the\nmarker below the closing --- so the frontmatter name/description are line 1.\nMarker detection now scans the first ~30 lines (new + legacy line-1 position)\nso pre-v1.7.2 installs are refreshed, not skipped as drift.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(install): write installed-skill marker after frontmatter (#17)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T04:36:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5db2ce4085413aafafa52c8aec4c716d7f804ce2",
          "body": "… installs (#16)\n\nClean npx installs ship no local reference catalog (all 3 resolution\npaths miss), causing omd:init to fail or silently invent a DESIGN.md.\nAdd fallback 4: fetch https://oh-my-design.kr/design-systems/<id>.md\n(the raw twin endpoints from #3) and cache to .claude/data/references/.\nExplicitly forbid fabricating a DESIGN.md when all paths fail.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(omd-init): add website .md fallback for catalog resolution on npx…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T03:58:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "758ccea2b0ebae0c85b9612724c763dbfbde01df",
          "body": "- scripts/growth-snapshot.mjs: npm last-day downloads + GitHub stars →\n  one JSON line appended to research/sprint-metrics.jsonl (research/ is\n  gitignored by design — internal sprint data stays local)\n- GA4 DAU left as a TODO (no Data API creds) with manual entry via\n  --dau; --notes for context\n- Baseline recorded locally: stars 238, npm_day 34, dau 150 (manual)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(scripts): growth-snapshot metrics logger (#7)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T03:54:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "42eefc7b744a723eafcff63a2b265c476ed388ca",
          "body": "- lib/collections.ts: claude-code-design-md / cursor-design-md /\n  korean-fintech / korean-apps / japanese-brands / dev-tools /\n  clean-saas / dark-mode — registry-driven filters (country/category),\n  token canvas-luminance detection for dark-mode, id allowlists for the\n  two agent starter packs; <6\n[…]\nnd fallback)\n- sitemap.ts: 8 collection URLs at priority 0.8 (raw .md twins still\n  excluded); /design-systems hero gains a Collections chip row\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): 8 curated collection pages at /collections/[slug] (#5)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T03:53:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0989834504e40a82a7f065af957ef093e543a880",
          "body": "… (#4)\n\n- <InstallCta> shared component (bar + block variants): copy buttons for\n  the npx install command and the per-brand first prompt\n  (\"Set up our design system — <Brand>-style.\")\n- Sticky CTA bar on every reference detail page (source: ref_detail),\n  brand name derived from the registry ds.na\n[…]\nthe Redis copy counter via trackRef when a\n  reference is in context — funnel: arrive → ds_detail_view →\n  install_copy → npm DL (external join)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): install CTA + GA4 funnel events install_copy / prompt_copy…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T03:48:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fd0cfef7b1d9085fce792c5bffa4723c44678c23",
          "body": "- /r/[id] route handler serves references/<id>/DESIGN.md as\n  text/markdown; charset=utf-8, SSG'd over all 221 ids, with a 2-line\n  attribution footer (source page + npx install command)\n- App Router can't express a partial dynamic segment ([id].md), so the\n  pretty URL is an afterFiles rewrite in n\n[…]\naw twin)\n- scripts/smoke-md-twins.mjs: static coverage checks + optional --base\n  HTTP smoke (all 221 URLs verified 200 + text/markdown locally)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(web): raw DESIGN.md twin endpoints at /design-systems/<id>.md (#3)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-10T03:47:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8354227dae087fda417dbee0f6ee7dd92dc4b7f9",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v1.7.0 — machine-readable token catalog + structured components",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6c7caa7caafbf67bb82f42e342ee04a1ca782034",
          "body": "…pdate docs/search\n\nFinal-session audit across 4 areas:\n1. Search — native-language aliases extended to global brands (KR translit:\n   넷플→netflix, 깃헙→github, 챗GPT→openai, 비엠→bmw …); KR/TW/JP/CN already 100%.\n2. Docs — every stale '100+' catalog count → '221' (README, landing, layout\n   metadata/JSON\n[…]\nus, oliveyoung), re-synced 12\n   drifted mirrors, removed a stray web/design-md dir.\n221 refs, 442/442 tests, 0 mirror mismatches.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(final-verify): enforce structured-component format, fix gaps, u…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cd5dc8f39a0a6a4c7989570101f16f15c2614c44",
          "body": "Searching a brand's native name now resolves it: 11번가→11st, 숨고→soomgo,\n크몽→kmong, 痞客邦→pixnet, 國泰→cathay, 好學校→hahow, 無印良品→muji, etc.\nAdded aliases for this session's 21 new refs (KR 10 + TW 10) plus 50 older\nAsian refs that had none — KR/TW/CN now 100% covered (JP all but 'studio',\nwhose スタジオ is too generic to index safely). 139 alias entries total;\nrefMatchesQuery (used by every search surface) folds them into the haystack.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(search): native-language aliases for all KR/TW/JP/CN refs",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f708ff7d0901ccfa42e9106c6d65c163d9fd7c54",
          "body": "…skill)\n\nsoomgo, kmong, jandi, hyperconnect, shinhancard, 11st, brandi, genie, nexon,\nfinda — each via live playwright inspect through the updated omd-add-reference\nflow: ~330-430 line DESIGN.md, .verification.md proof (>=5 samples + 2 KR\nregional sources), STRUCTURED tokens.components ({type,…} + c\n[…]\nec-only, 0 console errors, logos load. 442/442 tests pass. Fixed 2 missing\nspaces before '{' (11st/genie) caught by the YAML gate.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(refs): add 10 Korean references (validates structured-component …",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c361f4c2f05f7e39cf3503606b155b33da71355",
          "body": "…omponents\n\nNew references now emit structured component tokens ({type, bg, fg, radius, …} +\ncomponents_harvested) that the renderer reads directly via componentsFromTokens,\nmatching the catalog-wide migration. Also notes favicon-via-Google-proxy for\nlogo reliability. Keeps §4 prose for humans; structured tokens are the render\nsource. (.agents mirror synced.)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skill): omd-add-reference Phase 4.5 requires structured tokens.c…",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "225d7a083c8c79784272ba385d391744ff110bfe",
          "body": "…reliability\n\nQA sweep of all 211 refs (console errors / logos / component render / spec-only):\n- 0 console errors, 0 refs with missing component cards.\n- spec-only: structured components with only {type, use} now render a type-default\n  instance (input box, filled button, badge, bordered toast/dial\n[…]\n). The earlier 0px readings were slow-external-image timing,\n  not breakage; re-sweep at 1.2s wait shows 0 broken.\n432 tests pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(qa): render type-default components (no more 'spec only') + logo …",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3de55c1cd8c60f602dc8cc2fe49ddd3addc6df25",
          "body": "Pure foreground read as harsh black; bg-foreground/75 gives a natural charcoal\ngray in light mode and a soft light-gray in dark mode (visible, not harsh) while\nstaying theme-aware. 432 tests pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(preview): soften spacing/radius fills to foreground/75",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bf8685ee760bfd2ef33da43e2eed05f983bf882a",
          "body": "Both the Spacing blocks and the Border Radius preview squares now use\nbg-foreground (near-black in light, near-white in dark) instead of brand-primary\ntints. The radius corners are now clearly legible (4px→12px rounding reads at a\nglance) and spacing widths pop — matching getdesign.md's tactile style. 432 pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(preview): black fills for spacing blocks + radius previews",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a4d6e2a50a114d06f65d5ce83e65c032252598bb",
          "body": "Spacing preview bars were thin (12px), heavily rounded, and a light primary\ntint, so small values read as soft dots and the scale didn't land. Now: 26px\ntall, near-square (2px radius), solid brand-primary fill — small tokens render\nas solid blocks and the width difference (8 vs 16px) is legible at a glance.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(preview): tactile spacing blocks (getdesign.md style)",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b7de11eb2689e3a5797eec7e35ff8eb5d34992fb",
          "body": "- Spacing preview bars now render at ACTUAL pixel width (8px → 8px bar, 16px →\n  16px) instead of normalizing to the column width, which inflated an 8px token\n  into a huge bar and hid the true scale.\n- Buttons/badges with no explicit bg no longer fall to a dead gray #888 on a\n  black tile: resolve \n[…]\nhe real teal gradient) or the brand primary.\n  variantNeedsDarkTile is gradient/primary-aware so the tile matches.\n432 tests pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(preview): real-width spacing bars + gradient/primary button fills",
          "author_name": "kwakseongjae",
          "author_login": "kwakseongjae",
          "committed_at": "2026-06-09T10:24:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 16,
      "commits_last_year": 287,
      "latest_release_at": "2026-07-21T07:40:08Z",
      "latest_release_tag": "v1.9.0",
      "releases_from_tags": true,
      "days_since_last_push": 7,
      "active_weeks_last_year": 15,
      "days_since_latest_release": 7,
      "mean_days_between_releases": 5.1
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "oh-my-design-cli",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "design-system",
            "design-md",
            "ai-agent",
            "claude-code",
            "codex",
            "opencode",
            "cursor",
            "skills",
            "design-skills",
            "google-stitch",
            "vibe-coding"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/oh-my-design-cli",
          "is_deprecated": false,
          "latest_version": "1.9.0",
          "repository_url": "https://github.com/kwakseongjae/oh-my-design",
          "versions_count": 31,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3485,
          "first_published_at": "2026-04-26T12:04:22.641000Z",
          "latest_published_at": "2026-07-21T07:43:30.084000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 7
        }
      ]
    },
    "popularity": {
      "forks": 35,
      "stars": 396,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-04-16",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-04-25",
            "count": 1
          },
          {
            "date": "2026-04-30",
            "count": 1
          },
          {
            "date": "2026-05-01",
            "count": 1
          },
          {
            "date": "2026-05-05",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 5
          },
          {
            "date": "2026-05-09",
            "count": 1
          },
          {
            "date": "2026-05-16",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 2
          },
          {
            "date": "2026-05-25",
            "count": 1
          },
          {
            "date": "2026-05-28",
            "count": 1
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-10",
            "count": 1
          },
          {
            "date": "2026-06-13",
            "count": 1
          },
          {
            "date": "2026-06-26",
            "count": 1
          },
          {
            "date": "2026-07-07",
            "count": 1
          },
          {
            "date": "2026-07-11",
            "count": 1
          },
          {
            "date": "2026-07-12",
            "count": 1
          },
          {
            "date": "2026-07-14",
            "count": 1
          },
          {
            "date": "2026-07-16",
            "count": 3
          },
          {
            "date": "2026-07-18",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 1
          },
          {
            "date": "2026-07-21",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 35,
        "total_forks": 35
      },
      "star_history": null,
      "open_issues_and_prs": 15
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "packages/mcp/tsconfig.json",
        "tsconfig.json",
        "web/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 1312548,
      "source_files_sampled": 424,
      "oversized_source_files": 6,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "agents/AGENT.md",
        "web/AGENTS.md",
        "web/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 9815
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "web/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 5,
        "malicious_count": 0,
        "assessed_package": "npm:oh-my-design-cli@1.9.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@clack/prompts",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.9.1"
        },
        {
          "name": "commander",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^13.1.0"
        },
        {
          "name": "picocolors",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.1.1"
        },
        {
          "name": "@anthropic-ai/sdk",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.98.0"
        },
        {
          "name": "@base-ui/react",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.3.0"
        },
        {
          "name": "@upstash/redis",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.37.0"
        },
        {
          "name": "class-variance-authority",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.7.1"
        },
        {
          "name": "clsx",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.1.1"
        },
        {
          "name": "framer-motion",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.38.0"
        },
        {
          "name": "lucide-react",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.8.0"
        },
        {
          "name": "lz-string",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.5.0"
        },
        {
          "name": "mixpanel-browser",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^2.80.0"
        },
        {
          "name": "next",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "16.2.6"
        },
        {
          "name": "next-themes",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.4.6"
        },
        {
          "name": "react",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.4"
        },
        {
          "name": "react-dom",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "19.2.4"
        },
        {
          "name": "react-markdown",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.1.0"
        },
        {
          "name": "rehype-raw",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^7.0.0"
        },
        {
          "name": "rehype-sanitize",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.0.0"
        },
        {
          "name": "remark-gfm",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.0.1"
        },
        {
          "name": "tailwind-merge",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.5.0"
        },
        {
          "name": "zod",
          "manifest": "web/package.json",
          "ecosystem": "npm",
          "version_constraint": "4.4.3"
        }
      ],
      "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": 4,
        "merged_prs": 7,
        "open_issues": 11,
        "closed_ratio": 0.711,
        "closed_issues": 27,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "kwakseongjae",
          "commits": 287,
          "avatar_url": "https://avatars.githubusercontent.com/u/87296259?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "quality.yml",
        "release.yml",
        "reverify.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 6,
            "reason": "3 out of 5 merged PRs checked by a CI test -- score normalized to 6",
            "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/20 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 3 contributing companies or organizations -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 3,
            "reason": "dependency not pinned by hash detected -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "33 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "0a7f3a1e17814c8a1b000ce075b3b2620b70db9e",
        "ran_at": "2026-07-29T06:31:43Z",
        "aggregate_score": 5.1,
        "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-29T03:37:15Z",
      "oldest_open_prs": [
        {
          "number": 39,
          "created_at": "2026-06-16T05:49:54Z",
          "last_comment_at": "2026-06-16T05:50:10Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 44,
          "created_at": "2026-07-07T14:31:11Z",
          "last_comment_at": "2026-07-07T14:31:16Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 45,
          "created_at": "2026-07-07T14:32:27Z",
          "last_comment_at": "2026-07-07T14:32:31Z",
          "last_comment_author": "vercel"
        },
        {
          "number": 46,
          "created_at": "2026-07-07T14:33:24Z",
          "last_comment_at": "2026-07-07T14:33:28Z",
          "last_comment_author": "vercel"
        }
      ],
      "last_merged_pr_at": "2026-07-21T07:49:08Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 22,
          "created_at": "2026-06-10T05:00:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 30,
          "created_at": "2026-06-15T12:27:06Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 31,
          "created_at": "2026-06-15T12:27:08Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 32,
          "created_at": "2026-06-15T12:27:10Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 33,
          "created_at": "2026-06-15T12:27:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 34,
          "created_at": "2026-06-15T12:27:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 35,
          "created_at": "2026-06-15T12:27:15Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 36,
          "created_at": "2026-06-15T12:27:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 37,
          "created_at": "2026-06-15T12:27:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 38,
          "created_at": "2026-06-15T12:27:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 43,
          "created_at": "2026-07-06T10:02:11Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/kwakseongjae/oh-my-design",
    "host": "github.com",
    "name": "oh-my-design",
    "owner": "kwakseongjae"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 68,
      "inputs": {
        "security": 61,
        "vitality": 80,
        "community": 57,
        "governance": 57,
        "engineering": 86
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 80,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "commits_last_year": 287,
              "human_commit_share": 1,
              "days_since_last_push": 7,
              "active_weeks_last_year": 15
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "15/52 weeks with commits",
                "points": 10.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "287 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 287
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 30 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": 88,
            "inputs": {
              "releases_count": 16,
              "latest_release_tag": "v1.9.0",
              "releases_from_tags": true,
              "days_since_latest_release": 7,
              "mean_days_between_releases": 5.1
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "16 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.1 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.1
                    }
                  }
                ],
                "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": 57,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "forks": 35,
              "stars": 396,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "396 stars",
                "points": 42.1,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 396
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "35 forks",
                "points": 12.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 35
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "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": 6.3,
                "status": "met",
                "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": 59,
            "inputs": {
              "packages": [
                "oh-my-design-cli"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 3485
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,485 downloads/month across npm",
                "points": 47.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3485,
                      "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": 57,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "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 3 contributing companies or organizations -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "merged_prs": 7,
              "open_issues": 11,
              "closed_issues": 27,
              "issue_closed_ratio": 0.711,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "71% of issues closed",
                "points": 33.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 71
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "7/7 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 7,
                      "decided": 7
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/20 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "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": 54,
            "inputs": {
              "followers": 34,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "kwakseongjae",
              "public_repos": 48,
              "account_age_days": 1843
            },
            "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": "34 followers of kwakseongjae",
                "points": 11.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 34,
                      "login": "kwakseongjae"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "48 public repos, account ~5 yr old",
                "points": 22.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 48
                    }
                  },
                  {
                    "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": [
                "oh-my-design-cli"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 7
            },
            "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 7 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "31 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 31
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 86,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": "eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "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": "3 out of 5 merged PRs checked by a CI test -- score normalized to 6",
                "points": 12,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "cli",
                "design-md",
                "design-system",
                "design-tokens",
                "google-stitch",
                "nextjs",
                "open-source",
                "react",
                "shadcn-ui",
                "tailwindcss",
                "typescript",
                "vibe-coding"
              ],
              "has_wiki": true,
              "homepage": "https://oh-my-design.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://oh-my-design.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": "12 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "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": "moderate",
        "name": "Security",
        "value": 61,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 5.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "3 out of 5 merged PRs checked by a CI test -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/20 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 3 contributing companies or organizations -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "33 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:oh-my-design-cli@1.9.0 runtime dependency closure — what installing the published package pulls in — 5 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:oh-my-design-cli@1.9.0",
                  "assessed": 5
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 5,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 5,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "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": "good",
        "name": "AI Readiness",
        "value": 72,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 0.96,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "agents/AGENT.md",
                "web/AGENTS.md",
                "web/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 9815
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, agents/AGENT.md, web/AGENTS.md, web/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, agents/AGENT.md, web/AGENTS.md, web/CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "96 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 96,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 67,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [
                "packages/mcp/tsconfig.json",
                "tsconfig.json",
                "web/tsconfig.json"
              ],
              "agent_commit_share": 0.86,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": "eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "packages/mcp/tsconfig.json, tsconfig.json, web/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "packages/mcp/tsconfig.json, tsconfig.json, web/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": "86 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 86,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "good",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 81,
            "inputs": {
              "primary_language": "HTML",
              "largest_source_bytes": 1312548,
              "source_files_sampled": 424,
              "oversized_source_files": 6
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "HTML with type-check config (packages/mcp/tsconfig.json, tsconfig.json, web/tsconfig.json)",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "typecheck_config_language",
                    "params": {
                      "files": "packages/mcp/tsconfig.json, tsconfig.json, web/tsconfig.json",
                      "language": "HTML"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "6/424 source files over 60KB",
                "points": 54.2,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 424,
                      "oversized": 6
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "critical",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? 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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T06:31:57.600477Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/kwakseongjae/oh-my-design.svg",
  "full_name": "kwakseongjae/oh-my-design",
  "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.