[
  {
    "name": "rubiks-cube-solver",
    "keywords": ["rubik", "cube", "solver", "puzzle", "algorithm", "search", "ida", "kociemba"],
    "problem_type": "algorithmic",
    "file_tree": ["Cargo.toml", "src/main.rs", "src/lib.rs", "src/cube.rs", "src/moves.rs", "src/solver.rs", "src/scramble.rs", "src/notation.rs", "tests/cube.rs", "tests/solver.rs", "benches/solver.rs", "README.md"],
    "libraries": ["clap", "rand", "criterion", "proptest"],
    "milestones": [
      {"name": "M0: Setup", "goal": "Scaffold", "tasks": [{"id":"M0-1","title":"Scaffold crate","description":"cargo init, fmt, clippy, tests","depends_on":[]}]},
      {"name": "M1: Cube model", "goal": "State + moves", "tasks": [{"id":"M1-1","title":"Cube state representation","description":"54-sticker or 20-cubie model with invariants","depends_on":[]},{"id":"M1-2","title":"Move generation","description":"U/D/L/R/F/B + inverses, undo support","depends_on":["M1-1"]}]},
      {"name": "M2: Solver", "goal": "Search algorithm", "tasks": [{"id":"M2-1","title":"Heuristic","description":"Admissible heuristic (Manhattan/corner)","depends_on":["M1-2"]},{"id":"M2-2","title":"IDA* search","description":"Depth-first iterative deepening","depends_on":["M2-1"]},{"id":"M2-3","title":"Validation","description":"Parity/invariant checks, known-answer tests","depends_on":["M2-2"]}]},
      {"name": "M3: CLI", "goal": "Commands", "tasks": [{"id":"M3-1","title":"solve command","description":"Parse scramble, solve, print moves","depends_on":["M2-3"]},{"id":"M3-2","title":"scramble command","description":"Generate random valid scramble","depends_on":["M3-1"]}]},
      {"name": "M-Final: Polish", "goal": "Docs/tests/release", "tasks": [{"id":"MF-1","title":"Docs & benchmarks","description":"README, criterion benches","depends_on":[]}]}
    ],
    "risks": ["Incorrect state representation causing illegal cubes to solve", "Heuristic not admissible → wrong shortest path", "Solver performance/termination", "Notation parsing ambiguity", "No input validation"],
    "pitfalls": ["Cubie vs sticker confusion; track orientation", "Move application order", "Parity/invariant checks missing", "Integer overflow in depth counters", "Forgetting inverse move tests"]
  },
  {
    "name": "nd-cli",
    "keywords": ["cli", "pack", "tar", "hub", "upload", "download", "self-update", "json", "agent"],
    "problem_type": "cli",
    "file_tree": ["Cargo.toml", "README.md", "src/main.rs", "src/cli.rs", "src/config.rs", "src/error.rs", "src/manifest.rs", "src/pack.rs", "src/hub.rs", "src/update.rs", "tests/cli.rs"],
    "libraries": ["clap", "serde", "toml", "serde_json", "tar", "flate2", "walkdir", "reqwest", "self_update", "sha2", "tempfile", "dirs", "tracing"],
    "milestones": [
      {"name": "M0: Setup", "goal": "Scaffold", "tasks": [{"id":"M0-1","title":"Scaffold","description":"cargo init + tooling","depends_on":[]}]},
      {"name": "M1: Manifest", "goal": "Parse notdouble.toml", "tasks": [{"id":"M1-1","title":"Manifest struct","description":"serde + validation","depends_on":[]}]},
      {"name": "M2: Pack", "goal": "tar.gz", "tasks": [{"id":"M2-1","title":"File collection","description":"walkdir + ignore rules","depends_on":["M1-1"]},{"id":"M2-2","title":"Tar+gzip","description":"tar + flate2, deterministic order","depends_on":["M2-1"]}]},
      {"name": "M3: Hub client", "goal": "HTTP", "tasks": [{"id":"M3-1","title":"Upload/download","description":"reqwest multipart","depends_on":["M2-2"]}]},
      {"name": "M4: Commands", "goal": "CLI commands", "tasks": [{"id":"M4-1","title":"init/validate/upload","description":"core commands","depends_on":["M3-1"]},{"id":"M4-2","title":"download/search/info","description":"read commands","depends_on":["M3-1"]}]},
      {"name": "M5: Self-update", "goal": "Update binary", "tasks": [{"id":"M5-1","title":"self_update","description":"checksum verify + rollback","depends_on":["M4-1"]}]},
      {"name": "M-Final: Polish", "goal": "Docs/tests", "tasks": [{"id":"MF-1","title":"Docs & tests","description":"README, integration tests","depends_on":[]}]}
    ],
    "risks": ["Tar path traversal", "Secret leakage in bundles", "Self-update supply chain", "Hub API drift", "Unstable --json output", "Version conflicts", "Non-deterministic packaging"],
    "pitfalls": ["Tar traversal", ".git inclusion", "Non-deterministic archive ordering", "Self-update supply chain", "Hub API drift", "Unstable --json", "Secret leakage"]
  }
]
