公开记录
软件健康报告模式 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年12月在 GitHub 上查看 ↗

yeferson59/gofinance 的健康指数为 100 分中的 57 分,处于「中等」区间。 其得分最高的类别是Vitality(84/100),最低的是Community & Adoption(24/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

57
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

57
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

Yeferson Toloza个人账户
11 关注者69 个公开仓库始于 2022年10月

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/yeferson59/gofinance/v2v2.0.0-18 天前
Gogithub.com/yeferson59/gofinancev1.4.2-1316 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

84良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
9.7/36提交节奏 — 52 周中有 14 周有提交
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

发布纪律

100优秀
评分方式
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

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
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议题解决 — 没有议题或无数据
38.2/38.3PR 接受 — 已裁定的 PR 中 13/13 已合并
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
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
7.8/25所有者影响力 — yeferson59 有 11 位关注者
20.5/25既往记录 — 69 个公开仓库,账户约 3 年
所用输入
followers11
owner_typeUser
is_verified
owner_loginyeferson59
public_repos69
account_age_days1,370
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 2 个软件包
35/35发布时效 — 最近一次发布于 8 天前
20/20版本历史 — 13 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/yeferson59/gofinance/v2, github.com/yeferson59/gofinance
ecosystemsgo
any_deprecated
min_days_since_publish8

工程质量

基础的工程与文档实践是否到位?

70良好 · 占总体的 20%

工程实践

84良好
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
16/16Linter 配置 — .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。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

66中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 99 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.99
agent_instruction_files
agent_instruction_max_bytes
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yaml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 22 次由代理编写或署名代理
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可控的文件大小 — 采样的 131 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes20,828
source_files_sampled131
oversized_source_files0

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

0GitHub 星标
2贡献者
189最近 12 个月提交数
0距最近推送天数
12发布版本数
1巴士系数(bus factor)
0开放议题
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.