From 1ba06a4b15261f220aa7b8d31977f52774f28baf Mon Sep 17 00:00:00 2001 From: Alexander Rybkin Date: Thu, 12 Nov 2026 22:47:42 -0800 Subject: [PATCH 1/5] =?UTF-8?q?fix(validate):=20count=20the=20ja=20?= =?UTF-8?q?=E3=81=84=E3=81=A4=20cue=20only=20before=20a=20use=20verb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A bare いつ also matched inside 思いつく, 追いつく, 食いつく and こいつ, so a Japanese capability-only description lost the description-no-when warn. Accept いつ only when a use verb follows (いつ使う, いつ呼び出す, ...). Signed-off-by: Alexander Rybkin --- dokimi/dokimi/external/when_cues.py | 2 +- dokimi/tests/test_description_when_cues.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dokimi/dokimi/external/when_cues.py b/dokimi/dokimi/external/when_cues.py index f7f5ac9ad..43e8f596f 100644 --- a/dokimi/dokimi/external/when_cues.py +++ b/dokimi/dokimi/external/when_cues.py @@ -26,7 +26,7 @@ "zh": r"(? Date: Thu, 12 Nov 2026 22:48:30 -0800 Subject: [PATCH 2/5] =?UTF-8?q?fix(validate):=20do=20not=20read=20?= =?UTF-8?q?=E8=80=97=E6=97=B6,=20=E8=B6=85=E6=97=B6=20or=20=E5=BB=B6?= =?UTF-8?q?=E6=97=B6=20as=20a=20zh=20when=20cue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 时 after 耗/超/延 (time-consuming, timeout, delay) before 调用/执行 matched the 时+verb cue, and 当事人 opened a 当…时 span. Exclude them there; the closing 时 of a 当… span keeps its class, since 当请求超时 is a when clause. Signed-off-by: Alexander Rybkin --- dokimi/dokimi/external/when_cues.py | 4 ++-- dokimi/tests/test_description_when_cues.py | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/dokimi/dokimi/external/when_cues.py b/dokimi/dokimi/external/when_cues.py index 43e8f596f..b34d4fc72 100644 --- a/dokimi/dokimi/external/when_cues.py +++ b/dokimi/dokimi/external/when_cues.py @@ -23,8 +23,8 @@ "pt": r"(? Date: Thu, 12 Nov 2026 22:48:45 -0800 Subject: [PATCH 3/5] fix(validate): count de beim only next to a use verb MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A bare beim matched "Hilft beim ..." and "Unterstützt beim ...", which state a capability, so those descriptions lost the description-no-when warn. Accept beim only with verwenden, nutzen, benutzen, einsetzen or aufrufen in the same sentence. Signed-off-by: Alexander Rybkin --- .../20261113_120000_xaleryb_when-cue-followups.md | 7 +++++++ dokimi/dokimi/external/when_cues.py | 3 ++- dokimi/tests/test_description_when_cues.py | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 dokimi/changelog.d/20261113_120000_xaleryb_when-cue-followups.md diff --git a/dokimi/changelog.d/20261113_120000_xaleryb_when-cue-followups.md b/dokimi/changelog.d/20261113_120000_xaleryb_when-cue-followups.md new file mode 100644 index 000000000..b4d400c69 --- /dev/null +++ b/dokimi/changelog.d/20261113_120000_xaleryb_when-cue-followups.md @@ -0,0 +1,7 @@ +### Fixed + +- **`description-no-when` no longer takes a capability word for a "when" cue** — a description with no + "when" clause lost the `warn` when it held Japanese `思いつく`/`追いつく`/`こいつ` (read as `いつ`), Chinese + `耗时调用`/`超时调用`/`延时执行`/`当事人`, or German `Hilft beim …`/`Unterstützt beim …`. Now `いつ` counts only + before a use verb, `时` after `耗`/`超`/`延` is no cue, and `beim` counts only with `verwenden`, `nutzen`, + `benutzen`, `einsetzen` or `aufrufen` in the same sentence. Run `catalog check` again to see the warnings that come back. diff --git a/dokimi/dokimi/external/when_cues.py b/dokimi/dokimi/external/when_cues.py index b34d4fc72..d7221ae5a 100644 --- a/dokimi/dokimi/external/when_cues.py +++ b/dokimi/dokimi/external/when_cues.py @@ -19,7 +19,8 @@ r"whenever\b)", "es": r"(? Date: Fri, 13 Nov 2026 19:44:22 -0800 Subject: [PATCH 4/5] docs(external): say which capability words are not when cues Signed-off-by: Alexander Rybkin --- dokimi/docs/external-content.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dokimi/docs/external-content.md b/dokimi/docs/external-content.md index 90911bfe0..1a2f8ccf9 100644 --- a/dokimi/docs/external-content.md +++ b/dokimi/docs/external-content.md @@ -254,7 +254,9 @@ skill, since those commands then run with no prompt, and that pair fails `--stri half and shares three words (`description-near-duplicate`). The `description-no-when` cue is read in English, Spanish, French, German, Portuguese, Russian, Chinese, Japanese and Korean, and a description in a script none of them covers (Arabic, Thai, Hebrew, …) is not checked: it gets a `note` (`description-when-not-checked`), so not checked does not read as a pass: its row says `note:` instead of `ok`, and the counts line `1 ok (1 not checked)`. A Latin-script language without a list of its own -(Polish, Dutch, Turkish, Vietnamese) is checked against these cues. Two skills in different paths with the same +(Polish, Dutch, Turkish, Vietnamese) is checked against these cues. A word that only states a capability is not a cue: +Japanese いつ counts only before a use verb, Chinese 耗时, 超时 and 延时 are not 时 + verb, and German `beim` +counts only next to a use verb (verwenden, nutzen, ...). Two skills in different paths with the same directory name and description but different `SKILL.md` text are a `warn` on both (`mirror-drift`), naming the other copies. Skills with `disable-model-invocation: true` are exempt from the description checks. From 927c4ec8365702805240a21612c1e4fde5d895fa Mon Sep 17 00:00:00 2001 From: vchamarthi <123653452+vchamarthi@users.noreply.github.com> Date: Sat, 14 Nov 2026 12:01:02 -0600 Subject: [PATCH 5/5] =?UTF-8?q?fix(validate):=20keep=20when=20cues=20for?= =?UTF-8?q?=20de=20beim,=20zh=20=E8=B6=85=E6=97=B6=20and=20ja=20=E3=81=84?= =?UTF-8?q?=E3=81=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes the narrowed cues that turned real when-clauses into description-no-when: - de: no 60-character cap, imperative and separable use verbs (ruf auf, setz ein), either order, z. B. does not end the sentence - zh: 超时/延时/耗时 followed by a comma or 请 and a use verb counts again; 当事人签字时 counts - ja: いつ with an object before the use verb counts - de: a full stop before an acronym ends the sentence - zh: 当事人 with an unrelated 用时 is no cue - ja: そいつ, あいつ and どいつ are no いつ cue - tests: one case per verb or character in the cue lists Signed-off-by: vchamarthi <123653452+vchamarthi@users.noreply.github.com> --- ...61113_120000_xaleryb_when-cue-followups.md | 5 +- dokimi/dokimi/external/when_cues.py | 18 +++++-- dokimi/tests/test_description_when_cues.py | 53 +++++++++++++++++++ 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/dokimi/changelog.d/20261113_120000_xaleryb_when-cue-followups.md b/dokimi/changelog.d/20261113_120000_xaleryb_when-cue-followups.md index b4d400c69..f3d6bcf34 100644 --- a/dokimi/changelog.d/20261113_120000_xaleryb_when-cue-followups.md +++ b/dokimi/changelog.d/20261113_120000_xaleryb_when-cue-followups.md @@ -3,5 +3,6 @@ - **`description-no-when` no longer takes a capability word for a "when" cue** — a description with no "when" clause lost the `warn` when it held Japanese `思いつく`/`追いつく`/`こいつ` (read as `いつ`), Chinese `耗时调用`/`超时调用`/`延时执行`/`当事人`, or German `Hilft beim …`/`Unterstützt beim …`. Now `いつ` counts only - before a use verb, `时` after `耗`/`超`/`延` is no cue, and `beim` counts only with `verwenden`, `nutzen`, - `benutzen`, `einsetzen` or `aufrufen` in the same sentence. Run `catalog check` again to see the warnings that come back. + before a use verb in the same sentence, `时` after `耗`/`超`/`延` is no cue unless a comma or `请` and a use verb + follow, and `beim` counts only with `verwenden`, `nutzen`, `benutzen`, `einsetzen`, `aufrufen` (also `verwende`, + `nutze`, `benutze`, `ruf … auf`, `setz … ein`) in the same sentence, in either order. Run `catalog check` again to see the warnings that come back. diff --git a/dokimi/dokimi/external/when_cues.py b/dokimi/dokimi/external/when_cues.py index d7221ae5a..ada6b6b43 100644 --- a/dokimi/dokimi/external/when_cues.py +++ b/dokimi/dokimi/external/when_cues.py @@ -11,6 +11,17 @@ import re from typing import Optional +# German `beim` is a cue only in a sentence with a use verb, in either order; a full stop that is +# followed by a capitalised word or an acronym ends the sentence, so `z. B.` does not. +_DE_S = r"(?:[^.;!?]|\.(?!\s*(?-i:[A-ZÄÖÜ][A-Za-zäöüß])))*?" +_DE_USE = r"\b(?:verwende[nst]?|nutze[nst]?|benutze[nst]?|einsetzen|aufrufen)\b" +_DE_BEIM = ( + rf"{_DE_USE}{_DE_S}\bbeim\b|\bbeim\b{_DE_S}{_DE_USE}|" + rf"\bruf(?:e|en|t)?\b{_DE_S}\bbeim\b{_DE_S}\bauf\b|\bbeim\b{_DE_S}\bruf(?:e|en|t)?\b{_DE_S}\bauf\b|" + rf"\bsetz(?:e|en|t)?\b{_DE_S}\bbeim\b{_DE_S}\bein\b|\bbeim\b{_DE_S}\bsetz(?:e|en|t)?\b{_DE_S}\bein\b|" + rf"\bruf(?:e|en|t)?\b{_DE_S}\bauf\b{_DE_S}\bbeim\b|\bsetz(?:e|en|t)?\b{_DE_S}\bein\b{_DE_S}\bbeim\b" +) + # A "when" clause or use phrase per language: the model chooses a skill from its description alone. # Latin cues take word boundaries, CJK cues are substrings; bare 使用 (use) or 用于 (for) are too broad. WHEN_CUES = { @@ -19,15 +30,14 @@ r"whenever\b)", "es": r"(?