Skip to content

feat(warp): add WarpWallet challenge collection#149

Merged
oritwoen merged 2 commits into
mainfrom
feat/warp-collection
Mar 30, 2026
Merged

feat(warp): add WarpWallet challenge collection#149
oritwoen merged 2 commits into
mainfrom
feat/warp-collection

Conversation

@oritwoen
Copy link
Copy Markdown
Owner

Keybase published 6 WarpWallet challenges in November 2013 to stress-test scrypt+pbkdf2 brainwallet security. The four small ones (0.1-1 BTC) fell within hours, two 20 BTC main challenges expired without a crack and Keybase reclaimed the funds.

  • New warp collection: 6 puzzles with full blockchain data (txids, dates, pubkeys extracted from claim transactions, hash160)
  • New Status::Expired variant for puzzles never solved whose funds were reclaimed after a deadline
  • Expired wired through puzzle.rs, build.rs, cli.rs, lib.rs, validation tests
  • Build-time validate_pubkey_for_claimed_puzzles enforced for the new collection

Closes #148

@oritwoen oritwoen added this to the v0.18.0 milestone Mar 30, 2026
@oritwoen oritwoen added the enhancement New feature or request label Mar 30, 2026
@oritwoen oritwoen self-assigned this Mar 30, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 30, 2026

📝 Walkthrough

Walkthrough

Adds a new WarpWallet puzzle collection (six Keybase brainwallet challenges: four solved, two expired), introduces Status::Expired, wire it into codegen, library registry, CLI, and tests; data comes from data/warp.jsonc and is compiled into warp_data.rs.

Changes

Cohort / File(s) Summary
Status Enum & Parsing
src/puzzle.rs, AGENTS.md
Added Status::Expired; Display and FromStr map "expired"Status::Expired.
Build System & Data Generation
build.rs, data/warp.jsonc
New generate_warp() reads data/warp.jsonc, strips comments, deserializes WithSchema<WarpFile>, validates pubkeys for claimed puzzles, maps "expired" status, formats puzzle fields, and emits warp_data.rs. Added data/warp.jsonc (6 warp puzzles). Added cargo:rerun-if-changed and included warp.jsonc in data hashing; extended other generators to accept "expired".
Collection Module
src/collections/mod.rs, src/collections/warp.rs
Added pub mod warp; and new warp.rs exporting author(), get(), slice(), all(), solved(), unsolved(), count() following existing collection patterns.
Library Registry
src/lib.rs
Added Collection::Warp and updated Collection::ALL (8→9). Updated parse, name, slice, author, get dispatch for warp/warpwallet. Added Stats.expired and counting logic for Status::Expired.
CLI Output Rendering
src/cli.rs
Added handling for Status::Expired in table rows, detailed view, search/CSV output, and stats export. Updated collection_help to list "warp (warpwallet)".
Tests / Validation
tests/validation.rs
Treated Status::Expired as a terminal state (no solve_time, no solver), updated related assertions, and added expired_puzzles_have_claim_transaction requiring an associated claim transaction.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Possibly related PRs

Suggested reviewers

  • cubic-dev-ai

"Six puzzles set upon a warped byte,
Four were cracked, two lost to night.
Codegen hums and tests assert,
Expired flags close the alert.
Warp joins the roster — ledger tight."

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 22.22% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed Title accurately reflects the main change: adding a new WarpWallet puzzle collection as a feature.
Description check ✅ Passed Description covers the context (Keybase WarpWallet tests), main deliverables (warp collection, Expired status), and issue linkage.
Linked Issues check ✅ Passed PR fulfills all objectives from #148: adds warp collection with blockchain data, introduces Status::Expired variant, wires it through core paths, and includes validation.
Out of Scope Changes check ✅ Passed All changes directly support the warp collection addition and Expired status. Documentation, data, code generation, and validation extensions all stay within scope.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/warp-collection
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch feat/warp-collection

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 9 files

Confidence score: 5/5

  • Minor documentation inconsistency in AGENTS.md: overview says 9 collections but structure still says 8 and lists old data files, which could mislead onboarding but doesn’t affect runtime behavior.
  • Score reflects a low-severity, low-impact doc issue; this PR otherwise looks safe to merge.
  • Pay close attention to AGENTS.md - align the overview and structure sections to avoid confusion.
Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="AGENTS.md">

<violation number="1" location="AGENTS.md:8">
P3: This update makes `AGENTS.md` internally inconsistent - overview says 9 collections, but the structure section still says 8 and still lists only the old data files. That will mislead anyone using this file as onboarding/source-of-truth.</violation>
</file>
Architecture diagram
sequenceDiagram
    participant Dev as "Developer / Cargo"
    participant Build as "build.rs (Codegen)"
    participant Data as "data/warp.jsonc"
    participant Out as "OUT_DIR/warp_data.rs"
    participant Lib as "lib.rs / puzzle.rs"
    participant CLI as "cli.rs"
    participant Tests as "validation.rs"

    Note over Dev, Out: Build-Time Execution (Codegen)

    Dev->>Build: cargo build
    Build->>Data: Read collection data
    Data-->Build: JSONC content

    rect rgb(240,240,240)
        Note right of Build: NEW: WarpWallet Validation
        Build->>Build: validate_pubkey_for_claimed_puzzles()
    end

    Build->>Build: Map "expired" string to Status::Expired
    Build->>Out: NEW: Write generated Rust static PUZZLES

    Note over Dev, Tests: Runtime Execution (Library & CLI)

    Lib->>Out: CHANGED: include!() generated data
    
    Dev->>CLI: boha stats
    CLI->>Lib: stats()
    Lib->>Lib: Iterate collections (NEW: Warp)
    Lib->>Lib: CHANGED: Count Status::Expired variants
    Lib-->CLI: Return Stats struct
    CLI->>CLI: NEW: Format "expired" status (dimmed)
    CLI-->Dev: Print table/CSV

    Note over Dev, Tests: Test-Time Execution

    Dev->>Tests: cargo test
    Tests->>Lib: all()
    Lib-->Tests: Iterator<&Puzzle>
    
    loop Every Puzzle
        alt NEW: Status is Expired
            Tests->>Tests: verify has_claim_transaction()
            Tests->>Tests: verify solve_time.is_none()
        end
    end
    Tests-->Dev: Test Results
