[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6NKASMXJ2RGB9F7J4APR3ZD":3,"skill-same:01M6NKASMXJ2RGB9F7J4APR3ZD":49},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":21,"linkOnly":22,"markdownContent":23,"markdownBody":24,"frontMatter":25,"refName":26,"commitSha":27,"skillDirectory":28,"forksCount":29,"repositoryHtmlUrl":30,"repositoryHomepageUrl":6,"ownerHtmlUrl":31,"ownerBlogUrl":32,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M6NKASMXJ2RGB9F7J4APR3ZD","fixture-sync",null,"joelbarmettlerUZH\u002Fultrainit.sh","joelbarmettlerUZH","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F24369532?v=4","01M6NK9DS0035TVQP3EQ36E14N","Joel Barmettler","01M6NK9DXBM5D1GYV4414HX06T",8,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffixture-sync\u002FSKILL.md",[],[18,19,20],"sync","fixture","fixture sync","2026-11-10 10:12:30",false,"---\nname: fixture-sync\ndescription: \"\n  Validate all tests\u002Ffixtures\u002Ffindings\u002F JSON files against their corresponding\n  schemas\u002F files, report mismatches, and optionally fix them. Use when\n  fixtures are out of sync, schema was updated, fixture has wrong field\n  names, tests pass against wrong data, or adding a new schema constraint.\n  Do NOT use for synthesis fixtures — use add-synthesis-fixture for those.\n---\n\n## Before You Start\n\n- `tests\u002Ffixtures\u002Ffindings\u002F` — 8 fixture files, one per Phase 1 agent\n- `schemas\u002F` — 14 JSON schema files; the 8 relevant ones match by base name\n- `tests\u002Ffixtures\u002FCLAUDE.md` — documents the 5 known schema violations in current fixtures\n\n## Known Violations\n\nFive of eight current fixtures violate their schemas. These are documented and intentional — no runtime schema validation exists in `agent.sh`. Proceed only if you are intentionally fixing drift:\n\n| Fixture | Known Violation |\n|---------|----------------|\n| `patterns.json` | `type: 'design'` is not in the schema's enum |\n| `tooling.json` | Missing required `purpose` field |\n| `git-forensics.json` | Uses `path` where schema expects `file`; missing `commit_patterns.example_messages` |\n| `structure-scout.json` | Invalid `role` strings; extra `total_files`\u002F`total_directories` fields |\n\n## Steps\n\n### 1. Check which fixtures have required-field violations\n\n```bash\nfor agent in identity commands git-forensics patterns tooling docs-scanner security-scan structure-scout; do\n    fixture=\"tests\u002Ffixtures\u002Ffindings\u002F${agent}.json\"\n    schema=\"schemas\u002F${agent}.json\"\n    if [[ ! -f \"$fixture\" || ! -f \"$schema\" ]]; then\n        echo \"MISSING: $agent\"\n        continue\n    fi\n    # Check required fields\n    required=$(jq -r '.required[]?' \"$schema\" 2>\u002Fdev\u002Fnull)\n    for field in $required; do\n        present=$(jq -e \".${field}\" \"$fixture\" 2>\u002Fdev\u002Fnull && echo yes || echo no)\n        if [[ \"$present\" == \"no\" ]]; then\n            echo \"MISSING REQUIRED: $agent.$field\"\n        fi\n    done\ndone\n```\n\n### 2. Check for additionalProperties violations\n\n```bash\nfor agent in identity commands git-forensics patterns tooling docs-scanner security-scan structure-scout; do\n    fixture=\"tests\u002Ffixtures\u002Ffindings\u002F${agent}.json\"\n    schema=\"schemas\u002F${agent}.json\"\n    fixture_keys=$(jq -r 'keys[]' \"$fixture\" 2>\u002Fdev\u002Fnull | sort)\n    schema_keys=$(jq -r '.properties | keys[]' \"$schema\" 2>\u002Fdev\u002Fnull | sort)\n    extra=$(comm -23 \u003C(echo \"$fixture_keys\") \u003C(echo \"$schema_keys\"))\n    if [[ -n \"$extra\" ]]; then\n        echo \"EXTRA FIELDS in $agent: $extra\"\n    fi\ndone\n```\n\n### 3. Check enum values\n\nFor fields with enum constraints (particularly `patterns.json` type and `structure-scout.json` role):\n\n```bash\n# Check patterns.json type values\njq -r '.patterns[].type' tests\u002Ffixtures\u002Ffindings\u002Fpatterns.json | sort -u\n# Compare against schema enum:\njq -r '.properties.patterns.items.properties.type.enum[]' schemas\u002Fpatterns.json | sort\n```\n\n### 4. Fix a fixture\n\nWhen fixing, use real values — never hand-craft values. Capture from real claude output if possible:\n\n```bash\n# Option A: Minimal fix — add missing required field\njq '.findings[0] += {\"purpose\": \"example purpose\"}' \\\n    tests\u002Ffixtures\u002Ffindings\u002Ftooling.json > \u002Ftmp\u002Ffixed.json\nmv \u002Ftmp\u002Ffixed.json tests\u002Ffixtures\u002Ffindings\u002Ftooling.json\n\n# Option B: Replace invalid enum value\njq '.patterns[].type |= if . == \"design\" then \"architecture\" else . end' \\\n    tests\u002Ffixtures\u002Ffindings\u002Fpatterns.json > \u002Ftmp\u002Ffixed.json\nmv \u002Ftmp\u002Ffixed.json tests\u002Ffixtures\u002Ffindings\u002Fpatterns.json\n```\n\n### 5. Verify tests still pass after fixing\n\n```bash\nmake test-unit\nmake test-integration\n```\n\nFixing a schema violation can break existing tests if a test was asserting on the (incorrect) current value. Update the assertion alongside the fixture.\n\n## Verify\n\n```bash\n# All fixtures are valid JSON\nfor f in tests\u002Ffixtures\u002Ffindings\u002F*.json; do jq empty \"$f\" && echo \"OK: $f\"; done\n\n# Run tests\nmake test-unit\n```\n\n## Common Mistakes\n\n1. **Hand-crafting fixture values** — the `tests\u002Ffixtures\u002FCLAUDE.md` rule says to capture real `claude -p --output-format json` output. Hand-crafted fixtures can make tests pass against data that real Claude would never produce.\n\n2. **Fixing a fixture without updating dependent tests** — some unit tests assert on specific fixture field values. If you fix `patterns.json`'s type enum, find any test that asserts `type: 'design'` and update it too.\n","## Before You Start\n\n- `tests\u002Ffixtures\u002Ffindings\u002F` — 8 fixture files, one per Phase 1 agent\n- `schemas\u002F` — 14 JSON schema files; the 8 relevant ones match by base name\n- `tests\u002Ffixtures\u002FCLAUDE.md` — documents the 5 known schema violations in current fixtures\n\n## Known Violations\n\nFive of eight current fixtures violate their schemas. These are documented and intentional — no runtime schema validation exists in `agent.sh`. Proceed only if you are intentionally fixing drift:\n\n| Fixture | Known Violation |\n|---------|----------------|\n| `patterns.json` | `type: 'design'` is not in the schema's enum |\n| `tooling.json` | Missing required `purpose` field |\n| `git-forensics.json` | Uses `path` where schema expects `file`; missing `commit_patterns.example_messages` |\n| `structure-scout.json` | Invalid `role` strings; extra `total_files`\u002F`total_directories` fields |\n\n## Steps\n\n### 1. Check which fixtures have required-field violations\n\n```bash\nfor agent in identity commands git-forensics patterns tooling docs-scanner security-scan structure-scout; do\n    fixture=\"tests\u002Ffixtures\u002Ffindings\u002F${agent}.json\"\n    schema=\"schemas\u002F${agent}.json\"\n    if [[ ! -f \"$fixture\" || ! -f \"$schema\" ]]; then\n        echo \"MISSING: $agent\"\n        continue\n    fi\n    # Check required fields\n    required=$(jq -r '.required[]?' \"$schema\" 2>\u002Fdev\u002Fnull)\n    for field in $required; do\n        present=$(jq -e \".${field}\" \"$fixture\" 2>\u002Fdev\u002Fnull && echo yes || echo no)\n        if [[ \"$present\" == \"no\" ]]; then\n            echo \"MISSING REQUIRED: $agent.$field\"\n        fi\n    done\ndone\n```\n\n### 2. Check for additionalProperties violations\n\n```bash\nfor agent in identity commands git-forensics patterns tooling docs-scanner security-scan structure-scout; do\n    fixture=\"tests\u002Ffixtures\u002Ffindings\u002F${agent}.json\"\n    schema=\"schemas\u002F${agent}.json\"\n    fixture_keys=$(jq -r 'keys[]' \"$fixture\" 2>\u002Fdev\u002Fnull | sort)\n    schema_keys=$(jq -r '.properties | keys[]' \"$schema\" 2>\u002Fdev\u002Fnull | sort)\n    extra=$(comm -23 \u003C(echo \"$fixture_keys\") \u003C(echo \"$schema_keys\"))\n    if [[ -n \"$extra\" ]]; then\n        echo \"EXTRA FIELDS in $agent: $extra\"\n    fi\ndone\n```\n\n### 3. Check enum values\n\nFor fields with enum constraints (particularly `patterns.json` type and `structure-scout.json` role):\n\n```bash\n# Check patterns.json type values\njq -r '.patterns[].type' tests\u002Ffixtures\u002Ffindings\u002Fpatterns.json | sort -u\n# Compare against schema enum:\njq -r '.properties.patterns.items.properties.type.enum[]' schemas\u002Fpatterns.json | sort\n```\n\n### 4. Fix a fixture\n\nWhen fixing, use real values — never hand-craft values. Capture from real claude output if possible:\n\n```bash\n# Option A: Minimal fix — add missing required field\njq '.findings[0] += {\"purpose\": \"example purpose\"}' \\\n    tests\u002Ffixtures\u002Ffindings\u002Ftooling.json > \u002Ftmp\u002Ffixed.json\nmv \u002Ftmp\u002Ffixed.json tests\u002Ffixtures\u002Ffindings\u002Ftooling.json\n\n# Option B: Replace invalid enum value\njq '.patterns[].type |= if . == \"design\" then \"architecture\" else . end' \\\n    tests\u002Ffixtures\u002Ffindings\u002Fpatterns.json > \u002Ftmp\u002Ffixed.json\nmv \u002Ftmp\u002Ffixed.json tests\u002Ffixtures\u002Ffindings\u002Fpatterns.json\n```\n\n### 5. Verify tests still pass after fixing\n\n```bash\nmake test-unit\nmake test-integration\n```\n\nFixing a schema violation can break existing tests if a test was asserting on the (incorrect) current value. Update the assertion alongside the fixture.\n\n## Verify\n\n```bash\n# All fixtures are valid JSON\nfor f in tests\u002Ffixtures\u002Ffindings\u002F*.json; do jq empty \"$f\" && echo \"OK: $f\"; done\n\n# Run tests\nmake test-unit\n```\n\n## Common Mistakes\n\n1. **Hand-crafting fixture values** — the `tests\u002Ffixtures\u002FCLAUDE.md` rule says to capture real `claude -p --output-format json` output. Hand-crafted fixtures can make tests pass against data that real Claude would never produce.\n\n2. **Fixing a fixture without updating dependent tests** — some unit tests assert on specific fixture field values. If you fix `patterns.json`'s type enum, find any test that asserts `type: 'design'` and update it too.\n",{},"main","197708b955e457c87d304fdf3389621f7e2f202a",".claude\u002Fskills\u002Ffixture-sync",1,"https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH","https:\u002F\u002Fjoelbarmettler.xyz","M. Sc. Artificial Intelligence \r\n& Senior A.I. Architect","2026-11-02 02:33:53",{"source":7,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add joelbarmettlerUZH\u002Fultrainit.sh --skill fixture-sync",{"tool":41,"command":42},"bunx","bunx skills add joelbarmettlerUZH\u002Fultrainit.sh --skill fixture-sync",{"tool":44,"command":45},"pnpm","pnpm dlx skills add joelbarmettlerUZH\u002Fultrainit.sh --skill fixture-sync","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffixture-sync\u002FSKILL.md",true,[],[50,84,94,109,119,129],{"skillNo":51,"name":52,"nameZh":6,"description":53,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":54,"categories":55,"keywords":64,"publishedAt":21},"01M6NKEDBGZBAT592SECRS8E4N","valid-skill","Use when building or modifying API endpoints in src\u002Fapi\u002F. Covers route creation, middleware wiring, and request validation. Do NOT use for frontend components or static pages.","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Fvalid-skill\u002FSKILL.md",[56,61],{"categoryNo":57,"categoryName":58,"taxonomyType":59,"taxonomyTypeDesc":60},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":62,"categoryName":63,"taxonomyType":59,"taxonomyTypeDesc":60},"01JBSEEDCAT000000000000023","Skill与智能体开发",[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83],"valid","valid skill","endpoints","request","do","route","creation","pages","middleware","frontend components","for","wiring","static","use","src","api","validation","components","frontend",{"skillNo":85,"name":86,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":90,"publishedAt":21},"01M6NKEAC2NAMBFHT0S0PRYQKN","invalid-skill-no-desc","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Finvalid-skill-no-desc\u002FSKILL.md",[89],{"categoryNo":62,"categoryName":63,"taxonomyType":59,"taxonomyTypeDesc":60},[91,92,93],"invalid skill no desc","invalid","invalid skill",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":101,"publishedAt":21},"01M6NKE7MF1YCS3WCQA5AY3ZXP","invalid-skill-angle-brackets","Use when working with \u003Ccomponent> templates. Do NOT use for \u003Cother> things.","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Finvalid-skill-angle-brackets\u002FSKILL.md",[100],{"categoryNo":62,"categoryName":63,"taxonomyType":59,"taxonomyTypeDesc":60},[102,103,104,92,93,105,106,75,107,69,78,108],"invalid skill angle brackets","angle brackets","brackets","component","things","with","templates",{"skillNo":110,"name":111,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":21},"01M6NKE4EJ5EWNN7S5FJ1SFZR5","validate-generated-artifact","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.ultrainit\u002Fvalidation\u002Fskills\u002Fvalidate-generated-artifact\u002FSKILL.md",[],[115,116,117,118],"validate generated artifact","artifact","generated","validate",{"skillNo":120,"name":121,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":21},"01M6NKE157C519F1W8WHGXPRTK","tune-synthesis-context","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.ultrainit\u002Fvalidation\u002Fskills\u002Ftune-synthesis-context\u002FSKILL.md",[],[125,126,127,128],"tune synthesis context","tune","Synthesis","context",{"skillNo":130,"name":131,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":132,"categories":133,"keywords":134,"publishedAt":21},"01M6NKDT0VD32KKE2HTHT30FWH","run-tests","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.ultrainit\u002Fvalidation\u002Fskills\u002Frun-tests\u002FSKILL.md",[],[135,136,137],"run","run tests","tests"]