原始 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"
}