JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 34617,
"has_wiki": true,
"homepage": "http://sourceware.org/libffi",
"languages": {
"C": 1735997,
"M4": 87239,
"C++": 6998,
"HTML": 102,
"Perl": 9021,
"Shell": 78762,
"Python": 13015,
"Assembly": 487370,
"Makefile": 15557
},
"pushed_at": "2026-07-10T21:18:10Z",
"created_at": "2009-09-29T15:05:17Z",
"owner_type": "Organization",
"updated_at": "2026-07-21T16:45:40Z",
"description": "A portable foreign-function interface library.",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "master",
"license_spdx_raw": "NOASSERTION",
"primary_language": "C",
"significant_languages": [
"C",
"Assembly"
]
},
"owner": {
"blog": null,
"name": null,
"type": "Organization",
"login": "libffi",
"company": null,
"location": null,
"followers": 42,
"avatar_url": "https://avatars.githubusercontent.com/u/7063475?v=4",
"created_at": "2014-03-25T21:35:27Z",
"is_verified": null,
"public_repos": 5,
"account_age_days": 4501
},
"license": {
"state": "custom",
"spdx_id": null,
"raw_spdx": "NOASSERTION",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v3.7.1",
"kind": "patch",
"published_at": "2026-07-10T14:00:02Z"
},
{
"tag": "v3.7.0",
"kind": "minor",
"published_at": "2026-07-08T11:45:23Z"
},
{
"tag": "v3.6.0",
"kind": "minor",
"published_at": "2026-06-20T13:59:08Z"
},
{
"tag": "v3.5.2",
"kind": "patch",
"published_at": "2025-08-02T07:01:00Z"
},
{
"tag": "v3.5.1",
"kind": "patch",
"published_at": "2025-06-10T21:35:43Z"
},
{
"tag": "snapshots",
"kind": "other",
"published_at": "2025-06-09T16:24:16Z"
},
{
"tag": "v3.5.0",
"kind": "minor",
"published_at": "2025-06-08T12:30:24Z"
},
{
"tag": "v3.4.8",
"kind": "patch",
"published_at": "2025-04-10T02:58:45Z"
},
{
"tag": "v3.4.7",
"kind": "patch",
"published_at": "2025-02-08T16:38:32Z"
},
{
"tag": "v3.4.6",
"kind": "patch",
"published_at": "2024-02-18T14:26:52Z"
},
{
"tag": "v3.4.5",
"kind": "patch",
"published_at": "2024-02-15T13:42:16Z"
},
{
"tag": "v3.4.4",
"kind": "patch",
"published_at": "2022-10-24T00:21:53Z"
},
{
"tag": "v3.4.3",
"kind": "patch",
"published_at": "2022-09-19T17:53:28Z"
},
{
"tag": "v3.4.2",
"kind": "patch",
"published_at": "2021-06-29T01:12:09Z"
},
{
"tag": "v3.4.0-rc2",
"kind": "prerelease",
"published_at": "2021-06-28T13:55:10Z"
},
{
"tag": "v3.4-rc1",
"kind": "other",
"published_at": "2021-06-26T16:16:15Z"
},
{
"tag": "v3.3",
"kind": "other",
"published_at": "2019-11-23T16:13:26Z"
},
{
"tag": "v3.3-rc2",
"kind": "other",
"published_at": "2019-11-02T22:18:09Z"
},
{
"tag": "v3.3-rc1",
"kind": "other",
"published_at": "2019-10-24T11:10:09Z"
},
{
"tag": "v3.3-rc0",
"kind": "other",
"published_at": "2018-04-02T12:36:21Z"
}
],
"recent_commits": [
{
"oid": "46cb2e3871059f7f5113329ddcca818de3a8cfae",
"body": "testsuite: Remember to distribute tests added for 3.7.1",
"is_bot": false,
"headline": "Merge pull request #998 from bgilbert/tests",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T20:51:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8cd11a772d8a0b687f43390697baa002ae6504d5",
"body": null,
"is_bot": false,
"headline": "testsuite: Remember to distribute tests added for 3.7.1",
"author_name": "Benjamin Gilbert",
"author_login": "bgilbert",
"committed_at": "2026-07-10T18:59:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ca86812cd430cff3018e491ba75a4f3c9ea969d2",
"body": "A tag and its commit fire two CI runs at the same SHA. Both run the\npublish-reports job, which deploys a fixed-name github-pages artifact\nvia actions/deploy-pages; the two deployments collide and one fails\nwith BlobNotFound (seen on the v3.7.1 tag run). The same-SHA branch\npush already publishes the reports, so gate the job off tag pushes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: Don't publish rlgl reports on tag pushes",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T14:56:47Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5c1c43091ed611fdea774374355eb938c73a9157",
"body": "Bump version to 3.7.1 and libtool -version-info to 12:1:4 (revision\nbump; no ABI change). See the README for the change list.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Prepare for 3.7.1",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T13:50:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "aaeaafb04a8335bea93b2873ca9a2d01107737eb",
"body": "The i386 esp-balance shim faulted on Android i686 (clang, -O2): it read\nthe closure code pointer through an esp-relative memory operand after\nmanually moving esp, and it did not 16-byte align the stack for the\ncall, so the -O2-built closure body faulted on aligned SSE.\n\nRead every operand into a reg\n[…]\nfPIC, and return the delta via memory. Verified with\ngcc and clang at -O0 and -O2: passes with the fix, still catches the\nunder-pop without it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: Make closure_thiscall_fastcall_pop portable across compilers",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T13:24:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ebe306becb167937ead4332290868e041d0c08a7",
"body": "For THISCALL and FASTCALL, ffi_closure_inner force-bumps narg_reg to 2\nwhen an argument is a 64-bit integer or a struct, so that following\ninteger arguments are placed on the stack (the Issue #434 rule). The\nclosure return path then computed the callee stack pop as\ncif->bytes - narg_reg * 4, which \n[…]\n a minimal callee-clean call site and checks\nESP is balanced; without this fix the imbalance is 8 (FASTCALL uint64)\nor 4 (THISCALL this+uint64).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86: Fix i386 THISCALL/FASTCALL closure stack-pop accounting",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T12:54:39Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a2ef91c79f4f193dd1e828f615c818fb6bcaff0d",
"body": "On AArch64, composites larger than 16 bytes (that are not HFAs) are\npassed by invisible reference. ffi_call copies each payload into the\nargument slab from the top (next_struct_area, growing down) and, once\nX0-X7 are exhausted, spills the by-ref pointer into the same slab from\nthe bottom (the NSAA,\n[…]\nns can never\noverlap.\n\nAdds many_large_structs.c, which passes sixteen 32-byte structs by\nvalue; it crashes without this fix and passes with it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "aarch64: Fix argument slab under-budget for large by-value structs",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T12:37:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "25283b0d812b6729299a21a1c02433bc291174e9",
"body": "Add Windows ARM64 (MSVC) CI; fix latent msvcc.sh and testsuite bugs it exposed",
"is_bot": false,
"headline": "Merge pull request #997 from libffi/windows-arm64-ci",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T12:22:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "665c5c00f2f492e199a1c9e01bda57a82f4440ef",
"body": "Same latent issue as closure.exp: the Go closure tests ran with no\nMSVC warning options, so ffitest.h's benign C4005 PRI-macro\nredefinition warnings count as excess errors. Latent until the\nmsvcc.sh -E fix let the FFI_GO_CLOSURES feature probe succeed under\nMSVC; the execution tests themselves pass on both x86 MSVC jobs.\nMirror the call.exp/closure.exp warning-suppression block.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: Pass MSVC warning suppressions in go.exp",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T11:46:24Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "2e897db821a43068e3851a414bd47b2b5592d403",
"body": "Now that closure_loc_fn0.c actually executes, it fails on Apple\naarch64: with FFI_EXEC_TRAMPOLINE_TABLE, codeloc points at a\ntrampoline table entry rather than a copy of the closure, so the\nmemcmp sanity check is invalid there -- the same reason it is already\nskipped for static trampolines. fficonfig.h (included by ffitest.h)\nprovides the macro.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: Skip closure_loc_fn0 memcmp check under trampoline tables",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T11:25:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "15b9abc239a1a2f6964a4cfc92f8fb78b3475d37",
"body": "Build and test on GitHub's windows-11-arm runners. Cygwin and the\namd64_arm64 cross tools (cl, armasm64) are x64-hosted and run under\nthe runner's x64 emulation; the ARM64 binaries they produce execute\nnatively, so the full testsuite runs (784 passes, 0 failures). This\nis the first CI coverage for\n[…]\n.\nRelease tags now also publish ARM64 MSVC binaries\n(libffi-<ver>-arm64-msvc-binaries).\n\nReplaces the temporary winarm64.yml iteration workflow.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: Add Windows ARM64 Visual C++ to the MSVC build matrix",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T11:19:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e4435739c82106cf13336bf26da99a03281848a0",
"body": "closure_loc_fn0.c is the only test in the suite without a dg-do\ndirective, so DejaGnu has been defaulting to its compile-only action\non every platform -- the ffi_closure_alloc/ffi_prep_closure_loc path\nit exists to exercise was never executed. Add the missing\n/* { dg-do run } */.\n\nThe compile-only \n[…]\nnals since compile-only\ninvocations pass no libraries. Map -S to a true compile-to-assembly:\n-c -FAs with the listing written to the -o target.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: Actually run closure_loc_fn0; fix msvcc.sh -S",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T10:58:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bf2fa49b6dbe68dac021c02ee3deddb343ec3541",
"body": "closure.exp defines additional_options with the same -wd warning\nsuppressions call.exp uses, but only passed them to the C++ tests;\nthe C tests ran with \"\". Under MSVC the benign C4005/C4305/C4477\nwarnings then count as excess errors and fail every C test's compile\ncheck. This was latent until the previous commit made the\nFFI_CLOSURES feature probe work under msvcc.sh, allowing the closures\nsuite to run on MSVC at all.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: Pass MSVC warning suppressions to closures C tests",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T10:36:26Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c2ace700754b6e63f07efdec39fc8c09ed960d63",
"body": "The testsuite's libffi_feature_test probes compile a snippet with\n\"-E -o <file>\" and treat any compiler output as failure. msvcc.sh\nhad no -E handling: cl's preprocessed text went to stdout, where the\nawk diagnostics filter passed through every line containing the\nstring \"warning\" -- including ffi.\n[…]\ny MSVC CI job.\n\nRecognize -E, write the preprocessed output to the -o target, and\nswallow cl's stderr banner so feature probes see clean output.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "msvcc.sh: Handle -E (preprocess) so DejaGnu feature tests work",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T10:11:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e994c8a22d6bc480cd13c9daa2abaedf42627f88",
"body": "Build and test libffi on GitHub's windows-11-arm runners using\nmsvcc.sh -marm64 (cl + armasm64 via the amd64_arm64 cross tools,\nrunning under x64 emulation; the resulting ARM64 binaries execute\nnatively). msvcc.sh already understands -marm64.\n\nThis is a temporary standalone workflow scoped to the\nwindows-arm64-ci branch so the job can be iterated on without\ntriggering the full CI matrix; it will be folded into build.yml\nonce green.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: Add Windows ARM64 Visual C++ job (iteration branch)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T09:49:48Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e87b59f53f3879cb254a4c331fd0d2c221d6ea73",
"body": "clang-cl defines both __clang__ and _MSC_VER. Since the build system\ndetects clang before MSVC, it sets MSVC=0 and builds sysv.S rather\nthan win64_armasm.S. But ffi.c gated its C implementations of\nextend_hfa_type and compress_hfa_type on !defined(_MSC_VER), so under\nclang-cl neither implementatio\n[…]\nhere. Also replace ssize_t (POSIX-only, absent on Windows) with\nptrdiff_t in extend_hfa_type now that it compiles for MSVC targets.\n\nFixes #996\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "aarch64: Fix clang-cl link failure for HFA helper functions",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T09:40:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cacaf519159668bce9fcbab64082bc85c277e89d",
"body": "The ffi_call_plan_* API has two providers: the accelerated x86-64 SysV\nimplementation in src/x86/ffi64.c, and the portable fallback in\nsrc/prep_cif.c that just wraps ffi_call. ffi64.c is not compiled for\nX86_WIN64 (that target builds ffiw64.c/win64.S instead), but clang-cl\nand MSYS/mingw both defin\n[…]\nned(X86_WIN64) to the guard. X86_WIN64 is a\ncommand-line define visible to the generic sources (cf. src/closures.c).\n\nFixes #995.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86-64: build generic ffi_call_plan fallback on Windows x86-64",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-10T01:36:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c2c2e538c7c5403bd4edc3e77220bbe25a3ad47f",
"body": "aarch64: Don't split an int128 between x7 and the stack on Darwin",
"is_bot": false,
"headline": "Merge pull request #994 from libffi/fix-993-aarch64-darwin-int128",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-09T13:10:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c3144c80d8077b745588ee64bffd8504c44f5c9",
"body": "The Apple arm64 ABI does not round NGRN up to an even number for\n128-bit integer arguments, but like AAPCS64 it still requires the\nvalue to fit entirely in registers: if only x7 remains, the whole\nvalue goes on the stack. allocate_int128_to_reg_or_stack only\nchecked ngrn < 8, so with ngrn == 7 it w\n[…]\nall/i128-1.c failure at iteration 7 (seven\nint args followed by an __int128) on aarch64-darwin, for both the\ncall and closure paths.\n\nFixes #993\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "aarch64: Don't split an int128 between x7 and the stack on Darwin",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-09T01:23:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "132fb82ff4b43c9b8eaeeb533f38c95ae925131c",
"body": "3.7.0 adds three new public interfaces (ffi_call_plan_alloc,\nffi_call_plan_invoke, ffi_call_plan_free) additively, with no\nexisting interface removed or changed. Per the libtool rules:\nincrement current, reset revision, increment age (11:1:3 -> 12:0:4).\nThis keeps the change ABI backward-compatible; the soname stays\nlibffi.so.8 (current - age = 8).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update libtool version to 12:0:4 for 3.7.0",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-08T11:40:34Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0ad8fd46c0a32cbbf18260c72cc60679da66c89f",
"body": null,
"is_bot": false,
"headline": "Prepare for 3.7.0",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-08T10:43:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c9275302baf0d109ec474972d4679a6afe8fe64d",
"body": "Set AC_INIT to 3.7.0 and update the manual's edition/version/date\nstamps to match.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Bump version to 3.7.0",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-08T10:29:29Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "4f7ef24565eb60e8a093bfeba0bb77d5c576c311",
"body": "Bump the LICENSE year range to 2026.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update copyright year",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-08T10:28:30Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5ab7b328c3adde14105b1f36ae30adc9cdefae0a",
"body": "Attribute this year's work in the wasm and PA backends and the darwin\nPowerPC closure code:\n - wasm/ffi.c: widen narrow/unboxed returns to ffi_arg; NULL rvalue.\n - pa/ffi.c: bump year (5-8 byte struct slot-sizing fix + avalue copy).\n - powerpc/ffi_darwin.c: PPC_LD_* jump-table indexes for the aix/darwin\n closure build fix.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Add Anthony Green copyright line for 2026 authorship",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-08T10:24:26Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "5e334c6aa70b937b5c0d30ba10a373e34d7526b6",
"body": "The fast-path plan trampoline (ffi_plan_fast_call) and the pure-GP64\ndirect thunks (ffi_plan_gp0..6) were added to unix64.S this year, so\nadd an Anthony Green copyright line alongside the original authors'.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86-64: add copyright line for the 2026 unix64.S plan trampolines",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-08T10:17:58Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "70106b98d0a333a13b509b4bdc554018785be50c",
"body": "Add 2026 to the copyright line on the source files, headers and the\nmanual touched during this year's development. Following existing\npractice, only the maintainer's own copyright line is bumped (the\nAnthony Green line, plus the Red Hat line in types.c); the years on\nthird-party-held backends are left as their original authors set them.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Update copyright year to 2026",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-08T10:15:53Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "621874d6726007a6470b9c0c90b5a27c3c3ed932",
"body": "The 3.6.0 release bumped AC_INIT but left FFI_VERSION_STRING and\nFFI_VERSION_NUMBER at 3.5.2/30502, so the released headers report the\nwrong version. Compute both from AC_PACKAGE_VERSION instead of\nduplicating the version by hand: the string is the package version\nverbatim, and the number encodes X.Y.Z as X*10000 + Y*100 + Z with any\nnon-numeric suffix (e.g. -rc0) ignored.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "configure: derive FFI_VERSION_STRING/NUMBER from AC_INIT",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-08T09:43:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b8c60b06597cc77cbe66bd208083acc20251fae0",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "README: note the ffi_call fixes in the 3.7.0 history",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T16:57:06Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ed5da041796cd6e38d2f30b948eadf63cf96139a",
"body": "The previous commit widened narrow integral returns to ffi_arg, but\nunbox_small_structs had already collapsed single-member struct returns\ninto those same scalar type ids, and a struct return is stored at its\nnatural size -- the caller's buffer is exactly the struct. This broke\ncls_1_1byte and the bhaible small-struct return tests.\n\nRemember whether the original return type was a struct and widen only\ngenuine scalar returns.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "wasm: don't widen unboxed small-struct returns",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T16:30:56Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "59a9e68e59205da9c4db854dd1f1bce4e8b58dad",
"body": "The return store wrote only the natural width for integer returns\nnarrower than a register (one byte for U8/S8, two for U16/S16, four on\nwasm64 for 32-bit types), leaving the rest of the caller's ffi_arg\nbuffer as stack garbage. The documented API widens such returns to a\nfull ffi_arg, and every na\n[…]\narbage bytes of their ffi_arg results.\n\nMask or sign-extend the JS result explicitly and store a full ffi_arg\n(32 bits on wasm32, 64 on wasm64).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "wasm: widen narrow integral returns to ffi_arg",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T16:02:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6954bd1715b8a5895adfad7c2196d4eb41094dc7",
"body": "The struct-argument block stored an ffi_type_slong return into a plain\nlong. Integral returns narrower than a register are widened to\nffi_arg, so on LLP64 targets libffi writes 8 bytes into the 4-byte\nvariable and clobbers its neighbor; this is what broke plan.c on MSVC\nWin64 while mingw survived by stack-layout luck.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: use ffi_arg for the integral return in plan.c",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T15:30:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "822d2e555fd97271c7c0ba8b6325cf4b541e3e9c",
"body": "Most ports already quietly supported calling with rvalue == NULL by\nsubstituting scratch space for in-memory returns, and the new plan\ntests rely on it, but the manual never promised it and the wasm port\npassed NULL straight to the callee as the return-by-argument pointer,\nwriting the result through\n[…]\ntype, and in the wasm\nport allocate stack scratch for return-by-argument callees and skip the\nstore-back for scalar returns when rvalue is NULL.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "Allow a NULL rvalue in ffi_call; handle it in the wasm port",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T15:30:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "110156e1cceab76b4440ced9d95b5abaa84f30f7",
"body": "Eight ports made large struct arguments pass-by-value by alloca'ing a\ncopy inside ffi_call and writing the copy's address back into the\ncaller's avalue[]. Those pointers dangle as soon as ffi_call returns,\nso any caller that legally reuses its avalue array for a second call\nreads dead stack. The n\n[…]\nray once, on the first argument that needs a copy,\nand redirect the clone instead. Document that ffi_call leaves the\ncaller's vector untouched.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "ffi_call: never modify the caller's avalue array",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T15:30:55Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e3dae4657710a9ddd4eb4bdbefbcc73722aad9fe",
"body": "Add plan.c, plan_mixed.c, plan_spill.c, plan_struct.c and plan_var.c.\nEach builds a reusable call plan (ffi_call_plan_alloc/invoke/free) and\nchecks it against ffi_call across the x86-64 argument-placement matrix:\nthe pure-GP64 direct thunks, the mixed GP+SSE fast path, stack-spilled\narguments, struc\n[…]\n.c, large_struct_by_value.c, many_small_structs.c\nand complex_i128.c). They ran via the .exp globs but were missing from\ndistribution tarballs.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: add ffi_call_plan equivalence tests; fix EXTRA_DIST gaps",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T13:18:31Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a40ab3a7e85f8c9b193b8a442297bb20de2b4293",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "README: update 3.7.0 history entry",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T12:19:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "50baa0458db6b2d617e0d661292bbf12354b22ce",
"body": "ffi_closure_unix64_inner allocated a fixed 16 bytes when gathering a\nregister-passed argument's eightbytes, but the copy loop writes n * 8\nbytes and examine_argument can classify up to MAX_CLASSES (4)\neightbytes for vector-classified types. Allocate n * 8 bytes so the\nbuffer always matches the loop bound.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86_64: size closure argument buffer to match copy loop",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T12:10:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ff30d37615f82ef7bf1130b34528e01e1479b63d",
"body": "The %s conversion into file[PATH_MAX] was unbounded while the input\nline buffer is PATH_MAX+100 bytes, so a mapping with a very long\npathname could overflow the destination. Give the conversion an\nexplicit PATH_MAX field width and size the buffer PATH_MAX+1 to\naccommodate the terminating NUL.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": "tramp.c: bound sscanf path field when parsing /proc/self/maps",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T12:10:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ed1844e6b50d0498d2b88d1b3ef31cc39b6cf117",
"body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
"is_bot": false,
"headline": ".gitignore: ignore local build and scan artifact directories",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T12:10:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "854df63dbbda802985facbfab7a0e7c4169aefd1",
"body": "Include .note.GNU-stack on FreeBSD/x86",
"is_bot": false,
"headline": "Merge pull request #991 from rorth/freebsd-libffi-note-gnu-stack",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-07T12:06:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "731ec08f3c3bbec883d823a71f1b0f86731cf312",
"body": null,
"is_bot": false,
"headline": "Fix typo.",
"author_name": "Rainer Orth",
"author_login": "rorth",
"committed_at": "2026-07-07T09:14:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "19cc1424e924767c7ca43f9e4d4c27fbae27d1d9",
"body": "When building libffi on FreeBSD/x86 with --disable-shared as is done inside\nthe GCC tree, all tests FAIL when using GNU ld:\n\ngld-2.46: warning: win64.o: missing .note.GNU-stack section implies executable stack\ngld-2.46: NOTE: This behaviour is deprecated and will be removed in a future version of th\n[…]\nNOTE section, too. This\ndoesn't happen with libffi.so which lacks that NOTE.\n\nTherefore this patch extends the emission accordingly.\n\nTested on amd64-pc-freebsd15.1 with and without --disable-shared.",
"is_bot": false,
"headline": "Include .note.GNU-stack on FreeBSD/x86",
"author_name": "Rainer Orth",
"author_login": "rorth",
"committed_at": "2026-07-07T08:27:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2a595a183be146974bdf55716969e7a3e860f112",
"body": "dlmalloc: cast Win32 spin-lock word to LONG volatile* in CAS_LOCK/CLEAR_LOCK",
"is_bot": false,
"headline": "Merge pull request #989 from rvandermeulen/dlmalloc-msvc-lock-cast",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-07-03T00:03:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f7b36640544a59813ee372ed1a763affe7a67562",
"body": "…AR_LOCK\n\nMLOCK_T is int, but on the Win32 MSC path CAS_LOCK/CLEAR_LOCK map to\n_InterlockedExchange(LONG volatile *, LONG), so the int* lock word is\npassed to a LONG volatile * parameter. clang 22 promotes\n-Wincompatible-pointer-types to an error by default, which breaks the\nclang-cl build (32- and \n[…]\nvolatile *), matching what the ffi_spin_peek macro just\nbelow already does in its _MSC_VER branch. LONG and int are both 32-bit\non Windows, so this is a type-correctness fix with no behavioral change.",
"is_bot": false,
"headline": "dlmalloc: cast Win32 spin-lock word to LONG volatile* in CAS_LOCK/CLE…",
"author_name": "Ryan VanderMeulen",
"author_login": "rvandermeulen",
"committed_at": "2026-07-02T23:40:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c93f9428d17cde4eb35517b58feeae6fb43aba5b",
"body": "The libffi.threads/tsan.c test calls pthread_create but the harness\nonly appended -lpthread for OpenBSD, FreeBSD, and some Linux targets.\nOn NetBSD this caused an undefined reference to pthread_create.\n\nFixes #988\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: link threads tests against libpthread on NetBSD",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-22T21:33:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9ca53a19833dabaf80b73763638ab988bdbc42cc",
"body": "unbuildable: the PPC_LD_* jump-table indexes (defined in ffi_powerpc.h,\nwhich this file cannot include) were missing, and the closure helper\nfunctions still declared an ffi_type* return type inconsistent with the\nPPC_LD_* constants they now return.\n\nDefine the PPC_LD_* constants locally and change the closure helper\nreturn types to int.\n\nFixes #987\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "powerpc: fix aix/darwin closure build errors",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-21T22:43:03Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "807a93115f927229f6e7cf5675384e8dc2bf76d5",
"body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "doc: mark the 3.7.0 release date as TBD",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-21T22:31:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c876d4663183c40edbe5218603a26290900e7794",
"body": "Record the next release (3.7.0, a minor bump for the new reusable call-plan API\non master) and the two PA-RISC fixes merged in #986.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "doc: add 3.7.0 history entry",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-21T22:28:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c3e054afebb2d9121ff4d12a56a803eecc31cc41",
"body": "Add PA32/ARCompact struct-by-value regression tests; enable hppa CI",
"is_bot": false,
"headline": "Merge pull request #986 from libffi/ci-enable-parisc-regression",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-21T22:13:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f04d458126bd79c58196073477515c88de8163d",
"body": "ffi_size_stack_pa32 reserved a single stack slot for every struct argument,\nbut ffi_prep_args_pa32 passes a 5-8 byte struct inline in two even-aligned\nslots (like a 64-bit value). With enough such arguments the marshaller's slot\ncount outgrew cif->bytes and it wrote past the allocated frame -- belo\n[…]\nUX long double case out since it\nis passed by pointer.\n\nFixes the failure exercised by testsuite/libffi.call/many_small_structs.c.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "pa: fix stack sizing for 5-8 byte structs passed by value (FFI_PA32)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-21T21:37:26Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "cf45dfc368ea7373fdd946603845782dbcc1549a",
"body": "With only 16 structs the PA-RISC slot under-count overflows ~32 bytes below\nsp, landing in the 64-byte register save area where it clobbers nothing live,\nso the call still returned correctly and the test passed under qemu.\n\nRaise the count to 40 so the marshaller's writes sweep past the save area an\n[…]\ns still marshal within the allocated frame and\nthe call returns the expected sums; the test now fails only on an unfixed\nFFI_PA32.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: make many_small_structs actually trigger the PA32 overflow",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-21T20:57:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d55de2637abd9518d550d18a3e1d89a37bd32f47",
"body": "FFI_TYPE_UINT128/FFI_TYPE_SINT128 were added after FFI_TYPE_COMPLEX, moving\nFFI_TYPE_LAST to FFI_TYPE_SINT128. The PA-RISC tripwire still pinned\nFFI_PA_TYPE_LAST to FFI_TYPE_COMPLEX, so \"#error You likely have broken jump\ntables\" fired and PA-RISC stopped building once int128 support landed.\n\nffi_p\n[…]\nient. Bump FFI_PA_TYPE_LAST to\nFFI_TYPE_SINT128 to clear the tripwire, with a comment recording why no table\nentries were needed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "pa: fix build broken by the int128 generic types",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-21T20:39:30Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d7177f2db574c962b4366b1948b7f7e1aaf896c2",
"body": "Add an hppa-linux-gnu entry to the build-cross-qemu matrix so the testsuite is\ncross-compiled with the Debian gcc-hppa-linux-gnu toolchain and run under\nqemu-user (binfmt). hppa-linux uses FFI_PA32, so this exercises the\nffi_prep_args_pa32 / ffi_size_stack_pa32 marshalling path and will surface the\n[…]\nso drop the stale g++-5-hppa-linux-gnu pin from install.sh; the toolchain and\nqemu-user-static now come from the CROSS_QEMU block.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: run the testsuite on PA-RISC 32-bit (hppa) under qemu-user",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-21T20:26:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a384cba94f3935ac54a38f7c6489b6fbe0488c8c",
"body": "Two ffi_call tests covering argument-marshalling defects found by a security\nreview of the backends:\n\n* many_small_structs.c -- passes sixteen 8-byte structs by value. On\n PA-RISC 32-bit (FFI_PA32), ffi_size_stack_pa32 reserves one stack slot per\n struct while ffi_prep_args_pa32 consumes two slot\n[…]\nalid CIFs, asserts on the\nexpected sums); they pass on unaffected targets and fail on PA32/ARCompact\nuntil the backends are fixed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "testsuite: add struct-by-value regression tests for PA32 and ARCompact",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-21T20:26:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3cc6beb7d404e12d3458461d76557b79795816ff",
"body": "…plan API\n\nThe transparent plan cache sped up ffi_call and closures by caching a\nprecomputed argument-placement plan per signature, but it charged every\ncall a cache lookup and content fingerprint, and it slightly regressed\nsignatures with no fast path (struct-by-value) that paid the key\ncomputation\n[…]\nefined on all platforms. The per-thread cache, content fingerprint,\nthread-exit cleanup and closure demarshal layout are removed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86-64: replace the transparent plan cache with an explicit ffi_call_…",
"author_name": "Anthony Green",
"author_login": null,
"committed_at": "2026-06-21T14:08:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0c8f175eb650bb204b679996696b3e7706505d8f",
"body": "abi, nargs and rtype are stored in the slot and compared exactly on every\nhit, so folding them into the fingerprint is redundant work on the hot\npath. Hashing only the arg_types element pointers keeps the same collision\nbehaviour and the same protection against a reused arg_types address, while\nshortening the per-call hash and speeding up the all-pointer thunk path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86-64: trim the plan-cache fingerprint to the arg_types contents",
"author_name": "Anthony Green",
"author_login": null,
"committed_at": "2026-06-21T12:18:14Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "7b8c3283351298c55d09f580414ab937f358156c",
"body": "x86-64: content-based plan-cache key and thread-exit cleanup",
"is_bot": false,
"headline": "Merge pull request #985 from libffi/plan-cache-fingerprint",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T23:48:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f1e2132940880128e26b885ee956e76fe3cad2d8",
"body": "Follow-up to the plan cache (PR #984), addressing two issues.\n\nContent key: the cache keyed slots on the abi/nargs/rtype plus the arg_types\n*array pointer*. If a cif's arg_types array was freed and the address later\nreused for a different signature with the same abi/nargs/rtype, the keys\ncollided a\n[…]\nd via weak symbols, so a program that never links\npthread simply skips the registration (the cache is already bounded per thread).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86-64: content-based plan-cache key and thread-exit cleanup",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T23:46:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d4995b5bff6e5ecefb46eda218c40717f895baaf",
"body": "x86-64: transparent plan cache for ffi_call and closures",
"is_bot": false,
"headline": "Merge pull request #984 from libffi/fast-libffi-plan",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T22:43:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "de3826a8063fde113ee8d1e455d459038d5814cc",
"body": "The Win64/EFI64 plan path failed an MSVC execution test (libffi.call/float3)\nthat can't be reproduced or validated without a Windows toolchain. Revert\nffiw64.c to the proven upstream implementation and build plans only for\nFFI_UNIX64, leaving Win64/EFI64/GNUW64 on the existing path. The SysV fast\npath -- the bulk of the speedup -- is unaffected.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86-64: limit the plan cache to the SysV ABI",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T22:14:08Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fdbf8deaf297b308731385f91868ea8b5e7dbd21",
"body": "Native Windows targets build only ffiw64.c + win64.S for the x86 backend;\nffi64.c (which instantiates the plan-cache storage and ffi_build_plan_arch)\nis not compiled, so ffiw64.c's ffi_plan_get left ffi_plan_miss / ffi_plan_cache\nunresolved at link time. Instantiate the cache in ffiw64.c when X86_W\n[…]\nis no duplicate definition.\n\nAlso use a portable thread-local qualifier (FFI_TLS: __declspec(thread) on\nMSVC, __thread elsewhere).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86-64: fix Windows build of the plan cache",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T21:59:54Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "872365e143c521b4a84f712aa60f4e638a8b8053",
"body": "Drop the in-development \"Mechanism A\" label and the stale references to the\nearlier opt-in arena/slab storage, so the comments describe the cache as it\nnow stands. No functional change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86-64: reword plan-cache comments to be self-contained",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T21:25:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c4c9750c37868f26d1ce914592ca826e4ffc0b35",
"body": "Precompute each signature's argument placement once and cache it, keyed on\n(abi, nargs, rtype, arg_types) in a per-thread direct-mapped cache, so ffi_call\nand closures skip the per-call ABI classification. No API or ABI change --\nevery caller benefits transparently on a relink.\n\n - Cache: src/plan\n[…]\nint128/float/double args are accelerated; struct/complex/x87\nargs fall back to the existing path. Pointer-heavy calls ~5x faster.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86-64: transparent plan cache for ffi_call and closures",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T17:10:18Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "918ca8edddbf542d9034d8e58931edfea036ecca",
"body": "The MSVC 'Create binary distribution' step builds a *directory*\n(libffi-<ver>-x86-<width>bit-msvc-binaries/), but 'Upload to GitHub Release'\npointed softprops/action-gh-release at a .zip file that was never created. With\nno matching file the action just warns and succeeds, so on the v3.6.0 tag the\n\n[…]\npload-artifact layout), and set fail_on_unmatched_files: true so a missing\nfile fails the step loudly instead of silently passing.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: actually zip the MSVC binaries before the release upload",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T16:34:46Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f6303b8b0dd6353c6a5bb4de2e855a13b86f22cf",
"body": "Add release.yml: on a v* tag it verifies the tag matches configure.ac, builds\nthe source distribution via 'make dist', extracts the matching section of\nREADME.md as the release notes, and publishes a GitHub release with the tarball.\n\nAlso add a 'tags: v[0-9]*' trigger to build.yml so the full matrix\n[…]\nttaches the 32-bit and 64-bit Windows MSVC binaries\nto the same release.\n\nNo signing yet; mingw/cygwin binaries are not published.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: publish a release (source tarball + MSVC binaries) on version tags",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T13:54:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4e537ca4a37d1401598834b40aa1406dcf4997b4",
"body": "dlmalloc: use __builtin_clz/ctz bit-index on all GNU compilers (#754)",
"is_bot": false,
"headline": "Merge pull request #981 from libffi/dlmalloc-builtin-clz-all-arches",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T13:45:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce9904d6aec8dc6bb536a901a71c1e445eae7ec6",
"body": "Add atomic intrinsics for MSVC to dlmalloc.c",
"is_bot": false,
"headline": "Merge pull request #982 from emiltayl/msvc-atomics",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T13:44:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b32ddaf73a16f0ddb8055908b829682eb5c73eeb",
"body": "ci: drop ineffective __USE_MINGW_ANSI_STDIO from Win64 mingw test run",
"is_bot": false,
"headline": "Merge pull request #983 from libffi/ci-drop-mingw-ansi-stdio",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T13:43:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad506b7055ce76f7254c821a68149e4e38807da0",
"body": "… run\n\nThe RUNTESTFLAGS=\"TOOL_OPTIONS=-D__USE_MINGW_ANSI_STDIO=1\" added to silence the\nlong double %Lf/%Lg -Wformat warnings on x86_64-w64-mingw32 does not actually\nwork: the flag reaches the compile line but gcc's -Wformat still uses the MS\nprintf archetype with the mingw headers on the runner, so \n[…]\ne environmental printf-format issue they are, so the\nineffective flag is just noise -- remove it and let the baseline handle them.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: drop ineffective __USE_MINGW_ANSI_STDIO from the Win64 mingw test…",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T12:36:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "78417bf2e6ca007fe4c9ff9cb74b31a55a2f3cae",
"body": "Upstream 2.8.6 already replaced the old x86 'bsrl' inline asm in\ncompute_tree_index/compute_bit2idx with __builtin_clz/__builtin_ctz, but gated\nthe intrinsic path to __i386__/__x86_64__; every other GNU-compatible target\nfell back to the generic C bit-twiddling (or ffs()). __builtin_clz/__builtin_c\n[…]\nes suite 588/0 (unchanged); the macros compile and emit\nclz/ctz instructions for aarch64/riscv64/ppc64le/s390x/arm/mips64/sparc64.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "dlmalloc: use __builtin_clz/ctz bit-index on all GNU compilers (#754)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T12:16:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2f61bf2213bbda7b348f13c1d58947c5fa33f858",
"body": null,
"is_bot": false,
"headline": "Add atomic intrinsics for MSVC to dlmalloc.c",
"author_name": "Emil Taylor Bye",
"author_login": "emiltayl",
"committed_at": "2026-06-20T12:07:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0bff58c1043064d7cb0e825107ba79946c2bae51",
"body": "Prepare libffi 3.6.0 release",
"is_bot": false,
"headline": "Merge pull request #978 from libffi/prep-3.6.0-release",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T12:06:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2388f6dcfac3c434472668d32c805ec34a08ce2d",
"body": "doc: note that freeing an in-use closure is unsafe (#835)",
"is_bot": false,
"headline": "Merge pull request #980 from libffi/doc-closure-free-safety",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T12:02:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "68be21507f1008e069e572b585dee75d48249528",
"body": "Portability: strict-C99 and clang-assembler fixes (#795, #851, #947)",
"is_bot": false,
"headline": "Merge pull request #979 from libffi/portability-c99-clang-asm",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T12:01:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "72ce931309653640ddd4e687a30a8293b95f909c",
"body": "Clarify in the ffi_closure_free documentation that a closure must not be freed\nwhile it may still be invoked -- including from within its own callback -- since\nthat frees the executable trampoline still in use. (It may appear to work by\nluck on some targets, but is not safe in general.)\n\nFixes #835\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "doc: note that freeing a closure in use is unsafe (#835)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T08:35:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "f554e4ce0cb10ace600819e08beefd6593cdedc0",
"body": "When HAVE_AS_X86_PCREL is not defined (e.g. builds that don't run libffi's\nautoconf checks, such as the meson port), the unwind tables fall back to the\n'X@rel' relocation variant, which clang's integrated assembler rejects with\n\"invalid variant 'rel'\". The pc-relative label difference 'X - .' assem\n[…]\n for clang. The gcc/other path (which\nmay target Sun as on Solaris) is left on @rel. Verified end-to-end with clang.\n\nFixes #947\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86: use pc-relative label difference for clang's assembler (#947)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T08:33:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2760a1e2c828a9d7ab2169ff31c0c495a0c5f2d4",
"body": "Clang (e.g. the Android NDK) only provides the 'asm' keyword in GNU modes; under\na strict -std=c99 it errors with \"use of undeclared identifier 'asm'\". Replace\nthe bare 'asm' keyword with the always-available __asm__ spelling across the\naffected backends (aarch64, alpha, frv, ia64, moxie, or1k, pa,\n[…]\nompilers; verified the __asm__/__asm__ volatile/register-__asm__ forms compile\nunder gcc and clang -std=c99 -pedantic.\n\nFixes #851\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "use __asm__ instead of the asm keyword for strict C99 (#851)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T08:33:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "08487a6214d4419430b0e8e7dcb3ec967caf8f6f",
"body": "The ffi_closure struct uses an anonymous union, which is C11 (a GNU extension\nin C99). Including <ffi.h> with -std=c99 -pedantic warned (and broke -Werror\nusers). Prefix the union with __extension__ on GNU compilers so the field\nnames are kept without the pedantic diagnostic; MSVC accepts anonymous unions\nnatively. Verified with gcc and clang under -std=c99 -pedantic -Werror.\n\nFixes #795\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ffi.h: avoid -Wpedantic warning on the anonymous union under C99 (#795)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T08:33:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "ad4471039fa55c7e001aef031da297df30c952ae",
"body": "Bump version to 3.6.0, libtool version-info to 11:1:3 (revision++; no public\ninterface change since 3.5.2), set the release date, and record the dlmalloc\n2.8.6 update and the #873 ThreadSanitizer fix in the history.\n\nNOTE: the release date (June 20, 2026) is a placeholder -- adjust to the actual\ntag date before merging.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "Prepare libffi 3.6.0 release",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T07:47:51Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "bc0ebb2e04c39fa750c3c6ebd93755f9b4762d77",
"body": "dlmalloc: make mparams init and spin-lock peek TSAN-clean (fix #873)",
"is_bot": false,
"headline": "Merge pull request #977 from libffi/dlmalloc-tsan-clean",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T07:36:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fc67b31ab8c0871dd94385f018fc55413bc034b5",
"body": "dlmalloc reads two lock-free locations on every allocation that race with\nwrites elsewhere; ThreadSanitizer flags both (libffi issue #873). The 2.8.6\nupdate did not fix #873 -- confirmed with a -fsanitize=thread build of the\nlibffi.threads/tsan.c 20-thread test, which reported two data races on glo\n[…]\n test reports zero data races across 20 runs; the normal\ntestsuite is unaffected (the atomic accesses read/write the same values).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "dlmalloc: make mparams init and spin-lock peek TSAN-clean",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T07:30:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d3f96bee061158b0934a08ca2355e4e92fcc4b98",
"body": "dlmalloc: update bundled allocator 2.8.3 → 2.8.6",
"is_bot": false,
"headline": "Merge pull request #975 from libffi/update-dlmalloc-2.8.6",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T07:03:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "97006e1a2d7f846b02e19411672c09a0f4aae56b",
"body": null,
"is_bot": false,
"headline": "Merge remote-tracking branch 'origin/master' into update-dlmalloc-2.8.6",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T01:55:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e3eeaffbf7cf98e6991fe3995ab0826a461545e",
"body": "x86: support IEEE binary128 long double on x86_64 (Android)",
"is_bot": false,
"headline": "Merge pull request #976 from libffi/x86_64-android-binary128-longdouble",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T00:08:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2aabe7eb739a16197ed0fcaacb45eeba76149c19",
"body": "On most x86_64 targets `long double` is the 80-bit x87 type, which the SysV\npsABI classifies X87/X87UP, passes in memory, and returns in st(0). But some\nx86_64 targets -- notably Android (bionic), and anything built with\n-mlong-double-128 -- make `long double` the IEEE binary128 quad type, which th\n[…]\nand a closure -- both preserve all 113 mantissa bits.\nx87 long double regression is clean (full testsuite, 0 unexpected failures).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "x86: support IEEE binary128 long double on x86_64 (e.g. Android)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-20T00:04:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "26a1c8cddcbdbbd1b5bae43e89c9deb20477d99e",
"body": "The Win64 mingw build failed:\n\n dlmalloc.c: error: multiple storage classes in declaration specifiers\n (at static FORCEINLINE win32mmap / win32direct_mmap / win32munmap)\n\nmingw-w64's <windows.h> (included in dlmalloc's WIN32 block) defines\nFORCEINLINE with an 'extern' storage class, so the upstrea\n[…]\nkeeping the PAGE_EXECUTE_READWRITE change). They are trivial\nwrappers, so dropping the forced-inline hint has no practical effect.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "dlmalloc: drop FORCEINLINE on win32 mmap helpers (fix mingw build)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T23:16:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "17bce72aa5e2c396983b3c4ffa83a15e1cf453fa",
"body": "ci: make Win64 mingw job actually run the testsuite",
"is_bot": false,
"headline": "Merge pull request #973 from libffi/ci-win64-mingw-real-tests",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T22:36:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a00d2dd3b650e4d7d1b19008e1879179fa7dd315",
"body": "build: fix make dist failure from missing README \"was released on\" line",
"is_bot": false,
"headline": "Merge pull request #974 from libffi/ci-fix-dist-hook-readme",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T22:35:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "326fff39c41a3c076c63f18b216fb0a44104edf4",
"body": "The MSVC Win64 build failed compiling the ported dlmalloc:\n\n dlmalloc.c: error C2065: 'malloc_getpagesize': undeclared identifier\n\nUpstream 2.8.6 defines malloc_getpagesize only under #ifndef WIN32 (WIN32\nbuilds use GetSystemInfo in init_mparams), and the init_mparams reference is\nlikewise guarded \n[…]\n is never used (GetSystemInfo supplies the page size), so behavior is\nunchanged. It just guarantees the translation unit compiles.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "dlmalloc: always define malloc_getpagesize (fix MSVC Win64 build)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T22:33:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "7e93373fb08960df21ded627b5380a27b7ccc091",
"body": "With the testsuite now actually running on x86_64-w64-mingw32, 5 long double\ntests (float2, cls_longdouble, cls_align_longdouble_split{,2}, huge_struct)\nfailed \"(test for excess errors)\" -- not real bugs, just -Wformat warnings:\n\n warning: format '%Lf' expects argument of type 'double',\n \n[…]\nctly -- clearing the warnings and producing correct output (e.g.\nhuge_struct's output-pattern check). No-op on the Cygwin targets.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: fix Win64 mingw long double tests via __USE_MINGW_ANSI_STDIO",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T21:36:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2a0b4b52cad6715cb1fe6ab5a8189ebdeaea7c74",
"body": "Re-bases libffi's bundled dlmalloc on Doug Lea's pristine 2.8.6 (the last\nupstream release) instead of the heavily-diverged 2.8.3 fork we carried.\n\nMethod: rather than line-merging 2.8.3->2.8.6 onto our fork (which silently\nduplicated/stranded code where upstream's restructuring didn't align), this\n\n[…]\nx86_64-pc-linux-gnu: closures 588/0, full suite 2468/0.\nDraft pending the full CI matrix to exercise the W^X paths cross-platform.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "dlmalloc: update bundled allocator from 2.8.3 to 2.8.6",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T21:31:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9db3ee0b8041127ec1c97e424b6845ed2d41096e",
"body": "…line\n\nThe dist-hook trims README.md by locating the \"<version> was released on ...\"\nline and tail'ing from just above it. Commit 35f3a8f replaced that line with a\n\"This is WIP repo ...\" banner in preparation for 3.6.0, so the awk now returns\nempty, $((s-1)) becomes -1, and `tail -n +-1` aborts `mak\n[…]\nerbatim when the marker is absent; tagged releases that\nrestore a \"was released on\" line still get the original trimming behavior.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "build: don't let dist-hook fail when README has no \"was released on\" …",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T20:52:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "9aeda2a51a55a2a64ec4b74f23c9ab8fc0519ffe",
"body": "The x86_64-w64-mingw32 job has been green since 3.5.0-pre0 but exercised\nnothing: every one of its ~310 testsuite compiles failed with\n\n ffitest.h:8:10: fatal error: ffi.h: No such file or directory\n\neven though configure generates ffi.h at x86_64-w64-mingw32/include/ffi.h and\nthe test compile's -I\n[…]\nreal Win64 mingw test results that were previously\ninvisible; the rlgl-policy baseline will need refreshing for whatever shows up.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: give Win64 mingw job a Cygwin-hosted toolchain so tests actually run",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T20:46:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "22c1a3e67a06c498c94dd5fca85692f9ae80dd8f",
"body": "The Android job's \"Set up QEMU (binfmt)\" step used docker/setup-qemu-action's\ndefault, which runs `tonistiigi/binfmt --install all` and registers binfmt\nhandlers for every arch -- including x86_64/i686, with the F (fix-binary) flag.\nThat forced the statically-linked x86_64 Android test binaries (nat\n[…]\n arm64,arm so only the genuinely foreign binaries run under\nemulation; the x86 Android binaries run natively on real x87 hardware.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: don't route native x86 Android tests through qemu-x86_64",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T20:29:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e815b3683e53f4af8b04b635617c72ec3112ff55",
"body": null,
"is_bot": false,
"headline": "ci: cave workflow note — privileged is opt-in (privileged: true)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T20:24:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "69378c94a7d4bfc08f2f158544148e7268ac4999",
"body": "…ners ok)",
"is_bot": false,
"headline": "ci: cave workflow note — job containers are privileged (nested contai…",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T20:17:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1af78f88eb3b923d89817a33fd30ed4f8fa030d9",
"body": "Clean native x86_64 build + dejagnu test gated by rlgl, in cave's workflow\nformat (.cave/workflows), so the libffi mirror's CI runs on cave's\nself-hosted runners. GitHub Actions ignores .cave/; cave's pull-mirror sync\npicks it up and runs it on the cave runner.",
"is_bot": false,
"headline": "ci: add cave workflow for the cave.moxielogic.com mirror",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T20:15:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d6cea487cd19841eb083e2d2a8e0b7d7e6aee14d",
"body": "Android tests were cross-compiled but never run (dejagnu exec'd them on the\nubuntu host), so all ~722 execution tests failed and were baselined. Link the\ntest binaries statically (--target_board=unix/-static) so they need no bionic\nloader/sysroot, register qemu-user binfmt, and let them execute: x86_64/i686\nrun on the host (Android is a Linux kernel), aarch64/armv7 under qemu-user.",
"is_bot": false,
"headline": "ci: actually execute Android tests (static + qemu-user)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T19:59:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c8cf0cda7d66c4bc8a72078be914eb2cf0a2152a",
"body": "clang defines __SIZEOF_INT128__ but rejects _Complex __int128, so the test\nfailed to compile (excess-errors FAIL + UNRESOLVED execution) on clang\ntargets. Exclude __clang__ from the guard so clang falls through to the\ntrivial main(), the same no-op path already used on platforms without\nint128/complex support; gcc still runs the full test.",
"is_bot": false,
"headline": "testsuite: skip complex_i128 on clang (no _Complex __int128)",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T19:36:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "88243588b3e6f5318ad3fcf49a626b96c1ea6820",
"body": "The rlgl HTML report links to a sibling rlgl-report-original.<ext> file that\nrlgl writes next to it, but we only uploaded/published rlgl-report.html, so\nthe link 404'd on Pages. Upload both via the rlgl-report* glob and copy the\noriginal log next to index.html when publishing.",
"is_bot": false,
"headline": "ci: publish rlgl's original-report log so report links resolve",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T19:26:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7b159e655916249e827fbd30a17748309d278d2d",
"body": "GitHub's free Intel macOS runners are gone, so test the x86_64 ABI by building\nx86_64 on a macos-14 (arm64) runner with clang -arch x86_64 and running the\ndejagnu testsuite under Rosetta 2. New MACOS_X86 env flag routes build.sh to\nbuild_linux (dejagnu + rlgl) with --host=x86_64-apple-darwin, bypassing the\nlegacy xcodebuild build_macosx path.",
"is_bot": false,
"headline": "ci: add x86_64 macOS coverage via Rosetta on Apple Silicon",
"author_name": "Anthony Green",
"author_login": "atgreen",
"committed_at": "2026-06-19T19:20:39Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 20,
"commits_last_year": 145,
"latest_release_at": "2026-07-10T14:00:02Z",
"latest_release_tag": "v3.7.1",
"releases_from_tags": false,
"days_since_last_push": 11,
"active_weeks_last_year": 17,
"days_since_latest_release": 11,
"mean_days_between_releases": 97
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 50,
"has_issue_template": true,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 823,
"stars": 4324,
"watchers": 89,
"fork_history": {
"days": [
{
"date": "2010-07-09",
"count": 1
},
{
"date": "2010-09-18",
"count": 1
},
{
"date": "2010-11-12",
"count": 1
},
{
"date": "2011-09-06",
"count": 1
},
{
"date": "2011-10-19",
"count": 1
},
{
"date": "2011-11-02",
"count": 1
},
{
"date": "2011-11-15",
"count": 1
},
{
"date": "2011-11-25",
"count": 1
},
{
"date": "2012-01-17",
"count": 1
},
{
"date": "2012-03-03",
"count": 1
},
{
"date": "2012-04-11",
"count": 1
},
{
"date": "2012-04-15",
"count": 1
},
{
"date": "2012-07-07",
"count": 1
},
{
"date": "2012-08-04",
"count": 1
},
{
"date": "2012-10-29",
"count": 1
},
{
"date": "2012-11-26",
"count": 1
},
{
"date": "2012-12-30",
"count": 1
},
{
"date": "2012-12-31",
"count": 1
},
{
"date": "2013-01-09",
"count": 1
},
{
"date": "2013-01-22",
"count": 1
},
{
"date": "2013-01-23",
"count": 1
},
{
"date": "2013-01-26",
"count": 2
},
{
"date": "2013-01-28",
"count": 1
},
{
"date": "2013-02-15",
"count": 1
},
{
"date": "2013-02-19",
"count": 1
},
{
"date": "2013-03-10",
"count": 1
},
{
"date": "2013-03-14",
"count": 1
},
{
"date": "2013-03-22",
"count": 1
},
{
"date": "2013-04-01",
"count": 1
},
{
"date": "2013-04-19",
"count": 1
},
{
"date": "2013-04-23",
"count": 1
},
{
"date": "2013-06-12",
"count": 1
},
{
"date": "2013-06-17",
"count": 1
},
{
"date": "2013-07-02",
"count": 1
},
{
"date": "2013-09-07",
"count": 1
},
{
"date": "2013-09-08",
"count": 1
},
{
"date": "2013-09-29",
"count": 1
},
{
"date": "2013-11-07",
"count": 1
},
{
"date": "2013-11-13",
"count": 1
},
{
"date": "2013-11-18",
"count": 1
},
{
"date": "2013-12-20",
"count": 1
},
{
"date": "2014-01-02",
"count": 2
},
{
"date": "2014-01-04",
"count": 1
},
{
"date": "2014-01-13",
"count": 1
},
{
"date": "2014-02-03",
"count": 1
},
{
"date": "2014-02-10",
"count": 1
},
{
"date": "2014-02-22",
"count": 1
},
{
"date": "2014-03-04",
"count": 1
},
{
"date": "2014-03-05",
"count": 1
},
{
"date": "2014-03-16",
"count": 1
},
{
"date": "2014-05-11",
"count": 1
},
{
"date": "2014-05-18",
"count": 1
},
{
"date": "2014-06-11",
"count": 1
},
{
"date": "2014-06-25",
"count": 1
},
{
"date": "2014-07-03",
"count": 1
},
{
"date": "2014-07-18",
"count": 1
},
{
"date": "2014-08-06",
"count": 1
},
{
"date": "2014-09-01",
"count": 1
},
{
"date": "2014-09-17",
"count": 1
},
{
"date": "2014-09-24",
"count": 1
},
{
"date": "2014-10-10",
"count": 1
},
{
"date": "2014-10-14",
"count": 1
},
{
"date": "2014-11-09",
"count": 1
},
{
"date": "2014-11-12",
"count": 1
},
{
"date": "2014-11-13",
"count": 2
},
{
"date": "2014-11-18",
"count": 1
},
{
"date": "2014-12-01",
"count": 1
},
{
"date": "2014-12-02",
"count": 1
},
{
"date": "2014-12-22",
"count": 1
},
{
"date": "2015-01-07",
"count": 1
},
{
"date": "2015-01-08",
"count": 1
},
{
"date": "2015-01-25",
"count": 1
},
{
"date": "2015-02-18",
"count": 1
},
{
"date": "2015-03-01",
"count": 1
},
{
"date": "2015-03-05",
"count": 1
},
{
"date": "2015-03-06",
"count": 1
},
{
"date": "2015-03-12",
"count": 2
},
{
"date": "2015-03-25",
"count": 1
},
{
"date": "2015-04-18",
"count": 1
},
{
"date": "2015-04-22",
"count": 1
},
{
"date": "2015-04-26",
"count": 1
},
{
"date": "2015-05-01",
"count": 1
},
{
"date": "2015-05-11",
"count": 1
},
{
"date": "2015-05-12",
"count": 1
},
{
"date": "2015-06-23",
"count": 1
},
{
"date": "2015-07-15",
"count": 1
},
{
"date": "2015-07-17",
"count": 1
},
{
"date": "2015-07-24",
"count": 1
},
{
"date": "2015-07-25",
"count": 1
},
{
"date": "2015-07-31",
"count": 1
},
{
"date": "2015-08-03",
"count": 1
},
{
"date": "2015-08-04",
"count": 1
},
{
"date": "2015-09-14",
"count": 1
},
{
"date": "2015-09-23",
"count": 1
},
{
"date": "2015-10-05",
"count": 1
},
{
"date": "2015-10-16",
"count": 1
},
{
"date": "2015-10-18",
"count": 1
},
{
"date": "2015-10-19",
"count": 1
},
{
"date": "2015-10-22",
"count": 1
},
{
"date": "2015-10-27",
"count": 1
},
{
"date": "2015-10-30",
"count": 1
},
{
"date": "2015-11-03",
"count": 1
},
{
"date": "2015-12-04",
"count": 1
},
{
"date": "2015-12-16",
"count": 1
},
{
"date": "2016-01-02",
"count": 1
},
{
"date": "2016-01-06",
"count": 1
},
{
"date": "2016-01-23",
"count": 1
},
{
"date": "2016-01-28",
"count": 2
},
{
"date": "2016-03-16",
"count": 1
},
{
"date": "2016-03-24",
"count": 1
},
{
"date": "2016-03-28",
"count": 1
},
{
"date": "2016-04-05",
"count": 1
},
{
"date": "2016-04-08",
"count": 1
},
{
"date": "2016-04-10",
"count": 1
},
{
"date": "2016-04-19",
"count": 2
},
{
"date": "2016-04-30",
"count": 1
},
{
"date": "2016-05-19",
"count": 1
},
{
"date": "2016-05-31",
"count": 1
},
{
"date": "2016-06-22",
"count": 1
},
{
"date": "2016-07-12",
"count": 1
},
{
"date": "2016-07-23",
"count": 1
},
{
"date": "2016-08-09",
"count": 1
},
{
"date": "2016-08-10",
"count": 1
},
{
"date": "2016-08-15",
"count": 1
},
{
"date": "2016-08-27",
"count": 1
},
{
"date": "2016-08-29",
"count": 1
},
{
"date": "2016-09-05",
"count": 1
},
{
"date": "2016-09-08",
"count": 2
},
{
"date": "2016-09-13",
"count": 1
},
{
"date": "2016-09-19",
"count": 1
},
{
"date": "2016-09-22",
"count": 2
},
{
"date": "2016-10-14",
"count": 1
},
{
"date": "2016-10-22",
"count": 1
},
{
"date": "2016-11-01",
"count": 1
},
{
"date": "2016-11-02",
"count": 1
},
{
"date": "2016-11-10",
"count": 1
},
{
"date": "2016-11-15",
"count": 1
},
{
"date": "2016-12-02",
"count": 1
},
{
"date": "2016-12-08",
"count": 1
},
{
"date": "2016-12-19",
"count": 2
},
{
"date": "2016-12-22",
"count": 1
},
{
"date": "2016-12-30",
"count": 2
},
{
"date": "2017-01-08",
"count": 1
},
{
"date": "2017-01-10",
"count": 1
},
{
"date": "2017-02-17",
"count": 1
},
{
"date": "2017-02-22",
"count": 1
},
{
"date": "2017-02-26",
"count": 1
},
{
"date": "2017-04-05",
"count": 1
},
{
"date": "2017-04-14",
"count": 1
},
{
"date": "2017-05-03",
"count": 1
},
{
"date": "2017-05-16",
"count": 1
},
{
"date": "2017-05-17",
"count": 1
},
{
"date": "2017-05-26",
"count": 1
},
{
"date": "2017-05-30",
"count": 1
},
{
"date": "2017-06-29",
"count": 1
},
{
"date": "2017-07-19",
"count": 1
},
{
"date": "2017-07-29",
"count": 1
},
{
"date": "2017-07-31",
"count": 1
},
{
"date": "2017-08-03",
"count": 1
},
{
"date": "2017-08-17",
"count": 1
},
{
"date": "2017-09-08",
"count": 1
},
{
"date": "2017-09-19",
"count": 1
},
{
"date": "2017-09-23",
"count": 1
},
{
"date": "2017-09-24",
"count": 1
},
{
"date": "2017-09-28",
"count": 1
},
{
"date": "2017-09-30",
"count": 1
},
{
"date": "2017-10-01",
"count": 1
},
{
"date": "2017-10-02",
"count": 1
},
{
"date": "2017-10-03",
"count": 1
},
{
"date": "2017-10-12",
"count": 1
},
{
"date": "2017-10-16",
"count": 1
},
{
"date": "2017-10-23",
"count": 1
},
{
"date": "2017-10-25",
"count": 1
},
{
"date": "2017-11-09",
"count": 1
},
{
"date": "2017-11-22",
"count": 1
},
{
"date": "2017-11-30",
"count": 1
},
{
"date": "2017-12-22",
"count": 1
},
{
"date": "2018-01-13",
"count": 2
},
{
"date": "2018-01-31",
"count": 1
},
{
"date": "2018-02-03",
"count": 1
},
{
"date": "2018-02-23",
"count": 1
},
{
"date": "2018-02-28",
"count": 1
},
{
"date": "2018-03-03",
"count": 1
},
{
"date": "2018-03-16",
"count": 1
},
{
"date": "2018-03-19",
"count": 1
},
{
"date": "2018-03-25",
"count": 1
},
{
"date": "2018-04-05",
"count": 1
},
{
"date": "2018-04-10",
"count": 1
},
{
"date": "2018-04-12",
"count": 2
},
{
"date": "2018-04-17",
"count": 1
},
{
"date": "2018-04-25",
"count": 1
},
{
"date": "2018-04-29",
"count": 1
},
{
"date": "2018-05-07",
"count": 1
},
{
"date": "2018-05-08",
"count": 2
},
{
"date": "2018-05-25",
"count": 1
},
{
"date": "2018-05-28",
"count": 1
},
{
"date": "2018-06-05",
"count": 1
},
{
"date": "2018-06-11",
"count": 1
},
{
"date": "2018-06-13",
"count": 1
},
{
"date": "2018-06-21",
"count": 1
},
{
"date": "2018-07-20",
"count": 1
},
{
"date": "2018-08-01",
"count": 1
},
{
"date": "2018-08-13",
"count": 1
},
{
"date": "2018-08-24",
"count": 1
},
{
"date": "2018-08-30",
"count": 1
},
{
"date": "2018-09-07",
"count": 2
},
{
"date": "2018-09-19",
"count": 1
},
{
"date": "2018-09-21",
"count": 1
},
{
"date": "2018-10-04",
"count": 1
},
{
"date": "2018-10-09",
"count": 1
},
{
"date": "2018-10-13",
"count": 1
},
{
"date": "2018-10-14",
"count": 1
},
{
"date": "2018-10-20",
"count": 1
},
{
"date": "2018-10-24",
"count": 2
},
{
"date": "2018-11-02",
"count": 1
},
{
"date": "2018-11-15",
"count": 1
},
{
"date": "2018-11-21",
"count": 1
},
{
"date": "2018-11-23",
"count": 1
},
{
"date": "2018-11-26",
"count": 2
},
{
"date": "2018-12-26",
"count": 1
},
{
"date": "2018-12-28",
"count": 2
},
{
"date": "2019-01-03",
"count": 1
},
{
"date": "2019-01-23",
"count": 1
},
{
"date": "2019-01-24",
"count": 1
},
{
"date": "2019-02-10",
"count": 1
},
{
"date": "2019-02-12",
"count": 1
},
{
"date": "2019-02-21",
"count": 1
},
{
"date": "2019-02-27",
"count": 1
},
{
"date": "2019-03-04",
"count": 1
},
{
"date": "2019-03-05",
"count": 1
},
{
"date": "2019-03-18",
"count": 1
},
{
"date": "2019-03-19",
"count": 1
},
{
"date": "2019-03-29",
"count": 1
},
{
"date": "2019-04-04",
"count": 1
},
{
"date": "2019-04-08",
"count": 1
},
{
"date": "2019-04-11",
"count": 1
},
{
"date": "2019-04-14",
"count": 1
},
{
"date": "2019-04-15",
"count": 1
},
{
"date": "2019-04-17",
"count": 1
},
{
"date": "2019-04-21",
"count": 1
},
{
"date": "2019-04-23",
"count": 1
},
{
"date": "2019-04-24",
"count": 1
},
{
"date": "2019-05-01",
"count": 1
},
{
"date": "2019-05-03",
"count": 1
},
{
"date": "2019-05-21",
"count": 1
},
{
"date": "2019-05-23",
"count": 1
},
{
"date": "2019-05-30",
"count": 1
},
{
"date": "2019-06-02",
"count": 1
},
{
"date": "2019-06-13",
"count": 1
},
{
"date": "2019-06-18",
"count": 1
},
{
"date": "2019-06-22",
"count": 1
},
{
"date": "2019-06-24",
"count": 1
},
{
"date": "2019-07-10",
"count": 1
},
{
"date": "2019-07-18",
"count": 1
},
{
"date": "2019-07-29",
"count": 1
},
{
"date": "2019-08-01",
"count": 1
},
{
"date": "2019-08-05",
"count": 1
},
{
"date": "2019-08-09",
"count": 1
},
{
"date": "2019-08-12",
"count": 1
},
{
"date": "2019-08-21",
"count": 1
},
{
"date": "2019-08-28",
"count": 1
},
{
"date": "2019-09-08",
"count": 1
},
{
"date": "2019-09-13",
"count": 1
},
{
"date": "2019-09-16",
"count": 1
},
{
"date": "2019-10-15",
"count": 1
},
{
"date": "2019-10-16",
"count": 1
},
{
"date": "2019-10-22",
"count": 1
},
{
"date": "2019-11-06",
"count": 1
},
{
"date": "2019-11-10",
"count": 1
},
{
"date": "2019-11-12",
"count": 1
},
{
"date": "2019-11-13",
"count": 1
},
{
"date": "2019-11-27",
"count": 1
},
{
"date": "2019-12-05",
"count": 3
},
{
"date": "2019-12-09",
"count": 1
},
{
"date": "2019-12-10",
"count": 2
},
{
"date": "2019-12-20",
"count": 1
},
{
"date": "2020-01-02",
"count": 1
},
{
"date": "2020-01-03",
"count": 1
},
{
"date": "2020-01-05",
"count": 1
},
{
"date": "2020-01-14",
"count": 1
},
{
"date": "2020-01-15",
"count": 1
},
{
"date": "2020-01-17",
"count": 1
},
{
"date": "2020-01-19",
"count": 1
},
{
"date": "2020-01-28",
"count": 1
},
{
"date": "2020-02-24",
"count": 1
},
{
"date": "2020-03-07",
"count": 2
},
{
"date": "2020-03-19",
"count": 1
},
{
"date": "2020-03-24",
"count": 2
},
{
"date": "2020-03-27",
"count": 1
},
{
"date": "2020-04-05",
"count": 2
},
{
"date": "2020-04-20",
"count": 1
},
{
"date": "2020-04-27",
"count": 1
},
{
"date": "2020-04-28",
"count": 2
},
{
"date": "2020-05-11",
"count": 1
},
{
"date": "2020-05-12",
"count": 1
},
{
"date": "2020-05-29",
"count": 1
},
{
"date": "2020-05-31",
"count": 1
},
{
"date": "2020-06-05",
"count": 1
},
{
"date": "2020-06-20",
"count": 1
},
{
"date": "2020-06-27",
"count": 1
},
{
"date": "2020-07-07",
"count": 1
},
{
"date": "2020-07-08",
"count": 2
},
{
"date": "2020-07-09",
"count": 2
},
{
"date": "2020-07-10",
"count": 1
},
{
"date": "2020-07-14",
"count": 1
},
{
"date": "2020-07-21",
"count": 1
},
{
"date": "2020-07-22",
"count": 1
},
{
"date": "2020-07-26",
"count": 1
},
{
"date": "2020-07-27",
"count": 1
},
{
"date": "2020-08-04",
"count": 1
},
{
"date": "2020-08-06",
"count": 1
},
{
"date": "2020-08-07",
"count": 1
},
{
"date": "2020-08-12",
"count": 1
},
{
"date": "2020-08-13",
"count": 1
},
{
"date": "2020-08-20",
"count": 1
},
{
"date": "2020-08-25",
"count": 1
},
{
"date": "2020-08-28",
"count": 1
},
{
"date": "2020-09-01",
"count": 1
},
{
"date": "2020-09-02",
"count": 1
},
{
"date": "2020-09-03",
"count": 2
},
{
"date": "2020-09-11",
"count": 1
},
{
"date": "2020-09-13",
"count": 1
},
{
"date": "2020-09-14",
"count": 1
},
{
"date": "2020-09-16",
"count": 1
},
{
"date": "2020-09-21",
"count": 1
},
{
"date": "2020-10-03",
"count": 2
},
{
"date": "2020-10-05",
"count": 1
},
{
"date": "2020-10-08",
"count": 1
},
{
"date": "2020-10-09",
"count": 1
},
{
"date": "2020-10-11",
"count": 1
},
{
"date": "2020-10-25",
"count": 1
},
{
"date": "2020-11-12",
"count": 1
},
{
"date": "2020-11-13",
"count": 1
},
{
"date": "2020-11-17",
"count": 2
},
{
"date": "2020-11-20",
"count": 2
},
{
"date": "2020-11-21",
"count": 1
},
{
"date": "2020-11-22",
"count": 2
},
{
"date": "2020-11-29",
"count": 1
},
{
"date": "2020-12-01",
"count": 1
},
{
"date": "2020-12-10",
"count": 1
},
{
"date": "2020-12-16",
"count": 1
},
{
"date": "2020-12-21",
"count": 1
},
{
"date": "2020-12-29",
"count": 1
},
{
"date": "2021-01-05",
"count": 1
},
{
"date": "2021-01-14",
"count": 1
},
{
"date": "2021-01-19",
"count": 2
},
{
"date": "2021-01-25",
"count": 1
},
{
"date": "2021-02-01",
"count": 1
},
{
"date": "2021-02-03",
"count": 1
},
{
"date": "2021-02-04",
"count": 1
},
{
"date": "2021-02-05",
"count": 1
},
{
"date": "2021-02-10",
"count": 1
},
{
"date": "2021-02-12",
"count": 1
},
{
"date": "2021-02-23",
"count": 1
},
{
"date": "2021-02-26",
"count": 1
},
{
"date": "2021-03-11",
"count": 1
},
{
"date": "2021-03-16",
"count": 1
},
{
"date": "2021-03-21",
"count": 1
},
{
"date": "2021-03-25",
"count": 1
},
{
"date": "2021-03-30",
"count": 1
},
{
"date": "2021-04-02",
"count": 1
},
{
"date": "2021-04-27",
"count": 1
},
{
"date": "2021-05-19",
"count": 1
},
{
"date": "2021-05-25",
"count": 1
},
{
"date": "2021-06-07",
"count": 1
},
{
"date": "2021-06-09",
"count": 2
},
{
"date": "2021-06-10",
"count": 1
},
{
"date": "2021-06-16",
"count": 1
},
{
"date": "2021-06-21",
"count": 1
},
{
"date": "2021-06-23",
"count": 1
},
{
"date": "2021-06-26",
"count": 2
},
{
"date": "2021-07-05",
"count": 1
},
{
"date": "2021-07-07",
"count": 1
},
{
"date": "2021-07-13",
"count": 1
},
{
"date": "2021-07-22",
"count": 1
},
{
"date": "2021-07-23",
"count": 1
},
{
"date": "2021-08-02",
"count": 1
},
{
"date": "2021-08-18",
"count": 1
},
{
"date": "2021-08-19",
"count": 1
},
{
"date": "2021-08-24",
"count": 1
},
{
"date": "2021-08-26",
"count": 2
},
{
"date": "2021-08-30",
"count": 1
},
{
"date": "2021-09-03",
"count": 1
},
{
"date": "2021-09-08",
"count": 1
},
{
"date": "2021-09-15",
"count": 1
},
{
"date": "2021-09-18",
"count": 1
},
{
"date": "2021-09-20",
"count": 1
},
{
"date": "2021-09-23",
"count": 1
},
{
"date": "2021-09-25",
"count": 1
},
{
"date": "2021-09-29",
"count": 1
},
{
"date": "2021-10-09",
"count": 1
},
{
"date": "2021-10-14",
"count": 1
},
{
"date": "2021-10-25",
"count": 1
},
{
"date": "2021-10-26",
"count": 1
},
{
"date": "2021-10-27",
"count": 2
},
{
"date": "2021-11-01",
"count": 1
},
{
"date": "2021-11-05",
"count": 1
},
{
"date": "2021-11-08",
"count": 1
},
{
"date": "2021-11-21",
"count": 1
},
{
"date": "2021-12-07",
"count": 2
},
{
"date": "2021-12-09",
"count": 1
},
{
"date": "2021-12-14",
"count": 1
},
{
"date": "2021-12-15",
"count": 1
},
{
"date": "2021-12-16",
"count": 1
},
{
"date": "2021-12-17",
"count": 1
},
{
"date": "2021-12-26",
"count": 1
},
{
"date": "2021-12-27",
"count": 1
},
{
"date": "2021-12-28",
"count": 1
},
{
"date": "2022-01-18",
"count": 1
},
{
"date": "2022-01-25",
"count": 2
},
{
"date": "2022-02-08",
"count": 1
},
{
"date": "2022-02-16",
"count": 1
},
{
"date": "2022-02-27",
"count": 1
},
{
"date": "2022-03-03",
"count": 1
},
{
"date": "2022-03-05",
"count": 1
},
{
"date": "2022-03-07",
"count": 1
},
{
"date": "2022-03-08",
"count": 1
},
{
"date": "2022-03-14",
"count": 1
},
{
"date": "2022-03-19",
"count": 1
},
{
"date": "2022-03-23",
"count": 1
},
{
"date": "2022-03-26",
"count": 1
},
{
"date": "2022-03-31",
"count": 2
},
{
"date": "2022-04-01",
"count": 2
},
{
"date": "2022-04-25",
"count": 1
},
{
"date": "2022-04-29",
"count": 1
},
{
"date": "2022-05-01",
"count": 1
},
{
"date": "2022-05-04",
"count": 1
},
{
"date": "2022-05-05",
"count": 1
},
{
"date": "2022-05-06",
"count": 1
},
{
"date": "2022-05-07",
"count": 1
},
{
"date": "2022-05-18",
"count": 1
},
{
"date": "2022-05-20",
"count": 1
},
{
"date": "2022-05-23",
"count": 2
},
{
"date": "2022-05-25",
"count": 1
},
{
"date": "2022-05-28",
"count": 1
},
{
"date": "2022-06-05",
"count": 1
},
{
"date": "2022-06-14",
"count": 1
},
{
"date": "2022-06-15",
"count": 1
},
{
"date": "2022-06-27",
"count": 2
},
{
"date": "2022-06-30",
"count": 1
},
{
"date": "2022-08-05",
"count": 2
},
{
"date": "2022-08-17",
"count": 1
},
{
"date": "2022-08-23",
"count": 1
},
{
"date": "2022-08-30",
"count": 1
},
{
"date": "2022-09-12",
"count": 1
},
{
"date": "2022-09-16",
"count": 2
},
{
"date": "2022-09-19",
"count": 1
},
{
"date": "2022-09-25",
"count": 1
},
{
"date": "2022-09-27",
"count": 1
},
{
"date": "2022-10-03",
"count": 1
},
{
"date": "2022-10-18",
"count": 1
},
{
"date": "2022-10-20",
"count": 1
},
{
"date": "2022-10-23",
"count": 2
},
{
"date": "2022-10-25",
"count": 1
},
{
"date": "2022-10-27",
"count": 1
},
{
"date": "2022-10-28",
"count": 1
},
{
"date": "2022-11-02",
"count": 1
},
{
"date": "2022-11-05",
"count": 1
},
{
"date": "2022-11-06",
"count": 1
},
{
"date": "2022-11-19",
"count": 1
},
{
"date": "2022-11-29",
"count": 1
},
{
"date": "2022-12-02",
"count": 2
},
{
"date": "2022-12-18",
"count": 1
},
{
"date": "2023-01-06",
"count": 1
},
{
"date": "2023-01-10",
"count": 1
},
{
"date": "2023-01-20",
"count": 1
},
{
"date": "2023-01-29",
"count": 1
},
{
"date": "2023-01-31",
"count": 1
},
{
"date": "2023-02-01",
"count": 1
},
{
"date": "2023-02-02",
"count": 1
},
{
"date": "2023-02-06",
"count": 1
},
{
"date": "2023-02-07",
"count": 1
},
{
"date": "2023-02-09",
"count": 1
},
{
"date": "2023-02-18",
"count": 1
},
{
"date": "2023-02-21",
"count": 1
},
{
"date": "2023-03-20",
"count": 1
},
{
"date": "2023-04-17",
"count": 1
},
{
"date": "2023-05-28",
"count": 1
},
{
"date": "2023-05-29",
"count": 2
},
{
"date": "2023-06-02",
"count": 1
},
{
"date": "2023-06-25",
"count": 1
},
{
"date": "2023-06-30",
"count": 1
},
{
"date": "2023-07-13",
"count": 1
},
{
"date": "2023-07-15",
"count": 1
},
{
"date": "2023-08-02",
"count": 1
},
{
"date": "2023-08-09",
"count": 1
},
{
"date": "2023-08-10",
"count": 1
},
{
"date": "2023-08-18",
"count": 1
},
{
"date": "2023-08-31",
"count": 1
},
{
"date": "2023-09-05",
"count": 1
},
{
"date": "2023-09-21",
"count": 1
},
{
"date": "2023-09-26",
"count": 1
},
{
"date": "2023-09-28",
"count": 1
},
{
"date": "2023-10-07",
"count": 1
},
{
"date": "2023-10-10",
"count": 1
},
{
"date": "2023-10-20",
"count": 1
},
{
"date": "2023-10-26",
"count": 1
},
{
"date": "2023-10-29",
"count": 1
},
{
"date": "2023-11-04",
"count": 1
},
{
"date": "2023-11-12",
"count": 1
},
{
"date": "2023-11-22",
"count": 2
},
{
"date": "2023-11-23",
"count": 1
},
{
"date": "2023-11-26",
"count": 1
},
{
"date": "2023-12-01",
"count": 1
},
{
"date": "2023-12-09",
"count": 1
},
{
"date": "2023-12-11",
"count": 1
},
{
"date": "2023-12-13",
"count": 1
},
{
"date": "2023-12-17",
"count": 1
},
{
"date": "2023-12-21",
"count": 2
},
{
"date": "2023-12-23",
"count": 1
},
{
"date": "2023-12-26",
"count": 1
},
{
"date": "2023-12-27",
"count": 1
},
{
"date": "2024-01-02",
"count": 1
},
{
"date": "2024-01-08",
"count": 1
},
{
"date": "2024-01-09",
"count": 1
},
{
"date": "2024-01-12",
"count": 1
},
{
"date": "2024-01-23",
"count": 1
},
{
"date": "2024-01-27",
"count": 1
},
{
"date": "2024-01-29",
"count": 1
},
{
"date": "2024-01-31",
"count": 1
},
{
"date": "2024-02-10",
"count": 1
},
{
"date": "2024-02-12",
"count": 1
},
{
"date": "2024-03-13",
"count": 1
},
{
"date": "2024-04-14",
"count": 1
},
{
"date": "2024-04-18",
"count": 1
},
{
"date": "2024-05-08",
"count": 1
},
{
"date": "2024-05-27",
"count": 1
},
{
"date": "2024-05-29",
"count": 1
},
{
"date": "2024-05-30",
"count": 1
},
{
"date": "2024-06-05",
"count": 1
},
{
"date": "2024-06-06",
"count": 1
},
{
"date": "2024-06-24",
"count": 1
},
{
"date": "2024-07-06",
"count": 1
},
{
"date": "2024-07-11",
"count": 1
},
{
"date": "2024-07-15",
"count": 1
},
{
"date": "2024-07-17",
"count": 1
},
{
"date": "2024-07-19",
"count": 1
},
{
"date": "2024-07-25",
"count": 1
},
{
"date": "2024-07-27",
"count": 1
},
{
"date": "2024-07-29",
"count": 1
},
{
"date": "2024-08-15",
"count": 1
},
{
"date": "2024-08-17",
"count": 2
},
{
"date": "2024-08-27",
"count": 1
},
{
"date": "2024-09-06",
"count": 1
},
{
"date": "2024-09-10",
"count": 1
},
{
"date": "2024-09-13",
"count": 1
},
{
"date": "2024-09-14",
"count": 1
},
{
"date": "2024-09-18",
"count": 3
},
{
"date": "2024-09-20",
"count": 1
},
{
"date": "2024-09-21",
"count": 1
},
{
"date": "2024-09-23",
"count": 1
},
{
"date": "2024-09-25",
"count": 1
},
{
"date": "2024-10-16",
"count": 1
},
{
"date": "2024-10-17",
"count": 2
},
{
"date": "2024-10-21",
"count": 1
},
{
"date": "2024-10-23",
"count": 2
},
{
"date": "2024-11-04",
"count": 1
},
{
"date": "2024-11-05",
"count": 1
},
{
"date": "2024-11-18",
"count": 1
},
{
"date": "2024-12-11",
"count": 1
},
{
"date": "2024-12-13",
"count": 1
},
{
"date": "2024-12-14",
"count": 2
},
{
"date": "2024-12-17",
"count": 1
},
{
"date": "2025-01-03",
"count": 1
},
{
"date": "2025-01-07",
"count": 1
},
{
"date": "2025-01-10",
"count": 1
},
{
"date": "2025-01-17",
"count": 1
},
{
"date": "2025-01-29",
"count": 2
},
{
"date": "2025-02-02",
"count": 1
},
{
"date": "2025-02-11",
"count": 1
},
{
"date": "2025-02-21",
"count": 1
},
{
"date": "2025-02-27",
"count": 1
},
{
"date": "2025-02-28",
"count": 1
},
{
"date": "2025-03-04",
"count": 1
},
{
"date": "2025-03-06",
"count": 1
},
{
"date": "2025-03-08",
"count": 1
},
{
"date": "2025-03-18",
"count": 1
},
{
"date": "2025-03-24",
"count": 2
},
{
"date": "2025-03-27",
"count": 1
},
{
"date": "2025-04-16",
"count": 1
},
{
"date": "2025-04-21",
"count": 2
},
{
"date": "2025-05-05",
"count": 1
},
{
"date": "2025-05-12",
"count": 1
},
{
"date": "2025-06-01",
"count": 1
},
{
"date": "2025-06-03",
"count": 1
},
{
"date": "2025-06-10",
"count": 1
},
{
"date": "2025-06-13",
"count": 1
},
{
"date": "2025-06-14",
"count": 1
},
{
"date": "2025-06-25",
"count": 1
},
{
"date": "2025-06-26",
"count": 1
},
{
"date": "2025-06-30",
"count": 1
},
{
"date": "2025-07-02",
"count": 1
},
{
"date": "2025-07-11",
"count": 2
},
{
"date": "2025-07-26",
"count": 1
},
{
"date": "2025-07-31",
"count": 1
},
{
"date": "2025-08-14",
"count": 1
},
{
"date": "2025-08-15",
"count": 1
},
{
"date": "2025-08-22",
"count": 1
},
{
"date": "2025-08-29",
"count": 1
},
{
"date": "2025-08-30",
"count": 1
},
{
"date": "2025-09-01",
"count": 1
},
{
"date": "2025-09-11",
"count": 1
},
{
"date": "2025-09-19",
"count": 1
},
{
"date": "2025-09-20",
"count": 1
},
{
"date": "2025-10-09",
"count": 1
},
{
"date": "2025-10-16",
"count": 1
},
{
"date": "2025-10-22",
"count": 1
},
{
"date": "2025-10-24",
"count": 1
},
{
"date": "2025-10-25",
"count": 1
},
{
"date": "2025-10-27",
"count": 1
},
{
"date": "2025-10-28",
"count": 1
},
{
"date": "2025-10-30",
"count": 1
},
{
"date": "2025-11-07",
"count": 1
},
{
"date": "2025-11-09",
"count": 1
},
{
"date": "2025-11-12",
"count": 1
},
{
"date": "2025-11-13",
"count": 1
},
{
"date": "2025-11-14",
"count": 3
},
{
"date": "2025-11-15",
"count": 1
},
{
"date": "2025-11-22",
"count": 1
},
{
"date": "2025-11-25",
"count": 1
},
{
"date": "2025-11-30",
"count": 1
},
{
"date": "2025-12-01",
"count": 1
},
{
"date": "2025-12-05",
"count": 1
},
{
"date": "2025-12-12",
"count": 1
},
{
"date": "2025-12-16",
"count": 1
},
{
"date": "2025-12-19",
"count": 1
},
{
"date": "2025-12-20",
"count": 1
},
{
"date": "2025-12-28",
"count": 1
},
{
"date": "2025-12-30",
"count": 1
},
{
"date": "2026-01-05",
"count": 1
},
{
"date": "2026-01-09",
"count": 1
},
{
"date": "2026-01-11",
"count": 1
},
{
"date": "2026-01-15",
"count": 1
},
{
"date": "2026-01-20",
"count": 1
},
{
"date": "2026-01-30",
"count": 1
},
{
"date": "2026-02-15",
"count": 2
},
{
"date": "2026-03-06",
"count": 1
},
{
"date": "2026-03-07",
"count": 1
},
{
"date": "2026-03-08",
"count": 1
},
{
"date": "2026-03-13",
"count": 1
},
{
"date": "2026-03-15",
"count": 1
},
{
"date": "2026-03-22",
"count": 1
},
{
"date": "2026-03-31",
"count": 1
},
{
"date": "2026-04-10",
"count": 1
},
{
"date": "2026-04-16",
"count": 1
},
{
"date": "2026-04-22",
"count": 1
},
{
"date": "2026-04-24",
"count": 1
},
{
"date": "2026-05-10",
"count": 1
},
{
"date": "2026-05-19",
"count": 2
},
{
"date": "2026-05-25",
"count": 1
},
{
"date": "2026-05-26",
"count": 3
},
{
"date": "2026-06-02",
"count": 1
},
{
"date": "2026-06-07",
"count": 1
},
{
"date": "2026-06-16",
"count": 1
},
{
"date": "2026-06-23",
"count": 1
},
{
"date": "2026-06-24",
"count": 1
},
{
"date": "2026-06-28",
"count": 1
},
{
"date": "2026-07-10",
"count": 2
},
{
"date": "2026-07-12",
"count": 1
},
{
"date": "2026-07-21",
"count": 1
}
],
"complete": true,
"collected": 726,
"total_forks": 823
},
"star_history": {
"days": [
{
"date": "2025-05-03",
"count": 1
},
{
"date": "2025-05-04",
"count": 1
},
{
"date": "2025-05-05",
"count": 5
},
{
"date": "2025-05-06",
"count": 1
},
{
"date": "2025-05-10",
"count": 3
},
{
"date": "2025-05-12",
"count": 1
},
{
"date": "2025-05-13",
"count": 1
},
{
"date": "2025-05-14",
"count": 1
},
{
"date": "2025-05-16",
"count": 1
},
{
"date": "2025-05-21",
"count": 2
},
{
"date": "2025-05-22",
"count": 1
},
{
"date": "2025-05-24",
"count": 3
},
{
"date": "2025-05-25",
"count": 1
},
{
"date": "2025-05-26",
"count": 1
},
{
"date": "2025-05-27",
"count": 2
},
{
"date": "2025-05-30",
"count": 1
},
{
"date": "2025-05-31",
"count": 1
},
{
"date": "2025-06-01",
"count": 1
},
{
"date": "2025-06-03",
"count": 1
},
{
"date": "2025-06-04",
"count": 2
},
{
"date": "2025-06-06",
"count": 1
},
{
"date": "2025-06-08",
"count": 1
},
{
"date": "2025-06-09",
"count": 3
},
{
"date": "2025-06-10",
"count": 1
},
{
"date": "2025-06-11",
"count": 2
},
{
"date": "2025-06-12",
"count": 2
},
{
"date": "2025-06-13",
"count": 2
},
{
"date": "2025-06-14",
"count": 1
},
{
"date": "2025-06-15",
"count": 2
},
{
"date": "2025-06-16",
"count": 1
},
{
"date": "2025-06-17",
"count": 1
},
{
"date": "2025-06-20",
"count": 2
},
{
"date": "2025-06-23",
"count": 1
},
{
"date": "2025-06-26",
"count": 1
},
{
"date": "2025-06-27",
"count": 1
},
{
"date": "2025-06-30",
"count": 1
},
{
"date": "2025-07-01",
"count": 3
},
{
"date": "2025-07-02",
"count": 3
},
{
"date": "2025-07-03",
"count": 1
},
{
"date": "2025-07-06",
"count": 1
},
{
"date": "2025-07-07",
"count": 1
},
{
"date": "2025-07-09",
"count": 1
},
{
"date": "2025-07-11",
"count": 2
},
{
"date": "2025-07-12",
"count": 1
},
{
"date": "2025-07-13",
"count": 1
},
{
"date": "2025-07-14",
"count": 2
},
{
"date": "2025-07-16",
"count": 1
},
{
"date": "2025-07-17",
"count": 2
},
{
"date": "2025-07-18",
"count": 2
},
{
"date": "2025-07-19",
"count": 1
},
{
"date": "2025-07-20",
"count": 1
},
{
"date": "2025-07-21",
"count": 2
},
{
"date": "2025-07-22",
"count": 1
},
{
"date": "2025-07-26",
"count": 1
},
{
"date": "2025-07-28",
"count": 2
},
{
"date": "2025-07-29",
"count": 2
},
{
"date": "2025-07-30",
"count": 1
},
{
"date": "2025-08-02",
"count": 2
},
{
"date": "2025-08-03",
"count": 1
},
{
"date": "2025-08-06",
"count": 1
},
{
"date": "2025-08-12",
"count": 1
},
{
"date": "2025-08-13",
"count": 1
},
{
"date": "2025-08-14",
"count": 2
},
{
"date": "2025-08-18",
"count": 1
},
{
"date": "2025-08-21",
"count": 1
},
{
"date": "2025-08-22",
"count": 2
},
{
"date": "2025-08-26",
"count": 2
},
{
"date": "2025-08-29",
"count": 1
},
{
"date": "2025-08-30",
"count": 3
},
{
"date": "2025-09-02",
"count": 2
},
{
"date": "2025-09-03",
"count": 2
},
{
"date": "2025-09-04",
"count": 1
},
{
"date": "2025-09-06",
"count": 1
},
{
"date": "2025-09-09",
"count": 1
},
{
"date": "2025-09-11",
"count": 1
},
{
"date": "2025-09-15",
"count": 1
},
{
"date": "2025-09-18",
"count": 2
},
{
"date": "2025-09-19",
"count": 1
},
{
"date": "2025-09-20",
"count": 2
},
{
"date": "2025-09-21",
"count": 2
},
{
"date": "2025-09-22",
"count": 1
},
{
"date": "2025-09-23",
"count": 1
},
{
"date": "2025-09-24",
"count": 1
},
{
"date": "2025-09-25",
"count": 1
},
{
"date": "2025-09-26",
"count": 1
},
{
"date": "2025-09-28",
"count": 1
},
{
"date": "2025-09-29",
"count": 1
},
{
"date": "2025-09-30",
"count": 1
},
{
"date": "2025-10-01",
"count": 1
},
{
"date": "2025-10-02",
"count": 1
},
{
"date": "2025-10-07",
"count": 1
},
{
"date": "2025-10-09",
"count": 2
},
{
"date": "2025-10-10",
"count": 1
},
{
"date": "2025-10-11",
"count": 3
},
{
"date": "2025-10-12",
"count": 1
},
{
"date": "2025-10-13",
"count": 2
},
{
"date": "2025-10-14",
"count": 2
},
{
"date": "2025-10-18",
"count": 1
},
{
"date": "2025-10-19",
"count": 2
},
{
"date": "2025-10-20",
"count": 2
},
{
"date": "2025-10-21",
"count": 1
},
{
"date": "2025-10-24",
"count": 3
},
{
"date": "2025-10-27",
"count": 1
},
{
"date": "2025-10-31",
"count": 2
},
{
"date": "2025-11-02",
"count": 4
},
{
"date": "2025-11-03",
"count": 2
},
{
"date": "2025-11-04",
"count": 1
},
{
"date": "2025-11-06",
"count": 22
},
{
"date": "2025-11-07",
"count": 123
},
{
"date": "2025-11-08",
"count": 94
},
{
"date": "2025-11-09",
"count": 46
},
{
"date": "2025-11-10",
"count": 24
},
{
"date": "2025-11-11",
"count": 18
},
{
"date": "2025-11-12",
"count": 8
},
{
"date": "2025-11-13",
"count": 11
},
{
"date": "2025-11-14",
"count": 10
},
{
"date": "2025-11-15",
"count": 10
},
{
"date": "2025-11-16",
"count": 6
},
{
"date": "2025-11-17",
"count": 6
},
{
"date": "2025-11-18",
"count": 4
},
{
"date": "2025-11-19",
"count": 4
},
{
"date": "2025-11-20",
"count": 3
},
{
"date": "2025-11-21",
"count": 9
},
{
"date": "2025-11-22",
"count": 26
},
{
"date": "2025-11-23",
"count": 9
},
{
"date": "2025-11-24",
"count": 9
},
{
"date": "2025-11-25",
"count": 5
},
{
"date": "2025-11-26",
"count": 6
},
{
"date": "2025-11-27",
"count": 7
},
{
"date": "2025-11-28",
"count": 10
},
{
"date": "2025-11-29",
"count": 4
},
{
"date": "2025-11-30",
"count": 5
},
{
"date": "2025-12-01",
"count": 7
},
{
"date": "2025-12-02",
"count": 4
},
{
"date": "2025-12-03",
"count": 2
},
{
"date": "2025-12-04",
"count": 2
},
{
"date": "2025-12-06",
"count": 1
},
{
"date": "2025-12-07",
"count": 1
},
{
"date": "2025-12-08",
"count": 4
},
{
"date": "2025-12-09",
"count": 3
},
{
"date": "2025-12-10",
"count": 6
},
{
"date": "2025-12-11",
"count": 4
},
{
"date": "2025-12-12",
"count": 2
},
{
"date": "2025-12-13",
"count": 4
},
{
"date": "2025-12-14",
"count": 3
},
{
"date": "2025-12-15",
"count": 2
},
{
"date": "2025-12-16",
"count": 4
},
{
"date": "2025-12-17",
"count": 3
},
{
"date": "2025-12-18",
"count": 2
},
{
"date": "2025-12-19",
"count": 3
},
{
"date": "2025-12-20",
"count": 6
},
{
"date": "2025-12-22",
"count": 3
},
{
"date": "2025-12-23",
"count": 5
},
{
"date": "2025-12-24",
"count": 2
},
{
"date": "2025-12-25",
"count": 5
},
{
"date": "2025-12-26",
"count": 1
},
{
"date": "2025-12-27",
"count": 1
},
{
"date": "2025-12-28",
"count": 1
},
{
"date": "2025-12-29",
"count": 1
},
{
"date": "2025-12-30",
"count": 4
},
{
"date": "2025-12-31",
"count": 6
},
{
"date": "2026-01-01",
"count": 3
},
{
"date": "2026-01-02",
"count": 2
},
{
"date": "2026-01-03",
"count": 4
},
{
"date": "2026-01-04",
"count": 5
},
{
"date": "2026-01-05",
"count": 2
},
{
"date": "2026-01-06",
"count": 3
},
{
"date": "2026-01-07",
"count": 1
},
{
"date": "2026-01-08",
"count": 1
},
{
"date": "2026-01-09",
"count": 1
},
{
"date": "2026-01-10",
"count": 2
},
{
"date": "2026-01-11",
"count": 3
},
{
"date": "2026-01-12",
"count": 2
},
{
"date": "2026-01-13",
"count": 3
},
{
"date": "2026-01-14",
"count": 3
},
{
"date": "2026-01-15",
"count": 3
},
{
"date": "2026-01-16",
"count": 1
},
{
"date": "2026-01-17",
"count": 1
},
{
"date": "2026-01-18",
"count": 2
},
{
"date": "2026-01-19",
"count": 2
},
{
"date": "2026-01-20",
"count": 3
},
{
"date": "2026-01-21",
"count": 1
},
{
"date": "2026-01-22",
"count": 3
},
{
"date": "2026-01-23",
"count": 2
},
{
"date": "2026-01-24",
"count": 4
},
{
"date": "2026-01-25",
"count": 2
},
{
"date": "2026-01-26",
"count": 4
},
{
"date": "2026-01-27",
"count": 4
},
{
"date": "2026-01-28",
"count": 1
},
{
"date": "2026-01-29",
"count": 1
},
{
"date": "2026-01-30",
"count": 1
},
{
"date": "2026-01-31",
"count": 1
},
{
"date": "2026-02-01",
"count": 2
},
{
"date": "2026-02-02",
"count": 2
},
{
"date": "2026-02-04",
"count": 1
},
{
"date": "2026-02-05",
"count": 3
},
{
"date": "2026-02-07",
"count": 1
},
{
"date": "2026-02-08",
"count": 3
},
{
"date": "2026-02-10",
"count": 3
},
{
"date": "2026-02-11",
"count": 2
},
{
"date": "2026-02-12",
"count": 2
},
{
"date": "2026-02-14",
"count": 2
},
{
"date": "2026-02-16",
"count": 1
},
{
"date": "2026-02-18",
"count": 1
},
{
"date": "2026-02-22",
"count": 1
},
{
"date": "2026-02-23",
"count": 1
},
{
"date": "2026-02-24",
"count": 2
},
{
"date": "2026-02-27",
"count": 2
},
{
"date": "2026-03-01",
"count": 1
},
{
"date": "2026-03-02",
"count": 2
},
{
"date": "2026-03-04",
"count": 1
},
{
"date": "2026-03-06",
"count": 4
},
{
"date": "2026-03-10",
"count": 3
},
{
"date": "2026-03-12",
"count": 1
},
{
"date": "2026-03-13",
"count": 1
},
{
"date": "2026-03-14",
"count": 1
},
{
"date": "2026-03-15",
"count": 3
},
{
"date": "2026-03-16",
"count": 1
},
{
"date": "2026-03-17",
"count": 1
},
{
"date": "2026-03-18",
"count": 1
},
{
"date": "2026-03-19",
"count": 1
},
{
"date": "2026-03-21",
"count": 2
},
{
"date": "2026-03-22",
"count": 3
},
{
"date": "2026-03-24",
"count": 1
},
{
"date": "2026-03-25",
"count": 1
},
{
"date": "2026-03-26",
"count": 1
},
{
"date": "2026-03-27",
"count": 3
},
{
"date": "2026-03-29",
"count": 2
},
{
"date": "2026-03-30",
"count": 4
},
{
"date": "2026-03-31",
"count": 1
},
{
"date": "2026-04-01",
"count": 1
},
{
"date": "2026-04-02",
"count": 1
},
{
"date": "2026-04-06",
"count": 4
},
{
"date": "2026-04-09",
"count": 1
},
{
"date": "2026-04-10",
"count": 1
},
{
"date": "2026-04-11",
"count": 2
},
{
"date": "2026-04-13",
"count": 2
},
{
"date": "2026-04-14",
"count": 2
},
{
"date": "2026-04-15",
"count": 1
},
{
"date": "2026-04-17",
"count": 2
},
{
"date": "2026-04-18",
"count": 2
},
{
"date": "2026-04-19",
"count": 1
},
{
"date": "2026-04-20",
"count": 1
},
{
"date": "2026-04-21",
"count": 1
},
{
"date": "2026-04-23",
"count": 2
},
{
"date": "2026-04-24",
"count": 2
},
{
"date": "2026-04-26",
"count": 1
},
{
"date": "2026-04-28",
"count": 1
},
{
"date": "2026-04-30",
"count": 1
},
{
"date": "2026-05-01",
"count": 1
},
{
"date": "2026-05-02",
"count": 4
},
{
"date": "2026-05-03",
"count": 1
},
{
"date": "2026-05-05",
"count": 1
},
{
"date": "2026-05-07",
"count": 1
},
{
"date": "2026-05-08",
"count": 2
},
{
"date": "2026-05-09",
"count": 1
},
{
"date": "2026-05-12",
"count": 1
},
{
"date": "2026-05-13",
"count": 1
},
{
"date": "2026-05-14",
"count": 3
},
{
"date": "2026-05-18",
"count": 2
},
{
"date": "2026-05-19",
"count": 2
},
{
"date": "2026-05-21",
"count": 2
},
{
"date": "2026-05-22",
"count": 2
},
{
"date": "2026-05-24",
"count": 2
},
{
"date": "2026-05-25",
"count": 1
},
{
"date": "2026-05-26",
"count": 1
},
{
"date": "2026-05-27",
"count": 1
},
{
"date": "2026-05-28",
"count": 3
},
{
"date": "2026-05-30",
"count": 1
},
{
"date": "2026-05-31",
"count": 1
},
{
"date": "2026-06-01",
"count": 1
},
{
"date": "2026-06-02",
"count": 3
},
{
"date": "2026-06-04",
"count": 1
},
{
"date": "2026-06-05",
"count": 2
},
{
"date": "2026-06-06",
"count": 1
},
{
"date": "2026-06-07",
"count": 2
},
{
"date": "2026-06-08",
"count": 1
},
{
"date": "2026-06-09",
"count": 2
},
{
"date": "2026-06-11",
"count": 3
},
{
"date": "2026-06-13",
"count": 1
},
{
"date": "2026-06-15",
"count": 1
},
{
"date": "2026-06-16",
"count": 1
},
{
"date": "2026-06-17",
"count": 1
},
{
"date": "2026-06-19",
"count": 1
},
{
"date": "2026-06-20",
"count": 1
},
{
"date": "2026-06-21",
"count": 3
},
{
"date": "2026-06-22",
"count": 2
},
{
"date": "2026-06-23",
"count": 7
},
{
"date": "2026-06-24",
"count": 3
},
{
"date": "2026-06-26",
"count": 1
},
{
"date": "2026-06-27",
"count": 1
},
{
"date": "2026-06-28",
"count": 1
},
{
"date": "2026-07-01",
"count": 3
},
{
"date": "2026-07-02",
"count": 1
},
{
"date": "2026-07-06",
"count": 1
},
{
"date": "2026-07-08",
"count": 1
},
{
"date": "2026-07-09",
"count": 1
},
{
"date": "2026-07-10",
"count": 3
},
{
"date": "2026-07-11",
"count": 2
},
{
"date": "2026-07-12",
"count": 1
},
{
"date": "2026-07-14",
"count": 2
},
{
"date": "2026-07-15",
"count": 1
},
{
"date": "2026-07-16",
"count": 3
},
{
"date": "2026-07-17",
"count": 1
},
{
"date": "2026-07-18",
"count": 2
},
{
"date": "2026-07-19",
"count": 1
},
{
"date": "2026-07-20",
"count": 2
},
{
"date": "2026-07-21",
"count": 1
}
],
"complete": false,
"collected": 1000,
"total_stars": 4324
},
"open_issues_and_prs": 195
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"testsuite/libffi.bhaible/Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 228093,
"source_files_sampled": 324,
"oversized_source_files": 2,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [],
"advisories": {
"error": "No resolved dependencies to assess",
"scope": "repository_graph",
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [],
"dependencies": [],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [],
"collected": true,
"truncated": false,
"total_count": 0,
"direct_count": 0,
"indirect_count": 0
}
},
"maintainership": {
"issues": {
"open_prs": 18,
"merged_prs": 422,
"open_issues": 177,
"closed_ratio": 0.62,
"closed_issues": 289,
"closed_unmerged_prs": 92
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "atgreen",
"commits": 1130,
"avatar_url": "https://avatars.githubusercontent.com/u/89993?v=4"
},
{
"type": "User",
"login": "rth7680",
"commits": 95,
"avatar_url": "https://avatars.githubusercontent.com/u/2529319?v=4"
},
{
"type": "User",
"login": "joshtriplett",
"commits": 50,
"avatar_url": "https://avatars.githubusercontent.com/u/162737?v=4"
},
{
"type": "User",
"login": "tromey",
"commits": 46,
"avatar_url": "https://avatars.githubusercontent.com/u/1557670?v=4"
},
{
"type": "User",
"login": "zwaldowski",
"commits": 44,
"avatar_url": "https://avatars.githubusercontent.com/u/170812?v=4"
},
{
"type": "User",
"login": "landonf",
"commits": 37,
"avatar_url": "https://avatars.githubusercontent.com/u/18884?v=4"
},
{
"type": "User",
"login": "amodra",
"commits": 15,
"avatar_url": "https://avatars.githubusercontent.com/u/6006325?v=4"
},
{
"type": "User",
"login": "bivab",
"commits": 15,
"avatar_url": "https://avatars.githubusercontent.com/u/1488?v=4"
},
{
"type": "User",
"login": "oleavr",
"commits": 14,
"avatar_url": "https://avatars.githubusercontent.com/u/735197?v=4"
},
{
"type": "User",
"login": "jeremyhu",
"commits": 10,
"avatar_url": "https://avatars.githubusercontent.com/u/1258676?v=4"
}
],
"contributors_sampled": 100,
"top_contributor_share": 0.669
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"build.yml",
"emscripten.yml",
"label-new-issue.yaml",
"release.yml",
"tarball.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"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": 6,
"reason": "2 out of 3 merged PRs checked by a CI test -- score normalized to 6",
"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 2/21 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 10,
"reason": "project has 46 contributing companies or organizations",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 10,
"reason": "update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 9,
"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 7 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": 10,
"reason": "security policy file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "46cb2e3871059f7f5113329ddcca818de3a8cfae",
"ran_at": "2026-07-22T00:33:18Z",
"aggregate_score": 5.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-10T20:52:46Z",
"oldest_open_prs": [
{
"number": 27,
"created_at": "2013-01-26T20:19:29Z",
"last_comment_at": "2024-11-01T06:41:39Z",
"last_comment_author": "cooljeanius"
},
{
"number": 378,
"created_at": "2017-10-22T09:27:09Z",
"last_comment_at": "2018-09-05T14:06:48Z",
"last_comment_author": "Zaxar163"
},
{
"number": 414,
"created_at": "2018-03-16T13:37:47Z",
"last_comment_at": "2026-07-21T20:41:11Z",
"last_comment_author": "edusperoni"
},
{
"number": 448,
"created_at": "2018-08-30T16:55:28Z",
"last_comment_at": "2026-02-05T10:51:28Z",
"last_comment_author": "heitbaum"
},
{
"number": 519,
"created_at": "2019-09-27T13:24:53Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 523,
"created_at": "2019-10-16T11:21:30Z",
"last_comment_at": "2024-12-24T21:21:52Z",
"last_comment_author": "DemiMarie"
},
{
"number": 535,
"created_at": "2020-01-06T02:03:36Z",
"last_comment_at": "2024-02-01T14:33:40Z",
"last_comment_author": "fatduckling"
},
{
"number": 537,
"created_at": "2020-01-28T13:20:31Z",
"last_comment_at": "2022-02-18T13:22:11Z",
"last_comment_author": "nono303"
},
{
"number": 562,
"created_at": "2020-04-28T16:17:21Z",
"last_comment_at": "2020-11-11T19:13:09Z",
"last_comment_author": "tresf"
},
{
"number": 621,
"created_at": "2021-01-19T19:50:22Z",
"last_comment_at": "2022-08-28T22:29:25Z",
"last_comment_author": "charafsalmi"
},
{
"number": 629,
"created_at": "2021-03-22T08:21:27Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 639,
"created_at": "2021-06-09T10:50:49Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 671,
"created_at": "2021-10-27T13:33:43Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 746,
"created_at": "2022-10-24T13:53:25Z",
"last_comment_at": "2023-08-17T19:00:56Z",
"last_comment_author": "xclaesse"
},
{
"number": 938,
"created_at": "2025-09-01T19:28:45Z",
"last_comment_at": "2026-03-08T11:56:08Z",
"last_comment_author": "bobo215"
},
{
"number": 952,
"created_at": "2026-02-05T11:04:50Z",
"last_comment_at": "2026-03-08T11:48:39Z",
"last_comment_author": "bobo215"
},
{
"number": 960,
"created_at": "2026-05-19T08:19:44Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 1000,
"created_at": "2026-07-21T20:20:48Z",
"last_comment_at": "2026-07-21T23:35:36Z",
"last_comment_author": "edusperoni"
}
],
"last_merged_pr_at": "2026-07-10T20:51:19Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 12,
"created_at": "2012-03-25T19:24:31Z",
"last_comment_at": "2025-02-25T18:59:52Z",
"last_comment_author": "bkammerd"
},
{
"number": 22,
"created_at": "2012-07-04T09:34:12Z",
"last_comment_at": "2018-03-23T15:49:11Z",
"last_comment_author": "atgreen"
},
{
"number": 33,
"created_at": "2013-03-17T22:20:28Z",
"last_comment_at": "2023-02-03T18:38:15Z",
"last_comment_author": "JornVernee"
},
{
"number": 49,
"created_at": "2013-08-07T22:13:38Z",
"last_comment_at": "2021-10-22T15:19:08Z",
"last_comment_author": "LifeIsStrange"
},
{
"number": 52,
"created_at": "2013-09-05T14:50:46Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 53,
"created_at": "2013-09-06T23:38:35Z",
"last_comment_at": "2013-11-18T23:46:29Z",
"last_comment_author": "iains"
},
{
"number": 55,
"created_at": "2013-11-13T02:34:51Z",
"last_comment_at": "2023-12-08T11:07:58Z",
"last_comment_author": "antoine-morvan"
},
{
"number": 70,
"created_at": "2014-01-09T02:23:13Z",
"last_comment_at": "2018-04-27T22:03:45Z",
"last_comment_author": "marksolaris"
},
{
"number": 73,
"created_at": "2014-01-24T00:06:57Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 77,
"created_at": "2014-02-24T15:14:28Z",
"last_comment_at": "2016-05-18T03:01:46Z",
"last_comment_author": "tromey"
},
{
"number": 103,
"created_at": "2014-03-17T03:51:36Z",
"last_comment_at": "2014-08-27T14:14:33Z",
"last_comment_author": "nielsAD"
},
{
"number": 127,
"created_at": "2014-07-09T15:46:35Z",
"last_comment_at": "2023-12-08T11:08:40Z",
"last_comment_author": "antoine-morvan"
},
{
"number": 128,
"created_at": "2014-07-14T03:55:51Z",
"last_comment_at": "2024-10-15T03:25:43Z",
"last_comment_author": "barracuda156"
},
{
"number": 131,
"created_at": "2014-07-30T06:04:17Z",
"last_comment_at": "2019-11-25T15:56:41Z",
"last_comment_author": "KES777"
},
{
"number": 133,
"created_at": "2014-09-10T00:06:30Z",
"last_comment_at": "2014-09-20T11:05:47Z",
"last_comment_author": "atgreen"
},
{
"number": 138,
"created_at": "2014-11-11T03:12:58Z",
"last_comment_at": "2019-12-07T13:06:41Z",
"last_comment_author": "atgreen"
},
{
"number": 146,
"created_at": "2014-11-14T17:41:54Z",
"last_comment_at": "2017-03-31T08:39:23Z",
"last_comment_author": "ksjogo"
},
{
"number": 161,
"created_at": "2014-12-26T06:11:58Z",
"last_comment_at": "2015-01-01T23:35:50Z",
"last_comment_author": "koobs"
},
{
"number": 168,
"created_at": "2015-01-16T13:41:19Z",
"last_comment_at": "2015-02-04T15:13:19Z",
"last_comment_author": "rvandermeulen"
},
{
"number": 180,
"created_at": "2015-02-18T10:23:02Z",
"last_comment_at": "2017-02-04T17:56:53Z",
"last_comment_author": "ilovezfs"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/libffi/libffi",
"host": "github.com",
"name": "libffi",
"owner": "libffi"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 65,
"inputs": {
"security": 51,
"vitality": 75,
"community": 74,
"governance": 52,
"engineering": 72
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 75,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 69,
"inputs": {
"commits_last_year": 145,
"human_commit_share": 1,
"days_since_last_push": 11,
"active_weeks_last_year": 17
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 11 days ago",
"points": 28.8,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 11
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "17/52 weeks with commits",
"points": 11.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 17
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "145 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 145
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "good",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 83,
"inputs": {
"releases_count": 20,
"latest_release_tag": "v3.7.1",
"releases_from_tags": false,
"days_since_latest_release": 11,
"mean_days_between_releases": 97
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "20 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 20
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 11 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 11
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~97 days",
"points": 19.8,
"status": "partial",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 97
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"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": 11,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 11 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 11
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "good",
"name": "Community & Adoption",
"value": 74,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "excellent",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 94,
"inputs": {
"forks": 823,
"stars": 4324,
"watchers": 89,
"growth_state": "organic",
"growth_factor_pct": 100
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "4,324 stars",
"points": 59,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 4324
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "823 forks",
"points": 24.3,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 823
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "89 watchers",
"points": 10.8,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 89
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 52,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": true,
"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": "license file present, not a recognized license",
"points": 16.9,
"status": "partial",
"details": [
{
"code": "license_custom",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 7.2,
"status": "met",
"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": 52,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 100,
"top_contributor_share": 0.669
},
"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 67% of commits",
"points": 7.4,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 67
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "100 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 100
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 46 contributing companies or organizations",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "moderate",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"merged_prs": 422,
"open_issues": 177,
"closed_issues": 289,
"issue_closed_ratio": 0.62,
"closed_unmerged_prs": 92
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "62% of issues closed",
"points": 29,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 62
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "422/514 decided PRs merged",
"points": 31.4,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 422,
"decided": 514
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 2/21 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 59,
"inputs": {
"followers": 42,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "libffi",
"public_repos": 5,
"account_age_days": 4501
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "42 followers of libffi",
"points": 11.7,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 42,
"login": "libffi"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "5 public repos, account ~12 yr old",
"points": 17.7,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 5
}
},
{
"code": "account_age_years",
"params": {
"years": 12
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 72,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "5 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 5
}
}
],
"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": null,
"points": 0,
"status": "missed",
"details": [],
"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": "2 out of 3 merged PRs checked by a CI test -- score normalized to 6",
"points": 12,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": "http://sourceware.org/libffi",
"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": "http://sourceware.org/libffi",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 51,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 51,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 5.1
},
"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": "2 out of 3 merged PRs checked by a CI test -- score normalized to 6",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 2/21 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 46 contributing companies or organizations",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "update tool detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 7 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 detected",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"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": 15
},
"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": "moderate",
"name": "AI Readiness",
"value": 60,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.93,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "93 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 93,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [
"testsuite/libffi.bhaible/Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.67,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "testsuite/libffi.bhaible/Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "testsuite/libffi.bhaible/Makefile"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "C (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "67 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 67,
"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": "C",
"largest_source_bytes": 228093,
"source_files_sampled": 324,
"oversized_source_files": 2
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "C (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "2/324 source files over 60KB",
"points": 54.7,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 324,
"oversized": 2
}
}
],
"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": [],
"report_type": "repository",
"generated_at": "2026-07-22T00:33:40.862039Z",
"schema_version": "0.26.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/l/libffi/libffi.svg",
"full_name": "libffi/libffi",
"license_state": "custom",
"license_spdx": null
}