feat(skills)!: remove kvb-skills-shortcuts

The operator dropped the conversation shortcuts (sobu, soco, socobu, socon, sona, sote) as unnecessary. Deletes the skill and tests/test_shortcuts.py, drops the tokens from the kvb-code-no-comments triggers, the shortcut branch from kvb-skills-auto step 3, the shortcuts row option from kvb-skills-tune, and the nodes and edge from the README organigram and skill map.

BREAKING CHANGE: the shortcut tokens no longer expand; use /kvb-git-commit-next and /kvb-git-commit-no-verify.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kevin Veen-BirkenbachandClaude Opus 5.5 committed 2026-11-03 13:57:13 +01:00
1 parent 41c1c57933
commit 42b66e3ddf
6 files changed
+11 -93

No files matched your search

-3
View File
@@ -65,7 +65,6 @@ flowchart LR
skills --> skills_tune[kvb-skills-tune]
skills --> skills_auto[kvb-skills-auto]
skills --> skills_essence[kvb-skills-essence]
skills --> skills_shortcuts[kvb-skills-shortcuts]
none --> cleanup[kvb-cleanup]
none --> help[kvb-help]
```
@@ -137,7 +136,6 @@ flowchart LR
autotune[kvb-skills-tune]
autoskill[kvb-skills-auto]
essence[kvb-skills-essence]
shortcuts[kvb-skills-shortcuts]
end
subgraph cat_none [no category]
cleanup[kvb-cleanup]
@@ -210,7 +208,6 @@ flowchart LR
dream --> autotune
dream --> autoskill
autoskill --> autotune
autoskill --> shortcuts
autotune --> essence
test --> triage
+2 -2
View File
@@ -3,8 +3,8 @@ name: kvb-code-no-comments
description: >
Purge explanatory comments from staged and unstaged changes. Run
AUTOMATICALLY before every commit or stage request (commit, commit
no-verify, stage next, socon, sobu, socobu, "commite ..."); also on
/kvb-code-no-comments or comment complaints.
no-verify, stage next, "commite ..."); also on /kvb-code-no-comments or
comment complaints.
---
When the operator asks to commit or stage, run this audit first and only
+7 -9
View File
@@ -18,15 +18,13 @@ vary), do the following:
2. Then propose, in one short paragraph: the repeated pattern you observed,
a skill name suggestion, the trigger phrasing, and what the skill would
do. Ask whether to create it.
3. On approval, write the skill:
- a conversation shortcut or expansion: add it to the `kvb-skills-shortcuts` skill
table instead of creating a new skill.
- anything else: persist it exactly as the `kvb-skills-tune` skill's
**Persistence** section specifies — locate the operator's skills
repository, write `skills/<name>/SKILL.md` there (or in the current
project for project-specific behavior), then mirror the skill directory
into `~/.claude/skills/` and `~/.agents/skills/`, plus the project's
`.claude/skills/` and `.agents/skills/` when it is project-specific.
3. On approval, write the skill: persist it exactly as the
`kvb-skills-tune` skill's **Persistence** section specifies — locate the
operator's skills repository, write `skills/<name>/SKILL.md` there (or in
the current project for project-specific behavior), then mirror the skill
directory into `~/.claude/skills/` and `~/.agents/skills/`, plus the
project's `.claude/skills/` and `.agents/skills/` when it is
project-specific.
Follow the local naming conventions and keep the skill a thin,
single-purpose instruction; route to an authoritative doc when one
exists instead of duplicating it.
-18
View File
@@ -1,18 +0,0 @@
---
name: kvb-skills-shortcuts
description: >
Operator conversation shortcuts. Trigger when the message is exactly one of
these tokens, optionally with arguments: sobu, soco, socobu, socon, sona,
sote. Expand it and act on the expanded instruction.
---
When an operator message is one of the shortcuts below, expand it to the meaning and act on it.
| Shortcut | Meaning |
| --- | --- |
| `sobu` | Stage next bundle: stage the next logical bundle of verified changes, explain what it does, and list what still remains uncommitted. |
| `soco` | Commit: commit the currently staged changes (pre-commit hooks run). |
| `socobu` | Commit no-verify, then stage next bundle: run `socon` followed by `sobu`. |
| `socon` | Commit no-verify: commit the currently staged changes with `--no-verify`. |
| `sona` | New alias: add the shortcut the operator states to the appropriate table, keeping it sorted. |
| `sote` | Run `make test`. |
+2 -2
View File
@@ -81,8 +81,8 @@ Ask in this order, at most four questions per call:
2. **Target** - which finding becomes a skill, or which existing skill gets
optimized. One option per candidate, each with its measured cost in the
description.
3. **Shape** - for a new skill: `Standalone skill`, `Row in the
kvb-skills-shortcuts skill`, `Extend an existing skill`, `Memory entry instead of a skill`.
3. **Shape** - for a new skill: `Standalone skill`, `Extend an existing
skill`, `Memory entry instead of a skill`.
For an optimization: `Tighten wording only`, `Change the trigger`, `Add
rules`, `Split into two skills`, `Merge into another skill`.
4. **Placement** - `Operator skills repository (portable)` or
-59
View File
@@ -1,59 +0,0 @@
"""Validate the kvb-skills-shortcuts skill table: rows present, sorted, ``soc``-prefixed,
no two adjacent consonants."""
from __future__ import annotations
import re
import unittest
from pathlib import Path
REPO_ROOT = Path(__file__).resolve().parents[1]
SKILL = REPO_ROOT / "skills" / "kvb-skills-shortcuts" / "SKILL.md"
ROW_RE = re.compile(r"^\|\s*`(?P<shortcut>[^`]+)`\s*\|")
VOWELS = frozenset("aeiou")
def _has_consonant_cluster(name: str) -> bool:
prev_consonant = False
for char in name:
if not char.isalpha():
prev_consonant = False
continue
is_consonant = char.lower() not in VOWELS
if is_consonant and prev_consonant:
return True
prev_consonant = is_consonant
return False
class TestShortcuts(unittest.TestCase):
def setUp(self):
self.assertTrue(SKILL.is_file(), f"missing {SKILL}")
self.shortcuts = [
match.group("shortcut")
for line in SKILL.read_text(encoding="utf-8").splitlines()
if (match := ROW_RE.match(line))
]
def test_shortcuts_present(self):
self.assertTrue(self.shortcuts, "no shortcut rows found in kvb-skills-shortcuts skill")
def test_shortcuts_sorted_ascending(self):
self.assertEqual(
self.shortcuts,
sorted(self.shortcuts),
f"shortcuts table not sorted; expected {sorted(self.shortcuts)}",
)
def test_shortcuts_start_with_so(self):
bad = [s for s in self.shortcuts if not s.startswith("so")]
self.assertFalse(bad, f"shortcuts not starting with 'so': {bad}")
def test_no_consecutive_consonants(self):
bad = [s for s in self.shortcuts if _has_consonant_cluster(s)]
self.assertFalse(bad, f"shortcuts with two adjacent consonants: {bad}")
if __name__ == "__main__":
unittest.main()