Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 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 зірок⑂ 101 форкз квіт. 2023 р.Переглянути на GitHub ↗

yunanwg/brilliant-CV має індекс здоров’я 73 зі 100, що відповідає смузі «Добрий». Найвищий показник — Engineering Quality (92/100), найнижчий — Sustainability & Governance (52/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

73
загалом / 100
Добрий

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

73
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Yunan WangОсобистий обліковий запис
37 підписників6 публічних репозиторіївз січ. 2021 р.

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

86Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
11.8/36Ритм комітів — 17/52 тижнів із комітами
18/18Обсяг комітів — 206 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 13 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year206
human_commit_share0,9
days_since_last_push0
active_weeks_last_year17
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 26 релізів
36/36Свіжість релізів — останній реліз 8 дн. тому
27/27Ритм релізів — реліз кожні ~26,2 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count26
latest_release_tagv4.1.0
releases_from_tagsні
days_since_latest_release8
mean_days_between_releases26,2
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

68Помірний · 18% загального індексу
Як обчислюється оцінка
47.2/60Зірки — 812 зірок
16.7/25Форки — 101 форків
1.7/15Спостерігачі — 3 спостерігачів
Використані вхідні дані
forks101
stars812
watchers3
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (Apache-2.0)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

52Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
1.8/22.5Розподіл комітів — головний контриб’ютор — автор 92% комітів
13.5/13.5Широта контриб’юторів — 21 контриб’юторів
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Використані вхідні дані
bus_factor1
contributors_sampled21
top_contributor_share0,919
Як обчислюється оцінка
46.8/46.8Вирішення issue — закрито 100% issue
36.1/38.3Прийняття PR — злито 120/127 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/20 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs120
open_issues0
closed_issues99
issue_closed_ratio1
closed_unmerged_prs7

Власність та опіка

48У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
11.4/25Охоплення власника — 37 підписників у yunanwg
17.2/25Послужний список — 6 публічних репозиторіїв, вік облікового запису ~5 р.
Використані вхідні дані
followers37
owner_typeUser
is_verified
owner_loginyunanwg
public_repos6
account_age_days2 022
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Інженерна якість

Чи наявні базові інженерні практики та документація?

92Відмінний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 9 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера
9.6/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configтак

Документація

90Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://typst.app/universe/package/brilliant-cv
10/10Опис репозиторію
10/10Теми — 7 тем
0/10Wiki
Використані вхідні дані
topicscv, pdf, typst, typst-template, resume, resume-template, prompt-injection
has_wikiні
homepagehttps://typst.app/universe/package/brilliant-cv
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

71Добрий · 16% загального індексу

Стан безпеки

64Помірний
Як обчислюється оцінка
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.5Ліцензія — 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 — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate6,4
Виключено з оцінювання (немає даних або не застосовно): signed_releases. Залишкові ваги перенормовано.
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories0
affected_packages0
assessed_packages3
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень, Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено 3 резолвлених залежностей із OSV. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

81Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — .github/copilot-instructions.md, AGENTS.md, CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 90 з 90 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_files.github/copilot-instructions.md, AGENTS.md, CLAUDE.md
agent_instruction_max_bytes4 733
Як обчислюється оцінка
18/18Розгортання однією командою — justfile
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера
0/11Статична перевірка типів
10/10Відтворюване середовище — Dockerfile
10/10Підтверджена практика роботи з агентами — 63 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 10 з останніх 100 комітів — автоматичні оновлення залежностей
8/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 8
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileтак
typed_languageні
bootstrap_filesjustfile
has_devcontainerні
has_linter_configтак
typecheck_configs
agent_commit_share0,63
toolchain_manifests
dependency_bot_commit_share0,1
Як обчислюється оцінка
0/45Типізований код — Typst без конфігурації перевірки типів
55/55Керовані розміри файлів — 0/6 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageTypst
largest_source_bytes15 997
source_files_sampled6
oversized_source_files0

Ключові факти

812зірок GitHub
21контриб'юторів
206комітів за останні 12 місяців
0днів від останнього пушу
26релізів
1бас-фактор
0відкритих issue
PyPIпакетних екосистем

Попередження щодо збору даних

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

Докладніше

Історія зірок і форків 0 ★ / 101 ⇿
0Зірки
101Форки
25Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

02040608010012010132023-062024-122026-07
Мажорні 4Мінорні 10Патчі 10

Кожна точка охоплює 3 днів.

OpenSSF Scorecard 6.4 / 10
6.4сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).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
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Усі залежності 3

Повний розв'язаний набір залежностей із графа залежностей GitHub: 0 прямих і 3 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
PyPIjsonschema4.26.0непряма
PyPImkdocs-glightbox0.5.2непряма
PyPImkdocs-material9.7.7непряма
Сповіщення про залежності 0

Цей репозиторій не публікує пакета, який розпізнає індекс, тож оцінено його власний граф залежностей — 3 пакетів, серед яких є й піниї розробки та тестування, що ніколи не постачаються: 0 мають відомі сповіщення, з них 0 прямі.

Жодне відоме сповіщення не стосується оцінених залежностей.

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "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"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистика.