@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.
- package/README.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/hooks.json +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/remind-unverified-cli-flag.sh +309 -0
- package/dist/assets/marketplace/plugins/ccl-skills/hooks/test_remind_unverified_cli_flag.sh +483 -0
- package/dist/assets/marketplace/plugins/ccl-skills/packages/opencode-plugin/ccl-skills.ts +5 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/SKILL.md +10 -8
- package/dist/assets/marketplace/plugins/ccl-skills/skills/app-cross-platform-dev/references/mobile-quality-release.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/SKILL.md +16 -17
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/client-routing.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/staged-review-contract.md +195 -7
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/references/timeout-auth-and-capabilities.md +3 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/claude_review.sh +13 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/codex_review.sh +9 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/kimi_review.sh +9 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/normalize_review_timeout.sh +22 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/opencode_review.sh +9 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/review_gate.py +1540 -129
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_claude_review_probe.sh +8 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_client_compat.py +76 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_review_gate.sh +1858 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/test_update_review_plan_intent.sh +789 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/code-review/scripts/update_review_plan_intent.py +513 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/architecture-playbook.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/data-platform-architecture.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/event-driven-architecture.md +14 -11
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-architecture/references/multi-tenant-isolation.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/go-microservice-dev/SKILL.md +5 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/llm-inference-integration/SKILL.md +2 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/miniapp-product-dev/SKILL.md +13 -11
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/SKILL.md +64 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/agents/openai.yaml +4 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/async-lifecycle-and-performance.md +72 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/runtime-and-project-contract.md +58 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/source-map.md +41 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/nodejs-service-dev/references/verification-diagnostics-and-security.md +63 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/sli-slo-design.md +25 -9
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-observability/references/source-register.md +1 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/SKILL.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/promotion-gate-and-review.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-release-engineering/references/secret-and-config-management.md +7 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/platform-service-connectivity/references/retry-timeout-circuit-breaker.md +11 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/SKILL.md +8 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/design-routing-and-readiness.md +10 -14
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-rd-workflow/references/verify-developer-experience.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/SKILL.md +135 -86
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/behavioral-aesthetic-logic.md +66 -80
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/delivery-contract.md +275 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-execution-checklist.md +88 -214
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-impl-naming-and-versioning.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-intake-and-acceptance.md +10 -8
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/design-system-source-of-truth.md +4 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/external-ui-ux-quality-benchmarks.md +112 -95
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/frontend-code-evidence-map.md +30 -21
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/interaction-design-patterns.md +22 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/layout-recipes-and-screenshot-acceptance.md +20 -17
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-project-token-consistency.md +7 -9
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/multi-stack-strategy.md +14 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/operational-processing-workflows.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/platform-mobile-patterns.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-lifecycle-acceptance-and-iteration.md +9 -6
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/product-surface-patterns.md +3 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/source-map.md +37 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/tokens-and-components.md +7 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-audit.md +8 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/ui-ux-design-development.md +16 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/product-ui-ux-design/references/visual-craft.md +4 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/SKILL.md +5 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/architecture-playbook.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/audit-history-architecture.md +31 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/data-platform-architecture.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/event-driven-architecture.md +7 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/multi-tenant-isolation.md +2 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/notification-architecture.md +28 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/packaging-runtime-readiness.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/replay-comparison-architecture.md +28 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-architecture/references/workflow-state-architecture.md +39 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/SKILL.md +10 -7
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/ai-service-wiring-patterns.md +8 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/audit-history-patterns.md +29 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/background-job-patterns.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/batch-and-artifact-patterns.md +25 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/notification-patterns.md +40 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/public-api-security-patterns.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/replay-comparison-patterns.md +30 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/state-machine-task-patterns.md +48 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/python-service-dev/references/testing-and-quality-patterns.md +10 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/release-coordination/SKILL.md +2 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/SKILL.md +4 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/coverage-exhaustion-traps.md +45 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/dual-track-review-gate.md +142 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/external-practice-controls.md +21 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/extraction-quickstart.md +11 -9
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/firing-point-placement.md +8 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/parallel-stack-references-pattern.md +5 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/r0-leakage-audit.md +102 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-register.md +69 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/source-to-skill-extraction.md +10 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/uiux-judgment-extraction.md +6 -6
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/references/validation-and-landing.md +4 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-ccl-skills.sh +93 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/check-parallel-stack-parity.sh +119 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/extraction_review_gate.sh +22 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/impact-chain-gate.rb +49 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/obligation-ledger.py +2748 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/register-firing-path-resolution.rb +20 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/shared_git_surface_gate.py +1142 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_parallel_stack_parity.sh +183 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_regressions.sh +19 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_check_ccl_skill_catalog.sh +41 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_ci_checkout_ref_binding.sh +120 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_entrypoint_domain_scan_terms.sh +82 -8
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_extraction_review_gate.sh +336 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_impact_chain_self_adjudication.sh +82 -10
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_obligation_ledger.sh +1416 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_obligation_ledger_repo_audit.sh +57 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_register_firing_path_wiring.sh +141 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_routing_pointer_integrity.sh +3 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_shared_git_surface_gate.sh +1696 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_delivery_contract.sh +2117 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_uiux_loading_budget.sh +316 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_extraction_review_state.sh +1176 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/test_validate_skill_cross_refs.sh +31 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate-skill.sh +9 -4
- package/dist/assets/marketplace/plugins/ccl-skills/skills/skill-extraction-workflow/scripts/validate_extraction_review_state.py +980 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/terminal-cli-dev/SKILL.md +9 -6
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/SKILL.md +11 -11
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/client-runtime-test-matrices.md +10 -2
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/fitness-functions.md +16 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/scenario-testing.md +1 -1
- package/dist/assets/marketplace/plugins/ccl-skills/skills/testing-strategy/references/test-code-authoring-patterns.md +16 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/SKILL.md +5 -3
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/delivery-face-closeout.md +16 -6
- package/dist/assets/marketplace/plugins/ccl-skills/skills/tighten-doc/references/self-benchmark-baseline.md +37 -0
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/SKILL.md +7 -5
- package/dist/assets/marketplace/plugins/ccl-skills/skills/web-react-dev/references/complex-workspace-patterns.md +1 -1
- package/dist/assets/release.json +275 -105
- package/package.json +1 -1
|
@@ -80,10 +80,14 @@ A `RED-baseline` row is only as good as the measurement behind it. The failure m
|
|
|
80
80
|
|
|
81
81
|
**The one rule that matters: the grading standard must precede the change.** Not "write the rubric carefully afterwards" — afterwards you already know what the new text says, and the rubric grows into its shape. Either freeze the rubric before editing, or have a party that has not seen the candidate produce it. This repo already applies preregistration to *dispositions* (a preregistered reading rule committed before any run); apply it to the *instrument* too.
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
**Its companion: the baseline must be one the thing under test cannot have moved.** A rubric frozen before the change still grades against *something*, and rubric discipline says nothing about whether that something held still. A baseline the candidate can write, a baseline read while another writer is mid-flight, a baseline ref that has drifted, and a baseline that was never established all produce a well-formed comparison with no anchor — and none of them announces itself. The first four rows below are that failure; the rest is hygiene. Every row was observed failing:
|
|
84
84
|
|
|
85
85
|
| Failure | What it looked like | Rule |
|
|
86
86
|
| --- | --- | --- |
|
|
87
|
+
| Candidate-writable baseline | The reference the gate compared against was committed inside the same change-set the gate then judged, so the change could move its own reference point | The baseline must resolve to an immutable commit or frozen artifact **that the change did not author** — immutability is not independence. A candidate can commit a tuned fixture and cite that commit's SHA: perfectly immutable, still its own reference point. Require provenance older than the change (an ancestor of the merge-base with the target, or an artifact under separate control), and never a bare ref name (a ref is as movable as a file, so creating or re-pointing one satisfies "an explicit target ref" while moving the reference point). What is barred is the candidate's **working-tree** version of a file its diff touches; the **pre-change blob of that same file, read at an independent commit**, is the correct control arm — that is what `Transcribed arms` below means by extracting both arms from version control. A fixture authored alongside the change is self-authored evidence, and the **weaker ancestry check some harnesses run — verifying that the artifact *declares* an ancestor commit, rather than that the artifact itself predates the change — does not detect one tuned in that same change** (`validation-and-landing.md` records this for the golden-trace form). Requiring the artifact's own provenance to predate the change is what closes that hole; the declared-ancestor check alone does not |
|
|
88
|
+
| Baseline read under a concurrent writer | A suite total was recorded while a mutation harness was still rewriting the tree, then reused as the stable prior; a size reading taken in a worktree holding a staged revert produced the opposite conclusion from the truth | Prefer a baseline that **cannot** move while you read it — but **naming an immutable source is not reading from one**: a suite or size command run in the live worktree consumes staged edits, generated files, and a sibling agent's writes while the record says the baseline was commit X. Read the baseline *out of* the immutable source — check it out into a clean location, or read the blob at that commit — and only then is a dirty candidate worktree irrelevant to it. For a genuinely *mutable* source the requirement is that nothing writes it **for the duration of the read** — quiesce the writers (stop the harness, watcher, or sibling agent; settle staged state) rather than sampling cleanliness, because a point-in-time `git status` says nothing about the next second — or label the reading `unstable` and do not let it serve as a baseline |
|
|
89
|
+
| Base ref drift | The comparison resolved against a stale local ref, so the packet carried the upstream's newer fixes *reversed* and the reviewer raised findings against code that was already correct | Resolve the base at read time and prove it is current before comparing. A finding pointing at a file outside your own diff should trigger a base check **before you act on it either way** — do not rank the two: it is equally often a real completeness defect (an untouched consumer the changed contract broke), so verify the base rather than dismissing the finding |
|
|
90
|
+
| Attribution with no base run | A red was reported as this change's regression; the identical failure reproduced on the unmodified base and was a pre-existing environment condition | Reproduce a failure on the unmodified base before attributing it to the change — "also red on base" is a result to record, not a step to skip (`product-rd-workflow/references/refactoring-discipline.md` owns the green-baseline-first form) |
|
|
87
91
|
| Ceiling | The unchanged arm already passed 9/10, so no improvement was detectable | The arm you expect to fail must be *able* to fail; verify before comparing |
|
|
88
92
|
| Vocabulary inheritance | Regex written after the new text; the old arm said the same thing in other words and scored 0 (`剥离` vs a regex for `剥掉`) | Grade the **obligation**, paraphrase-tolerant, by a grader blind to which arm produced the answer |
|
|
89
93
|
| Tautology by construction | A "marker must be uniquely carried by this line" rule forced markers that only that line's vocabulary could satisfy — removing the line trivially removed the word | A validity constraint built for one polarity becomes a bias generator in the other: uniqueness is required of the **control**, never of the candidate (other carriers are the redundancy evidence, not an artifact) |
|
|
@@ -108,7 +112,7 @@ Referenced from `SKILL.md`'s "The mechanism underneath" rule. This section holds
|
|
|
108
112
|
| [Anthropic, *Effective context engineering for AI agents*](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents) | finite attention budget; "context rot" reported as gentler in some models but emerging across those tested; smallest-set-of-high-signal-tokens; the right-altitude failure modes | vendor engineering post — no dataset, n, or error bars; version-bound; commercially aligned with context-management tooling |
|
|
109
113
|
| [OpenAI, *GPT-4.1 Prompting Guide*](https://developers.openai.com/cookbook/examples/gpt4-1_prompting_guide) | conflicting instructions tend to resolve to the one nearer the end; instructions at both ends of long context beat either alone; check-conflicts-first; a single clear sentence usually steers | same class; explicitly model-generation-bound ("GPT-4.1 tends to…") |
|
|
110
114
|
| [OpenAI, *GPT-5.1 Prompting Guide*](https://cookbook.openai.com/examples/gpt-5/gpt-5-1_prompting_guide) | check-conflicts-first; a published metaprompt recipe for finding contradictions in your own system prompt | same class |
|
|
111
|
-
| [RECAST](https://arxiv.org/html/2505.19030) | joint satisfaction degrades
|
|
115
|
+
| [RECAST](https://arxiv.org/html/2505.19030) | joint satisfaction degrades sharply as constraint count grows — and it is already low at small counts. The metric for "all of them at once" is the paper's **OSR** (§4.1: "the HSR of all constraints, both rule-based and model-based, that are successfully satisfied simultaneously"). Across all 29 model rows of Table 1 the **ceiling** on OSR is **25.0** at Level 1, falling to **19.0 / 13.0 / 13.5** at Levels 2–4, whose constraint counts are **5 / 10 / 15 / all** (§B.4). So at five constraints no model held the whole set more than about a quarter of the time, and by fifteen none exceeded ~13% | benchmark paper proposing its own dataset and method — a low baseline flatters the contribution; these are one hard benchmark's order of magnitude, not a usage failure rate, and its constraints are generation-task instruction constraints rather than preconditions of a procedure, so transfer is by analogy. **Citation corrected 2026-08 against Table 1:** the widely quoted 39.75% is the **Average column of the single best-by-average row** (Gemini-2.5-Pro) — the arithmetic mean of that row's twelve MSR/RSR/OSR cells (sum 477; 477/12 = 39.75, confirmed) — **not** an all-constraints-satisfied rate, and it must not be cited as one. The two orderings differ: Gemini leads on Average while Qwen3-235B-A22B holds the highest Level-1 OSR, so do not carry "best model" across from one column to the other. Cite the OSR ceilings above |
|
|
112
116
|
|
|
113
117
|
**Why recency is a hazard, not a rule.** Vendor guidance reports that models *tend to follow* whichever instruction sits later — an observation about behaviour, not a licence to resolve conflicts by position. Two ways position becomes dangerous if read as a rule: a later permissive line beats an earlier stricter one (directly contradicting `Conflict Resolution`, which keeps the stricter data-loss/security/contract guard); and text embedded in **untrusted data** — a diff under review, a retrieved document, tool output — sits later within the same authority level and would win by placement alone, which is prompt injection with extra steps. Treat recency as a bias to design against: put the load-bearing rule where the decision happens, and never let placement confer authority.
|
|
114
118
|
|
|
@@ -120,6 +124,21 @@ Referenced from `SKILL.md`'s "The mechanism underneath" rule. This section holds
|
|
|
120
124
|
|
|
121
125
|
教训:前一个 agent 或前一次提交对某个具名约定的读法是 **hypothesis-grade**;在其之上 fix-forward 会把原始错误一并传播。
|
|
122
126
|
|
|
127
|
+
### 同类的最高频实例:CLI flag 靠记忆不靠读
|
|
128
|
+
|
|
129
|
+
上面那条讲的是**继承自别人**的读法;本节讲**继承自自己记忆**的读法,两者同根——载体都是一个本仓不拥有的外部契约。
|
|
130
|
+
|
|
131
|
+
`SKILL.md` 已有的规则要求用 live tool(`--help` 或等价物)核验 flag 的存在与语义,但只写在**把 CLI 命令写进 reference 时**这一个作用域。真正复发的地方是**调用**时:一份跨上百个会话的失败记录语料里,「flag 靠猜不靠读」是最重复的机械失败类之一——同一个 `glab mr list --state` 在**八个互相独立的会话**里各失败一次,横跨数月;每次修法都相同(读 help、换 flag),每次都只修好了当次那一条实例,所以类原样返回。同族还有 `--jq`(3 次)、`--output`、`--pipeline-id`、`--branch`、`--old-text`、`--allow-scripts`。
|
|
132
|
+
|
|
133
|
+
八次复发说明 prose 不收敛,所以落点是机械的:`hooks/remind-unverified-cli-flag.sh`(PreToolUse,仅提示不阻断),对 flag 词表跨版本发散的工具,按 (会话, 工具) 各提示一次;它**刻意不解析命令串**——合法 shell 写法的集合是开放的,早期的解析版本几乎每轮独立评审都被找出一种误处理的合法写法。
|
|
134
|
+
|
|
135
|
+
**谓词选择是这条里唯一承重的设计决定**:hook 认的是**工具身份**,不是「已知坏 flag」的清单。flag 清单是上游项目拥有的词表,上游每发一版就把控制打回原形——这正是本文件上一节所述「控制建立在自己不拥有的东西上」的形态,也是这个类跨多次落地反复回来的原因。工具名集合缓慢、有限、可由本仓拥有;flag 集合不是。代价是明写的:未列入的工具是**不触发**,这是刻意接受的残留,扩列表的判据是该工具已积累出记录在案的 flag 失败。
|
|
136
|
+
|
|
137
|
+
可执行形态:
|
|
138
|
+
|
|
139
|
+
- 给列表内的外部 CLI 传长 flag 之前,**必须先在本机读过该 CLI 的 help 输出**;未读过就用,属于把记忆当一手源。
|
|
140
|
+
- 一条命令因无法识别的 flag 失败时,**不得**先改用法之外的东西——先怀疑该 flag 在本机这个版本不受支持。语料里多次出现「以为是用法错、其实是这版没这个 flag」。
|
|
141
|
+
|
|
123
142
|
## 只据内部语料的「深度提炼」:失败形态
|
|
124
143
|
|
|
125
144
|
一次仅以内部 launch-SOP 为源的「深度提炼」会落出**看起来完整**的规则集,却从未核过这套技能声称代表的**公开实践**;下一个用户于是问「参考网上优秀实践了么 / did you check industry practice」。
|
|
@@ -18,15 +18,15 @@ For maintainers running a fresh codebase / Figma / doc extraction. Read this fir
|
|
|
18
18
|
├─ b. Draft skill / reference (new or update existing)
|
|
19
19
|
├─ c. Sibling-generalization mini-map (which sibling skills may share / route)
|
|
20
20
|
├─ d. Sanitization pass with checklist (cheap, seconds)
|
|
21
|
-
├─ e.
|
|
22
|
-
│ ├─
|
|
23
|
-
│ └─
|
|
21
|
+
├─ e. Owner review gate per mandatory table (deep, minutes)
|
|
22
|
+
│ ├─ Strict wording-only → one independent code-review pass
|
|
23
|
+
│ └─ Non-wording → extraction_review_gate review + at most two challenges
|
|
24
24
|
├─ f. Apply fixes, re-sanitize
|
|
25
25
|
├─ g. Commit per batch on a feature branch → MR pending review (never push to main)
|
|
26
26
|
└─ h. Update charter completion log
|
|
27
27
|
│
|
|
28
28
|
4. Closeout → ~/.<host>/skills/.extraction-work/<project>-completion.md
|
|
29
|
-
|
|
29
|
+
Non-wording terminal ledger validator + final state + deferred backlog
|
|
30
30
|
│
|
|
31
31
|
5. Provenance migration → ~/.<host>/.private-aliases/<project>.yaml
|
|
32
32
|
Move file keys / paths / counts / dates out of working files
|
|
@@ -91,9 +91,9 @@ For maintainers running a fresh codebase / Figma / doc extraction. Read this fir
|
|
|
91
91
|
|
|
92
92
|
- When required: see `references/dual-track-review-gate.md` table.
|
|
93
93
|
- Choose the review tier from that table, not from intuition. Do not restate the rows locally; record the exact `dual-track-review-gate.md` table row used. Record `challenge: not-required` only when that row classifies the actual diff as challenge-not-required (for shared skills, this means strict wording-only with deterministic scope proof + independent review confirmation). Non-wording shared-skill changes cannot skip challenge.
|
|
94
|
-
- Run deterministic checks and implementer self-review first, and record what each proves before invoking review/challenge (this self-review-before-review ordering applies to every non-wording shared-skill change the dual-track table requires review for, not only the rows that look high-risk): `git diff --check` proves whitespace/conflict-marker hygiene only; validators prove schema/link/routing invariants; leakage/sanitization scans prove only their configured patterns; scope checks must name the changed files or expected file set; the self-review row is conclusive only when each required field is non-empty (acceptance criteria, changed-file scope, edge/failure paths, known residual risks) and the changed-file scope equals the candidate diff's changed-file set, or explicitly explains any excluded generated/irrelevant file.
|
|
95
|
-
- Review pass:
|
|
96
|
-
- Challenge pass: invoke
|
|
94
|
+
- Run deterministic checks and implementer self-review first, and record what each proves before invoking review/challenge (this self-review-before-review ordering applies to every non-wording shared-skill change the dual-track table requires review for, not only the rows that look high-risk): `git diff --check` proves whitespace/conflict-marker hygiene only; validators prove schema/link/routing invariants; leakage/sanitization scans prove only their configured patterns; scope checks must name the changed files or expected file set; the self-review row is conclusive only when each required field is non-empty (acceptance criteria, changed-file scope, edge/failure paths, known residual risks) and the changed-file scope equals the candidate diff's changed-file set, or explicitly explains any excluded generated/irrelevant file. Persist it before the review/challenge run in a fresh, non-overwritten task-evidence path outside the candidate diff, pass that exact file as the gate's review plan, and retain the gate result that binds its profile hash; do not edit the candidate merely to record self-review or review outcome, because that creates self-referential candidate churn. A candidate-local row is appropriate only when the row itself is a substantive deliverable under review. A plain in-place-editable MR description or scratch log is not ordering proof unless its edit history is retrievable and checked; a backfilled row is invalid and forces a rerun. If the candidate diff changes after the row is saved — a file added/removed OR the content of any listed file materially changed — refresh the row and rerun review/challenge against the new candidate. Changing only the external self-review record refreshes the profile binding; it does not by itself invalidate implementation tests or the candidate packet. A missing field, "ok" placeholder, mismatched scope, or unprovable ordering makes the row inconclusive. Do not spend LLM review rounds on issues a script or implementer-side checklist can decide. If the independent pass is the first place basic scope, contract, privacy, or test issues surface, apply those findings to the diff, close the self-review gap, and rerun the deterministic gates before rerunning review/challenge; the process-defect repair is in addition to resolving the findings, not a way to discard or downgrade them.
|
|
95
|
+
- Review pass: persist the complete self-review row and encode it in the review plan. For a **non-wording** lane, resolve the repository-owned `scripts/extraction_review_gate.sh` and use it from round 1; never substitute the generic controller, scan writable plugin roots, or supply a caller-selected budget. For a strictly proven **wording-only** lane, use the generic `code-review` proof-bound single-review recipe in `code-review/references/staged-review-contract.md` and record `challenge: not-required`; require its controller-derived wording scope plus the independent `wording_only_boundary` confirmation. This is the only extraction path that stays outside the multi-round wrapper and terminal ledger; the gate, not this page, decides whether a chainless review is legal, and it may still demand the tracked pair. Take all controller options from that runnable recipe, supplying the actual stage and exact candidate rather than an example default. The non-wording chain cannot be retrofitted, so a run started outside its owner wrapper is thrown away and restarted. Read the chain-opening and packet-composition rules in `references/dual-track-review-gate.md` first. Require conclusive JSON, selected-client attribution, packet/profile binding, family exclusion, and wrapper runtime evidence. When the host returns a live execution handle (`session_id`, `cell_id`, or equivalent), keep polling that exact handle until terminal exit; empty current output is progress, not a verdict, and no replacement/fallback reviewer may start while the original process is live. The result row records handle type, an opaque host transcript/tool-call reference and terminal exit status. If the handle is lost, the lane is infrastructure-inconclusive/manual-review-required and no replacement or fallback may be started or credited; process-tree and wrapper artifacts are diagnostic only. This is a procedural host obligation because the inner gate cannot observe the outer handle. Never copy a credential-like raw handle into shared evidence. `findings` is not pass; inconclusive, malformed, or free-form output stays interim. Do not add a separate behavior probe.
|
|
96
|
+
- Challenge pass: for a non-wording lane, invoke `scripts/extraction_review_gate.sh` separately with the same plan, stage, candidate, family and tracked chain. Pass the next one-based index; later rounds include a distinct focus and all prior focuses. Preserve a separate result row with the same binding, exclusion, egress, attribution and conclusive checks. Review never satisfies challenge; missing or inconclusive required challenge keeps extraction interim. A wording-only lane has no challenge pass.
|
|
97
97
|
- Treat review/challenge as batch-level gates over the landing candidate, not as a per-bullet or per-line edit loop. Apply all findings from a round; when both lenses are required, re-run both on the updated candidate before landing.
|
|
98
98
|
- Skipping a required challenge = work can only land as interim, not complete.
|
|
99
99
|
|
|
@@ -119,6 +119,7 @@ For maintainers running a fresh codebase / Figma / doc extraction. Read this fir
|
|
|
119
119
|
- File: `~/.<host>/skills/.extraction-work/<project>-completion.md`
|
|
120
120
|
- Final state: which batches done, which deferred, which sources unavailable.
|
|
121
121
|
- Lessons: what surprised; what would change in next extraction; what to add to skill-extraction-workflow.
|
|
122
|
+
- For every non-wording review chain, build the receipt-bound closeout ledger and run `scripts/validate_extraction_review_state.py <closeout.json>` before reporting a terminal state. A clean Round 2 plus its exact-candidate completion receipt may validate as `ready_for_human_decision`; Round 3 findings validate as `continuation_authorization_required`; a second ordered base drift validates as `baseline_race`. Unknown, stale, omitted, or invalid evidence remains `interim`. The strict wording-only single-review path records its independent review row but does not fabricate a multi-round ledger.
|
|
122
123
|
|
|
123
124
|
### 5. Provenance migration
|
|
124
125
|
|
|
@@ -147,8 +148,9 @@ Skip this step when nothing transferable surfaced.
|
|
|
147
148
|
|---|---|---|
|
|
148
149
|
| Anti-pattern grep panel | `references/recurring-anti-patterns-checklist.md` | Every commit; ~30s |
|
|
149
150
|
| `check-ccl-skills.sh` | `scripts/check-ccl-skills.sh` | Every commit; ~10s |
|
|
150
|
-
| `
|
|
151
|
-
| `
|
|
151
|
+
| Generic `code-review` gate | repository-owned skill | Strict wording-only independent review; ~5-10 min |
|
|
152
|
+
| `scripts/extraction_review_gate.sh` | this skill package | Non-wording review plus at most two challenges; ~5-15 min each |
|
|
153
|
+
| `scripts/validate_extraction_review_state.py <closeout.json>` | this skill package | Every non-wording terminal checkpoint |
|
|
152
154
|
| Source-read fallback ladder | `SKILL.md` Source-read remediation | When a source read fails or times out |
|
|
153
155
|
| Sibling mini-map | `SKILL.md` Step 4 stack-specific updates | Every stack-specific change |
|
|
154
156
|
| Private alias map `audit_cmd` | `~/.<host>/.private-aliases/<project>.yaml` or process-retro profile | Every commit's R0 audit |
|
|
@@ -56,6 +56,14 @@ Observed shape: an entry judged as configuration how-to produced several rounds
|
|
|
56
56
|
|
|
57
57
|
When you land an owner gate as a *field in a record* — a checklist row, a boundary-record line, a CLI flag taking owner names, a "decision:" slot — that field is fillable without invoking the owner, and filling it is what *feels* like discharging the gate, so the record reads complete while none of the owner's mechanical rules fired. Any field naming an owner therefore carries an explicit invoke bar on its triggered values, and the coverage question is a **set-diff over every owner-naming field in that record**, not a fix for the one owner that just failed (the recurrence shape: a record whose salient fields carry the bar while its siblings silently do not). Prefer a firing point the controller cannot route around: when the gated action produces no local artifact — delegation dispatch being the worked case, where substance is produced by a worker and the controller edits nothing — every edit-triggered and dirty-tree-triggered backstop stays silent, so the gate must hang on the action itself (`hooks/guard-delegation-owner.sh` asks once per session at dispatch when the delegation owner was never invoked).
|
|
58
58
|
|
|
59
|
+
### The option-set sibling (a menu whose every choice violates a standing gate)
|
|
60
|
+
|
|
61
|
+
Same forgery surface, one step earlier: instead of filling a field, the agent **asks the user to choose** — and every option it drafted violates a rule that was already mandatory. The user's selection then reads as authorization, so the violation lands wearing a decision it never needed. This is strictly worse than filling a field alone, because the record now carries a human's name on it.
|
|
62
|
+
|
|
63
|
+
Observed shape (round 059): a distillation round asked the user how a reusable cross-line lesson should land and offered three options — write it into per-line memory, build a sync mechanism, merge the two stores. The Core Rules already required a **shared** artifact and explicitly classify a memory-only landing as insufficient, so no option on the menu could be chosen legally. The user caught it by asking "不是到共享技能么"; nothing in the workflow would have.
|
|
64
|
+
|
|
65
|
+
The bar: **before offering the user a choice, check each drafted option against the standing gates for that decision, and drop or relabel any option that a rule already forbids.** A menu is a claim that every item on it is permissible. If the gates leave only one legal option, that is not a decision to delegate — do it and say why the alternatives were unavailable; if they leave none, the gate itself is what needs the user's ruling, and that is the question to ask instead. The recurrence signal is a user correction that names a rule rather than a preference ("shouldn't this go to X?"), which is a gate-violation report, not a change of mind — classify it as `failure/correction` and run the correction RCA rather than simply re-asking with a better menu.
|
|
66
|
+
|
|
59
67
|
### The IMPOSSIBLE-invocation value (a bar with no legal third value forges itself)
|
|
60
68
|
|
|
61
69
|
An invoke bar — or a mandatory-read/mandatory-load gate ("read `X.md` before answering") — **that names no legal value for the case where the invocation is IMPOSSIBLE (no file tool in this session, artifact absent, load fails) forges itself.** Such gates are usually written as a pair: skipping the read is forbidden AND answering from memory is *also* a violation. When the read is unavailable, every action the agent can take is a violation, so the cheapest exit is to assert the gate was satisfied — and if the gate's evidence is a fixed attestation string, that string is emitted by an agent that read nothing and the record reads compliant to every downstream consumer.
|
|
@@ -49,11 +49,12 @@ Each file has the same H2 structure. The **stack-specific implementation pattern
|
|
|
49
49
|
|
|
50
50
|
## The sibling-sync invariant — what mirrors, what diverges
|
|
51
51
|
|
|
52
|
-
Mirrored sections must
|
|
52
|
+
Mirrored sections must be **byte-identical — no normalization**. The machine gate `../scripts/check-parallel-stack-parity.sh` (wired into `check-ccl-skills.sh`, regression-pinned by `test_check_ccl_parallel_stack_parity.sh`) diffs each pair's mirrored region — the exact heading line `## When this applies / does not apply` through the stack-glue H2, each marker matched as an exact whole line exactly once and in order — with zero rewriting.
|
|
53
53
|
|
|
54
|
-
- **Routing references
|
|
55
|
-
- **
|
|
56
|
-
|
|
54
|
+
- **Routing references that legitimately differ per tree are written inline for both trees**: `` `x.md` `` on the Python tree / `` `y.md` `` on the Go tree — the same bytes in both files. Two earlier gate versions instead normalized references before diffing (a `<REF>` mask, then a per-pair mapping table), and two adversarial rounds each found a fresh way lossy rewriting could mask real drift (an or-list's second element swapped; a canonical pointer replaced by a mapped name; a self-reference via name mapping). The normalization capability was **removed rather than patched again** — with byte-diff there is nothing to abuse, and adding a new legitimate divergence means writing the dual-tree phrasing into both files, which is exactly the reviewable edit the contract wants.
|
|
55
|
+
- **Sibling skill names inside the mirrored region** follow the same rule: name both trees or neither; the self-referential file headers (Sibling sync / Sanitization boundary) sit *above* the mirrored region and may keep naming only the partner file.
|
|
56
|
+
|
|
57
|
+
Everything else in the mirrored region must be byte-identical too: when a mirrored section needs a generic example, use one stack-neutral placeholder rendering ("the session-level tenant variable", "the stack-glue section names the specific primitive") **and use the same rendering in both files**, letting the stack-glue section name the specific syntax. The earlier looseness ("match in meaning, phrasing may differ by a few words") is retired: meaning-equivalent-but-textually-different renderings are exactly where real drift hid — a rule on one side was silently replaced by a pointer on the other and survived several review rounds under the "same meaning" reading. Known residual, accepted and documented in the script: moving both stop markers earlier in one change shrinks the compared region symmetrically — that is a visible contract edit in the review diff, not something the gate distinguishes. The optional `## Topic-extension backlog` H2 after stack-glue is mirrored by convention but sits outside the strict gate (its section rule allows near-identical wording so it can name vendors/engines); keep it in sync by review.
|
|
57
58
|
|
|
58
59
|
Hard constraints that must NOT diverge:
|
|
59
60
|
- **Concept set** — every rule, every gate, every carve-out present in one mirrored section is present in the other.
|
|
@@ -42,6 +42,108 @@ The closeout row must name which private profile was used: `project-alias`, `pro
|
|
|
42
42
|
|
|
43
43
|
Pre-existing leakage from earlier extractions may be tracked as `known_debt` in the alias YAML and explicitly excluded from blocking the current change. New or modified content MUST remain zero-hit — `known_debt` cannot waive a newly introduced label.
|
|
44
44
|
|
|
45
|
+
### Shared Git and PR text
|
|
46
|
+
|
|
47
|
+
Git history and forge metadata are shared publication surfaces even when the
|
|
48
|
+
repository files are clean. The repository-owned
|
|
49
|
+
`skills/skill-extraction-workflow/scripts/shared_git_surface_gate.py` therefore
|
|
50
|
+
scans the exact candidate commit range, current branch name, and available PR
|
|
51
|
+
title/body text for AI session links or identifiers, model session/co-author
|
|
52
|
+
trailers, AI author/committer identities, generated footers,
|
|
53
|
+
conversation-process labels, and external-source provenance wording. Common
|
|
54
|
+
Markdown list (including GFM task lists), quote, heading, and nested wrappers
|
|
55
|
+
are presentation only and do not bypass any line-oriented class. The gate
|
|
56
|
+
reports only surface, locator, and category so neither a finding nor an error
|
|
57
|
+
diagnostic repeats the identifier, ref, path, or raw tool error it is blocking.
|
|
58
|
+
Candidate commit metadata is requested from Git as UTF-8 regardless of the
|
|
59
|
+
repository's ambient log-output encoding. Invalid UTF-8 or a Unicode
|
|
60
|
+
replacement character fails closed with only the commit locator and field
|
|
61
|
+
name, rather than silently erasing a CJK-only match. Each candidate's bounded
|
|
62
|
+
raw commit object is also checked before pretty formatting; an embedded NUL is
|
|
63
|
+
rejected because Git would otherwise truncate the visible message at that byte.
|
|
64
|
+
The batch response is length-parsed and bound one-for-one to the separately
|
|
65
|
+
enumerated full object IDs; abbreviated diagnostic locators are never used for
|
|
66
|
+
identity or ordering decisions.
|
|
67
|
+
`--repo` is the single repository identity. Every Git subprocess drops ambient
|
|
68
|
+
repository-routing variables that could replace its worktree, refs, object
|
|
69
|
+
store, ancestry, index, or namespace; a caller cannot point the gate at a clean
|
|
70
|
+
decoy with `GIT_DIR` while the prohibited candidate lives elsewhere. This gate
|
|
71
|
+
is a worktree pre-push/CI lane, not a receive-pack quarantine, so quarantine
|
|
72
|
+
object-store overrides are not accepted.
|
|
73
|
+
All object reads disable local replacement refs, which alter only the local
|
|
74
|
+
view and are not the bytes a push publishes. A non-empty legacy
|
|
75
|
+
`info/grafts` file likewise fails closed because it can rewrite the visible
|
|
76
|
+
parent chain without changing the commit objects sent by a push.
|
|
77
|
+
|
|
78
|
+
The base priority is explicit `--base-ref`, then the trusted PR event, then
|
|
79
|
+
`CCL_SKILL_BASE_REF`, then a repository-declared default; an unresolved selected
|
|
80
|
+
base is an error. The trusted event outranks ambient environment configuration
|
|
81
|
+
so a CI process variable cannot silently move the base forward and narrow the
|
|
82
|
+
event-defined candidate range. Only
|
|
83
|
+
history outside the selected `<merge-base>..<candidate-head>` range may be
|
|
84
|
+
`known_debt`; the merge-base itself is target-side history and is not a candidate
|
|
85
|
+
commit. Candidate commits, the current destination branch, and current PR text
|
|
86
|
+
have zero exceptions, including a violation hidden in an earlier candidate
|
|
87
|
+
commit behind a clean HEAD. CI runs the gate on direct pushes to `dev`/`main`
|
|
88
|
+
and on PR `edited` events because title/body changes do not require a new
|
|
89
|
+
commit. Before a PR is created or edited, pass its exact proposed title and
|
|
90
|
+
body through `--pr-text-file`; a local run with neither an event nor that file
|
|
91
|
+
has checked no PR text. The optional pre-push hook is early feedback; the
|
|
92
|
+
protected CI check is the merge boundary.
|
|
93
|
+
|
|
94
|
+
The repository command fallback `origin/dev` applies only to the normal
|
|
95
|
+
feature→dev lane. Promotion or any other target passes that target explicitly
|
|
96
|
+
(for example, `--base-ref origin/main` for dev→main); a default is not evidence
|
|
97
|
+
of the intended landing target. The pre-push hook uses an existing destination ref's remote SHA
|
|
98
|
+
as its base only when that destination is an actual landing target (`dev` or
|
|
99
|
+
`main`); ambient `CCL_SKILL_BASE_REF` cannot replace that SHA. The environment
|
|
100
|
+
base may delimit a new zero-OID landing target. Every non-delete pushed ref is
|
|
101
|
+
scanned at its own local object ID and destination name without checking it
|
|
102
|
+
out. An ordinary feature ref always uses an explicitly bound landing target or
|
|
103
|
+
the pushed remote's `dev` tracking ref; if that ref is absent, fetch it or set
|
|
104
|
+
`CCL_SKILL_BASE_REF`. Its existing remote feature tip is still candidate history
|
|
105
|
+
and must never become the base/`known_debt`. A new
|
|
106
|
+
`dev`/`main` destination without an explicit base fails closed. Provider aliases
|
|
107
|
+
are shared across the provider-shaped
|
|
108
|
+
surface patterns, but unknown future AI providers remain an enumerated-pattern
|
|
109
|
+
coverage risk; the shared prose prohibition is broader than the currently
|
|
110
|
+
recognized provider names.
|
|
111
|
+
|
|
112
|
+
Co-author detection also has an intentional precision boundary. An
|
|
113
|
+
unambiguous product display name such as `Claude Code` or `Codex`, a bounded
|
|
114
|
+
model/product-qualified form such as `Claude Sonnet`, `OpenAI Codex`, or
|
|
115
|
+
`ChatGPT-5`, or a known
|
|
116
|
+
provider GitHub App account carrying the `[bot]` suffix, is blocked with any
|
|
117
|
+
email. Account matching accepts GitHub slug separators, so `claude-code[bot]`
|
|
118
|
+
and `copilot-swe-agent[bot]` remain the same known-provider class. A known
|
|
119
|
+
provider `[bot]` account in the email local part is also sufficient when the
|
|
120
|
+
display name is neutral, with only the standard optional numeric GitHub ID
|
|
121
|
+
prefix accepted before that exact account. A provider token embedded as a
|
|
122
|
+
suffix inside another bot account is not treated as the provider. An exact
|
|
123
|
+
single-name alias that can also be a person's name needs an independent
|
|
124
|
+
`noreply`/`no-reply`/`bot` email signal. This keeps a human whose
|
|
125
|
+
real name matches an alias from being mechanically rejected, but it also means
|
|
126
|
+
an AI trailer that deliberately uses such an ambiguous name plus an ordinary
|
|
127
|
+
email is not detectable from the trailer alone. The root prohibition still
|
|
128
|
+
applies; proposed text with that ambiguity needs human readback rather than a
|
|
129
|
+
claim that the local gate proved every model co-author absent. Candidate author
|
|
130
|
+
and committer fields use a narrower rule: only unambiguous product names,
|
|
131
|
+
known-provider `[bot]` display names, or known-provider `[bot]` email accounts
|
|
132
|
+
with only an optional numeric GitHub ID prefix are blocked. A generic `noreply`
|
|
133
|
+
address is a normal human privacy setting there, so an ambiguous single-name
|
|
134
|
+
identity remains an explicit human-readback coverage gap; unrelated automation
|
|
135
|
+
bots and accounts that only end in a provider token are not reclassified as AI.
|
|
136
|
+
|
|
137
|
+
The current deterministic event surface does not fetch historical PR comments,
|
|
138
|
+
labels, or a platform-generated custom merge message. Those remain prohibited
|
|
139
|
+
by the root contract, but are an explicit coverage gap requiring forge-side
|
|
140
|
+
readback/enforcement; they are not reclassified as `known_debt` merely because
|
|
141
|
+
this local scanner cannot observe them. A pushed tag is scanned on every
|
|
142
|
+
surface the object graph carries: destination name, pointed-to commit range,
|
|
143
|
+
and each annotated tag-object layer's own message and tagger identity (nested
|
|
144
|
+
tags are peeled with a bounded depth, and an unresolvable or over-deep tag
|
|
145
|
+
chain fails closed).
|
|
146
|
+
|
|
45
147
|
## Fail-Closed Clause — Maintainer Discipline
|
|
46
148
|
|
|
47
149
|
Every new sanitized label introduced in this commit (e.g. an angle-bracket capability token like `<some-capability>`, a class tier like `<class-A1>`, or any other invented short name that stands for a real source artifact) MUST exist in the maintainer's alias YAML before the commit lands.
|