Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-28 02:00 UTC

yunanwg / brilliant-CV

💼 another CV template for your job application, yet powered by Typst and more

Typst · PythonApache-2.0★ 812 Sterne⑂ 101 Forksseit Apr. 2023Auf GitHub ansehen ↗

yunanwg/brilliant-CV erreicht einen Gesundheitsindex von 73 von 100 und liegt damit im Bereich Gut. Am stärksten schneidet es bei Engineering Quality (92/100) ab, am schwächsten bei Sustainability & Governance (52/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

73
gesamt / 100
Gut

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

73
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Yunan WangPersönliches Konto
37 Follower6 öffentliche Reposseit Jan. 2021

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

86Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
11.8/36Commit-Rhythmus — 17/52 Wochen mit Commits
18/18Commit-Volumen — 206 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year206
human_commit_share0,9
days_since_last_push0
active_weeks_last_year17

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 26 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 8 Tagen
27/27Release-Rhythmus — ein Release etwa alle 26,2 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count26
latest_release_tagv4.1.0
releases_from_tagsnein
days_since_latest_release8
mean_days_between_releases26,2
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

68Mittel · 18 % des Gesamtindex
Wie die Bewertung erfolgt
47.2/60Stars — 812 Stars
16.7/25Forks — 101 Forks
1.7/15Watcher — 3 Watcher
Verwendete Eingangsdaten
forks101
stars812
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (Apache-2.0)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingja
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

52Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
1.8/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 92 % der Commits
13.5/13.5Breite der Beitragenden — 21 Beitragende
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Verwendete Eingangsdaten
bus_factor1
contributors_sampled21
top_contributor_share0,919
Wie die Bewertung erfolgt
46.8/46.8Issue-Lösungsquote — 100 % der Issues geschlossen
36.1/38.3PR-Annahme — 120/127 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/20 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs120
open_issues0
closed_issues99
issue_closed_ratio1
closed_unmerged_prs7
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
11.4/25Reichweite des Inhabers — 37 Follower von yunanwg
17.2/25Kontohistorie — 6 öffentliche Repos, Kontoalter ca. 5 Jahre
Verwendete Eingangsdaten
followers37
owner_typeUser
is_verified
owner_loginyunanwg
public_repos6
account_age_days2.022
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

92Exzellent · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 9 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration
9.6/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_configja

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://typst.app/universe/package/brilliant-cv
10/10Repository-Beschreibung
10/10Topics — 7 Topics
0/10Wiki
Verwendete Eingangsdaten
topicscv, pdf, typst, typst-template, resume, resume-template, prompt-injection
has_wikinein
homepagehttps://typst.app/universe/package/brilliant-cv
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

71Gut · 16 % des Gesamtindex
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
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
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
4/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 8
5/5SAST — SAST tool is run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6,4
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
0/25Indirekte Abhängigkeiten ohne bekannte Advisories — transitive Menge in diesem Bereich nicht von Entwicklungs- und Test-Abhängigkeiten trennbar
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages3
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Indirekte Abhängigkeiten ohne bekannte Advisories, Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. 3 aufgelöste Abhängigkeiten wurden mit OSV abgeglichen. Dieses Repository veröffentlicht kein Paket, das der Index auflöst; bewertet wurde daher der Abhängigkeitsgraph des Repositorys. Dieser Graph vermischt Entwicklungs- und Test-Pins mit ausgelieferten Abhängigkeiten, daher werden nur die deklarierten Laufzeit-Abhängigkeiten bewertet; transitive Befunde werden als Kontext ausgewiesen und fließen nicht in die Bewertung ein. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

81Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — .github/copilot-instructions.md, AGENTS.md, CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 90 von 90 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_files.github/copilot-instructions.md, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes4.733
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — justfile
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — Dockerfile
10/10Belegte Agentenpraxis — 63 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
8/8Automatisierte Wartung — 10 der letzten 100 Commits sind automatisierte Abhängigkeits-Updates
8/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 8
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfiles
has_dockerfileja
typed_languagenein
bootstrap_filesjustfile
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,63
toolchain_manifests
dependency_bot_commit_share0,1
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — Typst ohne Typprüfungs-Konfiguration
55/55Handhabbare Dateigrößen — 0/6 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageTypst
largest_source_bytes15.997
source_files_sampled6
oversized_source_files0

Eckdaten

812GitHub-Sterne
21Mitwirkende
206Commits, letzte 12 Monate
0Tage seit letztem Push
26Releases
1Bus-Faktor
0offene Issues
PyPIPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 101 ⇿
0Sterne
101Forks
25Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

02040608010012010132023-062024-122026-07
Major 4Minor 10Patch 10

Jeder Punkt umfasst 3 Tage.

OpenSSF Scorecard 6.4 / 10
6.4Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-07-28 01:59 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/20 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
8Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 8
10SASTSAST tool is run on all commits
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Alle Abhängigkeiten 3

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 0 direkte und 3 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
PyPIjsonschema4.26.0indirekt
PyPImkdocs-glightbox0.5.2indirekt
PyPImkdocs-material9.7.7indirekt
Abhängigkeits-Advisories 0

Dieses Repository veröffentlicht kein vom Index auflösbares Paket, daher wurde sein eigener Abhängigkeitsgraph bewertet – 3 Pakete, darunter auch Entwicklungs- und Test-Pins, die nie ausgeliefert werden: 0 tragen bekannte Advisories, davon 0 direkte.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "cv",
        "pdf",
        "typst",
        "typst-template",
        "resume",
        "resume-template",
        "prompt-injection"
      ],
      "is_fork": false,
      "size_kb": 20098,
      "has_wiki": false,
      "homepage": "https://typst.app/universe/package/brilliant-cv",
      "languages": {
        "TeX": 1382,
        "Just": 11173,
        "Shell": 10869,
        "Typst": 117486,
        "Python": 33303,
        "Dockerfile": 4782
      },
      "pushed_at": "2026-07-27T11:21:57Z",
      "created_at": "2023-04-28T22:58:24Z",
      "owner_type": "User",
      "updated_at": "2026-07-27T15:31:11Z",
      "description": "💼 another CV template for your job application, yet powered by Typst and more",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Typst",
      "significant_languages": [
        "Typst",
        "Python"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Yunan Wang",
      "type": "User",
      "login": "yunanwg",
      "company": null,
      "location": "France",
      "followers": 37,
      "avatar_url": "https://avatars.githubusercontent.com/u/77310871?v=4",
      "created_at": "2021-01-12T02:27:43Z",
      "is_verified": null,
      "public_repos": 6,
      "account_age_days": 2022
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v4.1.0",
          "kind": "minor",
          "published_at": "2026-07-19T09:45:59Z"
        },
        {
          "tag": "v4.0.1",
          "kind": "patch",
          "published_at": "2026-05-01T10:09:31Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2026-04-29T20:01:26Z"
        },
        {
          "tag": "v3.3.0",
          "kind": "minor",
          "published_at": "2026-03-22T11:12:48Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2026-03-10T20:57:32Z"
        },
        {
          "tag": "v3.1.2",
          "kind": "patch",
          "published_at": "2026-01-20T13:14:22Z"
        },
        {
          "tag": "v3.1.1",
          "kind": "patch",
          "published_at": "2025-12-05T21:30:39Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2025-12-05T21:16:59Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2025-12-05T14:32:14Z"
        },
        {
          "tag": "v2.0.8",
          "kind": "patch",
          "published_at": "2025-11-25T20:07:26Z"
        },
        {
          "tag": "v2.0.7",
          "kind": "patch",
          "published_at": "2025-10-21T07:40:13Z"
        },
        {
          "tag": "v2.0.6",
          "kind": "patch",
          "published_at": "2025-09-04T14:16:45Z"
        },
        {
          "tag": "v2.0.5",
          "kind": "patch",
          "published_at": "2025-03-06T08:07:35Z"
        },
        {
          "tag": "v2.0.4",
          "kind": "patch",
          "published_at": "2025-01-21T23:53:35Z"
        },
        {
          "tag": "v2.0.3",
          "kind": "patch",
          "published_at": "2024-10-09T14:43:10Z"
        },
        {
          "tag": "release/v2.0.2",
          "kind": "other",
          "published_at": "2024-08-20T17:55:24Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2024-07-29T09:58:23Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2024-07-14T08:26:53Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2024-07-13T16:04:14Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2024-05-31T19:28:05Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2024-05-14T13:37:23Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2023-11-01T18:04:20Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2023-09-16T13:51:22Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2023-08-29T10:20:27Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2023-08-20T14:15:47Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2023-07-14T23:16:48Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "7772666e9848393932103830b8e71d8a7d695a2c",
          "body": "Bumps [typst-community/setup-typst](https://github.com/typst-community/setup-typst) from 4 to 5.\n- [Release notes](https://github.com/typst-community/setup-typst/releases)\n- [Commits](https://github.com/typst-community/setup-typst/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: typst-\n[…]\n-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: Yunan Wang <77310871+yunanwg@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump typst-community/setup-typst from 4 to 5 (#233)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-27T11:19:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f5540ddacaa8569359f634b4925fb084fbda0bc0",
          "body": "Bumps [extractions/setup-just](https://github.com/extractions/setup-just) from 2 to 4.\n- [Release notes](https://github.com/extractions/setup-just/releases)\n- [Commits](https://github.com/extractions/setup-just/compare/v2...v4)\n\n---\nupdated-dependencies:\n- dependency-name: extractions/setup-just\n  d\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump extractions/setup-just from 2 to 4 (#232)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-27T07:21:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "af64cc520445180c0f235975846ed4284f27134f",
          "body": "* docs(readme): rewrite key features around user value\n\n- Lead with the v4 profile/language decoupling: a profile is a complete,\n  self-contained variant bindable to a job/audience/language, not a language\n  whitelist entry.\n- Reframe the three features as user benefits (bind anything / compose &\n  \n[…]\nn the pinned test image (Noto Sans CJK SC for\nzh). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): rewrite key features around user value (#231)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-22T21:01:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ac0f6d86d3108cc015734a956446ab6aebd023f7",
          "body": "Interactive @claude (claude.yml):\n- Install Typst + just and run `just link` before the action so Claude can\n  compile-test its changes and run the native panic/guard suites; the tytanic\n  visual suite stays in test.yaml (Docker + pinned fonts, not deterministic\n  outside the test image).\n- Pin mode\n[…]\ngression-test convention.\n- Pin model to claude-sonnet-5, cap at 15 turns, sticky comment already implied\n  by single-run trigger.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(github): tune Claude Code workflows for this repo (#230)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-22T20:21:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c483d1b0cce57f0dc6751c9e3d22cd363d2bb1cc",
          "body": null,
          "is_bot": false,
          "headline": "feat(github): add Claude Code GitHub Workflow (#229)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-22T19:59:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdb9a5884563593791fd9e3aad7007c06c425fc9",
          "body": null,
          "is_bot": false,
          "headline": "fix: clear Typst package warnings (#228)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-19T10:37:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4812a3bfc79a6a58625d6f290ac9b0bff1e6bc51",
          "body": "* fix: preserve Typst submission template\n\n* fix: keep Typst update description minimal",
          "is_bot": false,
          "headline": "fix: preserve Typst submission template (#227)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-19T10:34:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "908fb35a0cc6f939c48241db4334d48ba86ac8ba",
          "body": null,
          "is_bot": false,
          "headline": "fix: make release upstream setup idempotent (#226)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-19T09:40:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f369014d05c96d07171a85197cb0e96039f1f92d",
          "body": "* fix: close release preparation gaps\n\n* chore: prepare 4.1.0 release",
          "is_bot": false,
          "headline": "chore: prepare 4.1.0 release (#224)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-19T09:20:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20dedd97ef8557b1851805e69d2277dbcb1f6dd3",
          "body": null,
          "is_bot": false,
          "headline": "ci: make sponsor refresh manual-only (#225)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-19T09:19:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "281bdfe90d6a3227444ca6859eac4253975ccd03",
          "body": "* build(deps): bump actions/download-artifact from 7.0.0 to 8.0.1\n\nBumps [actions/download-artifact](https://github.com/actions/download-artifact) from 7.0.0 to 8.0.1.\n- [Release notes](https://github.com/actions/download-artifact/releases)\n- [Commits](https://github.com/actions/download-artifact/co\n[…]\nned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: yunanwg <77310871+yunanwg@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/download-artifact from 7.0.0 to 8.0.1 (#223)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-19T09:05:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "021125159262d867ce0676efdb56873b348d8bc7",
          "body": "Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.6.0 to 8.3.2.\n- [Release notes](https://github.com/astral-sh/setup-uv/releases)\n- [Commits](https://github.com/astral-sh/setup-uv/compare/37802adc94f370d6bfd71619e3f0bf239e1f3b78...11f9893b081a58869d3b5fccaea48c9e9e46f990)\n\n---\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump astral-sh/setup-uv from 7.6.0 to 8.3.2 (#222)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-19T09:02:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef874d30b6da29893abee479b5f0796d991f0894",
          "body": "Bumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 3.12.0 to 4.2.0.\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\n- [Commits](https://github.com/docker/setup-buildx-action/compare/8d2750c68a42422c14e847fe6c8ac0403b4cbd6f...bb05f3f5519dd\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump docker/setup-buildx-action from 3.12.0 to 4.2.0 (#221)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-19T09:00:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8e2f67b99d8f38212f6c55747c46788cadba01b9",
          "body": null,
          "is_bot": false,
          "headline": "ci: pin and isolate automation (#220)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-19T08:36:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f97047a5996033cdb3cbd2726401c6dcff9aa97",
          "body": null,
          "is_bot": false,
          "headline": "ci: make release contract fail closed (#219)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-19T08:32:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41a1fc4fc8c93bdefb81f545a5957dd8a3e67bf8",
          "body": null,
          "is_bot": false,
          "headline": "fix: define public API and metadata contract (#218)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T21:39:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2398ed281607d8f0ecb07361a468857d2b106d09",
          "body": "docs: ship strict schema and retire PDF docs",
          "is_bot": false,
          "headline": "docs: ship strict metadata schema and retire PDF docs (#217)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T21:35:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13c721236be1432df9519cf0fde000d592d5b2d7",
          "body": "* test: regenerate visual refs on arm64 CI runner\n\n* test: mark cv-entry-continued-multiline-date as persistent\n\ntytanic infers persistent-vs-compile-only from the presence of ref/;\nwithout it, tt update filtered the new component test and never\ngenerated its first ref. Placeholder to be replaced by\n[…]\n* test: regenerate visual refs on arm64 CI runner\n\n---------\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: regenerate visual refs after audit batch (#216)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T20:24:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8d4862f1a892fc5affa670cc51549b17a5f0fdbb",
          "body": "… (#215)\n\nci: add manual workflow to regenerate visual refs on arm64 runner\n\nReusable maintainer tool: dispatch on any branch after an intentional\nlayout change; runs tt update inside the pinned Docker image on the\nnative arm64 runner (the canonical ref environment) and pushes the\nregenerated tests/\n[…]\nthe same branch. Removes the\nneed for local arm64 hardware to regenerate refs.\n\n\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add manual workflow to regenerate visual refs on the arm64 runner…",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T20:03:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "731bc36d035d5a1a856835a08e7b7d73b916f3c8",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v7)\n\n---\nupdated-dependenc\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/checkout from 4 to 7 (#214)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T20:01:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7ad030c4329f240b90c0329f4a834aa13e413096",
          "body": "Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6 to 7.\n- [Release notes](https://github.com/docker/build-push-action/releases)\n- [Commits](https://github.com/docker/build-push-action/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: docker/build-push-\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump docker/build-push-action from 6 to 7 (#213)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T20:01:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "459bf70b7510d7f1b9b4984c737f10ca2dc74fd1",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifac\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump actions/upload-artifact from 4 to 7 (#212)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T20:01:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "84370090b16b6f28791bbbbf07d791e5d251457f",
          "body": "Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 6 to 7.\n- [Release notes](https://github.com/astral-sh/setup-uv/releases)\n- [Commits](https://github.com/astral-sh/setup-uv/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: astral-sh/setup-uv\n  dependency-version: '\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump astral-sh/setup-uv from 6 to 7 (#211)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T20:01:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "734a4b2d5865ddbfd34cc63852f3b9e3c9517bba",
          "body": "Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.\n- [Release notes](https://github.com/softprops/action-gh-release/releases)\n- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/softprops/\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build(deps): bump softprops/action-gh-release from 2 to 3 (#210)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-18T20:01:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "08df8f8ac0affa21524bb60eb48a64b68d868ce2",
          "body": "…on PRs (#204)\n\n* ci: dedupe triggers, add concurrency, pin typst floor, validate docs on PRs\n\n- compile.yaml: restrict the bare `push:` trigger to `branches: [main]`\n  so same-repo PR commits no longer fire both push and pull_request\n  events for the same commit. Add a concurrency group (per\n  work\n[…]\nt is 1.3.0)'.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: dedupe triggers, add concurrency, pin typst floor, validate docs …",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T19:57:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fac8148a75fe4e1f77a96c9271b78ab7cd0162fa",
          "body": "* chore(github): structured YAML issue forms + automation disclosure\n\nReplace GitHub's default bug_report.md/feature_request.md scaffold\n(still asking for \"Browser [e.g. chrome, safari]\") with YAML issue\nforms that front-load what the solo maintainer actually needs first:\nbrilliant-cv version, Typst\n[…]\ne inaccurate.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(github): structured YAML issue forms (#207)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T19:57:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b6490c4408bec517b8fb4817fe3d4c9d5f39173e",
          "body": "Reorder the release job so 'Create GitHub Release' runs after 'Create\nPR in upstream repository' instead of right after version extraction.\nv3.0.0 shipped a public GitHub Release from a run that failed before\never reaching typst/packages, leaving a phantom release with no\ncorresponding upstream PR. \n[…]\nonger leaves the working tree with the bumped version instead of\nthe original.\n\n\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(release): create GitHub Release only after package validation (#202)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T19:56:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d540febbffb6efa75a10d4b3d287b361ef18b0eb",
          "body": "…(#205)\n\ntest: add determinism+parity guards, cv-publication units, api-ref self-check\n\nAdds tests/guards.sh, a fast bash+python3-stdlib script wired into `just\ntest`, `just test-fast`, and CI: a determinism guard (fails on\n`datetime.today` in any test.typ/fixture.typ, since letter()'s `date:`\ndefau\n[…]\n already\nignored tests/**/{out,diff}/ globally, so no change was needed there.\n\n\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: machine guards, cv-publication units, api-reference self-check …",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T19:53:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "96232bd7d2862cb7540bad9a67223f54c256b33c",
          "body": "…ssets (#209)\n\nchore: Universe compliance fixes + replace UCLA seal + shrink shipped assets\n\nUniverse compliance:\n- README.md: thumbnail.png <img> src was a relative path, which breaks\n  once the file is stripped from the published bundle per Universe\n  manifest rules (\"must not be referenced anywhe\n[…]\nged in all 5\nprofiles (en/fr/de/it/zh) and those refs are pixel-deterministic.\n\n\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: Universe compliance fixes, replace UCLA seal, shrink shipped a…",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T19:52:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c1d520db9e8768cca09f40c764653daec9c50d5a",
          "body": "…(#208)\n\nThe [inject] feature previously shipped enabled in all five profiles and\nwas marketed without any mention of risk, while detection of hidden\nresume text by screening vendors keeps improving. Plan adopted: keep the\nfeature, make it honest.\n\n- all five profiles now ship injected_keywords_list\n[…]\n (the removed text was white on\nwhite), but run 'just test-update' to confirm.\n\n\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(inject)!: make ATS keyword injection opt-in with honest framing …",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T19:47:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8b9f492dd5f051149ddc0309afccfe4247379adc",
          "body": "… (#206)\n\ndocs: ship font/privacy guidance with typst init + zh quickstart\n\ntypst init @preview/brilliant-cv delivers only template/ — the README and\ndocs site never reach those users, which is why Font Awesome \"boxes instead\nof icons\" has been re-reported for years (#11, #31, #57, #192). Put the\ngu\n[…]\nn upgrade.\n\nAll changes are comments/docs only; no rendering behavior changes.\n\n\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: ship font/privacy guidance with typst init + Chinese quickstart…",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T19:46:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e7f798604f494d0829925973df6889d7471d301c",
          "body": "…ush (#203)\n\nThe `bump` recipe used BSD-only `sed -i ''`, which exits with status 2 under\nGNU sed (\"no input files\") because GNU sed treats the empty string as the\nin-place suffix argument rather than a no-backup marker. Reproduced with\nGNU sed 4.9: `sed -i '' 's/.../.../' file` fails outright, whil\n[…]\nrs to \"the\nUniverse-published package\" generically so it can't go stale again.\n\n\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "build(justfile): portable sed, test gate before release, single-tag p…",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T19:45:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3644172524b39f5eb16a6ddb4a4ca30f7b3c7643",
          "body": "…s (#201)\n\n* fix(cv): repair broken default paths and duplicate description render\n\nThree defects hidden by the fact that every shipped profile sets all\noptional keys, so fallback paths never executed:\n\n- before_entry_skip / before_entry_description_skip defaults were length\n  literals passed to the\n[…]\nte' on arm64.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CVqmjueMxXJSNZQJZdZE6x\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: repair shipped-example rendering defects and broken default path…",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T19:43:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "029041f3e7d57ec348af9ab4c2d737f6cc0c259e",
          "body": "feat(cv): allow custom header info content",
          "is_bot": false,
          "headline": "feat(cv): add composable header info slot (#199)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T11:26:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28f72d76430f08665e581dd2a3b3605c2c478234",
          "body": null,
          "is_bot": false,
          "headline": "docs: unify contributor and agent guidance (#198)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T11:06:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f5fcd6ef01721c76b5b321d9ba60d47217460d8",
          "body": null,
          "is_bot": false,
          "headline": "test: upgrade toolchain to Typst 0.15.1 (#196)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T10:40:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb8f60dc77fffc220cd4e6e9df4c57bad536fe7f",
          "body": null,
          "is_bot": false,
          "headline": "feat(cv): make skill type width configurable (#195)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T10:20:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a55753cdc913cca1acfda728d3c417996567eaa",
          "body": null,
          "is_bot": false,
          "headline": "docs: document Font Awesome setup for Typst Web (#194)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T10:04:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99c6b911e5db27c6bce7ea01ee475cbbc9ecdc09",
          "body": "* fix: Correctly slice Unicode titles\n\n* fix(cv): slice section titles by grapheme clusters\n\n---------\n\nCo-authored-by: yunanwg <77310871+yunanwg@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix: Correctly slice Unicode titles (#187)",
          "author_name": "SimonIT",
          "author_login": "SimonIT",
          "committed_at": "2026-07-18T09:47:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "614b1d7cc06b7ef2e12a5ef7227e9bea69eb8307",
          "body": null,
          "is_bot": false,
          "headline": "test: stabilize visual snapshots across arm64 hosts (#193)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-07-18T09:39:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcc4c61f73345b2b133c76ca5d1944d1d2af439e",
          "body": "…#184)\n\n* fix(cv): collapse reserved row when title and date are empty (#181)\n\ncv-entry laid each entry out as two fixed rows (title/date on top,\nsociety/location below). When a user omitted both top-row fields, the\nempty row still reserved a line plus its 6pt gutter, leaving a blank gap\nabove the v\n[…]\n the\ncollapse + one-sided-gap alignment behavior.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cv): collapse reserved row when title and date are empty (#181) (…",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-06-17T19:38:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b165e3f087502ce09a6c6288acfbd90ed84953b5",
          "body": null,
          "is_bot": false,
          "headline": "build: bump version to 4.0.1",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-05-01T10:09:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea14a9786caa0b0a365fc6d2da14f84639214ab9",
          "body": "The release recipe ran `just bump $VERSION` then immediately `just\nbuild`, which fails because the version-bumped template/ imports\n`@preview/brilliant-cv:$VERSION` while the local package link is\nstill registered at the old version. Caught by running\n`just release 4.0.1` from a branch with v4.0.0 l\n[…]\nt tried to download 4.0.1 from Universe, didn't find it, and\nerrored out.\n\nInsert `just link` between bump and build so the local registration\nrefreshes to the new version before the smoke build runs.",
          "is_bot": false,
          "headline": "build(release): re-link local package after bump",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-05-01T10:08:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "91606c1c7b33d21d10945475fa3969c72497b45e",
          "body": "* fix(api): kebab-case cv-section param + absolute README link\n\nTwo lint fixes flagged by typst-package-check on the upstream\nbrilliant-cv:4.0.0 PR (typst/packages#4739, since closed in favor\nof v4.0.1).\n\n1. README.md:52 linked to a relative `CONTRIBUTING.md` that doesn't\n   exist in the published p\n[…]\nrs` in metadata.toml stays\nunchanged, since TOML keys aren't governed by Typst's kebab-case\nconvention).\n\nVerified by compiling docs/pdf/docs.typ inside the test image —\nclean build, 477KB PDF output.",
          "is_bot": false,
          "headline": "fix(api): kebab-case cv-section param + absolute README link (#180)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-05-01T10:02:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6252c9090d2bbb08e85a163cdbf63c81a0609835",
          "body": "* docs(claude): require compile-testing typst snippets in docs\n\nCaught by Codex review on #178: shipped a docs/recipes.md snippet\nusing a `description:` parameter on cv-honor that doesn't exist.\nSource-of-truth for every public function name and parameter is\nsrc/cv.typ — not memory.\n\nAdds a Conventi\n[…]\nic APIs (cv() and letter()) actually live in src/lib.typ. Fix:\nsay \"src/\" generically, then enumerate which functions live where so\ncontributors check the right file for the import their snippet uses.",
          "is_bot": false,
          "headline": "docs(claude): compile-test typst snippets in docs/ before commit (#179)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-05-01T09:40:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6592aa6bb4ae42a4a8720dc99121cd79b6479305",
          "body": "* docs(recipes): add cv-honor verification link recipe\n\nCloses #171 by documenting how to add verification URLs and extra\nmetadata (credential ID, expiry, verification link) to certificate\nentries using the existing `url` parameter and content-flexible\n`description` field on `cv-honor`.\n\nRationale f\n[…]\ntial ID, expiry, multiple links). cv-entry does\n   have a content-flexible `description` field.\n\nCompile-tested both snippets against /src against minimal-metadata\nfixture before committing this time.",
          "is_bot": false,
          "headline": "docs(recipes): add cv-honor verification link recipe (#171) (#178)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-05-01T09:39:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b23a84cfefe35321bb16d77628c5c410f63fc0d2",
          "body": "fix(footer): give long center caption all remaining width\n\nThe 3-column footer layout (with display_page_counter = true) was\nlocked to (1fr, 1fr, 1fr), squeezing a long center caption into a\nthird of the page regardless of how short the name and counter were.\nReporter @im-trisha hit visible wrapping\n[…]\n a long center string. Verified by\ntemporary revert that without the fix the test page renders 907x68\n(wrapped to multiple lines); with the fix it renders 907x47 (single\nline as expected).\n\nFixes #173",
          "is_bot": false,
          "headline": "fix(footer): give long center caption all remaining width (#173) (#177)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-04-30T14:41:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2b4af70965963ce177b6a6ba275b629265ab5b29",
          "body": "The maintainer is on Apple Silicon. Running the linux/amd64 test image\nvia Rosetta 2 produces FreeType-rasterized pixels that drift from\nnative x86_64 (empirically: ~5912 deviating pixels in the Roboto\nheader — the \"John Doe\" text — across all four Latin profile\nregression tests; Source Sans 3 body \n[…]\nr arm64 native and have been\nregenerated: cv-de, cv-en, cv-fr, cv-it (Roboto header pixels).\nComponent tests, cv-zh, and the letter regression tests were\nbyte-identical across archs and are unchanged.",
          "is_bot": false,
          "headline": "chore(test): migrate test infra to single arm64 (#176)",
          "author_name": "Yunan Wang",
          "author_login": "yunanwg",
          "committed_at": "2026-04-30T14:16:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d833b92c739c8dcbf3c3bf994f4bbbef1b03fb2d",
          "body": "Bug fixes and behavior changes that touch `src/` should land with a\ntytanic ref or panic-shell test in the same PR. Skip only for\ndocs-only or policy-only changes.\n\nThe aim is to grow `tests/` into a corpus of real user-reported\nscenarios — every issue we close becomes a permanent guard against\nthe same regression.",
          "is_bot": false,
          "headline": "docs(claude): require regression test for issue fixes",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-30T13:21:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6c84bd4fb7e15b50b855b55b54846081ebb07c9",
          "body": "The closing `v(-10pt)` after `cv-entry-start` is shared by both code\npaths (with-logo / without-logo). With a logo, the image's natural row\nheight absorbs part of the negative space, so the collapse looks right.\nWithout a logo the row is just text-height and -10pt overlaps the\nfollowing `cv-entry-co\n[…]\nadata) — ref regenerated; the diff is the gap that was\n  bug-tight before\n- new components/cv-entry-start-continued-with-logo — pins the\n  with-logo branch so it can't silently drift later\n\nFixes #172",
          "is_bot": false,
          "headline": "fix(cv-entry-start): make negative skip logo-aware",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-30T13:21:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89bcf9e2ae324744be4c4c0715a2188966add2f8",
          "body": "The hero image was 2480x3508 (A4 @ 300 DPI), oversized for the README\non GitHub and the Typst Universe listing. 1600px wide is still\nretina-friendly.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(assets): downsample README thumbnail to 1600px wide",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "845863e6506ef4538f08f2baea3f305eeffc6aea",
          "body": "Move the v4 migration callout up next to the hero, drop the standalone\nDocumentation section (it was just a link), trim Key Features from 6\ngeneric bullets to 3 differentiated ones, fold How to Use into a 3-step\nQuick Start that ends with a single link to the docs site, and remove\nthe Configuration table (the docs site already has a Configuration\nReference). Also strip emoji from body section headings.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): restructure for clearer entry path",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d896548ba198df46d92099d7a4a2c9c7dc615caa",
          "body": "Codex adversarial review caught a real ship-blocker: my earlier commit\n7dfe5fc added CLAUDE.md + CONTRIBUTING.md to typst.toml's `exclude`\nlist, but the release workflow doesn't read typst.toml — it had its\nown hard-coded `rsync --exclude` set that drifted independently. A\ndry-run of the release wor\n[…]\nerged on this finding;\npass 2 escalated severity from medium -> high after running an actual\nrsync dry-run to verify the leakage).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(release): drive rsync excludes from typst.toml + add leak assertion",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "883d1197d3ef2703e31992c608cf885c669217ef",
          "body": "Previous wording claimed \"out-of-range values render as 0\" — false.\nThe actual implementation (src/cv.typ:874-878) is:\n\n    for x in range(0, level) { /* filled */ }\n    for x in range(level, 5) { /* empty */ }\n\n`level: 7` renders 7 filled circles (not 0); `level: -1` renders 0\nfilled + 6 empty. No \n[…]\noes not clamp, so\nnobody copies a `level: 50` and is surprised by 50 circles spanning\nthe page.\n\nCaught by Codex stop-time review.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs): drop nonexistent clamping claim for cv-skill-with-level",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c8b2635cc7f4a8f96eb3e405a741b9d725a23f5",
          "body": "components.md previously had only code blocks; users had to compile\nthe package to see what each cv-* function produces. Now every example\nsits next to its actual rendered PNG, pulled from the test suite.\n\nSource: tests/components/<name>/ref/1.png — the same images tytanic\nuses as visual-regression \n[…]\nfied: `mkdocs build --strict` passes; 13 image references in the\nrendered HTML; all PNGs land in docs/web/site/assets/components/.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(components): show rendered output beside every cv-* example",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1e21d618c949e4dfb59d0ad84d125fc69d6e9ec5",
          "body": "Both files were silently included in the package payload that ships to\ntypst/packages (via the upcoming v4.0.0 release PR). Neither is useful\nto package consumers:\n\n  CLAUDE.md       internal AI agent instructions; reading them out of\n                  context is noise to a regular user\n  CONTRIBUTI\n[…]\nature\n                           — bootstrapped to user via `typst init`)\n\nare the only PNGs left in the payload, all intentional.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(typst): exclude CLAUDE.md + CONTRIBUTING.md from Universe payload",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "843c99390358781f5cf1e125dc53a93e7b92931c",
          "body": "Codex stop-hook caught: documentation.yaml still called\n`python docs/web/generate-configuration.py`. The script was deleted\nin c00e77f when configuration.md switched to a pymdownx.snippets\nlive-include of template/profile_en/metadata.toml. The workflow\nwould have failed on the next push to main.\n\nAl\n[…]\nest has python3 by default;\n     `python` is symlinked but distro-dependent).\n\n  3. Bumped setup-uv from v4 to v6 (current major).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(docs): drop deleted generate-configuration.py + add glightbox",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0b6bed485ef453e873c3a20c08b1b360efa45342",
          "body": "mkdocs.yml: turns on the mkdocs-material features that pull weight\nwithout bloat:\n\n  navigation.tabs        Top-level grouping (User Guide / Reference /\n                         Migration & FAQ) renders as tabs in the\n                         header — much more discoverable than the\n                \n[…]\nng\na project pyproject.\n\nVerified: `mkdocs build --strict` passes; cards grid HTML present;\nglightbox markup wraps gallery images.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: enable mkdocs-material UX features + cards grid landing page",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3f57721769ea51fc8bb87865c0d0fa7aab74831b",
          "body": "The Configuration Reference was auto-generated by\ngenerate-configuration.py (312 lines of Python that parsed\ntemplate/profile_en/metadata.toml and rendered structured per-section\ntables). It worked but had drift risk: every metadata.toml change\nneeded a follow-up `just docs-generate` invocation to u\n[…]\nly `python3` from Homebrew).\n\nVerified: `mkdocs build --strict` passes, configuration page renders\nthe live metadata.toml content.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(configuration): live-include metadata.toml via pymdownx.snippets",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d039f73ba76da53119f2a71dd83bbf7c7f46c3ec",
          "body": "…vice\n\nStep 5 showed a code block with no instruction on where to put it —\nnew users would copy it, hit \"where does this go?\", and try cv.typ\nor metadata.toml (both wrong). Adds an explicit \"Open\nprofile_en/education.typ and replace its contents with:\" sentence.\n\nAlso adds a paragraph explaining the\n[…]\nullets: linked typstyle and typos to upstream,\nand recommended `git tag` for CV versioning (a real practice some\nmaintainers use).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(getting-started): clarify which file to edit + replace editor ad…",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e7a88195b589ddafe618292d0c39b65f822dccd",
          "body": "…& FAQ\n\nOld nav was 8 pages flat in the sidebar — Configuration (270 lines of\nauto-generated reference) sat between Recipes and Troubleshooting,\nmaking it look like part of the user-guide reading order. New users\nwere being pushed into encyclopedic field-by-field reference before\nthey'd hit the use-\n[…]\ntion & FAQ\n    Migration Guide   — v1/v2/v3 -> v4\n    Troubleshooting   — common errors\n\nVerified: `mkdocs build --strict` passes.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(mkdocs): reorganize nav into User Guide / Reference / Migration …",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5109beefdbac14c00856cf1749d157f4bee99630",
          "body": "README.md / index.md \"Multilingual Support — Seamlessly switch between\nlanguages (...) with a single config change\" was v3 wording. v4 doesn't\nswitch via a `language` config field; it switches via `--input profile=fr`\nat compile time. Users reading the old copy would look for a language\nfield, find \n[…]\n ([layout.fonts], [layout.section], display_name,\n  per-icon order in [personal.info]).\n\nVerified: `mkdocs build --strict` passes.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: fix v4 marketing copy + add README badges + v4 callout",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "29883e5cd0464e31dc6de6a300799dd47d5ec888",
          "body": "components.md:\n  cv-section example used `highlighted: false` and `letters: 4` —\n  v3 parameter names that don't exist in v4. Users copying the\n  example would hit \"unknown parameter\" errors. Replaced with v4\n  parameters (`highlight: \"first-letters\" | \"full\" | \"none\"` and\n  `highlight_letters: int`\n[…]\nce Sans 3\", \"Heiti SC\"]`) plus\n  the `[personal] display_name` override for the header.\n\nVerified: `mkdocs build --strict` passes.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(web): scrub v3-isms in components, recipes, troubleshooting",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c525659153a69bf3981f4f268cf82174102d9f4",
          "body": "The PDF reference (docs/pdf/docs.typ) had stale v3 references in\nmultiple places that would have shipped with v4.0.0:\n\n  Section 3 (Step 3 / Step 4):\n    \"language code matching your profile_<name>/ folder\" —\n    `language` was removed in v4.\n\n  Section 4 (cv-section):\n    `#cv-section(\"Skills\", hig\n[…]\nh already\n    covers v3->v4 panic-with-migration messages.\n\nVerified: docs.typ builds clean (477 KB output) inside the test image.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(pdf): scrub v3-isms + auto-include profile_en/metadata.toml",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "25aca84cd21231b932045a99c682a436a05e3e8d",
          "body": "Pure cosmetic — typstyle 0.14.4 wraps the if-else onto multiple lines\nwhen the body crosses the 80-col budget.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(styles): apply typstyle wrapping to _resolve-accent-color body",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d0a3608ddb65c43004aa8718185526d5ab641f0",
          "body": "Three component entry points (cv-section, _prepare-entry-params,\ncv-honor) all repeated the same pattern:\n\n    let accent-color = if color != none { color }\n                       else { _set-accent-color(awesome-colors, metadata) }\n\nThe conditional encodes \"honor explicit override before falling ba\n[…]\n_cv-header` keeps calling `_set-accent-color` directly because it\ndoesn't have a `color:` override parameter — no fallback needed.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(cv): extract _resolve-accent-color helper",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d3a414fbc376f304a89d33674460975651d1e138",
          "body": "The helper at src/cv.typ:43 was called once (cv-section, line 380) and\nsix other call sites used `eval(metadata.layout.at(key, default: ...))`\ninline. The abstraction wasn't pulling its weight — inline reads as\nclearly as the wrapper.\n\nAlso fixes a latent bug: the original call passed `1pt` (length)\n[…]\nat`), not anything specific\nto this package; inlining made them obsolete.\n\nTest count: 32 -> 30 tytanic. 10 panic tests unchanged.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(cv): inline single-use _get-layout-value",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e215759ff89851b4e757bed3c89a590f063c5805",
          "body": "v2 inject schema guard was duplicated character-for-character across:\n  - src/lib.typ:155-167 (letter() entry)\n  - src/cv.typ:215-225 (_cv-header internals)\n\nBoth checks fire on the same metadata.inject keys; cv() reached the\ncheck via _cv-header, letter() inlined it. New helper\n`_check-v2-inject-le\n[…]\n10 panic tests pass (including the\nv2-inject-ai-prompt-cv / v2-inject-keywords-cv panic fixtures, which\nexercise this exact path).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(lib): hoist _check-v2-inject-legacy out of cv-header",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4bda3f9dd399875c12dcc08bb2c2367c782b0c6e",
          "body": "cv() and letter() shared ~30 LOC of preamble (font resolution, font-size\neval, paper-size lookup, margin if/else) almost character-for-character\nidentical. Extract two pure helpers:\n\n  _resolve-typography(metadata) -> (regular-fonts, header-font, font-size)\n  _page-margin(paper-size, letter-style: f\n[…]\nn count drops from 2× to 1× and intent is cleaner.\n\nVerified: 32 tytanic + 10 panic tests pass with max-delta=1, max-deviations=0.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(lib): extract _resolve-typography + _page-margin; kebab rename",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c0997a2ccd6a0903fd9ac346711e508d1839579",
          "body": "tests/README.md:\n  - Open with the Docker rationale (one source of truth, pixel-\n    deterministic across OSes) and the new tolerance (max-delta=1).\n  - Update layout: Dockerfile + docker-entrypoint.sh now live in tests/.\n  - \"Why Docker?\" subsection explaining the two alternatives we rejected\n    (\n[…]\n\n  - Same realignment — no more \"skip-annotated\" CJK note. Docker is\n    the routine path, native is only for the fast inner loop.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document the Docker-baseline test workflow",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a82772e5d25411c5991e3f46e77242ff5d5a4ada",
          "body": "Cuts over the entire visual-regression flow to run inside the new test\nimage. With CI Linux and maintainer macOS rendering through the same\ncontainer, refs become pixel-deterministic and the tolerance hack\n(max-delta=50, max-deviations=50000 — 25× looser than ideal) goes away.\n\nAtomic switch — if an\n[…]\ntests pass with\nmax-delta=1, max-deviations=0. Regenerating refs inside Docker on\nmacOS produces the same bytes as a fresh CI run.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: switch to Linux Docker baseline",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "289e8abf3afd93afac9e876920914e8172c53ae5",
          "body": "Adds tests/Dockerfile + tests/docker-entrypoint.sh that pin a single\ntest environment for both maintainer machines and CI:\n\n  - Ubuntu 24.04, x86_64 (forces linux/amd64 even when run from arm64)\n  - typst 0.14.2 (>= manifest min)\n  - tytanic 0.3.3 + typstyle 0.14.4 (matches .pre-commit-config.yaml p\n[…]\ndeterministic\nacross maintainer macOS and CI Linux — tolerance tightens to\nmax-delta=1, max-deviations=0 (perfect match required).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(test): add Linux Docker test image",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a4287eb69f034205c32115a5a6bfccfd0d4f86e",
          "body": "Previous attempt used `uv tool install typstyle==0.14.4` — uv only\nresolves PyPI, but typstyle is a Rust crate. The install step failed\nwith \"typstyle was not found in the package registry\".\n\nUse taiki-e/install-action@v2 which fetches a prebuilt binary from\nGitHub releases (no compile, ~2s install). Same action we use for\ntytanic in the step above.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: install typstyle via cargo-binstall, not uv",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fc9242826888bd7aa2b67a80816655a45a948090",
          "body": "Maintainer's macOS and CI Linux render text-heavy A4 pages with enough\nantialiasing differences that the previous tolerance budget\n(max-delta=10, max-deviations=2000) blew on every full-profile regression\ntest. Component refs at 12cm wide / ~150 px tall stayed inside budget\nbecause they have far les\n[…]\ntrip the gate.\n\nIf a future test needs tighter tolerance, the per-test annotation\n/// [max-deviations(<n>)] overrides the default.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(test): loosen tytanic tolerance for cross-OS regression refs",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6677345a7c5bce7da194f18e2398552648e4f70c",
          "body": "First CI run still failed: 6 tests broke because @preview/fontawesome:0.6.0\nexpects \"Font Awesome 7 Free Solid\" / \"Brands\" family names, but apt's\nfonts-font-awesome package is older (FA 6) with apt-suffixed family\nnames that typst's font matcher rejects. The same applies to\nfonts-linuxlibertine — t\n[…]\ne standard\nHomebrew cask, so the diff between local and CI rendering is now\nlimited to subpixel jitter (absorbed by max-delta=10).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: install Font Awesome 7 directly + drop apt's fonts-font-awesome",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "af6851ebe7c9ac2d065c44358969e91ce022143d",
          "body": "Previous URL `source-sans-3VFs.zip` was a typo guess; doesn't exist on\nthe Adobe releases page. CI font-install step exited 22 (curl --fail on\nHTTP 404). Verified correct asset name via the GitHub releases API.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: fix Source Sans 3 download URL (OTF-source-sans-3.052R.zip)",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "95e8f8be699bf5c7d303d212cd091d64bba2b509",
          "body": "Universe ships everything in the package directory by default; only the\nexisting exclude entries (docs, .pre-commit-config.yaml, .gitignore) are\nsuppressed. Adding tests/ keeps ~2 MB of ref PNGs out of the published\ntarball (users have no reason to install our test suite). justfile and\n.github are dev-only artifacts that similarly shouldn't ship.\n\nNo functional change for users — `template/` is still the package payload.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(typst): exclude tests/, justfile, and .github from package payload",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2f2d3be512e46ee35ec7d9a59523e3f5c2a206a6",
          "body": "CONTRIBUTING.md:\n  - Add tytanic, typstyle, bash to local-dev prerequisites with\n    install hints and version pins (tytanic >= 0.3 because 0.2.x\n    bundles typst 0.13 and won't load this package).\n  - Add tests/ to the repo-layout section.\n  - Replace the stale \"just build / just dev / just reset\"\n[…]\nskip strategy.\n  - Update the docs-generation note to point at profile_en/metadata.toml\n    (the new canonical reference profile).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document the v4 test suite + refresh stale CLAUDE.md sections",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "47b4ff5ff69ad2626e3cbcf4e319736b7e185144",
          "body": "Wires the v4 test suite into GitHub Actions on every PR + push to main.\n\nPipeline:\n  1. setup-typst@v3 with typst version pinned from typst.toml manifest\n  2. Install Source Sans 3 + Roboto + Linux Libertine + FontAwesome 6\n     (Heiti SC intentionally excluded — see CJK strategy in tests/README.md)\n[…]\nnors.\n\nAlso tightens two `just` recipe descriptions that were wrapping onto\nmultiple lines and getting truncated by `just --list`.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: add test.yml — tytanic + panic smoke + typstyle gate",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e67001cc0eb13c84961dfd83ebfd605143acc70c",
          "body": "Wires up the new test suite and code-quality gate as first-class just\nrecipes. Old `compare` / `compare-build` recipes get a deprecation banner\nbut stay available for one release as a fallback.\n\nTest recipes (require tytanic >= 0.3, `just link`):\n  just test               full suite — tytanic + pani\n[…]\npend on `just link` so the `@preview/brilliant-cv:4.0.0`\nimports inside `template/profile_*/` modules resolve to the local source.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(justfile): add test + fmt recipes; deprecate compare",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ad9f834d95d530fa24234c287bbed66bb2930e0",
          "body": "Prior commit 32c0f15 fixed the helper but skirted the line-length budget;\ntypstyle 0.14.4 wraps the two `.at(..., default: ...)` calls onto multiple\nlines. Pure cosmetic — verified via `just build`.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(styles): apply typstyle wrapping to overwrite-fonts",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "be31749eb52893f85499f9202bc16e664119cdc4",
          "body": "Adds 7 tytanic persistent tests rendering each shipped profile end-to-end.\nCatches layout regressions across locales, mixed-script profiles, and\nthe cover-letter entry point.\n\nCV regression (5 profiles):\n  regression/cv-en       English (canonical reference profile)\n  regression/cv-fr       French\n \n[…]\n: tytanic >= 0.3.0 (bundles typst 0.14, matching our manifest).\n0.2.x bundles typst 0.13 and rejects compiler = \"0.14.0\" packages.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(regression): full-profile snapshots for all 5 locales + 2 letters",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b52e510e437c2e4071077da8eea378fd53825ffa",
          "body": "Adds 14 tytanic persistent tests, one per public component variant we\ncare about. Each renders the component in isolation with a tight page\nsize (12-16 cm wide, height: auto) and compares against a committed\nreference PNG.\n\ncv-section (4 variants, exercises [layout.section]):\n  cv-section-first-lett\n[…]\n44 dpi. Run the full set via\n`tt run --use-system-fonts -e 'glob:\"components/*\"'` (the upcoming\n`just test` recipe wires this up).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(components): visual fixtures for every public cv-* renderer",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5a07e10efa8c225723d7fe0798040e1fda8ccda6",
          "body": "Adds 10 tytanic compile-only tests for the package's pure helpers, plus\na .gitignore rule for tytanic's ephemeral `tests/**/out/` and `diff/`\ndirectories.\n\nassertion-style tests:\n  units/set-accent-color-named           — preset palette key resolution\n  units/set-accent-color-hex             — hex-s\n[…]\ncaught a latent bug in overwrite-fonts (fixed in\nthe previous commit). Run via `tt run units/` or the upcoming\n`just test` recipe.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(units): cover pure helpers in src/utils + src/cv.typ",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c9c6dc79b45780d0e8ff206f0928cd3051351057",
          "body": "….fonts]\n\nSurfaced by the new unit-test suite: calling overwrite-fonts with metadata\nthat lacks `[layout.fonts]` previously panicked with `element sequence has\nno method 'len'`. Root cause was `default: []` (an empty content block)\nfed to `.len()` — typst content has no `len()`. Every shipped profil\n[…]\nes — all 5 in template/ set both\nfields. Strictly broadens the contract for users who write minimal\nmetadata or partial overrides.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(styles): make overwrite-fonts safe with absent or partial [layout…",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a4699448d4c93b1cae4f359f09820f4eb437f83",
          "body": "Missed by the typstyle pre-commit hook during the previous commit.\nPure cosmetic — wraps a long `cv.with(...)` call onto multiple lines.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(test): apply typstyle to v3-lang-table fixture",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2460add7ad015eae6298d494d0f11ac360569800",
          "body": "Adds 10 shell-script smoke tests covering every panic point in v4's\nbackward-compat layer:\n\n  v3 schema removals (src/lib.typ:_check-v3-legacy):\n    - language        (typography shortcut, lib.typ:24)\n    - non_latin_font  (lib.typ:34)\n    - non_latin_name  (lib.typ:42)\n    - [lang.<code>]   (lib.ty\n[…]\ning match\n\n`fixture.typ` is not literally `test.typ`, so tytanic ignores these\nfiles entirely (`tt list` confirms an empty suite).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(panics): assert all v3/v2 schema migration panics",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eeb710a951317b78ecb4698cd394d90300fb7363",
          "body": "Lays the foundation for the v4 test suite without adding any tests yet:\n\n- typst.toml: configure [tool.tytanic] with cross-platform pixel tolerance\n  (max-delta=10, max-deviations=2000, ~0.14% of an A4 144-dpi page) to\n  absorb freetype/harfbuzz jitter between maintainer macOS and CI Linux.\n- tests/\n[…]\nd\n  the CJK-profile skip strategy.\n\nSubsequent commits add the actual tests (panics, units, components,\nregression) and CI wiring.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add tytanic scaffold and shared fixtures",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "091397ad1db8d8a7b5c9738a1119bf0882d7942a",
          "body": "Pre-commit pin lagged at 0.11.29 (released over a year ago); upstream\nmoved to typstyle-rs/typstyle and the 0.14 line. Bumps the hook + repo\nURL and applies the resulting format pass to src/ + template/.\n\nPure cosmetic diff (block-comment indent, wide-call wrapping, alphabetical\nimport sort). Build verified via `just build`. Locks the formatted state\nahead of adding `typstyle --check` to CI.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(typstyle): bump to 0.14.4 and apply format pass",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "347b34883572ea0cd40b0793a5306fe11c2eaae8",
          "body": "…gent references\n\nSigned-off-by: yunanwg <77310871+yunanwg@users.noreply.github.com>",
          "is_bot": false,
          "headline": "refactor(docs): reorganize project instructions and remove outdated a…",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70087bf79cbf58974909c6d7b4fe5826a4ba02f3",
          "body": "Previous commit (e9abd4d) deleted the `\"lang\": { ... }` property block\nfrom the schema but left the trailing comma after the `\"personal\"` block\nthat used to separate the two. Result was invalid JSON:\n\n  json.decoder.JSONDecodeError: Illegal trailing comma before end of object:\n  line 253 column 6\n\nE\n[…]\ns the schema (e.g. for documentation generation) would fail.\n\nTrims the comma so the file parses again. Verified with `json.load`.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(schema): remove trailing comma left over from `lang` table deletion",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0deead135ef42bd78bc7354f42852d61b0248187",
          "body": "…llback\n\nv4 supported three backward-compat patterns: (A) panic-with-migration-\nmessage, used since v3 for `inject_ai_prompt`/`inject_keywords`;\n(B) silent fallback, used briefly for v3 typography fields; and\n(C) full removal, used for renamed parameter/function aliases.\n\nPattern B was a regression \n[…]\n_latin_name + [lang.zh] + [lang.non_latin]) panics on first read\n  with the expected migration message — no silent fallback fires.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(api, schema): panic on v3 legacy fields instead of silent fa…",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67f9986e66c03fd35aa06fc25c59cbb84ecd6c4b",
          "body": "The previous commit (eb95738) marked `language` deprecated in its\ndescription but left it in the top-level `required` array. v4 profile\nmetadata.toml files no longer ship a `language` field, so any\neditor running schema validation against the shipped profiles\n(profile_en, fr, de, it, zh) reports a m\n[…]\nist so v4 profiles validate cleanly\nwhile v3 metadata.toml files continue to work (the field is still\nallowed, just not required).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(schema): drop `language` from top-level required",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abcd5da67a1bdcb4d0ba14c63627c76360725bcd",
          "body": "- migration.md: new \"Typography is now explicit\" subsection mapping\n  the four implicit v3 effects of `language=zh` to their explicit v4\n  equivalents (`[layout.fonts]`, `[layout.section] title_highlight`,\n  `[personal] display_name`, `[layout] date_width`). Notes that\n  `_is-non-latin()` is gone, s\n[…]\n metadata defaults documented inline). configuration.md picks up the\n  new `[layout.section]` table from profile_en/metadata.toml.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: document the explicit-typography model (no language whitelist)",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d2e3d014f38c3e151ee69f0eba2567d2ae3a31a0",
          "body": "…hy schema\n\nRemoves the v3 `language` / `non_latin_font` / `non_latin_name` fields\nfrom the shipped profile templates and replaces them with the explicit\nv4 typography fields. Every locale-specific decision is now visible in\nthe profile's metadata.toml.\n\nPer-profile changes:\n- profile_en, profile_de\n[…]\ndd the `[layout.section]` table with `title_highlight` enum\n  (first-letters | full | none) and integer `title_highlight_letters`.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(template, schema): align profiles with the explicit-typograp…",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "35a44ce27d057e4cc2370df5107d7dffea0f0d0a",
          "body": "In v3 the `language` field was a shortcut that secretly drove four\ntypography decisions: which font got pushed onto the fallback chain,\nwhether the section title was split into \"first-N + rest\", whether\n`non_latin_name` replaced the first/last split, and the default date\ncolumn width. v4 removes tha\n[…]\nja\", \"ko\", \"ru\") and the new explicit fields are\nabsent. v3 users can do a bare version bump without touching their\nmetadata.toml.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(api): drop the language abstraction; typography is now explicit",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ae5d36f66838260a582a96b687746c92b58a96d5",
          "body": "Last commit (d3589ad) put the bare phrase\n`profile_<name>/metadata.toml` inside the Section 6 heading. In Typst\nunquoted text, `<...>` is label syntax, so the heading was parsed as\nan unclosed label literal:\n\n  error: unclosed delimiter\n    ┌─ docs/pdf/docs.typ:279:39\n    │\n  279 │ == 6. Configurati\n[…]\narses it as a raw string, sidestepping the label syntax). Verified\nwith `typst compile --root . docs/pdf/docs.typ` — builds clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(docs-pdf): wrap profile_<name>/metadata.toml in backticks",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c058994820debde5e9d29edb53989ae4af07eb3",
          "body": "The Section 6 Configuration Reference heading and its preamble still\ncalled the file \"metadata.toml\" (singular, root-style) and showed an\nexample labelled \"Here is an example of a root metadata.toml file\".\nBoth were left over from the v3 / deep-merge wording. Updates them to\npoint at profile_<name>/metadata.toml and to reinforce that each\nprofile is self-contained. The Step 4 heading is also retitled.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(pdf): finish removing root metadata.toml references",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d378e1f01ac701d6493d2dbbc2e9d99d08c8ef15",
          "body": "The PDF documentation's File Structure Map and Configure step still\ndescribed `profile_<name>/metadata.toml` as \"sparse per-profile\noverrides\" on top of a shared root, language from the deep-merge\ndraft of v4. Updates the wording to match the shipped architecture:\neach profile is a self-contained complete configuration.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(pdf): fix stale root-metadata wording in offline reference",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d34094dc499281c4fc2ec74c9236c4798b853780",
          "body": "Follows the source pivot to one-profile-per-metadata.toml (no root, no\ndeep-merge). Updates every user- and contributor-facing surface:\n\n- migration.md: rewrites the v3 -> v4 upgrade path. Replaces the\n  deep-merge instructions with \"one profile = one self-contained\n  metadata.toml\" and adds a Desig\n[…]\nreplaces v3's [lang.<code>]\"\n  remarks from descriptions — these are now the primary form, not a\n  v4 addition over a v3 baseline.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: align documentation with profile-only architecture",
          "author_name": "yunanwg",
          "author_login": "yunanwg",
          "committed_at": "2026-04-29T19:55:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 26,
      "commits_last_year": 206,
      "latest_release_at": "2026-07-19T09:45:59Z",
      "latest_release_tag": "v4.1.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 8,
      "mean_days_between_releases": 26.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 101,
      "stars": 812,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2023-06-11",
            "count": 1
          },
          {
            "date": "2023-07-09",
            "count": 1
          },
          {
            "date": "2023-07-12",
            "count": 1
          },
          {
            "date": "2023-11-03",
            "count": 1
          },
          {
            "date": "2023-12-14",
            "count": 1
          },
          {
            "date": "2023-12-20",
            "count": 1
          },
          {
            "date": "2024-01-28",
            "count": 1
          },
          {
            "date": "2024-02-05",
            "count": 1
          },
          {
            "date": "2024-03-09",
            "count": 1
          },
          {
            "date": "2024-03-13",
            "count": 1
          },
          {
            "date": "2024-03-23",
            "count": 1
          },
          {
            "date": "2024-06-18",
            "count": 1
          },
          {
            "date": "2024-07-01",
            "count": 1
          },
          {
            "date": "2024-07-21",
            "count": 1
          },
          {
            "date": "2024-07-29",
            "count": 1
          },
          {
            "date": "2024-07-31",
            "count": 1
          },
          {
            "date": "2024-08-27",
            "count": 1
          },
          {
            "date": "2024-09-17",
            "count": 1
          },
          {
            "date": "2024-09-24",
            "count": 1
          },
          {
            "date": "2024-10-09",
            "count": 1
          },
          {
            "date": "2024-10-12",
            "count": 2
          },
          {
            "date": "2024-10-22",
            "count": 1
          },
          {
            "date": "2024-10-27",
            "count": 1
          },
          {
            "date": "2024-10-29",
            "count": 1
          },
          {
            "date": "2024-11-15",
            "count": 1
          },
          {
            "date": "2024-12-15",
            "count": 1
          },
          {
            "date": "2024-12-19",
            "count": 1
          },
          {
            "date": "2024-12-21",
            "count": 1
          },
          {
            "date": "2024-12-22",
            "count": 1
          },
          {
            "date": "2025-01-16",
            "count": 1
          },
          {
            "date": "2025-01-25",
            "count": 1
          },
          {
            "date": "2025-02-04",
            "count": 1
          },
          {
            "date": "2025-02-08",
            "count": 1
          },
          {
            "date": "2025-02-09",
            "count": 1
          },
          {
            "date": "2025-02-13",
            "count": 1
          },
          {
            "date": "2025-02-23",
            "count": 1
          },
          {
            "date": "2025-03-16",
            "count": 1
          },
          {
            "date": "2025-04-07",
            "count": 1
          },
          {
            "date": "2025-04-30",
            "count": 1
          },
          {
            "date": "2025-05-04",
            "count": 1
          },
          {
            "date": "2025-05-30",
            "count": 1
          },
          {
            "date": "2025-07-02",
            "count": 1
          },
          {
            "date": "2025-07-04",
            "count": 1
          },
          {
            "date": "2025-07-19",
            "count": 1
          },
          {
            "date": "2025-07-21",
            "count": 1
          },
          {
            "date": "2025-08-01",
            "count": 1
          },
          {
            "date": "2025-08-03",
            "count": 1
          },
          {
            "date": "2025-08-15",
            "count": 1
          },
          {
            "date": "2025-08-21",
            "count": 1
          },
          {
            "date": "2025-08-24",
            "count": 1
          },
          {
            "date": "2025-09-14",
            "count": 1
          },
          {
            "date": "2025-09-20",
            "count": 1
          },
          {
            "date": "2025-10-05",
            "count": 1
          },
          {
            "date": "2025-10-12",
            "count": 1
          },
          {
            "date": "2025-10-22",
            "count": 1
          },
          {
            "date": "2025-11-06",
            "count": 1
          },
          {
            "date": "2025-11-07",
            "count": 1
          },
          {
            "date": "2025-11-09",
            "count": 1
          },
          {
            "date": "2025-11-12",
            "count": 1
          },
          {
            "date": "2025-11-14",
            "count": 1
          },
          {
            "date": "2025-11-17",
            "count": 1
          },
          {
            "date": "2025-11-20",
            "count": 1
          },
          {
            "date": "2025-11-28",
            "count": 1
          },
          {
            "date": "2025-12-02",
            "count": 2
          },
          {
            "date": "2025-12-14",
            "count": 1
          },
          {
            "date": "2025-12-16",
            "count": 1
          },
          {
            "date": "2025-12-23",
            "count": 1
          },
          {
            "date": "2025-12-24",
            "count": 1
          },
          {
            "date": "2025-12-27",
            "count": 1
          },
          {
            "date": "2026-01-05",
            "count": 1
          },
          {
            "date": "2026-01-08",
            "count": 1
          },
          {
            "date": "2026-01-11",
            "count": 1
          },
          {
            "date": "2026-01-16",
            "count": 1
          },
          {
            "date": "2026-01-30",
            "count": 1
          },
          {
            "date": "2026-02-03",
            "count": 1
          },
          {
            "date": "2026-02-05",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-13",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-02-25",
            "count": 1
          },
          {
            "date": "2026-03-01",
            "count": 1
          },
          {
            "date": "2026-03-13",
            "count": 1
          },
          {
            "date": "2026-03-20",
            "count": 2
          },
          {
            "date": "2026-03-21",
            "count": 1
          },
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-03-26",
            "count": 1
          },
          {
            "date": "2026-04-08",
            "count": 1
          },
          {
            "date": "2026-04-09",
            "count": 1
          },
          {
            "date": "2026-05-05",
            "count": 1
          },
          {
            "date": "2026-05-06",
            "count": 2
          },
          {
            "date": "2026-05-17",
            "count": 1
          },
          {
            "date": "2026-05-24",
            "count": 1
          },
          {
            "date": "2026-05-26",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 1
          },
          {
            "date": "2026-07-20",
            "count": 2
          }
        ],
        "complete": true,
        "collected": 101,
        "total_forks": 101
      },
      "star_history": null,
      "open_issues_and_prs": 3
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "justfile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 15997,
      "source_files_sampled": 6,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        ".github/copilot-instructions.md",
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 4733
    },
    "dependencies": {
      "manifests": [
        "scripts/requirements-checks.txt"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 3,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "jsonschema",
            "direct": false,
            "version": "4.26.0",
            "ecosystem": "pypi"
          },
          {
            "name": "mkdocs-glightbox",
            "direct": false,
            "version": "0.5.2",
            "ecosystem": "pypi"
          },
          {
            "name": "mkdocs-material",
            "direct": false,
            "version": "9.7.7",
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 3,
        "direct_count": 0,
        "indirect_count": 3
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 3,
        "merged_prs": 120,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 99,
        "closed_unmerged_prs": 7
      },
      "bus_factor": 1,
      "bot_contributors": 3,
      "top_contributors": [
        {
          "type": "User",
          "login": "yunanwg",
          "commits": 307,
          "avatar_url": "https://avatars.githubusercontent.com/u/77310871?v=4"
        },
        {
          "type": "User",
          "login": "LeWimbes",
          "commits": 6,
          "avatar_url": "https://avatars.githubusercontent.com/u/12753781?v=4"
        },
        {
          "type": "User",
          "login": "SimonIT",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/11720038?v=4"
        },
        {
          "type": "User",
          "login": "ttlns",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/89038706?v=4"
        },
        {
          "type": "User",
          "login": "alberto-lazari",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/70653968?v=4"
        },
        {
          "type": "User",
          "login": "alexk101",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/56556451?v=4"
        },
        {
          "type": "User",
          "login": "bradarnold",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/6722831?v=4"
        },
        {
          "type": "User",
          "login": "zzamboni",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/32876?v=4"
        },
        {
          "type": "User",
          "login": "ericthomasca",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/2215838?v=4"
        },
        {
          "type": "User",
          "login": "MrSom3body",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/129101708?v=4"
        }
      ],
      "contributors_sampled": 21,
      "top_contributor_share": 0.919
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "claude-code-review.yml",
        "claude.yml",
        "compile.yaml",
        "documentation.yaml",
        "regen-refs.yaml",
        "release-and-publish.yaml",
        "sponsors.yaml",
        "test.yaml",
        "update-previews.yaml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "security_signals": {
      "lockfiles": [],
      "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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
            "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": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "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": 10,
            "reason": "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 13 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": 8,
            "reason": "dependency not pinned by hash detected -- score normalized to 8",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool is run on all commits",
            "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": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "7772666e9848393932103830b8e71d8a7d695a2c",
        "ran_at": "2026-07-28T01:59:40Z",
        "aggregate_score": 6.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-27T11:21:57Z",
      "oldest_open_prs": [
        {
          "number": 188,
          "created_at": "2026-06-24T10:06:08Z",
          "last_comment_at": "2026-07-20T08:06:57Z",
          "last_comment_author": "danielschlaugies"
        },
        {
          "number": 234,
          "created_at": "2026-07-27T03:25:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 235,
          "created_at": "2026-07-27T03:25:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-27T11:20:00Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/yunanwg/brilliant-CV",
    "host": "github.com",
    "name": "brilliant-CV",
    "owner": "yunanwg"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 73,
      "inputs": {
        "security": 71,
        "vitality": 86,
        "community": 68,
        "governance": 52,
        "engineering": 92
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 206,
              "human_commit_share": 0.9,
              "days_since_last_push": 0,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "206 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 206
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 26,
              "latest_release_tag": "v4.1.0",
              "releases_from_tags": false,
              "days_since_latest_release": 8,
              "mean_days_between_releases": 26.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "26 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 8 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~26.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 26.2
                    }
                  }
                ],
                "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": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 5,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 5 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 68,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "forks": 101,
              "stars": 812,
              "watchers": 3,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "812 stars",
                "points": 47.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 812
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "101 forks",
                "points": 16.7,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 101
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "3 watchers",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 18,
                "status": "met",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 52,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 21,
              "top_contributor_share": 0.919
            },
            "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 92% of commits",
                "points": 1.8,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "21 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 21
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "merged_prs": 120,
              "open_issues": 0,
              "closed_issues": 99,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 7
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "120/127 decided PRs merged",
                "points": 36.1,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 120,
                      "decided": 127
                    }
                  }
                ],
                "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": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 48,
            "inputs": {
              "followers": 37,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "yunanwg",
              "public_repos": 6,
              "account_age_days": 2022
            },
            "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": "37 followers of yunanwg",
                "points": 11.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 37,
                      "login": "yunanwg"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "6 public repos, account ~5 yr old",
                "points": 17.2,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 6
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 5
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 92,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 94,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "9 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 16,
                "status": "met",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [
                "cv",
                "pdf",
                "typst",
                "typst-template",
                "resume",
                "resume-template",
                "prompt-injection"
              ],
              "has_wiki": false,
              "homepage": "https://typst.app/universe/package/brilliant-cv",
              "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://typst.app/universe/package/brilliant-cv",
                "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": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "good",
        "name": "Security",
        "value": 71,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 64,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 6.4
            },
            "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": "branch protection is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "30 out of 30 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "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 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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 13 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 8",
                "points": 4,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "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": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 3 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 3
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 3,
              "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": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "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": 3,
              "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": 12
            },
            "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": 81,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".github/copilot-instructions.md",
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 4733
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".github/copilot-instructions.md, AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".github/copilot-instructions.md, AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "90 of 90 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 90,
                      "sampled": 90
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "excellent",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 87,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": false,
              "bootstrap_files": [
                "justfile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.63,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.1
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "justfile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "justfile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 11,
                "status": "met",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "63 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 63,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "10 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 10,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 8",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Typst",
              "largest_source_bytes": 15997,
              "source_files_sampled": 6,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Typst without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Typst"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/6 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 6,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T02:00:05.607738Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/y/yunanwg/brilliant-CV.svg",
  "full_name": "yunanwg/brilliant-CV",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte Statistiken.