Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 1920,
"has_wiki": true,
"homepage": null,
"languages": {
"Go": 511725
},
"pushed_at": "2026-05-23T05:44:52Z",
"created_at": "2014-11-11T03:50:43Z",
"owner_type": "User",
"updated_at": "2026-07-21T05:50:33Z",
"description": "ivy, an APL-like calculator",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "master",
"license_spdx_raw": "NOASSERTION",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": "Rob Pike",
"type": "User",
"login": "robpike",
"company": null,
"location": null,
"followers": 12190,
"avatar_url": "https://avatars.githubusercontent.com/u/4324516?v=4",
"created_at": "2013-05-02T18:16:36Z",
"is_verified": null,
"public_repos": 21,
"account_age_days": 4831
},
"license": {
"state": "custom",
"spdx_id": null,
"raw_spdx": "NOASSERTION",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.5.8",
"kind": "patch",
"published_at": "2026-05-23T05:43:34Z"
},
{
"tag": "v0.5.7",
"kind": "patch",
"published_at": "2026-04-16T10:30:11Z"
},
{
"tag": "v0.5.6",
"kind": "patch",
"published_at": "2026-03-22T23:45:50Z"
},
{
"tag": "v0.5.5",
"kind": "patch",
"published_at": "2026-03-20T03:13:43Z"
},
{
"tag": "v0.5.4",
"kind": "patch",
"published_at": "2026-03-05T00:26:58Z"
},
{
"tag": "v0.5.3",
"kind": "patch",
"published_at": "2026-03-04T00:34:02Z"
},
{
"tag": "v0.5.2",
"kind": "patch",
"published_at": "2026-03-01T02:49:51Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-01-26T03:37:35Z"
},
{
"tag": "v0.4.5",
"kind": "patch",
"published_at": "2026-01-07T22:39:49Z"
},
{
"tag": "v0.4.3",
"kind": "patch",
"published_at": "2026-01-06T03:26:07Z"
},
{
"tag": "v0.4.2",
"kind": "patch",
"published_at": "2026-01-06T01:13:20Z"
},
{
"tag": "v0.4.1",
"kind": "patch",
"published_at": "2025-12-22T07:24:58Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2025-12-02T21:13:01Z"
},
{
"tag": "v0.3.17",
"kind": "patch",
"published_at": "2025-11-25T04:50:40Z"
},
{
"tag": "v0.3.16",
"kind": "patch",
"published_at": "2025-11-25T04:17:50Z"
},
{
"tag": "v0.3.15",
"kind": "patch",
"published_at": "2025-11-17T09:10:47Z"
},
{
"tag": "v0.3.14",
"kind": "patch",
"published_at": "2025-11-07T10:10:49Z"
},
{
"tag": "v0.3.13",
"kind": "patch",
"published_at": "2025-11-07T07:19:01Z"
},
{
"tag": "v0.3.12",
"kind": "patch",
"published_at": "2025-11-07T05:18:14Z"
},
{
"tag": "v0.3.11",
"kind": "patch",
"published_at": "2025-01-01T09:25:50Z"
},
{
"tag": "v0.3.10",
"kind": "patch",
"published_at": "2024-12-30T22:46:20Z"
},
{
"tag": "v0.3.9",
"kind": "patch",
"published_at": "2024-12-29T01:54:42Z"
},
{
"tag": "v0.3.8",
"kind": "patch",
"published_at": "2024-12-28T09:52:35Z"
},
{
"tag": "v0.3.7",
"kind": "patch",
"published_at": "2024-12-11T20:04:36Z"
},
{
"tag": "v0.3.6",
"kind": "patch",
"published_at": "2024-09-25T10:16:52Z"
},
{
"tag": "v0.3.5",
"kind": "patch",
"published_at": "2024-09-25T10:16:52Z"
},
{
"tag": "v0.3.4",
"kind": "patch",
"published_at": "2024-01-17T22:40:54Z"
},
{
"tag": "v0.3.3",
"kind": "patch",
"published_at": "2024-01-15T23:33:11Z"
},
{
"tag": "v0.3.2",
"kind": "patch",
"published_at": "2023-09-27T10:30:17Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2023-08-12T03:59:35Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2023-08-04T23:54:35Z"
},
{
"tag": "v0.2.10",
"kind": "patch",
"published_at": "2022-12-03T08:45:29Z"
},
{
"tag": "v0.2.9",
"kind": "patch",
"published_at": "2022-10-18T02:19:01Z"
},
{
"tag": "v0.2.8",
"kind": "patch",
"published_at": "2022-05-10T01:37:39Z"
},
{
"tag": "v0.2.7",
"kind": "patch",
"published_at": "2022-02-16T21:47:05Z"
},
{
"tag": "v0.2.6",
"kind": "patch",
"published_at": "2022-02-15T00:11:01Z"
},
{
"tag": "v0.2.5",
"kind": "patch",
"published_at": "2022-02-11T09:55:19Z"
},
{
"tag": "v0.2.4",
"kind": "patch",
"published_at": "2022-02-11T04:02:01Z"
},
{
"tag": "v0.2.3",
"kind": "patch",
"published_at": "2022-02-07T09:32:16Z"
},
{
"tag": "v0.2.2",
"kind": "patch",
"published_at": "2022-02-07T06:08:29Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2022-02-07T02:50:14Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2022-02-06T05:11:12Z"
},
{
"tag": "v0.1.15",
"kind": "patch",
"published_at": "2022-01-26T04:05:17Z"
},
{
"tag": "v0.1.14",
"kind": "patch",
"published_at": "2022-01-25T23:27:08Z"
},
{
"tag": "v0.1.13",
"kind": "patch",
"published_at": "2022-01-14T09:17:14Z"
},
{
"tag": "v0.1.12",
"kind": "patch",
"published_at": "2022-01-09T00:59:18Z"
},
{
"tag": "v0.1.11",
"kind": "patch",
"published_at": "2022-01-07T00:40:37Z"
},
{
"tag": "v0.1.10",
"kind": "patch",
"published_at": "2021-12-27T03:53:16Z"
},
{
"tag": "v0.1.9",
"kind": "patch",
"published_at": "2021-12-11T09:56:05Z"
},
{
"tag": "v0.1.8",
"kind": "patch",
"published_at": "2021-12-09T22:47:44Z"
},
{
"tag": "v0.1.7",
"kind": "patch",
"published_at": "2021-12-09T07:31:15Z"
},
{
"tag": "v0.1.6",
"kind": "patch",
"published_at": "2021-12-07T09:10:34Z"
},
{
"tag": "v0.1.5",
"kind": "patch",
"published_at": "2021-12-04T20:30:37Z"
},
{
"tag": "v0.1.4",
"kind": "patch",
"published_at": "2021-10-14T06:38:24Z"
},
{
"tag": "v0.1.3",
"kind": "patch",
"published_at": "2021-08-30T03:20:54Z"
},
{
"tag": "v0.1.2",
"kind": "patch",
"published_at": "2021-07-07T07:47:21Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2021-07-07T05:36:02Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2021-01-31T03:43:54Z"
}
],
"recent_commits": [
{
"oid": "bdcfb3c3bcfbe74c5d27ed846b31d808ca93ca94",
"body": "Just an oversight this wasn't already there.",
"is_bot": false,
"headline": "ivy: add sys 'version'",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-05-23T05:43:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3568b79c299bcb8ed2251b23eb006db5f944f742",
"body": "The scanner has a buglet that allows it to return an empty string\nand call it a Number. Once I tracked this down and fixed it, I found\nthat it generated an inconvenient error: the newish relaxed handling\nof arguments in special commands that allows leaving off the quotes\ndoesn't work if the scanner \n[…]\nkens\n1\n\n0a # valid in base 16.\n<stdin>:2: emit Number: \"0a\"\n<stdin>:2: emit Number: \"\"\n<stdin>:3: emit Newline: \"\\n\"\n:2:3: bad number syntax\n\nShould find a better way, but this is good enough for now.",
"is_bot": false,
"headline": "ivy: slightly better error handling for incoherent numbers",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-05-10T00:49:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "57f80acede2e0bd33885a541f99c6fa8dfcc25a7",
"body": "Previously, ivy always showed floats in decimal. This leads to\nbehavior like this:\n\n\tsqrt 10\n\t3.16227766017\n\n\t)obase 8\n\n\tsqrt 10\n\t3.16227766017\n\n\tsqrt 64\n\t10\n\nThe inconsistencies are annoying: Output doesn't change when the\noutput base does, unless a floating calculation gets shrunk back\nto an int, \n[…]\nssages when\nthe 0x or 0b prefixes appear when the base is not 0. The error was\nconfusing; now it's clear. We always accept them, but give the error\nin ParseNumber, as with any other bad number syntax.",
"is_bot": false,
"headline": "ivy: handle float input and output in non-decimal bases",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-05-09T06:47:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3550a70bb6df349dd0b7e8f367a15ceff1dfbd2b",
"body": "There was a silly comment that can go now, and vet caught a problem\nin an error message.",
"is_bot": false,
"headline": "ivy: cleanups from last C",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-04-30T03:59:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ac0cfb53c663c21950c16a35addc3fc3498c2d48",
"body": "In base 0, you can use 0b 0o or 0x prefixes, but again only in base 0. It's easy to do the work in the general case, as long as it's one of those bases: 0 2 8 10 16. So why not?\n\n\t# First 100 bits of the prime constant (base 2, 1 bit at each prime).\n\t)ibase 2\n\t)format .12g\n\t0.0110101000101000101000100000101000001000101000100000100000101000001000101000001000100000100000001000\n\t\t0.414682509851\n\nWould still like to find a way to honor obase for floating-point output.",
"is_bot": false,
"headline": "ivy: honor ibase when inputting floating-point numbers",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-04-29T07:24:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d1ce1a32914ca0ebc9babdc83896908178ee1807",
"body": "For a while now, it has not been necessary to put quotes around the\nargument to the )format special command. Another convenience comes\nhere: Add a percent if none is present, to make it easy to set\nformats like\n\n)format .2f\n)format g\n\nand so on.",
"is_bot": false,
"headline": "ivy: nicer )format",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-04-17T07:27:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5539326d02e2a26f3ae7cb8489ca1e28b20b4709",
"body": null,
"is_bot": false,
"headline": "ivy: add the Planck units to lib units",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-04-16T10:30:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "30eb903b5aadbd20b30f9ac040aca65e2abc9374",
"body": "The result is the right shape, all zeroes.\n\nFixes #268",
"is_bot": false,
"headline": "ivy: outer product of degenerate matrixes can be non-degenerate",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-03-31T02:53:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e8e399bc7883045125df962c05e575ac0ebcf76",
"body": "Error locations are set when evaluating BinaryExpr or UnaryExpr,\nbut I stupidly did this before evaluating the arguments, which\nmeant the error message could point somewhere far away from the\nactual location. This was particularly annoying for an operator\ncall, as the error would point to the last o\n[…]\nbe hard, it was just a dumb bug.\n\nAlso improved the error messages in assignment, adding more information\nand specifying whether the problem happened during assignment or\nfunction binding.\n\nFixes #265",
"is_bot": false,
"headline": "ivy: fix error location info",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-03-22T23:45:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "65957c25e30b62c16055cef5281b2926da4af6ca",
"body": "Due to some historical error, there were two test files for rationals,\nunary_bigrat.ivy and unary_rat.ivy. Merge them into one.\n\nNo change to ivy itself.",
"is_bot": false,
"headline": "ivy: clean up big rat tests",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-03-20T03:25:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d4d7c5510cf4804a6995366e2e972e6a1447af51",
"body": "Add the suggested operator that returns the numerator and denominator,\nexpanding what that means a bit to cover floats and complex numbers.\n\nSince all floats really are rational numbers inside, that's easy\nif not often helpful. (But see the test in unary_bigfloat.ivy).\n\nFor complex numbers, only helpful if either the real or imaginary\npart is zero.\n\nFixes #263",
"is_bot": false,
"headline": "ivy: add numden (fractional parts of value)",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-03-20T03:13:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7151d716b7f8ec70f788b3da00537dbb6bf68447",
"body": "There was some dead code, and some poor error messaging when a\nrational and a complex abut.\n\n\t1j2/3j4\n\nis not legal: 2/3 scans and then there's a j. Put spaces around the\nslash, then parenthesize if it's mean to be a single value. Potentially\nthis could be converted into a division of two complex nu\n[…]\ntly\nintended to be a single value (rationals can't have complex elements)\nturn into an operator. Better to avoid the ambiguity.\n\nThere is no change in behavior, just clearer code and a better message.",
"is_bot": false,
"headline": "ivy: tidy up the scanning of numbers",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-03-20T02:46:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2b96e660cf3e8947cfb26e092f3119cec32610bf",
"body": "The official definition is one digit longer.",
"is_bot": false,
"headline": "ivy: add final last digit in defintion of grain for )lib units",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-03-18T01:07:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4b5679ebdb117665b7476fe542f79c22f8deaee",
"body": "The code\n\tmin max = 2 3\nfails to parse because min is an operator, although only a binary\none. To address his impudent desire to use min and max as variables,\nRuss suggests this form could be used to settle the ambiguity:\n\t(min max) = 2 3\nand that's what is implemented here.\n\nAlong the way, another \n[…]\nis an operator during parsing didn't first check it was a variable.\nFix that too, as it changes the parse:\n\tsin x = 2 3\nparses (groups) differently if sin has been redefined as a variable.\n\nFixes #260",
"is_bot": false,
"headline": "ivy: russ's rule for assigning to predefined names",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-03-05T00:26:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3c35d15be02ac1125a474f6638a48a19fc16aa6c",
"body": "There was an extra set of parens and the wording wasn't as helpful as it might be.\n\nUpdate #265",
"is_bot": false,
"headline": "ivy: fix message for mismatched assignment",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-03-04T10:02:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e46d21e3625f984ddefa73e998bd0b426c66c0f",
"body": "We were too agressive before, always updating them, which would\nwipe user variables called e or pi.\n\nAlso skip comments when fetching args for special commands.\n\nFixes #266",
"is_bot": false,
"headline": "ivy: only update constants after special command when necessary",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-03-04T00:34:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a66b1c09d2fe302ecb38dd9f983e3a0d62b4ac53",
"body": "This avoids maintaining a separate file.",
"is_bot": false,
"headline": "ivy: read version from Go metadata (#267)",
"author_name": "Russ Cox",
"author_login": "rsc",
"committed_at": "2026-03-01T02:49:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9d05306b017c10bab237109f4d7f097541e65bad",
"body": "Fixes #259",
"is_bot": false,
"headline": "ivy: add sys \"sleep\"",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-02-08T09:09:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5bd6b70a9416a4bc14f386d285884ef8ae33e855",
"body": "Simplifies the code in innerProduct and is almost certainly the\nright thing to do. No tests affected.",
"is_bot": false,
"headline": "ivy: in Matrix.shrink, turn 2D matrix into vector when appropriate",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-02-08T04:44:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab816a61c90be21b592b93f00ae415b34c57845f",
"body": "Easy to do so we might as well allow it.\n\nAlso, one incompatible change: If an inner product produces a vector,\nreturn a vector. That is, for a 2D result if either the first or\nlast dimension is 1, down-rank. It already does this for 1D.\n\nFixes #258",
"is_bot": false,
"headline": "ivy: allow scalars with non-scalars in inner products",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-28T02:05:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "46d4dc4289f6146f5c5278ddd880288cbe9784cc",
"body": "Parse is just too general a name.\n\nAlso tag this version v0.5.0. Time to let people try it.",
"is_bot": false,
"headline": "ivy: rename value.Parse to value.ParseNumber",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-26T03:37:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2f7708f14b5394c59dfe958cabcbc37ff8dd6cdf",
"body": "One day I will learn how to use git.\n\nJust kidding, no I won't.",
"is_bot": false,
"headline": "ivy: install the files changed in the previous CL",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-22T05:05:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "40d704f76ed04b4113cde0ab77f599669aa83db1",
"body": "…imation\n\nWith fine tuning as described by Matthew F. Causley in\n\tThe Gamma Function via Interpolation\n\thttps://arxiv.org/pdf/2104.00697v1\nwe can get much more accurate results than with Lanczos. Depending\non where we evaluate, we can get 40 or more digits unlike Lanczos's\n12. And despite needing mo\n[…]\ne,\nso much so that we can comfortably build them on demand in the Go\nimplementation.\n\nDrive-bys:\n\t- Tidy up and regularize float construction\n\t- Tweak some of the syntax error messages in statement.go",
"is_bot": false,
"headline": "ivy: switch gamma from the Lanczos approximation to the Spouge approx…",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-22T03:44:46Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0f4fbde1bc0359c2712cb36d8bd81ec070bfed9b",
"body": "Assigning to a predefined such as max needs to flush the parses.\n\nAlso, although not technically a bug, it felt wrong that you couldn't define an op that shadowed a variable, but you define a variable that shadowed an op (at least a user-defined one). Make that symmtric, and drop the extraneous parenthesis in the message.",
"is_bot": false,
"headline": "ivy: clean up some corner cases in redefinition",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-20T23:12:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "feaa968af4a609f9fb06e10689171c0829ceecd3",
"body": "trap <expr>\n\nReturns a pair. On successful execution, the pair is\n\t(result, ())\nbut if the evaluation of the expression fails, the pair has this form:\n\t(() \"file:3:4 description of error\")\n\nFor the few people who will use this failure, I put this example at\nthe bottom of testdata/ifwhen.ivy:\n\n\t:if (\n[…]\nnt msg; :else print val :end\n\t\t:1:21: division by zero\n\nAlso make a tweak to the indexing code to allow assignment on the\nleft hand side, as used here. It needed to step past a QuietValue.\n\nFixes #233",
"is_bot": false,
"headline": "ivy: add a trap unary to catch execution errors programmatically",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-20T03:00:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3293122bc64ba080fc11dd23e03c385e47b144a6",
"body": "The position information must come from the context in this case;\ne will be nil in the old expression.",
"is_bot": false,
"headline": "ivy: fix bug in message for NaN error",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-19T01:10:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e039699b0f41dccbc7571b113b6c0fb4b7bb7b7d",
"body": "Use has tell me that it's more informative to show the first few\nand last few frames instead of just last few.\n\nAlso put those newlines back in the error prints; they were helpful\nafter all.",
"is_bot": false,
"headline": "ivy: change stack traceback to elide frames from the middle",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-18T11:58:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1611904842f562b0ec46022f8f57483ac487df7e",
"body": "An oversight.\n\nAlso drop the newline in those error messages.",
"is_bot": false,
"headline": "ivy: put position info on errors from math.big",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-18T10:01:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "13534df21ad205f8b050077354646cb90a828f4a",
"body": "It's not useful and interferes, especially with the new parser, as\nthings like j+1 become ambiguous if j is a variable.\n\nAlso fix the tests I forgot to run last time.\n\nFixes #257",
"is_bot": false,
"headline": "ivy: remove unary j",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-17T22:00:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2ad46f8a753dabc6a7c25491176fba24f504c114",
"body": "An ill-advised recent change. Seemed right at the time but isn't.\n\nAlso add a check that )lib units loads correctly.\n\nUpdate #257",
"is_bot": false,
"headline": "ivy: first and last should return 0 not empty for an empty argument",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-17T21:56:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5dc3a2f8642c78a61b5bd4c9093592bbd56683fc",
"body": "…side statement\n\nProbably a missing :end.",
"is_bot": false,
"headline": "ivy: give an error if there are lots of blank (comment-free) lines in…",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-17T21:15:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cb6cddd70c6b17fc1285d257bd2b9a4f40878cae",
"body": "Should have been included in last CL.",
"is_bot": false,
"headline": "ivy: fix typo in comment, add lanczos test",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-17T21:14:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb94f2bf6edb89ed74662c788014e1ea112e2cbb",
"body": "…function\n\nFound a stupid bug in the indexing code by working on recomputing\nthe coefficients for the gamma function. Interesting enough work\nthat I've included the code as a test, which could be useful in\nfuture and is instructive regardless.\n\nUsing testdata/lanczos, ivy can compute the coefficients for the\ngamma computation used in fac.go, exactly.",
"is_bot": false,
"headline": "ivy: fix an indexing bug, add test to compute coefficients for gamma …",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-17T20:35:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a15429e15ae38892188610f00adb99a5bf32cb3a",
"body": "It's quite a challenge. I can't find a good algorithm to use for\nhigh-precision calculations of 𝚪(z) so I use the Lanczos approximation,\nwhich gives a dozen or digits, good enough for now although it would\nbe nice to improve. Details in\n\nImplementing the Gamma Function by Paul Godfrey:\n\thttps://www\n[…]\nithm up to g=5\nsuccessfully (using ivy of course), but ran into mysterious trouble\nat higher levels so I just fell back to the ones frmo the paper,\nwhich is probably as far as this needs to go anyway.",
"is_bot": false,
"headline": "ivy: add generalized factorial and binomial",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-17T05:28:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "975e45b9bdddce88321b855208b81a3c8772a75d",
"body": "Maybe the last one. Parser wasn't setting it in the route from scanning to p.errorf.",
"is_bot": false,
"headline": "ivy: fix one more code path that wasn't setting location",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-16T20:45:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a2cca959c05271467f48713b6156ae2b2d7f25f9",
"body": "Forgot to check for leftover tokens at beginning of line, such as in\n\t((a b)\n\nAlso )get was not tagging the error messages with the location.\n\nAlso also there was an extra layer of panic/recover that was unnecessary.",
"is_bot": false,
"headline": "ivy: catch syntax error of beginning of line",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-16T03:43:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c9a43c653a3899291350e3aef3e09561992798e1",
"body": "These were just missing.\n\nAlso change first and last to return empty instead of 0 for an empty operand.",
"is_bot": false,
"headline": "ivy: add operators left, right, and last",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-16T02:54:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b1896365ad1c883a9dbceee37926bdb05cb9cd3e",
"body": "It was inconsistent before. Now the decorators always as separate\ntokens that buildOperator assembles according to local state.\n\nNo change in behavior.",
"is_bot": false,
"headline": "ivy: regularize the connectoin between scanner and buildOperator",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-16T02:25:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0ccde96e75e615b39f0c1ff8d70e6d0711a5ac50",
"body": "This should help people debug expressions. All I needed to do was to\nmove the value-printing code into value and make it available to the\nbinary text operator.",
"is_bot": false,
"headline": "ivy: add <\"ivy\" text value> to print ivy source code for expression",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-14T05:46:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "86d4411abf98c6e40f2f16f5290695832a7d9454",
"body": "…e a value to a file",
"is_bot": false,
"headline": "ivy: just for symmetry, implement a binary sys \"write\" so we can writ…",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-14T05:10:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b65eff75022a2174f95edde27897e9e3fa516962",
"body": "The previous change added location information for error messages.\nI noticed there were some code paths that didnn't set it, so I went\nthrough all the error messages in the system and tried to fix every\npath where that could happen. Not sure I got all of them, but I did\nfind and fix a few and also found and deleted some more dead code.",
"is_bot": false,
"headline": "ivy: followup to tidy some error messages",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-14T01:23:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e0d95493eaac3bca4a30ae2a21229769f4e9328e",
"body": "This change replaces how parsing is tied to execution. The edits\nto the execution engine itself are small, but the parser and how\nit ties to the execution engine are pretty much a complete rewrite.\nI'll describe that below, but since its effects are subtle (if very\nimportant), here are some other th\n[…]\ne new ones that were\nnot possible before (see the bottom of testdata/function.ivy), but\nthe changes are so sweeping there are surely bugs. Plus there a few\nlittle things I might still try to simplify.",
"is_bot": false,
"headline": "ivy: lazy binding for identifiers",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-13T08:55:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "21606f04b686e2d18ad8d02417048ce7441780d7",
"body": "No matter how much care I take, some stupid error always slips through.\n\nFixes #255",
"is_bot": false,
"headline": "ivy: fix version string",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-07T22:39:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4330616d67ab3cba51ed33ac496d9d380409b86c",
"body": "…se to accept 2 values\n\nFeels right.",
"is_bot": false,
"headline": "ivy: since )base and sys \"base\" returns 2 values, allow binary sys ba…",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-07T21:15:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d4672dbbeb8dbc80023913bb2da50864b7cb4d6a",
"body": "Been meaning to do this for a while.\n\nAlso add a sys op for \"prec\", which was overlooked.\n\nAlso fix lib/libgen.go, which was broken by the state change\nin the previous CL.",
"is_bot": false,
"headline": "ivy: add binary sys to allow setting of values",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-07T21:06:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e4b99474bd6ecf223a771d5ce354e21a7963058e",
"body": "Do this by creating the interface config.State, with a single\nimplementation in a new state package, that implements the methods\nto access key state such as the input base during scanning. This\nchange will allow us to access scan Tokens from the value package\nif we decide to go that route. It also seems cleaner to keep scanning\nfree from explicit ties to key packages.",
"is_bot": false,
"headline": "ivy: break dependency of the scan package on value and context",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-07T00:19:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "08b3a85401d91cccb878692ae49487602ca69385",
"body": "Not only were they unnecessary, the scan package never even emitted them.",
"is_bot": false,
"headline": "ivy: delete unused scan.Complex and scan.Rational",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-06T09:19:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ebd9100cfcf5547234fe26efc4eff12aa0e4f6ff",
"body": null,
"is_bot": false,
"headline": "ivy: tag v4.0.3",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-06T03:26:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dbbdc3419733653a5ebad67d45afe56a7dec5aaa",
"body": null,
"is_bot": false,
"headline": "ivy: add a version flag",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-06T03:21:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9c38c70241fa41095b5fcc931e01d317d6386fd5",
"body": "Allow a program to print a stack trace and continue execution.\nHandy for debugging.",
"is_bot": false,
"headline": "ivy: add 'sys \"trace\" args...'",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-06T01:13:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d1d66fdac204bb5c540094cd816cce3f562205fe",
"body": "At the risk of larger output, do the truncation of large values\nelementwise rather than overall, which gives a better idea of the\nshape of the stack. Also shorten large scalars (ints and rationals\ncan be huge too.)",
"is_bot": false,
"headline": "ivy: further refinements in stack traces",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-05T21:50:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "def98b699550b65f1bda529839b13d616d1408e1",
"body": "Within reason, try to make the values printed in a traceback work\nas expressions that can be copied back to ivy's input to recreate\nthe value. Quote strings, give expressions for matrices instead of\nboxes of numbers, and so on.\n\nCannot be perfect for lots of reasons, including huge values, but\nthis is a helpful step forward.\n\nThere's a good chance the new function, context.tracePrint, could\nbe used elsewhere and therefore might be worth exporting.",
"is_bot": false,
"headline": "ivy: make argument printing in stack traces reusable",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-05T07:17:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "de3e835e8ef3c3d5eda0b8dc48fe157cd91fb214",
"body": "Also, store the local variables in a map instead of the tricky slice\ncombo that always bothered me. Probably epsilon more expensive no,\nbut it has less code, is easier to understand nad manage, and now\nglobals and locals work the same. This change may enable lazy\nevaluation down the road.\n\nAlso also, move the stack trace code into its own file.",
"is_bot": false,
"headline": "ivy: print the values of local variables in the stack trace",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-05T05:39:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0fa13e4a3375c1945bdd6d69e3b5ae0993f812b3",
"body": "Found a case where the stack trace would crash. Not a total surprise\nand easy to fix.",
"is_bot": false,
"headline": "ivy: improve safety of Stacktrace in presence of undefined variables",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-05T03:07:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e430fc28c813d1ada425abe3e2038f9d2dad7abd",
"body": "I recently added :ret to the language, which stops execution of the\nfunction by panicking with a special type. That meant every frame\non the Go call stack had a defer with a repanic, and the Go runtime\nhas n-squared behavior in that scenario.\n\n(See https://github.com/golang/go/issues/77062)\n\nIt's tr\n[…]\no avoid the defer and repanic if there's no :ret, so\ndo that. This avoids the problem almost (but not quite) completely,\nand also probably speeds things up. The main test seems to run a\nlittle faster.",
"is_bot": false,
"headline": "ivy: avoid n-squared behavior in error recovery",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-04T20:56:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b243ea5a445dbcef612c8e78ab3ff7b355bf63bd",
"body": "It's a call stack of user-defined ops only, but it's still a big\nimprovement. Created a Frame type to hold the relevant info, and\nput it in value so it can be used by everyone. I expect to move\nlocal variables there in a followup.\n\n\top a divide b = a/b\n\top test (a b) = a divide b\n\ttest 3 0\n\t\t•> tes\n[…]\nt\nworking properly because the second half of the file was being\ntreated as a single test. While I was there, I also made the checker\nallow for multiple error lines, so I could verify the stack trace.",
"is_bot": false,
"headline": "ivy: print a call stack on error",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2026-01-04T09:49:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7ba9a5ef71b1eac9fd46acd34dc53fceaa91294f",
"body": "A new special command allows one to execute the contents of a\npre-loaded library file.\n\n\t)lib foo\n\nloads (executes) library foo. If no library name is provided, all\navailable libraries are listed by name.\n\nEven if the library is not loaded,\n\n\t)lib doc foo\nShows documentation for the library foo, at\n[…]\nmass,\nvelocity, and so on. That library, called units, still needs a lot\nof work but that can develop separately.\n\nAlso clean up a few gofmt issues. What, gofmt does smart quotes\nnow? Give me a break.",
"is_bot": false,
"headline": "ivy: add support for libraries",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-22T07:24:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d4dd5dbdb9569bbf6bcbbb0e4292cab0c9af431c",
"body": ")save prints these declarations\nbut )get wasn't parsing them.\nI broke this introducing named vector arguments.",
"is_bot": false,
"headline": "ivy: fix declaration of binary ops (#251)",
"author_name": "Russ Cox",
"author_login": "rsc",
"committed_at": "2025-12-20T22:43:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0f5277e08420d74e6c22b03e8b9e34ccc074886e",
"body": "Easy solution to issue 253\n\nFixes #253",
"is_bot": false,
"headline": "ivy: encode always returns a vector",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-19T00:30:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f923855ee3969df76250493afb2053d85e809681",
"body": "It was stupidly calling encodeTime, which is not only silly violates\na precondition for that routine. Easy fix: don't do that.\n\nUpdate #253",
"is_bot": false,
"headline": "ivy: an empty lhs for encode was crashing",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-18T06:12:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "293c481b704d4422afdf37f41c5b76c17ec4daf3",
"body": "Causes more inconsistencies and hacks than it's worth.\nAssignment and printing go back to their original behavior.\n\nFixes #252",
"is_bot": false,
"headline": "ivy: roll back the idea of \"unquieting\" a value in a block",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-17T04:53:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1f5018b94c88a5bf65851e1c7206d459a1ade728",
"body": "The addition of :while and :if led to the unwrapping of QuietValue\non return, so that a terminal assignment does not stop the value\nfrom being printed. But this had the unintended consequence of\ncausing printed values to appear twice. The simple solution is to\nhave two kinds of quiet values, one for assignment and one for\nprint. Clumsy but, as I said, simple.\n\nFixes #250",
"is_bot": false,
"headline": "ivy: add PrintValue",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-12T22:54:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3585b066fc2e3c98e471c5bd238d2149cb16fb22",
"body": "Two new control structures, introduced by keywords beginning with\na colon, inspired by Dyalog.\n\n\t:if condition; expressionList :else expressionList :end\n\t:while condition; expressionList :end\n\nBoth these parse as plain expressions. It is an expression\nlanguage after all. They evaluate to the last ex\n[…]\n For the moment, if you need one, you can always write,\n\n\t:if 1; block :end\n\nAlso found a day 1 bug in )debug parse: It crashed when printing a\nunary. Yikes.\n\nFixes #247\n\nScratches long-standing itch.",
"is_bot": false,
"headline": "ivy: add control flow constructs for if and while",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-11T09:18:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5b73b9b6678a4f071261e64c901c11e7ec09233a",
"body": "The old code was subtly (and rarely) incorrect. Since the first\nstep in op definition is to install a placeholder, the order in the\ndefinition list changes. We need to restore the order if the\ndefinition fails. Ugly but easy: remember where it was and put it\nback there.\n\nI took a look at slices.Insert. Don't need anything like that.",
"is_bot": false,
"headline": "ivy: fix fix for failing function definition",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-05T00:03:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b899214b4e7a830e276efc8af4cd2b3ad0a8773",
"body": "Experiment to push towards some control flow possible implementations.\nAlso tidy up the parser a bit, removing the redundancy of statementList\nand expressionList. The latter was unnecessary except for the )debug print,\nand that should be in Line anyway. So delete it and rename statementList\nto expressionList.",
"is_bot": false,
"headline": "ivy: add ExprList to the parser and make it the body of a function",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-04T21:21:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "feea477fb9bb3534366501755bdc4ece94c7ce31",
"body": "Day 1 bug: a failing function redefinition did not properly restore\nthe previous definition. An easy fix, made easier by doing a little\nclarifying rewriting of the management of the OpDef list.\n\nFixes #249",
"is_bot": false,
"headline": "ivy: fix bug in erroneous function definition",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-04T21:21:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38cf8f0c00165988a9b9295ad6d58065717796ec",
"body": "…248)\n\nUse Unicode box-drawing characters instead of pipes and parens.\n\nMatrices now print using square brackets; vectors use rounded brackets.\nAt top level, matrices and vectors have no box, as always.\nThat is, iota 5 still prints as \"1 2 3 4 5\" not \"(1 2 3 4 5)\".\nBoxes appear exactly when they did before,\njust with Unicode characters instead of ASCII characters.\n\nSee the testdata changes for examples of the visual changes.\n\nFixes #236.",
"is_bot": false,
"headline": "ivy: use box-drawing characters for multiline matrices and vectors (#…",
"author_name": "Russ Cox",
"author_login": "rsc",
"committed_at": "2025-12-02T21:13:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fa68ba291259d3cf2e5235e48ce7836bc61ae1ac",
"body": "…mmand",
"is_bot": false,
"headline": "ivy: delete incorrect documentation for non-existent trace special co…",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-12-01T23:41:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1810776c0cb98061aa9488b840facbce630f47e0",
"body": "The code had the right pieces in the wrong places. We need to\ndive into the vector elementwise, recursively.\n\nBefore:\n\t'b' text (2 3) (4 5)\n\nAfter:\n\t'b' text (2 3) (4 5)\n\t10 11 100 101\n\nTODO: Should we keep the parens for grouping?",
"is_bot": false,
"headline": "ivy: fix bug applying text binary to vectors",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-30T09:38:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "64fc6c0380f5ab2b97e355f54ec6eb405ade237b",
"body": "The previous CL permitted this, but I didn't test it well enough.\nA file name with a period in it caused the lexer to barf before we\ngot a chance to handle the input. But the failing check is redundant,\nas numbers are full parsed outside the lexer, so we just let it\nthrough and, if there is a true error, it will be caught higher up.",
"is_bot": false,
"headline": "ivy: better support for unquoted file names in )get",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-30T09:18:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f015123bfdd0f698182a1e7ea7131b494201bd3e",
"body": "Now that we have the full source text available internally, we can\navoid the need for quoting files in commands such as )get. They're\nstill allowed, just not required.\n\n)get lib.ivy\n\nis much nicer to type than\n\n)get \"lib.ivy\"",
"is_bot": false,
"headline": "ivy: don't require quotes in file names for special commands",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-30T02:53:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a9b7cf779f27cbe847678c3f7fc8b2e51c908352",
"body": "Keep a copy of the source text as we parse. This allows us to\nremember comments and formatting inside a function definition. It\nalso allows us to guarantee that a reparse, such as from a save\nfile, will give us the same result, allowing us to avoid concerns\nabout parentheses and precedence.\n\nIf the \n[…]\nto see it again with the new )last\nspecial command. This could be handy if a huge expression scrolls\nthe input off the screen.\n\nAlso document the long-provided but undocumented )trace special\ncommand.",
"is_bot": false,
"headline": "ivy: remember the source text",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-30T02:29:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ae034ba1206e0572206e45a9853f7b22df46d8c1",
"body": "Forgot the space after ) in \") clear\", for consistency.",
"is_bot": false,
"headline": "ivy: fix typo in doc.go",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-28T05:16:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d2f40738e9b28bbfa609b5932447335901845670",
"body": "Fix a long-standing irritation. I put in \"opdelete\" because it was\nnecessary and easy but it was so ugly. Replace it with a special\ncommand and its own minilanguage so we can clear operators and\nvariables or, with no arguments, everything.\n\nExamples:\n\nRemove whatever is called x:\n\t)clear x\n\nRemove the unary op fac:\n\t)clear unary fac\n\nRemove the binary op gcd:\n\t)clear binary gcd\n\nRemove all variables.\n\t)clear vars",
"is_bot": false,
"headline": "ivy: add )clear special command",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-28T05:11:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c7c3347318862ed27e997e85ff581d108beeb996",
"body": "May roll this back if it causes trouble, but it's very easy and feels right.\n\nFixes #246",
"is_bot": false,
"headline": "ivy: allow () to parse as the empty vector",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-25T04:50:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "03e150016ef5a08c888734c5584609c12ca35b89",
"body": null,
"is_bot": false,
"headline": "ivy: rewrite multiline formatting (#244)",
"author_name": "Russ Cox",
"author_login": "rsc",
"committed_at": "2025-11-25T04:17:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d6b0e4730213570931c0ccf3bfe535a4f7cc0876",
"body": "The count must still be a reasonable integer, which actually simplifies\nthings a bit relative to the int case, as the result will be sparse and\nwe can proceed optimistically.\n\nFixes #245",
"is_bot": false,
"headline": "ivy: implement binary ? for big ints",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-22T07:16:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af9044b987905be8865d680d86bac21d78189c8e",
"body": "If A is much less than B, it's much faster to generate randoms\nwhile avoiding duplicates. Otherwise we need to stick with Perm,\nwhich can be expensive.\n\nUpdate #245",
"is_bot": false,
"headline": "ivy: make A?B much faster for large B when possible",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-21T07:30:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9cb2ade0dc7eaeacec4b49dad47bd355d5b3ecfc",
"body": "Just a missing case in the trivial implementation.\n\nFixes #243",
"is_bot": false,
"headline": "ivy: make unary text work on chars",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-18T06:57:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "76424f8d33db18669997e662a568ffcb50f5e3af",
"body": "…operator\n\nThis change addresses an ambigiuity. Without it,\n\n\t1 2 3 x[2]\n\nchanges parse depending on whether x is a vector. Now it\nconsistently treats\n\n\t1 2 3 x\n\nas a vector. However, it means that\n\n\tx[1] x[2]\n\nhas new behavior, and parentheses are required to preserve\nthe old behavior.\n\nThe change \n[…]\nor knock-on effects in things like printing operator text. With\nan excess of caution, there are more parentheses around indexing\nexpressions in such places now to avoid misrepresenting the\nprecedence.",
"is_bot": false,
"headline": "ivy: change indexing to have the same precedence as any other binary …",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-18T05:06:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "766189fc960511fc5fe3121259340147981a6788",
"body": "A couple of early returns in the save code could cause it to\nomit the closing parenthesis. For example,\n\n\tx = 'abc' 'def'\n\nwould save as\n\n\tx = (\"abc\" (\"def\"\n\nSilly but easily fixed with a change to use 'break'.",
"is_bot": false,
"headline": "ivy: fix missing paren in )save",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-17T09:10:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cc7d192aef253ff5a4e6dda6278818f0bd5dcbd9",
"body": "The iterator for @ did not know about QuietValue.\n\nBefore:\n\n\t(x=1 2) @+ 3\n\t(4 5)\n\n\t1 2 @+ 3\n\t4 5\n\nAfter:\n\n\t(x=1 2) @+ 3\n\t4 5\n\n\t1 2 @+ 3\n\t4 5\n\nFixes #238.",
"is_bot": false,
"headline": "ivy: fix @ applied to assignments (#240)",
"author_name": "Russ Cox",
"author_login": "rsc",
"committed_at": "2025-11-16T12:06:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fd3857d820a803b4db56e3d81afcf9a0e700b049",
"body": "This change makes\n\t'abc' 'def'\nprint as\n\tabc def\ninstead of\n\t(abc) (def)\n\nDropping parens makes it a little nicer to print text in larger outputs.\n\nAs a more complex example, this:\n\n\top x reduce y = (+/x*x) <= (+/y*y): 2 2 rho x, y; y reduce x - (floor 0.5+(+/x*y)/(+/y*y))*y\n\top reduce (x y) = (+/x*\n[…]\n) 'reduces to' (reduce z = (10 20) (1 3))\n\nnow formats as:\n\n\t(10 20| reduces to ( 1 3|\n\t| 1 3) | 3 -1)\n\ninstead of:\n\n\t(10 20| (reduces to) ( 1 3|\n\t| 1 3) | 3 -1)\n\nFor #236.",
"is_bot": false,
"headline": "ivy: drop parens around string values in vectors and matrices (#239)",
"author_name": "Russ Cox",
"author_login": "rsc",
"committed_at": "2025-11-16T12:06:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6e251e53cf0dea1d1c3e6241cf70703c773b61dc",
"body": "The previous incorrect code was using the partial calculation of a failed\ninteger log, but in the rewrite that was never passed on, so delete that.\n\nAgain, keep it simple.",
"is_bot": false,
"headline": "ivy: delete unused code from value/log.go",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-07T10:10:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e3087ba8f1c7e6a833c9f696f17918bfa267be4",
"body": "The heart of it all, multiLineSprint, is required to return all lines of equal width.\nIt wasn't, for tricky reasons. Rather than complicate the code further, I added\na simple invariant-guaranteeing scan after each element. Clunky but effective.\n\nFixes #235",
"is_bot": false,
"headline": "ivy: fix bug in matrix printing due to failed alignment",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-07T07:19:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ccfba273bff11e906ccaad4a133955236e0b5260",
"body": "The code was just wrong. Rewrite it for clarity.\nAvoid the squaring for now, although it might be worth\nrevisiting. The cost is noticeable:\n\n2 log 2**1e5\n100000\n\n)cpu\n2.686ms (1.818ms user, 655µs sys)\n\nFixes #234",
"is_bot": false,
"headline": "ivy: fix integer logs",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-11-07T05:18:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7b2ef31a9f36b2bd225d15cb11811c4361e60cc1",
"body": "Requires fixing the debug test in testdata, which expected the debug\nsettings to persist\n\nFixes #230",
"is_bot": false,
"headline": "ivy: reset all fields in test run",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-07-10T06:41:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a8c511a44e14daff51ff1935d00753250bc7c843",
"body": "- BigFloat.Sprint: perform the argument reduction with extended\n precision and reorganize the code to fallback to big.Float.Text()\n after the rescale check\n- constants:\n - reduce precision of integer and rational constants (using more\n precision than needed to represent the values is not neces\n[…]\nalues of pi, e, ln 2 and ln 10 to have at least\n 10000 + 32 bits of precision\n- refactor exponential to match the big.Float API\n- refactor newFxP -> newFP to take a single prec argument\n\nFixes #225",
"is_bot": false,
"headline": "value: fix fastFloatPrint mode in bigFloat.Sprint (#229)",
"author_name": "Denis Bernard",
"author_login": "db47h",
"committed_at": "2025-06-17T02:51:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "942838238b8c1bc32680e88e6ed538c2a2a135e3",
"body": "* value: fix potential precision issues with MantExp\n\nx.MantExp(z) sets z.prec = x.prec. As a result, using z as a return\nvalue where it is expected to have a set precision will not always\nwork as intended. Another problem with this occurs in loop when\ncomparing zPrev.SetPrec(p).Set(z) with a future value of z and\nz.prec > p. This results in an infinite loop.\n\n* value: add test for #228\n\n* tests: reset float precision in reset()",
"is_bot": false,
"headline": "value: fix potential precision issues with MantExp (#228)",
"author_name": "Denis Bernard",
"author_login": "db47h",
"committed_at": "2025-06-17T01:14:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f3f5b3f7eaba53a049346897ebf3eb9b01e771a0",
"body": "* Fix exponential()\n\nFix various issues in exponential() like:\n\n- ** 1000 needing over 1600 iterations\n- ** -1000 yielding a large positive number\n- ** 2000 not converging after 2570 iterations\n\nThe fix involves scaling down x to [0.5, 1) and expanding the Taylor\nseries with increased precision.\n\nTh\n[…]\ning temp values\n manually\n- Panic on infinite result\n\n* Do not assume that x is finite\n\n* Exponential: rename prec and use a temp for sum\n\nand fix typos.\n\n* exponential: remove unnecessary if & typos",
"is_bot": false,
"headline": "Fix exponential() (#226)",
"author_name": "Denis Bernard",
"author_login": "db47h",
"committed_at": "2025-06-11T00:38:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5f9adfd9bd663d6b05ed52795b30fc6c3b2acd0d",
"body": "The message was written assuming the value was some sort of integer,\nbut in general it can be any type, so use %s instead of %d, as that\nhandles anything, if clumsily.",
"is_bot": false,
"headline": "ivy: fix printing of error in intAt",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-04-25T07:20:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "148764d5afb6637234c3ab5ffb513f64a501173e",
"body": "Was missing a check that the first element is non-empty.\n\nFixes #223",
"is_bot": false,
"headline": "ivy: fix bug causing empty first element in part",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-02-19T11:47:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d319d0ec31c659ab9b6ca169f4ef5fcdffd2a64e",
"body": "The code was already right for @!===, and easy to share.\n\nFixes #222.",
"is_bot": false,
"headline": "ivy: fix bad scanning of @===",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-02-16T03:28:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6e3fa69844ccb5b8352924ede8eed6278c9ab18b",
"body": "Not sure why it did this, except perhaps for some theory about\nefficiency. Let's make it behave the same regardless of the input\nsource.",
"is_bot": false,
"headline": "ivy: don't disable )cpu special command when reading from a file",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-02-13T02:17:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "96a7e5a49844dd24558c8e00035895d605baceda",
"body": "APLs traditionally use a reference-counted copy-on-write vector\r\nimplementation, so that shared vectors are copied before being\r\nwritten, but vectors with only one reference can be written directly.\r\n\r\nGetting the reference counts right seems daunting, especially since it\r\nwould probably require som\n[…]\n20Mi ± 0%\r\nbits=4 41.36Mi ± 0%\r\nbits=5 58.31Mi ± 0%\r\nbits=6 93.87Mi ± 0%\r\n\r\n │ allocs/op │\r\nbits=3 472.7k ± 0%\r\nbits=4 429.1k ± 0%\r\nbits=5 412.0k ± 0%\r\nbits=6 404.7k ± 0%",
"is_bot": false,
"headline": "ivy: use persistent tree as vector data storage (#221)",
"author_name": "Russ Cox",
"author_login": "rsc",
"committed_at": "2025-02-11T22:50:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2dcb2cb9ea54c4cd7acb6c0935c30095561f6abb",
"body": "Co-authored-by: musvaage <musvaage@users.noreply.github.com>",
"is_bot": false,
"headline": "ivy: fix typo in comment: s/caling/calling/ (#220)",
"author_name": "musvaage",
"author_login": "musvaage",
"committed_at": "2025-01-26T21:52:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c642447f3e01abf3bb74ee1966ce794765a64f85",
"body": "Fixes #218",
"is_bot": false,
"headline": "ivy: fix typo in comment: s/flatternTo/flattenTo/",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-01-25T20:34:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9119a1eb5e7033a18e968825bb6014f92f009fe2",
"body": null,
"is_bot": false,
"headline": "Fix typo in demo (#219)",
"author_name": "Vytautas Šaltenis",
"author_login": "rtfb",
"committed_at": "2025-01-25T20:30:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dba73f884af719d8a88714d6c12c11465fe9e4cb",
"body": "There were a number of places in the code where other types get 'shrunk'\n(reduced to a simpler type, e.g. 1.0e1 becomes integer 10) but\ncomplex numbers were not. This even includes when they are parsed.\n\nFixes #216",
"is_bot": false,
"headline": "ivy: call shrink on complex values",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-01-22T23:59:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d12e68f8f98739c79bacb9d9d01ad4c49393cbe",
"body": "I missed one place that needed updating, an error check. Sadly that\nmeans it took 4 keystrokes, not just 2, to add support for hexadecimal\nfloats.\n\nUpdate #215",
"is_bot": false,
"headline": "ivy: allow 0x1p1",
"author_name": "Rob Pike",
"author_login": "robpike",
"committed_at": "2025-01-22T23:39:31Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 58,
"commits_last_year": 86,
"latest_release_at": "2026-05-23T05:43:34Z",
"latest_release_tag": "v0.5.8",
"releases_from_tags": true,
"days_since_last_push": 63,
"active_weeks_last_year": 20,
"days_since_latest_release": 63,
"mean_days_between_releases": 15.2
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "robpike.io/ivy",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": null,
"registry_url": "https://pkg.go.dev/robpike.io/ivy",
"is_deprecated": false,
"latest_version": "v0.5.8",
"repository_url": null,
"versions_count": 59,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-05-23T05:43:34Z",
"latest_version_yanked": null,
"days_since_latest_publish": 63
}
]
},
"popularity": {
"forks": 116,
"stars": 1482,
"watchers": 54,
"fork_history": {
"days": [
{
"date": "2014-12-19",
"count": 1
},
{
"date": "2014-12-20",
"count": 1
},
{
"date": "2015-01-04",
"count": 1
},
{
"date": "2015-02-11",
"count": 1
},
{
"date": "2015-07-10",
"count": 1
},
{
"date": "2015-07-13",
"count": 5
},
{
"date": "2015-07-14",
"count": 1
},
{
"date": "2015-08-10",
"count": 1
},
{
"date": "2015-10-31",
"count": 1
},
{
"date": "2015-11-25",
"count": 1
},
{
"date": "2015-12-03",
"count": 1
},
{
"date": "2016-01-24",
"count": 1
},
{
"date": "2016-02-01",
"count": 1
},
{
"date": "2016-02-18",
"count": 1
},
{
"date": "2016-02-19",
"count": 1
},
{
"date": "2016-03-24",
"count": 1
},
{
"date": "2016-05-06",
"count": 1
},
{
"date": "2016-07-28",
"count": 1
},
{
"date": "2016-08-03",
"count": 1
},
{
"date": "2016-08-16",
"count": 1
},
{
"date": "2016-09-14",
"count": 1
},
{
"date": "2016-09-18",
"count": 1
},
{
"date": "2016-10-02",
"count": 1
},
{
"date": "2017-01-13",
"count": 1
},
{
"date": "2017-02-03",
"count": 1
},
{
"date": "2017-02-26",
"count": 1
},
{
"date": "2017-03-03",
"count": 1
},
{
"date": "2017-03-16",
"count": 1
},
{
"date": "2017-08-20",
"count": 1
},
{
"date": "2017-11-02",
"count": 1
},
{
"date": "2017-12-19",
"count": 1
},
{
"date": "2017-12-20",
"count": 1
},
{
"date": "2017-12-29",
"count": 1
},
{
"date": "2018-01-28",
"count": 1
},
{
"date": "2018-02-24",
"count": 1
},
{
"date": "2018-03-01",
"count": 1
},
{
"date": "2018-03-20",
"count": 1
},
{
"date": "2018-04-28",
"count": 1
},
{
"date": "2018-06-01",
"count": 1
},
{
"date": "2018-06-05",
"count": 1
},
{
"date": "2018-08-03",
"count": 1
},
{
"date": "2018-10-13",
"count": 1
},
{
"date": "2018-11-15",
"count": 1
},
{
"date": "2018-12-05",
"count": 1
},
{
"date": "2019-04-25",
"count": 1
},
{
"date": "2019-09-30",
"count": 1
},
{
"date": "2019-12-04",
"count": 1
},
{
"date": "2020-04-26",
"count": 3
},
{
"date": "2020-05-25",
"count": 1
},
{
"date": "2020-06-01",
"count": 1
},
{
"date": "2020-06-17",
"count": 1
},
{
"date": "2020-12-11",
"count": 1
},
{
"date": "2021-03-11",
"count": 1
},
{
"date": "2021-05-05",
"count": 1
},
{
"date": "2021-05-06",
"count": 1
},
{
"date": "2021-07-26",
"count": 1
},
{
"date": "2021-09-01",
"count": 1
},
{
"date": "2021-09-08",
"count": 1
},
{
"date": "2021-09-28",
"count": 1
},
{
"date": "2021-11-05",
"count": 1
},
{
"date": "2021-12-04",
"count": 1
},
{
"date": "2021-12-07",
"count": 1
},
{
"date": "2021-12-11",
"count": 1
},
{
"date": "2021-12-17",
"count": 1
},
{
"date": "2022-01-05",
"count": 1
},
{
"date": "2022-01-10",
"count": 1
},
{
"date": "2022-01-18",
"count": 1
},
{
"date": "2022-03-13",
"count": 1
},
{
"date": "2022-03-16",
"count": 1
},
{
"date": "2022-03-17",
"count": 1
},
{
"date": "2022-07-11",
"count": 1
},
{
"date": "2022-07-25",
"count": 1
},
{
"date": "2022-08-24",
"count": 1
},
{
"date": "2022-09-06",
"count": 1
},
{
"date": "2023-01-10",
"count": 1
},
{
"date": "2023-02-06",
"count": 1
},
{
"date": "2023-02-17",
"count": 1
},
{
"date": "2023-03-09",
"count": 1
},
{
"date": "2023-05-05",
"count": 1
},
{
"date": "2023-06-16",
"count": 1
},
{
"date": "2023-07-30",
"count": 1
},
{
"date": "2023-08-04",
"count": 2
},
{
"date": "2023-08-19",
"count": 1
},
{
"date": "2023-08-22",
"count": 1
},
{
"date": "2024-05-13",
"count": 1
},
{
"date": "2024-07-26",
"count": 1
},
{
"date": "2024-08-06",
"count": 1
},
{
"date": "2024-12-29",
"count": 1
},
{
"date": "2025-01-07",
"count": 1
},
{
"date": "2025-01-09",
"count": 1
},
{
"date": "2025-01-12",
"count": 1
},
{
"date": "2025-01-17",
"count": 1
},
{
"date": "2025-01-22",
"count": 1
},
{
"date": "2025-01-25",
"count": 1
},
{
"date": "2025-03-24",
"count": 1
},
{
"date": "2025-05-10",
"count": 1
},
{
"date": "2025-06-09",
"count": 1
},
{
"date": "2025-06-27",
"count": 1
},
{
"date": "2025-09-22",
"count": 1
},
{
"date": "2025-12-24",
"count": 1
},
{
"date": "2026-01-11",
"count": 1
},
{
"date": "2026-03-08",
"count": 1
},
{
"date": "2026-03-24",
"count": 1
},
{
"date": "2026-03-27",
"count": 1
},
{
"date": "2026-07-10",
"count": 1
}
],
"complete": true,
"collected": 112,
"total_forks": 116
},
"star_history": null,
"open_issues_and_prs": 4
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 46195,
"source_files_sampled": 67,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"go.mod"
],
"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": [
"go"
],
"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": 0,
"merged_prs": 81,
"open_issues": 4,
"closed_ratio": 0.972,
"closed_issues": 138,
"closed_unmerged_prs": 30
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "robpike",
"commits": 619,
"avatar_url": "https://avatars.githubusercontent.com/u/4324516?v=4"
},
{
"type": "User",
"login": "rsc",
"commits": 55,
"avatar_url": "https://avatars.githubusercontent.com/u/104030?v=4"
},
{
"type": "User",
"login": "fzipp",
"commits": 6,
"avatar_url": "https://avatars.githubusercontent.com/u/598327?v=4"
},
{
"type": "User",
"login": "db47h",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/879556?v=4"
},
{
"type": "User",
"login": "dmitshur",
"commits": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/1924134?v=4"
},
{
"type": "User",
"login": "SamuelMarks",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/807580?v=4"
},
{
"type": "User",
"login": "mndrix",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/43997?v=4"
},
{
"type": "User",
"login": "alrs",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/28523?v=4"
},
{
"type": "User",
"login": "hyangah",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/4999471?v=4"
},
{
"type": "User",
"login": "functionary",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/37858349?v=4"
}
],
"contributors_sampled": 19,
"top_contributor_share": 0.878
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": false,
"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": 0,
"reason": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 1/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 9,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 4,
"reason": "5 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4",
"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": null,
"reason": "no dependencies found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"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": "bdcfb3c3bcfbe74c5d27ed846b31d808ca93ca94",
"ran_at": "2026-07-25T05:45:37Z",
"aggregate_score": 3,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": null,
"oldest_open_prs": [],
"last_merged_pr_at": "2026-03-01T02:49:51Z",
"ci_last_conclusion": null,
"oldest_open_issues": [
{
"number": 194,
"created_at": "2024-12-27T10:06:28Z",
"last_comment_at": "2025-01-14T12:39:40Z",
"last_comment_author": "tcolgate"
},
{
"number": 205,
"created_at": "2025-01-10T11:53:26Z",
"last_comment_at": "2026-07-09T15:37:57Z",
"last_comment_author": "jacksonbenete"
},
{
"number": 264,
"created_at": "2026-02-25T01:37:58Z",
"last_comment_at": "2026-03-30T23:12:28Z",
"last_comment_author": "bear8642"
},
{
"number": 269,
"created_at": "2026-07-17T20:39:26Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/robpike/ivy",
"host": "github.com",
"name": "ivy",
"owner": "robpike"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"security": 30,
"vitality": 67,
"community": 62,
"governance": 64,
"engineering": 34
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 67,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"commits_last_year": 86,
"human_commit_share": 1,
"days_since_last_push": 63,
"active_weeks_last_year": 20
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 63 days ago",
"points": 18,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 63
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "20/52 weeks with commits",
"points": 13.8,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 20
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "86 commits in the last year",
"points": 17.4,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 86
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "5 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4",
"points": 4,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 88,
"inputs": {
"releases_count": 58,
"latest_release_tag": "v0.5.8",
"releases_from_tags": true,
"days_since_latest_release": 63,
"mean_days_between_releases": 15.2
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "58 version tags (no GitHub releases)",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "version_tags_no_releases",
"params": {
"count": 58
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 63 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 63
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~15.2 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 15.2
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 63,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 63 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 63
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "moderate",
"name": "Community & Adoption",
"value": 62,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "good",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 78,
"inputs": {
"forks": 116,
"stars": 1482,
"watchers": 54,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "1,482 stars",
"points": 51.4,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 1482
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "116 forks",
"points": 17.2,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 116
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "54 watchers",
"points": 9.6,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 54
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "at_risk",
"name": "Community health",
"note": null,
"notes": [],
"value": 44,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "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": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 64,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 28,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 19,
"top_contributor_share": 0.878
},
"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 88% of commits",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 88
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "19 contributors",
"points": 13.5,
"status": "met",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 19
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 73,
"inputs": {
"merged_prs": 81,
"open_issues": 4,
"closed_issues": 138,
"issue_closed_ratio": 0.972,
"closed_unmerged_prs": 30
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "97% of issues closed",
"points": 45.4,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 97
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "81/111 decided PRs merged",
"points": 27.9,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 81,
"decided": 111
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 1/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "good",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 71,
"inputs": {
"followers": 12190,
"owner_type": "User",
"is_verified": null,
"owner_login": "robpike",
"public_repos": 21,
"account_age_days": 4831
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "12,190 followers of robpike",
"points": 25,
"status": "met",
"details": [
{
"code": "owner_followers",
"params": {
"count": 12190,
"login": "robpike"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "21 public repos, account ~13 yr old",
"points": 21.8,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 21
}
},
{
"code": "account_age_years",
"params": {
"years": 13
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"robpike.io/ivy"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 63
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 63 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 63
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "59 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 59
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "at_risk",
"name": "Engineering Quality",
"value": 34,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "critical",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 24,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"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": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"topics": [],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": false,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 30,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 30,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 13,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 5,
"scorecard_aggregate": 3
},
"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": "0 out of 1 merged PRs checked by a CI test -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 1/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "5 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 4",
"points": 3,
"status": "partial",
"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": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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": 10
},
"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": 56,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 51,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "go.mod (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "go.mod"
}
}
],
"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": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 46195,
"source_files_sampled": 67,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/67 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 67,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
],
"report_type": "repository",
"generated_at": "2026-07-25T05:45:50.822992Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/r/robpike/ivy.svg",
"full_name": "robpike/ivy",
"license_state": "custom",
"license_spdx": null
}