IDchangelog@agntn/puzzles v0.23.0

Every release,
newest first.

New collections and puzzles, solves, fixes and breaking changes, read from CHANGELOG.md when the site builds. A feed reader gets the same list.

Releases
31
since v0.1.0
Latest
v0.23.0
2026-09-25
Entries
294
3 breaking

RSSpuzzles.agntn.dev/changelog.xml

LogCHANGELOG.md31 releases · 2025-12-30 → 2026-09-25

v0.23.0Latest1 breaking

19 enhancements · 3 fixes · 2 refactors · 1 chore · 1 tests

Enhancements

  • collectionsArchive quizchain blocks 2 to 5 (#265)
  • docsSortable rosters on UTable (#267)
  • errorsDid you mean b1000/135? (#268)
  • collectionsAdd ktimesg (#271)
  • collectionsIamabananaamaa GIF puzzle (#273)
  • docsLanding roster of collections (#274)
  • collectionsWickex YouTube puzzle (#275)
  • docsVerify console on the landing (#277)
  • collectionsAdd iamabananaamaa/caesar (#279)
  • cliServe mcp from src inside a checkout (#281)
  • docsRecord file on the console shell (#283)
  • collectionsAdd picture_puzzle (#284)
  • collectionsAdd quizchain/6 (#287)
  • collectionsAdd quizchain/7 (#289)
  • docsLanding registry as a manifest map (#290)
  • collectionsAdd quizchain/8 (#291)
  • docsCustom collection panel in two files (#293)
  • registryType built-in collection lookups (#295)
  • docsOne design system across the site (#296)

Fixes

  • toolsReject an empty collection filter (#280)
  • collectionsAoiNakamoto asked r/Bitcoin (#282)
  • partsMark keys rebuilt from a recipe (#294)

Refactors

  • datasetDrop @noble/hashes (#269)
  • verifyBreakingRename verifyPuzzle to verify (#288)

Chore

Tests

  • fixturesGive the refresh tests 30 s (#286)

v0.22.01 breaking

5 enhancements · 1 performance · 1 fixes · 2 documentation · 1 build

Enhancements

  • collectionsZden/level_5 claimed (#254)
  • docsPuzzle lists join the instruments (#255)
  • collectionsAdd quizchain/4 (#258)
  • collectionsAdd quizchain/5 (#260)
  • docsOne dossier per puzzle page (#262)

Performance

  • verifyBreakingLoad keys on the first verification (#259)

Fixes

  • collectionsZden/demobit_2018 has no capture (#253)

Documentation

  • Pin example results to the dataset (#256)
  • Counts come from the library (#261)

Build

  • Lint, test and pack through Vite+ (#252)

v0.21.3

9 enhancements · 1 fixes · 2 documentation

Enhancements

  • docsPlayground on the dossier instruments (#238)
  • cliPage a long list (#239)
  • collectionsAdd book_quiz (#241)
  • docsThe playground runs the author tools (#242)
  • collectionsArchive the satoshi_birthday_quiz thread (#243)
  • collectionsAdd quizchain (#246)
  • docsCollection pages open on a dossier (#247)
  • collectionsAdd quizchain/2 (#250)
  • collectionsAdd quizchain/3 (#251)

Fixes

  • toolsDust prints as 1e-8 (#244)

Documentation

  • The skill follows the hint contract (#245)
  • Skills ask the tools and ship with the package (#248)

v0.21.2

8 enhancements · 3 fixes · 1 documentation

Enhancements

  • collectionsCredit Level 4's winner (#224)
  • collectionsCodex key from Zden (#225)
  • toolsBrowse puzzles without repeats (#227)
  • datasetList the puzzles of one chain (#228)
  • datasetLook a puzzle up by its address (#230)
  • collectionsAdd mineshop (#231)
  • collectionsAdd satoshi_birthday_quiz (#236)
  • authorsSourced records, one page each (#237)

Fixes

  • balance18 decimals outrun a double (#229)
  • errorsA miss names what does exist (#232)
  • toolsOverlapping imports lose the dataset (#234)

Documentation

  • Preserve the cited source tweets (#226)

v0.21.1

4 enhancements · 4 fixes · 1 chore

Enhancements

  • collectionsTORCHED H34R7S painting (#215)
  • docsGive tool results a compact panel (#216)
  • collectionsWhite paper wallet key (#219)
  • collectionsMovie Enigma's original rules (#222)

Fixes

  • toolsSay what each list status means (#217)
  • toolsA missing id was loading keys (#218)
  • registryRetain loader registrations (#220)
  • verifyHex must not change a WIF verdict (#221)

Chore

v0.21.01 breaking

4 enhancements · 1 performance · 1 refactors

Enhancements

  • collectionsDug's student treasure hunt (#204)
  • collectionsGenesis wallet and its hints (#206)
  • docsRefresh landing fixtures (#211)
  • collectionsRushWallet's missing video hint (#214)

Performance

  • toolsSpeed up discovery and stats (#213)

Refactors

  • puzzleBreakingReserve solver for people (#203)

v0.20.3

3 enhancements · 3 fixes · 1 documentation

Enhancements

  • collectionsDecred Autonomy puzzle (#197)
  • collectionsJanus 33*bbb hint (#199)
  • collectionsLuckyLurker vaults and hints (#202)

Fixes

  • datasetKeep export hashes consistent (#195)
  • verifySkip unsupported address kinds (#196)
  • collections1bitcoin claim was 777 sats (#201)

Documentation

  • Pin prose counts to the registry (#200)

v0.20.2

6 enhancements · 3 fixes

Enhancements

  • docsCollection pages list their hints (#186)
  • collectionsZden/level_5 hints (#187)
  • cliAdd a hints command (#188)
  • collectionsZden hints the author published (#189)
  • collectionsZden solver images (#192)
  • collectionsAdd ledger_donjon (#193)

Fixes

  • datasetCollection rows count every status (#190)
  • toolsHints report the hint assets too (#191)
  • datasetHandle non-string puzzle ids (#194)

v0.20.1

3 enhancements · 9 fixes · 1 refactors · 2 chore · 1 ci

Enhancements

  • collectionsAdd movie_enigma (#178)
  • puzzleRecord hints and what confirms them (#183)
  • collectionsB1000 carries its author's hint (#185)

Fixes

  • toolsShow the whole record in puzzles_show (#162)
  • chainsCheck txids through @agntn/chains (#163)
  • cliPrint domain errors as one line (#164)
  • partsMake the Key builder immutable (#166)
  • puzzleFreeze the record a factory builds (#170)
  • datasetMemoized views refuse a rewrite (#173)
  • collectionResolve only canonical queries (#176)
  • cliKeep the verify crypto out of --help (#179)
  • toolsLink the hints and the solver asset (#180)

Refactors

  • verifyLet @agntn/keys derive addresses (#165)

Chore

CI

  • publishInstall the docs before pnpm test (#161)

v0.20.0

37 changed · 5 fixed · 8 added · 5 removed

Changed

  • Rename the package to @agntn/puzzles and the binary to puzzles.
  • Rewrite the package as an ESM TypeScript library built around classes.
  • Define puzzles as typed PuzzleSpec records built by a factory per chain and read through Puzzle methods. Collections hold the resulting instances.
  • Read puzzle fields through methods: puzzle.address() instead of puzzle.address, and the same for every other field.
  • Serialize without null placeholders. Absent data means no key at all, which also drops address.chain and the always-empty witness_program.
  • Build addresses, keys, transactions, assets, and parties with constructors from src/core/parts.ts, including a chained Key builder.
  • Split the data model: src/core/puzzle.ts holds the puzzle contract and chain bases, src/core/parts.ts holds the pieces.
  • Rename the Author and Solver types to one Party type.
  • Move lookup, balance, and verification behavior onto the abstract Collection contract.
  • Replace the Rust CLI and build pipeline with pnpm, strict TypeScript, Vitest, and obuild.
  • Rebuild the CLI on citty with one module per command and a new collections command.
  • Adopt the agntn project template: Node.js 24+ baseline, TypeScript 7, oxlint/oxfmt, obuild, changelogen, and the shared GitHub workflows.
  • Rename the base error class from BohaError to PuzzlesError.
  • Replace the collections array with a lazy manifest registry. builtins lists { key, load } entries, a collection module is imported on the first lookup for its key, and importing the package loads no records. collectionKeys() and hasCollection() stay synchronous. The views that need instances are asynchronous: collections(), getCollection(), requireCollection(), all(), get(), requirePuzzle(), selectPuzzles(), stats(), dataVersion() and dataset(). registerCollection() takes an instance or a { key, load } entry.
  • Publish every collection as its own entry, @agntn/puzzles/collections/<key>, with its class and canonical instance. The root entry no longer re-exports them.
  • Build one bundle for the library, CLI, MCP server, tools and collections. They share one registry, no entry embeds a second copy of anything, and typebox is inlined for a faster MCP start.
  • Enforce the argument limits the tool schemas declare inside the executors too. An unknown status, a fractional or out-of-range limit, or an too long identifier, collection key or API key throws InvalidArgumentError.
  • Build the Pi and MCP parameter schemas once from facts in packages/shared/puzzles-tool-schemas.ts. The OMP extension rebuilds them from the host TypeBox build, labels itself and renders sanitized call lines.
  • Load the shared tool executors in the extensions through literal import() specifiers, so OMP's compiled loader can see the dependencies, and type them from src/ instead of dist/.
  • Sanitize control characters out of MCP error text and quote the echoed name of an unknown tool.
  • Derive BalanceError from PuzzlesError, so one base class covers every failure the package raises.
  • Turn dataVersion into a lazily computed function instead of a generated constant.
  • Balance derives decimals from its chain, so the constructor takes the chain and the two amounts only.
  • Collection.verify() and verifyById() are asynchronous and load the verification crypto on first use, which keeps it out of CLI startup. verifyPuzzle() stays synchronous.
  • hasPrivateKey() and verification read one secretOf() resolver, so a seed record with only a derivation path or an xpub no longer counts as a known private key.
  • Drop the bits filler from the 38 records outside b1000. bits marks a search space width only, so keyRange() is undefined elsewhere and the validation gate checks every declared width.
  • Agent tool names, titles, descriptions, parameter constraints, and the status list live once in src/tool-operations.ts. The tools import the library directly instead of receiving it, and the Pi and OMP extensions load that one module before registering.
  • The validation gate decrypts BIP38 payloads with Node's native scrypt, pinned to the BIP-38 test vectors, instead of the bip38 package.
  • Fetch balances through @agntn/explorers from puzzle.balance(): Mempool for Bitcoin and Litecoin, Etherscan V2, Dcrdata and the Arweave gateway. Collections forward balance(query) to the puzzle. The providers load on the first lookup. BalanceOptions takes apiKey, baseUrl and timeout.
  • Read chain names, symbols, decimals, explorer bases and address format rules from @agntn/chains instead of local tables. Bitcoin links now point at blockstream.info and Litecoin links at litecoinspace.org. parseChain() accepts the @agntn/chains aliases.
  • Puzzle.key() and PuzzleSpec.key are typed Readonly<Key>: a record hands the builder to its factory and never mutates it.
  • Lint and format follow the shared @agntn/ox policy: exported functions carry typed JSDoc, object parameters are Readonly, and docs/ is checked like the rest of the repository.
  • pnpm test:packed packs the tarball and runs the library, the MCP server, both extensions and the CLI bin from the packed layout, in CI and before publish. pnpm test:live runs the provider roundtrips. Unit tests never reach them, because fetch is stubbed to fail there.
  • A Docus site under docs/, published at puzzles.agntn.dev. A guide, one page per collection with a facts strip read off the library, and one page per puzzle with its record, transactions, key material, assets and live balance. The landing walks fourteen records in the browser. The playground runs the real tool executors and the worker's balance route.
  • Print one discovery row from puzzles collections and puzzles_collections alike, key: N puzzles, N solved, N unsolved, by author, through formatCollection().
  • Round the per currency prize totals of stats() to eight decimal places, so the CLI, the tools and the docs print 1058.06884913 BTC instead of float carry.
  • Load the verification crypto in puzzles_verify on the first call, the way Collection.verifyById() does, so registering the tools in MCP, Pi or OMP costs no secp256k1.

Fixed

  • puzzles --help no longer loads the MCP SDK: the mcp command imports the server when it runs.
  • Refresh lazy dataset views, identifier lookups, statistics, and data versions when a collection is registered or replaced.
  • Resolve historical aliases without inheriting Object prototype properties.
  • Export the documented passphrase() key builder and don't count a WIF passphrase alone as a private key representation.
  • Declare sideEffects as the CLI entry only, which is correct once the registry seeds itself instead of relying on collection modules registering on import.

Added

  • Regression tests for all six puzzle factories, optional fields, and registry mutations.
  • MCP server (puzzles mcp) plus Pi and OMP extensions sharing one tool implementation.
  • Data validation gate as tests, covering identifiers, chain agreement, address formats, key derivation, BIP38 payloads, claimed public keys, and asset paths.
  • isValidAddress(chain, address) for chain-aware address format checks.
  • selectPuzzles({ collection, status, withPubkey }), the one puzzle selection the CLI and agent tools share.
  • collectionSummaries() and the puzzles_collections agent tool, which print the same rows as puzzles collections.
  • InvalidArgumentError for arguments that break the shared tool contract.
  • secretOf(keyData), the private key representation a key record exposes.

Removed

  • The generated data/generated.jsonc artifact, the src/generated/ module and the generator script. Use dataset() or puzzles export instead.
  • Per-collection subpath exports. Import collections from the package root.
  • Puzzle images from the published tarball, which drops it from 38 MB to under 3 MB. assetUrl() still resolves them from the repository.
  • The Rust sources, PKGBUILD, AUR and crates.io workflows, and the justfile.
  • The local balance adapters, fetchBalance(), fetchPuzzleBalance(), and the fetch and baseURL options. Stub globalThis.fetch in tests instead.

v0.19.0

2 features

Features

  • rushwalletAdd 30 RushWallet brainwallet contest puzzles (#152)
  • b1000Change 135 to solved (#159)

v0.18.1

1 features · 1 documentation · 2 miscellaneous tasks

Features

  • warpBackfill keys + passphrases + KDF salt + schema fixes (#153)

Documentation

  • Fix README and skill drift (#151)

Miscellaneous Tasks

  • cliRemove unused #[allow(dead_code)] annotations
  • releaseV0.18.1

v0.18.0

4 features · 6 bug fixes · 1 refactor · 1 miscellaneous tasks

Features

  • puzzleAdd currency field for non-native token prizes (#143)
  • balanceAdd Arweave balance fetching (#144)
  • arweaveAdd weave9 puzzle (100 DAI on Ethereum) (#145)
  • warpAdd WarpWallet challenge collection (#149)

Bug Fixes

  • cliReject unknown collections in list (#137)
  • searchHonor case-sensitive fields (#139)
  • searchMatch chain symbols (BTC, LTC, XMR, DCR) (#142)
  • balanceAdd Decred support (#140)
  • searchInclude currency field in search results (#146)
  • verifyPass BIP39 passphrase to seed derivation (#147)

Refactor

  • collectionCentralize dispatch registry (#141)

Miscellaneous Tasks

  • releaseV0.18.0

v0.17.0

6 features · 3 bug fixes · 1 documentation · 4 testing · 6 miscellaneous tasks

Features

  • Add Display and FromStr for Chain and Status (#122)
  • verifyImplement verify_puzzle with chain dispatch (#123)
  • Add Chain::address_explorer_url and Puzzle::explorer_url (#129)
  • hash_collisionAdd solved() iterator (#126)
  • balanceAdd Litecoin balance fetching (#127)
  • skillsAdd agent skills (#133)

Bug Fixes

  • cliSupport ballet in author command (#120)
  • Use PUZZLES.len() instead of hardcoded count() (#124)
  • Accept mixed-case hex in Chain::is_valid_txid (#125)

Documentation

  • Add vusi and kangaroo to related tools

Testing

  • I32 IntoPuzzleNum edge cases (#121)
  • Cover format_duration_human_readable edge cases
  • Cover Chain::is_valid_txid across all formats (#128)
  • Cover Chain methods (explorer URLs, symbol, name, ALL) (#130)

Miscellaneous Tasks

  • Remove community section from README.md
  • Add PR lint caller
  • Update README.md
  • Update AGENTS.md
  • Add clippy config (#135)
  • releaseV0.17.0

v0.16.0

1 features · 2 refactor · 1 miscellaneous tasks

Features

  • arweaveAdd Arweave collection (#111)

Refactor

  • chainMultichain prep (#109)
  • zdenNormalize names to snake_case (#114)

Miscellaneous Tasks

  • releaseV0.16.0

v0.15.0

6 features · 2 refactor · 1 documentation · 1 miscellaneous tasks

Features

  • cliAdd search command (#94)
  • buildEmbed data version at build time (#97)
  • cliAdd verify command (#98)
  • dataMigrate from TOML to JSONC (#101)
  • Add pubkey validation for claimed puzzles (#103)
  • cliAdd export command (#106)

Refactor

  • scriptsMigrate from TOML to JSONC (#104)
  • scriptsUnified typed address structs (#108)

Documentation

  • Standardize badges and add community section

Miscellaneous Tasks

  • releaseV0.15.0

v0.14.0

2 features · 2 other · 1 refactor · 1 documentation · 1 miscellaneous tasks

Features

  • zdenAdd private key for Level 1 puzzle (#81)
  • buildWIF validation at build time (#93)

Other

  • zdenAdd private key for Level 2 puzzle (#85)
  • zdenAdd Level 3 private key (#87)

Refactor

  • pubkeyRename key to value and use inline TOML tables (#83)

Documentation

  • Update AGENTS.md metadata to current commit

Miscellaneous Tasks

  • releaseV0.14.0

v0.13.0

3 features · 1 documentation · 1 miscellaneous tasks

Features

  • collectionAdd Ballet challenge (#76)
  • dataAdd WIF format to solved puzzles (#79)
  • releaseUpdate README.md version during release

Documentation

  • Sync AGENTS.md with Ballet collection addition

Miscellaneous Tasks

  • releaseV0.13.0

v0.12.1

1 bug fixes · 1 miscellaneous tasks

Bug Fixes

  • packageExclude assets from crates.io package

Miscellaneous Tasks

  • releaseV0.12.1

v0.12.0

2 features · 1 documentation · 1 miscellaneous tasks

Features

  • solversAdd retired_coder (#71)
  • assetsAdd puzzle assets support (#74)

Documentation

  • Add Related Tools section with vuke and vgen

Miscellaneous Tasks

  • releaseV0.12.0

v0.11.0

9 features · 1 refactor · 3 documentation · 2 miscellaneous tasks

Features

  • addressAdd Address struct (#60)
  • puzzleAdd Key struct (#61)
  • cliAdd human-panic for friendly crash reports (#62)
  • balanceAdd Ethereum API support (#63)
  • scriptsAdd Decred API support (#64)
  • addressAdd SegWit support (#67)
  • addressAdd Taproot (P2TR) address type support (#68)
  • bitapsAdd mnemonic challenge (#69)
  • collectionsAdd bitimage puzzle collection (#70)

Refactor

  • solverExtract solvers to dedicated TOML file (#72) (#73)

Documentation

  • Sync AGENTS.md with zden collection
  • Update outdated code references
  • Sync AGENTS.md with recent changes

Miscellaneous Tasks

  • Add context7.json
  • releaseV0.11.0

v0.10.0

2 features · 1 miscellaneous tasks

Features

  • zdenAdd visual crypto puzzles (#57)
  • dataAdd timestamps to dates (#59)

Miscellaneous Tasks

  • releaseV0.10.0

v0.9.0

2 features · 3 testing · 1 miscellaneous tasks

Features

  • puzzleAdd claim_txid accessors and explorer URLs (#43)
  • puzzleAdd solver information for solved puzzles (#51)

Testing

  • Add pubkey to h160 validation (#41)
  • balanceAdd coverage for balance feature (#42)
  • Add private-key-to-address derivation verification (#45)

Miscellaneous Tasks

  • releaseV0.9.0

v0.8.0

1 features · 1 miscellaneous tasks

Features

  • puzzleAdd transaction history (#34)

Miscellaneous Tasks

  • releaseV0.8.0

v0.7.0

2 features · 1 documentation · 3 miscellaneous tasks

Features

  • puzzleAdd KeySource enum for key derivation semantics (#33)
  • authorAdd Author struct for collections (#36)

Documentation

  • Update AGENTS.md with code map and testing info

Miscellaneous Tasks

  • Add deepwiki badge
  • Ad deepwiki badge
  • releaseV0.7.0

v0.6.0

2 features · 1 miscellaneous tasks

Features

  • puzzleGeneralize key_range (#30)
  • puzzleAdd solve_time field (#32)

Miscellaneous Tasks

  • releaseV0.6.0

v0.5.0

3 features · 1 refactor · 1 documentation · 1 miscellaneous tasks

Features

  • puzzleAdd h160 field for P2PKH addresses (#17)
  • puzzleAdd script_hash for P2SH (#22)
  • ciIntegrate autofix.ci for automatic formatting (#23)

Refactor

  • dataRename btc field to prize in TOML files (#25)

Documentation

  • Add gsmg collection to AGENTS.md

Miscellaneous Tasks

  • releaseV0.5.0

v0.4.0

2 features · 1 miscellaneous tasks

Features

  • puzzleAdd Chain enum (#15)
  • puzzleAdd pubkey_format field (#16)

Miscellaneous Tasks

  • releaseV0.4.0

v0.3.0

1 features · 1 miscellaneous tasks

Features

  • collectionsAdd GSMG puzzle collection (#10)

Miscellaneous Tasks

  • releaseV0.3.0

v0.2.0

2 features · 1 miscellaneous tasks

Features

  • puzzleAdd start_date field (#7)
  • puzzleAdd source_url field (#8)

Miscellaneous Tasks

  • releaseV0.2.0

v0.1.0

1 bug fixes · 2 other · 1 refactor · 6 documentation · 1 styling · 2 miscellaneous tasks

Bug Fixes

  • Limit version sed to package section only

Other

  • Crypto bounties, puzzles and challenges data library
  • Update balances from mempool.space API

Refactor

  • Move hash_collision data to TOML source of truth

Documentation

  • Reorder README sections - CLI before Library
  • Add boha list without args to README
  • Add detailed puzzle list to Collections section
  • Fix b1000 puzzle status breakdown
  • Add CONTRIBUTING.md
  • Add AGENTS.md project knowledge base

Styling

  • Fix formatting in cli.rs

Miscellaneous Tasks

  • Track Cargo.lock for reproducible builds
  • releaseV0.1.0