{
  "harness_version": "1.0",
  "active_challenge": {
    "id": "git-python",
    "name": "Build your own Git (Python)",
    "language": "python3",
    "tutorial": "https://wyag.thb.lt/",
    "alt_tutorials": [
      "https://benhoyt.com/writings/pygit/",
      "https://www.leshenko.net/p/ugit/"
    ],
    "workspace": "workspace/git-python",
    "verify": "./init.sh"
  },
  "features": [
    {
      "id": "init",
      "name": "init",
      "description": "`init` — create the .git directory structure (objects, refs, HEAD).",
      "status": "todo",
      "dependencies": [],
      "done_criteria": "Running the tool's `init` in an empty dir creates .git/{objects,refs} and HEAD pointing at refs/heads/main.",
      "verify": "python3 -m pytest tests/test_init.py -q",
      "evidence": ""
    },
    {
      "id": "hash-object",
      "name": "hash-object",
      "description": "`hash-object` — write a blob object and return its SHA-1.",
      "status": "todo",
      "dependencies": ["init"],
      "done_criteria": "SHA-1 matches real `git hash-object` for the same input; object is zlib-compressed at .git/objects/xx/yyy.",
      "verify": "python3 -m pytest tests/test_hash_object.py -q",
      "evidence": ""
    },
    {
      "id": "cat-file",
      "name": "cat-file",
      "description": "`cat-file` — read and inflate an object by SHA.",
      "status": "todo",
      "dependencies": ["hash-object"],
      "done_criteria": "`cat-file -p <sha>` prints the original blob content byte-for-byte.",
      "verify": "python3 -m pytest tests/test_cat_file.py -q",
      "evidence": ""
    },
    {
      "id": "write-tree",
      "name": "write-tree",
      "description": "`write-tree` — serialize the working directory into a tree object.",
      "status": "todo",
      "dependencies": ["cat-file"],
      "done_criteria": "Tree SHA matches real `git write-tree` for an identical directory layout.",
      "verify": "python3 -m pytest tests/test_write_tree.py -q",
      "evidence": ""
    },
    {
      "id": "commit-tree",
      "name": "commit-tree",
      "description": "`commit-tree` — create a commit object from a tree SHA.",
      "status": "todo",
      "dependencies": ["write-tree"],
      "done_criteria": "Commit object parses with real `git cat-file -p`; has tree, author, committer, message.",
      "verify": "python3 -m pytest tests/test_commit_tree.py -q",
      "evidence": ""
    },
    {
      "id": "log",
      "name": "log",
      "description": "`log` — walk commit parents from HEAD, newest first.",
      "status": "todo",
      "dependencies": ["commit-tree"],
      "done_criteria": "Given a chain of commits, `log` prints them newest-first with SHAs and messages.",
      "verify": "python3 -m pytest tests/test_log.py -q",
      "evidence": ""
    }
  ]
}
