Public record
Software health reportschema 0.27.0 · metrics 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 stars⑂ 35 forkssince Apr 2026View on GitHub ↗

kwakseongjae/oh-my-design holds a health index of 68 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (86/100) and lowest on Sustainability & Governance (57/100). It was last updated 7 days ago. A single contributor accounts for most of its recent work.

68
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

68
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

곽성재Personal account
34 followers48 public repossince Jul 2021HONGIK UNIVERSITY

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npmoh-my-design-cli1.9.03,485317 days agodesign-systemdesign-mdai-agentclaude-codecodexopencodecursorskillsdesign-skillsgoogle-stitchvibe-coding

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

80Good · 22% of overall
How it's scored
36/36Push recency — last push 7 days ago
10.4/36Commit cadence — 15/52 weeks with commits
18/18Commit volume — 287 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year287
human_commit_share1
days_since_last_push7
active_weeks_last_year15
How it's scored
16.2/27Ships releases — 16 version tags (no GitHub releases)
36/36Release recency — latest release 7 days ago
27/27Release cadence — a release every ~5.1 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count16
latest_release_tagv1.9.0
releases_from_tagsyes
days_since_latest_release7
mean_days_between_releases5.1
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

57Moderate · 18% of overall
How it's scored
42.1/60Stars — 396 stars
12.8/25Forks — 35 forks
0/15Watchers — 1 watchers
Inputs used
forks35
stars396
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateyes
How it's scored
47.2/80Monthly downloads — 3,485 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesoh-my-design-cli
dependents
ecosystemsnpm
total_downloads
monthly_downloads3,485
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

57Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
10/10OpenSSF Scorecard: Contributors — project has 3 contributing companies or organizations -- score normalized to 10
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
33.2/46.8Issue resolution — 71% of issues closed
38.2/38.3PR acceptance — 7/7 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/20 approved changesets -- score normalized to 0
Inputs used
merged_prs7
open_issues11
closed_issues27
issue_closed_ratio0.711
closed_unmerged_prs0
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
11.1/25Owner reach — 34 followers of kwakseongjae
22.4/25Track record — 48 public repos, account ~5 yr old
Inputs used
followers34
owner_typeUser
is_verified
owner_loginkwakseongjae
public_repos48
account_age_days1,843
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 7 days ago
20/20Version history — 31 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesoh-my-design-cli
ecosystemsnpm
any_deprecatedno
min_days_since_publish7

Engineering Quality

Are baseline engineering and documentation practices in place?

86Excellent · 20% of overall
How it's scored
24/24CI workflows — 3 workflow(s)
24/24Tests present
16/16Linter config — eslint.config.mjs
0/9.6Pre-commit hooks
0/6.4.editorconfig
12/20OpenSSF Scorecard: CI-Tests — 3 out of 5 merged PRs checked by a CI test -- score normalized to 6
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

100Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://oh-my-design.kr
10/10Repository description
10/10Topics — 12 topics
10/10Wiki
Inputs used
topicscli, design-md, design-system, design-tokens, google-stitch, nextjs, open-source, react, shadcn-ui, tailwindcss, typescript, vibe-coding
has_wikiyes
homepagehttps://oh-my-design.kr
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

61Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — no data
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.5License — 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 — no data
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
0/7.5Vulnerabilities — 33 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate5.1
Excluded from scoring (no data or not applicable): branch_protection, signed_releases. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages5
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
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.

AI Readiness

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.

72Good · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md, agents/AGENT.md, web/AGENTS.md, web/CLAUDE.md
15/15Machine-readable docs (llms.txt) — llms.txt present
40/40Legible commit history — 96 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtyes
legible_history_share0.96
agent_instruction_filesAGENTS.md, CLAUDE.md, agents/AGENT.md, web/AGENTS.md, web/CLAUDE.md
agent_instruction_max_bytes9,815
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — eslint.config.mjs
11/11Static type checking — packages/mcp/tsconfig.json, tsconfig.json, web/tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 86 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
3/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 3
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configspackages/mcp/tsconfig.json, tsconfig.json, web/tsconfig.json
agent_commit_share0.86
toolchain_manifests
dependency_bot_commit_share0
How it's scored
27/45Type-checkable code — HTML with type-check config (packages/mcp/tsconfig.json, tsconfig.json, web/tsconfig.json)
54.2/55Manageable file sizes — 6/424 source files over 60KB
Inputs used
primary_languageHTML
largest_source_bytes1,312,548
source_files_sampled424
oversized_source_files6
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
20/20MCP server
0/40Runnable examples
Inputs used
example_dirs
has_mcp_signalyes
api_schema_files

Key facts

396GitHub stars
1contributors
287commits, last 12 months
7days since last push
16releases
1bus factor
11open issues
npmpackage ecosystems

Data collection 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

More detail

Star and fork history 0 ★ / 35 ⇿
0Stars
35Forks
15Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

01325383552026-042026-062026-07
Major 0Minor 3Patch 12
OpenSSF Scorecard 5.1 / 10
5.1aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-29 06:31 UTC

10Binary-Artifactsno binaries found in the repo
n/aBranch-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/aSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
0Vulnerabilities33 existing vulnerabilities detected
Direct dependencies 22
RegistryPackageVersion constraintManifest
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
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Dependency advisories 0

Installing npm:oh-my-design-cli@1.9.0 pulls in 5 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsnpm.