[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6C5DQBJMVVC05DN3WG8N6MP":3,"skill-same:01M6C5DQBJMVVC05DN3WG8N6MP":99},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6C5DQBJMVVC05DN3WG8N6MP","blueprint-adr-validate",null,"Validate ADR relationships, domain consistency, and duplicate ADR numbers. Use when auditing ADRs before release, finding broken supersedes\u002Fextends links, cycles, or number collisions.","laurigates\u002Fclaude-plugins","laurigates","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F13014001?v=4","01M6C59YHWS9C7KMXKSRX1YXNP","Lauri Gates","01M6C59YP2APG9YAM4DWYQYGFJ",59,"MIT","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fblueprint-plugin\u002Fskills\u002Fblueprint-adr-validate\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"adr","validate","blueprint adr validate","Blueprint","adr relationships","2026","when","fixes","for","number","consistency","links","prompting","domain","only","use","edit","read","broken","grep","Bash","release","report","2026-11-10 10:12:30",false,"---\ncreated: 2026-01-15\nmodified: 2026-10-09\nreviewed: 2026-07-26\ndescription: Validate ADR relationships, domain consistency, and duplicate ADR numbers. Use when auditing ADRs before release, finding broken supersedes\u002Fextends links, cycles, or number collisions.\nargs: \"[--report-only]\"\nargument-hint: \"--report-only to validate without prompting for fixes\"\nallowed-tools: Read, Bash, Glob, Grep, Edit, AskUserQuestion\nname: blueprint-adr-validate\n---\n\n# \u002Fblueprint:adr-validate\n\nValidate Architecture Decision Records for relationship consistency, reference integrity, and domain conflicts.\n\n**Usage**: `\u002Fblueprint:adr-validate [--report-only]`\n\n## When to Use This Skill\n\n| Use this skill when... | Use alternative when... |\n|------------------------|-------------------------|\n| Maintaining ADR integrity before releases | Creating new ADRs (use `\u002Fblueprint:derive-plans`) |\n| Auditing after refactoring or changes | Quick one-time documentation review |\n| Regular documentation review process | General ADR reading |\n\n## Context\n\n- ADR directory exists: !`find . -path '*\u002Fdocs\u002Fadrs' -maxdepth 2 -type d`\n- ADR count: !`find . -path '*\u002Fdocs\u002Fadrs\u002F*' -name \"*.md\" -type f`\n- Domain-tagged ADRs: !`find . -path '*\u002Fdocs\u002Fadrs\u002F*' -maxdepth 3 -name '*.md' -exec grep -l \"^domain:\" {} +`\n- Flag: !`echo \"${1:---}\"`\n\n## Parameters\n\nParse `$ARGUMENTS`:\n\n- `--report-only`: Output validation report without prompting for fixes\n  - Default: Interactive mode with remediation options\n\n## Execution\n\nExecute complete ADR validation and remediation workflow:\n\n### Step 1: Discover all ADRs\n\n1. Check for ADR directory at `docs\u002Fadrs\u002F`\n2. If missing → Error: \"No ADRs found in docs\u002Fadrs\u002F\"\n3. Parse all ADR files: `ls docs\u002Fadrs\u002F*.md`\n4. Extract frontmatter for each ADR: number, id, created, modified, status, domain, supersedes, superseded-by, extends, relates-to\n\n### Step 2: Validate reference integrity\n\nFor each ADR, validate:\n\n1. **supersedes references**: Verify target exists, target status = \"Superseded\", target has reciprocal superseded-by\n2. **extends references**: Verify target exists, warn if target is \"Superseded\"\n3. **related references**: Verify all targets exist, warn if one-way links\n4. **self-references**: Flag if ADR references itself\n5. **circular chains**: Detect cycles in supersession graph\n6. **Cross-workspace references** (v3.3.0+, manifests with `workspaces.role`):\n   Recognise these reference forms in supersedes\u002Fextends\u002Frelated fields:\n   - `ADR-NNN` — local to the current workspace (existing behaviour).\n   - `\u003Cworkspace-path>\u002FADR-NNN` — points into a sibling\u002Fchild workspace. Resolve\n     by reading `\u003Cworkspace-path>\u002Fdocs\u002Fadrs\u002F` from the monorepo root. Warn if\n     the workspace is not listed in root `workspaces.children`.\n   - `\u002FADR-NNN` — points at the monorepo root's ADR set. Resolve using the\n     manifest's `workspaces.root_relative_path` (for child manifests) or the\n     current directory (for root manifests).\n   Unresolved cross-workspace refs are reported as warnings (not errors) so\n   they do not block validation during migration.\n\nSee [REFERENCE.md](REFERENCE.md#validation-rules) for detailed checks.\n\n### Step 2b: Detect ADR-number collisions and index drift\n\nADR numbers are chosen at branch time but only claimed at merge time, so two\nin-flight ADR PRs can pick the same number and both land (issue #1585 — the FVH\ninfrastructure #2015 collision where two ADRs both claimed `0038`). Run the\ndeterministic guard:\n\n```bash\nbash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fcheck-adr-numbers.sh --project-dir \"$(pwd)\"\n```\n\nIt emits `STATUS=` \u002F `REASON=` \u002F `ISSUE_COUNT=` and reports these\nclasses (see [REFERENCE.md](REFERENCE.md#validation-rules)):\n\n- `duplicate_adr_number` (ERROR) — two files claim the same number, by `NNNN-` \u002F `ADR-NNN-` **filename** or frontmatter `id: ADR-NNNN`. The message names the source (`basename` \u002F `frontmatter`).\n- `adr_number_collision` (ERROR) — a working-tree ADR claims a number a **different** file already holds on the base ref (`origin\u002Fmain`) — the pre-merge parallel-PR case, caught before the second PR merges.\n- `adr_registry_mismatch` (ERROR) — a file claims `ADR-NNNN` but the manifest `id_registry` maps that number to a different path. The registry is the only arbiter resolving id → path unambiguously: two files can both *say* `ADR-0016`, only one can be registered. Silent with no manifest \u002F no `id_registry`.\n- `adr_missing_index_row` (WARN) — an ADR is missing from the directory's README index (how the `0038` collision went unnoticed for a week). Repair via Step 2c instead of re-warning.\n- `adr_dir_unrecognized_naming` (WARN) — no ADR number recognised (#2822).\n\n**Multiple ADR directories** (issue #2129): the guard scans a directory *set* —\nthe real ADR-0016 collision had its claimants in `docs\u002Fadrs\u002F` and\n`docs\u002Fblueprint\u002Fadrs\u002F`, which a single-directory scan cannot see. Precedence:\nrepeatable `--adr-dir \u003Cdir>`, else `validation.adr_dirs` from the **shared**\n`validation` manifest block (issue #2128, read via\n`blueprint-plugin\u002Fscripts\u002Fget-validation-config.sh` — do not add a second config\nmechanism), else the default `docs\u002Fadrs` then `docs\u002Fadr` order. It emits\n`ADR_DIRS=` (TAB-separated) and `ADR_DIR_COUNT=`; `ADR_DIR=`, `ADR_COUNT=` and\n`INDEX=` keep their #1585 meanings.\n\nFold findings into the Step 4 report. `STATUS=ERROR` is a blocking collision:\nrenumber the newer ADR to the next free number (updating **both** its filename\nand its frontmatter `id:`), then regenerate the index (Step 2c).\n\n### Step 2c: Regenerate the ADR index\n\n`adr_missing_index_row` is repairable — the hand-maintained table is what\nrotted. Rebuild it from frontmatter:\n\n```bash\n# CI \u002F read-only gate: non-zero exit when the on-disk index is out of date\nbash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fgenerate-adr-index.sh --project-dir \"$(pwd)\" --check\n\n# Repair: rewrite the table in every resolved ADR directory\nbash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fgenerate-adr-index.sh --project-dir \"$(pwd)\"\n```\n\nOnly the block between two marker comments is rewritten, so prose around it\nsurvives:\n\n```markdown\n\u003C!-- ADR-INDEX:START -->\n| ADR | Title | Status |\n| --- | ----- | ------ |\n| [ADR-0016](0016-in-engine-ui.md) | In-engine UI | Accepted |\n\u003C!-- ADR-INDEX:END -->\n```\n\nOne index per directory (`--index-file` overrides the `README.md` default), over\nthe same directory set and widened number collection as Step 2b — so an ADR\nnumbered only in frontmatter still gets a row. `--check` states per directory:\n\n| State | Severity | Meaning |\n|-------|----------|---------|\n| `in_sync` | OK | On-disk block matches the generated one |\n| `drifted` | ERROR (exit 1) | Regenerate — the index is stale |\n| `markers_absent` | WARN (exit 0) | No marker pair yet; a write adopts them. Deliberately **not** a diff |\n| `index_absent` | WARN (exit 0) | No index file yet; a write creates one |\n| `no_adrs` | OK | Directory holds no numbered ADRs |\n\nWrite mode reports `written` \u002F `unchanged` \u002F `markers_inserted` \u002F\n`index_created`. When markers land in a README that already had a hand-written\ntable, delete that table — the generated block is authoritative.\n\n### Step 3: Analyze domains\n\n1. Group ADRs by domain field\n2. For each domain with multiple \"Accepted\" ADRs → potential conflict flag\n3. List untagged ADRs (not errors, but recommendations)\n\n### Step 4: Generate validation report\n\nCompile comprehensive report showing:\n- Summary: Total ADRs, domain-tagged %, relationship counts, status breakdown\n- Reference integrity: Supersedes, extends, related status (✅\u002F⚠️\u002F❌)\n- Errors found: Broken references, self-references, cycles\n- Warnings: Outdated extensions, one-way links\n- Domain analysis: Conflicts and untagged ADRs\n\n### Step 5: Handle --report-only flag\n\nIf `--report-only` flag present:\n1. Output validation report from Step 4\n2. Exit without prompting for fixes\n\n### Step 6: Prompt for remediation (if interactive mode)\n\nAsk user action via AskUserQuestion:\n- Fix all automatically (update status, add reciprocal links)\n- Review each issue individually\n- Export report to `docs\u002Fadrs\u002Fvalidation-report.md`\n- Skip for now\n\nExecute based on selection (see [REFERENCE.md](REFERENCE.md#remediation-procedures)).\n\n### Step 7: Update task registry\n\nUpdate the task registry entry in `docs\u002Fblueprint\u002Fmanifest.json`:\n\n```bash\njq --arg now \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" \\\n  --arg result \"${VALIDATION_RESULT:-success}\" \\\n  --argjson processed \"${ADRS_VALIDATED:-0}\" \\\n  '.task_registry[\"adr-validate\"].last_completed_at = $now |\n   .task_registry[\"adr-validate\"].last_result = $result |\n   .task_registry[\"adr-validate\"].stats.runs_total = ((.task_registry[\"adr-validate\"].stats.runs_total \u002F\u002F 0) + 1) |\n   .task_registry[\"adr-validate\"].stats.items_processed = $processed' \\\n  docs\u002Fblueprint\u002Fmanifest.json > tmp.json && mv tmp.json docs\u002Fblueprint\u002Fmanifest.json\n```\n\nWhere `VALIDATION_RESULT` is \"success\", \"{N} warnings\", or \"failed: {reason}\".\n\n### Step 8: Report changes and summary\n\nReport all changes made:\n- Updated ADRs (status changes, added links)\n- Remaining issues count\n- Next steps recommendation\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Check ADR directory | `test -d docs\u002Fadrs && echo \"YES\" \\|\\| echo \"NO\"` |\n| Count ADRs | `ls docs\u002Fadrs\u002F*.md 2>\u002Fdev\u002Fnull \\| wc -l` |\n| Extract frontmatter | `head -50 {file} \\| grep -m1 \"^field:\" \\| sed 's\u002F^[^:]*:[[:space:]]*\u002F\u002F'` |\n| Find by domain | `grep -l \"^domain: {domain}\" docs\u002Fadrs\u002F*.md` |\n| Detect cycles | Build supersession graph and traverse |\n| Number collisions | `bash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fcheck-adr-numbers.sh --project-dir \"$(pwd)\"` |\n| Two ADR dirs | `… \u002Fcheck-adr-numbers.sh --adr-dir docs\u002Fadrs --adr-dir docs\u002Fblueprint\u002Fadrs` |\n| Index drift gate (CI) | `bash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fgenerate-adr-index.sh --check` |\n| Regenerate index | `bash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fgenerate-adr-index.sh` |\n\n---\n\nFor validation rules, remediation procedures, and report format details, see [REFERENCE.md](REFERENCE.md).\n","# \u002Fblueprint:adr-validate\n\nValidate Architecture Decision Records for relationship consistency, reference integrity, and domain conflicts.\n\n**Usage**: `\u002Fblueprint:adr-validate [--report-only]`\n\n## When to Use This Skill\n\n| Use this skill when... | Use alternative when... |\n|------------------------|-------------------------|\n| Maintaining ADR integrity before releases | Creating new ADRs (use `\u002Fblueprint:derive-plans`) |\n| Auditing after refactoring or changes | Quick one-time documentation review |\n| Regular documentation review process | General ADR reading |\n\n## Context\n\n- ADR directory exists: !`find . -path '*\u002Fdocs\u002Fadrs' -maxdepth 2 -type d`\n- ADR count: !`find . -path '*\u002Fdocs\u002Fadrs\u002F*' -name \"*.md\" -type f`\n- Domain-tagged ADRs: !`find . -path '*\u002Fdocs\u002Fadrs\u002F*' -maxdepth 3 -name '*.md' -exec grep -l \"^domain:\" {} +`\n- Flag: !`echo \"${1:---}\"`\n\n## Parameters\n\nParse `$ARGUMENTS`:\n\n- `--report-only`: Output validation report without prompting for fixes\n  - Default: Interactive mode with remediation options\n\n## Execution\n\nExecute complete ADR validation and remediation workflow:\n\n### Step 1: Discover all ADRs\n\n1. Check for ADR directory at `docs\u002Fadrs\u002F`\n2. If missing → Error: \"No ADRs found in docs\u002Fadrs\u002F\"\n3. Parse all ADR files: `ls docs\u002Fadrs\u002F*.md`\n4. Extract frontmatter for each ADR: number, id, created, modified, status, domain, supersedes, superseded-by, extends, relates-to\n\n### Step 2: Validate reference integrity\n\nFor each ADR, validate:\n\n1. **supersedes references**: Verify target exists, target status = \"Superseded\", target has reciprocal superseded-by\n2. **extends references**: Verify target exists, warn if target is \"Superseded\"\n3. **related references**: Verify all targets exist, warn if one-way links\n4. **self-references**: Flag if ADR references itself\n5. **circular chains**: Detect cycles in supersession graph\n6. **Cross-workspace references** (v3.3.0+, manifests with `workspaces.role`):\n   Recognise these reference forms in supersedes\u002Fextends\u002Frelated fields:\n   - `ADR-NNN` — local to the current workspace (existing behaviour).\n   - `\u003Cworkspace-path>\u002FADR-NNN` — points into a sibling\u002Fchild workspace. Resolve\n     by reading `\u003Cworkspace-path>\u002Fdocs\u002Fadrs\u002F` from the monorepo root. Warn if\n     the workspace is not listed in root `workspaces.children`.\n   - `\u002FADR-NNN` — points at the monorepo root's ADR set. Resolve using the\n     manifest's `workspaces.root_relative_path` (for child manifests) or the\n     current directory (for root manifests).\n   Unresolved cross-workspace refs are reported as warnings (not errors) so\n   they do not block validation during migration.\n\nSee [REFERENCE.md](REFERENCE.md#validation-rules) for detailed checks.\n\n### Step 2b: Detect ADR-number collisions and index drift\n\nADR numbers are chosen at branch time but only claimed at merge time, so two\nin-flight ADR PRs can pick the same number and both land (issue #1585 — the FVH\ninfrastructure #2015 collision where two ADRs both claimed `0038`). Run the\ndeterministic guard:\n\n```bash\nbash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fcheck-adr-numbers.sh --project-dir \"$(pwd)\"\n```\n\nIt emits `STATUS=` \u002F `REASON=` \u002F `ISSUE_COUNT=` and reports these\nclasses (see [REFERENCE.md](REFERENCE.md#validation-rules)):\n\n- `duplicate_adr_number` (ERROR) — two files claim the same number, by `NNNN-` \u002F `ADR-NNN-` **filename** or frontmatter `id: ADR-NNNN`. The message names the source (`basename` \u002F `frontmatter`).\n- `adr_number_collision` (ERROR) — a working-tree ADR claims a number a **different** file already holds on the base ref (`origin\u002Fmain`) — the pre-merge parallel-PR case, caught before the second PR merges.\n- `adr_registry_mismatch` (ERROR) — a file claims `ADR-NNNN` but the manifest `id_registry` maps that number to a different path. The registry is the only arbiter resolving id → path unambiguously: two files can both *say* `ADR-0016`, only one can be registered. Silent with no manifest \u002F no `id_registry`.\n- `adr_missing_index_row` (WARN) — an ADR is missing from the directory's README index (how the `0038` collision went unnoticed for a week). Repair via Step 2c instead of re-warning.\n- `adr_dir_unrecognized_naming` (WARN) — no ADR number recognised (#2822).\n\n**Multiple ADR directories** (issue #2129): the guard scans a directory *set* —\nthe real ADR-0016 collision had its claimants in `docs\u002Fadrs\u002F` and\n`docs\u002Fblueprint\u002Fadrs\u002F`, which a single-directory scan cannot see. Precedence:\nrepeatable `--adr-dir \u003Cdir>`, else `validation.adr_dirs` from the **shared**\n`validation` manifest block (issue #2128, read via\n`blueprint-plugin\u002Fscripts\u002Fget-validation-config.sh` — do not add a second config\nmechanism), else the default `docs\u002Fadrs` then `docs\u002Fadr` order. It emits\n`ADR_DIRS=` (TAB-separated) and `ADR_DIR_COUNT=`; `ADR_DIR=`, `ADR_COUNT=` and\n`INDEX=` keep their #1585 meanings.\n\nFold findings into the Step 4 report. `STATUS=ERROR` is a blocking collision:\nrenumber the newer ADR to the next free number (updating **both** its filename\nand its frontmatter `id:`), then regenerate the index (Step 2c).\n\n### Step 2c: Regenerate the ADR index\n\n`adr_missing_index_row` is repairable — the hand-maintained table is what\nrotted. Rebuild it from frontmatter:\n\n```bash\n# CI \u002F read-only gate: non-zero exit when the on-disk index is out of date\nbash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fgenerate-adr-index.sh --project-dir \"$(pwd)\" --check\n\n# Repair: rewrite the table in every resolved ADR directory\nbash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fgenerate-adr-index.sh --project-dir \"$(pwd)\"\n```\n\nOnly the block between two marker comments is rewritten, so prose around it\nsurvives:\n\n```markdown\n\u003C!-- ADR-INDEX:START -->\n| ADR | Title | Status |\n| --- | ----- | ------ |\n| [ADR-0016](0016-in-engine-ui.md) | In-engine UI | Accepted |\n\u003C!-- ADR-INDEX:END -->\n```\n\nOne index per directory (`--index-file` overrides the `README.md` default), over\nthe same directory set and widened number collection as Step 2b — so an ADR\nnumbered only in frontmatter still gets a row. `--check` states per directory:\n\n| State | Severity | Meaning |\n|-------|----------|---------|\n| `in_sync` | OK | On-disk block matches the generated one |\n| `drifted` | ERROR (exit 1) | Regenerate — the index is stale |\n| `markers_absent` | WARN (exit 0) | No marker pair yet; a write adopts them. Deliberately **not** a diff |\n| `index_absent` | WARN (exit 0) | No index file yet; a write creates one |\n| `no_adrs` | OK | Directory holds no numbered ADRs |\n\nWrite mode reports `written` \u002F `unchanged` \u002F `markers_inserted` \u002F\n`index_created`. When markers land in a README that already had a hand-written\ntable, delete that table — the generated block is authoritative.\n\n### Step 3: Analyze domains\n\n1. Group ADRs by domain field\n2. For each domain with multiple \"Accepted\" ADRs → potential conflict flag\n3. List untagged ADRs (not errors, but recommendations)\n\n### Step 4: Generate validation report\n\nCompile comprehensive report showing:\n- Summary: Total ADRs, domain-tagged %, relationship counts, status breakdown\n- Reference integrity: Supersedes, extends, related status (✅\u002F⚠️\u002F❌)\n- Errors found: Broken references, self-references, cycles\n- Warnings: Outdated extensions, one-way links\n- Domain analysis: Conflicts and untagged ADRs\n\n### Step 5: Handle --report-only flag\n\nIf `--report-only` flag present:\n1. Output validation report from Step 4\n2. Exit without prompting for fixes\n\n### Step 6: Prompt for remediation (if interactive mode)\n\nAsk user action via AskUserQuestion:\n- Fix all automatically (update status, add reciprocal links)\n- Review each issue individually\n- Export report to `docs\u002Fadrs\u002Fvalidation-report.md`\n- Skip for now\n\nExecute based on selection (see [REFERENCE.md](REFERENCE.md#remediation-procedures)).\n\n### Step 7: Update task registry\n\nUpdate the task registry entry in `docs\u002Fblueprint\u002Fmanifest.json`:\n\n```bash\njq --arg now \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\" \\\n  --arg result \"${VALIDATION_RESULT:-success}\" \\\n  --argjson processed \"${ADRS_VALIDATED:-0}\" \\\n  '.task_registry[\"adr-validate\"].last_completed_at = $now |\n   .task_registry[\"adr-validate\"].last_result = $result |\n   .task_registry[\"adr-validate\"].stats.runs_total = ((.task_registry[\"adr-validate\"].stats.runs_total \u002F\u002F 0) + 1) |\n   .task_registry[\"adr-validate\"].stats.items_processed = $processed' \\\n  docs\u002Fblueprint\u002Fmanifest.json > tmp.json && mv tmp.json docs\u002Fblueprint\u002Fmanifest.json\n```\n\nWhere `VALIDATION_RESULT` is \"success\", \"{N} warnings\", or \"failed: {reason}\".\n\n### Step 8: Report changes and summary\n\nReport all changes made:\n- Updated ADRs (status changes, added links)\n- Remaining issues count\n- Next steps recommendation\n\n## Agentic Optimizations\n\n| Context | Command |\n|---------|---------|\n| Check ADR directory | `test -d docs\u002Fadrs && echo \"YES\" \\|\\| echo \"NO\"` |\n| Count ADRs | `ls docs\u002Fadrs\u002F*.md 2>\u002Fdev\u002Fnull \\| wc -l` |\n| Extract frontmatter | `head -50 {file} \\| grep -m1 \"^field:\" \\| sed 's\u002F^[^:]*:[[:space:]]*\u002F\u002F'` |\n| Find by domain | `grep -l \"^domain: {domain}\" docs\u002Fadrs\u002F*.md` |\n| Detect cycles | Build supersession graph and traverse |\n| Number collisions | `bash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fcheck-adr-numbers.sh --project-dir \"$(pwd)\"` |\n| Two ADR dirs | `… \u002Fcheck-adr-numbers.sh --adr-dir docs\u002Fadrs --adr-dir docs\u002Fblueprint\u002Fadrs` |\n| Index drift gate (CI) | `bash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fgenerate-adr-index.sh --check` |\n| Regenerate index | `bash ${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fgenerate-adr-index.sh` |\n\n---\n\nFor validation rules, remediation procedures, and report format details, see [REFERENCE.md](REFERENCE.md).\n",{"args":47,"name":5,"created":48,"modified":49,"reviewed":50,"description":7,"allowed-tools":51,"argument-hint":52},"[--report-only]",1768435200000,1791504000000,1785024000000,"Read, Bash, Glob, Grep, Edit, AskUserQuestion","--report-only to validate without prompting for fixes","main","bdd0582f1a2ba53d21061835bfd72d45f2f954f4","blueprint-plugin\u002Fskills\u002Fblueprint-adr-validate",6,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins","https:\u002F\u002Fgithub.com\u002Flaurigates","Linux enthusiast, cloud engineer, neovim addict, electronics hobbyist.","2026-11-12 03:43:32",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add laurigates\u002Fclaude-plugins --skill blueprint-adr-validate",{"tool":67,"command":68},"bunx","bunx skills add laurigates\u002Fclaude-plugins --skill blueprint-adr-validate",{"tool":70,"command":71},"pnpm","pnpm dlx skills add laurigates\u002Fclaude-plugins --skill blueprint-adr-validate","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fblueprint-plugin\u002Fskills\u002Fblueprint-adr-validate\u002FSKILL.md",true,[75,81,87,91,95],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"REFERENCE.md","REFERENCE","参考文档",4054,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fblueprint-plugin\u002Fskills\u002Fblueprint-adr-validate\u002FREFERENCE.md",{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"scripts\u002Fcheck-adr-numbers.sh","SCRIPT","脚本",19549,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fblueprint-plugin\u002Fskills\u002Fblueprint-adr-validate\u002Fscripts\u002Fcheck-adr-numbers.sh",{"path":88,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":89,"sourceHtmlUrl":90},"scripts\u002Fgenerate-adr-index.sh",11263,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fblueprint-plugin\u002Fskills\u002Fblueprint-adr-validate\u002Fscripts\u002Fgenerate-adr-index.sh",{"path":92,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":93,"sourceHtmlUrl":94},"scripts\u002Ftests\u002Ftest-check-adr-numbers.sh",21182,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fblueprint-plugin\u002Fskills\u002Fblueprint-adr-validate\u002Fscripts\u002Ftests\u002Ftest-check-adr-numbers.sh",{"path":96,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":97,"sourceHtmlUrl":98},"scripts\u002Ftests\u002Ftest-generate-adr-index.sh",11131,"https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fblueprint-plugin\u002Fskills\u002Fblueprint-adr-validate\u002Fscripts\u002Ftests\u002Ftest-generate-adr-index.sh",[100,127,147,163,185,215],{"skillNo":101,"name":102,"nameZh":6,"description":103,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":111,"publishedAt":42},"01M70PFHMH9ADY0CRE6047Y4B2","kitty-show-image","Show the user an image with a note on what to judge, via a file send or a labelled kitty tab. Use when the user must see an image, or icat fails with no \u002Fdev\u002Ftty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-show-image\u002FSKILL.md",[106],{"categoryNo":107,"categoryName":108,"taxonomyType":109,"taxonomyTypeDesc":110},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[112,113,114,115,116,117,118,119,120,121,34,25,39,122,123,124,125,126,24,36],"show","kitty show image","image","kitty","show image","ls","get","send","open","dev","file","text","with","xdg","via",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":42},"01M70PFEN18HKQ4RCQ1VPGMPTB","kitty-session-persistence","Snapshot and restore kitty terminal sessions on macOS. Use when surviving WindowServer hangs without losing tabs, configuring snapshots, or restoring after a force-reboot.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-session-persistence\u002FSKILL.md",[],[115,134,135,136,137,138,25,39,139,140,141,24,36,142,35,143,144,145,146,34],"kitty session persistence","session","persistence","false","snapshots","uname","reboot","terminal","write","snapshot","macos","sessions","restore",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":42},"01M70PFC77XGXCVQ1543VGZHYR","kitty-remote-control","Safe kitty remote control from an agent — read panes with kitty @ ls\u002Fget-text, notify, and never mutate the live terminal unasked. Use when running inside kitty.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fkitty-plugin\u002Fskills\u002Fkitty-remote-control\u002FSKILL.md",[],[154,155,115,156,157,117,158,159,118,160,161,34,25,162,39,123,124,141,24,36],"kitty remote control","remote","control","remote control","running","never","panes","notify","query",{"skillNo":164,"name":165,"nameZh":6,"description":166,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":167,"categories":168,"keywords":169,"publishedAt":42},"01M70P6WVMCT5JG4SACTM69AF9","docs-reference-check","Dangling doc-reference gate: flag markdown naming repo paths or relative links that no longer exist. Use when docs cite moved\u002Fdeleted files, or wiring a doc-drift lint.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fdocumentation-plugin\u002Fskills\u002Fdocs-reference-check\u002FSKILL.md",[],[170,171,172,173,174,30,175,176,177,178,34,25,39,179,122,180,181,182,183,184],"docs reference check","check","reference check","reference","docs","python3","repo","files","auto","drift","lint","wiring","chezmoi","references","cp",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":200,"publishedAt":42},"01M6C6NDE7DAQGNWSF22J5CJ0Z","youtube-upload","Upload a video to YouTube via the Data API v3 and edit its title, description, tags or thumbnail afterwards. Use when publishing or retitling a YouTube video.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-upload\u002FSKILL.md",[191,194,195],{"categoryNo":192,"categoryName":193,"taxonomyType":109,"taxonomyTypeDesc":110},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":107,"categoryName":108,"taxonomyType":109,"taxonomyTypeDesc":110},{"categoryNo":196,"categoryName":197,"taxonomyType":198,"taxonomyTypeDesc":199},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[201,202,203,204,175,205,36,206,35,207,208,209,34,39,122,210,211,25,212,213,214,126,24],"youtube upload","upload","youtube","Video","run","uv run","publishing","data","uv","api","v3","tags","id","title",{"skillNo":216,"name":217,"nameZh":6,"description":218,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":219,"categories":220,"keywords":224,"publishedAt":42},"01M6C6NABWW1X58KJJM4F6GQMQ","youtube-studio-share","Share a private YouTube video with a whole Google Workspace organization by scripting YouTube Studio in the browser. Use when a video must be org-only.","https:\u002F\u002Fgithub.com\u002Flaurigates\u002Fclaude-plugins\u002Fblob\u002Fmain\u002Fyoutube-plugin\u002Fskills\u002Fyoutube-studio-share\u002FSKILL.md",[221],{"categoryNo":222,"categoryName":223,"taxonomyType":109,"taxonomyTypeDesc":110},"01JBSEEDCAT000000000000023","Skill与智能体开发",[225,226,227,228,203,204,229,230,231,232,233,36,234,235,33,236,34,237,25,124,238,24],"youtube studio share","share","youtube studio","studio","browser","javascript","scripting","google workspace","workspace","tool","google","MCP","chrome","organization"]