@ccoalm/ccl-skills 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/classify_envelope.py +34 -3
  2. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_abort_leak_state_helpers.sh +148 -0
  3. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_classify_envelope.sh +28 -0
  4. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_parse_review_json.sh +7 -0
  5. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +13 -0
  6. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate_abort_leak.sh +271 -34
  7. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +8 -8
  8. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/eval-routing.md +7 -8
  9. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +3 -2
  10. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/harness-patterns-and-eval.md +7 -6
  11. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/recurring-anti-patterns-checklist.md +18 -0
  12. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +29 -2
  13. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +28 -29
  14. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +153 -0
  15. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/eval-health.rb +23 -10
  16. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +303 -1
  17. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_impact_chain_refscripts.sh +222 -91
  18. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +6 -0
  19. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_dateless_host.sh +6 -1
  20. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_gate_verdict_differential.sh +1 -1
  21. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_round_attribution.sh +12 -12
  22. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_self_adjudication.sh +455 -0
  23. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_source_refuted.sh +20 -20
  24. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_liveness_predicate_gate.sh +288 -0
  25. package/dist/assets/release.json +39 -24
  26. package/package.json +1 -1
@@ -66,6 +66,22 @@ new_case() {
66
66
  git -C "$REPO" switch -q -C "$1" fixture-base
67
67
  git -C "$REPO" branch --set-upstream-to=fixture-base "$1" >/dev/null 2>&1
68
68
  }
69
+ # 045: a round that edits a frontmatter description owes bank evidence. These
70
+ # fixtures exercise the OTHER impact-chain predicates and deliberately do not
71
+ # measure routing, so each routing-surface case records that downscope where a
72
+ # reader reaches it — verbatim, because a bare token would be discharged by any
73
+ # line that happens to contain the word.
74
+ RS_DOWNSCOPE_N=0
75
+ routing_surface_downscope() {
76
+ # APPENDS a uniquely numbered line, one per call. The record has to be an ADDED
77
+ # line in the round being judged: a multi-round case whose first commit wrote
78
+ # the file leaves the second round with no added line, and an identical rewrite
79
+ # produces no diff at all. Each round records its own downscope.
80
+ RS_DOWNSCOPE_N=$((RS_DOWNSCOPE_N + 1))
81
+ mkdir -p "$REPO/specs/fixture-refscripts"
82
+ printf -- '- Round %s downscope downscoped:REFSCRIPTS-FIXTURE-NO-BANK: these cases pin gate predicates, not routing measurement.\n' \
83
+ "$RS_DOWNSCOPE_N" >> "$REPO/specs/fixture-refscripts/plan.md"
84
+ }
69
85
  commit_case() { git -C "$REPO" add -A; git -C "$REPO" commit -qm "$1"; }
70
86
  full_check_runs=0
71
87
  gate_runs=0
