[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71FWG8DTF23KHY54YN4C5YN":3,"skill-same:01M71FWG8DTF23KHY54YN4C5YN":80},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":14,"repositoryHtmlUrl":49,"repositoryHomepageUrl":6,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M71FWG8DTF23KHY54YN4C5YN","audit-changeset-coherence",null,"Changeset-coherence audit methodology — judges whether an exact committed changeset forms one coherent review unit, covering semantic clustering, generated-source attribution, evidence completeness, and dependency-ordered review-unit sequencing.","outcomeeng\u002Fplugins","outcomeeng","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F257335685?v=4","01M71FRVRF36XYR3HRSCGFHK2R","Outcome Engineering","01M71FRVS4BZG17DWANFJ7EPNY",1,"MIT","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Faudit-changeset-coherence\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"audit","audit changeset coherence","coherence","changeset","python3","Bash","branch","generated","diff","evidence","show","audit methodology","attribution","head","scope","completeness","unit","sequencing","one","review","2026-11-10 10:12:30",false,"---\nname: audit-changeset-coherence\ndescription: >-\n  Changeset-coherence audit methodology — judges whether an exact committed\n  changeset forms one coherent review unit, covering semantic clustering,\n  generated-source attribution, evidence completeness, and dependency-ordered\n  review-unit sequencing.\nargument-hint: \"\u003Cbranch-or-base...head>\"\nallowed-tools: Read, Grep, Glob, Bash(python3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fresolve_scope.py\":*), Bash(git diff:*), Bash(git show:*)\n---\n\n\u003Cobjective>\n\nA verdict on whether one exact committed changeset forms one coherent review unit, judged against the evidence rules in `${CLAUDE_SKILL_DIR}\u002Freferences\u002Frule-catalog.md` — `APPROVED`, `REJECTED`, or `UNKNOWN`, with each finding naming the violated rule, its location, and the evidence — or a `BLOCKED` diagnostic naming the unresolved scope input. Findings fall in four categories: semantic clustering, generated-source attribution, evidence completeness, and review-unit sequencing.\n\n\u003C\u002Fobjective>\n\n\u003Cconstraints>\n\n- Read-only — produce one verdict and NEVER edit files, commits, branches, reviews, or pull requests.\n- MUST preserve full base and head commit identities exactly as resolved from the supplied scope in every coherence verdict.\n- MUST inspect every changed authored artifact; collapse deterministic generated artifacts onto their producers before judging breadth.\n- NEVER use line count, file count, path breadth, or an uncalibrated review-load score as a verdict rule.\n- NEVER infer missing behavioral, dependency, generated-source, verification, rollback, or calibration evidence; return `UNKNOWN` when the missing evidence can change the classification.\n- NEVER return prose outside the JSON object in `\u003Cverdict_format>`.\n\n\u003C\u002Fconstraints>\n\n\u003Caudit_workflow>\n\n1. Bind the scope selector: `$ARGUMENTS` supplies it when that argument is non-empty; when it is empty, the selector is the one the request text carries, and the empty substitution binds nothing. Require it to identify a branch, `HEAD`, or a committed `\u003Cbase>...\u003Chead>` scope. When the request carries no selector, or no exact committed scope can be resolved, return the `BLOCKED` JSON object in `\u003Cverdict_format>`; scope failure occurs before a coherence verdict and never fabricates commit identities.\n2. Resolve the exact committed scope by running `python3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fresolve_scope.py\" \"\u003Cscope>\"`, which routes base-ref resolution, remote-tracking-ref composition, commit identity, and three-dot diff scope through the canonical changeset-scope primitives. Preserve its `base`, `head`, and `changed_paths` verbatim. NEVER derive base-ref, commit identity, or diff scope from raw git; a bare local branch ref lags `origin\u002F\u003Cbase>` in a multi-worktree checkout and re-admits already-merged commits. The resolver fetches the base and refuses a head behind its tip with a dedicated exit code and a `stale-base` diagnostic on stderr; return the `BLOCKED` JSON object with `reason` `stale-base` and that diagnostic verbatim, before reading any subject. Any other nonzero exit returns the `BLOCKED` JSON object with `reason` `scope-unresolved`. Read changed content only within the resolved scope.\n3. Read any evidence packet the request text carries beside the selector — a JSON object of already-collected claims, artifact roles, `generated_from` provenance, dependency evidence, and review-load signals. The resolved scope from step 2 is authoritative for `base`, `head`, and the changed-path set; the packet supplies only the per-artifact evidence the later steps name for paths inside that scope, and a packet entry naming a path outside it carries no evidence for this verdict. Enumerate every changed path and classify its role: decision\u002Fspecification, test\u002Feval evidence, implementation, generated artifact, workflow\u002Fconfiguration, documentation, migration, deployment, or release.\n4. Resolve every generated artifact to its producing authored artifact from repository-declared build relationships. In an already-collected evidence packet, `role: generated` classifies the artifact kind only; it never establishes provenance. Require `generated_from`, a declared relationship record, or equivalent explicit evidence. When `generated_relationship_evidence.status` is `missing`, return `UNKNOWN` with `missing-generated-source-evidence` before clustering the unresolved artifact. Exclude resolved generated fanout from authored breadth while retaining it in each producer cluster's `generated_fanout`.\n5. Extract behavioral claims from the changed declarations and observable implementation\u002Fevidence. Use commit messages only as supporting evidence; they never override changed artifacts.\n6. Build the smallest semantic clusters whose artifacts realize one claim. Record each cluster's authored artifacts, generated fanout, verification story, rollback story, dependencies, and independent-mergeability judgment.\n7. Collapse dependency cycles and clusters that cannot be verified or rolled back separately into one inseparable cluster. Order remaining clusters topologically, breaking independent ties by the lexicographically first authored path. Every cluster that survives this collapse forms its own review unit, so its `independently_mergeable` is `true` — a lone cluster and a cluster that depends on and merges after an earlier cluster are both `true`. A `false` judgment applies only to a cluster still fused with another before collapse, and such a cluster never survives into the projection.\n8. Record review-load signals and whether a repository baseline exists. Use those signals to increase scrutiny only.\n9. Apply `\u003Cverdict_rules>`, create findings, and return the exact schema in `\u003Cverdict_format>`.\n\n\u003C\u002Faudit_workflow>\n\n\u003Cverdict_rules>\n\n- `APPROVED`: the authored change realizes one behavioral outcome, or several inseparable clusters sharing one verification and rollback story. `publication_authorized` is `true`; `recommended_pr_sequence` is empty.\n- `REJECTED`: two or more semantic clusters are independently mergeable. `publication_authorized` is `false`; `recommended_pr_sequence` covers every cluster exactly once in dependency order.\n- `UNKNOWN`: missing evidence can change cluster membership, dependency order, generated-source attribution, verification unity, rollback unity, or independent mergeability. `publication_authorized` is `false`.\n\nAn empty rollback story for any cluster ALWAYS yields `UNKNOWN`, `publication_authorized: false`, and a blocking finding whose rule is `missing-rollback-evidence`. Missing verification evidence follows the same boundary with rule `missing-verification-evidence`. Every finding is keyed `\u003Cunit>:\u003Crule-id>` and takes its rule identifier from `${CLAUDE_SKILL_DIR}\u002Freferences\u002Frule-catalog.md`, which carries the identifiers for the other evidence classes and defines the unit; NEVER emit an identifier outside that catalog. A review-load baseline may be absent without forcing `UNKNOWN` when the semantic evidence is otherwise complete; missing calibration yields `UNKNOWN` only when a repository-specific signal explicitly requires that calibration to determine whether the available semantic evidence is sufficient.\n\nFor two or more semantic clusters, an absent or `null` dependency set ALWAYS yields `UNKNOWN` with `missing-dependency-evidence`; an explicit empty dependency array establishes that no dependency exists. In every projected cluster the `dependencies` field is an array — `[]` when no dependency on another cluster is established — NEVER a `null` copied from the packet; unresolved packet dependency evidence is recorded only in the `missing-dependency-evidence` finding, NEVER echoed into a cluster.\nWhen an evidence packet supplies already-collected claims, artifact paths, evidence paths, dependencies, or review-load signals, preserve those values verbatim in the projection. Sort claim and path arrays lexicographically. Copy `review_load` without reinterpretation. Every normal verdict carries every field in the schema, using empty arrays or objects when a field has no entries.\n\nUse deterministic identities: `cluster-1`, `cluster-2`, and so on in dependency order; rejected review units are `review-unit-1`, `review-unit-2`, and so on in the same order.\n\n\u003C\u002Fverdict_rules>\n\n\u003Cverdict_format>\n\nWhen scope resolution fails before an exact changeset exists, return only this JSON object; `reason` is `stale-base` when the resolver refused a head behind the fetched base, carrying the resolver's stderr diagnostic verbatim under `diagnostic`, and `scope-unresolved` for every other failure:\n\n```json\n{\n  \"schema_version\": 1,\n  \"status\": \"BLOCKED\",\n  \"reason\": \"scope-unresolved | stale-base\",\n  \"scope_input\": \"\u003Csupplied scope selector or empty string>\",\n  \"diagnostic\": \"\u003Cresolver stderr, verbatim, or empty string>\"\n}\n```\n\nFor an exact committed changeset, return one coherence-verdict JSON object:\n\n```json\n{\n  \"schema_version\": 1,\n  \"overall\": \"APPROVED | REJECTED | UNKNOWN\",\n  \"scope\": { \"base\": \"\u003Cfull-commit-id>\", \"head\": \"\u003Cfull-commit-id>\" },\n  \"behavioral_claims\": [\"\u003Cclaim>\"],\n  \"clusters\": [\n    {\n      \"id\": \"cluster-1\",\n      \"outcome\": \"\u003Cbehavioral outcome>\",\n      \"authored_artifacts\": [\"\u003Cpath>\"],\n      \"generated_fanout\": [\"\u003Cpath>\"],\n      \"verification_story\": [\"\u003Cevidence>\"],\n      \"rollback_story\": [\"\u003Cartifact or operation>\"],\n      \"dependencies\": [\"\u003Ccluster-id>\"],\n      \"independently_mergeable\": true\n    }\n  ],\n  \"review_load\": {\n    \"repository_baseline_available\": true,\n    \"signals\": {}\n  },\n  \"findings\": [\n    {\n      \"key\": \"\u003Cunit>:\u003Crule-id>\",\n      \"rule\": \"\u003Crule-id from references\u002Frule-catalog.md>\",\n      \"severity\": \"blocking | debt\",\n      \"location\": \"\u003Cpath-or-scope>\",\n      \"message\": \"\u003Cfinding>\",\n      \"evidence\": { \"observed\": \"\u003Cfact>\", \"expected\": \"\u003Crequired evidence>\" }\n    }\n  ],\n  \"publication_authorized\": false,\n  \"recommended_pr_sequence\": [\n    {\n      \"id\": \"review-unit-1\",\n      \"cluster_ids\": [\"cluster-1\"],\n      \"outcome\": \"\u003Creview-unit outcome>\",\n      \"artifacts\": [\"\u003Cauthored and generated paths>\"],\n      \"depends_on\": []\n    }\n  ]\n}\n```\n\nEvery changed authored artifact whose behavioral claim is established appears in exactly one cluster. Every generated artifact whose producer relationship is established appears under exactly one producer cluster. An `UNKNOWN` verdict names every unresolved artifact in its findings without inventing cluster membership. A rejected sequence covers every cluster exactly once and references only earlier review units in `depends_on`.\n\n\u003C\u002Fverdict_format>\n\n\u003Cfailure_modes>\n\n**Failure 1: Missing rollback evidence received approval.**\n\nWhat happened: Claude classified a migration packet as coherent even though the packet contained no rollback evidence.\n\nWhy it failed: The general missing-evidence rule did not make an empty rollback story an explicit terminal boundary, so semantic cohesion overshadowed reversibility.\n\nHow to avoid: Treat every empty cluster rollback story as `UNKNOWN`, prohibit publication, and emit `missing-rollback-evidence` before considering approval.\n\n**Failure 2: Unresolved scope was forced into the verdict schema.**\n\nWhat happened: Claude was instructed to return `UNKNOWN` for an unresolved scope while the same schema required full base and head commit identities.\n\nWhy it failed: Scope resolution failure occurs before an exact changeset exists, so a normal verdict would require fabricated identities or an internally invalid object.\n\nHow to avoid: Return the separate `BLOCKED` JSON object for scope resolution failure and emit a coherence verdict only after both full commit identities resolve.\n\n**Failure 3: A null dependency set was treated as an empty set.**\n\nWhat happened: Claude rejected two independently understandable clusters and ordered them as unrelated review units even though the evidence packet supplied `dependencies: null`.\n\nWhy it failed: Claude collapsed “dependency evidence unavailable” into “dependency evidence establishes no relationships,” producing a split without a defensible order.\n\nHow to avoid: Distinguish absent or `null` dependency evidence from an explicit empty array and return `UNKNOWN` whenever the unavailable evidence can change a multi-cluster classification or order.\n\n**Failure 4: A generated artifact was attached by proximity.**\n\nWhat happened: Claude attached one generated artifact to the only authored artifact and approved the changeset even though no repository relationship or `generated_from` field established that producer.\n\nWhy it failed: Artifact count and nearby paths were treated as provenance, inventing the relationship the audit was required to verify.\n\nHow to avoid: Require an explicit repository-declared generated-source relationship and return `UNKNOWN` with `missing-generated-source-evidence` when attribution cannot be established.\n\n\u003C\u002Ffailure_modes>\n\n\u003Csuccess_criteria>\n\n- Every changed authored artifact and generated artifact is accounted for exactly once.\n- The overall result follows semantic cohesion, verification unity, rollback unity, and independent mergeability with no size threshold acting as a verdict rule.\n- Every `REJECTED` result carries a complete dependency-ordered sequence; every `UNKNOWN` result names the evidence gap that prevents classification.\n- The same committed scope and repository evidence produce the same cluster identities, ordering, and result.\n\n\u003C\u002Fsuccess_criteria>\n","\u003Cobjective>\n\nA verdict on whether one exact committed changeset forms one coherent review unit, judged against the evidence rules in `${CLAUDE_SKILL_DIR}\u002Freferences\u002Frule-catalog.md` — `APPROVED`, `REJECTED`, or `UNKNOWN`, with each finding naming the violated rule, its location, and the evidence — or a `BLOCKED` diagnostic naming the unresolved scope input. Findings fall in four categories: semantic clustering, generated-source attribution, evidence completeness, and review-unit sequencing.\n\n\u003C\u002Fobjective>\n\n\u003Cconstraints>\n\n- Read-only — produce one verdict and NEVER edit files, commits, branches, reviews, or pull requests.\n- MUST preserve full base and head commit identities exactly as resolved from the supplied scope in every coherence verdict.\n- MUST inspect every changed authored artifact; collapse deterministic generated artifacts onto their producers before judging breadth.\n- NEVER use line count, file count, path breadth, or an uncalibrated review-load score as a verdict rule.\n- NEVER infer missing behavioral, dependency, generated-source, verification, rollback, or calibration evidence; return `UNKNOWN` when the missing evidence can change the classification.\n- NEVER return prose outside the JSON object in `\u003Cverdict_format>`.\n\n\u003C\u002Fconstraints>\n\n\u003Caudit_workflow>\n\n1. Bind the scope selector: `$ARGUMENTS` supplies it when that argument is non-empty; when it is empty, the selector is the one the request text carries, and the empty substitution binds nothing. Require it to identify a branch, `HEAD`, or a committed `\u003Cbase>...\u003Chead>` scope. When the request carries no selector, or no exact committed scope can be resolved, return the `BLOCKED` JSON object in `\u003Cverdict_format>`; scope failure occurs before a coherence verdict and never fabricates commit identities.\n2. Resolve the exact committed scope by running `python3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fresolve_scope.py\" \"\u003Cscope>\"`, which routes base-ref resolution, remote-tracking-ref composition, commit identity, and three-dot diff scope through the canonical changeset-scope primitives. Preserve its `base`, `head`, and `changed_paths` verbatim. NEVER derive base-ref, commit identity, or diff scope from raw git; a bare local branch ref lags `origin\u002F\u003Cbase>` in a multi-worktree checkout and re-admits already-merged commits. The resolver fetches the base and refuses a head behind its tip with a dedicated exit code and a `stale-base` diagnostic on stderr; return the `BLOCKED` JSON object with `reason` `stale-base` and that diagnostic verbatim, before reading any subject. Any other nonzero exit returns the `BLOCKED` JSON object with `reason` `scope-unresolved`. Read changed content only within the resolved scope.\n3. Read any evidence packet the request text carries beside the selector — a JSON object of already-collected claims, artifact roles, `generated_from` provenance, dependency evidence, and review-load signals. The resolved scope from step 2 is authoritative for `base`, `head`, and the changed-path set; the packet supplies only the per-artifact evidence the later steps name for paths inside that scope, and a packet entry naming a path outside it carries no evidence for this verdict. Enumerate every changed path and classify its role: decision\u002Fspecification, test\u002Feval evidence, implementation, generated artifact, workflow\u002Fconfiguration, documentation, migration, deployment, or release.\n4. Resolve every generated artifact to its producing authored artifact from repository-declared build relationships. In an already-collected evidence packet, `role: generated` classifies the artifact kind only; it never establishes provenance. Require `generated_from`, a declared relationship record, or equivalent explicit evidence. When `generated_relationship_evidence.status` is `missing`, return `UNKNOWN` with `missing-generated-source-evidence` before clustering the unresolved artifact. Exclude resolved generated fanout from authored breadth while retaining it in each producer cluster's `generated_fanout`.\n5. Extract behavioral claims from the changed declarations and observable implementation\u002Fevidence. Use commit messages only as supporting evidence; they never override changed artifacts.\n6. Build the smallest semantic clusters whose artifacts realize one claim. Record each cluster's authored artifacts, generated fanout, verification story, rollback story, dependencies, and independent-mergeability judgment.\n7. Collapse dependency cycles and clusters that cannot be verified or rolled back separately into one inseparable cluster. Order remaining clusters topologically, breaking independent ties by the lexicographically first authored path. Every cluster that survives this collapse forms its own review unit, so its `independently_mergeable` is `true` — a lone cluster and a cluster that depends on and merges after an earlier cluster are both `true`. A `false` judgment applies only to a cluster still fused with another before collapse, and such a cluster never survives into the projection.\n8. Record review-load signals and whether a repository baseline exists. Use those signals to increase scrutiny only.\n9. Apply `\u003Cverdict_rules>`, create findings, and return the exact schema in `\u003Cverdict_format>`.\n\n\u003C\u002Faudit_workflow>\n\n\u003Cverdict_rules>\n\n- `APPROVED`: the authored change realizes one behavioral outcome, or several inseparable clusters sharing one verification and rollback story. `publication_authorized` is `true`; `recommended_pr_sequence` is empty.\n- `REJECTED`: two or more semantic clusters are independently mergeable. `publication_authorized` is `false`; `recommended_pr_sequence` covers every cluster exactly once in dependency order.\n- `UNKNOWN`: missing evidence can change cluster membership, dependency order, generated-source attribution, verification unity, rollback unity, or independent mergeability. `publication_authorized` is `false`.\n\nAn empty rollback story for any cluster ALWAYS yields `UNKNOWN`, `publication_authorized: false`, and a blocking finding whose rule is `missing-rollback-evidence`. Missing verification evidence follows the same boundary with rule `missing-verification-evidence`. Every finding is keyed `\u003Cunit>:\u003Crule-id>` and takes its rule identifier from `${CLAUDE_SKILL_DIR}\u002Freferences\u002Frule-catalog.md`, which carries the identifiers for the other evidence classes and defines the unit; NEVER emit an identifier outside that catalog. A review-load baseline may be absent without forcing `UNKNOWN` when the semantic evidence is otherwise complete; missing calibration yields `UNKNOWN` only when a repository-specific signal explicitly requires that calibration to determine whether the available semantic evidence is sufficient.\n\nFor two or more semantic clusters, an absent or `null` dependency set ALWAYS yields `UNKNOWN` with `missing-dependency-evidence`; an explicit empty dependency array establishes that no dependency exists. In every projected cluster the `dependencies` field is an array — `[]` when no dependency on another cluster is established — NEVER a `null` copied from the packet; unresolved packet dependency evidence is recorded only in the `missing-dependency-evidence` finding, NEVER echoed into a cluster.\nWhen an evidence packet supplies already-collected claims, artifact paths, evidence paths, dependencies, or review-load signals, preserve those values verbatim in the projection. Sort claim and path arrays lexicographically. Copy `review_load` without reinterpretation. Every normal verdict carries every field in the schema, using empty arrays or objects when a field has no entries.\n\nUse deterministic identities: `cluster-1`, `cluster-2`, and so on in dependency order; rejected review units are `review-unit-1`, `review-unit-2`, and so on in the same order.\n\n\u003C\u002Fverdict_rules>\n\n\u003Cverdict_format>\n\nWhen scope resolution fails before an exact changeset exists, return only this JSON object; `reason` is `stale-base` when the resolver refused a head behind the fetched base, carrying the resolver's stderr diagnostic verbatim under `diagnostic`, and `scope-unresolved` for every other failure:\n\n```json\n{\n  \"schema_version\": 1,\n  \"status\": \"BLOCKED\",\n  \"reason\": \"scope-unresolved | stale-base\",\n  \"scope_input\": \"\u003Csupplied scope selector or empty string>\",\n  \"diagnostic\": \"\u003Cresolver stderr, verbatim, or empty string>\"\n}\n```\n\nFor an exact committed changeset, return one coherence-verdict JSON object:\n\n```json\n{\n  \"schema_version\": 1,\n  \"overall\": \"APPROVED | REJECTED | UNKNOWN\",\n  \"scope\": { \"base\": \"\u003Cfull-commit-id>\", \"head\": \"\u003Cfull-commit-id>\" },\n  \"behavioral_claims\": [\"\u003Cclaim>\"],\n  \"clusters\": [\n    {\n      \"id\": \"cluster-1\",\n      \"outcome\": \"\u003Cbehavioral outcome>\",\n      \"authored_artifacts\": [\"\u003Cpath>\"],\n      \"generated_fanout\": [\"\u003Cpath>\"],\n      \"verification_story\": [\"\u003Cevidence>\"],\n      \"rollback_story\": [\"\u003Cartifact or operation>\"],\n      \"dependencies\": [\"\u003Ccluster-id>\"],\n      \"independently_mergeable\": true\n    }\n  ],\n  \"review_load\": {\n    \"repository_baseline_available\": true,\n    \"signals\": {}\n  },\n  \"findings\": [\n    {\n      \"key\": \"\u003Cunit>:\u003Crule-id>\",\n      \"rule\": \"\u003Crule-id from references\u002Frule-catalog.md>\",\n      \"severity\": \"blocking | debt\",\n      \"location\": \"\u003Cpath-or-scope>\",\n      \"message\": \"\u003Cfinding>\",\n      \"evidence\": { \"observed\": \"\u003Cfact>\", \"expected\": \"\u003Crequired evidence>\" }\n    }\n  ],\n  \"publication_authorized\": false,\n  \"recommended_pr_sequence\": [\n    {\n      \"id\": \"review-unit-1\",\n      \"cluster_ids\": [\"cluster-1\"],\n      \"outcome\": \"\u003Creview-unit outcome>\",\n      \"artifacts\": [\"\u003Cauthored and generated paths>\"],\n      \"depends_on\": []\n    }\n  ]\n}\n```\n\nEvery changed authored artifact whose behavioral claim is established appears in exactly one cluster. Every generated artifact whose producer relationship is established appears under exactly one producer cluster. An `UNKNOWN` verdict names every unresolved artifact in its findings without inventing cluster membership. A rejected sequence covers every cluster exactly once and references only earlier review units in `depends_on`.\n\n\u003C\u002Fverdict_format>\n\n\u003Cfailure_modes>\n\n**Failure 1: Missing rollback evidence received approval.**\n\nWhat happened: Claude classified a migration packet as coherent even though the packet contained no rollback evidence.\n\nWhy it failed: The general missing-evidence rule did not make an empty rollback story an explicit terminal boundary, so semantic cohesion overshadowed reversibility.\n\nHow to avoid: Treat every empty cluster rollback story as `UNKNOWN`, prohibit publication, and emit `missing-rollback-evidence` before considering approval.\n\n**Failure 2: Unresolved scope was forced into the verdict schema.**\n\nWhat happened: Claude was instructed to return `UNKNOWN` for an unresolved scope while the same schema required full base and head commit identities.\n\nWhy it failed: Scope resolution failure occurs before an exact changeset exists, so a normal verdict would require fabricated identities or an internally invalid object.\n\nHow to avoid: Return the separate `BLOCKED` JSON object for scope resolution failure and emit a coherence verdict only after both full commit identities resolve.\n\n**Failure 3: A null dependency set was treated as an empty set.**\n\nWhat happened: Claude rejected two independently understandable clusters and ordered them as unrelated review units even though the evidence packet supplied `dependencies: null`.\n\nWhy it failed: Claude collapsed “dependency evidence unavailable” into “dependency evidence establishes no relationships,” producing a split without a defensible order.\n\nHow to avoid: Distinguish absent or `null` dependency evidence from an explicit empty array and return `UNKNOWN` whenever the unavailable evidence can change a multi-cluster classification or order.\n\n**Failure 4: A generated artifact was attached by proximity.**\n\nWhat happened: Claude attached one generated artifact to the only authored artifact and approved the changeset even though no repository relationship or `generated_from` field established that producer.\n\nWhy it failed: Artifact count and nearby paths were treated as provenance, inventing the relationship the audit was required to verify.\n\nHow to avoid: Require an explicit repository-declared generated-source relationship and return `UNKNOWN` with `missing-generated-source-evidence` when attribution cannot be established.\n\n\u003C\u002Ffailure_modes>\n\n\u003Csuccess_criteria>\n\n- Every changed authored artifact and generated artifact is accounted for exactly once.\n- The overall result follows semantic cohesion, verification unity, rollback unity, and independent mergeability with no size threshold acting as a verdict rule.\n- Every `REJECTED` result carries a complete dependency-ordered sequence; every `UNKNOWN` result names the evidence gap that prevents classification.\n- The same committed scope and repository evidence produce the same cluster identities, ordering, and result.\n\n\u003C\u002Fsuccess_criteria>\n",{"name":5,"description":7,"allowed-tools":44,"argument-hint":45},"Read, Grep, Glob, Bash(python3 \"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fresolve_scope.py\":*), Bash(git diff:*), Bash(git show:*)","\u003Cbranch-or-base...head>","main","978d51c51d68c99cffb2ba48f7cad9d2f07e5738","src\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Faudit-changeset-coherence","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins","https:\u002F\u002Fgithub.com\u002Foutcomeeng","https:\u002F\u002Foutcome.engineering","Spec-driven development for AI-assisted engineering","2026-11-13 22:49:15",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add outcomeeng\u002Fplugins --skill audit-changeset-coherence",{"tool":60,"command":61},"bunx","bunx skills add outcomeeng\u002Fplugins --skill audit-changeset-coherence",{"tool":63,"command":64},"pnpm","pnpm dlx skills add outcomeeng\u002Fplugins --skill audit-changeset-coherence","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Faudit-changeset-coherence\u002FSKILL.md",true,[68,74],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"references\u002Frule-catalog.md","REFERENCE","参考文档",2813,"https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Faudit-changeset-coherence\u002Freferences\u002Frule-catalog.md",{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"scripts\u002Fresolve_scope.py","SCRIPT","脚本",4055,"https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fproduct-tree\u002Fskills\u002Faudit-changeset-coherence\u002Fscripts\u002Fresolve_scope.py",[81,87,124,140,157,170],{"skillNo":82,"name":83,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":39},"01M71G25RZTPQG9KJ00JCHC1F7","plugin","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Ftemplates\u002Fplugin\u002FSKILL.md",[],[83],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":103,"publishedAt":39},"01M71G23DCX3SV60H63HBBKQ6J","sanitize-powerpoint","ALWAYS invoke this skill when sanitizing, cleaning up, auditing, or aligning a PowerPoint (.pptx) deck — slide-master and layout structure, layout type attributes, stray fonts, non-theme colors, or layout naming. NEVER hand-edit pptx XML without this skill.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fwork\u002Fskills\u002Fsanitize-powerpoint\u002FSKILL.md",[93,98],{"categoryNo":94,"categoryName":95,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000003","演示文稿","SCENARIO","使用场景",{"categoryNo":99,"categoryName":100,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123],"sanitize powerpoint","powerpoint","sanitize","fonts","type","cleaning","structure","never","attributes","theme","pptx","naming","layout","deck","up","edit","xml","master","invoke","when",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":39},"01M71G21PQKBCDECHGVYSKPJW5","draw-excalidraw","ALWAYS invoke this skill when creating Excalidraw diagrams, visualizing workflows, architectures, or concepts. NEVER generate Excalidraw JSON without this skill.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Fwork\u002Fskills\u002Fdraw-excalidraw\u002FSKILL.md",[],[131,132,133,134,135,111,122,136,137,123,138,139],"draw excalidraw","excalidraw","draw","diagrams","architectures","generate","workflows","concepts","json",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":149,"publishedAt":39},"01M71G1ZMNGFD37RZYM620XM2C","typescript-test-standards","TypeScript test standards enforced across all skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-test-standards\u002FSKILL.md",[146],{"categoryNo":147,"categoryName":148,"taxonomyType":96,"taxonomyTypeDesc":97},"01JBSEEDCAT000000000000008","测试与质量",[150,151,152,153,154,155,156],"typescript","typescript test standards","test","standards","false","read","across",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":166,"publishedAt":39},"01M71G1XBH0X1VCTR7269MDGSY","typescript-code-standards","TypeScript code standards enforced across all skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-code-standards\u002FSKILL.md",[163],{"categoryNo":164,"categoryName":165,"taxonomyType":101,"taxonomyTypeDesc":102},"01JBSEEDCAT000000000000030","开发工程师",[150,167,168,169,153,154,155,156],"code","typescript code standards","code standards",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":176,"publishedAt":39},"01M71G1TQ3VN45SJ75DFMJDB9W","typescript-architecture-standards","TypeScript ADR conventions enforced across architect and auditor skills. Loaded by other skills, not invoked directly.","https:\u002F\u002Fgithub.com\u002Foutcomeeng\u002Fplugins\u002Fblob\u002Fmain\u002Fsrc\u002Fplugins\u002Ftypescript\u002Fskills\u002Ftypescript-architecture-standards\u002FSKILL.md",[],[177,153,178,179,150,180,181,156,155,182,154,183],"architecture standards","typescript architecture standards","architecture","adr","architect","auditor","conventions"]