The snippets, ordered obscure → unmistakable

  1. Snippet 1(String hash helper)
  2. Snippet 2(Hex parser)
  3. Snippet 3(Object types)
  4. Snippet 4(Builtin command table)
  5. Snippet 5(Index entry struct)
  6. Snippet 6(common-main.c entry)

Why this project gives itself away

The give-away. Snippets 1 and 2 are generic C string helpers, but sha1 as a 20-byte array is Git's heritage hash size. Snippet 3's `OBJ_COMMIT`/`OBJ_TREE`/`OBJ_BLOB`/`OBJ_TAG` is Git's exact object model. Snippet 4 is the builtin command table with cmd_add, cmd_commit, etc. — every git subcommand is registered here. Snippet 5 names cache_entry + object_id — the index file's record format. Snippet 6 is the "stupid content tracker" self-description Linus put in the README, plus the canonical git --version banner.

How a Framed puzzle is built

Every Framed project ships exactly six snippets, hand-ordered from deeply obscure to unmistakable. The first snippet must be plausible for a dozen codebases — a generic loop, a small utility, a comment that could appear anywhere. The last snippet carries a project-specific tell: a function name, a code-comment idiom, a file header, a build invocation. Between them sit four snippets that gradually narrow the field. Reading them in order is half the puzzle: a returning Framed player learns to triangulate on indentation conventions, comment voice, naming, and the small-but-distinctive choices that betray a project's era and community.