Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-27 07:28 UTC

yeferson59 / gofinance

A robust, type-safe Go library for financial calculations and money management. Features simple & compound interest, annuities, and precise monetary operations with multi-currency support.

GoMIT★ 0 зірок⑂ 0 форківз груд. 2025 р.Переглянути на GitHub ↗

yeferson59/gofinance має індекс здоров’я 57 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (84/100), найнижчий — Community & Adoption (24/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

57
загалом / 100
Помірний

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

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

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

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

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

Власність

Yeferson TolozaОсобистий обліковий запис
11 підписників69 публічних репозиторіївз жовт. 2022 р.

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

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/yeferson59/gofinance/v2v2.0.0-18 днів тому
Gogithub.com/yeferson59/gofinancev1.4.2-1316 днів тому

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

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

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

84Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
9.7/36Ритм комітів — 14/52 тижнів із комітами
18/18Обсяг комітів — 189 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year189
human_commit_share1
days_since_last_push0
active_weeks_last_year14
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 12 релізів
36/36Свіжість релізів — останній реліз 8 дн. тому
27/27Ритм релізів — реліз кожні ~13,2 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count12
latest_release_tagv2.0.0
releases_from_tagsні
days_since_latest_release8
mean_days_between_releases13,2
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

24Критичний · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 0 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/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ні

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

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

56Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
4.1/22.5Розподіл комітів — головний контриб’ютор — автор 82% комітів
2.7/13.5Широта контриб’юторів — 2 контриб’юторів
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Використані вхідні дані
bus_factor1
contributors_sampled2
top_contributor_share0,819
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
38.2/38.3Прийняття PR — злито 13/13 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/13 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs13
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue. Залишкові ваги перенормовано.

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

48У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
7.8/25Охоплення власника — 11 підписників у yeferson59
20.5/25Послужний список — 69 публічних репозиторіїв, вік облікового запису ~3 р.
Використані вхідні дані
followers11
owner_typeUser
is_verified
owner_loginyeferson59
public_repos69
account_age_days1 370
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 2 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 8 дн. тому
20/20Історія версій — 13 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/yeferson59/gofinance/v2, github.com/yeferson59/gofinance
ecosystemsgo
any_deprecatedні
min_days_since_publish8

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

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

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

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

50Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

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

41У зоні ризику · 16% загального індексу

Стан безпеки

41У зоні ризику
Як обчислюється оцінка
6.8/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 3 out of 3 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/13 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — немає даних
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,1
Виключено з оцінювання (немає даних або не застосовно): packaging, signed_releases. Залишкові ваги перенормовано.

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

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

66Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 99 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
18/18Розгортання однією командою — Makefile
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .golangci.yaml
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 22 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileні
typed_languageтак
bootstrap_filesMakefile
has_devcontainerні
has_linter_configтак
typecheck_configs
agent_commit_share0,22
toolchain_manifestscharts/go.mod, examples/go.mod, go.mod
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
55/55Керовані розміри файлів — 0/131 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes20 828
source_files_sampled131
oversized_source_files0
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

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

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

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

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Докладніше

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

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-27 07:28 UTC

9Binary-Artifactsbinaries present in source code
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests3 out of 3 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/13 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 3
РеєстрПакетОбмеження версіїМаніфест
Gogithub.com/go-echarts/go-echarts/v2v2.7.2charts/go.mod
Gogithub.com/yeferson59/gofinance/v2v2.0.0charts/go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 13387,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 662466,
        "Shell": 1062,
        "Makefile": 865
      },
      "pushed_at": "2026-07-26T20:48:17Z",
      "created_at": "2025-12-31T23:29:11Z",
      "owner_type": "User",
      "updated_at": "2026-07-26T20:48:21Z",
      "description": "A robust, type-safe Go library for financial calculations and money management. Features simple & compound interest, annuities, and precise monetary operations with multi-currency support.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Yeferson Toloza",
      "type": "User",
      "login": "yeferson59",
      "company": null,
      "location": null,
      "followers": 11,
      "avatar_url": "https://avatars.githubusercontent.com/u/116679774?v=4",
      "created_at": "2022-10-25T19:39:19Z",
      "is_verified": null,
      "public_repos": 69,
      "account_age_days": 1370
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2026-07-18T21:24:40Z"
        },
        {
          "tag": "v1.4.2",
          "kind": "patch",
          "published_at": "2026-07-11T01:11:12Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2026-07-10T23:49:37Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-07-10T18:41:25Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-07-09T23:44:27Z"
        },
        {
          "tag": "v1.2.5",
          "kind": "patch",
          "published_at": "2026-05-30T04:41:23Z"
        },
        {
          "tag": "v1.2.4",
          "kind": "patch",
          "published_at": "2026-05-17T19:56:20Z"
        },
        {
          "tag": "v1.2.3",
          "kind": "patch",
          "published_at": "2026-03-21T16:24:22Z"
        },
        {
          "tag": "v1.2.2",
          "kind": "patch",
          "published_at": "2026-03-21T15:46:58Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-03-21T15:43:17Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-01-16T04:01:15Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-01-06T17:51:47Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "3f453122a59342923b1f5e0e811536abfeeff2db",
          "body": null,
          "is_bot": false,
          "headline": "fix!: remove deprecated methods for money",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-25T23:45:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b875282cc53635e840eafec7aa553343c09388f6",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #13 from yeferson59/claude/session-ensuba",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-20T23:12:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d72c2be629363fb0a528153fae4936c2c0af2fe",
          "body": "Deferred annuities (finance/annuities/deferred.go) add a grace period\nbefore payments start, discounting the ordinary present value back the\nextra periods. General annuities (finance/annuities/general.go) let the\npayment frequency differ from the rate's compounding frequency, reusing\nthe existing pe\n[…]\ne computes present/future value for\narithmetic (constant amount per period) and geometric (constant\npercentage per period) payment series, with a fluent builder matching\nthe annuities package's style.",
          "is_bot": false,
          "headline": "feat: add deferred/general annuities and arithmetic/geometric gradients",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-20T14:51:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc69f6b886703a88adf62b967301f2725e7f8faf",
          "body": "…view-1k0zzn",
          "is_bot": false,
          "headline": "Merge pull request #12 from yeferson59/claude/package-architecture-re…",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-18T21:21:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b234b0c15d81dfd01b10a64c03cf246a8c3a2225",
          "body": "…incipal\n\nFuture() and AnticipateFuture() silently returned the compounded\nprincipal (or a pre-set future value) whenever one was configured, making\nthe plain annuity future value — the payments' growth — unreachable on\nthose annuities. Each concern now has its own method:\n\n- Future / AnticipateFutu\n[…]\nities package docs that still referenced the old\ncompositeinterest name.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "fix!: stop annuity Future/AnticipateFuture short-circuiting to the pr…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:16:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "feff3dfece6e8f0557b43d0ef70a92b21d66ea5e",
          "body": "The accumulated breaking changes (ToMoney removal, charts module split,\ncompoundinterest rename, currency-checked Add/Sub) ride a proper semver\nmajor release. All library imports move to the /v2 prefix; the charts\nmodule keeps its own path and now requires the /v2 library. Docs updated;\nnext release should be tagged v2.0.0 (root) and charts/v1.0.0.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "refactor!: bump module path to github.com/yeferson59/gofinance/v2",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:10:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "393f41d2c58f206267fed1f42a4d176b8cd8e1bf",
          "body": "Add and Sub now verify that both operands share a currency, panicking on\na mismatch exactly as they already did on overflow — mirroring the\ndecimal engine's Add/TryAdd pattern. The new TryAdd/TrySub return\nErrCurrencyMismatch (or the overflow error) instead of panicking.\nSafeAdd/SafeSub remain as deprecated aliases of the Try variants.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "feat!: make Money.Add/Sub currency-checked with TryAdd/TrySub variants",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:08:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a9ea0fd98dbf5e58b6df5bf3ba3d8b943c8d1f5d",
          "body": "buildInvestmentSchedule (ordinary and annuity-due contribution schedules)\nwas still attaching the schedule currency to the rate and using the\ndeprecated Money.Mul; compute interest with MulDecimal instead.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "fix: migrate investment schedules off deprecated Money.Mul",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:07:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d173d8e6df184843751007f6d76f0fbd9a99b7e5",
          "body": "Update ARCHITECTURE.md to move the compoundinterest rename, the\nMoney-by-Money deprecations and the finance/term unification from\nfollow-ups to executed changes, and spell out the remaining release\ndecision (v2.0.0 with /v2 module path vs a documented v1.5.0). Refresh\nREADME, CHANGELOG and the compoundinterest package docs for the new\nnames.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "docs: record executed recommendations and the v2 release decision",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:03:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "85668bff68bbc8324522ce7c8a599787d4c82671",
          "body": "Add finance/term with Unit (days/weeks/months/years) and Frequency\n(daily … annually) plus PeriodsPerYear/MonthsPerPeriod conversions.\nsimpleinterest.Periods and compoundinterest.CompoundingFrequency become\naliases of the shared types, so the interest packages now interoperate\non one vocabulary. The\n[…]\nes; invalid-frequency errors are now the typed\nterm.ErrInvalidFrequency.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "refactor: unify time vocabulary in the shared finance/term package",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T21:01:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c51a8495c669921bbc646371f1e49bf1fdd2f2f4",
          "body": "Mark Money.Mul, Money.Div and Money.MustDiv as deprecated: multiplying\ntwo monetary amounts is dimensionally meaningless and dividing them\nyields a currency-less ratio, not an amount. Compute the future/present\nratio in compoundinterest on decimals directly, and document on Add/Sub\nthat they do not currency-check (pointing to SafeAdd/SafeSub).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "refactor: deprecate Money-by-Money Mul/Div and migrate internal callers",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:58:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "77763461059b25e7b30c8cbc6eb9b9fbc89407e4",
          "body": "\"Composite interest\" is a non-standard term for compound interest. Rename\nthe package directory, the CompositeInterest/CompositeConfig types, the\nNewComposite constructor (now NewCompound) and all references in\nannuities, charts, benchmarks, examples and docs. Historical CHANGELOG\nentries keep the old name.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "refactor!: rename finance/compositeinterest to finance/compoundinterest",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:57:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "481b8dcdedadb8bedfda777e505a82dd627798c5",
          "body": "Document the decimal → money → finance → charts layering rules, the\nthree-module repository structure, what the restructuring changed, and\nthe recommended follow-ups (compoundinterest rename, Money.Mul(Money)\ndeprecation, shared term vocabulary, versioning note). Update README,\nFEATURES.md and CHANGELOG accordingly.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "docs: add ARCHITECTURE.md and update docs for the new module layout",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:50:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "06a36a3d3232c05a02a3752dd5477d7aac1e5c03",
          "body": "Add annuities.WriteCSVTo(io.Writer, ...) with WriteCSV kept as a thin\nfile wrapper, so the domain package no longer forces output to disk.\nRemove the stale generated amortizacion.csv from the repo root, and make\nMoney.Scan set the USD default currency like UnmarshalJSON does instead\nof leaving it unset.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "refactor: decouple schedule CSV export from the filesystem",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:48:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "505c2e7c8fa80ed5ec72c83d17184a1f093f231a",
          "body": "Move finance/charts to a top-level charts module and give examples its own\nmodule, so the root library module no longer requires go-echarts (its only\nnon-test dependency). Consumers who don't render charts now pull zero\nexternal runtime dependencies; chart users import\ngithub.com/yeferson59/gofinance/charts. Makefile and CI build/test all\nthree modules.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "refactor: extract charts and examples into their own Go modules",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:47:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "19aa381b2344ce995d3b3408c1201dcabfdaa293",
          "body": "Replace the 335-line money.Decimal mirror of decimal.Decimal with a type\nalias plus deprecated constructor forwarders, so the decimal engine has a\nsingle source of truth. Add money.FromDecimal (replacing Decimal.ToMoney)\nand dimensionally-correct Money.MulDecimal/DivDecimal/MustDivDecimal so\nrates n\n[…]\n\ncarries a currency (tvm and daycount no longer depend on money at all).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01VLyeVUw6317CVmwoCLTeia",
          "is_bot": false,
          "headline": "refactor: make decimal the single numeric API and money currency-only",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:46:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "19bdb9acd0a8da5f14da38ad685027b5ccfcacd9",
          "body": "…cbxnp",
          "is_bot": false,
          "headline": "Merge pull request #11 from yeferson59/claude/package-features-list-f…",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-18T20:36:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d86808ab88a0655c504fbf82c5912e8ad8ab7a17",
          "body": "revive's redefines-builtin-id flagged 'real' (a Go builtin) used as a variable\nand parameter name in the inflation helpers and example.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PULTSB1mKMTgJBjwramWSA",
          "is_bot": false,
          "headline": "fix: rename 'real' variables to avoid shadowing the real builtin",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:34:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "baaaa8da48e3b9314c77ce6cda522dc70b4835df",
          "body": "Second batch of medium-priority features from FEATURES.md, each on the decimal\nengine via the money package with the existing Try/Solve + Must* and\nfluent-builder conventions:\n\n- finance/investment: date-based XNPV/XIRR (DatedCashFlow, Actual/365) and\n  level/growing (Gordon) perpetuities\n- finance/\n[…]\ne)\n\nAdd runnable examples and update README, CHANGELOG and FEATURES.md.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PULTSB1mKMTgJBjwramWSA",
          "is_bot": false,
          "headline": "feat: add bonds, depreciation, XNPV/XIRR, perpetuities and inflation",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T20:29:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "97b7b4c115f87af0c3c1c4500317d6a1234d32bb",
          "body": "…kages\n\nImplement the recommended quick-win features from FEATURES.md, each built on\nthe decimal engine via the money package and following the existing Try*/Must*\nand fluent-builder conventions:\n\n- finance/returns: CAGR, ROI, holding-period and annualized returns\n- finance/investment: NPV over a ca\n[…]\namples, README/CHANGELOG entries, and unit tests for all four\npackages.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PULTSB1mKMTgJBjwramWSA",
          "is_bot": false,
          "headline": "feat: add returns, investment (NPV/IRR), TVM solver and day-count pac…",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T00:49:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "421d325fcc80dc35c89c9b08884d271545833dab",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01PULTSB1mKMTgJBjwramWSA",
          "is_bot": false,
          "headline": "docs: add FEATURES.md with prioritized feature candidates",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-18T00:26:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f0edad3a4c0858de47ad78593fbf3d18fb155f20",
          "body": "Add comprehensive test cases to verify that errors such as division by\nzero, exponent overflow, and invalid period configurations are\ncorrectly propagated by all future and present value calculation\nmethods.",
          "is_bot": false,
          "headline": "feat: add unit tests for error propagation in annuity calculations",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T20:24:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9632ffec75231d89455107e778200120ca7f7a9d",
          "body": "Add comprehensive tests to ensure that internal calculations correctly\npropagate errors related to invalid periods, numerical overflows, and\nmathematically undefined operations (such as logarithms of negative\nnumbers or division by zero) across various finance functions.",
          "is_bot": false,
          "headline": "feat: add error propagation tests for finance modules",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T20:17:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69e44d5536b70aa880791624cff27ffb7091d653",
          "body": "Add unit tests for decimal math operations, financial builders, and\nconvenience methods to ensure reliability across the packages.",
          "is_bot": false,
          "headline": "feat: add extensive test coverage for decimal and finance modules",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T20:01:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f110d844ff7b804ce76fc802ddce10c23c053454",
          "body": null,
          "is_bot": false,
          "headline": "feat: add growth and investment examples to examples/main.go",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T19:40:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edbf5e695febb641a7ab1ce843463e53a98222c0",
          "body": null,
          "is_bot": false,
          "headline": "chore: add CI and code coverage badges to README",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T19:40:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16d73047a50ae174ce38df9c90129119862d2d40",
          "body": "- Implement `FutureWithContributions` and\n  `AnticipateFutureWithContributions`\n- Add `BuildInvestmentSchedule` and `BuildAnticipateInvestmentSchedule`\n- Add methods to solve for periods and rates (ordinary and due)\n- Add payment solvers for annuities due\n- Add chart builders for growth and investment schedules",
          "is_bot": false,
          "headline": "feat: add annuity features and investment schedules",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T19:40:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0a19cd9da55fcc58b3e7a7e3aa24237634b0084",
          "body": "- Implement NewFraction functions for float64, int64, and string.\n- Update ErrSymbolFraction message to be more descriptive.\n- Add comprehensive test suite for fraction parsing and division.",
          "is_bot": false,
          "headline": "fix: add fraction support and improve error handling",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T17:56:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ecb8465ce6d6200ad1972d3becc549eefa83664c",
          "body": null,
          "is_bot": false,
          "headline": "fix: exclude examples directory from test coverage analysis",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T17:52:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "307d9f78857c18db5c40d29e4bec2e72674350ac",
          "body": null,
          "is_bot": false,
          "headline": "chore: update Go version to 1.26.5",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T17:47:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "63892dbfaa8552abac0b6590ba6ed6770c68bccf",
          "body": "- Added `NewFractionFloat64`, `NewFractionInt64`, `NewFractionString`,\n  and corresponding `Must` variants.\n- Removed \"money:\" prefix from error messages.",
          "is_bot": false,
          "headline": "feat: add fraction creation methods and simplify error messages",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-12T17:35:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c32d8902e4aae014ef0a0f517dca8e045d32157f",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump codecov-action to v7",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-11T01:16:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b14df916ad4b55c8b554d08537f61bb600f88c84",
          "body": null,
          "is_bot": false,
          "headline": "chore: update action-gh-release to v3",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-11T01:12:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1a04199c61b748ee2e6cf45ea516ab4dca8dc2f",
          "body": "Introduced the `finance/charts` package to generate interactive\nline charts for amortization schedules using `go-echarts`. Includes\ncurrency-aware rounding for series data and unit tests.",
          "is_bot": false,
          "headline": "feat(charts): add visualization package for amortization schedules",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-11T01:08:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7bb0dbb49a1c865b19718f639fda4cb8716291e",
          "body": "- Document the new zero-dependency, allocation-free `decimal` engine.\n- Update code examples to reflect the new API and immutable design.\n- Clarify concurrency model (transition to immutable value types).\n- Update dependency list and project structure.\n- Add performance and precision comparison tables.",
          "is_bot": false,
          "headline": "docs: update README with new decimal engine and architectural changes",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-11T00:25:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df6e41bbb519310397f20867c497db048aa26702",
          "body": "Implemented square root via Newton's integer iteration on the 256-bit\nradicand. Provides results correctly rounded to 19 fractional digits\nwith zero allocations.",
          "is_bot": false,
          "headline": "feat(decimal): add Decimal.Sqrt and MustSqrt methods",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-11T00:02:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "856efc582d1af800ca038b0a67cf70cbaaa82416",
          "body": "Replaces float64-based `Pow`, `Ln`, `Log`, `Log2`, and `Log10` with a\nnative 128-bit fixed-point engine. These operations are now\nzero-allocation,\ncomputationally efficient, and accurate to the 128-bit decimal limits.\n\n- Added `ErrLogNonPositive` and `ErrPowNegBase` for domain violations.\n- Implemented `Pow` integer exponentiation using binary exponentiation\n  on 38-digit intermediates.\n- Standardized `Pow(0, 0)` as 1 and updated division logic for improved\n  precision.",
          "is_bot": false,
          "headline": "feat: implement native transcendental operations for decimal128",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-10T23:45:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcd473063060db4a851700f0f0cf1b69f769ec7d",
          "body": null,
          "is_bot": false,
          "headline": "styles: refactor decimal128 by adding whitespace for readability",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-10T19:00:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dfd83af22cc086971b9e5101ddbba9ade2d5b72a",
          "body": "Moves the fixed-point decimal128/u128/u256 engine that used to live\ninside money into a standalone github.com/yeferson59/gofinance/decimal\npackage. money.Decimal and money.Money now wrap decimal.Decimal and\nkeep their existing public methods, but the low-level error variables\n(ErrOverflow, ErrDivide\n[…]\ns TryAdd/TrySub/TryMul, error-returning\nsiblings of the existing panicking Add/Sub/Mul, which money.Convert\nand money.Allocate use internally to keep returning errors instead of\npanicking on overflow.",
          "is_bot": false,
          "headline": "refactor!: split decimal engine out of money into its own package",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-10T18:40:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ccf2b7db266b5e0258640e10e9b139c72aa14fc8",
          "body": "Replaced all instances of `Must` methods with explicit error handling\nto improve reliability and robustness across annuity and composite\ninterest calculations.",
          "is_bot": false,
          "headline": "fix: replace panicking methods with error handling",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-10T17:56:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e9ef0c1f0760454192dab30145d3f67d0daa6ef",
          "body": null,
          "is_bot": false,
          "headline": "fix: update go-echarts dependency to v2.7.2",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-10T17:06:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d1578c736fb5797a20e7af9440090a6eb528880",
          "body": "Replace math.Pow with the dedicated Pow method to improve precision and\nconsistency with the money library.",
          "is_bot": false,
          "headline": "fix: use Pow method for annuity calculation",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-10T16:50:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f09d2fabd73b24269f04d500d9af2fd1410fb63",
          "body": "Implement AnticipateFuture and AnticipatePresent to calculate annuity\nvalues for payments made at the beginning of each period.",
          "is_bot": false,
          "headline": "feat: add annuity anticipation methods",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-10T16:42:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a5dadbe17283f353246a13dc7bc0bd6af97bd63",
          "body": null,
          "is_bot": false,
          "headline": "Update manual-release.yml",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-09T23:42:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d3d0dda9fbe44e7abe648aacd601ab1aff62019",
          "body": "…s-31ss28",
          "is_bot": false,
          "headline": "Merge pull request #10 from yeferson59/claude/performance-review-fixe…",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-09T23:41:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2f379c1dcc094175320b799e7728d9fc6c16769",
          "body": "Several call sites computed `(1+i)^n - 1` (and similar `1 - pow` forms) by\nconverting an exact decimal128 result to float64, doing the subtraction in\nfloat, then re-parsing the string back into a Decimal. This threw away\nprecision and allocated on the re-parse, and it was inconsistent with the\nsibli\n[…]\ne now at least\nas accurate and avoid the intermediate float conversion.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_015Z347ACSXAAtDitEdLY2fm",
          "is_bot": false,
          "headline": "refactor(finance): drop lossy float64 round-trips in rate/payment math",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T23:38:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7c108137155ccbd3639fca667395888d8b9adea",
          "body": "…vxhu7",
          "is_bot": false,
          "headline": "Merge pull request #9 from yeferson59/claude/package-coverage-tests-f…",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-09T23:31:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "209e5304f00e37be2b235efaf58427f65852a90a",
          "body": null,
          "is_bot": false,
          "headline": "test(money): fix unused-parameter lint in binaryDivU128 test closure",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T23:28:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b8d792696e3dc4227ff0189bb8f114ddd629f9b",
          "body": "…tests\n\nAdd tests for previously untested paths across the money package: the\nu256 256-bit intermediate type (0% -> 100%), u128 edge branches\n(Cmp64, Mul, setBit, binaryDivU128 overflow), the Decimal and Money\nwrapper types (constructors, arithmetic, comparisons, JSON, database\nScan/Value), decimal1\n[…]\n API can't actually violate (e.g.\ndecFromInt64 always called with a compile-time-constant scale of 0, or\ncurrency precision lookups that share their validity check with an\nalready-validated ISO code).",
          "is_bot": false,
          "headline": "test(money): raise coverage from 66.6% to 98.4% with deep, realistic …",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T23:26:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d77a00bdb0b30e1486daa1233f4ac757ce5bce0f",
          "body": "…mg9ul",
          "is_bot": false,
          "headline": "Merge pull request #8 from yeferson59/claude/money-package-features-b…",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-09T23:04:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b391faa191a46edf98cdc153da4ea511b795025f",
          "body": "Adds Ln, Log10, Log2, and Log(base) to Decimal (plus Must* variants),\nmirroring Pow: decimal128 has no native logarithm, so each computes via\nmath.Log/Log10/Log2 on the float64 view and converts the result back to\na Decimal, returning an error for undefined inputs (zero/negative\narguments, or a base\n[…]\ne float64 arithmetic path (InexactFloat64 round-trips a\nDecimal back to the identical bit pattern), so results don't change.\nVerified by the full test suite passing without any expected-value\nchanges.",
          "is_bot": false,
          "headline": "feat(money): add Decimal logarithms and refactor math.Log call sites",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T23:02:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ba3fae609e0a7c7ba8b27164d71757f488ab45c",
          "body": "Replaces every InexactFloat64 -> math.Pow -> MustFromFloat64 round trip\nacross compositeinterest and annuities with the new Decimal.MustPow,\ndropping the now-unused \"math\" import from each of these files.\n\nBehavior is unchanged: MustPow performs the exact same float64 Pow\nunder the hood, and every c\n[…]\n Decimal keeps doing that arithmetic in float64 via\nInexactFloat64() first, so outputs are bit-for-bit identical to before\n(verified by the full test suite passing without any expected-value\nchanges).",
          "is_bot": false,
          "headline": "refactor(finance): use money.Decimal.Pow instead of raw math.Pow",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:57:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cc977655fef2ff80164b8f31c0a5b08879a64efd",
          "body": "decimal128 has no native power operation, so Pow converts both operands\nto float64, computes math.Pow, and converts the result back to a\nDecimal (returning an error if the result is undefined, e.g. a negative\nbase with a fractional exponent). MustPow panics on error.\n\nThis mirrors the InexactFloat64 -> math.Pow -> MustFromFloat64 pattern\nalready scattered across the compositeinterest and annuities packages,\nnow available as a single reusable method.",
          "is_bot": false,
          "headline": "feat(money): add Decimal.Pow for exponentiation",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:50:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2692a317a022ba9444e60cce6635c6a392ba8d3e",
          "body": "BuildSchedule previously swallowed nper parsing errors as a silent nil\nreturn, could panic on a negative period count, mixed currencies without\nvalidation, and tagged the period-0 row (and the running interest sum) as\nUSD regardless of the loan's actual currency. It now validates that pv\nand payment\n[…]\ndates the BuildSchedule call sites (examples, benchmarks) for the new\n(rows, error) signature and adds dedicated tests for amortization,\ncurrency-mismatch/invalid-period validation, and CSV precision.",
          "is_bot": false,
          "headline": "fix(annuities): harden BuildSchedule/WriteCSV for amortization tables",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:45:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "64af73259b06e809ad99fb8098dba1a6ac3b66b5",
          "body": "golangci-lint's revive linter flags redefinition of the min/max\nbuilt-ins; rename the local variables to gotMin/gotMax.",
          "is_bot": false,
          "headline": "fix(money): avoid shadowing min/max builtins in TestMinMax",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:40:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3d6f0ea437f5c332c66b5d98237417aeab56753",
          "body": "Adds Money.Convert/MustConvert (Decimal rate) and ConvertFloat64/\nMustConvertFloat64 (float64 rate) to change a Money's currency by an\nexchange rate, rounding to the target currency's standard precision.",
          "is_bot": false,
          "headline": "feat(money): add Convert for currency exchange",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:38:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "765b00a16e8190bcc7d3d5748c9a928455d058f3",
          "body": "Adds Money.Allocate/AllocateEvenly for splitting an amount proportionally\nwithout losing or inventing cents (Fowler's algorithm), MulInt64/DivInt64\nfor scaling by a plain quantity, Min/Max/IsPositive/IsNegative helpers,\nand Currency.Symbol/Money.Format for symbol-based display (e.g. \"$10.00\").",
          "is_bot": false,
          "headline": "feat(money): add allocation, scalar ops, min/max, and currency symbols",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:33:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d226d0bf19d8739214ec0e183c78a24186e29e54",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #7 from yeferson59/claude/money-lint-fixes-a8k2p1",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-09T22:28:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc2e5be779956ebb5639e6f301ab87489b4d55e7",
          "body": "- Remove subUnsafe, an unused u128 helper left over from an earlier\n  binary-division draft (unused).\n- Drop a stale //nolint:gosec directive that gosec no longer flags\n  (nolintlint).\n- Rename local `max` variables in u128_test.go so they don't shadow the\n  max builtin (revive: redefines-builtin-id).\n\nVerified against the CI golangci-lint run's exact error list.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Cj778HqcqPk9yNvgdG54qC",
          "is_bot": false,
          "headline": "fix(money): resolve golangci-lint findings from decimal128 engine",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:25:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "097e94ac72f68780cc39959d8b12139b4cf968b0",
          "body": "…of2f",
          "is_bot": false,
          "headline": "Merge pull request #6 from yeferson59/claude/money-package-decimal-rv…",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-09T22:13:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6e72c7318df8e5b85aeaaaba1e63b959e19f7e18",
          "body": "Decimal and Money used to be thin wrappers around github.com/quagmt/udecimal.\nThey now run on a self-contained, allocation-free fixed-point engine backed\nby a 128-bit unsigned coefficient (u128/u256 with math/bits primitives, no\nbig.Int on the hot path), dropping the external dependency entirely.\n\n-\n[…]\nite\ninterest) pass unchanged, confirming numeric behavior is preserved.\n\nCo-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Cj778HqcqPk9yNvgdG54qC",
          "is_bot": false,
          "headline": "feat(money): replace udecimal wrapper with a native decimal128 engine",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-09T22:10:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "edd3ea6698bff8d2cd9ac56529a5b695453e268f",
          "body": null,
          "is_bot": false,
          "headline": "chore: update go version and format code",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-07-05T18:08:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "863cbfa5c1141f64e60ae78248ef11c55caab4d3",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #5 from yeferson59/claude/project-test-fixes-dbim9b",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-04T00:49:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7726e4689e7783ce3b8dcd7dcb47cc03d5a26200",
          "body": "Many tests passed without verifying actual behavior, hiding the true\nstate of the library:\n\n- Periods() and Interest() tests were tautological: they configured the\n  answer as an input (non-zero period/rate) and asserted the same value\n  back, since those methods return the stored value when present\n[…]\nevery library result matched, so no production\ncode changes were needed.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01K45MZGG44td8Q7ciAbC9mL",
          "is_bot": false,
          "headline": "test: strengthen assertions so tests verify real calculated values",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T00:46:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ae2f7fb7ddccb63964fd6bf8a328a8e819233e54",
          "body": "…44lo",
          "is_bot": false,
          "headline": "Merge pull request #4 from yeferson59/claude/library-consistencies-6x…",
          "author_name": "Yeferson Toloza",
          "author_login": "yeferson59",
          "committed_at": "2026-07-04T00:21:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eff03c09d00d610fcdb0296bdd6ef8bb7df4a923",
          "body": "- simpleinterest: Periods() and PeriodsWithPresentAndFuture() now\n  return money.Decimal instead of money.Money, matching\n  compositeinterest.Periods() and GetPeriods() (breaking change)\n- compositeinterest: add fluent NewRateConversion() builder that\n  converts a rate between periodic, nominal, eff\n[…]\n consistency fixes and these changes in the\n  changelog under Unreleased\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018ZfoadEEgpFaHbryev7kTZ",
          "is_bot": false,
          "headline": "feat: rate conversion builder, Decimal periods, manual release workflow",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T00:18:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e0200e6dc81dbd6dcad5f5af051c9960e468aecf",
          "body": "- money: fix MMK/MNT ISO code typos so codes round-trip correctly\n- money: cover all currencies in precision lookup (ISO 4217 minor\n  units, default 2) instead of only USD/COP, and correct the error\n  message in GetCurrencyPrecisionCode\n- money: define MoneyZero/MoneyOne with the USD constant instea\n[…]\npos and stale doc references\n- add regression tests for all of the above\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_018ZfoadEEgpFaHbryev7kTZ",
          "is_bot": false,
          "headline": "fix: resolve API and data inconsistencies across library packages",
          "author_name": "Claude",
          "author_login": "claude",
          "committed_at": "2026-07-04T00:07:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "852cbf61a7d187c55efcc282509ef26ff69648e0",
          "body": null,
          "is_bot": false,
          "headline": "chore: update dependencies to latest versions",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-06-24T01:03:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c34a826c26d318c1528e8066cd90b77b5220b13",
          "body": null,
          "is_bot": false,
          "headline": "fix: handle numeric decimal JSON and ISO currency codes",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-05-30T04:37:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa0daee96eed09921095f2cbfdfe43e06fb2c080",
          "body": null,
          "is_bot": false,
          "headline": "fix: use ISO currency in JSON and default to 143",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-05-17T19:47:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5e897c9c7faa1ed3125ef13df332f3c5ffa50b92",
          "body": "Update BuildSchedule calls in benchmarks and examples to use money.Decimal for\nrate and nper parameters instead of money.Money and int.",
          "is_bot": false,
          "headline": "refactor: update benchmarks and examples to use new money.Decimal types",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T22:12:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41d1823dcc1df8f3115e0e2dd0b86ee682d286d2",
          "body": null,
          "is_bot": false,
          "headline": "chore(deps): add go-echarts dependency for future charting features",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T22:12:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c063cc3d612391a495b022a530c75dd498021a66",
          "body": "Change rate and nper parameters from money.Money/int to money.Decimal for type\nconsistency. Use Decimal.Int64() for iteration bounds validation.",
          "is_bot": false,
          "headline": "refactor(annuities): update BuildSchedule to use money.Decimal",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T22:12:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "502b2623141d68b50bcfd9c9140cb4a0433424f2",
          "body": "Add Rate method to retrieve rate, periods, and interest from compositeInterest.\nFix Future method to use compositeInterest.Future() directly when available,\nfalling back to manual calculation only when needed.",
          "is_bot": false,
          "headline": "feat(annuities): add Rate method and improve Future calculation",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T22:12:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef018336dd7711ca693f5dc9be14ffb289d6babe",
          "body": "Add EffectiveAnnualRate method to set effective annual interest rate with automatic\nconversion to periodic rate based on compounding frequency. Also change Build,\nMustBuild, and Payment methods from pointer to value receivers for better API ergonomics.",
          "is_bot": false,
          "headline": "feat(annuities): add EffectiveAnnualRate method to AnnuityConfig builder",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T22:12:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "097bdef3722f7d7156edac82761581c60fd8f162",
          "body": null,
          "is_bot": false,
          "headline": "fix: remove obsolete anticipated rate comment",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T21:30:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f090c0b2544541b8ceebbf53d9b11624d2d11650",
          "body": "Document all methods in compositeinterest package:\n- Future(), Present(), Interest(), Periods() with formulas and examples\n- Rate conversion methods: RatePeriodic(), RateNominal(), RateEffectyAnnually()\n- Cross-frequency conversions: RatePeriodicToPeriodic(), RateNominalToNominal()\n- Anticipated rat\n[…]\neNominal(), RateAnticipatePeriodic()\n- Conversion helpers: ToAnticipateNominal(), ToAnticipatePeriodic(), ToNominal(), ToPeriodic()\n- Utility methods: getCompoundingFrequencytoMonths(), getOrderTime()",
          "is_bot": false,
          "headline": "docs: add comprehensive documentation to compositeinterest methods",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T17:08:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4c724bf4881c719b421a38047f92544020de0eff",
          "body": null,
          "is_bot": false,
          "headline": "fix: use value receivers for builder methods",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T17:04:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bce9e3487399745e83feb162c486c44339d12ea5",
          "body": "Change constructors to return struct values and switch builder methods\nto value receivers to enable immutable, chainable builders",
          "is_bot": false,
          "headline": "fix: use value receivers for builder APIs",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T16:54:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "93e68e4fddef9a67464385896151393b6c57c8a6",
          "body": "Add detailed English documentation to all builder methods explaining:\n- Method purpose and behavior\n- Parameters with types and examples\n- Return values and error conditions\n- Usage examples for each method\n- Type-level documentation for config structs",
          "is_bot": false,
          "headline": "docs: add comprehensive documentation to builder APIs",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T16:37:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32bfa2dc61f5523e1780edcad810e1902a2119dd",
          "body": "- CompositeInterest builder with chainable methods\n- Annuity builder with AnnualRate convenience\n- SimpleInterest builder with AnnualRate convenience\n- Add examples demonstrating new API",
          "is_bot": false,
          "headline": "feat: add fluent builder API for simpler struct creation",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T16:31:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ff94b96fbd129f92ba9fa4707860b276482d85b",
          "body": null,
          "is_bot": false,
          "headline": "perf: add comprehensive annuity benchmarks and optimize WriteCSV",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T16:15:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e0580897a8921b6c6586153decee644318006a5",
          "body": null,
          "is_bot": false,
          "headline": "fix: improve release notes script and workflow",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T15:45:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc306d700c3049ac551981e9fe7df8eb0838a36c",
          "body": "Switch softprops/action-gh-release to v2. Add scripts/release_notes.sh\nto\ngenerate release notes from commits. Encode the note body into\nGITHUB_OUTPUT and pass it to the\nrelease action.",
          "is_bot": false,
          "headline": "feat: add automated release notes to workflow",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T15:41:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6c9d44e260cd2775dd357cda70b473dc7a970533",
          "body": "Update actions/checkout from v4 to v6 and actions/setup-go from v4 to\nv6. Set Go version to 1.26.1 (was 1.25).",
          "is_bot": false,
          "headline": "chore: bump GitHub Actions versions and Go",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T15:35:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a7da5a4586db0087dc46063a3468b37e69bfdf1",
          "body": null,
          "is_bot": false,
          "headline": "dix: use 'd' receiver and relocate Div64",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T15:28:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e035e42d1fc80704ba82fda52168d546471e3be8",
          "body": "Replace direct udecimal usage with money.Decimal and Money types.\nAdd Decimal wrapper implementation and update finance/simpleinterest/\ncompositeinterest/annuities packages and tests to use ToDecimal/ToMoney.\nRemove direct udecimal imports. Note: some function signatures changed\n(e.g. now returning money.Decimal in places) — update callers\naccordingly.",
          "is_bot": false,
          "headline": "feat: use money.Decimal wrapper across packages",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T04:58:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ebd2ca19f850c64d8308f578ad2ca38f3ae8255",
          "body": null,
          "is_bot": false,
          "headline": "fix: remove obsolete main.go.bak",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T03:49:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6291c2eab703ab9d12ec37d4bc1e792f23ea158e",
          "body": null,
          "is_bot": false,
          "headline": "fix: make BuildSchedule and WriteCSV package functions",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T03:48:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aef7bfce3c5ec678b8c4e5d7028d4123fce67e33",
          "body": "Initialize balance from pv and compute interest from remaining balance.\nMake WriteCSV a method on Annuity.",
          "is_bot": false,
          "headline": "fix: use remaining balance for interest and CSV headers",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T03:44:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a68364b78fb16655bc6bbe9b05880d790b613f3",
          "body": "Remove the outer balance variable and use pv for the initial row\nbalance. Compute interest and the next balance from pv inside the loop,\navoiding incorrect reuse/shadowing of balance.",
          "is_bot": false,
          "headline": "fix: BuildSchedule balance handling",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T03:13:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d43fa1676030fa13be625820331967cd797d06de",
          "body": "Change WriteCSV signature to (filenamePath string, headers []string,\nrows []Schedule)\nand use the provided headers when writing the CSV. Call sites must be\nupdated\nto pass headers. Consolidate variable initialization in BuildSchedule.",
          "is_bot": false,
          "headline": "fix: unify variable init and add CSV headers param",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T02:59:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f0d6112bbacf36fb712ef7cb8850e68e399ee26",
          "body": "Add Schedule type and implement BuildSchedule(pv, rate, payment,\nnper) to generate amortization rows. Add WriteCSV to export the\nschedule to CSV with headers (Periodo, Saldo, Pago, Interes, Suma\nde intereses, Capital).",
          "is_bot": false,
          "headline": "feat: implement annuity payment schedule and CSV export",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-21T02:27:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6d9942622ca90cac6d5703e0dd7b671708c2566",
          "body": null,
          "is_bot": false,
          "headline": "fix: use Decimal types directly instead of .Decimal",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-15T19:50:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8efd1036e4d27945b85056b60ccd63876eac8a80",
          "body": "Replace float64 with money.Money and udecimal.Decimal across\ncompositeinterest and annuities packages. Update tests to create\nMoney values and adapt assertions to use Decimal.InexactFloat64 or\nMoney comparisons. Add amortizacion.csv and main.go.bak amortization CSV\ngenerator",
          "is_bot": false,
          "headline": "feat: use money/decimal types in finance packages",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-15T19:46:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ce4f6fd48dc8cfc35afeb62702c47c258584ef3",
          "body": null,
          "is_bot": false,
          "headline": "feat: add bench target to Makefile",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-14T18:28:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e4fc4b38c7c0e4f4a300da9b219ff8bc1b10da6",
          "body": "Update actions/checkout and actions/setup-go from v4 to v6",
          "is_bot": false,
          "headline": "chore: bump GitHub Actions checkout and setup-go",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-14T18:13:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "833ca23aae68853e14f2c97445691528f49978ad",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump Go to 1.26.1 and udecimal to v1.10.0",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-03-14T18:09:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da61f97df9bcd80ee81acf5198f25013b35b421e",
          "body": null,
          "is_bot": false,
          "headline": "fix: apply Money struct wrapper of decimal",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-02-05T01:02:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "230c33039b14e771b668358320b9037633601869",
          "body": null,
          "is_bot": false,
          "headline": "chore: add command for update dependencies",
          "author_name": "yeferson59",
          "author_login": "yeferson59",
          "committed_at": "2026-02-01T01:53:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 12,
      "commits_last_year": 189,
      "latest_release_at": "2026-07-18T21:24:40Z",
      "latest_release_tag": "v2.0.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 14,
      "days_since_latest_release": 8,
      "mean_days_between_releases": 13.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/yeferson59/gofinance/v2",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/yeferson59/gofinance/v2",
          "is_deprecated": false,
          "latest_version": "v2.0.0",
          "repository_url": "https://github.com/yeferson59/gofinance",
          "versions_count": 1,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T21:21:17Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 8
        },
        {
          "name": "github.com/yeferson59/gofinance",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/yeferson59/gofinance",
          "is_deprecated": false,
          "latest_version": "v1.4.2",
          "repository_url": "https://github.com/yeferson59/gofinance",
          "versions_count": 13,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-11T01:08:01Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 16
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "charts/go.mod",
        "examples/go.mod",
        "go.mod"
      ],
      "largest_source_bytes": 20828,
      "source_files_sampled": 131,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "charts/go.mod",
        "examples/go.mod",
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/go-echarts/go-echarts/v2",
          "manifest": "charts/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.7.2"
        },
        {
          "name": "github.com/yeferson59/gofinance/v2",
          "manifest": "charts/go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.0"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 13,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "yeferson59",
          "commits": 145,
          "avatar_url": "https://avatars.githubusercontent.com/u/116679774?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 32,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.819
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "manual-release.yml",
        "release.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        ".golangci.yaml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 9,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "3 out of 3 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/13 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": "3f453122a59342923b1f5e0e811536abfeeff2db",
        "ran_at": "2026-07-27T07:28:09Z",
        "aggregate_score": 4.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-26T20:49:24Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-20T23:12:42Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/yeferson59/gofinance",
    "host": "github.com",
    "name": "gofinance",
    "owner": "yeferson59"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 41,
        "vitality": 84,
        "community": 24,
        "governance": 56,
        "engineering": 70
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 84,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "commits_last_year": 189,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 14
            },
            "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": "14/52 weeks with commits",
                "points": 9.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 14
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "189 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 189
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 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": 12,
              "latest_release_tag": "v2.0.0",
              "releases_from_tags": false,
              "days_since_latest_release": 8,
              "mean_days_between_releases": 13.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "12 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "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 ~13.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 13.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": 1,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 1 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 1
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 19,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.819
            },
            "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 82% of commits",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 82
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 13,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "13/13 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 13,
                      "decided": 13
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/13 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": 11,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "yeferson59",
              "public_repos": 69,
              "account_age_days": 1370
            },
            "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": "11 followers of yeferson59",
                "points": 7.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 11,
                      "login": "yeferson59"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "69 public repos, account ~3 yr old",
                "points": 20.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 69
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/yeferson59/gofinance/v2",
                "github.com/yeferson59/gofinance"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 8
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 8 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 8
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "13 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 70,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".golangci.yaml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yaml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "3 out of 3 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 41,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 41,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "3 out of 3 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/13 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "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
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 66,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.22,
              "toolchain_manifests": [
                "charts/go.mod",
                "examples/go.mod",
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": ".golangci.yaml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yaml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "22 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 22,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 20828,
              "source_files_sampled": 131,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/131 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 131,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T07:28:27.737481Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/y/yeferson59/gofinance.svg",
  "full_name": "yeferson59/gofinance",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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