feat(warp): add WarpWallet challenge collection#149
Conversation
📝 WalkthroughWalkthroughAdds a new WarpWallet puzzle collection (six Keybase brainwallet challenges: four solved, two expired), introduces Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
✨ Simplify code
Comment |
There was a problem hiding this comment.
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
Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.
There was a problem hiding this comment.
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 | 🔵 TrivialTest doesn't cover
Status::Expired.is_active()The test verifies
is_active()for 4 of 5 status variants but missesExpired. CurrentlyExpired.is_active()returnsfalse(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
StatsCsvRowmissingexpiredfield — CSV output loses data
Stats.expiredis populated instats()andcmd_export(), butStatsCsvRowdoesn't include it. Runningboha stats -o csvsilently 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_tabledoesn't display expired countThe table shows total/solved/unsolved/claimed/swept but skips expired. Inconsistent with
Statsstruct 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 | 🟠 MajorUnknown 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 | 🟡 MinorAdd missing schema files to cargo:rerun-if-changed directives.
Schema files in
data/schemas/are referenced via$schemafields in the JSONC files but aren't watched for changes. Addcargo:rerun-if-changed=data/schemas/collection.schema.json,data/schemas/definitions.schema.json, anddata/schemas/solvers.schema.jsonto 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
📒 Files selected for processing (9)
AGENTS.mdbuild.rsdata/warp.jsoncsrc/cli.rssrc/collections/mod.rssrc/collections/warp.rssrc/lib.rssrc/puzzle.rstests/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 usinginclude!()into src/collections/*.rs files
Files:
src/collections/mod.rssrc/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 strfor 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
UseOption<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 indata/*.jsoncfiles, not hardcoded in Rust source code
Use JSONC format (JSON with Comments) for all puzzle collection data files
Use puzzle ID formatcollection/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: Includecargo:rerun-if-changeddirectives 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.rsAGENTS.mdsrc/puzzle.rstests/validation.rssrc/collections/warp.rssrc/lib.rsbuild.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.rsAGENTS.mdtests/validation.rssrc/collections/warp.rssrc/lib.rsbuild.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.rsAGENTS.mdsrc/puzzle.rstests/validation.rssrc/collections/warp.rssrc/lib.rsbuild.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.rsAGENTS.mdtests/validation.rssrc/collections/warp.rsbuild.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.rsAGENTS.mdsrc/puzzle.rstests/validation.rssrc/collections/warp.rssrc/lib.rsbuild.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.rsAGENTS.mdsrc/puzzle.rstests/validation.rssrc/collections/warp.rssrc/lib.rsbuild.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.rsAGENTS.mdsrc/collections/warp.rssrc/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.mddata/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.mdsrc/collections/warp.rssrc/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.mddata/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.mdsrc/collections/warp.rssrc/lib.rsbuild.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.mdbuild.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.mddata/warp.jsoncsrc/collections/warp.rssrc/lib.rsbuild.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.mdtests/validation.rssrc/collections/warp.rssrc/lib.rsbuild.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.mdsrc/puzzle.rstests/validation.rssrc/collections/warp.rssrc/lib.rsbuild.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.mddata/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.jsoncbuild.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.jsoncbuild.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.jsoncbuild.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.rssrc/lib.rsbuild.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 variantClean addition. Follows existing enum pattern.
src/collections/mod.rs (1)
8-8: LGTMModule export follows existing pattern.
src/cli.rs (2)
221-222: Status::Expired rendering across CLI paths — LGTMConsistent 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 ExpiredMakes sense — expired puzzles weren't solved, so no solve_time.
917-932: New test validates expired puzzles have claim transactionsGood 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 validationsBoth
solve_date_matches_claim_transactionandunsolved_puzzles_no_solvernow 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 changesCollection 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 goodMultiple 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 consistentEach 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 patternsStructure matches other collections (hash_collision.rs, zden.rs, etc.):
solved()filtersSolved | Claimed— consistent with hash_collision.rsunsolved()filtersUnsolvedonlyExpiredstatus 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 updatesClean addition.
ALLarray correctly sized at 9, alphabetical ordering maintained.Also applies to: 45-60
85-85: "warpwallet" alias for "warp" collectionFollows the
"peter_todd"→HashCollisionprecedent. Users can use eitherwarp/challenge_1orwarpwallet/challenge_1.
188-188: Stats.expired field and counting logicCorrectly extends
Statsstruct and counts expired puzzles instats(). Match statement is now exhaustive.Also applies to: 199-205
There was a problem hiding this comment.
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 | 🔵 TrivialOptional: Consider documenting the new pubkey validation.
PR adds
validate_pubkey_for_claimed_puzzlesenforced 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
📒 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.
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.
warpcollection: 6 puzzles with full blockchain data (txids, dates, pubkeys extracted from claim transactions, hash160)Status::Expiredvariant for puzzles never solved whose funds were reclaimed after a deadlineExpiredwired throughpuzzle.rs,build.rs,cli.rs,lib.rs, validation testsvalidate_pubkey_for_claimed_puzzlesenforced for the new collectionCloses #148