@@ -96,6 +112,7 @@ run_gate() {
96
112
  # Case 1: an upstream owner's REFERENCE changed with NO impact-chain row -> block.
97
113
  new_case case-ref-no-row
98
114
  printf '\nFixture reference edit for the impact-chain refscripts gate.\n' >> "$REPO/$UPSTREAM_REF"
115
+ routing_surface_downscope
99
116
  commit_case "ref edit, no impact-chain row"
100
117
  run_full_check
101
118
  assert_rc "$rc" 1 "reference edit without a row must fail the gate"
@@ -110,6 +127,7 @@ assert_contains "references/ and scripts/" "$out" "diagnostic should explain ref
110
127
  new_case case-ref-row-without-behavior-evidence
111
128
  printf '\nFixture reference edit for the impact-chain behavior-evidence gate.\n' >> "$REPO/$UPSTREAM_REF"
112
129
  printf '| Fixture row without behavior evidence | `downstream-executor` | Executor applies the reference behavior | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
130
+ routing_surface_downscope
113
131
  commit_case "ref edit with row but no behavior evidence"
114
132
  run_gate
115
133
  assert_rc "$rc" 1 "an impact-chain row without behavioral evidence must fail"
@@ -120,7 +138,8 @@ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should
120
138
  # must be accepted as an enforcing firing-path line.
121
139
  new_case case-ref-never-verb-firing-path
122
140
  printf '\n- Never bypass the fixture upstream rule for this gate.\n' >> "$REPO/$UPSTREAM_REF"
123
- printf '| Fixture never-verb rule | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Never bypass the fixture upstream rule | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
141
+ printf '| Fixture never-verb rule | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Never bypass the fixture upstream rule | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
142
+ routing_surface_downscope
124
143
  commit_case "never-verb normative firing path"
125
144
  run_gate
126
145
  assert_not_contains "impact_chain_firing_path_missing" "$out" "a never-phrased normative rule should satisfy the firing-path gate"
@@ -130,7 +149,8 @@ assert_rc "$rc" 0 "a never-phrased normative list rule must be accepted"
130
149
  # verb) is not an enforcing rule; the widened verb list must not admit it.
131
150
  new_case case-ref-descriptive-always-firing-path
132
151
  printf '\n- The host always exposes this delegation capability surface.\n' >> "$REPO/$UPSTREAM_REF"
133
- printf '| Fixture descriptive always line | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#always exposes this delegation capability | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
152
+ printf '| Fixture descriptive always line | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#always exposes this delegation capability | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
153
+ routing_surface_downscope
134
154
  commit_case "descriptive always line as firing path"
135
155
  run_gate
136
156
  assert_rc "$rc" 1 "a descriptive list line must not satisfy the firing-path gate"
@@ -140,7 +160,8 @@ assert_contains "impact_chain_firing_path_missing" "$out" "checker should reject
140
160
  # comment-carrying anchor line is never an enforcing rule surface.
141
161
  new_case case-ref-html-comment-firing-path
142
162
  printf '\n- <!-- must enforce this hidden fixture directive --> bookkeeping note.\n' >> "$REPO/$UPSTREAM_REF"
143
- printf '| Fixture html-comment firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#must enforce this hidden fixture directive | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
163
+ printf '| Fixture html-comment firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#must enforce this hidden fixture directive | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
164
+ routing_surface_downscope
144
165
  commit_case "html-comment line as firing path"
145
166
  run_gate
146
167
  assert_rc "$rc" 1 "an HTML-comment anchor line must not satisfy the firing-path gate"
@@ -152,7 +173,8 @@ new_case case-ref-noshebang-command-firing-path
152
173
  printf '\nFixture reference edit for the shebang command gate.\n' >> "$REPO/$UPSTREAM_REF"
153
174
  printf '# fixture executable-bit markdown\n' > "$REPO/skills/product-rd-workflow/scripts/zz-fixture-noshebang.md"
154
175
  chmod +x "$REPO/skills/product-rd-workflow/scripts/zz-fixture-noshebang.md"
155
- printf '| Fixture no-shebang command | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: command:skills/product-rd-workflow/scripts/zz-fixture-noshebang.md | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
176
+ printf '| Fixture no-shebang command | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: command:skills/product-rd-workflow/scripts/zz-fixture-noshebang.md | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
177
+ routing_surface_downscope
156
178
  commit_case "executable-bit file without shebang as firing path"
157
179
  run_gate
158
180
  assert_rc "$rc" 1 "a shebang-less executable-bit file must not satisfy a command firing path"
@@ -165,7 +187,8 @@ new_case case-ref-command-firing-path-accepted
165
187
  printf '\nFixture reference edit for the accepted command firing path.\n' >> "$REPO/$UPSTREAM_REF"
166
188
  printf '#!/usr/bin/env bash\nprintf "fixture owner enforcement script\\n"\n' > "$REPO/skills/product-rd-workflow/scripts/zz-fixture-owner-command.sh"
167
189
  chmod +x "$REPO/skills/product-rd-workflow/scripts/zz-fixture-owner-command.sh"
168
- printf '| Fixture accepted command firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: command:skills/product-rd-workflow/scripts/zz-fixture-owner-command.sh | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
190
+ printf '| Fixture accepted command firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: command:skills/product-rd-workflow/scripts/zz-fixture-owner-command.sh | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
191
+ routing_surface_downscope
169
192
  commit_case "changed shebang owner executable as firing path"
170
193
  run_gate
171
194
  assert_not_contains "impact_chain_firing_path_missing" "$out" "a changed shebang owner executable should satisfy the firing-path gate"
@@ -177,8 +200,9 @@ assert_rc "$rc" 0 "a complete RED row with a changed owner executable must pass"
177
200
  # (review owns that residual). The complete sibling row satisfies the gate.
178
201
  new_case case-ref-malformed-row-advisory
179
202
  printf '\n- MUST enforce Fixture reference edit for the malformed-row gate.\n' >> "$REPO/$UPSTREAM_REF"
180
- printf '| Fixture complete sibling row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
203
+ printf '| Fixture complete sibling row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
181
204
  printf '| Fixture malformed row | `downstream-executor` | prose with an unescaped | pipe inside a cell | `updated` | `product-rd-workflow/SKILL.md` second disposition |\n' >> "$REGISTER"
205
+ routing_surface_downscope
182
206
  commit_case "complete row plus malformed sibling row"
183
207
  run_gate
184
208
  assert_contains "impact_chain_row_malformed" "$out" "checker should warn about the malformed row"
@@ -189,7 +213,8 @@ assert_rc "$rc" 0 "a malformed row stays advisory when a complete sibling row sa
189
213
  # label every change "stable" and self-clear the package.
190
214
  new_case case-ref-semantic-control-alone
191
215
  printf '\n- MUST enforce Fixture reference edit for semantic-control firing-path coverage.\n' >> "$REPO/$UPSTREAM_REF"
192
- printf '| Fixture semantic control self-adjudication | `downstream-executor` | behavioral-evidence: semantic-control; observed-failure: no; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
216
+ printf '| Fixture semantic control self-adjudication | `downstream-executor` | behavioral-evidence: semantic-control; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
217
+ routing_surface_downscope
193
218
  commit_case "semantic control label alone"
194
219
  run_gate
195
220
  assert_rc "$rc" 1 "a semantic-control-only owner package must fail"
@@ -199,8 +224,9 @@ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should
199
224
  # non-wording owner; the RED row satisfies the owner-level floor.
200
225
  new_case case-ref-semantic-control-with-owner-red
201
226
  printf '\n- MUST enforce Fixture reference edit for semantic-control plus owner RED validation.\n' >> "$REPO/$UPSTREAM_REF"
202
- printf '| Fixture stable semantic control | `downstream-executor` | behavioral-evidence: semantic-control; observed-failure: no; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` stable control |\n' >> "$REGISTER"
203
- printf '| Fixture owner behavior delta | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` changed behavior |\n' >> "$REGISTER"
227
+ printf '| Fixture stable semantic control | `downstream-executor` | behavioral-evidence: semantic-control; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` stable control |\n' >> "$REGISTER"
228
+ printf '| Fixture owner behavior delta | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` changed behavior |\n' >> "$REGISTER"
229
+ routing_surface_downscope
204
230
  commit_case "semantic control supplemented by owner RED"
205
231
  run_gate
206
232
  assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "valid owner RED should permit a supplementary stable semantic-control row"
@@ -210,7 +236,8 @@ assert_rc "$rc" 0 "semantic-control plus a valid owner RED row should pass"
210
236
  # closed. This is the exact "rule existed but did not execute" regression.
211
237
  new_case case-ref-observed-without-firing-path
212
238
  printf '\nFixture reference edit for the impact-chain firing-path gate.\n' >> "$REPO/$UPSTREAM_REF"
213
- printf '| Fixture observed failure without firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
239
+ printf '| Fixture observed failure without firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
240
+ routing_surface_downscope
214
241
  commit_case "ref edit with observed failure but no firing path"
215
242
  run_gate
216
243
  assert_rc "$rc" 1 "an observed failure without a firing path must fail"
@@ -219,7 +246,8 @@ assert_contains "impact_chain_firing_path_missing" "$out" "checker should name t
219
246
  # Whitespace is not a firing path either.
220
247
  new_case case-ref-observed-with-empty-firing-path
221
248
  printf '\nFixture reference edit for the empty firing-path gate.\n' >> "$REPO/$UPSTREAM_REF"
222
- printf '| Fixture observed failure with empty firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: ; | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
249
+ printf '| Fixture observed failure with empty firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: ; | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
250
+ routing_surface_downscope
223
251
  commit_case "ref edit with empty firing path"
224
252
  run_gate
225
253
  assert_rc "$rc" 1 "an empty firing path must fail"
@@ -228,7 +256,8 @@ assert_contains "impact_chain_firing_path_missing" "$out" "checker should reject
228
256
  # Non-placeholder prose is still not a resolvable firing mechanism.
229
257
  new_case case-ref-observed-with-unresolvable-firing-path
230
258
  printf '\nFixture reference edit for the resolvable firing-path gate.\n' >> "$REPO/$UPSTREAM_REF"
231
- printf '| Fixture observed failure with prose firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: the existing rule | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
259
+ printf '| Fixture observed failure with prose firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: the existing rule | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
260
+ routing_surface_downscope
232
261
  commit_case "ref edit with unresolvable firing path"
233
262
  run_gate
234
263
  assert_rc "$rc" 1 "an arbitrary prose firing path must fail"
@@ -241,7 +270,8 @@ printf '\nFixture reference edit for owner-scoped firing paths.\n' >> "$REPO/$UP
241
270
  mkdir -p "$REPO/skills/grill-me/scripts"
242
271
  printf '#!/usr/bin/env bash\nprintf "fixture cross-owner executable\\n"\n' > "$REPO/skills/grill-me/scripts/zz-fixture-crossowner.sh"
243
272
  chmod +x "$REPO/skills/grill-me/scripts/zz-fixture-crossowner.sh"
244
- printf '| Fixture cross-owner firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: command:skills/grill-me/scripts/zz-fixture-crossowner.sh | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
273
+ printf '| Fixture cross-owner firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: command:skills/grill-me/scripts/zz-fixture-crossowner.sh | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
274
+ routing_surface_downscope
245
275
  commit_case "ref edit with cross-owner firing path"
246
276
  run_gate
247
277
  assert_rc "$rc" 1 "a cross-owner firing mechanism must fail"
@@ -253,7 +283,8 @@ assert_contains "impact_chain_firing_path_missing" "$out" "checker should bind f
253
283
  new_case case-ref-decorative-owner-prose-firing-path
254
284
  printf '\nFixture reference edit for enforcing firing-path coverage.\n' >> "$REPO/$UPSTREAM_REF"
255
285
  printf '\n- This row is recorded for ledger bookkeeping only.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
256
- printf '| Fixture decorative firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#This row is recorded for ledger bookkeeping only | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
286
+ printf '| Fixture decorative firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#This row is recorded for ledger bookkeeping only | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
287
+ routing_surface_downscope
257
288
  commit_case "ref edit with decorative owner prose firing path"
258
289
  run_gate
259
290
  assert_rc "$rc" 1 "decorative owner prose must not satisfy a firing path"
@@ -262,7 +293,8 @@ assert_contains "impact_chain_firing_path_missing" "$out" "checker should requir
262
293
  # A token that exists only in old content is not a newly landed firing point.
263
294
  new_case case-ref-stale-anchor-firing-path
264
295
  printf '\nFixture reference edit for changed-anchor coverage.\n' >> "$REPO/$UPSTREAM_REF"
265
- printf '| Fixture stale-anchor firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Stale anchor fixture sentence must stay unchanged | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
296
+ printf '| Fixture stale-anchor firing path | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Stale anchor fixture sentence must stay unchanged | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
297
+ routing_surface_downscope
266
298
  commit_case "ref edit with stale anchor firing path"
267
299
  run_gate
268
300
  assert_rc "$rc" 1 "an unchanged anchor must fail"
@@ -272,7 +304,8 @@ assert_contains "impact_chain_firing_path_missing" "$out" "checker should requir
272
304
  # gate satisfied.
273
305
  new_case case-ref-with-row
274
306
  printf '\n- MUST enforce Fixture reference edit for the impact-chain refscripts gate.\n' >> "$REPO/$UPSTREAM_REF"
275
- printf '| Fixture reference-path rule | `downstream-executor` | Executor applies the reference behavior; behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
307
+ printf '| Fixture reference-path rule | `downstream-executor` | Executor applies the reference behavior; behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
308
+ routing_surface_downscope
276
309
  commit_case "ref edit with matching impact-chain row"
277
310
  run_gate
278
311
  assert_not_contains "impact_chain_gate_missing" "$out" "a matching row must satisfy the gate for a reference edit"
@@ -284,8 +317,9 @@ assert_rc "$rc" 0 "reference edit with a valid row should pass"
284
317
  # second bare disposition for the same owner.
285
318
  new_case case-ref-complete-row-masks-incomplete-row
286
319
  printf '\n- MUST enforce Fixture reference edit for per-row behavior evidence.\n' >> "$REPO/$UPSTREAM_REF"
287
- printf '| Fixture complete row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
320
+ printf '| Fixture complete row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
288
321
  printf '| Fixture incomplete sibling row | `downstream-executor` | Bare owner citation only | `updated` | `product-rd-workflow/SKILL.md` second disposition |\n' >> "$REGISTER"
322
+ routing_surface_downscope
289
323
  commit_case "one complete row cannot mask one incomplete row"
290
324
  run_gate
291
325
  assert_rc "$rc" 1 "every added row for an owner must carry complete behavior evidence"
@@ -294,6 +328,7 @@ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should
294
328
  # Case 3: an upstream owner's SCRIPT changed with NO impact-chain row -> block.
295
329
  new_case case-script-no-row
296
330
  printf '\n# fixture script edit for the impact-chain refscripts gate\n' >> "$REPO/$UPSTREAM_SCRIPT"
331
+ routing_surface_downscope
297
332
  commit_case "script edit, no impact-chain row"
298
333
  run_gate
299
334
  assert_rc "$rc" 1 "script edit without a row must fail the gate"
@@ -307,7 +342,8 @@ new_case case-ref-indented-row
307
342
  UPSTREAM_REF2="skills/test-artifact-management/references/gen_report.py" # a NON-.md upstream reference
308
343
  [ -f "$REPO/$UPSTREAM_REF2" ] || fail "fixture non-md reference missing: $UPSTREAM_REF2"
309
344
  printf '\n- MUST enforce Fixture reference edit for the impact-chain refscripts gate.\n' >> "$REPO/$UPSTREAM_REF"
310
- printf ' | Fixture indented row | `downstream-executor` | Executor applies the reference behavior; behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
345
+ printf ' | Fixture indented row | `downstream-executor` | Executor applies the reference behavior; behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
346
+ routing_surface_downscope
311
347
  commit_case "ref edit with an indented (valid) impact-chain row"
312
348
  run_gate
313
349
  assert_not_contains "impact_chain_gate_missing" "$out" "an indented but valid evidence row must count"
@@ -316,7 +352,8 @@ assert_rc "$rc" 0 "indented valid row should pass"
316
352
  # Deterministically wording-only rows are the sole no-firing-path exception.
317
353
  new_case case-ref-wording-only-row
318
354
  printf '\n' >> "$REPO/$UPSTREAM_REF"
319
- printf '| Fixture formatting-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` formatting-only edit |\n' >> "$REGISTER"
355
+ printf '| Fixture formatting-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `product-rd-workflow/SKILL.md` formatting-only edit |\n' >> "$REGISTER"
356
+ routing_surface_downscope
320
357
  commit_case "formatting-only edit with explicit evidence"
321
358
  run_gate
322
359
  assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "wording-only row with artifact should satisfy behavior record"
@@ -326,7 +363,8 @@ assert_rc "$rc" 0 "deterministically wording-only row should pass"
326
363
  # A substantive change cannot self-label as wording-only to skip the firing path.
327
364
  new_case case-ref-substantive-mislabeled-wording-only
328
365
  printf '\nSubstantive fixture behavior change.\n' >> "$REPO/$UPSTREAM_REF"
329
- printf '| Fixture mislabeled wording-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` substantive edit |\n' >> "$REGISTER"
366
+ printf '| Fixture mislabeled wording-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `product-rd-workflow/SKILL.md` substantive edit |\n' >> "$REGISTER"
367
+ routing_surface_downscope
330
368
  commit_case "substantive edit mislabeled wording-only"
331
369
  run_gate
332
370
  assert_rc "$rc" 1 "a substantive edit mislabeled wording-only must fail"
@@ -336,7 +374,8 @@ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should
336
374
  # non-wording change must use RED-baseline or semantic-control.
337
375
  new_case case-ref-substantive-mislabeled-wording-only-with-path
338
376
  printf '\nAnother substantive fixture behavior change.\n' >> "$REPO/$UPSTREAM_REF"
339
- printf '| Fixture mislabeled wording-only row with path | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` substantive edit |\n' >> "$REGISTER"
377
+ printf '| Fixture mislabeled wording-only row with path | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` substantive edit |\n' >> "$REGISTER"
378
+ routing_surface_downscope
340
379
  commit_case "substantive edit mislabeled wording-only with path"
341
380
  run_gate
342
381
  assert_rc "$rc" 1 "a firing path must not rescue a false wording-only label"
@@ -347,7 +386,8 @@ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should
347
386
  new_case case-owner-multifile-substantive-mislabeled-wording-only
348
387
  printf '\n' >> "$REPO/$UPSTREAM_REF"
349
388
  printf '\nSubstantive multi-file owner behavior change.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
350
- printf '| Fixture multi-file mislabeled wording-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` multi-file substantive edit |\n' >> "$REGISTER"
389
+ printf '| Fixture multi-file mislabeled wording-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; artifact: diff:product-rd-workflow/SKILL.md; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `product-rd-workflow/SKILL.md` multi-file substantive edit |\n' >> "$REGISTER"
390
+ routing_surface_downscope
351
391
  commit_case "multi-file substantive owner edit mislabeled wording-only"
352
392
  run_gate
353
393
  assert_rc "$rc" 1 "wording-only must be false when any owner file has letter or digit deltas"
@@ -358,7 +398,8 @@ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should
358
398
  # so it must not be classifiable as wording-only.
359
399
  new_case case-ref-nonmd-punctuation-mislabeled-wording-only
360
400
  printf '\n#\n' >> "$REPO/$UPSTREAM_REF2"
361
- printf '| Fixture non-md punctuation wording-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; observed-failure: no | `updated` | `test-artifact-management/SKILL.md` runnable reference edit |\n' >> "$REGISTER"
401
+ printf '| Fixture non-md punctuation wording-only row | `downstream-executor` | behavioral-evidence: not-required wording-only; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `test-artifact-management/SKILL.md` runnable reference edit |\n' >> "$REGISTER"
402
+ routing_surface_downscope
362
403
  commit_case "punctuation-only edit to a runnable reference mislabeled wording-only"
363
404
  run_gate
364
405
  assert_rc "$rc" 1 "a non-md owner file change must never classify as wording-only"
@@ -368,7 +409,8 @@ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should
368
409
  # start its own semicolon-delimited fragment.
369
410
  new_case case-ref-embedded-declaration-key
370
411
  printf '\n- MUST enforce Fixture reference edit for the embedded-key gate.\n' >> "$REPO/$UPSTREAM_REF"
371
- printf '| Fixture embedded key row | `downstream-executor` | there is no behavioral-evidence: RED-baseline here; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
412
+ printf '| Fixture embedded key row | `downstream-executor` | there is no behavioral-evidence: RED-baseline here; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Fixture reference edit | `updated` | `product-rd-workflow/SKILL.md` reference edit |\n' >> "$REGISTER"
413
+ routing_surface_downscope
372
414
  commit_case "declaration key embedded in prose"
373
415
  run_gate
374
416
  assert_rc "$rc" 1 "an embedded declaration key must not parse as a declaration"
@@ -378,6 +420,7 @@ assert_contains "impact_chain_behavior_evidence_missing" "$out" "checker should
378
420
  # must never read as "no changed owners".
379
421
  new_case case-git-diff-failure-fails-closed
380
422
  printf '\nFixture reference edit for the git fail-closed gate.\n' >> "$REPO/$UPSTREAM_REF"
423
+ routing_surface_downscope
381
424
  commit_case "ref edit behind a failing git diff"
382
425
  GIT_SHIM_DIR="$TMP/git-shim"
383
426
  mkdir -p "$GIT_SHIM_DIR"
@@ -396,6 +439,7 @@ assert_contains "impact_chain_git_failed" "$out" "checker should name the failed
396
439
  # Editing it without an impact-chain row must not bypass the gate.
397
440
  new_case case-research-owner-no-row
398
441
  printf '\nFixture research-owner edit for impact-chain coverage.\n' >> "$REPO/skills/multi-perspective-research/SKILL.md"
442
+ routing_surface_downscope
399
443
  commit_case "research owner edit, no impact-chain row"
400
444
  run_gate
401
445
  assert_rc "$rc" 1 "a research-owner edit without an impact-chain row must fail"
@@ -406,6 +450,7 @@ assert_contains "multi-perspective-research/SKILL.md" "$out" "diagnostic should
406
450
  # escape the same impact-chain row requirement that they impose on other owners.
407
451
  new_case case-extraction-owner-no-row
408
452
  printf '\n- MUST enforce fixture extraction-owner behavior.\n' >> "$REPO/skills/skill-extraction-workflow/SKILL.md"
453
+ routing_surface_downscope
409
454
  commit_case "skill-extraction owner edit, no impact-chain row"
410
455
  run_gate
411
456
  assert_rc "$rc" 1 "the extraction owner must require its own impact-chain row"
@@ -416,6 +461,7 @@ assert_contains "skill-extraction-workflow/SKILL.md" "$out" "diagnostic should n
416
461
  # helper) also ships behavior and must require a row. Guards the references/.+ fix.
417
462
  new_case case-nonmd-ref-no-row
418
463
  printf '\n# fixture edit to a non-md upstream reference helper\n' >> "$REPO/$UPSTREAM_REF2"
464
+ routing_surface_downscope
419
465
  commit_case "non-md reference edit, no impact-chain row"
420
466
  run_gate
421
467
  assert_rc "$rc" 1 "a non-.md reference edit without a row must fail the gate"
@@ -427,6 +473,7 @@ assert_contains "test-artifact-management/SKILL.md" "$out" "diagnostic should na
427
473
  # path. Guards the --no-renames fix.
428
474
  new_case case-ref-moveout
429
475
  git -C "$REPO" mv "$MOVEOUT_REL" "docs/zz-fixture-moveout.md"
476
+ routing_surface_downscope
430
477
  commit_case "move an upstream reference out of skills/ with no row"
431
478
  run_gate
432
479
  assert_rc "$rc" 1 "moving an upstream reference out of skills/ without a row must fail"
@@ -439,7 +486,8 @@ assert_contains "product-rd-workflow/SKILL.md" "$out" "diagnostic should name th
439
486
  new_case case-ref-moveout-with-replacement-row
440
487
  git -C "$REPO" mv "$MOVEOUT_REL" "docs/zz-fixture-moveout.md"
441
488
  printf '\n- MUST enforce Fixture replacement rule after deleting an owner reference.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
442
- printf '| Fixture move-out replacement row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#Fixture replacement rule after deleting an owner reference | `updated` | `product-rd-workflow/SKILL.md` replacement rule |\n' >> "$REGISTER"
489
+ printf '| Fixture move-out replacement row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#Fixture replacement rule after deleting an owner reference | `updated` | `product-rd-workflow/SKILL.md` replacement rule |\n' >> "$REGISTER"
490
+ routing_surface_downscope
443
491
  commit_case "move an upstream reference out with replacement evidence"
444
492
  run_gate
445
493
  assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "a deletion covered by a surviving changed firing path should validate"
@@ -450,6 +498,7 @@ assert_rc "$rc" 0 "move-out with complete deleted-subject evidence should pass"
450
498
  # row to it (with no other upstream change) must NOT demand a self-referential row.
451
499
  new_case case-register-only
452
500
  printf '\n<!-- fixture: benign ledger note, no upstream change -->\n' >> "$REGISTER"
501
+ routing_surface_downscope
453
502
  commit_case "register-only edit is excluded"
454
503
  run_gate
455
504
  assert_not_contains "impact_chain_gate_missing" "$out" "editing only the ledger must not trigger the gate"
@@ -459,7 +508,7 @@ assert_rc "$rc" 0 "register-only edit should pass"
459
508
  # skill-extraction-workflow itself; the surviving owner SKILL remains bound.
460
509
  new_case case-extraction-owner-ledger-exclusion
461
510
  printf '\n- MUST enforce Fixture extraction owner ledger exclusion.\n' >> "$REPO/skills/skill-extraction-workflow/SKILL.md"
462
- printf '| Fixture extraction ledger exclusion | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/skill-extraction-workflow/SKILL.md#Fixture extraction owner ledger exclusion | `updated` | `skill-extraction-workflow/SKILL.md` fixture rule |\n' >> "$REGISTER"
511
+ printf '| Fixture extraction ledger exclusion | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/skill-extraction-workflow/SKILL.md#Fixture extraction owner ledger exclusion | `updated` | `skill-extraction-workflow/SKILL.md` fixture rule |\n' >> "$REGISTER"
463
512
  git -C "$REPO" add -A
464
513
  git -C "$REPO" commit -qm "extraction owner ledger exclusion"
465
514
  run_gate
@@ -474,7 +523,8 @@ assert_rc "$rc" 0 "extraction owner change plus ledger row should pass"
474
523
  new_case case-owner-package-renamed
475
524
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
476
525
  printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
477
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
526
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
527
+ routing_surface_downscope
478
528
  commit_case "rename an upstream owner package with a row on the surviving name"
479
529
  run_gate
480
530
  assert_not_contains "platform-observability/SKILL.md" "$out" "the renamed-away path must not be demanded as a row subject"
@@ -486,6 +536,7 @@ assert_rc "$rc" 0 "renaming an owner package with a row on the new name should p
486
536
  new_case case-owner-package-renamed-live-owner-still-bound
487
537
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
488
538
  printf '\nFixture reference edit alongside an unrelated owner rename.\n' >> "$REPO/$UPSTREAM_REF"
539
+ routing_surface_downscope
489
540
  commit_case "rename one owner while editing another owner's reference, no row"
490
541
  run_gate
491
542
  assert_rc "$rc" 1 "a live owner's reference edit must still demand a row"
@@ -501,8 +552,9 @@ assert_not_contains "platform-observability/SKILL.md" "$out" "the renamed-away p
501
552
  new_case case-identifier-rename-retarget
502
553
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
503
554
  retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis"
504
- printf '| Fixture retarget row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
505
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
555
+ printf '| Fixture retarget row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
556
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
557
+ routing_surface_downscope
506
558
  commit_case "retarget a pointer at a renamed skill"
507
559
  run_gate
508
560
  assert_rc "$rc" 1 "the renamed owner itself must not take the no-behaviour class"
@@ -516,8 +568,9 @@ new_case case-identifier-rename-smuggled-content
516
568
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
517
569
  retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis"
518
570
  printf '\n- Smuggled fixture rule that must never ride in on a rename.\n' >> "$REPO/skills/defect-diagnosis/SKILL.md"
519
- printf '| Fixture smuggled row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
520
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
571
+ printf '| Fixture smuggled row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
572
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
573
+ routing_surface_downscope
521
574
  commit_case "smuggle content alongside a retarget"
522
575
  run_gate
523
576
  assert_rc "$rc" 1 "content smuggled alongside a retarget must lose the class"
@@ -527,7 +580,8 @@ assert_contains "defect-diagnosis/SKILL.md" "$out" "the smuggling owner must be
527
580
  # no rename pairs there is no transform that could reproduce the bytes.
528
581
  new_case case-identifier-rename-declared-without-any-rename
529
582
  printf '\n- Fixture rule added with no rename anywhere in the diff.\n' >> "$REPO/skills/defect-diagnosis/SKILL.md"
530
- printf '| Fixture bogus rename row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` no rename happened |\n' >> "$REGISTER"
583
+ printf '| Fixture bogus rename row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` no rename happened |\n' >> "$REGISTER"
584
+ routing_surface_downscope
531
585
  commit_case "declare identifier-rename with no rename in the diff"
532
586
  run_gate
533
587
  assert_rc "$rc" 1 "the class must be refused when the diff contains no rename"
@@ -538,6 +592,7 @@ assert_rc "$rc" 1 "the class must be refused when the diff contains no rename"
538
592
  # self-contradicting gate did not have, because that one failed closed.
539
593
  new_case case-owner-package-deleted-still-bound
540
594
  git -C "$REPO" rm -rq skills/platform-observability
595
+ routing_surface_downscope
541
596
  commit_case "delete an upstream owner package outright with no row"
542
597
  run_gate
543
598
  assert_rc "$rc" 1 "deleting an upstream owner without a row must still block"
@@ -554,8 +609,9 @@ rm -f "$REPO/skills/defect-diagnosis/agents/openai.yaml"
554
609
  # The destination owes real evidence now, so give it a valid owner-scoped anchor;
555
610
  # otherwise the gate stops on that row and never reaches the dependent owner.
556
611
  printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
557
- printf '| Fixture dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
558
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
612
+ printf '| Fixture dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
613
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
614
+ routing_surface_downscope
559
615
  commit_case "a dependent owner drops a file while retargeting"
560
616
  run_gate
561
617
  assert_rc "$rc" 1 "a dependent owner that drops a package file must lose the class"
@@ -567,6 +623,7 @@ assert_contains "defect-diagnosis/SKILL.md" "$out" "the dependent owner must be
567
623
  new_case case-rename-to-unselected-slug-still-bound
568
624
  git -C "$REPO" mv skills/tighten-doc skills/zz-fixture-unselected
569
625
  find "$REPO/skills/zz-fixture-unselected" -type f -exec perl -pi -e 's/tighten-doc/zz-fixture-unselected/g' {} +
626
+ routing_surface_downscope
570
627
  commit_case "rename a curated owner to a slug nobody added to the curated list"
571
628
  run_gate
572
629
  assert_rc "$rc" 1 "a curated owner renamed out of the curated list must not escape the gate"
@@ -581,8 +638,9 @@ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
581
638
  retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/product-rd-workflow"
582
639
  chmod -x "$REPO/$UPSTREAM_SCRIPT"
583
640
  printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
584
- printf '| Fixture exec-bit row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` pointer retarget |\n' >> "$REGISTER"
585
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
641
+ printf '| Fixture exec-bit row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `product-rd-workflow/SKILL.md` pointer retarget |\n' >> "$REGISTER"
642
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
643
+ routing_surface_downscope
586
644
  commit_case "a dependent owner loses a script's executable bit while retargeting"
587
645
  run_gate
588
646
  assert_rc "$rc" 1 "dropping an executable bit must lose the class"
@@ -595,8 +653,9 @@ git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
595
653
  retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis"
596
654
  printf '\377\376 not utf-8 \377' > "$REPO/skills/defect-diagnosis/zz-fixture-binary.bin"
597
655
  printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
598
- printf '| Fixture binary row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
599
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
656
+ printf '| Fixture binary row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
657
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
658
+ routing_surface_downscope
600
659
  commit_case "a dependent owner package tracks a non-UTF-8 blob"
601
660
  run_gate
602
661
  assert_not_contains "invalid byte sequence" "$out" "a non-UTF-8 blob must not crash the comparison"
@@ -612,8 +671,9 @@ git -C "$REPO" mv skills/platform-signal-evidence/references/platform-observabil
612
671
  skills/platform-signal-evidence/references/platform-signal-evidence-playbook.md
613
672
  retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis"
614
673
  printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
615
- printf '| Fixture inner-rename dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
616
- printf '| Fixture inner-rename owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
674
+ printf '| Fixture inner-rename dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` pointer retarget |\n' >> "$REGISTER"
675
+ printf '| Fixture inner-rename owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
676
+ routing_surface_downscope
617
677
  commit_case "rename an owner whose inner filename carries the slug"
618
678
  run_gate
619
679
  assert_not_contains "platform-observability/SKILL.md" "$out" "an inner filename carrying the slug must not break the move proof"
@@ -626,9 +686,11 @@ assert_rc "$rc" 0 "a rename that also renames a slug-named inner file should sti
626
686
  # description entry instead. Exempting it would drop the evidence requirement from
627
687
  # the class carrying the most behaviour.
628
688
  new_case case-routing-surface-description-anchor
689
+ routing_surface_downscope
629
690
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
630
691
  "$REPO/skills/product-rd-workflow/SKILL.md"
631
- printf '| Fixture routing-surface row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description-only |\n' >> "$REGISTER"
692
+ printf '| Fixture routing-surface row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description-only |\n' >> "$REGISTER"
693
+ routing_surface_downscope
632
694
  commit_case "routing-surface: anchor bound to the changed description"
633
695
  run_gate
634
696
  assert_not_contains "impact_chain_firing_path_missing" "$out" "a changed description must be an anchorable firing path when it is the owner's whole change"
@@ -640,29 +702,35 @@ assert_rc "$rc" 0 "a description-only owner may anchor its firing path on the ch
640
702
  # description line cannot meet. Each case varies exactly one of the three arms;
641
703
  # without the third, the non-description frontmatter comparison stays unmeasured.
642
704
  new_case case-routing-surface-anchor-refused-with-body-edit
705
+ routing_surface_downscope
643
706
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
644
707
  "$REPO/skills/product-rd-workflow/SKILL.md"
645
708
  printf '\n- Never skip the smuggled fixture body rule for this gate.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
646
- printf '| Fixture routing-surface body row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus body |\n' >> "$REGISTER"
709
+ printf '| Fixture routing-surface body row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus body |\n' >> "$REGISTER"
710
+ routing_surface_downscope
647
711
  commit_case "routing-surface: body content beside the description"
648
712
  run_gate
649
713
  assert_rc "$rc" 1 "a body edit riding along must take back the ordinary anchor bar"
650
714
 
651
715
  new_case case-routing-surface-anchor-refused-with-reference-edit
716
+ routing_surface_downscope
652
717
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
653
718
  "$REPO/skills/product-rd-workflow/SKILL.md"
654
719
  printf '\n- Never skip the smuggled fixture reference rule for this gate.\n' >> "$REPO/$UPSTREAM_REF"
655
- printf '| Fixture routing-surface reference row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus reference |\n' >> "$REGISTER"
720
+ printf '| Fixture routing-surface reference row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus reference |\n' >> "$REGISTER"
721
+ routing_surface_downscope
656
722
  commit_case "routing-surface: sibling reference beside the description"
657
723
  run_gate
658
724
  assert_rc "$rc" 1 "a sibling reference edit must take back the ordinary anchor bar"
659
725
 
660
726
  new_case case-routing-surface-anchor-refused-with-frontmatter-key
727
+ routing_surface_downscope
661
728
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
662
729
  "$REPO/skills/product-rd-workflow/SKILL.md"
663
730
  perl -0pi -e 's/^(name: product-rd-workflow)$/$1\nfixture_extra_key: smuggled/m' \
664
731
  "$REPO/skills/product-rd-workflow/SKILL.md"
665
- printf '| Fixture routing-surface frontmatter row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus another frontmatter key |\n' >> "$REGISTER"
732
+ printf '| Fixture routing-surface frontmatter row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus another frontmatter key |\n' >> "$REGISTER"
733
+ routing_surface_downscope
666
734
  commit_case "routing-surface: second frontmatter key beside the description"
667
735
  run_gate
668
736
  assert_rc "$rc" 1 "a second frontmatter key must take back the ordinary anchor bar"
@@ -673,9 +741,11 @@ assert_rc "$rc" 1 "a second frontmatter key must take back the ordinary anchor b
673
741
  # prefix would leave exactly these owners unanchorable, which is the problem this
674
742
  # widening exists to solve.
675
743
  new_case case-routing-surface-anchor-on-continuation-line
744
+ routing_surface_downscope
676
745
  perl -0pi -e 's/^description: (.+)$/description: >-\n $1\n Fixture routing-surface trigger clause./m' \
677
746
  "$REPO/skills/product-rd-workflow/SKILL.md"
678
- printf '| Fixture routing-surface folded row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` folded description |\n' >> "$REGISTER"
747
+ printf '| Fixture routing-surface folded row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` folded description |\n' >> "$REGISTER"
748
+ routing_surface_downscope
679
749
  commit_case "routing-surface: anchor on a folded-scalar continuation line"
680
750
  run_gate
681
751
  assert_rc "$rc" 0 "an anchor inside a folded description entry must bind"
@@ -689,10 +759,12 @@ perl -0pi -e 's/^description: (.+)$/description: >-\n $1\n Fixture routing-sur
689
759
  git -C "$REPO" add -A; git -C "$REPO" commit -qm "seed folded description base"
690
760
  git -C "$REPO" switch -q -C case-routing-surface-anchor-after-deletion fixture-folded
691
761
  git -C "$REPO" branch --set-upstream-to=fixture-folded case-routing-surface-anchor-after-deletion >/dev/null 2>&1
762
+ routing_surface_downscope
692
763
  perl -0pi -e 's/\n Fixture routing-surface second clause\.//' "$REPO/skills/product-rd-workflow/SKILL.md"
693
764
  [ -z "$(git -C "$REPO" diff fixture-folded -- skills/product-rd-workflow/SKILL.md | grep -E '^\+[^+]')" ] \
694
765
  || fail "deletion fixture must add no line to the owner entrypoint"
695
- printf '| Fixture routing-surface deletion row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` deleted continuation line |\n' >> "$REGISTER"
766
+ printf '| Fixture routing-surface deletion row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` deleted continuation line |\n' >> "$REGISTER"
767
+ routing_surface_downscope
696
768
  commit_case "routing-surface: continuation line deleted, nothing added"
697
769
  run_gate
698
770
  assert_rc "$rc" 0 "a description change that only deletes a continuation line must still qualify"
@@ -701,9 +773,11 @@ assert_rc "$rc" 0 "a description change that only deletes a continuation line mu
701
773
  # ride inside the entry — and even carry the anchor — if the entry boundary were
702
774
  # the only check. The value must still be a string.
703
775
  new_case case-routing-surface-nested-mapping-refused
776
+ routing_surface_downscope
704
777
  perl -0pi -e 's/^description: .+$/description:\n hidden_key: Fixture routing-surface trigger clause/m' \
705
778
  "$REPO/skills/product-rd-workflow/SKILL.md"
706
- printf '| Fixture routing-surface nested row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` nested description |\n' >> "$REGISTER"
779
+ printf '| Fixture routing-surface nested row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` nested description |\n' >> "$REGISTER"
780
+ routing_surface_downscope
707
781
  commit_case "routing-surface: description turned into a nested mapping"
708
782
  run_gate
709
783
  assert_rc "$rc" 1 "a description that is not a string must lose the anchor widening"
@@ -712,9 +786,11 @@ assert_rc "$rc" 1 "a description that is not a string must lose the anchor widen
712
786
  # at the blank line would push the later paragraph into the "other keys" set and
713
787
  # refuse an ordinary description edit.
714
788
  new_case case-routing-surface-blank-line-in-folded-description
789
+ routing_surface_downscope
715
790
  perl -0pi -e 's/^description: (.+)$/description: >-\n $1\n\n Fixture routing-surface trigger clause./m' \
716
791
  "$REPO/skills/product-rd-workflow/SKILL.md"
717
- printf '| Fixture routing-surface blank-line row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` folded description with blank line |\n' >> "$REGISTER"
792
+ printf '| Fixture routing-surface blank-line row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` folded description with blank line |\n' >> "$REGISTER"
793
+ routing_surface_downscope
718
794
  commit_case "routing-surface: folded description containing a blank line"
719
795
  run_gate
720
796
  assert_rc "$rc" 0 "a blank line inside a folded description must not break the entry boundary"
@@ -722,9 +798,11 @@ assert_rc "$rc" 0 "a blank line inside a folded description must not break the e
722
798
  # The locator for this class is the canonical field name. A free-text substring
723
799
  # that merely SURVIVED the edit identifies nothing, so it must not be accepted.
724
800
  new_case case-routing-surface-surviving-substring-locator-refused
801
+ routing_surface_downscope
725
802
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' \
726
803
  "$REPO/skills/product-rd-workflow/SKILL.md"
727
- printf '| Fixture routing-surface substring row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#Fixture routing-surface trigger clause | `updated` | `product-rd-workflow/SKILL.md` substring locator |\n' >> "$REGISTER"
804
+ printf '| Fixture routing-surface substring row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#Fixture routing-surface trigger clause | `updated` | `product-rd-workflow/SKILL.md` substring locator |\n' >> "$REGISTER"
805
+ routing_surface_downscope
728
806
  commit_case "routing-surface: free-text substring locator"
729
807
  run_gate
730
808
  assert_rc "$rc" 1 "a free-text substring must not serve as the locator for this class"
@@ -732,9 +810,11 @@ assert_rc "$rc" 1 "a free-text substring must not serve as the locator for this
732
810
  # A quoted top-level key is valid YAML; refusing it would block a legitimate
733
811
  # description-only change with no satisfiable anchor.
734
812
  new_case case-routing-surface-quoted-key
813
+ routing_surface_downscope
735
814
  perl -0pi -e 's/^description: (.+)$/"description": $1 Fixture routing-surface trigger clause./m' \
736
815
  "$REPO/skills/product-rd-workflow/SKILL.md"
737
- printf '| Fixture routing-surface quoted row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` quoted description key |\n' >> "$REGISTER"
816
+ printf '| Fixture routing-surface quoted row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` quoted description key |\n' >> "$REGISTER"
817
+ routing_surface_downscope
738
818
  commit_case "routing-surface: quoted description key"
739
819
  run_gate
740
820
  assert_rc "$rc" 0 "a quoted description key must still qualify"
@@ -742,13 +822,15 @@ assert_rc "$rc" 0 "a quoted description key must still qualify"
742
822
  # A sibling frontmatter key that deserializes to a Date (or uses an alias) must
743
823
  # not refuse the class: this check cares only about the description value.
744
824
  new_case case-routing-surface-date-sibling-key
825
+ routing_surface_downscope
745
826
  perl -0pi -e 's/^(name: product-rd-workflow)$/$1\nreleased: 2026-08-11/m' "$REPO/skills/product-rd-workflow/SKILL.md"
746
827
  git -C "$REPO" add -A; git -C "$REPO" commit -qm "seed date sibling key"
747
828
  git -C "$REPO" branch -f fixture-dated HEAD
748
829
  git -C "$REPO" switch -q -C case-routing-surface-date-sibling-key fixture-dated
749
830
  git -C "$REPO" branch --set-upstream-to=fixture-dated case-routing-surface-date-sibling-key >/dev/null 2>&1
750
831
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
751
- printf '| Fixture routing-surface dated row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside a date key |\n' >> "$REGISTER"
832
+ printf '| Fixture routing-surface dated row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside a date key |\n' >> "$REGISTER"
833
+ routing_surface_downscope
752
834
  commit_case "routing-surface: date-valued sibling frontmatter key"
753
835
  run_gate
754
836
  assert_rc "$rc" 0 "a date-valued sibling key must not refuse the class"
@@ -781,8 +863,10 @@ run_gate_dateless() {
781
863
  set -e
782
864
  }
783
865
  new_case case-routing-surface-dateless-host
866
+ routing_surface_downscope
784
867
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
785
- printf '| Fixture routing-surface dateless row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description judged on a date-less host |\n' >> "$REGISTER"
868
+ printf '| Fixture routing-surface dateless row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description judged on a date-less host |\n' >> "$REGISTER"
869
+ routing_surface_downscope
786
870
  commit_case "routing-surface: description-only change judged on a date-less host"
787
871
  run_gate_dateless
788
872
  assert_rc "$rc" 0 "a date-less host must not refuse the routing-surface class"
@@ -813,7 +897,8 @@ assert_contains "product-rd-workflow/SKILL.md" "$out" "the mutant must name the
813
897
  git -C "$REPO" switch -q -C case-routing-surface-dateless-dated-sibling fixture-dated
814
898
  git -C "$REPO" branch --set-upstream-to=fixture-dated case-routing-surface-dateless-dated-sibling >/dev/null 2>&1
815
899
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
816
- printf '| Fixture routing-surface dateless dated row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` dated sibling on a date-less host |\n' >> "$REGISTER"
900
+ printf '| Fixture routing-surface dateless dated row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` dated sibling on a date-less host |\n' >> "$REGISTER"
901
+ routing_surface_downscope
817
902
  commit_case "routing-surface: date-valued sibling judged on a date-less host"
818
903
  run_gate_dateless
819
904
  assert_rc "$rc" 0 "parsing a date-valued sibling on a date-less host must still qualify"
@@ -821,10 +906,12 @@ assert_rc "$rc" 0 "parsing a date-valued sibling on a date-less host must still
821
906
  # A file MOVED OUT of the owner package must take back the ordinary bar: the diff
822
907
  # is read with --no-renames, so the vacated path still counts as an owner change.
823
908
  new_case case-routing-surface-file-moved-out
909
+ routing_surface_downscope
824
910
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
825
911
  mkdir -p "$REPO/docs"
826
912
  git -C "$REPO" mv "$MOVEOUT_REL" docs/zz-fixture-moveout.md
827
- printf '| Fixture routing-surface moveout row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus a file moved out |\n' >> "$REGISTER"
913
+ printf '| Fixture routing-surface moveout row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus a file moved out |\n' >> "$REGISTER"
914
+ routing_surface_downscope
828
915
  commit_case "routing-surface: owner file moved out of the package"
829
916
  run_gate
830
917
  assert_rc "$rc" 1 "a file moved out of the package must take back the ordinary bar"
@@ -832,9 +919,11 @@ assert_rc "$rc" 1 "a file moved out of the package must take back the ordinary b
832
919
  # The entrypoint's MODE is part of its identity: bytes alone would let a chmod
833
920
  # ride along with a description edit and still read as description-only.
834
921
  new_case case-routing-surface-mode-change-refused
922
+ routing_surface_downscope
835
923
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
836
924
  chmod +x "$REPO/skills/product-rd-workflow/SKILL.md"
837
- printf '| Fixture routing-surface mode row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus mode change |\n' >> "$REGISTER"
925
+ printf '| Fixture routing-surface mode row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus mode change |\n' >> "$REGISTER"
926
+ routing_surface_downscope
838
927
  commit_case "routing-surface: entrypoint mode changed alongside the description"
839
928
  run_gate
840
929
  assert_rc "$rc" 1 "a mode change riding along must take back the ordinary bar"
@@ -845,19 +934,21 @@ assert_rc "$rc" 1 "a mode change riding along must take back the ordinary bar"
845
934
  # refusing the locator here would refuse an owner with nothing else to evidence —
846
935
  # and on an integration branch that accumulates rounds, that is the normal shape.
847
936
  new_case case-routing-surface-with-retargeted-sibling
937
+ routing_surface_downscope
848
938
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
849
939
  git -C "$REPO" mv skills/platform-signal-evidence/references/platform-observability-playbook.md \
850
940
  skills/platform-signal-evidence/references/platform-signal-evidence-playbook.md
851
941
  retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis" "$REPO/skills/product-rd-workflow"
852
942
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
853
943
  printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
854
- printf '| Fixture retargeted-sibling row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside retargeted references |\n' >> "$REGISTER"
855
- printf '| Fixture retargeted-sibling dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
856
- printf '| Fixture retargeted-sibling owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
944
+ printf '| Fixture retargeted-sibling row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside retargeted references |\n' >> "$REGISTER"
945
+ printf '| Fixture retargeted-sibling dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
946
+ printf '| Fixture retargeted-sibling owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
857
947
  # Keep this case's only script untouched so it varies exactly one thing.
858
948
  git -C "$REPO" checkout fixture-base -- skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh
859
949
  [ -n "$(git -C "$REPO" diff --name-only fixture-base -- 'skills/product-rd-workflow/references/*.md')" ] \
860
950
  || fail "positive case must actually retarget an eligible .md sibling"
951
+ routing_surface_downscope
861
952
  commit_case "routing-surface: description beside a pure rename retarget in the same package"
862
953
  run_gate
863
954
  assert_rc "$rc" 0 "a package whose non-entrypoint changes are a proven retarget must not lose the locator"
@@ -865,6 +956,7 @@ assert_rc "$rc" 0 "a package whose non-entrypoint changes are a proven retarget
865
956
  # The composition is bounded by the SAME byte-exact reproduction: a sibling file
866
957
  # carrying real content beside the retarget still takes the locator away.
867
958
  new_case case-routing-surface-retarget-plus-real-edit
959
+ routing_surface_downscope
868
960
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
869
961
  git -C "$REPO" mv skills/platform-signal-evidence/references/platform-observability-playbook.md \
870
962
  skills/platform-signal-evidence/references/platform-signal-evidence-playbook.md
@@ -872,11 +964,12 @@ retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagno
872
964
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
873
965
  printf '\n- Never skip the smuggled fixture rule beside the retarget.\n' >> "$REPO/$UPSTREAM_REF"
874
966
  printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
875
- printf '| Fixture retarget-plus-edit row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus a real sibling edit |\n' >> "$REGISTER"
876
- printf '| Fixture retarget-plus-edit dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
877
- printf '| Fixture retarget-plus-edit owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
967
+ printf '| Fixture retarget-plus-edit row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description plus a real sibling edit |\n' >> "$REGISTER"
968
+ printf '| Fixture retarget-plus-edit dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
969
+ printf '| Fixture retarget-plus-edit owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
878
970
  # Keep this case's only script untouched so it varies exactly one thing.
879
971
  git -C "$REPO" checkout fixture-base -- skills/product-rd-workflow/scripts/check-agent-contract-coverage.sh
972
+ routing_surface_downscope
880
973
  commit_case "routing-surface: real sibling edit beside the retarget"
881
974
  run_gate
882
975
  assert_rc "$rc" 1 "real content beside the retarget must still take the locator away"
@@ -885,15 +978,17 @@ assert_rc "$rc" 1 "real content beside the retarget must still take the locator
885
978
  # rewriting that identifier was safe there — some occurrences of an old slug are
886
979
  # deliberately kept. Prose only.
887
980
  new_case case-routing-surface-retargeted-script-refused
981
+ routing_surface_downscope
888
982
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
889
983
  git -C "$REPO" mv skills/platform-signal-evidence/references/platform-observability-playbook.md \
890
984
  skills/platform-signal-evidence/references/platform-signal-evidence-playbook.md
891
985
  retarget_all "$REPO/skills/platform-signal-evidence" "$REPO/skills/defect-diagnosis" "$REPO/skills/product-rd-workflow"
892
986
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
893
987
  printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
894
- printf '| Fixture retargeted-script row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside a changed script |\n' >> "$REGISTER"
895
- printf '| Fixture retargeted-script dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
896
- printf '| Fixture retargeted-script owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
988
+ printf '| Fixture retargeted-script row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside a changed script |\n' >> "$REGISTER"
989
+ printf '| Fixture retargeted-script dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
990
+ printf '| Fixture retargeted-script owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
991
+ routing_surface_downscope
897
992
  commit_case "routing-surface: a changed script in the package"
898
993
  run_gate
899
994
  assert_rc "$rc" 1 "a changed script must take the locator away even under a retarget"
@@ -914,9 +1009,10 @@ git -C "$REPO" checkout fixture-base -- skills/product-rd-workflow/scripts/check
914
1009
  ln -s ../../platform-signal-evidence/SKILL.md "$REPO/skills/product-rd-workflow/references/zz-fixture-link.md"
915
1010
  perl -0pi -e 's/^(description: .+)$/$1 Fixture routing-surface trigger clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
916
1011
  printf '\n- Never skip the fixture renamed-owner rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
917
- printf '| Fixture symlink row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside a retargeted symlink |\n' >> "$REGISTER"
918
- printf '| Fixture symlink dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
919
- printf '| Fixture symlink owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1012
+ printf '| Fixture symlink row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description beside a retargeted symlink |\n' >> "$REGISTER"
1013
+ printf '| Fixture symlink dependent row | `downstream-executor` | behavioral-evidence: not-required identifier-rename; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `defect-diagnosis/SKILL.md` pointer retarget only |\n' >> "$REGISTER"
1014
+ printf '| Fixture symlink owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture renamed-owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1015
+ routing_surface_downscope
920
1016
  commit_case "routing-surface: a retargeted .md symlink in the package"
921
1017
  run_gate
922
1018
  assert_rc "$rc" 1 "a retargeted .md symlink must take the locator away"
@@ -935,10 +1031,12 @@ assert_rc "$rc" 1 "a retargeted .md symlink must take the locator away"
935
1031
  # superseded-row notes.
936
1032
  new_case case-round-scope-verdict-stability
937
1033
  printf '\n***\n' >> "$REPO/$UPSTREAM_REF"
938
- printf '| Fixture round-1 punctuation edit | `downstream-executor` | behavioral-evidence: not-required wording-only; observed-failure: no | `updated` | `product-rd-workflow/SKILL.md` punctuation-only round |\n' >> "$REGISTER"
1034
+ printf '| Fixture round-1 punctuation edit | `downstream-executor` | behavioral-evidence: not-required wording-only; observed-failure: no; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK | `updated` | `product-rd-workflow/SKILL.md` punctuation-only round |\n' >> "$REGISTER"
1035
+ routing_surface_downscope
939
1036
  commit_case "round 1: punctuation-only edit declared wording-only"
940
1037
  printf '\n- Never bypass the fixture round-scope rule for this gate.\n' >> "$REPO/$UPSTREAM_REF"
941
- printf '| Fixture round-2 substantive edit | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Never bypass the fixture round-scope rule | `updated` | `product-rd-workflow/SKILL.md` substantive round |\n' >> "$REGISTER"
1038
+ printf '| Fixture round-2 substantive edit | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/references/adr-convention.md#Never bypass the fixture round-scope rule | `updated` | `product-rd-workflow/SKILL.md` substantive round |\n' >> "$REGISTER"
1039
+ routing_surface_downscope
942
1040
  commit_case "round 2: substantive edit to the same owner"
943
1041
  run_gate
944
1042
  assert_rc "$rc" 0 "a landed wording-only row must not be re-judged against a later round"
@@ -950,10 +1048,12 @@ assert_not_contains "impact_chain_behavior_evidence_missing" "$out" "the round-1
950
1048
  # a real round had to drop its product-rd-workflow row before landing.
951
1049
  new_case case-round-scope-description-after-body
952
1050
  printf '\n- Never skip the fixture body-round rule for this gate.\n' >> "$REPO/skills/product-rd-workflow/SKILL.md"
953
- printf '| Fixture body round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#Never skip the fixture body-round rule | `updated` | `product-rd-workflow/SKILL.md` body round |\n' >> "$REGISTER"
1051
+ printf '| Fixture body round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#Never skip the fixture body-round rule | `updated` | `product-rd-workflow/SKILL.md` body round |\n' >> "$REGISTER"
1052
+ routing_surface_downscope
954
1053
  commit_case "round 1: body rule added to the entrypoint"
955
1054
  perl -0pi -e 's/^(description: .+)$/$1 Fixture round-scope routing clause./m' "$REPO/skills/product-rd-workflow/SKILL.md"
956
- printf '| Fixture description round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description-only round |\n' >> "$REGISTER"
1055
+ printf '| Fixture description round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/product-rd-workflow/SKILL.md#description | `updated` | `product-rd-workflow/SKILL.md` description-only round |\n' >> "$REGISTER"
1056
+ routing_surface_downscope
957
1057
  commit_case "round 2: description-only edit to the same owner"
958
1058
  run_gate
959
1059
  assert_rc "$rc" 0 "a description-only round keeps its locator after an earlier body round"
@@ -964,9 +1064,11 @@ assert_not_contains "impact_chain_firing_path_missing" "$out" "the description a
964
1064
  # no rows — an earlier round's row must not cover it.
965
1065
  new_case case-round-scope-trailing-work-uncovered
966
1066
  printf '\n- Never skip the fixture trailing rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
967
- printf '| Fixture trailing round 1 | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture trailing rule | `updated` | `platform-observability/SKILL.md` declared round |\n' >> "$REGISTER"
1067
+ printf '| Fixture trailing round 1 | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture trailing rule | `updated` | `platform-observability/SKILL.md` declared round |\n' >> "$REGISTER"
1068
+ routing_surface_downscope
968
1069
  commit_case "round 1: declared owner change"
969
1070
  printf '\nFixture undeclared trailing edit that no row covers.\n' >> "$REPO/skills/platform-observability/references/platform-observability-playbook.md"
1071
+ routing_surface_downscope
970
1072
  commit_case "trailing round: owner edit with no ledger append"
971
1073
  run_gate
972
1074
  assert_rc "$rc" 1 "owner work in the trailing round must not ride on an earlier round's row"
@@ -978,9 +1080,11 @@ assert_rc "$rc" 1 "owner work in the trailing round must not ride on an earlier
978
1080
  # route, which is the shape a loosening change has to be checked hardest for.
979
1081
  new_case case-round-scope-deleted-row-does-not-count
980
1082
  printf '\n- Never skip the fixture survival rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
981
- printf '| Fixture survival row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture survival rule | `updated` | `platform-observability/SKILL.md` declared round |\n' >> "$REGISTER"
1083
+ printf '| Fixture survival row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture survival rule | `updated` | `platform-observability/SKILL.md` declared round |\n' >> "$REGISTER"
1084
+ routing_surface_downscope
982
1085
  commit_case "round 1: owner change with its row"
983
1086
  perl -ni -e 'print unless /Fixture survival row/' "$REGISTER"
1087
+ routing_surface_downscope
984
1088
  commit_case "round 2: delete the row that vouched for it"
985
1089
  run_gate
986
1090
  assert_rc "$rc" 1 "a row deleted in a later round must not still vouch for the owner"
@@ -993,15 +1097,18 @@ assert_contains "impact_chain_gate_missing" "$out" "a deleted row leaves the own
993
1097
  # would read the transient duplicate as surviving, so the budget is HEAD's
994
1098
  # occurrence count minus base's.
995
1099
  new_case case-round-scope-duplicate-row-laundering
996
- printf '| Fixture duplicate row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture duplicate rule | `updated` | `platform-observability/SKILL.md` pre-existing row |\n' >> "$REGISTER"
1100
+ printf '| Fixture duplicate row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture duplicate rule | `updated` | `platform-observability/SKILL.md` pre-existing row |\n' >> "$REGISTER"
997
1101
  printf '\n- Never skip the fixture duplicate rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1102
+ routing_surface_downscope
998
1103
  commit_case "base: an owner change and its row, both already landed"
999
1104
  git -C "$REPO" branch -q -f dup-base HEAD
1000
1105
  git -C "$REPO" branch --set-upstream-to=dup-base case-round-scope-duplicate-row-laundering >/dev/null 2>&1
1001
1106
  printf '\nFixture second substantive edit that owes its own row.\n' >> "$REPO/skills/platform-observability/references/platform-observability-playbook.md"
1002
- printf '| Fixture duplicate row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture duplicate rule | `updated` | `platform-observability/SKILL.md` pre-existing row |\n' >> "$REGISTER"
1107
+ printf '| Fixture duplicate row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture duplicate rule | `updated` | `platform-observability/SKILL.md` pre-existing row |\n' >> "$REGISTER"
1108
+ routing_surface_downscope
1003
1109
  commit_case "round 1: new owner bytes plus a duplicate of the existing row"
1004
1110
  perl -ni -e 'BEGIN{$n=0} if (/Fixture duplicate row/) { $n++; next if $n == 1 } print' "$REGISTER"
1111
+ routing_surface_downscope
1005
1112
  commit_case "round 2: drop one copy so the ledger ends unchanged"
1006
1113
  run_gate
1007
1114
  assert_rc "$rc" 1 "a duplicated-then-dropped row must not vouch for new owner bytes"
@@ -1016,8 +1123,10 @@ assert_contains "impact_chain_gate_missing" "$out" "the net-zero ledger leaves t
1016
1123
  new_case case-round-scope-merged-worktree-round
1017
1124
  git -C "$REPO" switch -q -c feature-round-merged
1018
1125
  printf '\n- Never skip the fixture merged-round rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1126
+ routing_surface_downscope
1019
1127
  commit_case "worktree round: owner work"
1020
- printf '| Fixture merged round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture merged-round rule | `updated` | `platform-observability/SKILL.md` merged round |\n' >> "$REGISTER"
1128
+ printf '| Fixture merged round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture merged-round rule | `updated` | `platform-observability/SKILL.md` merged round |\n' >> "$REGISTER"
1129
+ routing_surface_downscope
1021
1130
  commit_case "worktree round: its ledger append"
1022
1131
  git -C "$REPO" switch -q case-round-scope-merged-worktree-round
1023
1132
  git -C "$REPO" merge -q --no-ff -m "Merge branch 'feature-round-merged': one worktree round" feature-round-merged
@@ -1029,11 +1138,13 @@ assert_rc "$rc" 0 "a merged worktree round must resolve to one boundary covering
1029
1138
  new_case case-round-scope-after-merged-round
1030
1139
  git -C "$REPO" switch -q -c feature-round-merged-2
1031
1140
  printf '\n- Never skip the fixture merged-round rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1032
- printf '| Fixture merged round 2 | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture merged-round rule | `updated` | `platform-observability/SKILL.md` merged round |\n' >> "$REGISTER"
1141
+ printf '| Fixture merged round 2 | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture merged-round rule | `updated` | `platform-observability/SKILL.md` merged round |\n' >> "$REGISTER"
1142
+ routing_surface_downscope
1033
1143
  commit_case "worktree round: owner work and its ledger append"
1034
1144
  git -C "$REPO" switch -q case-round-scope-after-merged-round
1035
1145
  git -C "$REPO" merge -q --no-ff -m "Merge branch 'feature-round-merged-2': one worktree round" feature-round-merged-2
1036
1146
  printf '\nFixture undeclared edit committed after the merged round.\n' >> "$REPO/skills/platform-observability/references/platform-observability-playbook.md"
1147
+ routing_surface_downscope
1037
1148
  commit_case "after the merge: undeclared owner edit"
1038
1149
  run_gate
1039
1150
  assert_rc "$rc" 1 "work committed after a merged round must not ride on that round's row"
@@ -1047,12 +1158,15 @@ assert_rc "$rc" 1 "work committed after a merged round must not ride on that rou
1047
1158
  # impossible to write.
1048
1159
  new_case case-round-scope-renamed-away-pre-rename-round
1049
1160
  printf '\n- Never skip the fixture pre-rename rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1161
+ routing_surface_downscope
1050
1162
  commit_case "round 1: owner work with no row"
1051
1163
  printf 'Fixture ledger note closing round one without the owner row.\n' >> "$REGISTER"
1164
+ routing_surface_downscope
1052
1165
  commit_case "round 1 boundary: ledger append without the owner row"
1053
1166
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1054
1167
  printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1055
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1168
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1169
+ routing_surface_downscope
1056
1170
  commit_case "round 2: rename the owner with a row on the surviving name"
1057
1171
  run_gate
1058
1172
  assert_rc "$rc" 1 "owner work in a pre-rename round must not escape with the later rename"
@@ -1064,11 +1178,13 @@ assert_contains "platform-observability/SKILL.md" "$out" "the missing row must n
1064
1178
  # invalidate it — rejecting it would demand a row no honest author could write.
1065
1179
  new_case case-round-scope-renamed-away-row-at-round-head
1066
1180
  printf '\n- Never skip the fixture pre-rename declared rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1067
- printf '| Fixture pre-rename declared row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture pre-rename declared rule | `updated` | `platform-observability/SKILL.md` pre-rename round |\n' >> "$REGISTER"
1181
+ printf '| Fixture pre-rename declared row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture pre-rename declared rule | `updated` | `platform-observability/SKILL.md` pre-rename round |\n' >> "$REGISTER"
1182
+ routing_surface_downscope
1068
1183
  commit_case "round 1: owner work with its row"
1069
1184
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1070
1185
  printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1071
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1186
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1187
+ routing_surface_downscope
1072
1188
  commit_case "round 2: rename the owner with a row on the surviving name"
1073
1189
  run_gate
1074
1190
  assert_rc "$rc" 0 "a pre-rename round declared against its own round head must pass"
@@ -1082,9 +1198,11 @@ assert_not_contains "impact_chain_evidence_missing_file" "$out" "a row citing th
1082
1198
  # which is what proves the flag load-bearing.
1083
1199
  new_case case-round-scope-merged-row-before-work
1084
1200
  git -C "$REPO" switch -q -c feature-round-row-first
1085
- printf '| Fixture row-first merged round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture row-first rule | `updated` | `platform-observability/SKILL.md` merged round |\n' >> "$REGISTER"
1201
+ printf '| Fixture row-first merged round | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Never skip the fixture row-first rule | `updated` | `platform-observability/SKILL.md` merged round |\n' >> "$REGISTER"
1202
+ routing_surface_downscope
1086
1203
  commit_case "worktree round: ledger append first"
1087
1204
  printf '\n- Never skip the fixture row-first rule for this gate.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1205
+ routing_surface_downscope
1088
1206
  commit_case "worktree round: owner work after the append"
1089
1207
  git -C "$REPO" switch -q case-round-scope-merged-row-before-work
1090
1208
  git -C "$REPO" merge -q --no-ff -m "Merge branch 'feature-round-row-first': one worktree round" feature-round-row-first
@@ -1099,14 +1217,17 @@ assert_rc "$rc" 0 "a merged worktree round collapses to one boundary even when t
1099
1217
  new_case case-round-scope-transient-rename-hop-undeclared
1100
1218
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1101
1219
  printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1102
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1220
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1221
+ routing_surface_downscope
1103
1222
  commit_case "round A: rename X to Y with a row on the surviving name"
1104
1223
  printf '\n- Never skip the fixture transient-hop rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1105
1224
  printf 'Fixture ledger note closing the transient round without the owner row.\n' >> "$REGISTER"
1225
+ routing_surface_downscope
1106
1226
  commit_case "round B: substantive Y edit closed with no Y row"
1107
1227
  git -C "$REPO" mv skills/platform-signal-evidence skills/platform-telemetry-evidence
1108
1228
  printf '\n- MUST enforce Fixture final renamed owner rule.\n' >> "$REPO/skills/platform-telemetry-evidence/SKILL.md"
1109
- printf '| Fixture final renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-telemetry-evidence/SKILL.md#Fixture final renamed owner rule | `updated` | `platform-telemetry-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1229
+ printf '| Fixture final renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-telemetry-evidence/SKILL.md#Fixture final renamed owner rule | `updated` | `platform-telemetry-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1230
+ routing_surface_downscope
1110
1231
  commit_case "round C: rename Y to Z with a row on the surviving name"
1111
1232
  run_gate
1112
1233
  assert_rc "$rc" 1 "a substantive round on a transient rename hop must not escape undeclared"
@@ -1118,14 +1239,17 @@ assert_contains "platform-signal-evidence/SKILL.md" "$out" "the missing row must
1118
1239
  new_case case-round-scope-transient-rename-hop-declared
1119
1240
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1120
1241
  printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1121
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1242
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1243
+ routing_surface_downscope
1122
1244
  commit_case "round A: rename X to Y with a row on the surviving name"
1123
1245
  printf '\n- Never skip the fixture transient-hop rule for this gate.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1124
- printf '| Fixture transient hop row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture transient-hop rule | `updated` | `platform-signal-evidence/SKILL.md` transient round |\n' >> "$REGISTER"
1246
+ printf '| Fixture transient hop row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Never skip the fixture transient-hop rule | `updated` | `platform-signal-evidence/SKILL.md` transient round |\n' >> "$REGISTER"
1247
+ routing_surface_downscope
1125
1248
  commit_case "round B: substantive Y edit with its own Y row"
1126
1249
  git -C "$REPO" mv skills/platform-signal-evidence skills/platform-telemetry-evidence
1127
1250
  printf '\n- MUST enforce Fixture final renamed owner rule.\n' >> "$REPO/skills/platform-telemetry-evidence/SKILL.md"
1128
- printf '| Fixture final renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-telemetry-evidence/SKILL.md#Fixture final renamed owner rule | `updated` | `platform-telemetry-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1251
+ printf '| Fixture final renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-telemetry-evidence/SKILL.md#Fixture final renamed owner rule | `updated` | `platform-telemetry-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1252
+ routing_surface_downscope
1129
1253
  commit_case "round C: rename Y to Z with a row on the surviving name"
1130
1254
  run_gate
1131
1255
  assert_rc "$rc" 0 "a declared transient-hop chain must pass end to end"
@@ -1140,11 +1264,13 @@ new_case case-round-scope-delete-then-recreate-lookalike
1140
1264
  cp -R "$REPO/skills/platform-observability" "$TMP/stash-lookalike"
1141
1265
  git -C "$REPO" rm -qr skills/platform-observability
1142
1266
  printf 'Fixture ledger note closing the deletion round without the owner row.\n' >> "$REGISTER"
1267
+ routing_surface_downscope
1143
1268
  commit_case "round A: delete the owner with no row"
1144
1269
  cp -R "$TMP/stash-lookalike" "$REPO/skills/platform-signal-evidence"
1145
1270
  retarget_all "$REPO/skills/platform-signal-evidence"
1146
1271
  printf '\n- MUST enforce Fixture recreated owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1147
- printf '| Fixture recreated owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture recreated owner rule | `updated` | `platform-signal-evidence/SKILL.md` recreated owner |\n' >> "$REGISTER"
1272
+ printf '| Fixture recreated owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture recreated owner rule | `updated` | `platform-signal-evidence/SKILL.md` recreated owner |\n' >> "$REGISTER"
1273
+ routing_surface_downscope
1148
1274
  commit_case "round B: recreate a lookalike under a new name with its own row"
1149
1275
  run_gate
1150
1276
  assert_rc "$rc" 1 "a cross-round delete-then-recreate must stay an undeclared deletion"
@@ -1157,11 +1283,13 @@ assert_contains "platform-observability/SKILL.md" "$out" "the deleted owner must
1157
1283
  new_case case-round-scope-declared-rename-cycle
1158
1284
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1159
1285
  printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1160
- printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1286
+ printf '| Fixture renamed owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-signal-evidence/SKILL.md#Fixture renamed owner rule | `updated` | `platform-signal-evidence/SKILL.md` renamed owner |\n' >> "$REGISTER"
1287
+ routing_surface_downscope
1161
1288
  commit_case "round 1: rename A to B with a row on the surviving name"
1162
1289
  git -C "$REPO" mv skills/platform-signal-evidence skills/platform-observability
1163
1290
  printf '\n- MUST enforce Fixture reverted owner rule.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1164
- printf '| Fixture reverted owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Fixture reverted owner rule | `updated` | `platform-observability/SKILL.md` reverted owner |\n' >> "$REGISTER"
1291
+ printf '| Fixture reverted owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Fixture reverted owner rule | `updated` | `platform-observability/SKILL.md` reverted owner |\n' >> "$REGISTER"
1292
+ routing_surface_downscope
1165
1293
  commit_case "round 2: rename B back to A with a row on the surviving name"
1166
1294
  run_gate
1167
1295
  assert_rc "$rc" 0 "a fully-declared rename cycle must pass"
@@ -1172,10 +1300,12 @@ new_case case-round-scope-undeclared-rename-cycle
1172
1300
  git -C "$REPO" mv skills/platform-observability skills/platform-signal-evidence
1173
1301
  printf '\n- MUST enforce Fixture renamed owner rule.\n' >> "$REPO/skills/platform-signal-evidence/SKILL.md"
1174
1302
  printf 'Fixture ledger note closing the outbound rename round without a row.\n' >> "$REGISTER"
1303
+ routing_surface_downscope
1175
1304
  commit_case "round 1: rename A to B with no row"
1176
1305
  git -C "$REPO" mv skills/platform-signal-evidence skills/platform-observability
1177
1306
  printf '\n- MUST enforce Fixture reverted owner rule.\n' >> "$REPO/skills/platform-observability/SKILL.md"
1178
- printf '| Fixture reverted owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md#Fixture reverted owner rule | `updated` | `platform-observability/SKILL.md` reverted owner |\n' >> "$REGISTER"
1307
+ printf '| Fixture reverted owner row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md#Fixture reverted owner rule | `updated` | `platform-observability/SKILL.md` reverted owner |\n' >> "$REGISTER"
1308
+ routing_surface_downscope
1179
1309
  commit_case "round 2: rename B back to A with a row on the surviving name"
1180
1310
  run_gate
1181
1311
  assert_rc "$rc" 1 "the round that created the transient name still owes its row"
@@ -1191,7 +1321,8 @@ new_case case-round-scope-skillmd-directory-masquerade
1191
1321
  git -C "$REPO" rm -q skills/platform-observability/SKILL.md
1192
1322
  mkdir -p "$REPO/skills/platform-observability/SKILL.md"
1193
1323
  printf -- '- MUST enforce Fixture masquerade rule.\n' > "$REPO/skills/platform-observability/SKILL.md/rules.md"
1194
- printf '| Fixture masquerade row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; firing-path: file:skills/platform-observability/SKILL.md/rules.md#Fixture masquerade rule | `updated` | `platform-observability/SKILL.md` masquerade |\n' >> "$REGISTER"
1324
+ printf '| Fixture masquerade row | `downstream-executor` | behavioral-evidence: RED-baseline; observed-failure: yes; result-class: failure; bank-evidence: downscoped:REFSCRIPTS-FIXTURE-NO-BANK; firing-path: file:skills/platform-observability/SKILL.md/rules.md#Fixture masquerade rule | `updated` | `platform-observability/SKILL.md` masquerade |\n' >> "$REGISTER"
1325
+ routing_surface_downscope
1195
1326
  commit_case "replace the entrypoint with a same-named directory and vouch via a nested anchor"
1196
1327
  run_gate
1197
1328
  assert_rc "$rc" 1 "a directory masquerading as SKILL.md must not read as a present entrypoint"