Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [
"audio",
"audio-processing",
"dsp",
"fir-filter",
"golang",
"resampling",
"sample-rate-conversion",
"simd",
"soxr"
],
"is_fork": false,
"size_kb": 2735,
"has_wiki": true,
"homepage": null,
"languages": {
"C": 49436,
"Go": 872582,
"Shell": 2876,
"Python": 3877,
"Makefile": 2132
},
"pushed_at": "2026-07-20T07:10:41Z",
"created_at": "2025-11-24T15:41:26Z",
"owner_type": "User",
"updated_at": "2026-07-20T07:10:52Z",
"description": "High-quality audio resampling library for Go, based on libsoxr. Polyphase FIR filtering with Kaiser window design, SIMD acceleration, and professional-grade quality.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "LGPL-2.1",
"default_branch": "master",
"license_spdx_raw": "LGPL-2.1",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": "Tomi P. Hakala",
"type": "User",
"login": "tphakala",
"company": null,
"location": "Muurame, Finland",
"followers": 77,
"avatar_url": "https://avatars.githubusercontent.com/u/7030001?v=4",
"created_at": "2014-03-22T09:31:18Z",
"is_verified": null,
"public_repos": 63,
"account_age_days": 4504
},
"license": {
"state": "standard",
"spdx_id": "LGPL-2.1",
"raw_spdx": "LGPL-2.1",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2026-07-17T18:05:56Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2026-05-29T20:32:10Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2026-05-04T07:51:37Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2026-03-15T09:35:22Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2026-03-15T09:09:59Z"
},
{
"tag": "v1.0.1",
"kind": "patch",
"published_at": "2026-03-15T09:09:55Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2026-03-15T09:09:42Z"
}
],
"recent_commits": [
{
"oid": "710675e6d3c96e572389134d2a6fe3bf5ceb6610",
"body": "…(#58)\n\nBumps the go-non-major group with 1 update: [github.com/tphakala/simd](https://github.com/tphakala/simd).\n\n\nUpdates `github.com/tphakala/simd` from 1.3.0 to 1.6.0\n- [Release notes](https://github.com/tphakala/simd/releases)\n- [Commits](https://github.com/tphakala/simd/compare/v1.3.0...v1.6.0\n[…]\nersion-update:semver-minor\n dependency-group: go-non-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump github.com/tphakala/simd in the go-non-major group …",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-20T07:10:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "55aa35fe7195d4e82d7927b6f604d74feb19ebcd",
"body": null,
"is_bot": false,
"headline": "docs: prepare CHANGELOG for v1.5.0 release",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-17T18:05:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fbae6024bb951ed3901678eece28f35e58c84db4",
"body": "… table\n\nThe float32 precision row predated the #51 engine fixes and was 0.5 dB\npessimistic (measured -145.50 dB today vs the documented -145.01). The\nquality validation section only covered the exact-rational 44.1kHz to\n48kHz case; add the measured THD table for ratios that engage the\nsub-phase interpolation banks, guarded by\nTestQualityRegression_THD_ActiveInterpolation.",
"is_bot": false,
"headline": "docs: refresh float32 THD figure and add active-interpolation quality…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-17T18:04:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "54dfd11abdcaca892bf29783c930a1a946c7c4ca",
"body": "…ad code retirement (#57)\n\n* refactor(engine): extract shared cubic interp bank builder\n\nThe phase-wrap measurement test previously re-derived the Catmull-Rom\nbank construction to build its differential reference, so a formula\nchange would have required lockstep edits. NewPolyphaseStage and the\ntest\n[…]\n1 alongside PR #56\n\nCodeRabbit review: the CHANGELOG attributes the defect to #51, so the\nactive-interpolation THD comment now names both the reporting issue and\nthe fixing PR instead of the PR alone.",
"is_bot": false,
"headline": "fix: accurate GetLatency startup deficit, polyphase hardening, and de…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-17T17:58:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "823e02cff007e8a6a4aa0700561b56f597592832",
"body": "… defects (#56)\n\n* test: pin chunked streaming equivalence with one-shot processing\n\n* fix: cap polyphase history consumption at available input positions\n\nAt severe non-integer downsampling ratios the fixed-point accumulator\novershoots the per-call limit by up to one step, making consumed exceed\nth\n[…]\n(assigning to an already-escaped var\ninside the closure does not allocate) and require.NoError after AllocsPerRun\nreturns, across all five sites (two warm helpers plus the three inline\nsibling tests).",
"is_bot": false,
"headline": "fix: streaming contract, flush lifecycle, and polyphase interpolation…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-17T13:24:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c1f9143cd07294fcf439dd4780cb497ccdad3ed8",
"body": "---\nupdated-dependencies:\n- dependency-name: github/codeql-action/init\n dependency-version: 4.37.0\n dependency-type: direct:production\n update-type: version-update:semver-minor\n dependency-group: github-actions\n- dependency-name: github/codeql-action/autobuild\n dependency-version: 4.37.0\n depe\n[…]\nsion-update:semver-minor\n dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump the github-actions group with 5 updates (#50)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-13T07:11:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d3a770876f29c6460a0bacc8a0ec5e31f5bacb35",
"body": "Bumps the github-actions group with 6 updates:\n\n| Package | From | To |\n| --- | --- | --- |\n| [marocchino/sticky-pull-request-comment](https://github.com/marocchino/sticky-pull-request-comment) | `3.0.4` | `3.0.5` |\n| [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) \n[…]\nsion-update:semver-patch\n dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump the github-actions group with 6 updates (#49)",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-07-06T07:09:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1af7ac2dfea1947a407ebb1d84d293965d0466fc",
"body": "… updates (#48)\n\nBumps the github-actions group with 11 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [actions/checkout](https://github.com/actions/checkout) | `6.0.2` | `7.0.0` |\n| [actions/setup-go](https://github.com/actions/setup-go) | `6.4.0` | `6.5.0` |\n| [marocchi\n[…]\nsion-update:semver-minor\n dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump the github-actions group across 1 directory with 11…",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-29T07:31:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "38eb0ad828d16f6ce42d0ad99b8aabe632b1c097",
"body": "…(#47)\n\nBumps the go-non-major group with 1 update: [github.com/tphakala/simd](https://github.com/tphakala/simd).\n\n\nUpdates `github.com/tphakala/simd` from 1.1.0 to 1.3.0\n- [Release notes](https://github.com/tphakala/simd/releases)\n- [Commits](https://github.com/tphakala/simd/compare/v1.1.0...v1.3.0\n[…]\nersion-update:semver-minor\n dependency-group: go-non-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump github.com/tphakala/simd in the go-non-major group …",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-06-29T07:31:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d50ebcec88347ec877862e48ae00eeb17ecf8063",
"body": "…k workflow\n\nREADME:\n- Centered header with tagline and badges grouped into status, CI/quality, and community rows\n- Add release, license, Go version, pure-Go, platforms, GitHub Sponsors, and PRs-welcome badges\n- Add a table of contents and a Sponsor section\n\nCI:\n- Add dedicated .github/workflows/go\n[…]\ncatches CVEs disclosed after the last commit\n- Remove the now-redundant vulncheck job from ci.yml to avoid running govulncheck twice per PR\n- Add .github/FUNDING.yml so GitHub shows the Sponsor button",
"is_bot": false,
"headline": "docs: polish README badges, add sponsorship; add scheduled govulnchec…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-09T10:44:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "440f901e3fed50cf5e5b4604d5c52c04b379e491",
"body": "… and harden WAV writer (#45)\n\n* test(engine): check discarded errors in regression tests\n\nThe regression tests discarded the error returns from NewResampler,\nProcess, and Flush. If any of those failed, the test would continue\nwith empty output: count would be 0 and dcGain NaN, and the NaN\ntolerance\n[…]\nent (channels * bytesPerSample)\nexceeds 65535 would silently overflow when cast to uint16 and corrupt the\nheader. Reject it up front, alongside the existing sample-rate, channel,\nand bit-depth checks.",
"is_bot": false,
"headline": "Increase test coverage; fix multi-channel resample-wav frame counting…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-30T09:55:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f88c21474796042105fcd4472929a8df24022ce6",
"body": "Add SPDX-FileCopyrightText and SPDX-License-Identifier headers to all 99\nGo source files so the per-file copyright and license grant are explicit\nand machine-readable. The grant is LGPL-2.1-or-later, matching the\noriginal LICENSE notice (\"version 2.1 ... or any later version\").\n\nHeaders sit above ex\n[…]\n tags and doc comments keep their\nsemantics.\n\nNo functional changes: go build and go vet pass, gofmt reports no new\nfindings, and the ruleguard build tag still excludes rules/* from the\ndefault build.",
"is_bot": false,
"headline": "chore: add SPDX license headers to all Go source files (#42)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-30T08:29:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "88fdaa956af22dcf8ac2a4d4ce0327769974c882",
"body": "…ction\n\nGitHub's license detector (the licensee gem) classifies a repo by\nmatching the full canonical license body at >=98% confidence. The\nprevious LICENSE held only a short notice, so the GitHub API returned\nNOASSERTION / \"Other\" instead of recognizing the license.\n\nReplace it with the verbatim LG\n[…]\nzation\nit matches that reference byte-for-byte. GitHub will now report\n\"GNU Lesser General Public License v2.1\". This also makes the README's\n\"see the LICENSE file for the full license text\" accurate.",
"is_bot": false,
"headline": "docs: replace LICENSE summary with full LGPL-2.1 text for GitHub dete…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-30T08:12:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2c98eacde4112b37321f2d785a250c7c29999268",
"body": "Both presets are 16-bit; the THD ordering comes from passband geometry\n(Low rolls off at 0.80 Nyquist, Medium at 0.90 with a sharper transition),\nnot precision. libsoxr's LQ/MQ recipes show the same ordering.",
"is_bot": false,
"headline": "docs: explain why Low shows better THD than Medium",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T20:49:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5194776e1d4fea8270d57244b4b3b0ce38822f77",
"body": "The SNR comparison was dropped when the THD findings were rewritten. The\nlibsoxr reference figures are captured from actual soxr, so the SNR claim\nis valid; restore it.",
"is_bot": false,
"headline": "docs: restore SNR-vs-libsoxr key finding",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T20:46:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "15d1bc0cf9716c300e6b036dd32ea54a1e060ad1",
"body": "The Quality Validation table was generated at v1.0.0 and never updated.\nThe Low/Medium/High 44.1kHz -> 48kHz THD figures shifted in v1.0.1 (commit\n8788f0a, PR #4 \"Fix passband ripple and buffer integrity issues\"), which\nrecalculated the intermediate rate (Fs1). VeryHigh was unchanged, and the\nfigure\n[…]\ner than libsoxr by 0.4 dB)\n- VeryHigh: unchanged at -162.19 dB\n\nAlso refresh the float32/float64 precision table (-144.95/-144.96 ->\n-145.25/-145.01) and note the figures are reproducible via go test.",
"is_bot": false,
"headline": "docs: refresh quality validation table with current THD measurements",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T20:44:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "beafcd174261e8e76251a2a07aa7db962edf65bc",
"body": "Document the APIs and changes merged since v1.3.0:\n- float32 zero-allocation streaming: ProcessInto/EstimateOutput on the\n float32 engine and ProcessFloat32Into on the New path (#31)\n- FlushMulti / MultiFlusher for multi-channel pipeline draining (#41)\n\nAlso correct stale README facts found during \n[…]\n runtime dependency\n- Go requirement is 1.26 (matches go.mod), not 1.25\n- Precision Modes example used the internal engine package; switch it to\n the public NewEngine / NewEngineFloat32 constructors",
"is_bot": false,
"headline": "docs: add CHANGELOG and refresh README for v1.4.0",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T20:31:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "42d502c69f8864d47eb7494f7d8d2ccb94061569",
"body": "* feat: add FlushMulti for multi-channel pipeline draining (#39)\n\nFlush() only drains channel 0, silently dropping the delay-line tails of\nchannels 1..N-1 after ProcessMulti. Add FlushMulti() ([][]float64, error)\nto the Resampler interface that flushes every channel independently using\nthe same per-\n[…]\nacement for MultiFlusher interface\n\nThe MultiFlusher doc comment was merged with the infoProvider doc,\ncausing golangci-lint godoclint to fail.\n\n* fix: deduplicate doc comments on Flush and FlushMulti",
"is_bot": false,
"headline": "feat: add FlushMulti for multi-channel pipeline draining (#41)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T20:21:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f06d673edb72b2d0d328529eda9a1eec8121c416",
"body": "…over-padding (#37, #30) (#40)\n\n* fix: flush inter-stage tail in multi-stage pipelines, drop polyphase over-padding (#37, #30)\n\nconstantRateResampler.Flush() flushed each stage into the next stage's input\nbuffer but never ran that buffer back through the next stage, so any pipeline\nwith 2+ stages dr\n[…]\nt silence. The\ncanonical-length bounds already prove the delay line drained without dropping\nreal samples (under-padding shows up as a short total). Keep the non-empty\nguard, drop the value assertion.",
"is_bot": false,
"headline": "fix: flush inter-stage tail in multi-stage pipelines, drop polyphase …",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T19:56:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ee87a4558da2b7c32b4e1a2d4cd24b4ba6341f8b",
"body": "…p dead mutex (#32, #33, #34) (#38)\n\n* perf,fix: reuse one engine for stereo, drain all-available in processChannel, drop dead mutex\n\nThree fixes from the PR #31 review, all on the constant-rate / convenience layer.\n\n- ResampleStereo and ResampleStereoFloat32 built a fresh engine per channel\n via t\n[…]\np ran at\nmost once. Replace the for loop with an if to make the single-pass intent\nexplicit, per Gemini review feedback. Output is unchanged (still verified by\nTestNewPath_ProcessInto_MatchesProcess).",
"is_bot": false,
"headline": "perf,fix: stereo engine reuse, all-available processChannel read, dro…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T18:16:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "78dff32962333bc639e4fdc30175607ee84a6481",
"body": "…m (#36)\n\nThe Benchmark Comparison job wrote pr.bench into the workspace, then ran\nactions/checkout a second time to get the base branch. That second checkout\ncleans the working tree (git clean -ffdx), deleting the untracked pr.bench\nbefore the compare step runs, so benchstat failed with:\n\n bench\n[…]\ny got an empty benchmark comparison.\n\nWrite both pr.bench and base.bench to $RUNNER_TEMP, which lives outside the\ncheckout directory and survives the re-checkout, and point benchstat there.\n\nFixes #35",
"is_bot": false,
"headline": "ci: write benchmark results to $RUNNER_TEMP so benchstat can find the…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T18:09:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "664cf7ee64a6ba6da51b4cd59c95bdef6c46dacc",
"body": "* feat: zero-allocation float32 streaming and batch APIs\n\nAdd float32 mirrors of the float64 caller-owned-output APIs so float32\naudio can be resampled without per-call allocations:\n\n- SimpleResamplerFloat32.ProcessInto + EstimateOutput (engine path,\n float32-native zero-copy via engine.ProcessZero\n[…]\nwithout bound for the resampler's lifetime. Produced output is\nalways <= EstimateOutput, so this never trips the underestimate guard.\nReuses the computed required value for the buffer-too-small check.",
"is_bot": false,
"headline": "feat: zero-allocation float32 streaming and batch APIs (#31)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T16:57:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "81b18eced6e943d670e6e611c870d11195c39cfa",
"body": "…lyphase split (#29)\n\nRemoves dead code (unused consts, FIFOBuffer, RingBuffer.Peek, the orphaned\nFFTConvolver, and the now-unused gonum/c128 deps), stabilizes the warm float64\nProcessInto buffers to 0 allocs/op, drops the four per-sample bounds checks in\nthe PolyphaseStage hot loop, and splits the \n[…]\n polyphase.go into focused\nfiles (resampler.go, polyphase_stage.go, dft_stage.go, filter_params.go). The\nsplit is pure relocation; output is bit-identical.\n\nCloses #23\nCloses #24\nCloses #25\nCloses #27",
"is_bot": false,
"headline": "engine: dead-code cleanup, warm-path zero-alloc, hot-loop BCE, and po…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T16:13:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0e2c53a67145a0c6160e03af0c2d22c8ea15605c",
"body": "…ew (#21)\n\nThree related CI changes:\n\n1. precision tests: route precisionMeasureTHD/SNR through the existing\n Cooley-Tukey fft() helper instead of an O(n^2) hand-rolled DFT that\n called cmplx.Exp n^2 times (8192^2 ~= 67M per call, x4 per iteration).\n TestPrecisionComparison dropped from ~200s \n[…]\n add a\n concurrency group that cancels superseded runs, a job timeout, and\n modest -benchtime/-count for a fast PR signal.\n\n3. remove the Claude Code review GitHub Action (claude-code-review.yml).",
"is_bot": false,
"headline": "ci: speed up benchmark workflow and precision tests, drop Claude revi…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T13:42:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fbddfcad6b695f9583a344c8b0dee4ac4deb6332",
"body": "Upgrades github.com/tphakala/simd v1.0.22 -> v1.1.0 (pulls in\ngolang.org/x/sys v0.42.0 -> v0.45.0).\n\nRelevant changes for this module, which uses the c128, f64, f32 and\ncpu packages:\n\n- c128 Conj/Abs/AbsSq are 2-3.4x faster (used in the FFT-convolve path)\n- ARM64 NEON correctness fixes (FNEG/FRINTN \n[…]\nx: f32/f64 Exp and f32 Sigmoid/Tanh moved from\n AVX to AVX2 gating, with a new FMA-free AVX dispatch tier\n- Min/Max no longer panic on empty slices\n\nBuild, vet and the full test suite pass on v1.1.0.",
"is_bot": false,
"headline": "chore(deps): bump tphakala/simd to v1.1.0 (#20)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-29T13:25:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3edc2668fddb9acf6f5d9a21ee9d048d36ad9d62",
"body": "Add nolint directives for:\n- unparam: processZeroCopy error returns kept for symmetry with Process\n- dupl: Process/ProcessZeroCopy intentional parallel structure\n- staticcheck QF1008: explicit embedded field access for clarity",
"is_bot": false,
"headline": "fix: resolve lint warnings from ProcessZeroCopy merge",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-04T07:48:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "532ac8733d4429c66dd1706530291a0737df475d",
"body": "…updates (#16)\n\nBumps the github-actions group with 8 updates in the / directory:\n\n| Package | From | To |\n| --- | --- | --- |\n| [actions/setup-go](https://github.com/actions/setup-go) | `6.3.0` | `6.4.0` |\n| [marocchino/sticky-pull-request-comment](https://github.com/marocchino/sticky-pull-request-\n[…]\nsion-update:semver-major\n dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
"is_bot": true,
"headline": "chore(deps): bump the github-actions group across 1 directory with 8 …",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-05-04T07:36:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5a8d20806b7ca3a4894549cf4efd6ca29f8cf758",
"body": "* feat: add zero-allocation ProcessInto API\n\nEvery Process call allocates 384KB-5.2MB through defensive copies in the\ninternal stage pipeline. This adds a zero-allocation code path\n(ProcessInto) that eliminates these allocations for callers that\nimmediately consume the output, while preserving the e\n[…]\nn RingBuffer.ReadInto (modernize).\n- Preallocate test slices to avoid repeated growth.\n\n---------\n\nCo-authored-by: Cursor <cursoragent@cursor.com>\nCo-authored-by: Tomi P. Hakala <tomi.hakala@pobox.fi>",
"is_bot": false,
"headline": "feat: add zero-allocation ProcessInto API (#17)",
"author_name": "Anya Sabo",
"author_login": "anyasabo",
"committed_at": "2026-05-04T07:33:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bfa4efd72c34267fef7100a5ec399ddc3e7b70fd",
"body": "- Fix staticcheck QF1012: use fmt.Fprintf instead of\n WriteString(fmt.Sprintf) in halfband_test.go\n- Remove unused constants: hermiteCoeff0_5/1_5/2_5,\n throughputTestSamples, regressionAmplitudeTolerance,\n regressionMinAntiAliasing_*, soxrBitsQuick, soxrLowQualityBW0,\n passbandTolerance, coeffTo\n[…]\nfreqTolerance, filterGainTarget,\n phasePrecisionBits, phasePrecisionMask, prevPhaseLookback,\n testPassbandFreq, testStopbandFreq, stopbandFloorDB\n- Remove unused function measureAntiAliasingInternal",
"is_bot": false,
"headline": "fix: resolve all lint warnings for zero-warning policy",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-03-15T09:30:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f00337f2d091e0907d3bbf5f016dd230f4c4a9bd",
"body": "…eters\n\nAdd Go native fuzz tests for:\n- BesselI0, KaiserBeta, KaiserBetaWithTrBw, EstimateFilterLength (mathutil)\n- DesignLowPassFilter, KaiserWindow (filter)\n- New, ResampleMono (top-level API)\n\nBugs found and fixed by fuzzing:\n- KaiserWindow: NaN coefficients when BesselI0 overflows to +Inf for\n \n[…]\nesignLowPassFilter: add maximum attenuation validation (500 dB) to\n prevent BesselI0 overflow in downstream Kaiser window calculation.\n\nAlso adds CONTRIBUTING.md with development workflow guidelines.",
"is_bot": false,
"headline": "feat: add fuzz tests and fix Kaiser window overflow for extreme param…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-03-15T09:18:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e8faada2996475619e94b177c1d1535969381ac7",
"body": null,
"is_bot": false,
"headline": "security: move write permissions to job level in dependabot-auto-merge",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-03-15T08:54:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "27ccd2bcf75616bd4edd5492692a43e6cc0ce4ea",
"body": "- Pin all GitHub Actions to commit SHAs\n- Add top-level permissions to all workflows (least privilege)\n- Move security-events permission to job level in CodeQL workflow\n- Add SECURITY.md with vulnerability reporting instructions\n- Remove binary artifacts (resample-wav, test-reference/test_quality)\n- Add binaries to .gitignore to prevent re-commit",
"is_bot": false,
"headline": "security: improve OpenSSF Scorecard compliance",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-03-15T08:50:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea3518505302b631890d8350f11d531fb8cb9abb",
"body": "- Benchmark comparison on PRs using benchstat\n- Test coverage reporting via Codecov\n- OpenSSF Scorecard for security health scoring\n- Stale issue/PR cleanup (60 days inactive)\n- Add CI, coverage, and scorecard badges to README",
"is_bot": false,
"headline": "ci: add benchmark, coverage, scorecard, and stale workflows",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-03-15T08:31:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0f07eb77ef34b6d8736bb23dd2e94f2ca665214c",
"body": null,
"is_bot": false,
"headline": "ci: add Dependabot auto-merge for patch and minor updates",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-03-15T08:26:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "070a4b116c93dd9971cdad2cc43d253385938b09",
"body": null,
"is_bot": false,
"headline": "chore: update golang.org/x/sys v0.41.0 -> v0.42.0",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-03-15T08:21:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e65f416aa039cd1dc1cc1b7cfa8cf7370ef96fb1",
"body": "- Align inline comments in test files for readability\n- Reformat SOXR formula comments to code block style\n- Align const declarations\n- No functional changes",
"is_bot": false,
"headline": "style: align inline comments and formatting",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-15T08:26:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a346ebe8a9d449f22adac397869715d0e4de5782",
"body": null,
"is_bot": false,
"headline": "feat: add Claude Code Review workflow for automated PR feedback",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-15T08:24:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "59ad9b8c5dc897f15c363d22fac6986e7b4484c4",
"body": "* fix: use cubic interpolation for QualityQuick to match SOXR\n\nRoot cause: QualityQuick was using polyphase filtering instead of\ncubic interpolation like SOXR_QQ, resulting in poor THD (-88.23 dB\nvs SOXR's -152.72 dB).\n\nChanges:\n- Updated CubicStage to use SOXR's exact cubic formula from cr-core.c:5\n[…]\npensive precision test in short mode\n\nTestPrecisionComparison_Summary was timing out during race detection\ndue to O(N²) DFT calculations. Added testing.Short() check to skip\nthis expensive test in CI.",
"is_bot": false,
"headline": "fix: use cubic interpolation for QualityQuick to match SOXR (#13)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T17:57:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f83d5bfb0698281a49b5e97ccddf301e9e5d53cb",
"body": "- Refactor resampleWAVGeneric from complexity 64 to <50\n- Fix output buffer silent data loss\n- Add -short flag to race detection\n- Handle output.Close() errors properly\n- Add .leann/ to .gitignore",
"is_bot": false,
"headline": "Merge pull request: Reduce cognitive complexity in resampleWAVGeneric",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T17:10:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb125526c04da2b649a9fcebded04477edc5553a",
"body": null,
"is_bot": false,
"headline": "fix: add .leann/ to .gitignore to prevent tracking of LEANN index files",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T17:06:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d5e5b82add01cf50743429ab2007af6f80505fe6",
"body": "Detect when interleaveInto returns 0 (buffer too small) and grow buffer\ndynamically. Prevents silent data loss if resampler produces more samples\nthan estimatedOutputSize.\n\nIssue identified by CodeRabbit - high severity data corruption path.",
"is_bot": false,
"headline": "fix: prevent silent data loss when output buffer is too small",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T16:42:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fa5db61046586468f0bd5dceaaccb5b98b0769ee",
"body": "Race detection was timing out on internal/engine tests after ~9m35s.\nThe race detector adds 5-10x overhead to compute-intensive tests.\nUsing -short flag skips long-running tests during race detection.",
"is_bot": false,
"headline": "fix: add -short flag to race detection to prevent timeout",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T16:32:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "513a6999eae5861ec653961ed8188c6caa140838",
"body": "Address Gemini high-severity feedback - WAV Close() updates headers,\nerrors must not be silently ignored. Use named return to capture close\nerrors when main function succeeds.\n\nNot implementing sync.Once suggestion - current mutex approach preserves\nchannel number in error messages, which is valuable for debugging.",
"is_bot": false,
"headline": "fix: handle output.Close() errors on success path",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T15:50:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "08592a59264b9c9f02e19185a53536f7d0c9a66c",
"body": "- Add disclaimer to REFACTORING_PLAN.md that it's a design document\n- Document goroutine non-cancellation design choice (bounded channels)\n- Add comment that resampledChannels writes are safe (distinct indices)",
"is_bot": false,
"headline": "docs: clarify refactoring plan and goroutine behavior",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T15:40:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e3d4429001a091fc70a51f88d27a8bd69250ce10",
"body": "- Add progress clamping to prevent >100% display\n- Fix resource leak in wavOutputWriter.Close() - always close both writer and file\n- Add comment clarifying parallel error handling drops subsequent errors\n- Fix misleading 'sine wave' comments (data is constant signal)\n- Fix nil format parameter in test (use proper audio.Format)\n- Add markdown language specifier to code fence",
"is_bot": false,
"headline": "fix: address CodeRabbit review feedback",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T15:32:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a62bc4f00447ad7a5517222bd47d49a6f2cece5c",
"body": "…o <50\n\nExtracted monolithic resampleWAVGeneric function into 9 focused, testable\nhelpers to address gocognit linter error.\n\nChanges:\n- Created helpers.go with 9 helper functions and types:\n * openWAVInput() - Input validation and format extraction\n * createChannelResamplers() - Resampler initiali\n[…]\nfixed\n * Removed unused imports\n\nTesting:\n- All existing tests pass\n- 18 new unit tests added\n- Linter passes with 0 issues\n\nFixes: gocognit cognitive complexity error in cmd/resample-wav/main.go:217",
"is_bot": false,
"headline": "refactor: reduce cognitive complexity in resampleWAVGeneric from 64 t…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T15:15:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9ac4c2b85bbcaab7f256de37f72b290c1bbc7b05",
"body": "…ilures (#11)\n\n* fix: correct alias measurement formula and fix test infrastructure failures\n\nFix 3 failing test functions (4 sub-test failures) in quality measurement\ninfrastructure:\n\n- Fix alias target region formula in measureDownsamplingAntiAliasing to\n correctly compute where aliases fold: [ou\n[…]\n suggestion: use math.Abs(ratio-math.Round(ratio)) < 1e-9\ninstead of exact float equality for detecting integer downsampling ratios.\n\n---------\n\nCo-authored-by: Tomi P. Hakala <tomi.p.hakala@elisa.fi>",
"is_bot": false,
"headline": "fix: correct alias measurement formula and fix test infrastructure fa…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T14:44:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cedd339b3cbbc753f8343a6610b5ecf1d304f953",
"body": "…-actions-4a349ddaed\n\nBump the github-actions group with 4 updates",
"is_bot": false,
"headline": "Merge pull request #10 from tphakala/dependabot/github_actions/github…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T12:40:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "46b08f3082436b78003936ba23fc382932e5c3d2",
"body": "Bumps the github-actions group with 4 updates: [actions/checkout](https://github.com/actions/checkout), [actions/setup-go](https://github.com/actions/setup-go), [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) and [github/codeql-action](https://github.com/github/code\n[…]\non\n dependency-version: '4'\n dependency-type: direct:production\n update-type: version-update:semver-major\n dependency-group: github-actions\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
"is_bot": true,
"headline": "Bump the github-actions group with 4 updates",
"author_name": "dependabot[bot]",
"author_login": "dependabot[bot]",
"committed_at": "2026-02-13T12:23:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3abdfc759b1f7a50500b576377b099974f2ac01c",
"body": "- Introduced rules for replacing deprecated functions and patterns:\n - `runtime.SetFinalizer` with `runtime.AddCleanup`\n - `runtime.GOROOT()` with `go env GOROOT`\n - `sort.Ints`, `sort.Strings`, and `sort.Float64s` with `slices.Sort`\n - Manual byte slice cloning with `bytes.Clone`\n - Manual sli\n[…]\nc date/time format strings with named constants in `time`\n- Warned against using `len()` or `cap()` on timer/ticker channels\n- Detected deferred calls to `time.Since` and `time.Now` for correct timing",
"is_bot": false,
"headline": "Add modernization rules for Go 1.20+ to 1.26+",
"author_name": "Tomi P. Hakala",
"author_login": "tomiphakala",
"committed_at": "2026-02-13T12:23:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "137ef38c8912c4eb84bf8e9c601acab5d449c78e",
"body": "ci: add GitHub Actions workflows and Dependabot",
"is_bot": false,
"headline": "Merge pull request #8 from tphakala/ci/add-github-workflows",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T12:22:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f0adc3dc174ca2cf86cf09116b048c93eb13a623",
"body": "Pin golangci-lint to v2.9.0 (released with Go 1.26 support) and\nupgrade to golangci-lint-action@v7 which is required for v2.x.",
"is_bot": false,
"headline": "ci: use golangci-lint v2.9.0 with action v7",
"author_name": "Tomi P. Hakala",
"author_login": "tomiphakala",
"committed_at": "2026-02-13T12:13:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7618fe78de1bee5ce0d021ced6d72e1b7fb1361d",
"body": "Use install-mode: goinstall so golangci-lint is compiled with the\nrunner's Go toolchain instead of using a pre-built binary that may\ntarget an older Go version.\n\nAdd dependency update grouping to reduce Dependabot PR noise.",
"is_bot": false,
"headline": "ci: fix golangci-lint Go version mismatch, add dependabot grouping",
"author_name": "Tomi P. Hakala",
"author_login": "tomiphakala",
"committed_at": "2026-02-13T12:10:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "91b2bee1973ba0b5ae86eeb50aad7ea2c83556bc",
"body": "Add CI pipeline (lint, test across OS, race detection, govulncheck,\nbuild verification), CodeQL security analysis, and Dependabot\nconfiguration for Go module and Actions version updates.",
"is_bot": false,
"headline": "ci: add GitHub Actions workflows and Dependabot",
"author_name": "Tomi P. Hakala",
"author_login": "tomiphakala",
"committed_at": "2026-02-13T11:59:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c7ac043123fa0242699e8d418aa2da777a9d48c",
"body": "fix: modernize Go idioms flagged by golangci-lint",
"is_bot": false,
"headline": "Merge pull request #7 from tphakala/fix/linter-modernize-go-idioms",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-02-13T11:52:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56edb47028e68549be56661047b88c174b05a4d5",
"body": "- Replace totalSamples accumulator with b.N * len(input) post-loop\n- Remove redundant b.ResetTimer() calls (handled by b.Loop())\n- Remove redundant b.StopTimer() call (handled by b.Loop())\n- Use time.Second for timeout readability",
"is_bot": false,
"headline": "refactor: apply CodeRabbit review suggestions for benchmarks",
"author_name": "Tomi P. Hakala",
"author_login": "tomiphakala",
"committed_at": "2026-02-13T11:50:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2be71bda429e8603f4cbfc758737671e716be2cc",
"body": "Replace sample-by-sample iteration with bulk copy operations in\nRingBuffer.Peek and FIFOBuffer.grow, handling wrap-around with\ntwo-segment copies. Addresses Gemini code review feedback.",
"is_bot": false,
"headline": "perf: use copy instead of element-by-element loops in ring buffer",
"author_name": "Tomi P. Hakala",
"author_login": "tomiphakala",
"committed_at": "2026-02-13T11:44:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ff09c8e763f967e3d5821d30d2b6900f01f6ba3a",
"body": "- Convert classic for loops to integer range loops (Go 1.22+)\n- Convert benchmark loops to b.Loop() (Go 1.24+)\n- Thread context.Context through test helpers for t.Context() (Go 1.24+)\n- Preallocate output slice in examples/basic",
"is_bot": false,
"headline": "fix: modernize Go idioms flagged by golangci-lint",
"author_name": "Tomi P. Hakala",
"author_login": "tomiphakala",
"committed_at": "2026-02-13T11:38:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "82ef7ebf54dea628c5e5db5f7896111f6a426394",
"body": "Add float32-native API for consistent float32 workflows",
"is_bot": false,
"headline": "Merge pull request #6 from tphakala/feature/float32-native-api",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-26T16:44:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97c328af14060d336a515263dd8c7266f1d493d1",
"body": "Previously, users working with float32 audio had an awkward mismatch:\nProcessFloat32() returned []float32, but Flush() returned []float64,\nrequiring manual conversion for the flushed samples.\n\nThis adds a complete float32-native API that keeps everything in float32:\n\nNew types and functions:\n- Simpl\n[…]\nite in convenience_float32_test.go\n- Verified float32/float64 consistency (diff ~2.6e-7)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add float32-native API for consistent float32 workflows",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-26T16:32:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0a55d5854bf8180107d454bdc8a548de0c9fc37b",
"body": "Update test expectations for new Fs1 calculation",
"is_bot": false,
"headline": "Merge pull request #5 from tphakala/fix/update-test-expectations",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T16:48:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e5e5053a87b5c5741bfefb84e75993f5370fa4b",
"body": "The branch changed how Fs1 is calculated in ComputePolyphaseFilterParams:\n- Old: Fs1 = 0.5 (hardcoded)\n- New: Fs1 = ratio (computed based on polyphase ratio)\n\nThis affects FsRaw = 3 + |Fs1 - 1| for downsampling with pre-stage.\n\nChanges:\n- Update TestComputePolyphaseFilterParams_FnNormalization to ca\n[…]\nagnostic from\n error to log since Fc represents rolloff compensation, not filter cutoff\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update test expectations for new Fs1 calculation",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T16:42:11Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "130f35a277cb1a07c5f7c428fbd73d34dfdeb5cd",
"body": "Fix passband ripple and buffer integrity issues",
"is_bot": false,
"headline": "Merge pull request #4 from tphakala/fix/passband-ripple-buffer-integrity",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T16:28:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9cbddc8efb15caee20b5aada01c52a0f46e2b35b",
"body": "- Fix decimation phase update formula: the correct formula is\n (oldPhase - consumed) mod factor, not (factor - (oldPhase + consumed) mod factor).\n The previous formula was coincidentally correct for factor=2 but wrong for\n factor=3 or higher. This bug would manifest in non-2x decimation ratios.\n\n\n[…]\node correctly implements soxr's intentional\n behavior (using Fn=1 formula when preM=0).\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix decimation phase calculation and clarify comment",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T16:22:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2e8a5cf2e1b165b7e7fa3aa781e4766149950789",
"body": "- Fix contradictory comment about hasPreStage parameter:\n Comment said \"hasPreStage = true\" but code passed false.\n Updated to explain why false is correct (soxr uses preM=0 for\n upsampling pre-stages, so polyphase uses Fn=1 normalization)\n- Fix hardcoded passbandVeryHigh in NewDFTDecimationStage:\n Now uses qualityToPassbandEnd(quality) to respect quality parameter\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix additional code review issues from coderabbit",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T15:37:20Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e1ea917250b6036330b8a74ef6ed7cca6fcd15ee",
"body": "- Use math.MaxFloat64 for minAtten initialization instead of fragile == 0.0 check\n- Add explicit check that -6dB crossing was found in filter test\n- Initialize minGain/maxGain with math.Inf to properly track actual measured gains\n- Handle NewResampler and Flush errors instead of ignoring them\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix code review issues from coderabbit",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T15:19:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "379054ab1032ba588e204432c1a870f0edac5671",
"body": "- Merge duplicate if-else branches in ComputePolyphaseFilterParams\n (upsampling and downsampling without pre-stage use same formula)\n- Remove duplicate package godoc comments from test files\n- Add named constants for passband frequencies (passbandLow, passbandMedium,\n passbandHigh, passbandVeryHig\n[…]\ne cleanup\n\nRemaining: gocognit warning for resampleWAVGeneric (needs larger refactoring)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix golangci-lint issues",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T15:16:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b6a7b3e7314573b11057b6acb181ba326c837a24",
"body": "- Remove unused MinAttenuation field from DecimationTestCase\n- Remove unused attenuationFromBits helper function\n- Add assertions to TestSoxrTapCountRanges for sensible ranges\n- Remove unused attenuation constant from TestFilterFrequencyResponse_Passband\n- Add proper error handling to diagnostic tes\n[…]\nction\n- Simplify test case name generation in TestBesselI0_KnownValues using fmt.Sprintf\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Address code review comments",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T14:59:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8788f0ad4b2608654fe15bc094061bdca7de2cf8",
"body": "Buffer integrity fix:\n- Return copy of internal buffer in DFTDecimationStage.Process()\n to prevent caller from holding reference to reused internal slice\n\nPassband ripple fix for non-integer downsampling (e.g., 48→44.1):\n- Implement soxr's 2x DFT upsampling pre-stage architecture\n (48→96→44.1 inst\n[…]\net validation against soxr\n- soxr_reference_test.go: Kaiser beta and filter length tests\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix passband ripple and buffer integrity issues",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T14:19:43Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0ee2a30f9792926966ac31ab4916e999b3a8dc0b",
"body": "Add parallel channel processing for multi-channel audio",
"is_bot": false,
"headline": "Merge pull request #2 from tphakala/feature/parallel-channel-processing",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T11:43:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "27c55f4f7612c3092bc24cae79640e73b09718db",
"body": "Address code review feedback:\n- Fix flush loop to collect all channels first, then interleave together\n (previously wrote partial channel data with zeros, causing silence gaps)\n- Remove unused NumWorkers config field (more relevant for Strategy 2)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Fix flush loop interleaving and remove unused NumWorkers",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T11:43:19Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d3f6708332ec84591744741f131258e330a9cc79",
"body": "Implements Strategy 1 from issue #1: Channel-Level Parallelism.\n\nChanges:\n- Add EnableParallel and NumWorkers fields to Config struct\n- Update constantRateResampler.ProcessMulti to process channels\n concurrently when EnableParallel is true\n- Add -parallel flag to resample-wav CLI (enabled by defaul\n[…]\nnt\nfilter state. Mono audio falls back to sequential processing.\n\nCloses #1 (Strategy 1)\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add parallel channel processing for multi-channel audio",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-25T11:36:33Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "067edb77c74e671ae1485d64fb929a77e4140247",
"body": "- Adjusted formatting in `critical_functions_test.go`, `function_throughput_test.go`, and `precision_comparison_test.go` for better alignment and clarity.\n- Standardized spacing and indentation in various test cases to enhance code maintainability.\n- Updated comments in `polyphase.go` to improve clarity on cubic interpolation constants and quality attenuation thresholds.\n\nThis commit focuses on code style improvements without altering functionality.",
"is_bot": false,
"headline": "Refactor test files for improved readability and consistency",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T15:55:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "70af5f0dc30cfddb30ce4cf4a3c4c924fdc0d4db",
"body": "- Lead with 'only pure Go' positioning\n- Add float32/float64 selectable precision\n- Add cubic coefficient interpolation\n- Fix precision values (High=20-bit, VeryHigh=28-bit matching soxr)\n- Add attenuation dB values for each preset\n- Mention quality validation against libsoxr\n- Add cross-platform compatibility note\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update doc.go for pkg.go.dev with current features",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T15:55:02Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "1d883b691b30b0be16e8754a3c551ff195b7bc89",
"body": "- simd library automatically uses AVX2/SSE when available\n- GOAMD64=v3 only affects remaining non-SIMD Go code paths\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Clarify SIMD usage in performance section",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T15:53:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4bb64022a7d575f509741a3d88064907d0a54557",
"body": "- Updated the opening line to specify the library as \"the only pure Go\" audio resampler known.\n- Removed the emphasis on CGO dependencies while maintaining the focus on the advantages of pure Go.\n- Streamlined the explanation of the library's capabilities and its basis on libsoxr.",
"is_bot": false,
"headline": "Clarify README description of the library's uniqueness",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T15:51:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ec62bd8f9cecf4599bdca5bb3d533ebde6c5f334",
"body": "- Lead with 'the only pure Go' positioning\n- Explain why pure Go matters (cross-compilation, no linking)\n- Clarify this is a complete reimplementation, not a CGO wrapper\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Emphasize unique position as only pure Go audio resampler",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T15:50:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8f0d4d88c172fb41a6a93bdbf8c55b40f84ab708",
"body": "- Add bold Pure Go callout in opening line\n- Add blockquote highlighting cross-platform compatibility\n- Move Pure Go and Cross-platform to top of features list\n- Emphasize no build complexity advantage\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Highlight Pure Go / no CGO as key differentiator in README",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T15:50:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2afb7e4704ee4c0c7501f0aa73f3a596386ddb50",
"body": "- Updated the README to include new quality presets with precision and attenuation values, improving clarity on use cases.\n- Added a section comparing Total Harmonic Distortion (THD) measurements against libsoxr, highlighting performance metrics for different presets.\n- Introduced a new section on p\n[…]\n4) with examples and performance comparisons, emphasizing the library's flexibility.\n- Enhanced descriptions of features and architecture to reflect recent improvements in the audio processing engine.",
"is_bot": false,
"headline": "Enhance README with detailed quality presets and precision modes",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T15:46:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ed70cf45f486cbb1add1de22da5aefcae91f2e5a",
"body": "…ssing\n\n- Introduced a new test file `precision_comparison_test.go` to evaluate the accuracy and performance differences between float32 and float64 resampling paths.\n- Implemented comprehensive tests for DC gain, Total Harmonic Distortion (THD), Signal-to-Noise Ratio (SNR), and passband ripple acro\n[…]\nor test results to facilitate quality assessment and comparison.\n- Included benchmark tests to measure throughput for both float32 and float64 conversions, enhancing performance analysis capabilities.",
"is_bot": false,
"headline": "Add precision comparison tests for float32 and float64 in audio proce…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T15:20:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1b29dbd9099d0c2517428c8129476d03037b3237",
"body": "- Updated the `github.com/tphakala/simd` dependency from v1.0.12 to v1.0.14 for improved performance and features.\n- Added `b.Helper()` calls in various benchmark functions to improve test output clarity and maintainability.\n- Refactored cubic interpolation logic in the `Process` method of the `PolyphaseStage` to utilize SIMD operations for better performance.\n- Initialized summary slices with a predefined capacity in test files to optimize memory allocation.",
"is_bot": false,
"headline": "Update dependencies and enhance benchmarking tests",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T15:13:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "96731c813a434de960cd4490ffa1dae9f1b5a2ff",
"body": "- Introduced a new test file `quality_regression_test.go` to validate that quality metrics such as DC gain, THD, SNR, and passband ripple do not regress during optimization.\n- Implemented baseline thresholds for various quality levels, ensuring that any regression in audio processing quality is dete\n[…]\ncing the robustness of the audio processing validation framework.\n- Included internal measurement functions for THD, SNR, and passband ripple to facilitate accurate quality assessments during testing.",
"is_bot": false,
"headline": "Add quality regression tests for audio processing engine",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T14:10:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ccb1422a128bf3244391271451a76b24a6fb0b3d",
"body": "- Introduced a new test file `function_throughput_test.go` to benchmark individual functions within the audio processing engine.\n- Implemented benchmarks for core operations including convolution, dot product, interleaving, and DFT stages, measuring performance across various configurations.\n- Added\n[…]\nng for identification of optimization targets in the audio processing pipeline.\n- Enhanced the testing framework to facilitate performance analysis and ensure robust validation of function efficiency.",
"is_bot": false,
"headline": "Add function throughput benchmarks for audio processing",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T14:07:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5ffd479514ec49e89a367e46a88565ae1f2564c0",
"body": "- Introduced a new test file `throughput_comparison_test.go` to measure and compare throughput (samples/second) between the Go resampler and SOXR across various quality presets.\n- Implemented functions to measure throughput for both Go and SOXR, including detailed logging of results for different in\n[…]\no evaluate performance under different conditions.\n- Enhanced the `test_quality.c` file to include a new throughput measurement feature, allowing for comprehensive performance analysis during testing.",
"is_bot": false,
"headline": "Add throughput comparison tests for Go resampler and SOXR",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T14:00:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "67563feb1c3bb0b9071e53404e13d4969832e7dd",
"body": "- Expanded the `TestTHD_AllQualityPresets` and `TestSNR_AllQualityPresets` functions in `quality_preset_comparison_test.go` to include new test cases for the conversion from 48kHz to 32kHz, specifically for BirdNET scenarios.\n- This addition enhances the coverage of quality preset comparisons, ensuring thorough validation of audio processing across different sample rates.",
"is_bot": false,
"headline": "Add additional quality preset test cases for BirdNET conversions",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T13:44:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1591c2ae40836c50dffac6cc7e8259191717dd9b",
"body": "- Deleted the `bench_soxr`, `test_antialiasing`, and `test_soxr_reference` files as they are no longer needed, streamlining the test suite and removing outdated references.",
"is_bot": false,
"headline": "Remove obsolete binary test files for SOXR benchmarks",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T13:37:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c72bcfabf025190cd194e6fac4195186ae7312c3",
"body": "- Introduced a new test file `quality_preset_comparison_test.go` to validate the performance of various Go quality presets against their corresponding SOXR presets.\n- Implemented comprehensive tests for THD, SNR, Passband Ripple, and Impulse Response across all quality presets, ensuring alignment wi\n[…]\npreset mappings and improved output formatting for clarity in test results.\n- Enhanced the overall testing framework to ensure robust validation of audio processing quality across different scenarios.",
"is_bot": false,
"headline": "Add quality preset comparison tests and update test quality tool",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T13:25:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "541c0709d1231b7a51d5133021871cf5fc15f0bc",
"body": "- Updated the `createStage` function to pass the `config.Quality.Precision` to filter stages, ensuring consistent quality across the pipeline.\n- Modified the `newHalfBandStage`, `newPolyphaseStage`, and `newFFTStage` functions to accept precision as a parameter, improving filter design based on qual\n[…]\nbit precision to engine quality settings, aligning with soxr's approach for better audio processing.\n- Enhanced comments and documentation for clarity on the impact of precision on filter performance.",
"is_bot": false,
"headline": "Enhance pipeline stages with precision-based quality mapping",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T13:18:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "dc92db62c190faf84153467d1c067ef935896758",
"body": "- Introduced a new test file `quality_preset_test.go` to validate quality presets and their corresponding attenuation values based on soxr's specifications.\n- Expanded the `qualityName` function in `critical_functions_test.go` to include mappings for additional quality levels: QualityQuick, QualityV\n[…]\nmprehensive tests to ensure that quality levels produce distinct filter parameters and that the attenuation values align with expected results, enhancing the robustness of the audio processing engine.",
"is_bot": false,
"headline": "Add quality presets and enhance quality name mapping in tests",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T13:06:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4940935c8d5020c19b5a7676612c2c8cc6ba641d",
"body": "- Modified the `measureDownsamplingAntiAliasing` function calls in the `antialiasing_test.go` file to use `QualityVeryHigh` instead of `QualityHigh` for improved accuracy in downsampling tests.\n- Enhanced comments in `polyphase.go` to clarify the need for anti-aliasing filter parameters during downsampling without a pre-stage, aligning with best practices for filter design.",
"is_bot": false,
"headline": "Update anti-aliasing quality in downsampling tests to VeryHigh",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T12:55:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2930254eee0255aca6bddf9386d1e9b22f70e619",
"body": "- Updated the `PolyphaseStage` structure to include cubic interpolation coefficients for improved filter performance.\n- Refactored the `Process` method to utilize cubic interpolation during resampling, enhancing audio quality.\n- Modified the `NewPolyphaseStage` function to accommodate new coefficien\n[…]\ninterpolation logic and ensure accurate audio processing across various scenarios.\n- Improved overall code clarity and maintainability by consolidating interpolation logic and enhancing documentation.",
"is_bot": false,
"headline": "Enhance polyphase filter design with cubic interpolation support",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T12:35:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a60daf085f0184d149ef127f136adf5aca9dbc1c",
"body": "- Updated the `NewPolyphaseStage` function to accept a `hasPreStage` boolean parameter, affecting filter design calculations.\n- Modified existing tests across multiple files to reflect the new parameter, ensuring accurate handling of upsampling and downsampling scenarios.\n- Enhanced the `ComputePoly\n[…]\ntion to incorporate the `hasPreStage` logic, aligning with soxr's methodology for filter design.\n- Improved overall test coverage and clarity by updating assertions and logging in relevant test cases.",
"is_bot": false,
"headline": "Refactor PolyphaseStage to include hasPreStage parameter in constructor",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T12:19:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7bd25976a789f02bfae7a9acaa674e6394afeadd",
"body": "- Modified test cases in `quality_comparison_test.go` to include updated naming conventions for BirdNET scenarios, reflecting version changes.\n- Added new test cases for 16kHz and 32kHz to 48kHz conversions, ensuring comprehensive coverage of audio quality comparisons.\n- Enhanced existing test cases for consistency and clarity in naming, improving overall test structure.",
"is_bot": false,
"headline": "Update quality comparison tests with new BirdNET versions",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T12:10:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "64414747c12c15a39390188b3673bc22fcdd5973",
"body": "…sign logic\n\n- Introduced unit tests for the `ComputePolyphaseFilterParams` function, validating Fn normalization for both upsampling and downsampling scenarios.\n- Enhanced the `designPolyphaseFilter` function to utilize the new parameter computation logic, ensuring accurate filter design based on s\n[…]\nnsistent handling of edge cases in filter design.\n- Updated existing test files to reflect changes in filter design and added detailed logging for better debugging and validation of filter parameters.",
"is_bot": false,
"headline": "Add unit tests for ComputePolyphaseFilterParams and improve filter de…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T12:02:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "54d8fc6393f2646ac1ea7bad359cbcda47773b06",
"body": "- Deleted `downsampling_bugs_test.go` and `isolated_bugs_test.go` as they contained redundant tests and were no longer aligned with the current filter design.\n- Refactored the `polyphase.go` file to improve the filter design logic, ensuring better handling of downsampling scenarios without unnecessa\n[…]\n parameter calculations for high attenuation scenarios, aligning with soxr's methodology.\n- Improved overall code clarity and maintainability by consolidating logic and removing deprecated test cases.",
"is_bot": false,
"headline": "Remove outdated tests and refactor polyphase filter design",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T11:36:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ca2f9860cdc44a1d181eed2f8a9c76819259a23d",
"body": "- Introduced new test files for critical functions, including `critical_functions_test.go`, `downsampling_bugs_test.go`, `isolated_bugs_test.go`, and `export_test.go`, to ensure robust validation of the audio processing engine.\n- Implemented extensive unit tests for functions such as `isIntegerRatio\n[…]\ndation of filter design parameters.\n- Improved overall test structure and logging for clearer feedback during test execution, promoting maintainability and reliability of the audio resampling library.",
"is_bot": false,
"headline": "Add comprehensive tests for audio resampling functionality",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T11:16:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ed4a6c4006d69c5c3cbe4f2158f361e1badd4522",
"body": "- Updated test files to replace manual error handling with `testify` assertions for better clarity and maintainability.\n- Enhanced the `halfband_test.go`, `kaiser_test.go`, `polyphase_test.go`, and `bessel_test.go` files by incorporating helper functions from the new `testutil` package.\n- Improved logging and error messages in tests to provide clearer feedback during test failures.\n- Ensured consistency in testing practices across the codebase, promoting a more robust testing framework.",
"is_bot": false,
"headline": "Refactor tests to use testify assertions and improve readability",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T10:57:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aef731120e93a51c276631938a9bab4155a7dbbe",
"body": "- Added new dependencies: `github.com/stretchr/testify`, `github.com/davecgh/go-spew`, `github.com/pmezard/go-difflib`, and `gopkg.in/yaml.v3` to enhance testing capabilities.\n- Introduced comprehensive tests for buffer integrity across various stages, including DFT, Polyphase, and Resampler, ensuri\n[…]\ns.\n- Implemented edge case tests to verify correct handling of empty inputs and single sample processing.\n- Enhanced existing tests to ensure robustness and reliability of the audio processing engine.",
"is_bot": false,
"headline": "Update dependencies and add extensive tests for buffer integrity",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T10:17:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7c311fd5bfefb9db2445e0305e8d127bbe136d91",
"body": "- Updated the Process method in DFTStage to return a copy of the output slice, preventing potential corruption of the caller's data.\n- Introduced a new test file `thd_diagnostic_test.go` containing extensive unit tests for the DFT stage, including THD isolation, coefficient analysis, and performance\n[…]\nt validation of the resampling process.\n- Implemented various checks for output characteristics, including amplitude, frequency response, and THD calculations, to ensure high-quality audio processing.",
"is_bot": false,
"headline": "Enhance DFTStage functionality and add comprehensive tests",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T10:06:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d02270343ace12a95f6b0c51404886f038e80c7c",
"body": "High-quality audio resampling library for Go with:\n- Multiple quality presets (Quick, Low, Medium, High, VeryHigh)\n- Configurable resampling pipeline\n- Internal engine with polyphase filtering\n- Example applications and test references\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <noreply@anthropic.com>",
"is_bot": false,
"headline": "Initial commit: Go audio resampler library",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2025-11-24T08:56:36Z",
"body_truncated": false,
"is_coding_agent": true
}
],
"releases_count": 7,
"commits_last_year": 100,
"latest_release_at": "2026-07-17T18:05:56Z",
"latest_release_tag": "v1.5.0",
"releases_from_tags": false,
"days_since_last_push": 2,
"active_weeks_last_year": 11,
"days_since_latest_release": 4,
"mean_days_between_releases": 20.7
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 71,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/tphakala/go-audio-resampler",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/tphakala/go-audio-resampler",
"is_deprecated": false,
"latest_version": "v1.5.0",
"repository_url": "https://github.com/tphakala/go-audio-resampler",
"versions_count": 7,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-17T18:05:39Z",
"latest_version_yanked": null,
"days_since_latest_publish": 4
}
]
},
"popularity": {
"forks": 4,
"stars": 9,
"watchers": 1,
"fork_history": {
"days": [
{
"date": "2026-02-02",
"count": 1
},
{
"date": "2026-05-03",
"count": 1
},
{
"date": "2026-05-21",
"count": 1
},
{
"date": "2026-07-03",
"count": 1
}
],
"complete": true,
"collected": 4,
"total_forks": 4
},
"star_history": {
"days": [
{
"date": "2025-11-25",
"count": 1
},
{
"date": "2026-01-07",
"count": 1
},
{
"date": "2026-03-03",
"count": 1
},
{
"date": "2026-03-14",
"count": 1
},
{
"date": "2026-03-25",
"count": 1
},
{
"date": "2026-04-05",
"count": 1
},
{
"date": "2026-04-10",
"count": 1
},
{
"date": "2026-06-12",
"count": 1
},
{
"date": "2026-06-23",
"count": 1
}
],
"complete": true,
"collected": 9,
"total_stars": 9
},
"open_issues_and_prs": 1
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Taskfile.yml",
"test-reference/Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 34884,
"source_files_sampled": 118,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": "repository_graph",
"source": "osv",
"findings": [],
"collected": true,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 10,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/go-audio/audio",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.0.0"
},
{
"name": "github.com/go-audio/wav",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.1.0"
},
{
"name": "github.com/quasilyte/go-ruleguard/dsl",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.3.23"
},
{
"name": "github.com/stretchr/testify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.1"
},
{
"name": "github.com/tphakala/simd",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "github.com/go-audio/audio",
"direct": true,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/go-audio/wav",
"direct": true,
"version": "v1.1.0",
"ecosystem": "go"
},
{
"name": "github.com/quasilyte/go-ruleguard/dsl",
"direct": true,
"version": "v0.3.23",
"ecosystem": "go"
},
{
"name": "github.com/stretchr/testify",
"direct": true,
"version": "v1.11.1",
"ecosystem": "go"
},
{
"name": "github.com/tphakala/simd",
"direct": true,
"version": "v1.6.0",
"ecosystem": "go"
},
{
"name": "github.com/davecgh/go-spew",
"direct": false,
"version": "v1.1.1",
"ecosystem": "go"
},
{
"name": "github.com/go-audio/riff",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "github.com/pmezard/go-difflib",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": false,
"version": "v0.45.0",
"ecosystem": "go"
},
{
"name": "gopkg.in/yaml.v3",
"direct": false,
"version": "v3.0.1",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 10,
"direct_count": 5,
"indirect_count": 5
}
},
"maintainership": {
"issues": {
"open_prs": 1,
"merged_prs": 29,
"open_issues": 0,
"closed_ratio": 1,
"closed_issues": 21,
"closed_unmerged_prs": 8
},
"bus_factor": 1,
"bot_contributors": 1,
"top_contributors": [
{
"type": "User",
"login": "tphakala",
"commits": 85,
"avatar_url": "https://avatars.githubusercontent.com/u/7030001?v=4"
},
{
"type": "User",
"login": "tomiphakala",
"commits": 7,
"avatar_url": "https://avatars.githubusercontent.com/u/272442802?v=4"
},
{
"type": "User",
"login": "anyasabo",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/1638148?v=4"
}
],
"contributors_sampled": 3,
"top_contributor_share": 0.914
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"benchmark.yml",
"ci.yml",
"codeql.yml",
"coverage.yml",
"dependabot-auto-merge.yml",
"govulncheck.yml",
"scorecard.yml",
"stale.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": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 9,
"reason": "18 out of 19 merged PRs checked by a CI test -- score normalized to 9",
"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 1/24 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": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 10,
"reason": "project is 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": "28 commit(s) and 20 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": 8,
"reason": "dependency not pinned by hash detected -- score normalized to 8",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 9,
"reason": "SAST tool detected but not run on all commits",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file 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": 10,
"reason": "GitHub workflow tokens follow principle of least privilege",
"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": "710675e6d3c96e572389134d2a6fe3bf5ceb6610",
"ran_at": "2026-07-22T08:51:08Z",
"aggregate_score": 8.4,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": true,
"has_security_policy": true,
"has_dependabot_config": true
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-22T08:31:40Z",
"oldest_open_prs": [
{
"number": 59,
"created_at": "2026-07-20T07:09:22Z",
"last_comment_at": "2026-07-20T07:13:04Z",
"last_comment_author": "github-actions"
}
],
"last_merged_pr_at": "2026-07-20T07:10:33Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/tphakala/go-audio-resampler",
"host": "github.com",
"name": "go-audio-resampler",
"owner": "tphakala"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 69,
"inputs": {
"security": 87,
"vitality": 83,
"community": 43,
"governance": 60,
"engineering": 73
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 83,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 72,
"inputs": {
"commits_last_year": 100,
"human_commit_share": 0.93,
"days_since_last_push": 2,
"active_weeks_last_year": 11
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 2 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 2
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "11/52 weeks with commits",
"points": 7.6,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 11
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "100 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 100
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "28 commit(s) and 20 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": 7,
"latest_release_tag": "v1.5.0",
"releases_from_tags": false,
"days_since_latest_release": 4,
"mean_days_between_releases": 20.7
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "7 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 7
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 4 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 4
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~20.7 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 20.7
}
}
],
"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": 4,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 4 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 4
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 43,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 19,
"inputs": {
"forks": 4,
"stars": 9,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "below_threshold"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "9 stars",
"points": 14.6,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 9
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "4 forks",
"points": 4,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 4
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (LGPL-2.1)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "LGPL-2.1"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 60,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 18,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 3,
"top_contributor_share": 0.914
},
"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 91% of commits",
"points": 1.9,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 91
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "3 contributors",
"points": 4.1,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 3
}
}
],
"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": null,
"notes": [],
"value": 77,
"inputs": {
"merged_prs": 29,
"open_issues": 0,
"closed_issues": 21,
"issue_closed_ratio": 1,
"closed_unmerged_prs": 8
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 46.8,
"status": "met",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "29/37 decided PRs merged",
"points": 30,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 29,
"decided": 37
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 1/24 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"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": 61,
"inputs": {
"followers": 77,
"owner_type": "User",
"is_verified": null,
"owner_login": "tphakala",
"public_repos": 63,
"account_age_days": 4504
},
"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": "77 followers of tphakala",
"points": 13.6,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 77,
"login": "tphakala"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "63 public repos, account ~12 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 63
}
},
{
"code": "account_age_years",
"params": {
"years": 12
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/tphakala/go-audio-resampler"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 4
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 4 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 4
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "7 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 7
}
}
],
"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": 73,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 82,
"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": "8 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 8
}
}
],
"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": "18 out of 19 merged PRs checked by a CI test -- score normalized to 9",
"points": 18,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"topics": [
"audio",
"audio-processing",
"dsp",
"fir-filter",
"golang",
"resampling",
"sample-rate-conversion",
"simd",
"soxr"
],
"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": "9 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 9
}
}
],
"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": "excellent",
"name": "Security",
"value": 87,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "good",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 84,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 15,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 3,
"scorecard_aggregate": 8.4
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "18 out of 19 merged PRs checked by a CI test -- score normalized to 9",
"points": 2.2,
"status": "partial",
"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 1/24 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": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is fuzzed",
"points": 5,
"status": "met",
"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": "28 commit(s) and 20 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 8",
"points": 4,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool detected but not run on all commits",
"points": 4.5,
"status": "partial",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"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": "GitHub workflow tokens follow principle of least privilege",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "dependency_advisories",
"band": "excellent",
"name": "Dependency advisories",
"note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 10 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"indirect_dependencies_free_of_known_advisories",
"no_advisories_left_outstanding"
]
}
},
{
"code": "weights_renormalized",
"params": {}
},
{
"code": "advisories_scope_repository",
"params": {
"assessed": 10
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 10,
"unassessed_packages": 0,
"affected_by_severity": "none",
"direct_affected_packages": 0
},
"components": [
{
"key": "direct_dependencies_free_of_known_advisories",
"name": "Direct dependencies free of known advisories",
"detail": "no direct dependency carries a known advisory",
"points": 35,
"status": "met",
"details": [
{
"code": "no_direct_advisories",
"params": {}
}
],
"max_points": 35
},
{
"key": "indirect_dependencies_free_of_known_advisories",
"name": "Indirect dependencies free of known advisories",
"detail": "transitive set not separable from development and test dependencies in this scope",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_scope_not_separable",
"params": {}
}
],
"max_points": 25
},
{
"key": "no_advisories_left_outstanding",
"name": "No advisories left outstanding",
"detail": "no advisory carries a publication date",
"points": 0,
"status": "excluded",
"details": [
{
"code": "advisories_no_publication_date",
"params": {}
}
],
"max_points": 40
}
]
},
{
"key": "malicious_dependencies",
"band": "excellent",
"name": "Malicious dependencies",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"source": "osv",
"meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
"packages": [],
"red_flag": false,
"assessed_packages": 10,
"malicious_packages": 0,
"direct_malicious_packages": 0,
"withdrawn_malicious_packages": 0,
"installable_malicious_packages": 0
},
"components": [
{
"key": "no_dependency_reported_as_a_malicious_package",
"name": "No dependency reported as a malicious package",
"detail": "no dependency is reported as a malicious package",
"points": 100,
"status": "met",
"details": [
{
"code": "no_malicious_dependencies",
"params": {}
}
],
"max_points": 100
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 4
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 72,
"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": 1,
"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": "93 of 93 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 93,
"sampled": 93
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "excellent",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 98,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Taskfile.yml",
"test-reference/Makefile"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0.16,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0.07
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Taskfile.yml, test-reference/Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Taskfile.yml, test-reference/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": "16 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 16,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "7 of the last 100 commits are automated dependency updates",
"points": 8,
"status": "met",
"details": [
{
"code": "dependency_bot_commits",
"params": {
"count": 7,
"sampled": 100
}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 8",
"points": 8,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 34884,
"source_files_sampled": 118,
"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/118 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 118,
"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": [],
"report_type": "repository",
"generated_at": "2026-07-22T08:51:21.726319Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/tphakala/go-audio-resampler.svg",
"full_name": "tphakala/go-audio-resampler",
"license_state": "standard",
"license_spdx": "LGPL-2.1"
}