{
  "name": "zyte-web-data — 1 hook",
  "slug": "source-hooks-ae07061b68e0e725abba72c1",
  "type": "hooks",
  "category": "developer-tools",
  "example": false,
  "evidence_state": "pinned_source_listing",
  "stamp": "Pinned source listing — machine-checked",
  "summary": "Pinned source declarations and file hashes were listed.",
  "outcome": "Listed 1 hook declaration. Ran 67 git commands; each one's exit status and output hash is in commands.json. Scope: acquisition and static inspection.",
  "rule_results": [
    "The retained source tree matches its acquisition manifest.",
    "Declared hook names (listing.json): Stop"
  ],
  "task": "What declarations and files are present in this pinned source?",
  "setup": "Git blob acquisition followed by static source inspection.",
  "limitations": "Scope: acquisition and static inspection. Command results: commands.json.",
  "source_url": "https://github.com/zytedata/claude-skills.git",
  "documentation_url": "https://github.com/zytedata/claude-skills.git",
  "commit": "d03e241729ebc3bf397e4303d654e8189b9e8185",
  "tree_sha256": "e95ef22970c43fd03e97614d3aa157c688f89eaa3a951b32ef5c3fe1bee6a9b7",
  "file_sha256": {
    ".claude-plugin/marketplace.json": "d2c530dc71bf9e147c340fcbf117f94424be3c73361fd387ae0073501ffe6081",
    ".claude-plugin/plugin.json": "91324859a726812b070921e72c4c11b2c920150d01e4c7622a4d844282879193",
    "CHANGELOG.md": "5d0d498b9758ba6e9c716f160491730ee9fe5af1afc8b68ccb9c3aba3b2648ca",
    "LICENSE.md": "92a3a1e477d87baf9f7bbb7d8a018337d02b101381dd2d2e435f99c90b085955",
    "README.md": "d8816fc5fd073a089181b9494cebacf27c03558d1d09d0a00b4949e2d0a46baa",
    "assets/zyte-logo.png": "ec8d45e699974da7a894ec39256910bb2df6925160efd15493f6de0cf6c15bb9",
    "hooks/hooks.json": "cfee65a2afa5cd9a68b07998767096cc47fc3f51efa604c6819de15d05b79829",
    "skills/scrape/SKILL.md": "62df384b9df2c02611d0f646458034f642ec6a63a81cba21f1ac6e10bd088aed",
    "skills/scrape/meta.json": "b06c0db827c3027c8c022e824a8a109c3478b321b0fcd28cce53dc7c02cbe7ff",
    "skills/scrape/references/docs-access.md": "405e1e8017a6e5d655989a9d14070dfc6a5abfa569222b73a3d7d840b870256e",
    "skills/scrape/references/extraction-spec.md": "6e5340a9583eb5d1c83398db6a11a5fe6c220ce11cdaac11814fa06e50bbd35b",
    "skills/scrape/references/python-environments.md": "d474c786394ad4dbb54126386b5512cf8553410581e3d81e581049e6977d1727",
    "skills/scrape/scripts/detect_projects.py": "b825fccb2321aad59506d796be0feb586053e68ed5db6463fc00695989477578",
    "skills/scrape/scripts/feedback_state.py": "f5a9f8e28d3fc0e25a77bf28ecf1277079c11b1c1de2379b41909968e691b200",
    "skills/scrape-analyze-page/SKILL.md": "4ab618699717abb9408933495fa1eb3e691d310ed90f58fe438a56fc520ea3fd",
    "skills/scrape-analyze-page/scripts/clean_html.py": "cac81f88ef65492d281a3cf1d729bcb03f41f45f1d2a8c71098c7ae3389a3edf",
    "skills/scrape-analyze-page/scripts/extract_metadata.py": "c7a384d599668c88062a6be39911f2b3255fcb6bda5f097eeba6deda3642691a",
    "skills/scrape-analyze-page/scripts/summarize.py": "1a210238d26f4ecf834ce87547f071bc32fa536c8cf6b648b5cbdc640b09407f",
    "skills/scrape-plan/SKILL.md": "70b9fde84241a1b89ed59fa393eae31fb3a1a6f6d1a0d7bafaf9ea22d47f884a",
    "skills/scrape-plan/assets/review.html": "5cf520f89f693287e481325d2aad7cae816fc523f4276ae6600c49c4559923e9",
    "skills/scrape-plan/assets/review.js": "80b53a7d54e26533b1920435725088668ec133ebc786fe85045824e7f6014fda",
    "skills/scrape-plan/assets/style.css": "3fda4c023b61286596425c3712426c79935df24ccac6b16b6ca6ab0b02964757",
    "skills/scrape-plan/references/explore-site.md": "df83601c3a8d2dd89b6dfd7b23988ccbf1517f55dce9c9ef7163e54f2c6daba9",
    "skills/scrape-plan/scripts/apply_classification.py": "8c8c0b45b82a5be9184ee207a5997394c53dd14f16c1c2042a023cec46d0012e",
    "skills/scrape-plan/scripts/download.py": "ce0d535abfe6746728c4fa57905ceafb9d38ecd04ec9f837805f643c37709a5d",
    "skills/scrape-plan/scripts/extract_links.py": "6f7b104e1a2c39b7b4bf152a476d890c4e01572b48295cf34835374b76e4f734",
    "skills/scrape-plan/scripts/extract_nav_values.py": "fe9dde176941d4950d73d799d87e9ea8281825a4bc298fa459c0958664ac94e8",
    "skills/scrape-plan/scripts/extract_values.py": "5b3afbea00428426a9dae7a420e05a4cd2344c8448565b25e165a23c17362efe",
    "skills/scrape-plan/scripts/make_fixtures.py": "881adb44e6fc6e6ff42d3424f5f244fe61622a65552f787613b633ae64dfe0e6",
    "skills/scrape-plan/scripts/run_review.py": "394496e3a232a7d3134c18b510432a28947576c4dfe467d48d350c23e7625519",
    "skills/scrapy-extra/SKILL.md": "64c225aa604553fa473357405b1df74400f394d94eebf67b2797591c1427d5b5",
    "skills/scrapy-extra/assets/project-template/cookiecutter.json": "1e8c46f4667f174d968db5aa3b2ad8987fdaf02d621960daffe34552789b0167",
    "skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/fixtures/.gitkeep": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/pyproject.toml": "cdec83eac58714ebe8775580f7aaecba621bd94aebe2265c57dbaf63ac37f41b",
    "skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/scrapy.cfg": "e53d156e511ef198acfca001279e1bd957cf9f16c0a0e92927b663117e26edb4",
    "skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/items.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/pages/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/settings.py": "aa713a1b34fd1e65105c30b2d1496a154f07acad9fb1ada959f9fb4707d2867d",
    "skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/spiders/__init__.py": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "skills/scrapy-extra/references/scrapy-poet.md": "a8494b6b63cf0e97b0d551b43235ce5e41aeaa727d0eab34e902c58d314121f4",
    "skills/scrapy-extra/references/scrapy-zyte-api.md": "22cf1b882d0e9963d2ee9052aa2438e3710884a474927c3d68f6ed9db6bee2a0",
    "skills/scrapy-extra/references/scrapy.md": "52f00ac4aeaabaf16751e1cb4a1938c865e1c2a6ad8e0823c726772b64e7da47",
    "skills/scrapy-extra/references/web-poet.md": "cf3d3e24a5c5fda47a0fa5bc1f58806347f54d4980de4261c41cdf6e99250ffc",
    "skills/zyte/SKILL.md": "05fb2d2e74c5a11346447ed795ecdd0e841adb402c68772ff6db275623628e76",
    "skills/zyte/references/credentials.md": "d0f8b429fac5135deb8ea4bd56fe79a8047b29948b1d86bcced169394aa020a0",
    "skills/zyte/references/deployment.md": "47ab506b6f634af9ef92c73960693decca012d6557604ff7537dd7d0b8a97aaf",
    "skills/zyte/references/items-and-logs.md": "d1d3a281d10d39039915a67be227f8e2d74a201a8b8a73a87a37a00865adbefa",
    "skills/zyte/references/job-validation.md": "aafdd699feee085259ccb0311cdd0c439509133f0d6ad865491b3866bcb6c071",
    "skills/zyte/references/jobs.md": "08dc53261a06f55545a06e1311542225b74a51f5a5fd7969a36c5285e8f38820",
    "skills/zyte/references/periodic-jobs.md": "e685df6289ae2e987f68308fe34e30eee48dd1f035e58bca278fccba55566550",
    "skills/zyte/references/pricing.md": "932e679831c2862d234316c3ad09355111c6ffdf8f0549f3b9dd7491707844f8",
    "skills/zyte/references/scrapy-cloud.md": "ce91514246533a933c65531df94a911efcac2e50ee2153a0f17f66673f28c126",
    "skills/zyte/references/usage-stats.md": "10870b3bf1418deb669f295bf7bd49ad90bc3291cff952ac1e2a548732fd0d57",
    "skills/zyte/scripts/auth.py": "cbd314bd6ecc0f932179d331d00bfd6478772c7dc10aa390a4963a6a27958efb",
    "skills/zyte/scripts/env_keys.py": "5f89d4ed968b76dc50f04327d37edf36c208ce8e282b1d2d2321d0c487a552a6",
    "skills/zyte/scripts/oauth.py": "2ac970e4550c5b2f9ca3d2c69146ae3a640cac223b15ff0a3e62070f420476ef",
    "skills/zyte/scripts/project_org_lookup.py": "bb1811a264af722046eebdf764cb557753f7cd94c5c9ce980cc8a5dc10ec6ce7",
    "skills/zyte/scripts/scrapy_cloud_api.py": "0523e0f9a74ef0c01c61167be749b539406f0c1440bac856b1dc6daa5a191972",
    "skills/zyte/scripts/stack_tags.py": "f195151a5ab6fd3660031510a914d646039ffbfed4bae089f31a402337f043c1",
    "skills/zyte/scripts/wait_for_job.py": "dd3b3bfb9378fcca027c65dcd5e540b19a350ee1773a26fd94cfc6fd920a3f56",
    "skills/zyte/scripts/zyte_api_stats.py": "a738b25717f2a0ce2f21d34d686dcd567d82c6a94b9cb96cdf3628be2bb6c185"
  },
  "lockfiles": [
    "LOCK.json"
  ],
  "utc_date": "2026-10-20T03:23:48Z",
  "source_date": "2026-10-16",
  "discovered_date": "2026-10-16",
  "retested_date": "2026-10-20",
  "reviewed_date": "2026-10-20",
  "published_date": "2026-10-20",
  "modified_date": "2026-10-20",
  "reviewer": "machine pipeline",
  "harness_version": "toolwitness harness at commit d70ebdab8fe4884f43bd5c10f0d2ce37f2941b41",
  "claude_code_version": "Not applicable: static source inspection (commands.json).",
  "model_id": "Not applicable: static source inspection (commands.json).",
  "scanner_version": "Not applicable: static source inspection.",
  "rulepack_version": "Not applicable: static source inspection.",
  "agents": [],
  "disclaimer": "This record lists declarations and file hashes from a pinned source tree. Git command results from acquisition and static inspection are retained in commands.json. Scope: acquisition and static inspection. It is not a security or quality verdict. Changed bytes are outside this record.",
  "commands": [
    "Ran 67 git commands; each one's exit status and output hash is in commands.json. Scope: acquisition and static inspection."
  ],
  "prompt_list": [
    "Not applicable: static source inspection (commands.json)."
  ],
  "history": [
    "2026-10-20T03:23:48Z: pinned source inspection"
  ],
  "application": {
    "name": "zyte-web-data — 1 hook",
    "softwareVersion": "d03e241729ebc3bf397e4303d654e8189b9e8185",
    "applicationCategory": "DeveloperApplication",
    "operatingSystem": "Not exercised"
  },
  "artifacts": {
    "transcript": "Ran 67 git commands; each one's exit status and output hash is in commands.json. Scope: acquisition and static inspection.",
    "sinkhole_log": "Not applicable: static source inspection (commands.json).",
    "canary_log": "Not applicable: static source inspection (commands.json).",
    "scanner_output": "Not applicable: static source inspection (commands.json).",
    "normalized_text": "{\n  \"listing\": {\n    \"skills\": [\n      {\n        \"path\": \"skills/scrape/SKILL.md\",\n        \"name\": \"scrape\",\n        \"description\": \"Build a full-site or multi-page Scrapy spider to get structured data from a website, in a new project or added to an existing one. Do not use for analyzing locally saved HTML, fixing or debugging an existing spider, schema-only or existing-spec work, Scrapy Cloud operations, or advisory questions.\",\n        \"files\": {\n          \"skills/scrape/SKILL.md\": \"62df384b9df2c02611d0f646458034f642ec6a63a81cba21f1ac6e10bd088aed\",\n          \"skills/scrape/meta.json\": \"b06c0db827c3027c8c022e824a8a109c3478b321b0fcd28cce53dc7c02cbe7ff\",\n          \"skills/scrape/references/docs-access.md\": \"405e1e8017a6e5d655989a9d14070dfc6a5abfa569222b73a3d7d840b870256e\",\n          \"skills/scrape/references/extraction-spec.md\": \"6e5340a9583eb5d1c83398db6a11a5fe6c220ce11cdaac11814fa06e50bbd35b\",\n          \"skills/scrape/references/python-environments.md\": \"d474c786394ad4dbb54126386b5512cf8553410581e3d81e581049e6977d1727\",\n          \"skills/scrape/scripts/detect_projects.py\": \"b825fccb2321aad59506d796be0feb586053e68ed5db6463fc00695989477578\",\n          \"skills/scrape/scripts/feedback_state.py\": \"f5a9f8e28d3fc0e25a77bf28ecf1277079c11b1c1de2379b41909968e691b200\"\n        }\n      },\n      {\n        \"path\": \"skills/scrape-analyze-page/SKILL.md\",\n        \"name\": \"scrape-analyze-page\",\n        \"description\": \"Extract structured data (all available fields with values) from a page saved locally as an HTML file, optionally following a schema. Do not invoke when the user provides a URL. When invoking, pass the user's full request verbatim as args — do not pre-parse file paths and don't rephrase it.\",\n        \"files\": {\n          \"skills/scrape-analyze-page/SKILL.md\": \"4ab618699717abb9408933495fa1eb3e691d310ed90f58fe438a56fc520ea3fd\",\n          \"skills/scrape-analyze-page/scripts/clean_html.py\": \"cac81f88ef65492d281a3cf1d729bcb03f41f45f1d2a8c71098c7ae3389a3edf\",\n          \"skills/scrape-analyze-page/scripts/extract_metadata.py\": \"c7a384d599668c88062a6be39911f2b3255fcb6bda5f097eeba6deda3642691a\",\n          \"skills/scrape-analyze-page/scripts/summarize.py\": \"1a210238d26f4ecf834ce87547f071bc32fa536c8cf6b648b5cbdc640b09407f\"\n        }\n      },\n      {\n        \"path\": \"skills/scrape-plan/SKILL.md\",\n        \"name\": \"scrape-plan\",\n        \"description\": \"Plan a web scrape and author a validated extraction spec — explore a detail page, discover fields, confirm the schema, then validate it with more pages, HTML-variant comparison, extracted values, and an optional browser review, and present the plan for approval.\",\n        \"files\": {\n          \"skills/scrape-plan/SKILL.md\": \"70b9fde84241a1b89ed59fa393eae31fb3a1a6f6d1a0d7bafaf9ea22d47f884a\",\n          \"skills/scrape-plan/assets/review.html\": \"5cf520f89f693287e481325d2aad7cae816fc523f4276ae6600c49c4559923e9\",\n          \"skills/scrape-plan/assets/review.js\": \"80b53a7d54e26533b1920435725088668ec133ebc786fe85045824e7f6014fda\",\n          \"skills/scrape-plan/assets/style.css\": \"3fda4c023b61286596425c3712426c79935df24ccac6b16b6ca6ab0b02964757\",\n          \"skills/scrape-plan/references/explore-site.md\": \"df83601c3a8d2dd89b6dfd7b23988ccbf1517f55dce9c9ef7163e54f2c6daba9\",\n          \"skills/scrape-plan/scripts/apply_classification.py\": \"8c8c0b45b82a5be9184ee207a5997394c53dd14f16c1c2042a023cec46d0012e\",\n          \"skills/scrape-plan/scripts/download.py\": \"ce0d535abfe6746728c4fa57905ceafb9d38ecd04ec9f837805f643c37709a5d\",\n          \"skills/scrape-plan/scripts/extract_links.py\": \"6f7b104e1a2c39b7b4bf152a476d890c4e01572b48295cf34835374b76e4f734\",\n          \"skills/scrape-plan/scripts/extract_nav_values.py\": \"fe9dde176941d4950d73d799d87e9ea8281825a4bc298fa459c0958664ac94e8\",\n          \"skills/scrape-plan/scripts/extract_values.py\": \"5b3afbea00428426a9dae7a420e05a4cd2344c8448565b25e165a23c17362efe\",\n          \"skills/scrape-plan/scripts/make_fixtures.py\": \"881adb44e6fc6e6ff42d3424f5f244fe61622a65552f787613b633ae64dfe0e6\",\n          \"skills/scrape-plan/scripts/run_review.py\": \"394496e3a232a7d3134c18b510432a28947576c4dfe467d48d350c23e7625519\"\n        }\n      },\n      {\n        \"path\": \"skills/scrapy-extra/SKILL.md\",\n        \"name\": \"scrapy-extra\",\n        \"description\": \"Read this BEFORE writing, modifying, debugging, or explaining any Scrapy or web-poet code — spiders, page objects, pipelines, settings, selectors — down to a one-line fix, or scaffolding/configuring a Scrapy project, scrapy-poet, scrapy-zyte-api, or browser rendering. These libraries moved on since your training cutoff; invoke this FIRST. NOT for building a scraper for a given site (scrape), a saved HTML file (scrape-analyze-page), or Scrapy Cloud deploy/jobs (zyte).\",\n        \"files\": {\n          \"skills/scrapy-extra/SKILL.md\": \"64c225aa604553fa473357405b1df74400f394d94eebf67b2797591c1427d5b5\",\n          \"skills/scrapy-extra/assets/project-template/cookiecutter.json\": \"1e8c46f4667f174d968db5aa3b2ad8987fdaf02d621960daffe34552789b0167\",\n          \"skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/fixtures/.gitkeep\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n          \"skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/pyproject.toml\": \"cdec83eac58714ebe8775580f7aaecba621bd94aebe2265c57dbaf63ac37f41b\",\n          \"skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/scrapy.cfg\": \"e53d156e511ef198acfca001279e1bd957cf9f16c0a0e92927b663117e26edb4\",\n          \"skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/__init__.py\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n          \"skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/items.py\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n          \"skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/pages/__init__.py\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n          \"skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/settings.py\": \"aa713a1b34fd1e65105c30b2d1496a154f07acad9fb1ada959f9fb4707d2867d\",\n          \"skills/scrapy-extra/assets/project-template/{{cookiecutter.project_name}}/{{cookiecutter.project_name}}/spiders/__init__.py\": \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n          \"skills/scrapy-extra/references/scrapy-poet.md\": \"a8494b6b63cf0e97b0d551b43235ce5e41aeaa727d0eab34e902c58d314121f4\",\n          \"skills/scrapy-extra/references/scrapy-zyte-api.md\": \"22cf1b882d0e9963d2ee9052aa2438e3710884a474927c3d68f6ed9db6bee2a0\",\n          \"skills/scrapy-extra/references/scrapy.md\": \"52f00ac4aeaabaf16751e1cb4a1938c865e1c2a6ad8e0823c726772b64e7da47\",\n          \"skills/scrapy-extra/references/web-poet.md\": \"cf3d3e24a5c5fda47a0fa5bc1f58806347f54d4980de4261c41cdf6e99250ffc\"\n        }\n      },\n      {\n        \"path\": \"skills/zyte/SKILL.md\",\n        \"name\": \"zyte\",\n        \"description\": \"Zyte APIs and cloud services: credentials (set up, log in, get an API key, or a blocked site); Scrapy Cloud (deploy, schedule or run a spider, manage cron jobs, list/stop jobs, inspect items and logs); recorded API usage (spend, requests, response times, status codes) and pricing (plans, tiers, discounts, cost estimates); how-to and docs questions about any Zyte product or account/billing, from docs.zyte.com. NOT for writing/debugging spiders locally (scrapy-extra) or estimating spend from code instead of recorded stats.\",\n        \"files\": {\n          \"skills/zyte/SKILL.md\": \"05fb2d2e74c5a11346447ed795ecdd0e841adb402c68772ff6db275623628e76\",\n          \"skills/zyte/references/credentials.md\": \"d0f8b429fac5135deb8ea4bd56fe79a8047b29948b1d86bcced169394aa020a0\",\n          \"skills/zyte/references/deployment.md\": \"47ab506b6f634af9ef92c73960693decca012d6557604ff7537dd7d0b8a97aaf\",\n          \"skills/zyte/references/items-and-logs.md\": \"d1d3a281d10d39039915a67be227f8e2d74a201a8b8a73a87a37a00865adbefa\",\n          \"skills/zyte/references/job-validation.md\": \"aafdd699feee085259ccb0311cdd0c439509133f0d6ad865491b3866bcb6c071\",\n          \"skills/zyte/references/jobs.md\": \"08dc53261a06f55545a06e1311542225b74a51f5a5fd7969a36c5285e8f38820\",\n          \"skills/zyte/references/periodic-jobs.md\": \"e685df6289ae2e987f68308fe34e30eee48dd1f035e58bca278fccba55566550\",\n          \"skills/zyte/references/pricing.md\": \"932e679831c2862d234316c3ad09355111c6ffdf8f0549f3b9dd7491707844f8\",\n          \"skills/zyte/references/scrapy-cloud.md\": \"ce91514246533a933c65531df94a911efcac2e50ee2153a0f17f66673f28c126\",\n          \"skills/zyte/references/usage-stats.md\": \"10870b3bf1418deb669f295bf7bd49ad90bc3291cff952ac1e2a548732fd0d57\",\n          \"skills/zyte/scripts/auth.py\": \"cbd314bd6ecc0f932179d331d00bfd6478772c7dc10aa390a4963a6a27958efb\",\n          \"skills/zyte/scripts/env_keys.py\": \"5f89d4ed968b76dc50f04327d37edf36c208ce8e282b1d2d2321d0c487a552a6\",\n          \"skills/zyte/scripts/oauth.py\": \"2ac970e4550c5b2f9ca3d2c69146ae3a640cac223b15ff0a3e62070f420476ef\",\n          \"skills/zyte/scripts/project_org_lookup.py\": \"bb1811a264af722046eebdf764cb557753f7cd94c5c9ce980cc8a5dc10ec6ce7\",\n          \"skills/zyte/scripts/scrapy_cloud_api.py\": \"0523e0f9a74ef0c01c61167be749b539406f0c1440bac856b1dc6daa5a191972\",\n          \"skills/zyte/scripts/stack_tags.py\": \"f195151a5ab6fd3660031510a914d646039ffbfed4bae089f31a402337f043c1\",\n          \"skills/zyte/scripts/wait_for_job.py\": \"dd3b3bfb9378fcca027c65dcd5e540b19a350ee1773a26fd94cfc6fd920a3f56\",\n          \"skills/zyte/scripts/zyte_api_stats.py\": \"a738b25717f2a0ce2f21d34d686dcd567d82c6a94b9cb96cdf3628be2bb6c185\"\n        }\n      }\n    ],\n    \"hooks\": [\n      {\n        \"path\": \"hooks/hooks.json\",\n        \"sha256\": \"cfee65a2afa5cd9a68b07998767096cc47fc3f51efa604c6819de15d05b79829\",\n        \"event\": \"Stop\",\n        \"matcher\": \"*\",\n        \"declaration\": {\n          \"type\": \"command\",\n          \"command\": \"uv\",\n          \"args\": [\n            \"run\",\n            \"--no-project\",\n            \"${CLAUDE_PLUGIN_ROOT}/skills/scrape/scripts/feedback_state.py\",\n            \"hook\",\n            \"--source\",\n            \"claude_code\"\n          ]\n        },\n        \"executed\": false\n      }\n    ],\n    \"executions\": []\n  }\n}"
  },
  "review_input": {
    "identity_artifact": "identity.json",
    "evidence_sha256": {
      "LOCK.json": "6f6c32a51547bf2f994447f16339d7ecd87e3e3c4045f28df35471e85ad96a9a",
      "commands.json": "dc194ed083cfb3255be542c30f2b72c4474a7d53985134efa08e1ada29e1b645",
      "complete.json": "91b504b43905fdc009504d516c45eea831f39a1995b9e7d69987c9756c936d6f",
      "identity.json": "9a0632c3557146b1b5f0e576a58307a67c62ad48c4b3d05b44cfe55625a7d10f",
      "listing.json": "ddf3b64a38b96f1397615d5c2cee4264e7205382b4c05e3eac227139368886de",
      "selection.json": "41766fd4a9c6175d70545cb5ea218f02b12fe89c6528308986313c43799abc62"
    },
    "claims": [
      {
        "id": "acquired",
        "field": "summary",
        "text": "Pinned source declarations and file hashes were listed.",
        "sources": [
          "LOCK.json",
          "listing.json",
          "commands.json"
        ]
      },
      {
        "id": "listed",
        "field": "outcome",
        "text": "Listed 1 hook declaration. Ran 67 git commands; each one's exit status and output hash is in commands.json. Scope: acquisition and static inspection.",
        "sources": [
          "LOCK.json",
          "listing.json",
          "commands.json"
        ]
      },
      {
        "id": "tree",
        "field": "rule_results.0",
        "text": "The retained source tree matches its acquisition manifest.",
        "sources": [
          "LOCK.json",
          "listing.json",
          "commands.json"
        ]
      },
      {
        "id": "declared",
        "field": "rule_results.1",
        "text": "Declared hook names (listing.json): Stop",
        "sources": [
          "LOCK.json",
          "listing.json",
          "commands.json"
        ]
      }
    ]
  },
  "review": {
    "kind": "machine-checked",
    "date": "2026-10-20",
    "reviewed_sha256": "d0c58712561b0d596c2d63d7154cf5efbf0450b88f7ee2b9cdc0e7d09d38dace",
    "gates": "eeb5187b68d35faad9b3a40bbb64cb2a8f04306afd36c33d0ba81c9d9a237973",
    "codex": "1b045dc0d843d8e168cf1e4ef86036cadd7fcd183dbdfa5939e13d8105e241d7",
    "grok": "c92e174ea5d9dc96c99134b118e929ac5eedf2eb7592095351b8f0a9569b3e4f",
    "summary": "Deterministic gates passed; every claim rebuilt from evidence with a reviewed template; Grok reported no standing refutation."
  }
}
