[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6NKA060TY0HT8JW2QZ1DK1Q":3,"skill-same:01M6NKA060TY0HT8JW2QZ1DK1Q":50},{"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":22,"linkOnly":23,"markdownContent":24,"markdownBody":25,"frontMatter":26,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":33,"ownerDescription":34,"updatedAt":35,"install":36,"resources":49},"01M6NKA060TY0HT8JW2QZ1DK1Q","add-synthesis-fixture",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\u002Fadd-synthesis-fixture\u002FSKILL.md",[],[18,19,20,21],"Synthesis","fixture","add","add synthesis fixture","2026-11-10 10:12:30",false,"---\nname: add-synthesis-fixture\ndescription: \"\n  Add or update entries in synthesis fixtures while keeping output-docs.json,\n  output-tooling.json, and output.json consistent. Use when extend the\n  synthesis schema, add a new artifact type to synthesis, synthesis fixture\n  needs updating, or add a new skill entry to test write_artifacts. Do NOT\n  use for findings fixtures — use fixture-sync for those.\n---\n\n## Before You Start\n\n- `tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json` — Pass 1 output (CLAUDE.md content)\n- `tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json` — Pass 2 output (skills, hooks, MCP)\n- `tests\u002Ffixtures\u002Fsynthesis\u002Foutput.json` — derived merged file (DO NOT edit directly)\n- `schemas\u002Fsynthesis-docs.json` and `schemas\u002Fsynthesis-tooling.json` — the output contracts\n- `tests\u002Funit\u002Fmerge.bats` — tests that read from `output.json` directly\n\n## Critical Rule\n\n`output.json` is a **derived file** — it is the `jq -s '.[0] * .[1]'` merge of `output-docs.json` and `output-tooling.json`. Never edit `output.json` directly. After any change to either pass fixture, always re-merge.\n\n## Steps\n\n### 1. Identify which pass owns the new field\n\n- **Pass 1 (`output-docs.json`)**: CLAUDE.md root content, subdirectory CLAUDE.md files\n- **Pass 2 (`output-tooling.json`)**: skills, hooks, subagents, mcp_servers, settings_hooks\n\n### 2. Edit the appropriate pass fixture\n\nSkill entries in `output-tooling.json` must have:\n- No angle brackets in description fields\n- `name` in kebab-case\n- Valid SKILL.md content as a JSON string (use `\\n` for newlines)\n\nExample skill entry:\n\n```json\n{\n  \"name\": \"my-skill\",\n  \"description\": \"Does something specific to this project. Use when...\",\n  \"content\": \"---\\nname: my-skill\\ndescription: >\\n  Does something specific. Use when...\\n  Do NOT use for...\\n---\\n\\n## Before You Start\\n...\"\n}\n```\n\nHook entries must maintain the 1:1 hooks-to-settings_hooks relationship:\n\n```json\n\u002F\u002F In hooks[]\n{\"filename\": \"check.sh\", \"event\": \"PostToolUse\", \"description\": \"...\", \"content\": \"#!\u002Fusr\u002Fbin\u002Fenv bash\\n...\"}\n\n\u002F\u002F Matching entry in settings_hooks[]\n{\"event\": \"PostToolUse\", \"matcher\": \"Write\", \"command\": \".claude\u002Fhooks\u002Fcheck.sh\"}\n```\n\n### 3. Re-merge output.json\n\nAfter editing either pass fixture:\n\n```bash\njq -s '.[0] * .[1]' \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json \\\n    > tests\u002Ffixtures\u002Fsynthesis\u002Foutput.json\n```\n\n### 4. Verify no angle brackets in descriptions\n\n```bash\ngrep -n '[\u003C>]' tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json | head -20\n```\n\nAngle brackets in skill\u002Fsubagent descriptions will cause `validate-skill.sh` to fail, and `postprocess_descriptions()` in `lib\u002Fsynthesize.sh` will silently replace them at runtime — meaning the fixture diverges from what production produces.\n\n### 5. Update dependent test assertions\n\nCheck `tests\u002Funit\u002Fmerge.bats` and `tests\u002Fintegration\u002Fsynthesize_phase.bats` for assertions on skill count, specific field values, or hook count that may need updating.\n\n### 6. Verify the claude_md padding in output-docs.json\n\nThe `claude_md` field contains deliberate padding lines to exceed the 100-line minimum for `validate_claude_md` checks. Do NOT trim it:\n\n```bash\necho \"$(jq -r '.claude_md' tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json | wc -l) lines\"\n# Must be >= 100\n```\n\n## Verify\n\n```bash\nmake test-unit\nmake test-integration\n```\n\n## Common Mistakes\n\n1. **Editing `output.json` directly** — it gets overwritten on the next merge. Always edit the pass fixture and re-merge.\n\n2. **Using `make_claude_envelope` on `output.json`** — unit tests copy `output.json` raw into `$WORK_DIR\u002Fsynthesis\u002F`; integration tests wrap `output-docs.json` and `output-tooling.json` with `make_claude_envelope`. Using the wrong combination causes silent `null` extractions.\n","## Before You Start\n\n- `tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json` — Pass 1 output (CLAUDE.md content)\n- `tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json` — Pass 2 output (skills, hooks, MCP)\n- `tests\u002Ffixtures\u002Fsynthesis\u002Foutput.json` — derived merged file (DO NOT edit directly)\n- `schemas\u002Fsynthesis-docs.json` and `schemas\u002Fsynthesis-tooling.json` — the output contracts\n- `tests\u002Funit\u002Fmerge.bats` — tests that read from `output.json` directly\n\n## Critical Rule\n\n`output.json` is a **derived file** — it is the `jq -s '.[0] * .[1]'` merge of `output-docs.json` and `output-tooling.json`. Never edit `output.json` directly. After any change to either pass fixture, always re-merge.\n\n## Steps\n\n### 1. Identify which pass owns the new field\n\n- **Pass 1 (`output-docs.json`)**: CLAUDE.md root content, subdirectory CLAUDE.md files\n- **Pass 2 (`output-tooling.json`)**: skills, hooks, subagents, mcp_servers, settings_hooks\n\n### 2. Edit the appropriate pass fixture\n\nSkill entries in `output-tooling.json` must have:\n- No angle brackets in description fields\n- `name` in kebab-case\n- Valid SKILL.md content as a JSON string (use `\\n` for newlines)\n\nExample skill entry:\n\n```json\n{\n  \"name\": \"my-skill\",\n  \"description\": \"Does something specific to this project. Use when...\",\n  \"content\": \"---\\nname: my-skill\\ndescription: >\\n  Does something specific. Use when...\\n  Do NOT use for...\\n---\\n\\n## Before You Start\\n...\"\n}\n```\n\nHook entries must maintain the 1:1 hooks-to-settings_hooks relationship:\n\n```json\n\u002F\u002F In hooks[]\n{\"filename\": \"check.sh\", \"event\": \"PostToolUse\", \"description\": \"...\", \"content\": \"#!\u002Fusr\u002Fbin\u002Fenv bash\\n...\"}\n\n\u002F\u002F Matching entry in settings_hooks[]\n{\"event\": \"PostToolUse\", \"matcher\": \"Write\", \"command\": \".claude\u002Fhooks\u002Fcheck.sh\"}\n```\n\n### 3. Re-merge output.json\n\nAfter editing either pass fixture:\n\n```bash\njq -s '.[0] * .[1]' \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json \\\n    tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json \\\n    > tests\u002Ffixtures\u002Fsynthesis\u002Foutput.json\n```\n\n### 4. Verify no angle brackets in descriptions\n\n```bash\ngrep -n '[\u003C>]' tests\u002Ffixtures\u002Fsynthesis\u002Foutput-tooling.json | head -20\n```\n\nAngle brackets in skill\u002Fsubagent descriptions will cause `validate-skill.sh` to fail, and `postprocess_descriptions()` in `lib\u002Fsynthesize.sh` will silently replace them at runtime — meaning the fixture diverges from what production produces.\n\n### 5. Update dependent test assertions\n\nCheck `tests\u002Funit\u002Fmerge.bats` and `tests\u002Fintegration\u002Fsynthesize_phase.bats` for assertions on skill count, specific field values, or hook count that may need updating.\n\n### 6. Verify the claude_md padding in output-docs.json\n\nThe `claude_md` field contains deliberate padding lines to exceed the 100-line minimum for `validate_claude_md` checks. Do NOT trim it:\n\n```bash\necho \"$(jq -r '.claude_md' tests\u002Ffixtures\u002Fsynthesis\u002Foutput-docs.json | wc -l) lines\"\n# Must be >= 100\n```\n\n## Verify\n\n```bash\nmake test-unit\nmake test-integration\n```\n\n## Common Mistakes\n\n1. **Editing `output.json` directly** — it gets overwritten on the next merge. Always edit the pass fixture and re-merge.\n\n2. **Using `make_claude_envelope` on `output.json`** — unit tests copy `output.json` raw into `$WORK_DIR\u002Fsynthesis\u002F`; integration tests wrap `output-docs.json` and `output-tooling.json` with `make_claude_envelope`. Using the wrong combination causes silent `null` extractions.\n",{},"main","197708b955e457c87d304fdf3389621f7e2f202a",".claude\u002Fskills\u002Fadd-synthesis-fixture",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":37,"prompt":47,"zipAvailable":48},[38,41,44],{"tool":39,"command":40},"npx","npx skills add joelbarmettlerUZH\u002Fultrainit.sh --skill add-synthesis-fixture",{"tool":42,"command":43},"bunx","bunx skills add joelbarmettlerUZH\u002Fultrainit.sh --skill add-synthesis-fixture",{"tool":45,"command":46},"pnpm","pnpm dlx skills add joelbarmettlerUZH\u002Fultrainit.sh --skill add-synthesis-fixture","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fadd-synthesis-fixture\u002FSKILL.md",true,[],[51,85,95,110,120,129],{"skillNo":52,"name":53,"nameZh":6,"description":54,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":65,"publishedAt":22},"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",[57,62],{"categoryNo":58,"categoryName":59,"taxonomyType":60,"taxonomyTypeDesc":61},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",{"categoryNo":63,"categoryName":64,"taxonomyType":60,"taxonomyTypeDesc":61},"01JBSEEDCAT000000000000023","Skill与智能体开发",[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],"valid","valid skill","endpoints","request","do","route","creation","pages","middleware","frontend components","for","wiring","static","use","src","api","validation","components","frontend",{"skillNo":86,"name":87,"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":88,"categories":89,"keywords":91,"publishedAt":22},"01M6NKEAC2NAMBFHT0S0PRYQKN","invalid-skill-no-desc","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fskills\u002Finvalid-skill-no-desc\u002FSKILL.md",[90],{"categoryNo":63,"categoryName":64,"taxonomyType":60,"taxonomyTypeDesc":61},[92,93,94],"invalid skill no desc","invalid","invalid skill",{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":102,"publishedAt":22},"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",[101],{"categoryNo":63,"categoryName":64,"taxonomyType":60,"taxonomyTypeDesc":61},[103,104,105,93,94,106,107,76,108,70,79,109],"invalid skill angle brackets","angle brackets","brackets","component","things","with","templates",{"skillNo":111,"name":112,"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":113,"categories":114,"keywords":115,"publishedAt":22},"01M6NKE4EJ5EWNN7S5FJ1SFZR5","validate-generated-artifact","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.ultrainit\u002Fvalidation\u002Fskills\u002Fvalidate-generated-artifact\u002FSKILL.md",[],[116,117,118,119],"validate generated artifact","artifact","generated","validate",{"skillNo":121,"name":122,"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":123,"categories":124,"keywords":125,"publishedAt":22},"01M6NKE157C519F1W8WHGXPRTK","tune-synthesis-context","https:\u002F\u002Fgithub.com\u002FjoelbarmettlerUZH\u002Fultrainit.sh\u002Fblob\u002Fmain\u002F.ultrainit\u002Fvalidation\u002Fskills\u002Ftune-synthesis-context\u002FSKILL.md",[],[126,127,18,128],"tune synthesis context","tune","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":22},"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"]