)]}'
{
  "commit": "07c6bafe5271cabfeb580b953e28f577fc3f8433",
  "tree": "2244a5cd5dbd86d5987815c70ac49df9afdad966",
  "parents": [
    "b60382fe013db231ae6f44cce56beaf446d14051"
  ],
  "author": {
    "name": "Jarek Potiuk",
    "email": "jarek@potiuk.com",
    "time": "Sun Jul 05 12:00:06 2026 +0200"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Sun Jul 05 12:00:06 2026 +0200"
  },
  "message": "feat(tools): regenerate vendor-neutrality score doc block as a prek hook (#747)\n\nThe vendor-neutrality-score tool could print the docs/vendor-neutrality.md\nblock (--markdown) but nothing kept the published block in sync with the\ntree. Add an in-place mode and wire it as a local prek hook so the block is\nregenerated on commit, the same way doctoc keeps a TOC current.\n\n- --in-place rewrites the block between the BEGIN/END markers and exits\n  non-zero when it changed, so a stale doc fails the commit and the\n  contributor re-stages the regenerated file. render_doc / write_doc_block\n  do the work.\n- Sync is keyed on block *content* (stripped), matching the existing\n  test_doc_block_is_in_sync guard: when the content already matches, the doc\n  is returned byte-for-byte unchanged, so the hook never churns the file over\n  a stray blank line or an environment-specific whitespace quirk. Only a real\n  content change triggers a rewrite (which normalises the spacing).\n- .pre-commit-config.yaml: local `vendor-neutrality-score` hook runs\n  --in-place, gated by files: to tool READMEs, skill SKILLs, the privacy-llm\n  registry, the tool, and the doc itself; pass_filenames: false since the\n  scorer always reads the whole tree.\n- Tests: live round-trip, no-op-when-in-sync (incl. non-normalised\n  whitespace), stale-block regeneration + idempotency, CLI exit codes, and\n  missing-markers ValueError.\n- README documents --in-place and the sync hook.\n\nCo-authored-by: Tester \u003ct@example.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1f5750f1796538ffacc1291c0649b449fa29ea8f",
      "old_mode": 33188,
      "old_path": ".pre-commit-config.yaml",
      "new_id": "d8d8d27c7a2568007706c267c2da54437f6d2f21",
      "new_mode": 33188,
      "new_path": ".pre-commit-config.yaml"
    },
    {
      "type": "modify",
      "old_id": "aef3a4ba09f6dbebdca4d01dc7f5d46b2cc16afc",
      "old_mode": 33188,
      "old_path": "tools/vendor-neutrality-score/README.md",
      "new_id": "881f32641925dabfc8db9ea1e506457aa7f110fd",
      "new_mode": 33188,
      "new_path": "tools/vendor-neutrality-score/README.md"
    },
    {
      "type": "modify",
      "old_id": "89103be9135f197e71de39dceb472b2c6450f6c2",
      "old_mode": 33188,
      "old_path": "tools/vendor-neutrality-score/src/vendor_neutrality_score/__init__.py",
      "new_id": "2982a9a6d9628c1aa771537b3e41d77353beb7cd",
      "new_mode": 33188,
      "new_path": "tools/vendor-neutrality-score/src/vendor_neutrality_score/__init__.py"
    },
    {
      "type": "modify",
      "old_id": "5ce329fdea86366ffb976368a0eb737b639aacef",
      "old_mode": 33188,
      "old_path": "tools/vendor-neutrality-score/tests/test_vendor_neutrality_score.py",
      "new_id": "a7c5157593a1a00de9277ceaa1bf2dd82fe679cc",
      "new_mode": 33188,
      "new_path": "tools/vendor-neutrality-score/tests/test_vendor_neutrality_score.py"
    }
  ]
}
