@ccoalm/ccl-skills 0.6.2 → 0.8.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 (139) hide show
  1. package/README.md +2 -2
  2. package/dist/assets/marketplace/plugins/ccl-skills/hooks/hooks.json +11 -0
  3. package/dist/assets/marketplace/plugins/ccl-skills/hooks/remind-unverified-cli-flag.sh +309 -0
  4. package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_remind_unverified_cli_flag.sh +483 -0
  5. package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/ccl-skills.ts +5 -0
  6. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/SKILL.md +10 -8
  7. package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md +1 -1
  8. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +16 -17
  9. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +1 -1
  10. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +195 -7
  11. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/timeout-auth-and-capabilities.md +3 -3
  12. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +13 -5
  13. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/codex_review.sh +9 -3
  14. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_review.sh +9 -3
  15. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/normalize_review_timeout.sh +22 -0
  16. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/opencode_review.sh +9 -3
  17. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +1540 -129
  18. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +8 -3
  19. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_compat.py +76 -1
  20. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +1858 -3
  21. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_update_review_plan_intent.sh +789 -0
  22. package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/update_review_plan_intent.py +513 -0
  23. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/SKILL.md +1 -1
  24. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/architecture-playbook.md +2 -0
  25. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-platform-architecture.md +1 -1
  26. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/event-driven-architecture.md +14 -11
  27. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/multi-tenant-isolation.md +2 -2
  28. package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md +5 -1
  29. package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md +2 -1
  30. package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +13 -11
  31. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/SKILL.md +64 -0
  32. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/agents/openai.yaml +4 -0
  33. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/async-lifecycle-and-performance.md +72 -0
  34. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/runtime-and-project-contract.md +58 -0
  35. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/source-map.md +41 -0
  36. package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/verification-diagnostics-and-security.md +63 -0
  37. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +1 -1
  38. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/sli-slo-design.md +25 -9
  39. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/source-register.md +1 -0
  40. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/SKILL.md +1 -1
  41. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/promotion-gate-and-review.md +16 -0
  42. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/secret-and-config-management.md +7 -0
  43. package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/retry-timeout-circuit-breaker.md +11 -0
  44. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +8 -10
  45. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-routing-and-readiness.md +10 -14
  46. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/verify-developer-experience.md +1 -1
  47. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/SKILL.md +135 -86
  48. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/behavioral-aesthetic-logic.md +66 -80
  49. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/delivery-contract.md +275 -0
  50. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-execution-checklist.md +88 -214
  51. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-impl-naming-and-versioning.md +2 -2
  52. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-intake-and-acceptance.md +10 -8
  53. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md +4 -5
  54. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/external-ui-ux-quality-benchmarks.md +112 -95
  55. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/frontend-code-evidence-map.md +30 -21
  56. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/interaction-design-patterns.md +22 -3
  57. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/layout-recipes-and-screenshot-acceptance.md +20 -17
  58. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-project-token-consistency.md +7 -9
  59. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-stack-strategy.md +14 -10
  60. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/operational-processing-workflows.md +2 -0
  61. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md +1 -1
  62. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-lifecycle-acceptance-and-iteration.md +9 -6
  63. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-surface-patterns.md +3 -0
  64. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/source-map.md +37 -10
  65. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md +7 -1
  66. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md +8 -5
  67. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-design-development.md +16 -5
  68. package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/visual-craft.md +4 -2
  69. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/SKILL.md +5 -1
  70. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/architecture-playbook.md +1 -1
  71. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/audit-history-architecture.md +31 -0
  72. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-platform-architecture.md +1 -1
  73. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/event-driven-architecture.md +7 -4
  74. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/multi-tenant-isolation.md +2 -2
  75. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/notification-architecture.md +28 -0
  76. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/packaging-runtime-readiness.md +1 -1
  77. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/replay-comparison-architecture.md +28 -0
  78. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/workflow-state-architecture.md +39 -0
  79. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md +10 -7
  80. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/ai-service-wiring-patterns.md +8 -0
  81. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/audit-history-patterns.md +29 -0
  82. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/background-job-patterns.md +16 -0
  83. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/batch-and-artifact-patterns.md +25 -1
  84. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/notification-patterns.md +40 -0
  85. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/public-api-security-patterns.md +1 -1
  86. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/replay-comparison-patterns.md +30 -0
  87. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/state-machine-task-patterns.md +48 -0
  88. package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/testing-and-quality-patterns.md +10 -1
  89. package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/SKILL.md +2 -0
  90. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +4 -4
  91. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/coverage-exhaustion-traps.md +45 -0
  92. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +142 -4
  93. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +21 -2
  94. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +11 -9
  95. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/firing-point-placement.md +8 -0
  96. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/parallel-stack-references-pattern.md +5 -4
  97. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/r0-leakage-audit.md +102 -0
  98. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +69 -0
  99. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +10 -0
  100. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +6 -6
  101. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +4 -3
  102. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +93 -2
  103. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-parallel-stack-parity.sh +119 -0
  104. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/extraction_review_gate.sh +22 -0
  105. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +49 -4
  106. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/obligation-ledger.py +2748 -0
  107. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/register-firing-path-resolution.rb +20 -5
  108. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/shared_git_surface_gate.py +1142 -0
  109. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_parallel_stack_parity.sh +183 -0
  110. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +19 -0
  111. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_skill_catalog.sh +41 -4
  112. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_ci_checkout_ref_binding.sh +120 -0
  113. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_entrypoint_domain_scan_terms.sh +82 -8
  114. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_extraction_review_gate.sh +336 -0
  115. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_self_adjudication.sh +82 -10
  116. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_obligation_ledger.sh +1416 -0
  117. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_obligation_ledger_repo_audit.sh +57 -0
  118. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh +141 -4
  119. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh +3 -1
  120. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_shared_git_surface_gate.sh +1696 -0
  121. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_delivery_contract.sh +2117 -0
  122. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_loading_budget.sh +316 -0
  123. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_extraction_review_state.sh +1176 -0
  124. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_cross_refs.sh +31 -1
  125. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh +9 -4
  126. package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate_extraction_review_state.py +980 -0
  127. package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/SKILL.md +9 -6
  128. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +11 -11
  129. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/client-runtime-test-matrices.md +10 -2
  130. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/fitness-functions.md +16 -0
  131. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/scenario-testing.md +1 -1
  132. package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-code-authoring-patterns.md +16 -5
  133. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/SKILL.md +5 -3
  134. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/delivery-face-closeout.md +16 -6
  135. package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/self-benchmark-baseline.md +37 -0
  136. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md +7 -5
  137. package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/complex-workspace-patterns.md +1 -1
  138. package/dist/assets/release.json +275 -105
  139. package/package.json +1 -1
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env bash
2
+ # check-parallel-stack-parity.sh — cross-file parity gate for parallel-stack mirrored references.
3
+ #
4
+ # The parallel-stack pattern (references/parallel-stack-references-pattern.md) requires the
5
+ # mirrored region of each sibling pair — everything from the exact heading line
6
+ # "## When this applies / does not apply" up to the stack-specific
7
+ # "## <Stack>-specific implementation patterns" H2 — to be BYTE-IDENTICAL across the Python
8
+ # and Go trees. There is deliberately NO normalization: earlier versions rewrote routing
9
+ # references and sibling skill names before diffing, and two adversarial rounds each found a
10
+ # fresh way that lossy rewriting could mask real drift (second element of an or-list swapped,
11
+ # canonical pointer replaced by a mapped name, self-reference via name mapping). The
12
+ # capability was removed rather than patched again: routing text that legitimately differs
13
+ # per tree is written INTO the mirrored region naming both trees inline —
14
+ # `x.md` (Python) / `y.md` (Go)
15
+ # — so both files carry the same bytes and a one-sided change is always drift.
16
+ #
17
+ # Marker integrity: each marker must match as an EXACT whole line, exactly once, in order.
18
+ # A missing, duplicated, or prefix-gamed heading is a malformed-markers verdict, never a
19
+ # silent ok. Residual accepted and documented: moving BOTH stop markers earlier in the same
20
+ # change shrinks the compared region symmetrically; that is a visible, reviewable contract
21
+ # edit in the diff, not something this gate can distinguish from a legitimate region change.
22
+ # The optional "## Topic-extension backlog" H2 after the stack-glue H2 is mirrored by
23
+ # convention but excluded from this strict gate (its section rule allows near-identical
24
+ # wording so it can name vendors/engines); keep it in sync by review.
25
+ #
26
+ # Exit codes: 0 = parity ok; 1 = drift / missing file / malformed markers (content verdict);
27
+ # 2 = infrastructure failure (this script could not run its own checks).
28
+ #
29
+ # Usage: check-parallel-stack-parity.sh [repo-root] (default: .)
30
+ set -euo pipefail
31
+
32
+ ROOT="${1:-.}"
33
+ PY_DIR="$ROOT/skills/python-service-architecture/references"
34
+ GO_DIR="$ROOT/skills/go-microservice-architecture/references"
35
+
36
+ START_MARKER="## When this applies / does not apply"
37
+
38
+ PAIRS=(
39
+ "event-driven-architecture.md"
40
+ "multi-tenant-isolation.md"
41
+ "data-platform-architecture.md"
42
+ )
43
+
44
+ # count_exact <file> <exact line> — prints the match count. Distinguishes grep's "no
45
+ # match" (rc 1, a legitimate count of 0) from a hard failure such as an unreadable file
46
+ # (rc >1), which must surface as infrastructure failure, never as a content verdict.
47
+ count_exact() {
48
+ local c rc
49
+ set +e; c=$(grep -cxF "$2" "$1"); rc=$?; set -e
50
+ case "$rc" in
51
+ 0|1) printf '%s\n' "${c:-0}"; return 0 ;;
52
+ *) return 2 ;;
53
+ esac
54
+ }
55
+
56
+ # extract_mirrored <file> <stop-H2 exact line> <out-file>
57
+ # Writes the mirrored region to <out-file> BYTE-EXACTLY (a file, not a command
58
+ # substitution: $(...) strips trailing newlines, which let a trailing blank line before
59
+ # the stack-glue H2 diverge invisibly). Returns 1 on malformed markers (missing,
60
+ # duplicated, or out of order), 2 on infrastructure failure.
61
+ extract_mirrored() {
62
+ local file="$1" stop="$2" out="$3" starts stops start_line stop_line
63
+ starts=$(count_exact "$file" "$START_MARKER") || return 2
64
+ stops=$(count_exact "$file" "$stop") || return 2
65
+ if [ "$starts" -ne 1 ] || [ "$stops" -ne 1 ]; then
66
+ return 1
67
+ fi
68
+ start_line=$(grep -nxF "$START_MARKER" "$file" | head -1 | cut -d: -f1) || return 2
69
+ stop_line=$(grep -nxF "$stop" "$file" | head -1 | cut -d: -f1) || return 2
70
+ if [ "$start_line" -ge "$stop_line" ]; then
71
+ return 1
72
+ fi
73
+ sed -n "${start_line},$((stop_line - 1))p" "$file" > "$out" || return 2
74
+ }
75
+
76
+ WORK="$(mktemp -d "${TMPDIR:-/tmp}/stack-parity.XXXXXX")" || { echo "parity_infra: mktemp failed" >&2; exit 2; }
77
+ trap 'rm -rf "$WORK"' EXIT
78
+
79
+ fail=0
80
+ for f in "${PAIRS[@]}"; do
81
+ py="$PY_DIR/$f"
82
+ go="$GO_DIR/$f"
83
+ if [ ! -f "$py" ] || [ ! -f "$go" ]; then
84
+ echo "parity_missing_file: $f"
85
+ fail=1
86
+ continue
87
+ fi
88
+ py_out="$WORK/py-$f.txt"; go_out="$WORK/go-$f.txt"
89
+ rc=0; extract_mirrored "$py" "## Python-specific implementation patterns" "$py_out" || rc=$?
90
+ if [ "$rc" -eq 2 ]; then echo "parity_infra: $f (python side: grep/sed could not run)" >&2; exit 2; fi
91
+ if [ "$rc" -ne 0 ]; then
92
+ echo "parity_malformed_markers: $f (python side: start/stop heading missing, duplicated, not an exact heading line, or out of order)"
93
+ fail=1
94
+ continue
95
+ fi
96
+ rc=0; extract_mirrored "$go" "## Go-specific implementation patterns" "$go_out" || rc=$?
97
+ if [ "$rc" -eq 2 ]; then echo "parity_infra: $f (go side: grep/sed could not run)" >&2; exit 2; fi
98
+ if [ "$rc" -ne 0 ]; then
99
+ echo "parity_malformed_markers: $f (go side: start/stop heading missing, duplicated, not an exact heading line, or out of order)"
100
+ fail=1
101
+ continue
102
+ fi
103
+ if [ ! -s "$py_out" ] || [ ! -s "$go_out" ]; then
104
+ echo "parity_empty_mirrored_region: $f"
105
+ fail=1
106
+ continue
107
+ fi
108
+ if ! cmp -s "$py_out" "$go_out"; then
109
+ echo "parity_drift: $f"
110
+ diff "$py_out" "$go_out" | head -40 || true
111
+ fail=1
112
+ fi
113
+ done
114
+
115
+ if [ "$fail" -ne 0 ]; then
116
+ echo "parallel_stack_parity_FAIL"
117
+ exit 1
118
+ fi
119
+ echo "parallel_stack_parity_ok"
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bash
2
+ # Extraction-owned autonomous review wrapper: one review plus two challenges.
3
+ set -euo pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
6
+ CONTROLLER="$SCRIPT_DIR/../../code-review/scripts/review_gate.sh"
7
+
8
+ for arg in "$@"; do
9
+ case "$arg" in
10
+ --challenge-b*)
11
+ echo "extraction_review_gate_error: challenge budget is fixed at 2" >&2
12
+ exit 2
13
+ ;;
14
+ esac
15
+ done
16
+
17
+ if [[ ! -x "$CONTROLLER" ]]; then
18
+ echo "extraction_review_gate_error: code-review controller is unavailable" >&2
19
+ exit 2
20
+ fi
21
+
22
+ exec bash "$CONTROLLER" --challenge-budget 2 "$@"
@@ -132,6 +132,7 @@ upstream_owner_skills = %w[
132
132
  llm-inference-integration
133
133
  multi-agent-delegation
134
134
  multi-perspective-research
135
+ nodejs-service-dev
135
136
  platform-observability
136
137
  platform-release-engineering
137
138
  platform-service-connectivity
@@ -292,8 +293,10 @@ upstream = upstream.reject do |path|
292
293
  rename_excused[path] = true if excused
293
294
  excused
294
295
  end
295
- # The block runs when a selected owner changed (there is something to demand) OR
296
- # when the ledger itself changed (there is something to validate). It used to
296
+ # The block runs when a selected owner changed (there is something to demand),
297
+ # when any skill entrypoint changed (its description may owe routing-bank
298
+ # evidence), OR when the ledger itself changed (there is something to validate).
299
+ # It used to
297
300
  # gate on `upstream.any?` alone, which is the demand side only — and that is the
298
301
  # other half of the restored-owner hole: revert the owner and the range has no
299
302
  # changed owner at all, so the entire row evaluation was skipped and the
@@ -303,7 +306,10 @@ end
303
306
  # `eval/routing-tasks.jsonl` changes no owner package and need not touch the
304
307
  # ledger, so without this the whole block — including the bank-evidence
305
308
  # obligation written for exactly that change — was never entered.
306
- if upstream.any? || changed_paths.include?(LEDGER_PATH) || changed_paths.include?("eval/routing-tasks.jsonl")
309
+ routing_entrypoint_changed = changed_paths.any? do |path|
310
+ path.match?(%r{\Askills/[^/]+/SKILL\.md\z})
311
+ end
312
+ if upstream.any? || routing_entrypoint_changed || changed_paths.include?(LEDGER_PATH) || changed_paths.include?("eval/routing-tasks.jsonl")
307
313
  # Rows are collected PER ROUND and carry the scope they were authored against,
308
314
  # so the classifiers below judge a row against its own round's diff. Reading the
309
315
  # cumulative register diff instead would re-judge every earlier round's rows
@@ -1564,6 +1570,13 @@ if upstream.any? || changed_paths.include?(LEDGER_PATH) || changed_paths.include
1564
1570
  round_bounds.each do |span_base, span_head|
1565
1571
  scope = scope_at.call(span_base, span_head)
1566
1572
  scope_rows = rows.select { |row| row[:scope].head == span_head }
1573
+ # Routing-bank evidence applies to every skill description, not only to the
1574
+ # curated impact-chain owners. Keep a separate vocabulary for this one
1575
+ # obligation so broadening bank coverage cannot broaden the impact-chain
1576
+ # subject set or its row refusals.
1577
+ bank_owner_names = (
1578
+ owner_names_at.call(scope.base) + owner_names_at.call(scope.head)
1579
+ ).uniq
1567
1580
  # Same head-declared-grammar rule as `result-class` above, and for the same
1568
1581
  # reason: the paragraph that defines `bank-evidence` also dates it.
1569
1582
  next unless grammar_declared_at.call(scope.head)
@@ -1578,6 +1591,13 @@ if upstream.any? || changed_paths.include?(LEDGER_PATH) || changed_paths.include
1578
1591
  # being silently outside the trigger because of how the owner set is built.
1579
1592
  created_surfaces = scope.changed_paths.filter_map do |relative|
1580
1593
  next unless relative.start_with?("skills/") && relative.end_with?("/SKILL.md")
1594
+ # This pickup covers both a brand-new entrypoint and an EXISTING
1595
+ # non-curated skill editing its description — both move the routing
1596
+ # surface. An earlier round bounded it to base-absent entrypoints
1597
+ # because non-curated obligations were undischargeable then; the
1598
+ # bank-only resolver below now binds rows over base+head skill names,
1599
+ # so the obligation is dischargeable and the bound would only reopen
1600
+ # the evidence-free description-edit hole.
1581
1601
  path = relative.sub(%r{\Askills/}, "")
1582
1602
  next if triggered_owners.include?(path)
1583
1603
  next unless description_touched.call(scope, path)
@@ -1623,7 +1643,31 @@ if upstream.any? || changed_paths.include?(LEDGER_PATH) || changed_paths.include
1623
1643
  end
1624
1644
  triggered_owners.each do |path|
1625
1645
  owner = path.sub(%r{/SKILL\.md\z}, "")
1626
- owner_scope_rows = rows_by_upstream_path[path].select { |row| row[:scope].head == scope.head }
1646
+ owner_scope_rows =
1647
+ if upstream_set[path] || lineage_extra[path]
1648
+ # Preserve the existing selected-owner resolver byte-for-byte: bank
1649
+ # coverage must not weaken or widen impact-chain attribution.
1650
+ rows_by_upstream_path[path].select { |row| row[:scope].head == scope.head }
1651
+ else
1652
+ # Mirror that resolver for bank-only owners. Declaring rows use the
1653
+ # owner-package prefix convention; non-declaring rows keep the prior
1654
+ # exact `<owner>/SKILL.md` convention. A row naming more than one owner
1655
+ # satisfies none of them, so one locator cannot discharge two routing
1656
+ # surfaces.
1657
+ scope_rows.select do |row|
1658
+ declares_impact_chain = row[:behavior].split(";").any? do |fragment|
1659
+ fragment.match?(/\A\s*behavioral-evidence:/i)
1660
+ end
1661
+ candidate_names =
1662
+ if declares_impact_chain
1663
+ bank_owner_names.select { |name| owner_mentioned.call(row[:evidence], name) }
1664
+ else
1665
+ row[:evidence].scan(owner_skill_md_path).flatten.uniq
1666
+ .select { |name| bank_owner_names.include?(name) }
1667
+ end
1668
+ candidate_names == [owner]
1669
+ end
1670
+ end
1627
1671
  bank_evidence_failures << path unless owner_scope_rows.any? { |row| row_satisfies.call(row, owner) }
1628
1672
  end
1629
1673
  if bank_changed
@@ -1637,6 +1681,7 @@ if upstream.any? || changed_paths.include?(LEDGER_PATH) || changed_paths.include
1637
1681
  warn "impact_chain_bank_evidence_missing: a round that changed the routing surface carries no bank evidence for that owner"
1638
1682
  warn " note: the routing surface is the SKILL.md frontmatter `description` entry and `#{bank_relative}`. The measurement protocol says it is mandatory, but nothing produced or consumed it, so not running it left no absence to detect — the reviewer saw a candidate, not a gap"
1639
1683
  warn " fix: add `bank-evidence: command:<changed executable>` or `bank-evidence: file:<changed markdown>#<unique anchor>` to that owner's row; to skip the run deliberately use `bank-evidence: downscoped:<token>` and record the same token in this round's spec, so the downscope is itself an artifact"
1684
+ warn " note: a row without a `behavioral-evidence:` fragment attributes to its owner only via a bare `<owner>/SKILL.md` citation in the evidence cell — the full `skills/<owner>/SKILL.md` spelling is reserved for locators and does NOT attribute, so a row that looks like valid evidence but cites only the full path never reaches the owner"
1640
1685
  bank_evidence_failures.each { |path| warn " owes bank evidence: #{path}" }
1641
1686
  exit 1
1642
1687
  end