Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 356,
"has_wiki": true,
"homepage": null,
"languages": {
"Gleam": 608595,
"Erlang": 1417,
"JavaScript": 5953
},
"pushed_at": "2026-04-21T15:57:01Z",
"created_at": "2026-03-11T22:23:55Z",
"owner_type": "User",
"updated_at": "2026-04-21T15:51:32Z",
"description": "Interact with Ethereum in Gleam",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Gleam",
"significant_languages": [
"Gleam"
]
},
"owner": {
"blog": null,
"name": "jstcz",
"type": "User",
"login": "czepluch",
"company": "@phylaxsystems ",
"location": "Copenhagen, Denmark",
"followers": 64,
"avatar_url": "https://avatars.githubusercontent.com/u/1026799?v=4",
"created_at": "2011-09-05T07:42:42Z",
"is_verified": null,
"public_repos": 65,
"account_age_days": 5440
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v1.7.0",
"kind": "minor",
"published_at": "2026-04-22T13:21:16Z"
},
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2026-04-14T16:13:12Z"
},
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2026-04-07T00:09:40Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2026-04-06T00:41:46Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2026-03-28T22:22:09Z"
},
{
"tag": "v1.2.0",
"kind": "minor",
"published_at": "2026-03-26T22:26:40Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2026-03-23T18:17:20Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2026-03-19T00:05:37Z"
}
],
"recent_commits": [
{
"oid": "d4eef4da887e505042177158137efce6911579fc",
"body": null,
"is_bot": false,
"headline": "Bump to v1.7.0",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-21T15:51:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "127cf578ab1531330d7b10582b935c1fa7a042d0",
"body": "Critical fixes per Gleam conventions (libraries must never panic):\n- Remove all 26 `let assert Ok(...)` from library code, replaced with\n proper Result handling via `use <- result.try` or case expressions\n- Remove all `Ok(\"\")` error swallowing, replaced with proper Error\n propagation\n\nDRY improvem\n[…]\nents.gleam, remove duplicate\n from event_watcher.gleam\n\nNon-idiomatic fixes:\n- Move imports from bottom to top in events.gleam and wei.gleam\n- Add Gleam conventions reference to CLAUDE.md\n\nCloses #42",
"is_bot": false,
"headline": "Refactor: eliminate panics, swallowed errors, and code duplication",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-20T15:58:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "93e4ab26d0b5d2ea91835c351143d61633c73e1d",
"body": "ens.reverse_resolve queries the reverse registrar to map addresses\nback to their primary ENS name. Computes the reverse node\n(<addr>.addr.reverse), looks up the resolver, calls name(bytes32).\n\n3 new tests: reverse namehash computation, resolve vitalik's address\non mainnet, no-record address. README updated.\n\nCloses #41",
"is_bot": false,
"headline": "Add ENS reverse resolution (address to name)",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-20T14:29:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f52d9400d307f08f9eec7fce2d0b2f56d444aeaf",
"body": "chain.by_id and chain.by_name look up pre-configured EVM networks.\nchain.to_provider creates a Provider with chain ID and retry enabled.\nchain.add extends the registry with custom chains.\n\nPre-configured: Ethereum, Sepolia, Arbitrum, Optimism, Polygon, Base.\nData verified against ethereum-lists/chains (the canonical source used\nby chainlist.org). Supports aliases: \"mainnet\", \"arbitrum\", \"op\", \"matic\".\n\n14 tests. Docs updated: README, CLAUDE.md.\n\nCloses #26",
"is_bot": false,
"headline": "Add multi-chain configuration registry",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-16T22:24:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ccc57144073c512141c6325b654a70deea6becbe",
"body": null,
"is_bot": false,
"headline": "Fix tutorial link to lowercase filename",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-15T23:11:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "58f15c852144ab985f9f2f00358c7d1768984bf6",
"body": null,
"is_bot": false,
"headline": "Remove PLAN.md from repo, rename tutorial to lowercase",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-15T23:10:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "12fca9489e17edc4d200fb4ae89a1e92856886bb",
"body": null,
"is_bot": false,
"headline": "Remove CHANGELOG.md - release notes are the canonical changelog",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-14T12:46:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2aaad236dd4f5d77d6fb45beb96db5a145d8a6de",
"body": null,
"is_bot": false,
"headline": "Bump to v1.6.0 with changelog",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-14T12:24:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "14db9255150d2ce418ab9c2c6fbd59fa3747216e",
"body": null,
"is_bot": false,
"headline": "Fix ENS tests to not retry in CI - use no-retry provider",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-14T12:21:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e9c89259047062fe6df53fceccdb85e32f546822",
"body": "ens.resolve(provider, \"vitalik.eth\") queries the ENS registry and\nresolver contracts to map names to addresses. ens.namehash implements\nthe recursive keccak256 namehash algorithm.\n\n6 tests: namehash for empty/eth/vitalik.eth/subdomain (offline),\nresolve vitalik.eth against mainnet, nonexistent name handling.\nDocs updated: README, CLAUDE.md, PLAN.md.\n\nCloses #24",
"is_bot": false,
"headline": "Add ENS name resolution",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-14T12:17:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f4b78234a02fac09b87478c7a654e1c12d5da8dd",
"body": "…ness\n\nevent_watcher: spawns a block watcher internally, queries logs for each\nnew block, decodes against ABI, forwards typed ContractEvent messages.\nSupports filtering by event name. Architecture respects BEAM Subject\nownership: the spawned process creates the block events Subject it\nreceives from,\n[…]\ntion_test: replaced direct get_transaction_receipt calls with\nwait_for_receipt to fix flaky failures when anvil receipts aren't\nimmediately available.\n\n3 event watcher tests, docs updated.\n\nCloses #40",
"is_bot": false,
"headline": "Add real-time contract event streaming and fix integration test flaki…",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-09T22:25:29Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d5e6b1b53e780c8131cb2d7ebc260e1d5ed82ca7",
"body": null,
"is_bot": false,
"headline": "Add event watcher issue (#40) and BEAM actor opportunities to plan",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-08T00:10:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f5951f2567b2601da9518d9edd35ce54390e5134",
"body": "watcher.start(provider) spawns a BEAM actor that polls eth_blockNumber\nand sends NewBlock events to a caller-owned Subject. Uses gleam_otp\nactor for proper lifecycle: Init message passes self-reference for\nsend_after scheduling, Stop message triggers graceful shutdown.\n\nEmits one event per block (ca\n[…]\nass between polls). Configurable poll interval via WatcherConfig.\n\n4 tests against anvil: detect new block, detect multiple blocks,\nstop, timeout. Docs updated: README, CLAUDE.md, PLAN.md.\n\nCloses #22",
"is_bot": false,
"headline": "Add block watcher using OTP actor pattern",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-07T23:32:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "804bd21b1cb2a58ea441e17fb4c33d74b724f410",
"body": "… wei",
"is_bot": false,
"headline": "Add ERC-20 tutorial: balances, transfers, approve, events, multicall,…",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-07T12:44:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7333bb4b4303bc03f7af0f6a73617e408537f404",
"body": null,
"is_bot": false,
"headline": "Show EIP-1559 as the default transaction example in README",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-07T11:51:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d05a3094975eec0590df5e8e876e091415d8c0e8",
"body": null,
"is_bot": false,
"headline": "Bump to v1.5.0 with changelog",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T23:59:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7ae6457ad1ddf8d589d3ab77852d759d71885c4",
"body": "multicall.new() |> multicall.add(target, calldata) |> multicall.execute(provider)\nbatches contract reads into a single eth_call via the canonical Multicall3\ncontract (0xcA11bde05977b3631167028862bE2a173976CA11). Supports try_add\nfor calls allowed to fail without reverting the batch. execute_at for\ncustom Multicall3 addresses.\n\n4 tests against anvil: batch reads, mixed success/failure, empty batch,\nmultiple contracts. Docs updated: README, CLAUDE.md, PLAN.md.\n\nCloses #28",
"is_bot": false,
"headline": "Add Multicall3 batching for efficient contract reads",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T23:54:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b41cc77486e8d91ce6de65379f504a12f75b34d2",
"body": null,
"is_bot": false,
"headline": "Update docs for events and permit modules",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T23:44:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d5a6525232534e63822aeaadd81c45d24f1c6161",
"body": "permit.sign fetches token name, nonce, and chain ID via RPC, constructs\nthe EIP-712 Permit typed data, and signs it. Returns v, r, s ready for\non-chain submission. permit.sign_with_domain for explicit domain control.\n\n4 tests: sign with domain, determinism, different amounts diverge,\nsignature recovery roundtrip.\n\nCloses #38",
"is_bot": false,
"headline": "Add EIP-2612 permit signing helper",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T23:44:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "58bc4aba34a98dbf1b4e6fc51a8fb462e70ed65c",
"body": "events.get_events combines get_logs + ABI event matching into one call.\nevents.get_events_by_name filters by event topic0 at the RPC level.\nevents.decode_logs works on existing logs (e.g. from receipts).\nUnmatched logs returned as Unknown so no data is lost.\n\nCloses #39",
"is_bot": false,
"headline": "Add event streaming with automatic ABI decoding",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T23:42:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "315ca56cef87cf1dba13e77eb30594d6b29937dd",
"body": "…ADME\n\n- contract.gleam: examples on at, call, send, call_raw, send_raw plus\n module doc showing both typed and string-coerced patterns\n- gas.gleam: examples on estimate_legacy and estimate_eip1559\n- nonce.gleam: examples on new, next, reset\n- README: new \"Contract interaction\" section showing call_raw/send_raw",
"is_bot": false,
"headline": "Add comprehensive doc examples to contract, gas, nonce modules and RE…",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T23:31:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5366e74f45cb6d7e50f763d5d6b67fda3678fe04",
"body": "contract.call_raw and contract.send_raw accept List(String) instead of\nList(AbiValue). Arguments are auto-coerced to the correct ABI types\nbased on the function's ABI definition: addresses as hex strings,\nintegers as decimal or hex, booleans as true/false.\n\nThis is the runtime wrapper approach for #\n[…]\n no code generation\nneeded. Users pass plain strings, the ABI handles type resolution.\n\n3 new tests: call_raw, send_raw then call_raw, wrong arg count error.\nDocs updated: README, PLAN.md.\n\nCloses #19",
"is_bot": false,
"headline": "Add string-coerced contract calls (call_raw/send_raw)",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T23:20:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c897f245a0357e4f05913aa6a2c530968b970df0",
"body": null,
"is_bot": false,
"headline": "Update docs for Contract type and block queries",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T23:09:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee1febd2b929c03f4af1be31b70bac42c5c06856",
"body": "contract.at(provider, address, abi) binds all three together.\ncontract.call for read-only calls with automatic ABI encoding/decoding.\ncontract.send for write transactions with automatic signing and broadcasting.\n\n5 tests against anvil: read call, write-then-read, unknown function error,\nrevert error, multiple calls on same instance.\n\nCloses #37",
"is_bot": false,
"headline": "Add Contract type for high-level contract interaction",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T23:05:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "602c29ddab72f2f353911cd91b2316352f892fcf",
"body": "…e ideas to plan",
"is_bot": false,
"headline": "Add Contract type, permit helper, log streaming issues and speculativ…",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T22:37:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7bac45d64b5c0e4a23e7f0b39a60f0a5d6ca1d31",
"body": null,
"is_bot": false,
"headline": "Bump to v1.4.0 with changelog",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T00:40:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "216905516d363757a546baba92ffff07b302cdf7",
"body": "Two new RPC methods returning the Block type with transaction hashes.\nAdds EthGetBlockByHash method variant and block_decoder. Accepts hex\nblock numbers or tags (latest, earliest, pending).",
"is_bot": false,
"headline": "Add get_block_by_number and get_block_by_hash",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T00:39:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "324a788fb16f44e8247953d21bfef35bea54de5c",
"body": "- eip712.gleam: add /// docs to all value constructors and domain setters\n- README: add EIP-712, batch RPC, contract deployment, retry middleware\n to features list\n- CLAUDE.md: add eip712, deploy, batch modules to architecture\n- PLAN.md: mark #20, #21, #27, #29 as done, add new features to\n \"What works\" section",
"is_bot": false,
"headline": "Add missing doc comments and update docs for new features",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T00:27:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9b8552294f1339137b90240c92330e5cb30b9759",
"body": "RetryConfig on Provider: max_retries, initial_backoff_ms, max_backoff_ms.\nRetries on HTTP 429 (rate limited), 503 (service unavailable), and\nconnection failures. Exponential backoff doubles each attempt up to\nthe configured ceiling.\n\n- provider.default_retry(): 3 retries, 1s-8s backoff\n- provider.no_retry(): fail immediately (default for new())\n- mainnet() and sepolia() come with retries enabled\n- All RPC methods route through retry-aware response_utils\n\nCloses #29",
"is_bot": false,
"headline": "Add retry middleware with exponential backoff for transient RPC errors",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T00:12:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8eb3787d258c04a3db8c899f2506cc3a0c09fefd",
"body": "deploy.deploy for contracts without constructor args.\ndeploy.deploy_with_args for contracts with ABI-encoded constructor\narguments. Both handle nonce/gas fetching, signing, broadcasting,\nand receipt polling internally, returning the contract address.\n\n3 tests against anvil: deploy Counter, deploy and call, deploy\nTestToken with constructor arg.\n\nCloses #27",
"is_bot": false,
"headline": "Add contract deployment helpers",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-06T00:00:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "787f5763a1be430195d4b86b2b292886b97579e9",
"body": "batch.new() |> batch.add(method, params) |> batch.execute_strings(provider)\nsends all requests as a JSON array per the JSON-RPC batch spec.\nResponses matched to requests by ID, order preserved.\n\n- execute_strings: decode each response as a string (common case)\n- execute_raw: return full JSON response bodies for custom decoding\n- Individual errors don't break the batch\n- 6 tests against anvil\n\nCloses #21",
"is_bot": false,
"headline": "Add batch JSON-RPC for multiple requests in a single HTTP call",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-05T23:53:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "78de19c5fab7abe53ae5697f6537468617d45686",
"body": "6 new tests comparing gleeth output against hashes computed by a\ndeployed Solidity contract using abi.encode + keccak256:\n- Mail domain separator, struct hash, and full digest\n- ERC-2612 Permit domain separator, struct hash, and full digest\n\nAll hashes match byte-for-byte, confirming encodeType, encodeData,\nhashStruct, domainSeparator, and the \\x19\\x01 prefix composition\nare correct.",
"is_bot": false,
"headline": "Cross-verify EIP-712 hashes against Solidity reference contract",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-04-05T15:44:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8a382e04ba3a659bab48974cf9ee5874d3c15e4b",
"body": null,
"is_bot": false,
"headline": "Add cast-verified type hash assertions to EIP-712 tests",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-28T23:53:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "911bcf9b8598d975c29f3ac1e3e9f99d0696ffe9",
"body": "Implements the full EIP-712 specification:\n- encodeType with recursive referenced type collection and sorting\n- encodeData for all atomic types (address, uint, int, bool, bytesN),\n dynamic types (string, bytes), arrays, and nested structs\n- hashStruct and hashType\n- Domain separator with optional f\n[…]\nlder API for domain and typed data construction\n\n12 tests: encodeType, domain hashing, sign/recover roundtrips,\nnested structs, ERC-2612 permit example, integer/bool encoding,\ndeterminism.\n\nCloses #20",
"is_bot": false,
"headline": "Add EIP-712 typed structured data hashing and signing",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-28T23:32:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "03567b338b945664958688bb24c046652a82d5ef",
"body": null,
"is_bot": false,
"headline": "Bump to v1.3.0 - library-only package, CLI split to gleeth-cli",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-28T22:13:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f145cf486a167cd39824c09e2e3cf82db044f534",
"body": "Delete entrypoint, CLI arg parsing, all command modules, formatting\nutilities, and file I/O. Remove argv and simplifile dependencies.\ngleeth is now a pure library package.\n\nThe CLI will be re-created as a separate gleeth_cli package.\n\nBREAKING: gleam run no longer works. Use gleeth as a library dependency.\n\nCloses #18",
"is_bot": false,
"headline": "Remove CLI from gleeth - library-only package",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-28T21:27:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "95671b8db2c9a6935a966bfced9d8a8cd67c98e0",
"body": "Full ERC-20 flow against anvil: deploy test token with forge, verify\ninitial balanceOf, approve spender, execute transferFrom, verify\nTransfer event log, verify final balanceOf. Tests gleeth's ABI\nencoding for contract calls and response decoding end-to-end.\n\nCloses #8",
"is_bot": false,
"headline": "Add ERC-20 integration test: deploy, approve, transferFrom, balanceOf",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-28T20:50:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "83ce05568f1501c9cb45815b26dbc34fc0d8e593",
"body": "ABI fuzz: random roundtrips for uint256, int256, bool, address,\nstring, bytes, bytes32, tuples, and dynamic arrays using qcheck.\nSign/recover fuzz: random key generation, hash signing, personal\nmessage signing, and wrong-message rejection verification.\n\nCloses #7",
"is_bot": false,
"headline": "Add ABI encode/decode fuzz tests and sign/recover cycles",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-27T13:43:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e67a57b23b84c7a14622eb364a3b8536d8f40056",
"body": null,
"is_bot": false,
"headline": "Bump to v1.2.0 with changelog",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-26T19:47:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d5f7c358d0921864cc4cee4fa531d1ac9f65dc2",
"body": "- PLAN.md: remove test counts, mark phases 6 and 8 as done, remove\n duplicated phase descriptions for completed work\n- CLAUDE.md: update architecture to reflect current modules (provider,\n wei, gas, nonce, address, transaction builder/decoder), fix stale\n config.new reference, add missing error variants",
"is_bot": false,
"headline": "Remove hardcoded counts and stale content from docs",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-25T16:17:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e06e69a26ecbb82ff43fc0d675f420fc6450c4be",
"body": null,
"is_bot": false,
"headline": "Remove test count from README - unnecessary maintenance burden",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-25T15:02:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e047108f6a7d44384aa7ab3e4ae01ba331a4bc9",
"body": "Add builder API quick start showing pipeline-style transaction\nconstruction with human-readable values. Update features list to\ninclude all v1.1.0+ additions: transaction decoder, gas estimation,\nreceipt polling, nonce manager, wei conversions, EIP-55, EIP-191.",
"is_bot": false,
"headline": "Update README with builder pipeline example and full feature list",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-25T15:00:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b7bf2c0951ff02821699a3b3dba54ac75d7154cc",
"body": "Takes a parsed ABI FunctionEntry and result hex, extracts output\ntypes, and decodes. Matches the convenience of encode_call.\n\nCloses #36",
"is_bot": false,
"headline": "Add decode_outputs for ABI function entry return values",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-25T14:47:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "90145f7b4758beddb3e8eff7569359b0afc2d042",
"body": "Builder: pipeline-style API with LegacyBuilder/Eip1559Builder types.\nSetters accept human-readable values (value_ether, gas_price_gwei)\nor raw hex. sign_legacy/sign_eip1559 validate and sign in one step.\n\nSender recovery: recover_sender and recover_sender_eip1559 reconstruct\nthe signing hash and recover the signer address via ecrecover.\n\nCloses #15\nCloses #34",
"is_bot": false,
"headline": "Add transaction builder API and sender recovery",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-25T14:45:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7f83992f273872cfcce4ced39d68dd57638bbbfd",
"body": "NonceManager fetches initial nonce from network, then increments\nlocally for subsequent calls. reset re-syncs with network state.\n\nCloses #16",
"is_bot": false,
"headline": "Add local nonce manager for multi-transaction sequences",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-25T14:44:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "607c070b9cd22cc4b7a46c46191dfe6b3f8596db",
"body": "estimate_legacy returns gas_price + gas_limit in one call.\nestimate_eip1559 returns max_fee (2 * base_fee + priority_fee),\npriority_fee, and gas_limit. Eliminates 10-15 lines of boilerplate\nper transaction.\n\nCloses #14",
"is_bot": false,
"headline": "Add gas estimation helpers for legacy and EIP-1559",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-25T14:44:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "51e7c7787c8238a4e90683d5b73162be543d028b",
"body": "wait_for_receipt polls get_transaction_receipt with backoff (1s, 2s,\n4s, 4s...) and 60s default timeout. wait_for_receipt_with_timeout\naccepts custom timeout in milliseconds.\n\nCloses #13",
"is_bot": false,
"headline": "Add receipt polling with exponential backoff",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-25T14:43:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4bd9320258b95d02c344eb32290b684ae3edda09",
"body": "Closes #5",
"is_bot": false,
"headline": "Update actions/checkout to v6 for Node.js 24 compatibility",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-23T20:10:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a5e4f973fa97b5f3e97b3ae18e567297f08bf847",
"body": "MockWallet type and hardcoded mock functions were not testing real\nwallet integration. Replaced with actual crypto/wallet calls.\n\nCloses #4",
"is_bot": false,
"headline": "Replace mock wallet with real wallet module in random_test",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-23T20:09:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ca54d4f78b1ad0f7c992030c264c3462ef35422e",
"body": "Both are handled in main() before execute_command is called.\nCombined into a single pattern with a comment.\n\nCloses #2",
"is_bot": false,
"headline": "Collapse unreachable Wallet/Help cases in execute_command",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-23T20:09:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6eefe49adad15bb5e7f6c20686ad085d77b4afa7",
"body": "ParamType, Parameter, and ContractCall types were wrappers around the\nABI type system that predated it. Refactored all functions to use\nAbiType/AbiValue directly. Updated call command and tests.\n\nCloses #1",
"is_bot": false,
"headline": "Remove legacy ParamType shim from contract.gleam",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-23T20:09:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aa7b1509a841213d450d9b8b73dd3090b0419040",
"body": null,
"is_bot": false,
"headline": "Update PLAN.md to reflect v1.1.0 state and reorganize phases",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-23T19:50:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "919deadb36f7b135f135a135e5394f16a3526a13",
"body": null,
"is_bot": false,
"headline": "Bump to v1.1.0 with changelog and move qcheck to dev-dependencies",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-23T17:59:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9429cd6128db53cff8f16a34eab0f85ef6f48370",
"body": "wei.from_ether, wei.from_gwei convert human-readable amounts to hex.\nwei.to_ether, wei.to_gwei convert hex back to decimal strings.\nwei.from_int, wei.to_int for integer/hex conversion. Uses bigi for\narbitrary precision - no float truncation on large values.\n26 tests including roundtrips and edge cases.\n\nCloses #11",
"is_bot": false,
"headline": "Add wei/gwei/ether conversion module",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-23T17:39:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ac0f81baedf1d286f119cedbe5bc1002f5c80a78",
"body": "address.checksum produces mixed-case checksummed addresses per EIP-55.\naddress.is_valid_checksum validates checksums, accepting all-lowercase\nand all-uppercase as always valid. 15 tests including EIP-55 spec vectors\nand known anvil addresses.\n\nCloses #12",
"is_bot": false,
"headline": "Add EIP-55 checksummed addresses",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-23T17:39:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "431cc670b247b576cf26e7251f8b26b0f125ea43",
"body": "19 tests covering malformed JSON, RPC errors, null/missing fields,\ntype mismatches, and edge cases in transaction/receipt/fee decoding:\n- Empty, invalid, truncated JSON returns clean errors\n- RPC error responses detected and propagated\n- Null optional fields (pending tx, contract creation, receipts)\n- EIP-1559 tx fields (missing gasPrice, present maxFeePerGas)\n- Fee history without optional reward field\n- Type mismatches (number/object where string expected)\n\nCloses #9",
"is_bot": false,
"headline": "Add RPC response edge case tests for decoder robustness",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-23T15:48:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2e955dd33106222d1741c175d15e8efa57718fff",
"body": "Tests against anvil (skipped gracefully if not running):\n- Deploy Counter contract and verify receipt has contract address\n- Deploy, call getCount(), increment(), call again, verify state change\n- Insufficient gas (gas limit 1) returns error\n- Insufficient balance returns error\n- Contract revert (fa\n[…]\nns error on eth_call\n- Nonce too low (replay) returns error\n- Multi-transaction sequence: 3 txs with sequential nonces, all mined\n- EIP-1559 contract deployment and interaction\n\nPartially addresses #8",
"is_bot": false,
"headline": "Add integration tests for contract deployment, errors, and multi-tx",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-22T23:15:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "bb949ccc113a4158d39bc2488c1875d5eec53e05",
"body": null,
"is_bot": false,
"headline": "Fix formatting in transaction_cast_test.gleam",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-22T20:50:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d03518281094532654c67f14064ff8a5036980d",
"body": "Property-based fuzz tests (qcheck):\n- Legacy sign/decode roundtrip with random params (100 iterations)\n- EIP-1559 sign/decode roundtrip with random params (100 iterations)\n- Contract creation roundtrip, auto-detect, chain_id recovery\n- 8 fuzz functions exercising ~800 random transactions\n\nCross-impl\n[…]\n-1559 parameter sets verified byte-identical to cast mktx\n- Covers mainnet, Sepolia, Arbitrum, Polygon, Optimism\n- Tests zero value, high nonce, high gas, edge fee combinations\n\nPartially addresses #7",
"is_bot": false,
"headline": "Add fuzz testing and cross-implementation verification with cast",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-22T20:10:55Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4ee551c01d90f56683a9c6be662c6166d0074fab",
"body": "- wallet.recover_personal_message: recover signer from personal_sign\n- wallet.verify_personal_message: verify signature against address\n- secp256k1.signature_from_hex: parse 65-byte hex signatures\n- Handles v=0/1 and v=27/28 normalization\n- 8 tests: sign/recover roundtrips, empty/long messages, wrong address,\n signature parsing roundtrip, error cases\n\nCloses #32\nCloses #35",
"is_bot": false,
"headline": "Add EIP-191 personal message recovery and signature_from_hex",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-20T12:30:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56a70500460a2f45e0b01f60e4a7570e3e7753dc",
"body": "…coding\n\n- decode_function_input: decode calldata given a function signature string\n- decode_calldata: decode calldata by matching selector against ABI entries\n- decode_function_output: decode eth_call return values\n- decode_revert: decode Error(string), Panic(uint256), and custom errors\n- 19 tests covering ERC-20 ops, multi-param, no-param, error cases,\n roundtrips, and all revert types\n\nCloses #31\nCloses #33",
"is_bot": false,
"headline": "Add calldata decoding, function output decoding, and revert reason de…",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-20T12:30:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "31b37c1454f69e65265e529bee53ca85f0beaa4f",
"body": "Implements decode_legacy, decode_eip1559, and auto-detecting decode\nfunction. Recovers chain_id from EIP-155 v values, parses access lists,\nand handles all edge cases (contract creation, zero values, large\nchain IDs). Includes 22 round-trip tests verifying decode against\nevery existing signing vector.\n\nCloses #30",
"is_bot": false,
"headline": "Add transaction decoder for legacy and EIP-1559 transactions",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-20T11:58:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9621d5a93850516dbe4066e5d4be8b9784608680",
"body": "Covers zero value, contract creation (empty to), large chain IDs\n(Arbitrum 42161, max uint32 2^32-1), zero priority fee, multi-entry\naccess lists, and v-value correctness. All vectors generated with\ncast mktx and cross-verified with cast keccak for tx hashes.\n\nCloses #6",
"is_bot": false,
"headline": "Add 18 edge case signing tests verified against Foundry cast",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-19T23:12:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "220e9ef5c43b3d9fa22c1512a69b9486f71bf157",
"body": "Add Phase 6 (code cleanup), reorganize phases 7-10 to cover\nergonomics, testing, and advanced features. New items include\ntyped contract bindings, EIP-712, batch JSON-RPC, nonce manager,\ngas estimation helpers, receipt polling, and block subscriptions.",
"is_bot": false,
"headline": "Expand PLAN.md with full roadmap through Phase 10",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-19T00:11:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "34944d657a2a42c538ff59d915195347fbce3450",
"body": "Add prominent warning to README and provider module docs that gleeth\nhas not been audited and is recommended for testnet/development only.\nAdd Phase 8 (comprehensive testing) to PLAN.md for pre-audit work.",
"is_bot": false,
"headline": "Bump to v1.0.0 with unaudited warning for initial Hex release",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-19T00:00:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "135e2e4f63f7c8ab1c4a07527ee8a6845f91c502",
"body": "- Add MIT LICENSE file and update gleam.toml licence field\n- Extract shared error_to_string onto GleethError, removing duplication\n between gleeth.gleam and parallel_balance.gleam\n- DRY up wei/gwei string division into single parameterized helper\n- Remove vacuous tests that always passed (285 tests remain, all real)\n- Replace reimplemented list helpers in random_test with stdlib imports\n- Delete stale npm artifacts (node_modules, package.json)\n- Add CHANGELOG.md for v0.1.0",
"is_bot": false,
"headline": "Clean up for v0.1.0 release: DRY code, MIT license, changelog",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-18T23:37:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "701c363d36215d5c46192cd3790e474d54b5fc2d",
"body": "All numeric parameters (value, gas, nonce) require 0x-prefixed hex\nstrings. Add per-parameter docs to create_legacy_transaction,\ncreate_eip1559_transaction, create_eth_transfer, create_contract_call.\nClarify in README that RPC return values can be passed directly.\nAdd Phase 7 to PLAN.md with future ergonomics work: wei conversion\nhelpers, EIP-55 checksums, type-safe builder pattern.",
"is_bot": false,
"headline": "Document hex string convention for transaction builders",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-18T22:27:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d03294af027cab2dcec8c72993f10ef11a767ee6",
"body": "Add /// doc comments with ## Examples sections to all user-facing\nmodules: provider, rpc/methods, rpc/types, ethereum/types,\nethereum/abi/types. Add //// module docs to each. Replace placeholder\nREADME with quick start examples covering balance checks, transaction\nsigning, contract calls, and ABI encoding.",
"is_bot": false,
"headline": "Add comprehensive doc comments and README for v0.1.0",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-18T22:19:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "05d3893588ec566846d9a9cdb1ab9b70a95ed356",
"body": "Add WalletErr(WalletError), TransactionErr(TransactionError), and\nAbiErr(AbiError) variants to GleethError so library consumers can\nhandle one Result type across wallet, transaction, and RPC pipelines\nwithout losing semantic detail. Replaces string-flattening at bridge\npoints in send.gleam and contract.gleam.",
"is_bot": false,
"headline": "Consolidate error types with wrapper variants on GleethError",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-18T21:50:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d53c0691da8c41694e82e1a5c529bb801c7ee3f0",
"body": "Delete wallet.sign_transaction and TransactionParams - stale\nplaceholder from before RLP/signing was implemented. Real signing\nlives in crypto/transaction. Set gleam.toml to 0.1.0 with\ndescription, licence, and repository for Hex publishing.",
"is_bot": false,
"headline": "Remove dead sign_transaction stub, set v0.1.0 publishing metadata",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-18T21:31:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "54e09c5b65f3afc3660e2f09f562ae0abdac29d3",
"body": "Replace bare rpc_url: String parameter threading with an opaque\nProvider type that carries validated URL and optional chain_id.\nProvider boundary is at methods.gleam - layers below unchanged.\nDeletes config.gleam (absorbed into provider.gleam).",
"is_bot": false,
"headline": "Add opaque Provider type, replace rpc_url string threading",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-18T17:00:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b7e5bd85a3913aa5fb4d951072666b9f695280d5",
"body": null,
"is_bot": false,
"headline": "Mark Phase 1 as done, update test count and CI status in plan",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-18T00:04:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b945aceb0eb8f3f8885f0e576fb48f6248716e86",
"body": "Implements complete Solidity ABI support: type system, type string\nparser, encoder with head/tail layout, decoder, JSON ABI file parsing,\nevent log decoding, and CLI integration via --abi flag on call command.\nRefactors contract.gleam to delegate to the new ABI encoder. 292 tests\npass including roundtrip coverage for nested compound types.",
"is_bot": false,
"headline": "Add full ABI encoding/decoding system (all Solidity types)",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-17T23:51:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "050a240764f1f41d68b98d7958d01fdbe0351685",
"body": "Receipt fetch after broadcast can fail if the transaction hasn't been\nmined yet. Print a helpful message instead of crashing, since the\nbroadcast itself already succeeded.",
"is_bot": false,
"headline": "Handle unavailable receipt gracefully in send command",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-16T14:55:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "56d025877a37a36ad618740fd99078ebc8540033",
"body": "New RPC methods: eth_sendRawTransaction, eth_getTransactionCount,\neth_gasPrice, eth_maxPriorityFeePerGas, eth_feeHistory, eth_chainId.\nAdd FeeHistory type for fee estimation responses.\n\nAdd `gleeth send` CLI command that queries nonce/fees from the node,\nsigns (EIP-1559 by default, --legacy for Type 0), broadcasts, and\nprints the receipt. Verified end-to-end against anvil.\n\nIntegration tests cover legacy broadcast, EIP-1559 broadcast, and\nfee history queries. Phase 3 complete.",
"is_bot": false,
"headline": "Add transaction broadcasting support and send CLI command",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-16T12:46:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2dae2f650fcfac00732a4f13fb138fe6513f98e4",
"body": "Implement the modern Ethereum transaction format with envelope encoding\n(0x02 prefix), dual gas fields, simplified v recovery, and access list\nsupport. Verified byte-identical to Foundry cast mktx across 4 vectors\nincluding access list encoding. Update PLAN.md to reflect current state.",
"is_bot": false,
"headline": "Add EIP-1559 (Type 2) transaction signing",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-16T12:09:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b38b510762e7e52530be6fe2b4bc6ba5ea4bfa4",
"body": "Three test vectors generated with cast mktx --legacy, covering:\n- Simple ETH transfer on mainnet (nonce 0, 1 gwei, 1 ETH)\n- ETH transfer on Sepolia (nonce 42, 20 gwei, 0.5 ETH, large chain ID)\n- Contract call with ABI-encoded calldata (transfer ERC-20)\n\nEach vector verifies raw_transaction, v/r/s components, and tx hash\nagainst Foundry's output. Integration test sends a Gleeth-signed tx\nto anvil and confirms it is accepted and mined (skips if anvil is\nnot running).",
"is_bot": false,
"headline": "Add transaction signing tests with Foundry-verified vectors",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T14:16:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "286f684022ef6e40780d0b7c2f8b0d2cbe8a2eea",
"body": "Replace placeholder string concatenation with proper RLP encoding\nfor both the EIP-155 signing hash and raw transaction output. Fix\nthe v calculation bug (was double-counting recovery_id + 27). Hash\nthe actual transaction bytes in get_transaction_hash. Remove the\nnow-unnecessary RlpEncodingNotImplemented error variant.",
"is_bot": false,
"headline": "Wire RLP encoding into transaction signing",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T13:23:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b73df1da426fbb67ca254ddaa2b40f41deb04d2b",
"body": "Implements the RLP serialization format needed for transaction signing\nand broadcasting. Includes encoder, decoder, and convenience helpers\nfor integer, string, and hex field conversion. 47 tests cover all\nencoding rules, boundary cases, roundtrips, and error handling.",
"is_bot": false,
"headline": "Add RLP encoding/decoding per Ethereum Yellow Paper spec",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T13:16:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f83eefbf0ce89cfe0a1070b30be3e8c1a0b9e4fb",
"body": null,
"is_bot": false,
"headline": "Fix formatting in rpc_methods_test.gleam",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T12:48:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ed2d73a0547c6b7077f3906281df0e9c8dcfdf2b",
"body": "Replace PROJECT_STATUS.md and PHASE_1_2_1_SUMMARY.md with a single\nPLAN.md covering the roadmap from RLP encoding through provider\nabstraction. Fix CI workflow: Gleam 1.14.0, OTP 28, add Elixir 1.19\nand mix local.hex step for NIF compilation. Update CLAUDE.md with\nbuild prerequisites and current FFI documentation.",
"is_bot": false,
"headline": "Consolidate project docs, fix CI workflow, add development plan",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T12:46:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0a5d3f6698362c8d33b83642e7de2c6faa9e4d61",
"body": "Add 16 new tests for the JSON-RPC decoding layer covering:\n- String result decoding (block number, balance, code)\n- RPC error responses and malformed JSON\n- Transaction decoding (legacy, EIP-1559, pending, null)\n- Transaction receipt decoding (success, failed, contract creation)\n- Log decoding (with topics, empty list, multiple logs)\n\nAlso replace list.length(x) > 0 with x != [] in secp256k1_test.",
"is_bot": false,
"headline": "Add RPC decoder tests and fix list.length warning",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T12:19:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6af4a762ac283f22125eeafbcad8c4cd5eb0ccc1",
"body": "recovery_demo_cli.gleam and signature_tool.gleam were standalone\nentry points for demonstrating signature recovery. Their\nfunctionality is covered by the wallet CLI subcommand and the\ncrypto test suite.",
"is_bot": false,
"headline": "Remove standalone demo scripts",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T12:11:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d43d2e31c9a509a077cd6f2ca7cbea488ae0288e",
"body": "wallet.gleam was calling ExKeccak FFI directly for personal message\nhashing. Now routes through crypto/keccak.keccak256_binary instead.\nAlso simplified keccak.gleam by removing unnecessary bit_array\nroundtrip. Added mise.toml to pin Elixir toolchain requirement.",
"is_bot": false,
"headline": "Consolidate keccak256 calls through crypto/keccak module",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T12:10:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b94f4de40a1c55f13f891842f77cb6f72f500ddf",
"body": "Replace sequential list.map with process.spawn + Subject for real\nconcurrent RPC calls, batched in groups of 10 with 30s timeout.\nAdded gleam_erlang as direct dependency for process module access.",
"is_bot": false,
"headline": "Make parallel_balance use actual concurrency",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T12:09:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ecc3dded789f18987e0a8f632ceb84e798ecd41",
"body": "The get_env_rpc_url() function in cli.gleam was stubbed out and\nalways returned Error. Added get_env/1 to gleeth_ffi.erl wrapping\nErlang os:getenv, so the --rpc-url flag can now be omitted when\nthe env var is set.",
"is_bot": false,
"headline": "Implement GLEETH_RPC_URL environment variable support",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T12:09:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "81f32ba5a4bbbda6336a0279efece844d189b4c7",
"body": "rpc/client.gleam now returns raw HTTP response body instead of\nhand-parsed JSON. rpc/methods.gleam uses typed decode.Decoder\ndefinitions for Transaction, TransactionReceipt, Log, and\nTransactionStatus. Removes ~900 lines of brittle string-based\nJSON extraction code (extract_json_field_value, extract_string_field,\nsplit_objects_recursive, etc.) in favor of ~80 lines of composable\ndecoders. Also adds CLAUDE.md for project context.",
"is_bot": false,
"headline": "Replace manual JSON parsing with gleam_json decoders",
"author_name": "jstcz",
"author_login": "czepluch",
"committed_at": "2026-03-15T11:58:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ebd995a8339bb50e5d1491a857d30322620fc4f",
"body": null,
"is_bot": false,
"headline": "get history",
"author_name": "Jacob Stenum Czepluch",
"author_login": "czepluch",
"committed_at": "2026-03-12T17:17:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "87cb80fe97c49f18c77a954fa970b0d33d025907",
"body": null,
"is_bot": false,
"headline": "save current status",
"author_name": "Jacob Stenum Czepluch",
"author_login": "czepluch",
"committed_at": "2026-03-12T17:15:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8138f4e3edc618afa99acecc06bf0db485841417",
"body": null,
"is_bot": false,
"headline": "add back some logic tests",
"author_name": "Jacob Stenum Czepluch",
"author_login": "czepluch",
"committed_at": "2025-08-20T18:08:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "70530e4ea35bbeb49fc651183210641db304616e",
"body": "- Reduce test count from 269 to 33 (88% reduction) while maintaining essential coverage\n- Add comprehensive .gitignore with Node.js, Gleam, and development file exclusions\n- Add JavaScript compatibility with package.json for cross-platform crypto\n- Eliminate all test console output and fix failing tests\n- Add critical cryptographic sign-and-verify test cycle\n- Update PROJECT_STATUS.md with current state and next steps\n\nAll tests passing, ready for next development phase.",
"is_bot": false,
"headline": "Major test suite cleanup and infrastructure improvements",
"author_name": "Jacob Stenum Czepluch",
"author_login": "czepluch",
"committed_at": "2025-08-20T18:02:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dbbabf8e333ac839a57bf63e864b314bfb80acb5",
"body": null,
"is_bot": false,
"headline": "initial commit",
"author_name": "Jacob Stenum Czepluch",
"author_login": "czepluch",
"committed_at": "2025-08-14T14:46:16Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 8,
"commits_last_year": 92,
"latest_release_at": "2026-04-22T13:21:16Z",
"latest_release_tag": "v1.7.0",
"releases_from_tags": false,
"days_since_last_push": 98,
"active_weeks_last_year": 8,
"days_since_latest_release": 97,
"mean_days_between_releases": 4.9
},
"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": "gleeth",
"exists": true,
"license": "MIT",
"keywords": [],
"ecosystem": "hex",
"matches_repo": true,
"registry_url": "https://hex.pm/packages/gleeth",
"is_deprecated": false,
"latest_version": "1.7.0",
"repository_url": "https://github.com/czepluch/gleeth",
"versions_count": 8,
"total_downloads": 8223,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 2038,
"first_published_at": "2026-03-19T00:04:21.491563Z",
"latest_published_at": "2026-04-21T15:55:58.123032Z",
"latest_version_yanked": null,
"days_since_latest_publish": 98
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 2
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [
"mise.toml"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 5662,
"source_files_sampled": 2,
"oversized_source_files": 0,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 4791
},
"dependencies": {
"manifests": [],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [],
"dependencies": [],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 2,
"closed_ratio": 0.952,
"closed_issues": 40,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "czepluch",
"commits": 92,
"avatar_url": "https://avatars.githubusercontent.com/u/1026799?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"test.yml"
],
"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": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 6,
"reason": "project has 2 contributing companies or organizations -- score normalized to 6",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 10,
"reason": "project is fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "d4eef4da887e505042177158137efce6911579fc",
"ran_at": "2026-07-29T04:02:27Z",
"aggregate_score": 3.8,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-04-21T15:52:08Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 23,
"created_at": "2026-03-19T00:38:38Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 25,
"created_at": "2026-03-19T00:38:45Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/czepluch/gleeth",
"host": "github.com",
"name": "gleeth",
"owner": "czepluch"
},
"metrics": {
"overall": {
"key": "overall",
"band": "at_risk",
"name": "Overall health",
"note": null,
"notes": [],
"value": 49,
"inputs": {
"security": 38,
"vitality": 56,
"community": 32,
"governance": 58,
"engineering": 56
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 56,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "at_risk",
"name": "Development activity",
"note": null,
"notes": [],
"value": 33,
"inputs": {
"commits_last_year": 92,
"human_commit_share": 1,
"days_since_last_push": 98,
"active_weeks_last_year": 8
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 98 days ago",
"points": 9.9,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 98
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "8/52 weeks with commits",
"points": 5.5,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 8
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "92 commits in the last year",
"points": 17.7,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 92
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"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": 90,
"inputs": {
"releases_count": 8,
"latest_release_tag": "v1.7.0",
"releases_from_tags": false,
"days_since_latest_release": 97,
"mean_days_between_releases": 4.9
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "8 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 8
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 97 days ago",
"points": 27,
"status": "partial",
"details": [
{
"code": "release_recency",
"params": {
"days": 97
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~4.9 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 4.9
}
}
],
"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": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 32,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 55,
"inputs": {
"packages": [
"gleeth"
],
"dependents": null,
"ecosystems": "hex",
"total_downloads": 8223,
"monthly_downloads": 2038
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,038 downloads/month across hex",
"points": 44.1,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2038,
"ecosystems": "hex"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 58,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 16,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"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 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 2 contributing companies or organizations -- score normalized to 6",
"points": 6,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 0,
"open_issues": 2,
"closed_issues": 40,
"issue_closed_ratio": 0.952,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "95% of issues closed",
"points": 44.5,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 95
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"inputs": {
"followers": 64,
"owner_type": "User",
"is_verified": null,
"owner_login": "czepluch",
"public_repos": 65,
"account_age_days": 5440
},
"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": "64 followers of czepluch",
"points": 13,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 64,
"login": "czepluch"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "65 public repos, account ~14 yr old",
"points": 25,
"status": "met",
"details": [
{
"code": "public_repos",
"params": {
"count": 65
}
},
{
"code": "account_age_years",
"params": {
"years": 14
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"gleeth"
],
"ecosystems": "hex",
"any_deprecated": false,
"min_days_since_publish": 98
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on hex",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "hex"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 98 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 98
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "8 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 8
}
}
],
"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": "moderate",
"name": "Engineering Quality",
"value": 56,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": 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": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"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": 38,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"packaging",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 38,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 15,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 3,
"scorecard_aggregate": 3.8
},
"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": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 2 contributing companies or organizations -- score normalized to 6",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is fuzzed",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 3
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "moderate",
"name": "AI Readiness",
"value": 58,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "good",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 83,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.707,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 4791
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "65 of 92 human commits state their intent (structured subject or explanatory body)",
"points": 37.7,
"status": "partial",
"details": [
{
"code": "legible_history",
"params": {
"legible": 65,
"sampled": 92
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "at_risk",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [
"mise.toml"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "mise.toml",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "mise.toml"
}
}
],
"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": null,
"points": 0,
"status": "missed",
"details": [],
"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 92",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 92
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"primary_language": "Gleam",
"largest_source_bytes": 5662,
"source_files_sampled": 2,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Gleam without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "Gleam"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/2 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 2,
"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": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-29T04:02:32.021304Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/czepluch/gleeth.svg",
"full_name": "czepluch/gleeth",
"license_state": "standard",
"license_spdx": "MIT"
}