Loading

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread AGENTS.md
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
src/puzzle.rs (1)

603-609: 🧹 Nitpick | 🔵 Trivial

Test doesn't cover Status::Expired.is_active()

The test verifies is_active() for 4 of 5 status variants but misses Expired. Currently Expired.is_active() returns false (correct behavior), but adding the assertion makes the test exhaustive.

Suggested addition
     #[test]
     fn test_status_is_active() {
         assert!(Status::Unsolved.is_active());
         assert!(!Status::Solved.is_active());
         assert!(!Status::Claimed.is_active());
         assert!(!Status::Swept.is_active());
+        assert!(!Status::Expired.is_active());
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/puzzle.rs` around lines 603 - 609, Add an assertion for the missing
Status::Expired case in the existing test_status_is_active test so the suite
checks all variants; update the test Status::Expired.is_active() to assert false
(i.e., add assert!(!Status::Expired.is_active());) to make the test exhaustive
for the Status::is_active method.
src/cli.rs (2)

274-296: ⚠️ Potential issue | 🟡 Minor

StatsCsvRow missing expired field — CSV output loses data

Stats.expired is populated in stats() and cmd_export(), but StatsCsvRow doesn't include it. Running boha stats -o csv silently drops the expired count.

Fix
 struct StatsCsvRow {
     total: usize,
     solved: usize,
     unsolved: usize,
     claimed: usize,
     swept: usize,
+    expired: usize,
     with_pubkey: usize,

And in from_stats():

         Self {
             total: stats.total,
             solved: stats.solved,
             unsolved: stats.unsolved,
             claimed: stats.claimed,
             swept: stats.swept,
+            expired: stats.expired,
             with_pubkey: stats.with_pubkey,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/cli.rs` around lines 274 - 296, StatsCsvRow is missing the expired field
so CSV exports drop Stats.expired; add an expired: usize field to the
StatsCsvRow struct and update the conversion in from_stats() (the mapping used
by cmd_export()/stats()) to populate that field from Stats.expired; ensure the
struct remains #[derive(Serialize)] so the new column is emitted in CSV output.

757-783: ⚠️ Potential issue | 🟡 Minor

print_stats_table doesn't display expired count

The table shows total/solved/unsolved/claimed/swept but skips expired. Inconsistent with Stats struct which now tracks it.

Fix — add after swept row
         KeyValueRow {
             field: "Swept".to_string(),
             value: stats.swept.to_string().red().to_string(),
         },
+        KeyValueRow {
+            field: "Expired".to_string(),
+            value: stats.expired.to_string().dimmed().to_string(),
+        },
         KeyValueRow {
             field: "With public key".to_string(),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/cli.rs` around lines 757 - 783, Add a new KeyValueRow for the expired
count in the print_stats_table function: after the "Swept" row insert a
KeyValueRow with field "Expired" and value stats.expired.to_string() (format it
consistently with other rows, e.g., .magenta().to_string() or whichever color
fits the table styling) so the Stats.expired field is displayed.
build.rs (2)

1275-1280: ⚠️ Potential issue | 🟠 Major

Unknown status strings still compile as Status::Unsolved.

A typo like "expried" or "clamed" in any data file will build and quietly skew stats and CLI output instead of failing fast. Match "unsolved" explicitly and panic on anything else.

Suggested direction
+fn generate_status_code(status: &str, puzzle_id: &str) -> &'static str {
+    match status {
+        "solved" => "Status::Solved",
+        "claimed" => "Status::Claimed",
+        "swept" => "Status::Swept",
+        "expired" => "Status::Expired",
+        "unsolved" => "Status::Unsolved",
+        other => panic!("Unknown status '{}' for puzzle {}", other, puzzle_id),
+    }
+}

Also applies to: 1399-1404, 1664-1669, 1918-1923, 2062-2067, 2201-2206, 2346-2352

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@build.rs` around lines 1275 - 1280, The match on puzzle.status.as_str()
currently treats any unknown string as "Status::Unsolved"; change it to
explicitly match "unsolved" and make the wildcard arm panic (or return an Err)
with a clear message including the unexpected string so typos like "expried" or
"clamed" fail fast; apply the same change to the other equivalent match sites
that produce Status::Unsolved (the other match blocks producing
Status::Solved/Claimed/Swept/Expired/Unsolved) so all status parsing validates
inputs strictly and surfaces invalid values immediately.

1202-1211: ⚠️ Potential issue | 🟡 Minor

Add missing schema files to cargo:rerun-if-changed directives.

Schema files in data/schemas/ are referenced via $schema fields in the JSONC files but aren't watched for changes. Add cargo:rerun-if-changed=data/schemas/collection.schema.json, data/schemas/definitions.schema.json, and data/schemas/solvers.schema.json to the rebuild triggers.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@build.rs` around lines 1202 - 1211, The build script currently emits
cargo:rerun-if-changed for the JSONC data files but omits the JSON schema files;
update build.rs to add println! calls for the three schema files so Cargo will
rerun the build when they change (use the same cargo:rerun-if-changed format):
add println!("cargo:rerun-if-changed=data/schemas/collection.schema.json"),
println!("cargo:rerun-if-changed=data/schemas/definitions.schema.json"), and
println!("cargo:rerun-if-changed=data/schemas/solvers.schema.json") near the
existing println! lines that list data/*.jsonc to ensure the build script picks
up schema changes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@build.rs`:
- Around line 2321-2326: The build currently reads and strips data/warp.jsonc
into content and directly deserializes into WithSchema<WarpFile>, ignoring the
included $schema; change the flow to parse the JSON into a generic
WithSchema<serde_json::Value> (or extract the $schema field from wrapped),
load/compile that schema (e.g., using a JSON Schema validator), validate the
JSON instance against the compiled schema, and only after successful validation
deserialize the validated JSON into WarpFile (so update the usage of content ->
wrapped -> data and replace the direct serde_json::from_str(&content) ->
WithSchema<WarpFile> path with schema validation then deserialization).

In `@data/warp.jsonc`:
- Around line 140-167: The manifest entry for warp_challenge_1 (and similarly
warp_challenge_2) shows "prize": 20.0 while the transactions array only contains
a single funding of 10.0; update the data to make prize and funding consistent:
either change the "prize" field to 10.0 for "warp_challenge_1" (and
"warp_challenge_2") to reflect the recorded funding, or add the missing second
funding transaction object to the "transactions" array (include correct "type":
"funding", "txid", "date", and "amount": 10.0) so that the summed funding equals
the 20.0 prize. Ensure you update the "prize" or add the transaction in the same
object that contains "name": "warp_challenge_1" (and repeat for
warp_challenge_2) so the fields remain consistent.

---

Outside diff comments:
In `@build.rs`:
- Around line 1275-1280: The match on puzzle.status.as_str() currently treats
any unknown string as "Status::Unsolved"; change it to explicitly match
"unsolved" and make the wildcard arm panic (or return an Err) with a clear
message including the unexpected string so typos like "expried" or "clamed" fail
fast; apply the same change to the other equivalent match sites that produce
Status::Unsolved (the other match blocks producing
Status::Solved/Claimed/Swept/Expired/Unsolved) so all status parsing validates
inputs strictly and surfaces invalid values immediately.
- Around line 1202-1211: The build script currently emits cargo:rerun-if-changed
for the JSONC data files but omits the JSON schema files; update build.rs to add
println! calls for the three schema files so Cargo will rerun the build when
they change (use the same cargo:rerun-if-changed format): add
println!("cargo:rerun-if-changed=data/schemas/collection.schema.json"),
println!("cargo:rerun-if-changed=data/schemas/definitions.schema.json"), and
println!("cargo:rerun-if-changed=data/schemas/solvers.schema.json") near the
existing println! lines that list data/*.jsonc to ensure the build script picks
up schema changes.

In `@src/cli.rs`:
- Around line 274-296: StatsCsvRow is missing the expired field so CSV exports
drop Stats.expired; add an expired: usize field to the StatsCsvRow struct and
update the conversion in from_stats() (the mapping used by cmd_export()/stats())
to populate that field from Stats.expired; ensure the struct remains
#[derive(Serialize)] so the new column is emitted in CSV output.
- Around line 757-783: Add a new KeyValueRow for the expired count in the
print_stats_table function: after the "Swept" row insert a KeyValueRow with
field "Expired" and value stats.expired.to_string() (format it consistently with
other rows, e.g., .magenta().to_string() or whichever color fits the table
styling) so the Stats.expired field is displayed.

In `@src/puzzle.rs`:
- Around line 603-609: Add an assertion for the missing Status::Expired case in
the existing test_status_is_active test so the suite checks all variants; update
the test Status::Expired.is_active() to assert false (i.e., add
assert!(!Status::Expired.is_active());) to make the test exhaustive for the
Status::is_active method.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4b111d5f-1611-41ac-85b2-26ab78139ee4

📥 Commits

Reviewing files that changed from the base of the PR and between 68290d1 and 913ced2.

📒 Files selected for processing (9)
  • AGENTS.md
  • build.rs
  • data/warp.jsonc
  • src/cli.rs
  • src/collections/mod.rs
  • src/collections/warp.rs
  • src/lib.rs
  • src/puzzle.rs
  • tests/validation.rs
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: cubic · AI code reviewer
🧰 Additional context used
📓 Path-based instructions (8)
src/collections/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

Generate static &[Puzzle] arrays via build.rs using include!() into src/collections/*.rs files

Files:

  • src/collections/mod.rs
  • src/collections/warp.rs
src/cli.rs

📄 CodeRabbit inference engine (AGENTS.md)

src/cli.rs: Implement CLI binary in src/cli.rs using clap derive macros, not src/main.rs, and gate behind --features cli
In src/cli.rs, use clap for argument parsing, tabled for table output, owo-colors for colored output, and human-panic for panic messages

Files:

  • src/cli.rs
AGENTS.md

📄 CodeRabbit inference engine (CLAUDE.md)

AGENTS.md: Document agent responsibilities and capabilities in AGENTS.md
Maintain clear agent interface definitions and behavioral specifications

Files:

  • AGENTS.md
src/puzzle.rs

📄 CodeRabbit inference engine (AGENTS.md)

src/puzzle.rs: Use &'static str for all string data in Puzzle structs, never heap-allocated Strings
Define Puzzle struct with exactly 16 fields covering id, title, description, difficulty, status, author, solver, status_date, reward, addresses, keys, seeds, shares, profiles, and metadata
Use Option<T> for all optional fields in puzzle data structures (Address, Key, Seed, Shares, Profile, Author, Solver)
For Bitcoin/crypto addresses, include kind field with values: P2PKH (legacy), P2SH (script), P2WPKH/P2WSH (SegWit), P2TR (Taproot)
Define Chain enum including Bitcoin, Ethereum, Litecoin, Monero, Decred, and Arweave
Track both Solver (who revealed/found the key) and Claimer (who swept funds) separately in Puzzle struct, as these may be different people

Files:

  • src/puzzle.rs
tests/validation.rs

📄 CodeRabbit inference engine (AGENTS.md)

In data validation tests (tests/validation.rs), verify cryptographic consistency (h160, script_hash), range validation, and format checks

Files:

  • tests/validation.rs
data/**/*.jsonc

📄 CodeRabbit inference engine (AGENTS.md)

data/**/*.jsonc: Store puzzle data in data/*.jsonc files, not hardcoded in Rust source code
Use JSONC format (JSON with Comments) for all puzzle collection data files
Use puzzle ID format collection/identifier (e.g., b1000/66, bitimage/kitten), with exceptions for gsmg and bitaps (no slash)

Files:

  • data/warp.jsonc
src/lib.rs

📄 CodeRabbit inference engine (AGENTS.md)

Implement lib.rs public API with three core functions: get(id) for puzzle lookup, all() for iterating puzzles, and stats() for aggregate statistics

Files:

  • src/lib.rs
build.rs

📄 CodeRabbit inference engine (AGENTS.md)

build.rs: Include cargo:rerun-if-changed directives in build.rs for all JSONC and schema files to trigger rebuilds on data changes
Validate JSON Schema during build.rs codegen before generating Rust code
In build.rs, validate that cryptographic key bits match hex representations and WIF↔hex consistency

Files:

  • build.rs
🧠 Learnings (42)
📓 Common learnings
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/ballet.jsonc : For ballet collection puzzles, document that they are physical crypto wallet cards with BIP38 encrypted keys from Bobby Lee's challenge
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to tests/author_lineage.rs : In tests/author_lineage.rs, verify funding source tracking and author metadata consistency across all puzzles
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/hash_collision.jsonc : For hash_collision puzzles, track that these are Peter Todd's P2SH bounties for finding pre-image hash collisions
Learnt from: oritwoen
Repo: oritwoen/boha PR: 122
File: src/puzzle.rs:104-117
Timestamp: 2026-03-15T19:09:49.536Z
Learning: Applies to {src/puzzle.rs,src/balance.rs}: The `Chain` enum in `src/puzzle.rs` supports: Bitcoin, Ethereum, Litecoin, Monero, Decred, and Arweave (added in PR `#111`) — any new chains must be added to both the enum and `src/balance.rs` API integration. Arweave balance fetching is not yet implemented in `src/balance.rs` (tracked in issue `#123`).
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Define Puzzle struct with exactly 16 fields covering id, title, description, difficulty, status, author, solver, status_date, reward, addresses, keys, seeds, shares, profiles, and metadata
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/**/*.jsonc : Use puzzle ID format `collection/identifier` (e.g., b1000/66, bitimage/kitten), with exceptions for gsmg and bitaps (no slash)
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/b1000.jsonc : For b1000 puzzles 1-2, set pre_genesis=true as these were claimed before puzzle creation on 2015-01-15
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Track both Solver (who revealed/found the key) and Claimer (who swept funds) separately in Puzzle struct, as these may be different people
Learnt from: oritwoen
Repo: oritwoen/boha PR: 111
File: data/arweave.jsonc:21-21
Timestamp: 2026-02-21T06:17:19.520Z
Learning: In JSONC puzzle data files (data/*.jsonc), the "name" field stores only the puzzle identifier (e.g., "weave1", "kitten", "Level 1"), not the full "collection/identifier" format. The full ID (e.g., "arweave/weave1", "bitimage/kitten") is constructed at build time or runtime by the Rust code in build.rs and collection modules.
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : For Bitcoin/crypto addresses, include kind field with values: P2PKH (legacy), P2SH (script), P2WPKH/P2WSH (SegWit), P2TR (Taproot)
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/collections/*.rs : Generate static `&[Puzzle]` arrays via build.rs using `include!()` into src/collections/*.rs files
📚 Learning: 2026-01-24T12:03:02.921Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/AGENTS.md:0-0
Timestamp: 2026-01-24T12:03:02.921Z
Learning: Applies to scripts/src/**/*.rs : Include console log progress output for per-puzzle status during data computation and fetching operations

Applied to files:

  • src/cli.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/cli.rs : In src/cli.rs, use clap for argument parsing, tabled for table output, owo-colors for colored output, and human-panic for panic messages

Applied to files:

  • src/cli.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/lib.rs : Implement lib.rs public API with three core functions: get(id) for puzzle lookup, all() for iterating puzzles, and stats() for aggregate statistics

Applied to files:

  • src/cli.rs
  • AGENTS.md
  • src/puzzle.rs
  • tests/validation.rs
  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/collections/*.rs : Generate static `&[Puzzle]` arrays via build.rs using `include!()` into src/collections/*.rs files

Applied to files:

  • src/cli.rs
  • AGENTS.md
  • tests/validation.rs
  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Define Puzzle struct with exactly 16 fields covering id, title, description, difficulty, status, author, solver, status_date, reward, addresses, keys, seeds, shares, profiles, and metadata

Applied to files:

  • src/cli.rs
  • AGENTS.md
  • src/puzzle.rs
  • tests/validation.rs
  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to tests/author_lineage.rs : In tests/author_lineage.rs, verify funding source tracking and author metadata consistency across all puzzles

Applied to files:

  • src/cli.rs
  • AGENTS.md
  • tests/validation.rs
  • src/collections/warp.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Track both Solver (who revealed/found the key) and Claimer (who swept funds) separately in Puzzle struct, as these may be different people

Applied to files:

  • src/cli.rs
  • AGENTS.md
  • src/puzzle.rs
  • tests/validation.rs
  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Use `Option<T>` for all optional fields in puzzle data structures (Address, Key, Seed, Shares, Profile, Author, Solver)

Applied to files:

  • src/cli.rs
  • AGENTS.md
  • src/puzzle.rs
  • tests/validation.rs
  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : For Bitcoin/crypto addresses, include kind field with values: P2PKH (legacy), P2SH (script), P2WPKH/P2WSH (SegWit), P2TR (Taproot)

Applied to files:

  • src/cli.rs
  • AGENTS.md
  • src/collections/warp.rs
  • src/lib.rs
📚 Learning: 2026-03-15T22:40:07.198Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T22:40:07.198Z
Learning: Applies to AGENTS.md : Maintain clear agent interface definitions and behavioral specifications

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:07.198Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T22:40:07.198Z
Learning: Applies to AGENTS.md : Document agent responsibilities and capabilities in AGENTS.md

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:10.290Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/CLAUDE.md:0-0
Timestamp: 2026-03-15T22:40:10.290Z
Learning: Applies to scripts/**/AGENTS.md : Maintain an up-to-date AGENTS.md file as the single source of truth for agent documentation

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: For scripts/ directory changes, refer to scripts/AGENTS.md for the separate Cargo project structure and development guidelines

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:10.290Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/CLAUDE.md:0-0
Timestamp: 2026-03-15T22:40:10.290Z
Learning: Applies to scripts/**/AGENTS.md : Agent implementations should be documented in AGENTS.md with clear descriptions of their purpose, capabilities, and usage

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/ballet.jsonc : For ballet collection puzzles, document that they are physical crypto wallet cards with BIP38 encrypted keys from Bobby Lee's challenge

Applied to files:

  • AGENTS.md
  • data/warp.jsonc
📚 Learning: 2026-03-15T19:09:49.536Z
Learnt from: oritwoen
Repo: oritwoen/boha PR: 122
File: src/puzzle.rs:104-117
Timestamp: 2026-03-15T19:09:49.536Z
Learning: Applies to {src/puzzle.rs,src/balance.rs}: The `Chain` enum in `src/puzzle.rs` supports: Bitcoin, Ethereum, Litecoin, Monero, Decred, and Arweave (added in PR `#111`) — any new chains must be added to both the enum and `src/balance.rs` API integration. Arweave balance fetching is not yet implemented in `src/balance.rs` (tracked in issue `#123`).

Applied to files:

  • AGENTS.md
  • src/collections/warp.rs
  • src/lib.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/hash_collision.jsonc : For hash_collision puzzles, track that these are Peter Todd's P2SH bounties for finding pre-image hash collisions

Applied to files:

  • AGENTS.md
  • data/warp.jsonc
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Define Chain enum including Bitcoin, Ethereum, Litecoin, Monero, Decred, and Arweave

Applied to files:

  • AGENTS.md
  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-02-21T06:17:19.520Z
Learnt from: oritwoen
Repo: oritwoen/boha PR: 111
File: data/arweave.jsonc:21-21
Timestamp: 2026-02-21T06:17:19.520Z
Learning: In JSONC puzzle data files (data/*.jsonc), the "name" field stores only the puzzle identifier (e.g., "weave1", "kitten", "Level 1"), not the full "collection/identifier" format. The full ID (e.g., "arweave/weave1", "bitimage/kitten") is constructed at build time or runtime by the Rust code in build.rs and collection modules.

Applied to files:

  • AGENTS.md
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/**/*.jsonc : Store puzzle data in `data/*.jsonc` files, not hardcoded in Rust source code

Applied to files:

  • AGENTS.md
  • data/warp.jsonc
  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: All puzzle data must be compiled to static `&'static` references with no heap allocation at runtime

Applied to files:

  • AGENTS.md
  • tests/validation.rs
  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Use `&'static str` for all string data in Puzzle structs, never heap-allocated Strings

Applied to files:

  • AGENTS.md
  • src/puzzle.rs
  • tests/validation.rs
  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/bitaps.jsonc : For bitaps puzzles, implement Shamir Secret Sharing support with threshold, total, and shares[] fields in Shares struct

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/bitimage.jsonc : For bitimage puzzles, derive keys using SHA256(Base64(file)) as BIP39 entropy, documenting file hash and path in seed metadata

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/arweave.jsonc : For arweave collection, track that these are Tiamat's bounties on the Arweave blockchain (chronobot.io) with Arweave address and transaction IDs

Applied to files:

  • AGENTS.md
  • data/warp.jsonc
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/balance.rs : In src/balance.rs, implement multi-chain async balance fetching for BTC/LTC/ETH using mempool.space and Etherscan APIs

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T19:09:44.077Z
Learnt from: oritwoen
Repo: oritwoen/boha PR: 122
File: src/puzzle.rs:104-117
Timestamp: 2026-03-15T19:09:44.077Z
Learning: In src/puzzle.rs and src/balance.rs, the Chain enum must include the following variants: Bitcoin, Ethereum, Litecoin, Monero, Decred, and Arweave (Arweave added in PR `#111`). Any new chains discovered must be added to both the enum in puzzle.rs and the API integration in balance.rs. Note that Arweave balance fetching is not yet implemented in balance.rs (tracking issue `#123`). This guideline ensures parity between the chain enumeration and the API integration surface, and avoids inconsistencies when new chains are introduced.

Applied to files:

  • src/puzzle.rs
📚 Learning: 2026-02-21T06:17:12.647Z
Learnt from: oritwoen
Repo: oritwoen/boha PR: 111
File: data/arweave.jsonc:21-21
Timestamp: 2026-02-21T06:17:12.647Z
Learning: In data/*.jsonc puzzle data files, enforce that the 'name' field contains only the puzzle identifier (e.g., 'weave1', 'kitten', 'Level 1'), not the full 'collection/identifier' format. The full ID (e.g., 'arweave/weave1', 'bitimage/kitten') should be constructed at build time or runtime by the Rust code in build.rs and related collection modules. During code reviews, verify that 'name' does not contain the collection prefix and that the build/runtime logic assembles the complete ID consistently from these identifiers.

Applied to files:

  • data/warp.jsonc
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/**/*.jsonc : Use puzzle ID format `collection/identifier` (e.g., b1000/66, bitimage/kitten), with exceptions for gsmg and bitaps (no slash)

Applied to files:

  • data/warp.jsonc
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/**/*.jsonc : Use JSONC format (JSON with Comments) for all puzzle collection data files

Applied to files:

  • data/warp.jsonc
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/b1000.jsonc : For b1000 puzzles 1-2, set pre_genesis=true as these were claimed before puzzle creation on 2015-01-15

Applied to files:

  • data/warp.jsonc
📚 Learning: 2026-01-24T12:03:02.921Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/AGENTS.md:0-0
Timestamp: 2026-01-24T12:03:02.921Z
Learning: Run data maintenance scripts after adding new puzzles to populate computed fields in JSONC data files

Applied to files:

  • data/warp.jsonc
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/solvers.jsonc : In data/solvers.jsonc, define solver identities once with name, addresses[], and profiles[], then reference by ID in puzzle files

Applied to files:

  • data/warp.jsonc
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/zden.jsonc : For zden puzzles, document that keys are encoded in visual puzzles (images/animations) and track image/animation metadata

Applied to files:

  • data/warp.jsonc
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Do not add runtime configuration - all puzzle data must be embedded at compile time via build.rs codegen

Applied to files:

  • src/collections/warp.rs
  • src/lib.rs
  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to build.rs : Include `cargo:rerun-if-changed` directives in build.rs for all JSONC and schema files to trigger rebuilds on data changes

Applied to files:

  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to build.rs : Validate JSON Schema during build.rs codegen before generating Rust code

Applied to files:

  • build.rs
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to build.rs : In build.rs, validate that cryptographic key bits match hex representations and WIF↔hex consistency

Applied to files:

  • build.rs
📚 Learning: 2026-01-24T12:03:02.921Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/AGENTS.md:0-0
Timestamp: 2026-01-24T12:03:02.921Z
Learning: Applies to scripts/src/**/*.rs : Use `serde_json` for JSONC file manipulation when modifying `../data/*.jsonc` files

Applied to files:

  • build.rs
📚 Learning: 2026-01-24T12:03:02.921Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/AGENTS.md:0-0
Timestamp: 2026-01-24T12:03:02.921Z
Learning: Applies to scripts/src/**/*.rs : Use JSON caching in `../data/cache/` to avoid repeated API calls when fetching data with Cargo binaries in the scripts project

Applied to files:

  • build.rs
📚 Learning: 2026-01-24T12:03:02.921Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/AGENTS.md:0-0
Timestamp: 2026-01-24T12:03:02.921Z
Learning: Applies to scripts/src/**/*.rs : Skip failures and continue processing when updating JSONC data files instead of halting on errors

Applied to files:

  • build.rs
🔇 Additional comments (14)
src/puzzle.rs (1)

138-139: LGTM - Status::Expired variant

Clean addition. Follows existing enum pattern.

src/collections/mod.rs (1)

8-8: LGTM

Module export follows existing pattern.

src/cli.rs (2)

221-222: Status::Expired rendering across CLI paths — LGTM

Consistent use of .dimmed() styling and proper status string in all output paths (table rows, detail view, search results, CSV export, stats counting).

Also applies to: 489-490, 1073-1074, 1127-1128, 1808-1809


1846-1848: Collection help and tests updated correctly

"warp (warpwallet)" follows the "hash_collision (peter_todd)" pattern. Test expectations updated.

Also applies to: 1913-1918

tests/validation.rs (3)

680-690: Correctly extends no-solve_time check to Expired

Makes sense — expired puzzles weren't solved, so no solve_time.


917-932: New test validates expired puzzles have claim transactions

Good addition. Expired puzzles had funds reclaimed, which requires a claim transaction. Consistent with the warp data structure.


1009-1012: Expired status correctly added to terminal-state validations

Both solve_date_matches_claim_transaction and unsolved_puzzles_no_solver now handle Expired as a terminal state without a solver. Semantically correct.

Also applies to: 1034-1044

AGENTS.md (1)

3-8: Documentation updates accurately reflect the changes

Collection count bumped to 9, Status enum includes Expired, warp collection documented with scrypt+pbkdf2 context.

Also applies to: 56-56, 133-133

data/warp.jsonc (2)

1-22: Author and metadata structure looks good

Multiple Twitter profiles for the Keybase team (maxtaco, malgorithms) plus GitHub repo link. Source URL points to keybase.io/warp.


24-139: Solved challenges (1-4) data is consistent

Each puzzle has matching prize and funding amounts. Transaction dates, solve times, and pubkeys all present.

src/collections/warp.rs (1)

1-49: New collection module follows established patterns

Structure matches other collections (hash_collision.rs, zden.rs, etc.):

  • solved() filters Solved | Claimed — consistent with hash_collision.rs
  • unsolved() filters Unsolved only
  • Expired status falls into neither iterator, which is correct semantically (expired puzzles weren't solved and aren't active)

The get() function properly handles both bare names and prefixed IDs.

src/lib.rs (3)

14-14: Collection::Warp variant and registry updates

Clean addition. ALL array correctly sized at 9, alphabetical ordering maintained.

Also applies to: 45-60


85-85: "warpwallet" alias for "warp" collection

Follows the "peter_todd"HashCollision precedent. Users can use either warp/challenge_1 or warpwallet/challenge_1.


188-188: Stats.expired field and counting logic

Correctly extends Stats struct and counts expired puzzles in stats(). Match statement is now exhaustive.

Also applies to: 199-205

Comment thread build.rs
Comment thread data/warp.jsonc
Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

0 issues found across 1 file (changes from recent commits).

Requires human review: Adds a new variant to a core enum (Status) and updates data generation and validation logic across multiple files. Such changes to the core data model require human review.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
AGENTS.md (1)

76-76: 🧹 Nitpick | 🔵 Trivial

Optional: Consider documenting the new pubkey validation.

PR adds validate_pubkey_for_claimed_puzzles enforced at build time. The current list looks like examples rather than exhaustive, so this isn't an issue, but documenting it here would help developers understand what build.rs checks.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@AGENTS.md` at line 76, Add a short note in AGENTS.md that documents the new
build-time pubkey validation by referencing the
validate_pubkey_for_claimed_puzzles check in build.rs: state that build.rs now
enforces pubkey validation (matching hex and WIF consistency and verifying
claimed puzzles) at compile time, briefly describe what
validate_pubkey_for_claimed_puzzles verifies, and point developers to build.rs
(and the validate_pubkey_for_claimed_puzzles symbol) so they know where to
update tests/examples if their keys fail validation.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@AGENTS.md`:
- Line 76: Add a short note in AGENTS.md that documents the new build-time
pubkey validation by referencing the validate_pubkey_for_claimed_puzzles check
in build.rs: state that build.rs now enforces pubkey validation (matching hex
and WIF consistency and verifying claimed puzzles) at compile time, briefly
describe what validate_pubkey_for_claimed_puzzles verifies, and point developers
to build.rs (and the validate_pubkey_for_claimed_puzzles symbol) so they know
where to update tests/examples if their keys fail validation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: e26929c4-f47c-4ba6-8bef-584bcb23fa3d

📥 Commits

Reviewing files that changed from the base of the PR and between 913ced2 and 650f64f.

📒 Files selected for processing (1)
  • AGENTS.md
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: cubic · AI code reviewer
🧰 Additional context used
📓 Path-based instructions (1)
AGENTS.md

📄 CodeRabbit inference engine (CLAUDE.md)

AGENTS.md: Document agent responsibilities and capabilities in AGENTS.md
Maintain clear agent interface definitions and behavioral specifications

Files:

  • AGENTS.md
🧠 Learnings (26)
📓 Common learnings
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to tests/author_lineage.rs : In tests/author_lineage.rs, verify funding source tracking and author metadata consistency across all puzzles
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/ballet.jsonc : For ballet collection puzzles, document that they are physical crypto wallet cards with BIP38 encrypted keys from Bobby Lee's challenge
Learnt from: oritwoen
Repo: oritwoen/boha PR: 122
File: src/puzzle.rs:104-117
Timestamp: 2026-03-15T19:09:49.536Z
Learning: Applies to {src/puzzle.rs,src/balance.rs}: The `Chain` enum in `src/puzzle.rs` supports: Bitcoin, Ethereum, Litecoin, Monero, Decred, and Arweave (added in PR `#111`) — any new chains must be added to both the enum and `src/balance.rs` API integration. Arweave balance fetching is not yet implemented in `src/balance.rs` (tracked in issue `#123`).
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/hash_collision.jsonc : For hash_collision puzzles, track that these are Peter Todd's P2SH bounties for finding pre-image hash collisions
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/collections/*.rs : Generate static `&[Puzzle]` arrays via build.rs using `include!()` into src/collections/*.rs files
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Define Puzzle struct with exactly 16 fields covering id, title, description, difficulty, status, author, solver, status_date, reward, addresses, keys, seeds, shares, profiles, and metadata
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/**/*.jsonc : Store puzzle data in `data/*.jsonc` files, not hardcoded in Rust source code
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : For Bitcoin/crypto addresses, include kind field with values: P2PKH (legacy), P2SH (script), P2WPKH/P2WSH (SegWit), P2TR (Taproot)
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Define Chain enum including Bitcoin, Ethereum, Litecoin, Monero, Decred, and Arweave
Learnt from: oritwoen
Repo: oritwoen/boha PR: 111
File: data/arweave.jsonc:21-21
Timestamp: 2026-02-21T06:17:19.520Z
Learning: In JSONC puzzle data files (data/*.jsonc), the "name" field stores only the puzzle identifier (e.g., "weave1", "kitten", "Level 1"), not the full "collection/identifier" format. The full ID (e.g., "arweave/weave1", "bitimage/kitten") is constructed at build time or runtime by the Rust code in build.rs and collection modules.
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Track both Solver (who revealed/found the key) and Claimer (who swept funds) separately in Puzzle struct, as these may be different people
📚 Learning: 2026-03-15T22:40:10.290Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/CLAUDE.md:0-0
Timestamp: 2026-03-15T22:40:10.290Z
Learning: Applies to scripts/**/AGENTS.md : Maintain an up-to-date AGENTS.md file as the single source of truth for agent documentation

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:07.198Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T22:40:07.198Z
Learning: Applies to AGENTS.md : Maintain clear agent interface definitions and behavioral specifications

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:07.198Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-03-15T22:40:07.198Z
Learning: Applies to AGENTS.md : Document agent responsibilities and capabilities in AGENTS.md

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: For scripts/ directory changes, refer to scripts/AGENTS.md for the separate Cargo project structure and development guidelines

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:10.290Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/CLAUDE.md:0-0
Timestamp: 2026-03-15T22:40:10.290Z
Learning: Applies to scripts/**/AGENTS.md : Agent implementations should be documented in AGENTS.md with clear descriptions of their purpose, capabilities, and usage

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to tests/author_lineage.rs : In tests/author_lineage.rs, verify funding source tracking and author metadata consistency across all puzzles

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Define Puzzle struct with exactly 16 fields covering id, title, description, difficulty, status, author, solver, status_date, reward, addresses, keys, seeds, shares, profiles, and metadata

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/ballet.jsonc : For ballet collection puzzles, document that they are physical crypto wallet cards with BIP38 encrypted keys from Bobby Lee's challenge

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T19:09:49.536Z
Learnt from: oritwoen
Repo: oritwoen/boha PR: 122
File: src/puzzle.rs:104-117
Timestamp: 2026-03-15T19:09:49.536Z
Learning: Applies to {src/puzzle.rs,src/balance.rs}: The `Chain` enum in `src/puzzle.rs` supports: Bitcoin, Ethereum, Litecoin, Monero, Decred, and Arweave (added in PR `#111`) — any new chains must be added to both the enum and `src/balance.rs` API integration. Arweave balance fetching is not yet implemented in `src/balance.rs` (tracked in issue `#123`).

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/hash_collision.jsonc : For hash_collision puzzles, track that these are Peter Todd's P2SH bounties for finding pre-image hash collisions

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Define Chain enum including Bitcoin, Ethereum, Litecoin, Monero, Decred, and Arweave

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/collections/*.rs : Generate static `&[Puzzle]` arrays via build.rs using `include!()` into src/collections/*.rs files

Applied to files:

  • AGENTS.md
📚 Learning: 2026-02-21T06:17:19.520Z
Learnt from: oritwoen
Repo: oritwoen/boha PR: 111
File: data/arweave.jsonc:21-21
Timestamp: 2026-02-21T06:17:19.520Z
Learning: In JSONC puzzle data files (data/*.jsonc), the "name" field stores only the puzzle identifier (e.g., "weave1", "kitten", "Level 1"), not the full "collection/identifier" format. The full ID (e.g., "arweave/weave1", "bitimage/kitten") is constructed at build time or runtime by the Rust code in build.rs and collection modules.

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/**/*.jsonc : Store puzzle data in `data/*.jsonc` files, not hardcoded in Rust source code

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/lib.rs : Implement lib.rs public API with three core functions: get(id) for puzzle lookup, all() for iterating puzzles, and stats() for aggregate statistics

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/balance.rs : In src/balance.rs, implement multi-chain async balance fetching for BTC/LTC/ETH using mempool.space and Etherscan APIs

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: All puzzle data must be compiled to static `&'static` references with no heap allocation at runtime

Applied to files:

  • AGENTS.md
📚 Learning: 2026-01-24T12:03:02.921Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: scripts/AGENTS.md:0-0
Timestamp: 2026-01-24T12:03:02.921Z
Learning: Applies to scripts/src/**/*.rs : Use JSON caching in `../data/cache/` to avoid repeated API calls when fetching data with Cargo binaries in the scripts project

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Use `Option<T>` for all optional fields in puzzle data structures (Address, Key, Seed, Shares, Profile, Author, Solver)

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : For Bitcoin/crypto addresses, include kind field with values: P2PKH (legacy), P2SH (script), P2WPKH/P2WSH (SegWit), P2TR (Taproot)

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Track both Solver (who revealed/found the key) and Claimer (who swept funds) separately in Puzzle struct, as these may be different people

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to src/puzzle.rs : Use `&'static str` for all string data in Puzzle structs, never heap-allocated Strings

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/bitaps.jsonc : For bitaps puzzles, implement Shamir Secret Sharing support with threshold, total, and shares[] fields in Shares struct

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/bitimage.jsonc : For bitimage puzzles, derive keys using SHA256(Base64(file)) as BIP39 entropy, documenting file hash and path in seed metadata

Applied to files:

  • AGENTS.md
📚 Learning: 2026-03-15T22:40:42.886Z
Learnt from: CR
Repo: oritwoen/boha PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-03-15T22:40:42.886Z
Learning: Applies to data/arweave.jsonc : For arweave collection, track that these are Tiamat's bounties on the Arweave blockchain (chronobot.io) with Arweave address and transaction IDs

Applied to files:

  • AGENTS.md
🔇 Additional comments (5)
AGENTS.md (5)

3-3: LGTM - timestamp updated.

Standard doc maintenance, matches PR date.


8-8: LGTM - collection count and warp addition accurate.

Nine collections listed (arweave through zden), count matches, "6 WarpWallet challenges" aligns with PR objectives (4 solved, 2 expired).


20-22: LGTM - structure documentation updated consistently.

Collection count bumped to nine, warp added to JSONC source list. Matches overview section updates.


56-56: LGTM - Status enum documentation accurate.

Expired variant added. Code snippets confirm it's properly implemented in puzzle.rs (definition, Display, FromStr) and handled throughout lib.rs/cli.rs.


133-133: LGTM - warp collection documented.

Note follows existing pattern for collection descriptions. Technical context (scrypt+pbkdf2 brainwallet) provided, consistent with how other collections are documented.

@oritwoen oritwoen merged commit 12270c8 into main Mar 30, 2026
6 checks passed
@oritwoen oritwoen deleted the feat/warp-collection branch March 30, 2026 13:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add WarpWallet challenge collection

1 participant