原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [
"avx",
"float32",
"float64",
"go",
"golang",
"math",
"neon",
"performance",
"simd",
"vectorization"
],
"is_fork": false,
"size_kb": 1603,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 1737250,
"Shell": 2273,
"Assembly": 982881
},
"pushed_at": "2026-07-19T18:35:51Z",
"created_at": "2025-11-21T22:40:23Z",
"owner_type": "User",
"updated_at": "2026-07-24T14:22:29Z",
"description": "High-performance SIMD library for Go with AVX/NEON support",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go",
"Assembly"
]
},
"owner": {
"blog": null,
"name": "Tomi P. Hakala",
"type": "User",
"login": "tphakala",
"company": null,
"location": "Muurame, Finland",
"followers": 78,
"avatar_url": "https://avatars.githubusercontent.com/u/7030001?v=4",
"created_at": "2014-03-22T09:31:18Z",
"is_verified": null,
"public_repos": 64,
"account_age_days": 4508
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2026-07-19T18:35:58Z"
},
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2026-07-19T15:14:35Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2026-07-19T07:57:52Z"
},
{
"tag": "v1.4.0-rc.2",
"kind": "prerelease",
"published_at": "2026-06-14T13:00:29Z"
},
{
"tag": "v1.4.0-rc.1",
"kind": "prerelease",
"published_at": "2026-06-14T11:52:53Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2026-06-13T14:13:28Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2026-06-11T16:42:53Z"
},
{
"tag": "v1.2.0-rc.2",
"kind": "prerelease",
"published_at": "2026-06-04T21:13:51Z"
},
{
"tag": "v1.2.0-rc.1",
"kind": "prerelease",
"published_at": "2026-06-02T19:22:19Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2026-05-29T12:48:55Z"
}
],
"recent_commits": [
{
"oid": "c06683652b58e1dd15cd382708f708b874f4b20e",
"body": null,
"is_bot": false,
"headline": "docs: document the f64 ButterflyComplex and RealFFTUnpack primitives",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T18:35:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9a325e05a3c4faf4b48661728701d7c2c27dfac5",
"body": "… (#195)\n\nAdds f64.RealFFTUnpack, the float64 counterpart of f32.RealFFTUnpack, with an\nAVX2/FMA kernel on amd64, a NEON kernel on arm64, and a pure-Go fallback. This is\nthe second of the f64 FFT building blocks issue #192 calls out; the first,\nf64.ButterflyComplex, shipped in #193. Together they ar\n[…]\nevery NEON WORD against arm64asm; no\ngoroutine-register clobber. Ran the full f64 package on real hardware: amd64\ni7-1260P (AVX2) and arm64 Raspberry Pi 5 (Cortex-A76 NEON), green on both.\n\nRefs #192.",
"is_bot": false,
"headline": "f64: add RealFFTUnpack, the AVX2/NEON real-FFT even/odd unpack (#192)…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T18:26:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b02444bc386dba2ffa480c68f31203046f7b6fd0",
"body": "… (#193)\n\nThe FFT building blocks ButterflyComplex and RealFFTUnpack existed only in\npackage f32, so a float64 consumer (the bit-exact SoX/STFT path issue #192\ntargets) had no vectorized butterfly to reach for. This adds the first of the\ntwo: f64.ButterflyComplex, the float64 counterpart of f32.Butt\n[…]\nardware: amd64 i7-1260P (AVX2) and\narm64 Raspberry Pi 5 (Cortex-A76 NEON), green on both. On the i7-1260P the AVX\nkernel is ~4x the Go path (256: 76 ns vs 311 ns; 1024: 294 ns vs 1190 ns).\n\nRefs #192.",
"is_bot": false,
"headline": "f64: add ButterflyComplex, the AVX2/NEON complex FFT butterfly (#192)…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T17:30:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "25374549ad4bd72f0e93dfd287a90cc1b3cc919b",
"body": "Refreshes README.md and doc.go for the additions since v1.4.0. The i32 operation\ntables and prose now cover NegWhereNeg, ScaleQ31, ScaleQ15, Butterfly, MaxAbs,\nand FIRValidQ15 (they were stale), and both files gain a section for the new\ncint package (fixed-point complex arithmetic: int32 data times int16 Q15 twiddle,\ntruncating C_MUL, for integer FFT butterflies). Documentation only; no code\nchange.",
"is_bot": false,
"headline": "docs: document the i32 fixed-point primitives and the cint package",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T15:13:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a5ac53380c57140ab203d2a0cf32dbdcf57e2cc9",
"body": "…(#180) (#191)\n\n* cint: add fixed-point complex arithmetic for integer FFT butterflies (#180)\n\nAdds the cint package: fixed-point complex arithmetic for integer FFT\nbutterflies, the integer analog of c64/c128. Complex data is int32 real and\nimaginary interleaved [r0,i0,r1,i1,...]; twiddles are int16\n[…]\nON\n(Raspberry Pi 5) hardware; TestArm64WordEncodings cross-checks every new WORD\nagainst arm64asm.\n\n* cint: harden plantExtremes, add SubGo bench, full kernel alloc-free, fix asm comment (review #191)",
"is_bot": false,
"headline": "cint: add fixed-point complex arithmetic for integer FFT butterflies …",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T15:02:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "71fd81617b352f28dc5bdf94960071fac8112a1a",
"body": "… (#190)\n\n* i32: add FIRValidQ15, an int32 valid convolution with Q15 taps (#181)\n\nFIRValidQ15(dst, x []int32, taps []int16) writes the valid (correlation\norientation) convolution of x with the int16 Q15 taps into dst: for output i,\ndst[i] = sum over j in [0, len(taps)) of int32(int64(taps[j]) * int\n[…]\n and differential\nfuzz over x and taps bytes. Verified bit-exact on AVX2 (i7-1260P) and NEON\n(Raspberry Pi 5) hardware.\n\n* i32: tie firValidQ15Shift to scaleQ15Shift to prevent Q15 drift (review #190)",
"is_bot": false,
"headline": "i32: add FIRValidQ15, an int32 valid convolution with Q15 taps (#181)…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T14:25:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6a8dc6ccacb025bddc4d379e93bddbdbae63b62f",
"body": "MaxAbs(a []int32) int32 returns the peak magnitude of a the way libopus\nceltMaxabs32 does: over a single signed min/max scan it returns\nmax(maxVal, -minVal), where -minVal is a wrapping int32 negate. This is\ndeliberately not a per-lane absolute-value-then-max, which diverges when a\nMinInt32 element \n[…]\n alloc-free,\ndispatch-pin, an over-read poison guard (extremes planted past n over a full-block\nslack), and differential fuzz. Verified bit-exact on AVX2 (i7-1260P) and NEON\n(Raspberry Pi 5) hardware.",
"is_bot": false,
"headline": "i32: add MaxAbs, the celtMaxabs32 peak-magnitude reduction (#181) (#189)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T13:37:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4368ca4278ffb61de9d952220c0c948db7ec880c",
"body": "… (#188)\n\n* i32: add Butterfly, the in-place FWHT/Haar sum-difference step (#181)\n\nButterfly(lo, hi []int32) writes lo[i], hi[i] = lo[i]+hi[i], lo[i]-hi[i] for i\nin [0, n), n = min(len(lo), len(hi)). Both the sum and the difference wrap in\nint32 (two's complement, modulo 2^32) rather than saturating\n[…]\n-pin, and\ndifferential fuzz. Verified bit-exact on AVX2 (i7-1260P) and NEON (Raspberry Pi 5)\nhardware; 10M+ fuzz executions clean.\n\n* docs: Butterfly clamps to min(len), not equal-length (review #188)",
"is_bot": false,
"headline": "i32: add Butterfly, the in-place FWHT/Haar sum-difference step (#181)…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T12:58:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0fb58ffb8fbc0f14300a609ee8a7d5338020aa05",
"body": "…r (#181) (#187)\n\nScaleQ31(dst, a []int32, k int32) writes dst[i] = int32(int64(a[i]) * int64(k) >> 31); ScaleQ15(dst, a []int32, k int16) writes dst[i] = int32(int64(k) * int64(a[i]) >> 15). Both are the truncating fixed-point scale-by-scalar of libopus MULT32_32_Q31 / MULT16_32_Q15: an arithmetic \n[…]\ng, unaligned, dispatch-pin, and differential fuzz (both operand and coefficient), and benchmarks. Verified bit-exact on AVX2 (i7-1260P) and NEON (Raspberry Pi 5) hardware; ~1.8M fuzz executions clean.",
"is_bot": false,
"headline": "i32: add ScaleQ31 and ScaleQ15, truncating fixed-point scale-by-scala…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T11:33:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "56a27ee52da099e8e2669dd1ee7e9bcf6b44b0fc",
"body": "…#182) (#186)\n\n* i32: add NegWhereNeg, a branchless sign-transfer conditional-negate (#182)\n\nNegWhereNeg(dst, mag []int32, sign []float32) sets dst[i] = mag[i] negated where sign[i]'s IEEE sign bit is set: dst[i] = (mag[i] ^ m) - m with m = int32(math.Float32bits(sign[i])) >> 31. Sign-bit predicate \n[…]\na shifted dst/sign or dst/mag overlay could clobber input lanes a later iteration has not read yet. The prior comment overclaimed general lane-by-lane overlay safety. Comment-only, no behavior change.",
"is_bot": false,
"headline": "i32: add NegWhereNeg, a branchless sign-transfer conditional-negate (…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T10:52:57Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e0d6be9d153eeb3913e0b049064d3ea4467a2d75",
"body": "* f32: add CopySign, an exact elementwise IEEE copysign (#182)\n\nCopySign(dst, mag, sign []float32) sets dst[i] = |mag[i]| carrying sign[i]'s IEEE sign bit: (bits(mag)&^0x80000000) | (bits(sign)&0x80000000), equal to math.Copysign elementwise and bit-for-bit for every non-NaN input. Sign-bit predicat\n[…]\nhe SIMD kernels bit-for-bit including NaN payloads, but equals math.Copysign only for non-NaN inputs (its float64 round trip does not guarantee the same NaN payload). Comment-only, no behavior change.",
"is_bot": false,
"headline": "f32: add CopySign, an exact elementwise IEEE copysign (#182) (#185)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T10:16:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "21f5a3d8ac3ad164bc430001046b44d47f0c62a6",
"body": "…34 (#183) (#184)\n\n* f32: document Sqrt as correctly-rounded and add fused AbsPow34 (#183)\n\nDocuments f32.Sqrt as IEEE-754 correctly-rounded on every backend: VSQRTPS/SQRTPS and FSQRT are correctly-rounded by the ISA, and the Go fallback's float32(math.Sqrt(float64(x))) is a provably innocuous doubl\n[…]\nery small integer and half-integer up to 2048, of which only the perfect squares have exact roots; the rest have irrational roots that exercise the rounding decision. Comment-only, no behavior change.",
"is_bot": false,
"headline": "f32: document Sqrt as IEEE-754 correctly-rounded and add fused AbsPow…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-19T09:31:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7f6bdfc8f4000714c86c6deb8788ae8b3e5d8a6f",
"body": "…ine (#159) (#179)\n\ndot_avx2_loop16 is 29 bytes, so whether it fits inside one 64-byte\ninstruction-fetch line depends entirely on where the linker places dotAVX2. Go\naligns amd64 functions to 32, not 64, so the loop straddling a line boundary is a\ncoin flip that any unrelated code-size change can fl\n[…]\n ~99% from the uop cache, so PCALIGN buys it nothing (idq.dsb_uops identical\nwith and without). Correctness verified on the amd64 AVX2 host: PCALIGN is NOP\npadding, and the i16 suite passes unchanged.",
"is_bot": false,
"headline": "i16: PCALIGN the dotAVX2 16-wide loop to stop it straddling a fetch l…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T21:59:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a83250ebb275a622b5b6fec09fcbc3a0b685f1ae",
"body": "…lock (#149) (#178)\n\nToInt16 and ToInt32 widen int8 -> int16 / int32 with VPMOVSXBW / VPMOVSXBD over\n16- and 8-wide blocks, then a scalar tail (MOVBLSX + widening store) for the\n(n mod block) remainder. The tail is not branchy, but toI16's up to 15 serial\nload/store iterations still cost ~6-7 ns, ma\n[…]\nified on the amd64 AVX2 host (full i8 suite; TestToInt16/TestToInt32 sweep\nragged lengths through the shared table, and the overlap has no residue-dependent\nbranch). Completes the i8 kernels for #149.",
"is_bot": false,
"headline": "i8: replace toI16/toI32 conversion scalar tails with an overlapping b…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T21:42:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b3778e8626cbc8d4a180cc2e7f9ba5fd5eb089c0",
"body": "…blocks (#149) (#177)\n\n* i8: shrink the element-wise AVX2 scalar tails with forward 16/8-wide blocks (#149)\n\nThe 10 element-wise i8 AVX2 kernels (abs, neg, addSat, subSat, min, max, clamp,\nabsDiff, addScalarSat, subScalarSat) dropped from their 32-wide body to a scalar\ntail masked ANDQ $31. That tai\n[…]\ns verified on the amd64 AVX2 host (full i8 suite, residue parity, and\nin-place forward-block checks, 0 failures).\n\n* i8: fix element-wise residue-test comments; cover 8-wide block in-place (#177 gate)",
"is_bot": false,
"headline": "i8: shrink the element-wise AVX2 scalar tails with forward 16/8-wide …",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T21:22:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e81742332fd612ab0edb79a96e58f42fa79ef004",
"body": "… (#149) (#176)\n\n* i8: replace maxAbs/minMax scalar tails with an overlapping SIMD block (#149)\n\nmaxAbsAVX2 and minMaxAVX2 dropped from their 32-wide VPMAXUB / VPMINSB+VPMAXSB\nbody to a scalar tail masked ANDQ $31, so a remainder of 1-31 bytes cost up to\n31 iterations of a serial compare / condition\n[…]\nged length (it has no residue-dependent branch). Correctness verified\non the amd64 AVX2 host (full i8 suite, 0 failures).\n\n* i8: fix stale 'scalar tail' wording in maxAbs/minMax headers (Copilot #176)",
"is_bot": false,
"headline": "i8: replace maxAbs/minMax scalar tails with an overlapping SIMD block…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T21:01:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2f1756609ee777285c9618764d401dd4ed19e91e",
"body": "…#150 item 3) (#175)\n\nxcorr4AVX2 and xcorr4AVXVNNI reduced their four YMM lag accumulators to four\nint32 lag sums with a 28-instruction per-lag fold (VEXTRACTI128 + two\nVPSHUFD/VPADDD pairs + MOVQ per lag). For the common n%4 == 0 case, where no\nscalar tail follows, the four sums can be folded toget\n[…]\n change)\n\nCorrectness verified on the amd64 AVX2 and AVX-VNNI host (XCorr ParityWithGo,\nMinInt16, ShortWindowIsBounded, LongWindowIsClamped, and fuzz on both the AVX2\nand AVXVNNI kernels, 0 failures).",
"is_bot": false,
"headline": "i16: fold XCorr AVX2 lag reduction with VPHADDD on the no-tail path (…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T20:50:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "633b2baa6d3bfe26ddae7aa5de8faf9f29eeae2c",
"body": "…) (#174)\n\nsumAbsAVX2 and sadAVX2 dropped from their 32-wide VPSADBW body straight to a\nscalar tail masked ANDQ $31, so a remainder of 1-31 bytes cost up to 31\niterations of a serial ADDQ accumulator chain. This is the #145/#149 scalar-tail\nsawtooth; the sum/dot reductions already got the fix in #17\n[…]\n-wide-only tail block (n%32 in 16..23, 8-wide skipped) gets\ndeterministic correctness coverage for both kernels.\n\nCorrectness verified on the amd64 AVX2 host (TestSumAbs, TestSAD, fuzzer,\n0 failures).",
"is_bot": false,
"headline": "i8: add 16/8-wide AVX2 tail blocks to sumAbs and sad reductions (#149…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T20:50:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d4b79eda2e8db7674174cb16f494a7bb5a1fafef",
"body": "…s (#149) (#173)\n\nThe i8 Sum and DotProduct AVX2 kernels widen 16 bytes/iter (VPMOVSXBW -> VPMADDWD -> VPADDD into Y2) then drop to a serial scalar tail for the 0-15 remainder bytes, so a residue of 8-15 paid up to 15 iterations of a load -> (multiply) -> add dependency chain. Add one 8-wide XMM blo\n[…]\nt (real AVX2 and the SIMD_DISABLE=avx2 fallback) and on arm64.\n\nCovers the two reduction kernels; the remaining i8 element-wise/conversion AVX2 kernels are a separate benchmark-gated batch.\n\nRefs #149",
"is_bot": false,
"headline": "i8: add an 8-wide AVX2 tail block to the sum and dot reduction kernel…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T16:48:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9b27db18521f94deb10e0f7d7099f820391f79c1",
"body": "…it slides (#161 item 3) (#172)\n\nMinIdxOfSumRows validated every processed row's k window with an O(m) incremental walk before dispatch. Only slide +1 and -1 reach a SIMD kernel, and for those the offset sequence base + r*slide is monotonic, so its two extremes decide the whole range in O(1): slide \n[…]\nIMD_DISABLE=avx2 pure-Go fallback) and arm64 NEON hosts: full f32 suite and the MinIdxOfSum parity, out-of-range panic, and zero-alloc tests pass with bit-identical results.\n\nRelates to #161 (item 3).",
"is_bot": false,
"headline": "f32: replace MinIdxOfSumRows bounds walk with an O(1) precheck for un…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T16:01:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "13a0f7a2ab0fecfae6c8eb641c595fd160592483",
"body": "…ng SIMD block (#161) (#171)\n\nPR #170 changed the remainder handling: a leftover of 2 or 3 rows is now\ncovered by one overlapping SIMD block (bit-identical, since each row is\nindependent and the kernel is pure) instead of the scalar reference; only\na lone leftover row and shapes below the block width stay scalar. The\nREADME still described the old \"compose any remainder with the scalar\npath\" behavior. Corrects it and notes the leftover>=2 rationale.",
"is_bot": false,
"headline": "docs: MinIdxOfSumRows now covers 2-3 remainder rows with an overlappi…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T14:02:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37f1940aeffaca0cd3b23b5b04eda3e4fb414b78",
"body": "… block (#161 item 1) (#170)\n\nThe MinIdxOfSumRows dispatchers block rows in fixed widths (AVX2 8 then 4,\nNEON 4) and used to hand the 0-3 leftover rows to the scalar reference. At\nthe motivating ragged shapes that tail is a large fraction (m=11 leaves 3\nof 11 rows scalar). Each row's argmin is indep\n[…]\nerence (11x11/11x14/14x14). Width-aligned shapes are neutral (the\noverlap never runs). Parity is bit-exact vs the per-row Go oracle across\nthe full shape sweep for both slides on both hosts; 0 allocs.",
"is_bot": false,
"headline": "f32: lift MinIdxOfSumRows remainder rows onto SIMD via an overlapping…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T13:39:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "120503dd6b9c5414da2bf5271fac4c8e41bf80be",
"body": "xcorr4AVXVNNI fuses the 16-wide loop's four VPMADDWD+VPADDD pairs into\nfour VPDPWSSD, the AVX-VNNI multiply-accumulate. It is bit-identical to\nthe pair it replaces (same wrapping int32 accumulation; VPDPWSSD, never\nthe saturating VPDPWSSDS), so XCorr's wrapping contract is preserved and\nthe kernel j\n[…]\n6, short-window, and long-window subtests pass, and objdump\nconfirms the VEX vpdpwssd encoding. Bonus: corrected three pre-existing\ndoc nits (README neon token row, applyDisable avx doc, ExampleInfo).",
"is_bot": false,
"headline": "i16: add an AVX-VNNI VPDPWSSD tier to XCorr (#150 item 1) (#169)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T10:46:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4791da543d5d7c7960b3e71b94b4e736d0201184",
"body": "…168)\n\nThe kernel dropped from its 8-wide XMM block (added in #151) straight to a\n0-7 element scalar tail, and that tail is expensive across four lags: measured\n~2.7 cyc/element versus ~0.19 for a vectorized one on the i7-1260P, leaving a\nresidual period-8 sawtooth (the issue's item 2).\n\nA TESTQ $4-\n[…]\narity extended to 12/13/14 (both blocks + short tail) and 20/21/22\n(4-wide block only). n=247 added as a benchstat regression guard.\n\nRefs #150 (items 1 AVX-VNNI and 3 VPHADDD fold remain). #151, #145",
"is_bot": false,
"headline": "i16: add a 4-wide AVX2 remainder block to xcorr4AVX2 (#150 item 2) (#…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T09:09:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ac9dac6b18da57622b33368527f02c0c4ad0f4d5",
"body": "…act (#156) (#167)\n\nCodifies the contract that #155 relies on so a future optimization cannot\nsilently fuse a multiply and add and change a downstream consumer's bits.\n\nDocumentation (f32 package doc): each floating-point operation is a single\nIEEE-754 rounded instruction; the elementwise scale/offs\n[…]\nen-add primitives are added.\n\nThe NaN behaviour of MinIdx/MaxIdx (the other #156 item) is already documented\non those functions (strict comparison, all-NaN returns 0), so no change there.\n\nCloses #156",
"is_bot": false,
"headline": "f32: document and asmcheck-enforce the single-rounding / no-FMA contr…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T08:41:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "df498ed7eef37fa06c9cf55abbed8f268089b7f6",
"body": "… AVX2) (#155) (#166)\n\nNew elementwise primitive, the int32 sibling of Float32ToInt16Scale for the\nfloat -> fixed-point boundary with caller-supplied bounds and an additive\noffset:\n\n dst[i] = int32(clamp(src[i]*scale + offset, minV, maxV)) // truncated toward zero\n\nThis is affine quantization /\n[…]\nth sweep through every\nresidue, clamp at both ends and inverted bounds, negative truncation, +/-Inf,\nNaN with bounds that exclude zero, the FMA detector, and a property fuzz\n(4.4M execs).\n\nCloses #155",
"is_bot": false,
"headline": "f32: add Float32ToInt32ScaleClamp fused affine-clamp-to-int32 (NEON +…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T08:26:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bcf7ddd5c1cd26d1bb5ac1ba93163f6eb6e83507",
"body": "… spellings) (#148) (#165)\n\nRecords the instruction-selection constraints that shape every hand-written\nkernel in the repo, so the knowledge lives somewhere durable rather than in\nscattered kernel comments and issue threads. Content:\n\n- Go's arm64 assembler rejects every integer vector multiply / mu\n[…]\nrify-by-disassembly-or-execution rule.\n\nEvery claim re-verified against go1.26 (unrecognized-instruction / illegal-\ncombination probes). Linked from CONTRIBUTING.md's Assembly Guidelines.\n\nCloses #148",
"is_bot": false,
"headline": "docs: add assembly-encoding reference (arm64 integer multiply, Plan 9…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T07:43:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8240931f987fd20cc14cd739d5ced01a3c92fadb",
"body": "…(#164)\n\ninterleave2AVX2 and deinterleave2AVX2 dropped from their 16-wide body\nstraight to a scalar MOVW tail, so a remainder of 8-15 pairs cost 8-15\nscalar iterations where the SSE2 sibling serves the same remainder in one\n8-wide block. The dispatcher routes len(a) >= 16 to AVX2, i.e. exactly\ninto \n[…]\n~12% wall-time either way); perf\ncounters show it is layout, not work (n=1000 retires fewer instructions\nyet takes more cycles). Pinning the loop is #159's separate remit.\n\nRefs #149, #160, #151, #159",
"is_bot": false,
"headline": "i16: add 8-wide AVX2 block to interleave2/deinterleave2 tails (#149) …",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T07:13:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1788a51bdc9b36944899cfc2eece756a2e662313",
"body": "…58) (#163)\n\nThe bench:* and test:f32/f64 tasks targeted ./pkg/simd/f32 and\n./pkg/simd/f64, a layout the repo moved away from; the packages live at\nthe module root (./f32, ./f64, ...). Every one of those tasks failed\nimmediately with \"directory not found\", which matters now that\nbenchmarks are the o\n[…]\nng the full verbose test suite each time\n\nbench:compare's imports are Go import paths (github.com/tphakala/simd/f32),\nnot filesystem paths, so they were already correct and are untouched.\n\nCloses #158",
"is_bot": false,
"headline": "fix: repoint Taskfile bench/test tasks at the real package layout (#1…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-18T06:48:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6352e48888d96bb09d68cc8dd8548a15fe2663bc",
"body": "The intro type list omitted int8 even though the i8 package has its own\nsection below; the \"80+ operations\" claim predates the i8 package and\nthe i16/i32 DSP and f32 argmin additions (the exported surface is past\n150 distinct operations); the f32/f64 function counts in the performance\nsummary were s\n[…]\ne AMD64 tier list omitted the\nAVX-without-FMA tier that the feature list and tier table both document.\nPer-package operation tables were audited against go doc and are\naccurate, so they are untouched.",
"is_bot": false,
"headline": "docs: refresh stale README claims found by a full API audit",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-17T19:54:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4344eaea946eacd36b328e2fde07e6421dcd2d31",
"body": "…in) with NEON and AVX2 kernels (#162)\n\n* f32: document and test the MinIdx/MaxIdx tie-break and NaN contract\n\nStrict comparison means first-index-wins on ties and NaN never displaces\nthe incumbent (all-NaN input returns 0). Pin both properties with docs\nand characterization tests before any argmin \n[…]\nree at zero tolerance while the local baseline hid\nthese among pre-existing noise. Naming (idx, val) also matches the\nsignature issue #152 proposed. Pure rename, no behavioral change.\n\nRefs #152, #154",
"is_bot": false,
"headline": "f32: add MinIdxOfSum and MinIdxOfSumRows (batched sliding-window argm…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-17T19:44:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fd87f604866918de57e99850b44619e13f31b620",
"body": "… (#160)\n\n* i16: fix dotAVX2's scalar tail (8-wide block before the 16-wide loop)\n\ndotAVX2 dropped from its 16-wide body straight to a scalar tail, so a remainder\nof 8-15 elements cost 8-15 iterations on a serial ADDL chain, where dotSSE2\nserved the same remainder in one 8-wide block. Because dotI16\n[…]\nk with a short tail, which is exactly the combination the sweep exists to\nreach. Saying only that the range covers every residue records the what and\ndrops the why.\n\nNo behaviour change; comment only.",
"is_bot": false,
"headline": "i16: fix dotAVX2's scalar tail (8-wide block before the 16-wide loop)…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-17T13:33:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8cfba611127829eb8474727f93b189fe15162d94",
"body": "* i16/i32: add tier-3 integer DSP ops (Sum, Abs, MaxAbs, MulQ15)\n\nFinal part of the #142 stack, after DotProduct (#143) and XCorr (#146).\nAdds the fixed-point primitives the integer DSP path still lacked:\n\n i16.Abs(dst, a) wrapping |x|\n i16.MaxAbs(a) int headroom probe\n i16.MulQ15(dst\n[…]\nan out-of-bounds read rather than observing a\npoisoned one. The kernel-direct AVX2 sibling already sized its slack to a\nfull block; this brings the portable test in line.\n\nReported by Copilot on #157.",
"is_bot": false,
"headline": "i16/i32: add tier-3 integer DSP ops (Sum, Abs, MaxAbs, MulQ15) (#157)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-17T11:46:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "acfc843daa5c063dc849b382388e3bdd9063f9c5",
"body": "…) (#151)\n\n* i16: fix xcorr4AVX2 scalar tail (8-wide block before the 16-wide loop)\n\nxcorr4AVX2 dropped from its 16-wide body straight to a 4-lag scalar tail, so\na remainder of 8-15 elements cost 8-15 scalar iterations times four lags,\nwhere xcorr4SSE2 served the same remainder in a single 8-wide bl\n[…]\ntness round: #149 (dotAVX2 has this same\nsawtooth, measured at 1.41x slower than SSE2 at n=24, and the NEON sibling\nalready has the fix) and #150 (AVX-VNNI, a 4-wide block, a VPHADDD fold).\n\nRefs #145",
"is_bot": false,
"headline": "i16: fix xcorr4AVX2 scalar tail (8-wide block before the 16-wide loop…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-17T07:03:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1c86cc96f073adc88d56be3404f0e2a888d9dbc4",
"body": "* i16: add XCorr (multi-lag widening cross-correlation)\n\nCross-correlation evaluates a dot product at every lag, and the naive\nshape re-reads x once per lag. XCorr instead loads x once and\nmultiply-accumulates it against four overlapping y windows at element\noffsets 0/1/2/3, which is the libopus xco\n[…]\ns left untouched\"\ncontract true on those paths. The test drives them directly with the\ndegenerate inputs the public API never delivers, and removing the guard\nmakes it fail.\n\nxcorrLags is now at 100%.",
"is_bot": false,
"headline": "i16: add XCorr (multi-lag widening cross-correlation) (#146)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-16T14:37:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8adb575f99c79f56ab87815ab0e970051f95f5c2",
"body": "* i16: add widening DotProduct (int16 x int16 -> int32)\n\nFixed-point DSP (Opus/CELT, SILK, FLAC LPC) needs a widening integer\nmultiply-accumulate, and the integer packages had no equivalent of\nf32.DotProduct. This adds the primitive for int16 inputs accumulating\ninto int32.\n\nAccumulation wraps rathe\n[…]\n- The README example called DotProduct(samples, coeffs) while\n declaring left and right, so the snippet did not compile. It uses\n the variables it declares now, verified by building it verbatim.",
"is_bot": false,
"headline": "i16: add widening DotProduct (int16 x int16 -> int32) (#143)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-07-16T12:48:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4594d86456915a94d60861a1f2a79d43c542a5a6",
"body": "…speedup) (#140)\n\n* f64: route ConvolveValidMaxAbs through dispatch (prep for fused kernel)\n\nMoves the Go-level fusion behind a convolveValidMaxAbsImpl function pointer so\na dedicated fused kernel can supersede it per backend. The fallback still loops\nover the dispatched dotProduct, so it stays bit-\n[…]\nre to validate (none\navailable), so the AVX-512 tier keeps the Go-level fusion over the dispatched\n16/8-wide dotProduct, which stays bit-exact. AVX2/AVX/SSE/NEON keep the fused\nkernel and its speedup.",
"is_bot": false,
"headline": "f64/f32: dedicated fused ConvolveValidMaxAbs kernels (peak-detection …",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-14T12:59:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3ab23dffe55310667c333f48e93208bdfc7b6166",
"body": "…ion) (#139)\n\n* docs: design spec for MaxAbs + fused ConvolveValid+MaxAbs (f64/f32)\n\nDesign for tphakala/simd#138: add MaxAbs infinity-norm reduction and the\nfused ConvolveValidMaxAbs / ConvolveValidMaxAbsMulti peak-detection helpers\nto the f64 and f32 packages.\n\n* docs: implementation plan for MaxA\n[…]\nsed path and ConvolveValid share the dispatched dotProduct, so the peak\nis bit-identical to max|ConvolveValid output|; drop the unnecessary tolerance\nto match the f32 test (CodeRabbit review on #139).",
"is_bot": false,
"headline": "f64/f32: add MaxAbs and fused ConvolveValidMaxAbs[Multi] (peak detect…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-14T11:50:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fb00cd956a4a7ed1c2bb5d7ffcf386bd6838e240",
"body": "* feat(i8): add SumAbs (L1 norm) and SAD (sum of abs differences) (AVX2)\n\nSumAbs reduces sum|a[i]| via VPABSB + VPSADBW-against-zero. SAD reduces\nsum|a[i]-b[i]| via PSADBW after offsetting both operands by 128 (XOR\n0x80, mask built in-register), giving the true unsaturated |a-b|. Both\naccumulate int\n[…]\n trick needed. New WORD\nencodings cross-checked against arm64asm; verified natively on aarch64\n(rpi5).\n\n* test(i8): differential fuzz and benchmarks for SumAbs/SAD\n\n* docs(i8): document SumAbs and SAD",
"is_bot": false,
"headline": "i8: add SumAbs (L1 norm) and SAD (sum of absolute differences) (#136)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T17:40:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f327800f0b5d8167e0ffcbfdda48260b009c6303",
"body": "* feat(i8): add AddScalarSaturate/SubScalarSaturate (AVX2)\n\nBroadcast a scalar and apply signed saturating add/subtract, completing\nthe saturating-arithmetic family alongside AddSaturate/SubSaturate.\nVPBROADCASTB + VPADDSB/VPSUBSB on AVX2; references reuse clampI8.\n\n* feat(i8): NEON kernels for AddS\n[…]\nubScalarSaturate\n\n* chore(i8): drop implementation plan doc from the PR\n\nScratch task list; the repo tracks committed design under\ndocs/superpowers/specs/. Also removes the leaked template-tag footer.",
"is_bot": false,
"headline": "i8: add AddScalarSaturate and SubScalarSaturate (#135)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T17:34:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4f60a22ac65196eec6504c37869392b20912d321",
"body": "* feat(i8): add MaxAbs and AbsDiff (AVX2)\n\nMaxAbs returns max|a[i]| as int (range [0,128]) for dynamic-quantization\nscale: VPABSB + unsigned VPMAXUB reduction. AbsDiff writes saturating\n|a-b| clamped to [0,127] via max(sat(a-b), sat(b-a)). Pure-Go references\nare the source of truth; parity, zero-all\n[…]\nxAbs and AbsDiff\n\n* chore(i8): drop implementation plan doc from the PR\n\nScratch task list; the repo tracks committed design under\ndocs/superpowers/specs/. Also removes the leaked template-tag footer.",
"is_bot": false,
"headline": "i8: add MaxAbs and AbsDiff (abs-max + saturating abs-diff) (#137)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T17:27:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e10da8d97b10d0e5d06315d6ed4ef8ca7f6b0e41",
"body": "* feat(i8): add Min/Max/Clamp/Abs/Neg element-wise primitives (AVX2)\n\nTier 2 element-wise group from #132: signed two-slice Min/Max, scalar\nClamp, and saturating Abs/Neg (abs(-128)=neg(-128)=127). Pure-Go\nreferences are the source of truth; AVX2 kernels (VPMINSB/VPMAXSB,\nVPBROADCASTB clamp, VPSUBSB-\n[…]\nrom the PR\n\ndocs/superpowers/plans/ holds scratch task lists, not committed docs (the\nrepo tracks design under docs/superpowers/specs/). Also removes the\nleaked template-tag footer CodeRabbit flagged.",
"is_bot": false,
"headline": "i8: add Min/Max/Clamp/Abs/Neg element-wise primitives (#133)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T17:18:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2f9e368382704d73bbb93f4bc17ab1b6d93b4b7e",
"body": "…ng) (#131)\n\n* docs: i8 int8 primitives v1 design spec\n\n* i8: add int8 SIMD package (saturating arith, int32 reductions, widening)\n\nIntroduce the i8 package with seven high-impact int8 primitives, mirroring the\ni16/i32 package structure (pure-Go reference, AVX2 amd64 kernels, NEON arm64\nkernels, par\n[…]\nlow (3) and above (35) the\nSIMD dispatch thresholds, so the assembly kernels and their scalar tails are\nexercised for the leave-trailing-dst-untouched contract, not just the pure-Go\nfallback (Gemini).",
"is_bot": false,
"headline": "i8: add int8 SIMD package (saturating arith, int32 reductions, wideni…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T15:23:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "18ee77998af2c8294c3e4fe570af043911475f2a",
"body": "Removes the FLAC-specific i32 kernels (fixed predictors, quantized-LPC residual/restore, mid/side decorrelation, Rice cost search) now owned in-tree by go-flac (tphakala/go-flac#27), keeping the generic int32 ops (Add, Sub, Interleave2, Deinterleave2, MinMax). Promotes the asm-verification harness to a public asmcheck package and drops FLAC-codec framing from the i32/crc docs.\n\nCloses #125",
"is_bot": false,
"headline": "i32: remove FLAC-specific kernels, keep generic int32 ops (#130)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T14:05:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe9f67f556aa3dacc1188102be83799344c9edb0",
"body": "…ims (#129)\n\n* docs: re-measure README benchmarks and correct overstated speedup claims\n\nRe-ran every benchmark table on consistent hardware (Intel Core i7-1260P,\nAVX+FMA for amd64; Raspberry Pi 5 Cortex-A76 NEON for arm64, both pinned to the\nperformance governor) and refreshed the numbers across f3\n[…]\n\ndisplayed nanoseconds are rounded to whole ns while the speedup column is\ncomputed from the raw timings, so recomputing speedup from the rounded ns can\ndiffer slightly.\n\nNo benchmark numbers changed.",
"is_bot": false,
"headline": "docs: re-measure README benchmarks and correct overstated speedup cla…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T13:23:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "86a9ec741b5ac5628844c9420ffa544159696f77",
"body": "…t (#128)\n\nFollow-up to #126. The exported STFT doc still described the old center=false /\npre-pad-yourself behavior; document the pad argument instead (NoPad vs\nPadZero/PadReflect centering). Also add a test-local refReflectIndex so the\ncentered reference and fuzz target no longer share the production reflectIndex\nmapping, matching the f32 package (#127).\n\nDoc/test only; no functional change. Refs #108.",
"is_bot": false,
"headline": "f64: fix stale STFT doc comment and make reference reflect independen…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T13:06:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "10ead3c22125a6c32f71042b8303e77f5328fa46",
"body": "…(#127)\n\n* f32: add center=true framing, flat power output, and librosa parity to STFT\n\nMirror of the f64 STFT work (#126) for the float32 package: an explicit PadMode\n(NoPad/PadZero/PadReflect) so STFT/STFTPower can use librosa-style center=true\nframing, an exported NumFrames helper, and STFTPowerI\n[…]\nect reference independent of production: add a test-local\n refReflectIndexF32 so the centered reference and fuzz target no longer share\n the production reflectIndex mapping (CodeRabbit).\n\nRefs #108.",
"is_bot": false,
"headline": "f32: STFT center=true framing, flat power output, and librosa parity …",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T12:57:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1efe50f5c5bd16884fe866a5021246af027d26f7",
"body": "…(#126)\n\n* chore: gitignore .codegraph/ and .venv-librosa/ tooling dirs\n\n* test: add librosa 0.11.0 STFT power golden vector and generator\n\n* f64: add center=true framing, flat power output, and librosa parity to STFT\n\nAdds an explicit PadMode (NoPad/PadZero/PadReflect) so STFT/STFTPower can use\nlib\n[…]\n for the centered complex STFT path (CodeRabbit).\n- Add TestSTFTGuards covering the zero-frame and short-window fallbacks, taking\n STFT/STFTPower/STFTPowerInto to 100% statement coverage.\n\nRefs #108.",
"is_bot": false,
"headline": "f64: STFT center=true framing, flat power output, and librosa parity …",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-13T12:28:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ed059377584bf767927fa70f9919de6a6fbdebb3",
"body": "… (#124)\n\n* f32: add SIMD Log, Log2, Log10, Pow, PowElem kernels (AVX2+FMA, NEON)\n\nVectorize the f32 transcendental log/pow family from #119, completing\nissue #109 (the f64 half landed separately).\n\nAlgorithm: the same x = m*2^e integer reduction as the f64 kernels\n(offset 0x3f350000, arithmetic shi\n[…]\ntly to memory\n\nAddress review feedback: the NaN/Inf special blocks in the logAVX\nscalar tail stored 32-bit immediates through AX; MOVL imm32 can write\nmemory directly, saving an instruction per block.",
"is_bot": false,
"headline": "f32: add SIMD Log, Log2, Log10, Pow, PowElem kernels (AVX2+FMA, NEON)…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T16:59:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b3e5b09bda6310362239f9b5f79a1852be40aea7",
"body": "… (#123)\n\n* f64: add SIMD Log, Log2, Log10, Pow, PowElem kernels (AVX2+FMA, NEON)\n\nVectorize the f64 transcendental log/pow family from #119 (f64 half of\nissue #109; f32 follows separately).\n\nAlgorithm: one shared log core computes x = m*2^e via the musl/ARM\noptimized-routines integer reduction (no \n[…]\nedback: refLn64 and the accuracy sweeps now reference\nthe package's dblMinNormal64 constant instead of repeating the literal,\nand TestLogLengths compares against refLn64 like the other accuracy\ntests.",
"is_bot": false,
"headline": "f64: add SIMD Log, Log2, Log10, Pow, PowElem kernels (AVX2+FMA, NEON)…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T16:37:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3681b44605c1557f84905eee3d8b14906adb14bc",
"body": "* f32: add fused real-input STFT primitive (STFTPlan) (#108)\n\nPorts the f64 STFTPlan landed in #120 to float32, giving the f32 package the\nsame fused, real-input Short-Time Fourier Transform: a reusable plan with\nresident twiddle and bit-reversal tables, batched hop-spaced framing, a fused\nanalysis-\n[…]\n\nMirror both changes in f64 to keep the two implementations in lockstep.\n\nBenchmarkSTFT (f32, 16 kHz/1024/512) improves about 12 percent\n(1.40 ms/op to 1.23 ms/op) from removing the integer divisions.",
"is_bot": false,
"headline": "f32: add fused real-input STFT primitive (STFTPlan) (#108) (#122)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T16:37:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b43c32eb4e6838e27814ded6e99782f0355fa204",
"body": "* test: differential fuzzing for c64, c128, i16, f16 (#101)\n\nCompletes the differential-fuzz coverage started in #118 (f32, f64, i32,\ncrc) by adding fuzz_test.go to the remaining packages. Each target runs the\ndispatched SIMD op and its pure-Go reference over fuzzer-chosen lengths and\nasserts they a\n[…]\nmment that still described low-payload NaNs\ncollapsing to infinity. Since fromFloat32Go forces the quiet bit,\nthose inputs now stay NaN and are handled by the NaN branch, not the\nbit-exact comparison.",
"is_bot": false,
"headline": "test: differential fuzzing for c64, c128, i16, f16 (#101) (#121)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T16:37:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "47454b6b09963178c0c891f733fde62eb06a6d69",
"body": "* f64: add fused real-input STFT primitive (STFTPlan)\n\nAdd a fused, real-input short-time Fourier transform so spectral feature\npipelines (mel-spectrogram, PCEN, log-mel front-ends for audio ML) can stay on\nthe fast path end to end. The library already covered everything around the\ntransform (c128.A\n[…]\nn STFT benchmarks (golangci-lint modernize/bloop)\n\nCI's golangci-lint flags the for-range-b.N benchmark loops; switch to the\nGo 1.24 b.Loop() form, which also makes the b.ResetTimer() calls redundant.",
"is_bot": false,
"headline": "f64: add fused real-input STFT primitive (STFTPlan) (#120)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T13:35:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "75c92ad1a87bf5749304a48586b111ac268a36ee",
"body": "…ollow) (#119)\n\n* test: differential fuzzing of SIMD paths against the Go references\n\nThe parity tests use fixed lengths and curated values; the dominant SIMD bug\nclass is tail/remainder handling at arbitrary lengths (unroll-boundary\noff-by-ones). Go native fuzzing closes that gap cheaply, and the s\n[…]\ny\nover a wide magnitude range, in-place variants, length clamping, and\nzero-allocation; validated on amd64 and a Raspberry Pi 5 (arm64).\n\nAddresses #109 (API + scalar; AVX2/NEON Log kernel to follow).",
"is_bot": false,
"headline": "f32/f64: add Log, Log2, Log10, Pow, PowElem (scalar; SIMD kernel to f…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T13:35:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e3e752435e30a400fa7b7da94f029646f30a2645",
"body": "…#116)\n\n* docs: per-package amd64 tiers, SVE-detected-but-unused, scope notes\n\nSeveral documentation claims disagreed with each other or with the dispatch\ncode. None changed behavior, but they misled users evaluating the library.\n\n- README/doc.go claimed a single amd64 baseline (SSE4.1 in README, SS\n[…]\no.go behind //go:build arm64 so both\nplatform builds share one implementation.\n\nVerified on a Raspberry Pi 5 (linux/arm64): TestCpuInfoAllBranches and TestInfo\npass; darwin/arm64 cross-build is green.",
"is_bot": false,
"headline": "docs: per-package amd64 tiers, SVE-detected-but-unused, scope notes (…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T13:34:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0fe0a6ddc00ab18eec87d972292fd71aa058a351",
"body": "* cpu: SIMD_DISABLE=avx now also masks F16C\n\nF16C is VEX-encoded and only detected when AVX is present (X86.AVX && CPUID\nleaf 1 ECX bit 29), but applyDisable's avx cascade (clearAVX) left F16C set.\nAfter SIMD_DISABLE=avx, cpu.HasF16C() stayed true and the f16 package kept\nusing the VEX-encoded VCVTP\n[…]\nle accordingly.\n\nCloses #114\n\n* cpu: rewrap clearAVX F16C comment for readability\n\nAddress review feedback: keep the avx2/fma/avx512 list on one line instead of\nsplitting it mid-token across the wrap.",
"is_bot": false,
"headline": "cpu: SIMD_DISABLE=avx now also masks F16C (#115)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T13:34:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "47189771b94f99b91d9c0c6b956a490eddddc101",
"body": "…118)\n\nThe parity tests use fixed lengths and curated values; the dominant SIMD bug\nclass is tail/remainder handling at arbitrary lengths (unroll-boundary\noff-by-ones). Go native fuzzing closes that gap cheaply, and the seed corpus\nruns as a normal test under go test (no -fuzz needed) in CI.\n\nAdds f\n[…]\nd on a Raspberry Pi 5 (NEON) for the float, LPC, Rice, and crc paths.\nDocuments the fuzz invocation in CONTRIBUTING.md.\n\nAddresses #101 (priority packages f32/f64/i32/crc; c64/c128/i16/f16 to follow).",
"is_bot": false,
"headline": "test: differential fuzzing of SIMD paths against the Go references (#…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T13:33:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a80115974b06e01ea901d5045d000f8bbffadc70",
"body": "The test matrix covered arm64 only via macos-latest (Apple Silicon), which\nexercises the darwin detection override (cpu_arm64_darwin.go hardcodes\nFP16/PMULL) rather than the linux/arm64 detection path in cpu_arm64.go that the\nRaspberry Pi regression hosts and most deployment targets actually run, an\n[…]\n host (Raspberry Pi 5): go test ./... with\nSIMD_REQUIRE_OBJDUMP=1 passes for every package via the host objdump, and\ncpu.Info() reports \"ARM64 NEON+FP16\" through the linux detection path.\n\nCloses #100",
"is_bot": false,
"headline": "ci: add native Linux arm64 test job (ubuntu-24.04-arm) (#117)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T13:33:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fcae31d2ac138c9357185252036a25dda995f478",
"body": "Sync the README with the six merged feature PRs (#106, #107, #110, #111,\n#112, #113). The f16 F16C work (#110) did not touch the README, so:\n- the ToFloat32Slice/FromFloat32Slice rows now show the F16C amd64 width\n alongside the NEON width;\n- the f16 section intro and the architecture-support table\n[…]\nFeatures list gains the F16C-conversion note and a SIMD_DISABLE bullet.\nThe c64/c128 dot products, f32 stats kernels, f64 NEON batch, and f32 N=6/8\ninterleave rows were already added by their own PRs.",
"is_bot": false,
"headline": "docs: reflect merged f16 F16C, SIMD_DISABLE, and complex/interleave work",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T12:09:44Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "13468f70dfcfd6b6416d8591c0d685bb206c8989",
"body": "…ence (#110)\n\namd64 had no f16 assembly: every op ran the pure-Go reference. Native FP16\narithmetic needs AVX512-FP16 (Sapphire Rapids and newer, no AMD support), but\nF16C (VCVTPH2PS / VCVTPS2PH half<->single conversion) has shipped on every\nAVX2-capable x86 since 2012. This accelerates the two slic\n[…]\neep (run\nlocally) found no further differences.\n\nVerified on amd64 (i7-1260P, F16C) and arm64 (Raspberry Pi 5, NEON). go test\n./..., go vet, golangci-lint, and all cross-arch builds clean.\n\nCloses #98",
"is_bot": false,
"headline": "f16: add amd64 F16C conversion kernels; fix denormal bug in the refer…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T12:07:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "43584251e6a674c5d8d71075d9faa0ca1b904654",
"body": "… f32 #71) (#112)\n\n* f64: add NEON batch-of-4 kernel for DotProductBatch on ARM64\n\nf64 DotProductBatch on ARM64 scored rows one at a time, reloading the query\nvector for every row. This adds the f64 NEON batch-of-4 kernel (parity with\nthe f32 #71 path), ported from the f32 .4S kernel to .2D: two flo\n[…]\ni 5's out-of-order Cortex-A76 (within\n benchmark noise) but the cleaner form and a win on in-order cores.\n- Add an AllocsPerRun == 0 assertion for dotProduct4NEON to the kernel test\n (coderabbitai).",
"is_bot": false,
"headline": "f64: NEON batch-of-4 kernel for DotProductBatch on ARM64 (parity with…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T11:59:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "79f61187ffc9ffc91b23ca06015b456481c93fd9",
"body": "* f32: add amd64 SSE/AVX kernels for Variance and EuclideanDistance\n\nvariance32 and euclideanDistance32 fell back unconditionally to the pure-Go\nreferences on amd64, even though f64 ships the full kernel set and f32 on\nARM64 already has varianceNEON32/euclideanDistanceNEON32. This ports the f64\nkern\n[…]\nccumulators with a 2-deep tree (Y0+=Y3; Y4+=Y5; Y0+=Y4) instead of the\n3-deep sequential chain, matching varianceAVX and euclideanDistanceSSE and\nshortening the dependency chain by one VADDPS latency.",
"is_bot": false,
"headline": "f32: add amd64 SSE/AVX kernels for Variance and EuclideanDistance (#107)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T11:59:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "618baa58162cf03e1c5917041e149758171d9f75",
"body": "AMD64 covered N=2,3,4,6,8 for f32 InterleaveN/DeinterleaveN while ARM64 NEON\nonly covered N=2,3,4; N>=5 fell back to the generic Go path. This adds N=6\n(5.1 audio) and N=8 (7.1 audio) NEON kernels via the pair trick: ZIP adjacent\nchannel pairs at .4S so each 64-bit lane holds a [cA_i, cB_i] frame pa\n[…]\n round-trip, and asserts the\npublic dispatch stays allocation-free.\n\nVerified on the Raspberry Pi 5; asmcheck clean. README audio interleave note\nupdated from N=2,3,4 to N=2,3,4,6,8 NEON.\n\nCloses #103",
"is_bot": false,
"headline": "f32: ARM64 NEON InterleaveN/DeinterleaveN for N=6 and N=8 (#113)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T11:59:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bf7b8ec2333961909b647c89168e0a2f0ca48534",
"body": "c64 and c128 had only element-wise ops, so a complex dot product needed a\nMul into scratch plus a manual sum: an extra memory pass and scratch storage\nin user code. DotProduct (sum a[i]*b[i]) and DotProductConj (sum\na[i]*conj(b[i])) add the reductions directly. DotProductConj is the standard\nHermiti\n[…]\nj\n4.6x; c128 DotProduct 2.1x over pure Go.\n\nVerified on amd64 (SSE and AVX tested directly) and arm64 (Raspberry Pi 5,\nNEON). go test ./..., go vet, golangci-lint, and asmcheck all clean.\n\nCloses #104",
"is_bot": false,
"headline": "c64/c128: add DotProduct and DotProductConj reductions (#111)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T11:59:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3427aadbfdfad20e8d8ad55210be54781a819d60",
"body": "* cpu: add SIMD_DISABLE env var to disable feature tiers at startup\n\nSIMD_DISABLE is a comma-separated, case-insensitive list of tokens read\nonce during cpu package init. Each token clears its own feature flag plus\nevery flag that depends on it, so the resulting Features value never\ndescribes an imp\n[…]\nkernels at\n init (function pointers on amd64, capability flags on arm64) rather than\n attributing the runtime constraint to amd64 only; arm64 freezes its hasNEON\n flags the same way (coderabbitai).",
"is_bot": false,
"headline": "cpu: add SIMD_DISABLE env var to disable feature tiers at startup (#106)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-10T11:58:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bc1f98489a20af3b37421e5ce869b59c05f63934",
"body": "New crc package providing the FLAC CRC-16 (polynomial 0x8005, init 0,\nMSB-first, no reflection). Checksum16 folds the bulk of the buffer 16\nbytes at a time with a carry-less-multiply kernel and finishes with the\nexisting scalar slice-by-16 reduction.\n\nThe fold keeps a 128-bit accumulator congruent t\n[…]\n6) 1.2 -> 4.2 GB/s (3.5x). Bit-identical to the scalar\nreference, zero allocations, verified on both architectures.\n\ncpu: add PCLMULQDQ (amd64) and PMULL (arm64) feature detection to gate\nthe kernels.",
"is_bot": false,
"headline": "crc: add Checksum16 with PCLMULQDQ/PMULL carry-less-multiply fold (#95)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-05T16:36:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "024f36dff1f978cb1f304568b75ac74a65962b6d",
"body": "… (#94)\n\nThe build matrix only covered {linux,darwin,windows} x {amd64,arm64}, so it\nnever compiled the `!amd64 && !arm64` pure-Go fallbacks in c64/c128/f32/f64/\ni16/i32. A primitive added to the SIMD dispatch but forgotten in the fallback\n(the c128 break fixed in #93) builds green on amd64/arm64 an\n[…]\nbuild with `undefined: conj128`.\n\nAlso set fail-fast: false on the build job to match the test and vet jobs, so\na fallback break reports every affected arch instead of cancelling siblings.\n\nCloses #94",
"is_bot": false,
"headline": "ci: build non-SIMD arch (riscv64, wasm) to guard *_other.go fallbacks…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-05T14:58:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "48376da2f8df3c8005535ef83a664f9a3584fcbd",
"body": "* f32: add Round, a round-half-away-from-zero kernel for f64 parity\n\nf32 advertised \"Same API as f64\" but was missing Round, which f64 has\nexposed. This adds the float32 Round so the parity claim holds.\n\nThe kernels mirror f64's Round exactly:\n- AMD64 (AVX/AVX-512): VROUNDPS truncate plus a manual h\n[…]\nhe\npure-Go round32Go reference (its loop and the len(dst)==0 / BCE-hint bounds\nlines) uncovered in CI patch coverage. Add direct round32Go tests mirroring\nf64's TestRound64Go / TestRound64Go_EmptyDst.",
"is_bot": false,
"headline": "f32: add Round; c128: add FromReal (f64/c64 API parity) (#93)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-05T14:38:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0f3146b71d4a5d0a2c6fa04f9dfe1ddff71051db",
"body": "The f32 package is documented as having the same API as f64, but three\ngeneral-purpose primitives were missing. Add them, composed from kernels f32\nalready dispatches so there is no new assembly:\n\n- WeightedSum(weights, src) = Σ weights[i]·src[i], a thin wrapper over the\n existing dotProduct kernel\n[…]\nss SIMD body and scalar tail, a pure-Go\nreference check, and a zero-allocation assertion). Verified on amd64 (full f32\nsuite, go vet, golangci-lint) and cross-built for arm64 and the generic\nfallback.",
"is_bot": false,
"headline": "f32: add WeightedSum, SumOfSquares, SubFromScalar for f64 parity (#92)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-05T14:09:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "db428f585a27768846ae08c0060d2e1461a71905",
"body": "…ions out of f64 table\n\nAdds the two primitives landed in #90 (f64.Autocorrelate) and #91 (i32.MinMax)\nto the README: function-table rows, prose, and benchmark figures (AVX2/NEON\nspeedups from the PR runs). Also relocates the three PCM-conversion functions\n(Int32ToFloat32Scale, Int16ToFloat32Scale, Float32ToInt16Scale) from the f64\ntable into a dedicated f32 section, since they are f32-only and have no f64\nequivalent.",
"is_bot": false,
"headline": "docs: document f64.Autocorrelate and i32.MinMax; move f32 PCM convers…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-05T13:43:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "644e3e9c3c5f351b5df8c5a9e4adec724ee3fffa",
"body": "* i32: add MinMax, a signed int32 per-slice min/max reduction kernel\n\nMinMax(res []int32) (minVal, maxVal int32) returns the smallest and\nlargest int32 in res in a single pass. It is the reduction the go-flac\nRice planner runs per finest partition to find each partition's\nlargest-magnitude residual \n[…]\non now does zero loop\niterations instead of one. Output is unchanged (min/max is exact);\namd64 1000-int32 benchmark 47.1 -> 42.6 ns/op. Re-validated on amd64\n(AVX2) and natively on arm64 (NEON, Pi 5).",
"is_bot": false,
"headline": "i32: add MinMax, a signed int32 per-slice min/max reduction kernel (#91)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-05T13:00:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d4ae64c046f6ecf8e0f7b7c51eb9721426c15dbf",
"body": "…rnel (#90)\n\nAdds f64.Autocorrelate(autoc, x, maxLag), the LPC autocorrelation step used\nby FLAC-style encoders:\n\n autoc[lag] = sum x[i]*x[i-lag] for i in lag..len(x)-1\n\nThe kernels vectorize ACROSS lags (one accumulator lane per lag) rather than\nacross samples, so each lag's sum is accumulated i\n[…]\n(AVX2) and arm64 (NEON, native rpi5). New WORD encodings\npass the asmcheck cross-check (strict objdump mode). Kernel speedup over the\nGo fallback: amd64 2.9x-3.5x, arm64 2.4x-2.7x (n=4096, lag 8..32).",
"is_bot": false,
"headline": "f64: add Autocorrelate, a bit-exact lag-vectorized autocorrelation ke…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-05T07:01:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3c4feb46c8f7f5b194f58473adf4b3dfe708fcad",
"body": "* i32: add ZigzagSum, FixedAbsSums, and widen RiceSums to k=0..30\n\nThree SIMD primitives for the FLAC encoder estimate path, each bit-identical to\nits pure-Go reference across AVX2, NEON, and the scalar fallback (verified with\nGODEBUG=cpu.avx2=off parity tests), zero-allocation.\n\n- ZigzagSum(res): t\n[…]\nm+1], and\nthe result is bit-identical (riceSumsWideI32 == riceSumsGo). Refresh the stale\nriceMaxParam5 comment and extend TestRiceAllocFree to cover the 5-bit width on\nboth RiceSums and RiceBestParam.",
"is_bot": false,
"headline": "i32: add ZigzagSum, FixedAbsSums, and widen RiceSums to k=0..30 (#89)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-04T21:05:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "aab9af86e04b06131c78ede9500e64bbed83dcbe",
"body": "* c128: make SSE2 kernels use only SSE2 instructions (fix SIGILL on pre-SSE4.1 CPUs)\n\nThe c128 init switch dispatches the *SSE2 kernels on cpu.X86.SSE2 (the amd64\nbaseline), but five of them used post-SSE2 instructions:\n\n mulSSE2 / mulConjSSE2 / scaleSSE2 used BLENDPD (SSE4.1)\n absSSE2 / absSqSSE2\n[…]\n).\n- cross-isa CI job: detect no-test packages with go list and drop the\n '|| true' / stderr redirect so a genuine test-compile failure fails the job\n instead of being silently skipped (CodeRabbit).",
"is_bot": false,
"headline": "Fix non-AVX fallback paths (c128 SIGILL + f64 sigmoid accuracy) (#88)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-03T10:19:47Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "654c4b6352e1a7e3266b211f2e490e5c3cf631c1",
"body": "…n non-AVX CPUs (#87)\n\ninterleave2_32 / deinterleave2_32 dispatched straight to the VEX-encoded\ninterleave2AVX / deinterleave2AVX kernels based on slice length alone, with no\nCPU-feature check. On an amd64 CPU without AVX (e.g. Celeron 887) the first\nfloat32 resample executed an undecodable AVX inst\n[…]\n> scalar kernel, AVX -> SIMD kernel) so the bug is caught on AVX-capable CI\ntoo, plus a scalar round-trip parity check. Update the now-stale i32 comment\nthat referenced f32's old length-only dispatch.",
"is_bot": false,
"headline": "f32: select interleave2/deinterleave2 kernels at init to fix SIGILL o…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T21:17:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2908edef257263189be13693f666a5658075db17",
"body": null,
"is_bot": false,
"headline": "chore: gitignore agent and tooling caches (.claude, .serena, cache)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T19:01:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f1461549d8b2b1ffc7e86ad12390401bfa6292ec",
"body": null,
"is_bot": false,
"headline": "docs: document i16 package (Interleave2/Deinterleave2) in README",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T19:01:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5b47fbb50abc5fd11bf41a96db7d00b7faab911d",
"body": "* i32: AVX2/NEON Rice zigzag cost search (RiceSums / RiceBestParam)\n\nAdd the Rice parameter cost search, the last integer primitive the FLAC\ncodec needs (issue #79, PR8). This closes Phase 3 and the issue.\n\nRiceSums fills sums[k] = Σ_i (zigzag(res[i]) >> k) for k = 0..14, the\ndata-dependent part of \n[…]\nchmarks (1000 elements, vs pure Go, zero-alloc):\nRiceSums / RiceBestParam: 810 ns, 13.0x on amd64 AVX2;\n4090 ns, 4.2x on arm64 NEON (Pi 5).\n\n* i32: cover RiceSums wide (5-bit) parameter range in tests",
"is_bot": false,
"headline": "i32: AVX2/NEON Rice zigzag cost search (RiceSums / RiceBestParam) (#86)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T18:48:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7d93be6abbd58b4ca1ae9ba09d91de42bf950f43",
"body": "* i32: AVX2/NEON quantized-LPC residual encode and decode kernels\n\nImplements Phase 3 PR6 + PR7 of the integer-SIMD FLAC roadmap (#79),\nbatched because the encode FIR and decode recurrence share the\n(coeffs, shift) API shape and give an encode->decode round-trip test, the\nsame way Diff/Restore do.\n\n\n[…]\noth LPCResidualEncode and\nLPCRestore so all paths stay bit-exact, matching the package convention\nthat public functions reconcile inputs. Adds TestLPC_ShiftClamp.\n\nAddresses review feedback on PR #85.",
"is_bot": false,
"headline": "i32: AVX2/NEON quantized-LPC residual encode and decode kernels (#85)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T17:58:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "388f1c6ed660c49f9f7e665d85b25f055bf71c13",
"body": "…fix sum (#84)\n\n* i32: AVX2/NEON fixed-predictor decode Restore1..Restore4 via SIMD prefix sum\n\nAdds the decode-side fixed-predictor restoration kernels (PR5 of the\ninteger-SIMD FLAC roadmap, issue #79), the exact inverse of the Diff1..Diff4\nresidual kernels merged in #83.\n\nThe order-K fixed predict\n[…]\nd-predictor encode/decode pair (Diff1..Diff4 from\n#83, Restore1..Restore4 from this branch), plus a Diff/Restore round-trip in\nthe example and the measured Restore benchmarks in the performance table.",
"is_bot": false,
"headline": "i32: AVX2/NEON fixed-predictor decode Restore1..Restore4 via SIMD pre…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T16:42:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a21e1ceae9c3f115788f8c83193360b0c75d5c60",
"body": "Implements issue #79 PR3 (stereo decorrelation: Add, Sub, MidSideEncode,\nMidSideDecode) and PR4 (fixed-predictor encode residuals Diff1..Diff4), with\nAMD64 AVX2 and ARM64 NEON kernels plus a pure-Go fallback. Bit-exact parity,\nzero-alloc, asmcheck and round-trip tests; verified on amd64 (AVX2) and arm64\n(NEON, Raspberry Pi 5).\n\nRefs #79",
"is_bot": false,
"headline": "i32: AVX2/NEON decorrelation and fixed-predictor encode kernels (#83)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T15:45:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "68eddd02a3740c76b2ffb53e70371603db95407a",
"body": "* i16: new package with Interleave2/Deinterleave2 SIMD kernels (#79)\n\nAdd an i16 package providing Interleave2/Deinterleave2 on []int16 for\nsplitting and packing raw 16-bit interleaved stereo PCM before widening\nto int32 (PR2 of #79). It mirrors the i32 package conventions.\n\nAMD64 uses tiered dispat\n[…]\ns figure is accurate (ns/op and the\n reported speedup are unchanged).\n- the i16_arm64.s header comment said the scalar tails use MOVW; they use\n MOVH (16-bit). Correct the comment to match the code.",
"is_bot": false,
"headline": "i16: new package with Interleave2/Deinterleave2 SIMD kernels (#79) (#82)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T14:14:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3fa8fe2245d616fb089b32ce87b731669f48bdee",
"body": "Add the i32 package, the integer counterpart to f32/f64, to serve\ninteger-domain DSP hot loops (for example a pure-Go FLAC codec) where the\nper-sample work is integer arithmetic and channel (de)interleaving rather\nthan floating-point math. This is PR1 of the i32/i16 surface tracked in #79.\n\nInterlea\n[…]\nn arm64 (NEON) on a Raspberry Pi 5.\n\nBenchmarks (1000 elements, vs pure Go, zero-alloc):\n Interleave2: AMD64 121ns (4.0x), ARM64 322ns (5.2x)\n Deinterleave2: AMD64 228ns (2.1x), ARM64 322ns (5.2x)",
"is_bot": false,
"headline": "i32: new package with Interleave2/Deinterleave2 SIMD kernels (#81)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T13:31:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "908cd8433b586e38376d11cf46457a02d807e7ec",
"body": "* f32/f64: AMD64 AVX2 interleave/deinterleave kernels for N=6 (#60)\n\nAdds the N=6 InterleaveN/DeinterleaveN cells that previously fell back to the\ngeneric Go path on AMD64, completing the documented stream-count matrix (the\n8k -> 48k upsample). Six streams have no clean register transpose, so the\nke\n[…]\nngci-lint clean, no goroutine-register\nclobber. ARM64 keeps the Go fallback (cross-checked on a Pi 5: parity and\nzero-alloc hold).\n\n* docs: clarify f64 N=3/N=6 require AVX2, N=8 is AVX (PR #80 review)",
"is_bot": false,
"headline": "f32/f64: AMD64 AVX2 interleave/deinterleave kernels for N=6 (#60) (#80)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T13:00:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ce6218d7b625ddeee9ecc6904927269362e3602c",
"body": "Fill the f64 InterleaveN/DeinterleaveN stream counts that still fell back\nto the generic Go path on AMD64, bringing f64 up to the N=3/N=8 coverage\nf32 already has and that the README table already advertised for f64.\n\nN=3 (AVX2): per-stream immediate VPERMPD gathers merged with VBLENDPD, 4\nframes pe\n[…]\nning N=6 cells (f32 and f64) stay on the generic Go path: they\nneed gather/blend with no clean transpose, serve no documented hot path,\nand are left for a profiling-justified follow-up.\n\nAdvances #60.",
"is_bot": false,
"headline": "f64: AMD64 AVX interleave/deinterleave kernels for N=3 and N=8 (#78)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T12:20:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0fe1c3d2b5c3ca567a923815903faa5a2295d960",
"body": "…3 (#77)\n\n* f32: AMD64 AVX2 gather/blend kernels for InterleaveN/DeinterleaveN N=3 (#60)\n\nN=3 was the only documented x86 hot path (the 16k -> 48k upsample) still\nfalling back to the generic Go loop on AMD64, because 3 streams do not map\nonto a clean register transpose the way N=4 (4x4) and N=8 (8x8\n[…]\nVX2); N=2/4/8 use only baseline AVX. The summary\ntable lumped them together, which could mislead AVX1-only users (N=3 falls back\nto the generic Go loop there). Addresses Gemini review feedback on #77.",
"is_bot": false,
"headline": "f32: AMD64 AVX2 gather/blend kernels for InterleaveN/DeinterleaveN N=…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T11:37:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f25a044e7362e11c1c3acb251f897b956bb3798b",
"body": "* test(f32,f64,c64,c128): add vector-path SIMD-vs-Go parity tests (#45)\n\nAdd vector_path_test.go to each of f32, f64, c64 and c128 cross-checking every\nSIMD-dispatched public function against its pure-Go fallback over a length\nmatrix with non-multiples of the vector width, so the assembly main loop \n[…]\nnspects the 2*n-element packed buffer but passed\nn as the size label to the check helper, so a failure message would understate\nthe buffer length. Pass 2*n to match the buffer actually being compared.",
"is_bot": false,
"headline": "test: vector-path SIMD-vs-Go parity for f32/f64/c64/c128 (#45) (#76)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T11:09:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "49a1c3857f726b19502c015f4cc410849a007fc6",
"body": "f64 DotProductBatch gains AVX/AVX-512 batch-of-4 kernels (#70). f32 ARM64 gains a NEON 4-row dot kernel wired into DotProductIndexed/DotProductStrided (#65) and DotProductBatch (#71), with portable row-major scaffolding shared across arches. Profile-justified on both arches; parity, allocation-free, and asmcheck verified.",
"is_bot": false,
"headline": "f32/f64: batch-of-4 query-load-reuse dot kernels (#70, #65, #71)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T10:31:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7758f713221a3c32d0a604ac3271314e6ac31d25",
"body": "The AVX-512 kernels gate dispatch on AVX512F+AVX512VL but used several\ninstructions whose CPUID feature flag is actually AVX512DQ, a latent\ndependency that does not match the dispatch gate.\n\nVEXTRACTF32X8 -> VEXTRACTF64X4 (issue #67):\nFive reduction tails in f32 (dotProductAVX512, the sum/min/max ke\n[…]\n go build/vet/test ./... clean across all packages; objdump\nconfirms zero EVEX FP-logical or VEXTRACTF32X8 ops remain on ZMM, and the\nemitted VEXTRACTF64X4 is the W1 (AVX512F) encoding 62 f3 fd 48 1b.",
"is_bot": false,
"headline": "f32/f64/c64: drop latent AVX512DQ deps in AVX-512 kernels (#67) (#73)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T09:39:32Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ba0b832a6346bb03c22fd15d395446a6a39f319f",
"body": "* arm64: fix go vet asmdecl warnings in c64/c128/f16 NEON kernels\n\ngo vet's asmdecl analyzer only checks the host arch's assembly, so eight\nwarnings in the arm64 NEON kernels went unnoticed on amd64 CI hosts.\n\nCorrects six over-declared TEXT frame argsizes (c128 absNEON/absSqNEON\n$0-56 to $0-48, con\n[…]\nl jobs only check out code and run build/test/lint/vet, so a top-level\nread-only contents scope is sufficient. Resolves the zizmor\nexcessive-permissions finding on the new vet job (CodeRabbit review).",
"is_bot": false,
"headline": "arm64: fix go vet asmdecl warnings in c64/c128/f16 NEON kernels (#72)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T09:16:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6373da797dd2ce3574a0ea21c9f8653d67f498da",
"body": "* f32: extend dotProductBatch32 4x query-load reuse to AVX2/FMA\n\nPR #63 added a batch-of-4 query-load-reuse fast path to dotProductBatch32\n(the backend for DotProductBatch) but gated it only on AVX-512, so AVX2-only\nCPUs (most CI runners and a lot of production hardware) fell back to the\nper-row dot\n[…]\nhich gate the same\nkernel on AVX+FMA. Widen the gate so AVX1+FMA parts (e.g. AMD Piledriver/\nSteamroller/Excavator) take the fast path too, and update the kernel test gate\nand README wording to match.",
"is_bot": false,
"headline": "f32: extend dotProductBatch32 4x query-load reuse to AVX2/FMA (#69)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T08:47:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b2f6c470f115db38a2f3514038dbc5eb3a1c0250",
"body": "Add codecov.yml marking project and patch status informational and ignoring _test.go. This hand-written SIMD library dispatches through CPU-feature-gated branches, so on one CI runner only the matching ISA arm executes and the others stay uncovered, and the .s kernels are not measured at all. Keep coverage visible without ever blocking a PR. Validated by codecov's schema validator.",
"is_bot": false,
"headline": "ci: make codecov project/patch coverage informational (#68)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T08:26:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c2f5dec905892df9b399710d4fe1563b405e39d",
"body": null,
"is_bot": false,
"headline": "docs: set MIT license copyright holder to Tomi P. Hakala",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T08:25:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "544c2c698680d0daadf8b769fddbc1099d87d913",
"body": "…ctStrided) (#63)\n\nAdd two allocation-free public APIs that score rows of a flat row-major float32\nstore against a single query vector without building [][]float32:\n\n- DotProductIndexed(dst, base, query, rowIDs, dims): rows selected by uint32 ID.\n- DotProductStrided(dst, base, query, rowCount, dims,\n[…]\nF64X4 in the reduction, scalar test oracles). Follow-ups: #64 (AVX2 batch\nreuse), #65 (NEON kernels), #66 (threshold re-tuning), #67 (VEXTRACTF32X8 cleanup).\n\nCo-authored-by: Mikers <snissn@gmail.com>",
"is_bot": false,
"headline": "f32: add row-major batch dot product APIs (DotProductIndexed/DotProdu…",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T08:21:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c903df571e8b1fb532b4bce79c4a76b304ce5fba",
"body": "* f32: stop using R14 (goroutine g) as scratch in realFFTUnpackAVX\n\nrealFFTUnpackAVX used R14 as a general-purpose scratch register for\nbyte-offset and pointer math. On Go's amd64 internal ABI R14 holds the\ncurrent goroutine pointer g, so clobbering it is a latent GC-time crash\nthe moment the functi\n[…]\nunused Y15 abs mask. The live 0.5 broadcast (X13/Y13) and sign mask\n(Y14) are kept. RealFFTUnpack parity, known-value, and edge-case tests confirm\nthe output is still bit-identical on amd64 and arm64.",
"is_bot": false,
"headline": "f32: stop clobbering R14 (goroutine g) in realFFTUnpackAVX (#61)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-02T07:08:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "09e4128fe28d790cff7ea8491be6f196a09ddd24",
"body": "* f32/f64: add InterleaveN/DeinterleaveN N-stream scatter/gather\n\nGeneralize Interleave2/Deinterleave2 to N planar streams in both packages:\n\n InterleaveN(dst, srcs): dst[i*N + c] = srcs[c][i]\n DeinterleaveN(dsts, src): dsts[c][i] = src[i*N + c]\n\nN is derived from len(srcs)/len(dsts). N == 1 i\n[…]\nlocations. Verified on amd64 and on a Raspberry Pi 5\n(arm64); golangci-lint clean on both architectures.\n\nCloses #53. Refs #54.\n\n* docs: note InterleaveN/DeinterleaveN generic fallback for arbitrary N",
"is_bot": false,
"headline": "f32/f64: add InterleaveN/DeinterleaveN N-stream scatter/gather (#59)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-06-01T19:52:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1d62642c9e4eb614480979760c54c5c18f2e4411",
"body": "* f32/f64: add ConvolveDecimate fused strided convolution (#51)\n\nAdd ConvolveDecimate(dst, signal, kernel, factor, phase) to f32 and f64: a\ndecimating valid convolution that keeps every factor-th output starting at\nphase. With factor == 1 and phase == 0 it is exactly ConvolveValid. This\nfuses the in\n[…]\nonventions\n(R14=g, R28=g, etc.) so the R14 pitfall is not repeated.\n\nVerified: go vet (asmdecl), full f32/f64 suites with -race on amd64\n(SSE/AVX/AVX-512), and native arm64 (NEON) on a Raspberry Pi 5.",
"is_bot": false,
"headline": "f32/f64: add ConvolveDecimate fused strided convolution (#57)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-31T18:41:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "245fd2078046ce144fa0262a47baa25342178bc1",
"body": "The PCM16 conversion primitives from #56 were listed in the operations\ntable but missing from the benchmark results table. Add Int16ToFloat32Scale\nand Float32ToInt16Scale rows; the conversion benchmarks were re-measured\ntogether on one host (i7-1260P) so the block stays internally consistent.",
"is_bot": false,
"headline": "docs: add Int16/Float32 PCM16 conversion benchmarks to README",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-31T15:55:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "41bb6d001c1458429fc75de3bbf94d5b61121bf5",
"body": "Add SIMD int16 <-> float32 PCM16 conversion (Int16ToFloat32Scale, Float32ToInt16Scale, and Unsafe variants) with AVX2, NEON, and Go fallback backends, matched bit-for-bit across architectures. Allocation-free; verified on amd64 and natively on arm64.\n\nCloses #50. Part of #54.",
"is_bot": false,
"headline": "f32: add Int16/Float32 PCM16 conversion primitives (#56)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-31T15:36:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "09dae4bfa01a69870b68ecfe3e2aeec4006efbc9",
"body": "* asm: validate FP16 (.8H) WORD encodings via aarch64 objdump (#44)\n\ngolang.org/x/arch/arm64asm cannot decode ARMv8.2 half-precision (.8H)\nSIMD instructions, so the 19 FP16 WORD directives in f16_arm64.s were\nexempted from the encoding checker via a static allow-list. That left\nthem validated by nei\n[…]\ndecodable directive now\n fails loudly rather than being accepted by the lenient no-objdump\n fallback, keeping the exemption as narrow as the documented scope.\n- Add a test for the empty-input guard.",
"is_bot": false,
"headline": "Validate FP16 (.8H) WORD encodings via aarch64 objdump cross-check (#55)",
"author_name": "Tomi P. Hakala",
"author_login": "tphakala",
"committed_at": "2026-05-31T14:38:12Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 10,
"commits_last_year": 227,
"latest_release_at": "2026-07-19T18:35:58Z",
"latest_release_tag": "v1.6.0",
"releases_from_tags": false,
"days_since_last_push": 6,
"active_weeks_last_year": 11,
"days_since_latest_release": 6,
"mean_days_between_releases": 5.7
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 57,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/tphakala/simd",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/tphakala/simd",
"is_deprecated": false,
"latest_version": "v1.6.0",
"repository_url": "https://github.com/tphakala/simd",
"versions_count": 36,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-19T18:35:18Z",
"latest_version_yanked": null,
"days_since_latest_publish": 6
}
]
},
"popularity": {
"forks": 5,
"stars": 17,
"watchers": 2,
"fork_history": {
"days": [
{
"date": "2026-01-21",
"count": 1
},
{
"date": "2026-02-25",
"count": 1
},
{
"date": "2026-05-23",
"count": 1
},
{
"date": "2026-07-11",
"count": 1
},
{
"date": "2026-07-23",
"count": 1
}
],
"complete": true,
"collected": 5,
"total_forks": 5
},
"star_history": null,
"open_issues_and_prs": 14
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"Taskfile.yml"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 99727,
"source_files_sampled": 238,
"oversized_source_files": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 3887
},
"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": 6,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/stretchr/testify",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.11.1"
},
{
"name": "golang.org/x/arch",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.27.0"
},
{
"name": "golang.org/x/sys",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.45.0"
}
],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "github.com/stretchr/testify",
"direct": true,
"version": "v1.11.1",
"ecosystem": "go"
},
{
"name": "golang.org/x/arch",
"direct": true,
"version": "v0.27.0",
"ecosystem": "go"
},
{
"name": "golang.org/x/sys",
"direct": true,
"version": "v0.45.0",
"ecosystem": "go"
},
{
"name": "github.com/davecgh/go-spew",
"direct": false,
"version": "v1.1.1",
"ecosystem": "go"
},
{
"name": "github.com/pmezard/go-difflib",
"direct": false,
"version": "v1.0.0",
"ecosystem": "go"
},
{
"name": "gopkg.in/yaml.v3",
"direct": false,
"version": "v3.0.1",
"ecosystem": "go"
}
],
"collected": true,
"truncated": false,
"total_count": 6,
"direct_count": 3,
"indirect_count": 3
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 121,
"open_issues": 14,
"closed_ratio": 0.813,
"closed_issues": 61,
"closed_unmerged_prs": 3
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "tphakala",
"commits": 215,
"avatar_url": "https://avatars.githubusercontent.com/u/7030001?v=4"
},
{
"type": "User",
"login": "tomiphakala",
"commits": 12,
"avatar_url": "https://avatars.githubusercontent.com/u/272442802?v=4"
}
],
"contributors_sampled": 2,
"top_contributor_share": 0.947
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml"
],
"has_docs_dir": true,
"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": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 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": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 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": "c06683652b58e1dd15cd382708f708b874f4b20e",
"ran_at": "2026-07-26T03:45:41Z",
"aggregate_score": 5.5,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-19T18:41:30Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-19T18:26:25Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 52,
"created_at": "2026-05-30T16:23:26Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 54,
"created_at": "2026-05-30T16:23:44Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 66,
"created_at": "2026-06-02T07:56:33Z",
"last_comment_at": "2026-07-18T23:18:46Z",
"last_comment_author": "tphakala"
},
{
"number": 75,
"created_at": "2026-06-02T10:32:20Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 96,
"created_at": "2026-06-10T10:15:52Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 108,
"created_at": "2026-06-10T11:04:10Z",
"last_comment_at": "2026-06-10T11:08:57Z",
"last_comment_author": "tphakala"
},
{
"number": 132,
"created_at": "2026-06-13T15:30:47Z",
"last_comment_at": "2026-07-18T23:20:50Z",
"last_comment_author": "tphakala"
},
{
"number": 141,
"created_at": "2026-06-14T13:01:02Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 161,
"created_at": "2026-07-17T19:14:53Z",
"last_comment_at": "2026-07-18T22:01:08Z",
"last_comment_author": "tphakala"
},
{
"number": 192,
"created_at": "2026-07-19T16:17:35Z",
"last_comment_at": "2026-07-19T18:36:49Z",
"last_comment_author": "tphakala"
},
{
"number": 196,
"created_at": "2026-07-19T18:27:17Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 197,
"created_at": "2026-07-19T18:54:40Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 198,
"created_at": "2026-07-19T18:58:58Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 199,
"created_at": "2026-07-19T19:04:45Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/tphakala/simd",
"host": "github.com",
"name": "simd",
"owner": "tphakala"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"security": 64,
"vitality": 83,
"community": 45,
"governance": 59,
"engineering": 84
},
"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": 227,
"human_commit_share": 1,
"days_since_last_push": 6,
"active_weeks_last_year": 11
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 6 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 6
}
}
],
"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": "227 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 227
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 30 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": 10,
"latest_release_tag": "v1.6.0",
"releases_from_tags": false,
"days_since_latest_release": 6,
"mean_days_between_releases": 5.7
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "10 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 10
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 6 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 6
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~5.7 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 5.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": 6,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 6 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 6
}
}
],
"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": 45,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 24,
"inputs": {
"forks": 5,
"stars": 17,
"watchers": 2,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "17 stars",
"points": 19.5,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 17
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "5 forks",
"points": 5,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 5
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "2 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 2
}
}
],
"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 (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 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": 59,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 16,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 2,
"top_contributor_share": 0.947
},
"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 95% of commits",
"points": 1.2,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 95
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "2 contributors",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 2
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"merged_prs": 121,
"open_issues": 14,
"closed_issues": 61,
"issue_closed_ratio": 0.813,
"closed_unmerged_prs": 3
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "81% of issues closed",
"points": 38,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 81
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "121/124 decided PRs merged",
"points": 37.3,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 121,
"decided": 124
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 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": 78,
"owner_type": "User",
"is_verified": null,
"owner_login": "tphakala",
"public_repos": 64,
"account_age_days": 4508
},
"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": "78 followers of tphakala",
"points": 13.6,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 78,
"login": "tphakala"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "64 public repos, account ~12 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 64
}
},
{
"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/simd"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 6
},
"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 6 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 6
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "36 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 36
}
}
],
"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": 84,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": true,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"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": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
"points": 20,
"status": "met",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"topics": [
"avx",
"float32",
"float64",
"go",
"golang",
"math",
"neon",
"performance",
"simd",
"vectorization"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": 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": "10 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 10
}
}
],
"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": "moderate",
"name": "Security",
"value": 64,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 55,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 5.5
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "27 out of 27 merged PRs checked by a CI test -- score normalized to 10",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is 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": "30 commit(s) and 30 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "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 6 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": 6
}
},
{
"code": "advisories_repo_graph_caveat",
"params": {}
},
{
"code": "advisories_reachability",
"params": {}
}
],
"value": 100,
"inputs": {
"source": "osv",
"advisories": 0,
"affected_packages": 0,
"assessed_packages": 6,
"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": 6,
"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": 3
},
"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": 82,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 3887
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 72,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"Taskfile.yml"
],
"has_devcontainer": false,
"has_linter_config": true,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Taskfile.yml",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Taskfile.yml"
}
}
],
"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": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 99727,
"source_files_sampled": 238,
"oversized_source_files": 1
},
"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": "1/238 source files over 60KB",
"points": 54.8,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 238,
"oversized": 1
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-26T03:45:55.909324Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/tphakala/simd.svg",
"full_name": "tphakala/simd",
"license_state": "standard",
"license_spdx": "MIT"
}