feat: add cmk:write-cmk-skill - #28

Open
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill
Open

feat: add cmk:write-cmk-skill#28
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill

Conversation

@jayden-dang

Copy link
Copy Markdown
Contributor

Summary

  • Add cmk:write-cmk-skill (v1.0.0), ported from author-skills, as a user-invoked meta skill for creating/editing/reviewing cmk:* skills under a failing-baseline Iron Law.
  • Adapt packaging to kit conventions (references/, frontmatter order, 150-line budget, scripts/skill-lint.sh).
  • Update AI navigation docs, on-ramps, and CONTRIBUTING so contributors know when and how to use it.

Test plan

  • bash scripts/skill-lint.sh passes
  • Spot-check /write-cmk-skill discovery in the host agent slash menu after install/vendor
  • Confirm docs/ai/skills/write-cmk-skill.md links resolve from docs/ai/skills/README.md

Port author-skills into the kit as a user-invoked meta skill for
test-driven cmk skill authoring, and wire it into AI docs, on-ramps,
and CONTRIBUTING.
@jayden-dang
jayden-dang requested review from daniellam258 and harrymove-ctrl and removed request for harrymove-ctrlSeptember 1, 2026 03:57
Name the user-invoked authoring skill before preparing upstream PRs for
generic amendments; skip for project adaptations that stay local.

@harrymove-ctrlharrymove-ctrl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes. The content is strong and the docs work is thorough — README, conventions, the new doc page, and on-ramps all landed correctly. The cmk:sync hand-off is also written exactly right ("name/write-cmk-skill for the user to run… Do not invoke it"), which is the trap I'd have expected a commit like that to fall into. Credit where due.

Four things should be resolved before merge, plus two questions.

skill-lint is green, but it only checks frontmatter shape, the line budget, reference integrity, citations, paths, and JSON validity. None of the findings below are things it can catch.


1. The skill ships in violation of its own Iron Law — twice

NO NEW SKILL AND NO EDIT TO A SKILL SHIPS WITHOUT A FAILING TEST FIRST

For the new skill. The ship checklist requires "The RED/GREEN evidence for this edit is recorded in the skill's TESTS.md", and the description advertises TESTS.md as part of the deliverable — but the package has none. cmk:interpret, the closest analog (user-invoked, disable-model-invocation, ships an eval.json), landed its TESTS.md in the same commit that added it (0d7b298).

The tell is in the fixtures. Both entries here are derived_from: "SKILL.md § …" — assertions restated from the text that was just written. Interpret's are derived_from: "TESTS.md § S1 …", i.e. observed baseline failures. That is precisely the gap the skill itself names:

Wrote the text before running the baseline? You documented what you guess agents do wrong, not what they do wrong.

For the cmk:sync edit. The law covers edits, and the rationalization table has a row for exactly this: "'It's a tiny edit' → Edits regress skills exactly like code. Baseline against the old version first."2dc9069 adds a mandatory gate step to contribute mode with no baseline. skills/sync/ has no TESTS.md, and its eval.json (4 fixtures) wasn't touched — contribute mode has zero coverage before or after this PR.

Ask: run the RED/GREEN/REFACTOR loop on a named model roster into skills/write-cmk-skill/TESTS.md; re-derive eval.json from it; add a contribute-gate fixture to skills/sync/eval.json; and add - Pressure-test record: skills/write-cmk-skill/TESTS.md to the ## Where list in docs/ai/skills/write-cmk-skill.md (cf. interpret.md:25).

2. Slash-command form — now load-bearing, and still unverified

/write-cmk-skill (no prefix) appears in 6 files, including inside a model-invocable skill's workflow at skills/sync/SKILL.md:55 and its reference file.

README.md:17 documents the form as /cmk:requirements, and conventions.md says name is "used as the slash command". Under the plugin layout the namespace is supplied by the plugin itself (plugin:skill — e.g. hookify:writing-rules, whose frontmatter name carries no prefix), so the command comes out prefixed either way. I can't find an install path that yields the bare form:

Install pathResulting command
Plugin, as-is (ai-devkit + name: cmk:write-cmk-skill)ai-devkit:cmk:write-cmk-skill — two colons, likely malformed
Plugin, with the cmk plugin name/cmk:write-cmk-skill
Vendored (.agents/skills/cmk-<name>/)/cmk-write-cmk-skill

If it is in fact prefixed, an agent running cmk:sync contribute mode will instruct the user to type a command that does not exist. The test plan already flags this as unchecked — worth settling before merge rather than after, since it is now baked into shipped skill text on a required path, not just docs.

Related, for whoever picks up the drop-the-prefix / marketplace change: this PR adds one more skill with cmk: hardcoded into name:, plus 6 new /write-cmk-skill references, all of which that refactor will have to revisit.

3. Site registry not updated — lib/skill-types.ts

Precedent: 0d7b298 touched both lib/skills.ts and lib/skill-types.ts.

Skills are filesystem-discovered (lib/skills.ts:29), so this one will render — degraded. CATEGORY_MAP has no entry, so it falls to "other". SKILL_PURPOSE has no entry, so skillPurpose() falls back to the first quoted trigger phrase — and this description contains no quoted phrases, so it returns "", giving a blank purpose line on the catalog card and the graph node. Neither build nor skill-lint catches it.

// CATEGORY_LABELSmeta: "Meta",// CATEGORY_MAP"write-cmk-skill": "meta",// SKILL_PURPOSE"write-cmk-skill": "Author or review a cmk skill",

(Minor: the doc comment above SKILL_PURPOSE says "across 34 skills" — now 35.)

4. Broken markdown — SKILL.md:51 and SKILL.md:85

Backslash-escaped backticks inside a code span. CommonMark does not process escapes there. Verified through GitHub's own markdown API:

<code>REQUIRED SUB-SKILL: use \</code>cmk:learn``

It renders garbled on GitHub and on the devkit site, which renders SKILL.md directly. This is the only file under skills/ containing \ + backtick. Fix with a double-backtick fence so the inner backticks are literal:

``REQUIRED SUB-SKILL: use `cmk:learn` ``

Questions

Is the cmk:sync change meant to be in this PR? The title and all three Summary bullets say "add cmk:write-cmk-skill", with no mention that cmk:sync gained a mandatory workflow step and a version bump. If it is intentional, please add it to the description and the test plan — it changes behavior in a skill already vendored into consumer repos, and a reviewer going by the description would miss it. If it was folded in incidentally, splitting 2dc9069 into its own PR would keep the two risk profiles separate.

Should contribute-mode step 3 handle the skill not being installed? It assumes write-cmk-skill is present. A repo that vendored before this PR, or that vendors selectively, won't have it, and the only escape hatch offered is "the user already completed that pass."


Not blocking, and pre-existing:skills/enclave/ has no docs/ai/skills/enclave.md and is absent from the docs README roster — which is why that file's family counts were already off by one before this change.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jayden-dang@harrymove-ctrl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: add cmk:write-cmk-skill - #28

Open
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill
Open

feat: add cmk:write-cmk-skill#28
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill

Conversation

@jayden-dang

Copy link
Copy Markdown
Contributor

Summary

  • Add cmk:write-cmk-skill (v1.0.0), ported from author-skills, as a user-invoked meta skill for creating/editing/reviewing cmk:* skills under a failing-baseline Iron Law.
  • Adapt packaging to kit conventions (references/, frontmatter order, 150-line budget, scripts/skill-lint.sh).
  • Update AI navigation docs, on-ramps, and CONTRIBUTING so contributors know when and how to use it.

Test plan

  • bash scripts/skill-lint.sh passes
  • Spot-check /write-cmk-skill discovery in the host agent slash menu after install/vendor
  • Confirm docs/ai/skills/write-cmk-skill.md links resolve from docs/ai/skills/README.md

Port author-skills into the kit as a user-invoked meta skill for
test-driven cmk skill authoring, and wire it into AI docs, on-ramps,
and CONTRIBUTING.
@jayden-dang
jayden-dang requested review from daniellam258 and harrymove-ctrl and removed request for harrymove-ctrlSeptember 1, 2026 03:57
Name the user-invoked authoring skill before preparing upstream PRs for
generic amendments; skip for project adaptations that stay local.

@harrymove-ctrlharrymove-ctrl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes. The content is strong and the docs work is thorough — README, conventions, the new doc page, and on-ramps all landed correctly. The cmk:sync hand-off is also written exactly right ("name/write-cmk-skill for the user to run… Do not invoke it"), which is the trap I'd have expected a commit like that to fall into. Credit where due.

Four things should be resolved before merge, plus two questions.

skill-lint is green, but it only checks frontmatter shape, the line budget, reference integrity, citations, paths, and JSON validity. None of the findings below are things it can catch.


1. The skill ships in violation of its own Iron Law — twice

NO NEW SKILL AND NO EDIT TO A SKILL SHIPS WITHOUT A FAILING TEST FIRST

For the new skill. The ship checklist requires "The RED/GREEN evidence for this edit is recorded in the skill's TESTS.md", and the description advertises TESTS.md as part of the deliverable — but the package has none. cmk:interpret, the closest analog (user-invoked, disable-model-invocation, ships an eval.json), landed its TESTS.md in the same commit that added it (0d7b298).

The tell is in the fixtures. Both entries here are derived_from: "SKILL.md § …" — assertions restated from the text that was just written. Interpret's are derived_from: "TESTS.md § S1 …", i.e. observed baseline failures. That is precisely the gap the skill itself names:

Wrote the text before running the baseline? You documented what you guess agents do wrong, not what they do wrong.

For the cmk:sync edit. The law covers edits, and the rationalization table has a row for exactly this: "'It's a tiny edit' → Edits regress skills exactly like code. Baseline against the old version first."2dc9069 adds a mandatory gate step to contribute mode with no baseline. skills/sync/ has no TESTS.md, and its eval.json (4 fixtures) wasn't touched — contribute mode has zero coverage before or after this PR.

Ask: run the RED/GREEN/REFACTOR loop on a named model roster into skills/write-cmk-skill/TESTS.md; re-derive eval.json from it; add a contribute-gate fixture to skills/sync/eval.json; and add - Pressure-test record: skills/write-cmk-skill/TESTS.md to the ## Where list in docs/ai/skills/write-cmk-skill.md (cf. interpret.md:25).

2. Slash-command form — now load-bearing, and still unverified

/write-cmk-skill (no prefix) appears in 6 files, including inside a model-invocable skill's workflow at skills/sync/SKILL.md:55 and its reference file.

README.md:17 documents the form as /cmk:requirements, and conventions.md says name is "used as the slash command". Under the plugin layout the namespace is supplied by the plugin itself (plugin:skill — e.g. hookify:writing-rules, whose frontmatter name carries no prefix), so the command comes out prefixed either way. I can't find an install path that yields the bare form:

Install pathResulting command
Plugin, as-is (ai-devkit + name: cmk:write-cmk-skill)ai-devkit:cmk:write-cmk-skill — two colons, likely malformed
Plugin, with the cmk plugin name/cmk:write-cmk-skill
Vendored (.agents/skills/cmk-<name>/)/cmk-write-cmk-skill

If it is in fact prefixed, an agent running cmk:sync contribute mode will instruct the user to type a command that does not exist. The test plan already flags this as unchecked — worth settling before merge rather than after, since it is now baked into shipped skill text on a required path, not just docs.

Related, for whoever picks up the drop-the-prefix / marketplace change: this PR adds one more skill with cmk: hardcoded into name:, plus 6 new /write-cmk-skill references, all of which that refactor will have to revisit.

3. Site registry not updated — lib/skill-types.ts

Precedent: 0d7b298 touched both lib/skills.ts and lib/skill-types.ts.

Skills are filesystem-discovered (lib/skills.ts:29), so this one will render — degraded. CATEGORY_MAP has no entry, so it falls to "other". SKILL_PURPOSE has no entry, so skillPurpose() falls back to the first quoted trigger phrase — and this description contains no quoted phrases, so it returns "", giving a blank purpose line on the catalog card and the graph node. Neither build nor skill-lint catches it.

// CATEGORY_LABELSmeta: "Meta",// CATEGORY_MAP"write-cmk-skill": "meta",// SKILL_PURPOSE"write-cmk-skill": "Author or review a cmk skill",

(Minor: the doc comment above SKILL_PURPOSE says "across 34 skills" — now 35.)

4. Broken markdown — SKILL.md:51 and SKILL.md:85

Backslash-escaped backticks inside a code span. CommonMark does not process escapes there. Verified through GitHub's own markdown API:

<code>REQUIRED SUB-SKILL: use \</code>cmk:learn``

It renders garbled on GitHub and on the devkit site, which renders SKILL.md directly. This is the only file under skills/ containing \ + backtick. Fix with a double-backtick fence so the inner backticks are literal:

``REQUIRED SUB-SKILL: use `cmk:learn` ``

Questions

Is the cmk:sync change meant to be in this PR? The title and all three Summary bullets say "add cmk:write-cmk-skill", with no mention that cmk:sync gained a mandatory workflow step and a version bump. If it is intentional, please add it to the description and the test plan — it changes behavior in a skill already vendored into consumer repos, and a reviewer going by the description would miss it. If it was folded in incidentally, splitting 2dc9069 into its own PR would keep the two risk profiles separate.

Should contribute-mode step 3 handle the skill not being installed? It assumes write-cmk-skill is present. A repo that vendored before this PR, or that vendors selectively, won't have it, and the only escape hatch offered is "the user already completed that pass."


Not blocking, and pre-existing:skills/enclave/ has no docs/ai/skills/enclave.md and is absent from the docs README roster — which is why that file's family counts were already off by one before this change.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jayden-dang@harrymove-ctrl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add cmk:write-cmk-skill - #28

Open
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill
Open

feat: add cmk:write-cmk-skill#28
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill

Conversation

@jayden-dang

Copy link
Copy Markdown
Contributor

Summary

  • Add cmk:write-cmk-skill (v1.0.0), ported from author-skills, as a user-invoked meta skill for creating/editing/reviewing cmk:* skills under a failing-baseline Iron Law.
  • Adapt packaging to kit conventions (references/, frontmatter order, 150-line budget, scripts/skill-lint.sh).
  • Update AI navigation docs, on-ramps, and CONTRIBUTING so contributors know when and how to use it.

Test plan

  • bash scripts/skill-lint.sh passes
  • Spot-check /write-cmk-skill discovery in the host agent slash menu after install/vendor
  • Confirm docs/ai/skills/write-cmk-skill.md links resolve from docs/ai/skills/README.md

Port author-skills into the kit as a user-invoked meta skill for
test-driven cmk skill authoring, and wire it into AI docs, on-ramps,
and CONTRIBUTING.
@jayden-dang
jayden-dang requested review from daniellam258 and harrymove-ctrl and removed request for harrymove-ctrlSeptember 1, 2026 03:57
Name the user-invoked authoring skill before preparing upstream PRs for
generic amendments; skip for project adaptations that stay local.

@harrymove-ctrlharrymove-ctrl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes. The content is strong and the docs work is thorough — README, conventions, the new doc page, and on-ramps all landed correctly. The cmk:sync hand-off is also written exactly right ("name/write-cmk-skill for the user to run… Do not invoke it"), which is the trap I'd have expected a commit like that to fall into. Credit where due.

Four things should be resolved before merge, plus two questions.

skill-lint is green, but it only checks frontmatter shape, the line budget, reference integrity, citations, paths, and JSON validity. None of the findings below are things it can catch.


1. The skill ships in violation of its own Iron Law — twice

NO NEW SKILL AND NO EDIT TO A SKILL SHIPS WITHOUT A FAILING TEST FIRST

For the new skill. The ship checklist requires "The RED/GREEN evidence for this edit is recorded in the skill's TESTS.md", and the description advertises TESTS.md as part of the deliverable — but the package has none. cmk:interpret, the closest analog (user-invoked, disable-model-invocation, ships an eval.json), landed its TESTS.md in the same commit that added it (0d7b298).

The tell is in the fixtures. Both entries here are derived_from: "SKILL.md § …" — assertions restated from the text that was just written. Interpret's are derived_from: "TESTS.md § S1 …", i.e. observed baseline failures. That is precisely the gap the skill itself names:

Wrote the text before running the baseline? You documented what you guess agents do wrong, not what they do wrong.

For the cmk:sync edit. The law covers edits, and the rationalization table has a row for exactly this: "'It's a tiny edit' → Edits regress skills exactly like code. Baseline against the old version first."2dc9069 adds a mandatory gate step to contribute mode with no baseline. skills/sync/ has no TESTS.md, and its eval.json (4 fixtures) wasn't touched — contribute mode has zero coverage before or after this PR.

Ask: run the RED/GREEN/REFACTOR loop on a named model roster into skills/write-cmk-skill/TESTS.md; re-derive eval.json from it; add a contribute-gate fixture to skills/sync/eval.json; and add - Pressure-test record: skills/write-cmk-skill/TESTS.md to the ## Where list in docs/ai/skills/write-cmk-skill.md (cf. interpret.md:25).

2. Slash-command form — now load-bearing, and still unverified

/write-cmk-skill (no prefix) appears in 6 files, including inside a model-invocable skill's workflow at skills/sync/SKILL.md:55 and its reference file.

README.md:17 documents the form as /cmk:requirements, and conventions.md says name is "used as the slash command". Under the plugin layout the namespace is supplied by the plugin itself (plugin:skill — e.g. hookify:writing-rules, whose frontmatter name carries no prefix), so the command comes out prefixed either way. I can't find an install path that yields the bare form:

Install pathResulting command
Plugin, as-is (ai-devkit + name: cmk:write-cmk-skill)ai-devkit:cmk:write-cmk-skill — two colons, likely malformed
Plugin, with the cmk plugin name/cmk:write-cmk-skill
Vendored (.agents/skills/cmk-<name>/)/cmk-write-cmk-skill

If it is in fact prefixed, an agent running cmk:sync contribute mode will instruct the user to type a command that does not exist. The test plan already flags this as unchecked — worth settling before merge rather than after, since it is now baked into shipped skill text on a required path, not just docs.

Related, for whoever picks up the drop-the-prefix / marketplace change: this PR adds one more skill with cmk: hardcoded into name:, plus 6 new /write-cmk-skill references, all of which that refactor will have to revisit.

3. Site registry not updated — lib/skill-types.ts

Precedent: 0d7b298 touched both lib/skills.ts and lib/skill-types.ts.

Skills are filesystem-discovered (lib/skills.ts:29), so this one will render — degraded. CATEGORY_MAP has no entry, so it falls to "other". SKILL_PURPOSE has no entry, so skillPurpose() falls back to the first quoted trigger phrase — and this description contains no quoted phrases, so it returns "", giving a blank purpose line on the catalog card and the graph node. Neither build nor skill-lint catches it.

// CATEGORY_LABELSmeta: "Meta",// CATEGORY_MAP"write-cmk-skill": "meta",// SKILL_PURPOSE"write-cmk-skill": "Author or review a cmk skill",

(Minor: the doc comment above SKILL_PURPOSE says "across 34 skills" — now 35.)

4. Broken markdown — SKILL.md:51 and SKILL.md:85

Backslash-escaped backticks inside a code span. CommonMark does not process escapes there. Verified through GitHub's own markdown API:

<code>REQUIRED SUB-SKILL: use \</code>cmk:learn``

It renders garbled on GitHub and on the devkit site, which renders SKILL.md directly. This is the only file under skills/ containing \ + backtick. Fix with a double-backtick fence so the inner backticks are literal:

``REQUIRED SUB-SKILL: use `cmk:learn` ``

Questions

Is the cmk:sync change meant to be in this PR? The title and all three Summary bullets say "add cmk:write-cmk-skill", with no mention that cmk:sync gained a mandatory workflow step and a version bump. If it is intentional, please add it to the description and the test plan — it changes behavior in a skill already vendored into consumer repos, and a reviewer going by the description would miss it. If it was folded in incidentally, splitting 2dc9069 into its own PR would keep the two risk profiles separate.

Should contribute-mode step 3 handle the skill not being installed? It assumes write-cmk-skill is present. A repo that vendored before this PR, or that vendors selectively, won't have it, and the only escape hatch offered is "the user already completed that pass."


Not blocking, and pre-existing:skills/enclave/ has no docs/ai/skills/enclave.md and is absent from the docs README roster — which is why that file's family counts were already off by one before this change.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jayden-dang@harrymove-ctrl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add cmk:write-cmk-skill - #28

Open
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill
Open

feat: add cmk:write-cmk-skill#28
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill

Conversation

@jayden-dang

Copy link
Copy Markdown
Contributor

Summary

  • Add cmk:write-cmk-skill (v1.0.0), ported from author-skills, as a user-invoked meta skill for creating/editing/reviewing cmk:* skills under a failing-baseline Iron Law.
  • Adapt packaging to kit conventions (references/, frontmatter order, 150-line budget, scripts/skill-lint.sh).
  • Update AI navigation docs, on-ramps, and CONTRIBUTING so contributors know when and how to use it.

Test plan

  • bash scripts/skill-lint.sh passes
  • Spot-check /write-cmk-skill discovery in the host agent slash menu after install/vendor
  • Confirm docs/ai/skills/write-cmk-skill.md links resolve from docs/ai/skills/README.md

Port author-skills into the kit as a user-invoked meta skill for
test-driven cmk skill authoring, and wire it into AI docs, on-ramps,
and CONTRIBUTING.
@jayden-dang
jayden-dang requested review from daniellam258 and harrymove-ctrl and removed request for harrymove-ctrlSeptember 1, 2026 03:57
Name the user-invoked authoring skill before preparing upstream PRs for
generic amendments; skip for project adaptations that stay local.

@harrymove-ctrlharrymove-ctrl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes. The content is strong and the docs work is thorough — README, conventions, the new doc page, and on-ramps all landed correctly. The cmk:sync hand-off is also written exactly right ("name/write-cmk-skill for the user to run… Do not invoke it"), which is the trap I'd have expected a commit like that to fall into. Credit where due.

Four things should be resolved before merge, plus two questions.

skill-lint is green, but it only checks frontmatter shape, the line budget, reference integrity, citations, paths, and JSON validity. None of the findings below are things it can catch.


1. The skill ships in violation of its own Iron Law — twice

NO NEW SKILL AND NO EDIT TO A SKILL SHIPS WITHOUT A FAILING TEST FIRST

For the new skill. The ship checklist requires "The RED/GREEN evidence for this edit is recorded in the skill's TESTS.md", and the description advertises TESTS.md as part of the deliverable — but the package has none. cmk:interpret, the closest analog (user-invoked, disable-model-invocation, ships an eval.json), landed its TESTS.md in the same commit that added it (0d7b298).

The tell is in the fixtures. Both entries here are derived_from: "SKILL.md § …" — assertions restated from the text that was just written. Interpret's are derived_from: "TESTS.md § S1 …", i.e. observed baseline failures. That is precisely the gap the skill itself names:

Wrote the text before running the baseline? You documented what you guess agents do wrong, not what they do wrong.

For the cmk:sync edit. The law covers edits, and the rationalization table has a row for exactly this: "'It's a tiny edit' → Edits regress skills exactly like code. Baseline against the old version first."2dc9069 adds a mandatory gate step to contribute mode with no baseline. skills/sync/ has no TESTS.md, and its eval.json (4 fixtures) wasn't touched — contribute mode has zero coverage before or after this PR.

Ask: run the RED/GREEN/REFACTOR loop on a named model roster into skills/write-cmk-skill/TESTS.md; re-derive eval.json from it; add a contribute-gate fixture to skills/sync/eval.json; and add - Pressure-test record: skills/write-cmk-skill/TESTS.md to the ## Where list in docs/ai/skills/write-cmk-skill.md (cf. interpret.md:25).

2. Slash-command form — now load-bearing, and still unverified

/write-cmk-skill (no prefix) appears in 6 files, including inside a model-invocable skill's workflow at skills/sync/SKILL.md:55 and its reference file.

README.md:17 documents the form as /cmk:requirements, and conventions.md says name is "used as the slash command". Under the plugin layout the namespace is supplied by the plugin itself (plugin:skill — e.g. hookify:writing-rules, whose frontmatter name carries no prefix), so the command comes out prefixed either way. I can't find an install path that yields the bare form:

Install pathResulting command
Plugin, as-is (ai-devkit + name: cmk:write-cmk-skill)ai-devkit:cmk:write-cmk-skill — two colons, likely malformed
Plugin, with the cmk plugin name/cmk:write-cmk-skill
Vendored (.agents/skills/cmk-<name>/)/cmk-write-cmk-skill

If it is in fact prefixed, an agent running cmk:sync contribute mode will instruct the user to type a command that does not exist. The test plan already flags this as unchecked — worth settling before merge rather than after, since it is now baked into shipped skill text on a required path, not just docs.

Related, for whoever picks up the drop-the-prefix / marketplace change: this PR adds one more skill with cmk: hardcoded into name:, plus 6 new /write-cmk-skill references, all of which that refactor will have to revisit.

3. Site registry not updated — lib/skill-types.ts

Precedent: 0d7b298 touched both lib/skills.ts and lib/skill-types.ts.

Skills are filesystem-discovered (lib/skills.ts:29), so this one will render — degraded. CATEGORY_MAP has no entry, so it falls to "other". SKILL_PURPOSE has no entry, so skillPurpose() falls back to the first quoted trigger phrase — and this description contains no quoted phrases, so it returns "", giving a blank purpose line on the catalog card and the graph node. Neither build nor skill-lint catches it.

// CATEGORY_LABELSmeta: "Meta",// CATEGORY_MAP"write-cmk-skill": "meta",// SKILL_PURPOSE"write-cmk-skill": "Author or review a cmk skill",

(Minor: the doc comment above SKILL_PURPOSE says "across 34 skills" — now 35.)

4. Broken markdown — SKILL.md:51 and SKILL.md:85

Backslash-escaped backticks inside a code span. CommonMark does not process escapes there. Verified through GitHub's own markdown API:

<code>REQUIRED SUB-SKILL: use \</code>cmk:learn``

It renders garbled on GitHub and on the devkit site, which renders SKILL.md directly. This is the only file under skills/ containing \ + backtick. Fix with a double-backtick fence so the inner backticks are literal:

``REQUIRED SUB-SKILL: use `cmk:learn` ``

Questions

Is the cmk:sync change meant to be in this PR? The title and all three Summary bullets say "add cmk:write-cmk-skill", with no mention that cmk:sync gained a mandatory workflow step and a version bump. If it is intentional, please add it to the description and the test plan — it changes behavior in a skill already vendored into consumer repos, and a reviewer going by the description would miss it. If it was folded in incidentally, splitting 2dc9069 into its own PR would keep the two risk profiles separate.

Should contribute-mode step 3 handle the skill not being installed? It assumes write-cmk-skill is present. A repo that vendored before this PR, or that vendors selectively, won't have it, and the only escape hatch offered is "the user already completed that pass."


Not blocking, and pre-existing:skills/enclave/ has no docs/ai/skills/enclave.md and is absent from the docs README roster — which is why that file's family counts were already off by one before this change.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jayden-dang@harrymove-ctrl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: add cmk:write-cmk-skill - #28

Open
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill
Open

feat: add cmk:write-cmk-skill#28
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill

Conversation

@jayden-dang

Copy link
Copy Markdown
Contributor

Summary

  • Add cmk:write-cmk-skill (v1.0.0), ported from author-skills, as a user-invoked meta skill for creating/editing/reviewing cmk:* skills under a failing-baseline Iron Law.
  • Adapt packaging to kit conventions (references/, frontmatter order, 150-line budget, scripts/skill-lint.sh).
  • Update AI navigation docs, on-ramps, and CONTRIBUTING so contributors know when and how to use it.

Test plan

  • bash scripts/skill-lint.sh passes
  • Spot-check /write-cmk-skill discovery in the host agent slash menu after install/vendor
  • Confirm docs/ai/skills/write-cmk-skill.md links resolve from docs/ai/skills/README.md

Port author-skills into the kit as a user-invoked meta skill for
test-driven cmk skill authoring, and wire it into AI docs, on-ramps,
and CONTRIBUTING.
@jayden-dang
jayden-dang requested review from daniellam258 and harrymove-ctrl and removed request for harrymove-ctrlSeptember 1, 2026 03:57
Name the user-invoked authoring skill before preparing upstream PRs for
generic amendments; skip for project adaptations that stay local.

@harrymove-ctrlharrymove-ctrl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes. The content is strong and the docs work is thorough — README, conventions, the new doc page, and on-ramps all landed correctly. The cmk:sync hand-off is also written exactly right ("name/write-cmk-skill for the user to run… Do not invoke it"), which is the trap I'd have expected a commit like that to fall into. Credit where due.

Four things should be resolved before merge, plus two questions.

skill-lint is green, but it only checks frontmatter shape, the line budget, reference integrity, citations, paths, and JSON validity. None of the findings below are things it can catch.


1. The skill ships in violation of its own Iron Law — twice

NO NEW SKILL AND NO EDIT TO A SKILL SHIPS WITHOUT A FAILING TEST FIRST

For the new skill. The ship checklist requires "The RED/GREEN evidence for this edit is recorded in the skill's TESTS.md", and the description advertises TESTS.md as part of the deliverable — but the package has none. cmk:interpret, the closest analog (user-invoked, disable-model-invocation, ships an eval.json), landed its TESTS.md in the same commit that added it (0d7b298).

The tell is in the fixtures. Both entries here are derived_from: "SKILL.md § …" — assertions restated from the text that was just written. Interpret's are derived_from: "TESTS.md § S1 …", i.e. observed baseline failures. That is precisely the gap the skill itself names:

Wrote the text before running the baseline? You documented what you guess agents do wrong, not what they do wrong.

For the cmk:sync edit. The law covers edits, and the rationalization table has a row for exactly this: "'It's a tiny edit' → Edits regress skills exactly like code. Baseline against the old version first."2dc9069 adds a mandatory gate step to contribute mode with no baseline. skills/sync/ has no TESTS.md, and its eval.json (4 fixtures) wasn't touched — contribute mode has zero coverage before or after this PR.

Ask: run the RED/GREEN/REFACTOR loop on a named model roster into skills/write-cmk-skill/TESTS.md; re-derive eval.json from it; add a contribute-gate fixture to skills/sync/eval.json; and add - Pressure-test record: skills/write-cmk-skill/TESTS.md to the ## Where list in docs/ai/skills/write-cmk-skill.md (cf. interpret.md:25).

2. Slash-command form — now load-bearing, and still unverified

/write-cmk-skill (no prefix) appears in 6 files, including inside a model-invocable skill's workflow at skills/sync/SKILL.md:55 and its reference file.

README.md:17 documents the form as /cmk:requirements, and conventions.md says name is "used as the slash command". Under the plugin layout the namespace is supplied by the plugin itself (plugin:skill — e.g. hookify:writing-rules, whose frontmatter name carries no prefix), so the command comes out prefixed either way. I can't find an install path that yields the bare form:

Install pathResulting command
Plugin, as-is (ai-devkit + name: cmk:write-cmk-skill)ai-devkit:cmk:write-cmk-skill — two colons, likely malformed
Plugin, with the cmk plugin name/cmk:write-cmk-skill
Vendored (.agents/skills/cmk-<name>/)/cmk-write-cmk-skill

If it is in fact prefixed, an agent running cmk:sync contribute mode will instruct the user to type a command that does not exist. The test plan already flags this as unchecked — worth settling before merge rather than after, since it is now baked into shipped skill text on a required path, not just docs.

Related, for whoever picks up the drop-the-prefix / marketplace change: this PR adds one more skill with cmk: hardcoded into name:, plus 6 new /write-cmk-skill references, all of which that refactor will have to revisit.

3. Site registry not updated — lib/skill-types.ts

Precedent: 0d7b298 touched both lib/skills.ts and lib/skill-types.ts.

Skills are filesystem-discovered (lib/skills.ts:29), so this one will render — degraded. CATEGORY_MAP has no entry, so it falls to "other". SKILL_PURPOSE has no entry, so skillPurpose() falls back to the first quoted trigger phrase — and this description contains no quoted phrases, so it returns "", giving a blank purpose line on the catalog card and the graph node. Neither build nor skill-lint catches it.

// CATEGORY_LABELSmeta: "Meta",// CATEGORY_MAP"write-cmk-skill": "meta",// SKILL_PURPOSE"write-cmk-skill": "Author or review a cmk skill",

(Minor: the doc comment above SKILL_PURPOSE says "across 34 skills" — now 35.)

4. Broken markdown — SKILL.md:51 and SKILL.md:85

Backslash-escaped backticks inside a code span. CommonMark does not process escapes there. Verified through GitHub's own markdown API:

<code>REQUIRED SUB-SKILL: use \</code>cmk:learn``

It renders garbled on GitHub and on the devkit site, which renders SKILL.md directly. This is the only file under skills/ containing \ + backtick. Fix with a double-backtick fence so the inner backticks are literal:

``REQUIRED SUB-SKILL: use `cmk:learn` ``

Questions

Is the cmk:sync change meant to be in this PR? The title and all three Summary bullets say "add cmk:write-cmk-skill", with no mention that cmk:sync gained a mandatory workflow step and a version bump. If it is intentional, please add it to the description and the test plan — it changes behavior in a skill already vendored into consumer repos, and a reviewer going by the description would miss it. If it was folded in incidentally, splitting 2dc9069 into its own PR would keep the two risk profiles separate.

Should contribute-mode step 3 handle the skill not being installed? It assumes write-cmk-skill is present. A repo that vendored before this PR, or that vendors selectively, won't have it, and the only escape hatch offered is "the user already completed that pass."


Not blocking, and pre-existing:skills/enclave/ has no docs/ai/skills/enclave.md and is absent from the docs README roster — which is why that file's family counts were already off by one before this change.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jayden-dang@harrymove-ctrl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add cmk:write-cmk-skill - #28

Open
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill
Open

feat: add cmk:write-cmk-skill#28
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill

Conversation

@jayden-dang

Copy link
Copy Markdown
Contributor

Summary

  • Add cmk:write-cmk-skill (v1.0.0), ported from author-skills, as a user-invoked meta skill for creating/editing/reviewing cmk:* skills under a failing-baseline Iron Law.
  • Adapt packaging to kit conventions (references/, frontmatter order, 150-line budget, scripts/skill-lint.sh).
  • Update AI navigation docs, on-ramps, and CONTRIBUTING so contributors know when and how to use it.

Test plan

  • bash scripts/skill-lint.sh passes
  • Spot-check /write-cmk-skill discovery in the host agent slash menu after install/vendor
  • Confirm docs/ai/skills/write-cmk-skill.md links resolve from docs/ai/skills/README.md

Port author-skills into the kit as a user-invoked meta skill for
test-driven cmk skill authoring, and wire it into AI docs, on-ramps,
and CONTRIBUTING.
@jayden-dang
jayden-dang requested review from daniellam258 and harrymove-ctrl and removed request for harrymove-ctrlSeptember 1, 2026 03:57
Name the user-invoked authoring skill before preparing upstream PRs for
generic amendments; skip for project adaptations that stay local.

@harrymove-ctrlharrymove-ctrl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes. The content is strong and the docs work is thorough — README, conventions, the new doc page, and on-ramps all landed correctly. The cmk:sync hand-off is also written exactly right ("name/write-cmk-skill for the user to run… Do not invoke it"), which is the trap I'd have expected a commit like that to fall into. Credit where due.

Four things should be resolved before merge, plus two questions.

skill-lint is green, but it only checks frontmatter shape, the line budget, reference integrity, citations, paths, and JSON validity. None of the findings below are things it can catch.


1. The skill ships in violation of its own Iron Law — twice

NO NEW SKILL AND NO EDIT TO A SKILL SHIPS WITHOUT A FAILING TEST FIRST

For the new skill. The ship checklist requires "The RED/GREEN evidence for this edit is recorded in the skill's TESTS.md", and the description advertises TESTS.md as part of the deliverable — but the package has none. cmk:interpret, the closest analog (user-invoked, disable-model-invocation, ships an eval.json), landed its TESTS.md in the same commit that added it (0d7b298).

The tell is in the fixtures. Both entries here are derived_from: "SKILL.md § …" — assertions restated from the text that was just written. Interpret's are derived_from: "TESTS.md § S1 …", i.e. observed baseline failures. That is precisely the gap the skill itself names:

Wrote the text before running the baseline? You documented what you guess agents do wrong, not what they do wrong.

For the cmk:sync edit. The law covers edits, and the rationalization table has a row for exactly this: "'It's a tiny edit' → Edits regress skills exactly like code. Baseline against the old version first."2dc9069 adds a mandatory gate step to contribute mode with no baseline. skills/sync/ has no TESTS.md, and its eval.json (4 fixtures) wasn't touched — contribute mode has zero coverage before or after this PR.

Ask: run the RED/GREEN/REFACTOR loop on a named model roster into skills/write-cmk-skill/TESTS.md; re-derive eval.json from it; add a contribute-gate fixture to skills/sync/eval.json; and add - Pressure-test record: skills/write-cmk-skill/TESTS.md to the ## Where list in docs/ai/skills/write-cmk-skill.md (cf. interpret.md:25).

2. Slash-command form — now load-bearing, and still unverified

/write-cmk-skill (no prefix) appears in 6 files, including inside a model-invocable skill's workflow at skills/sync/SKILL.md:55 and its reference file.

README.md:17 documents the form as /cmk:requirements, and conventions.md says name is "used as the slash command". Under the plugin layout the namespace is supplied by the plugin itself (plugin:skill — e.g. hookify:writing-rules, whose frontmatter name carries no prefix), so the command comes out prefixed either way. I can't find an install path that yields the bare form:

Install pathResulting command
Plugin, as-is (ai-devkit + name: cmk:write-cmk-skill)ai-devkit:cmk:write-cmk-skill — two colons, likely malformed
Plugin, with the cmk plugin name/cmk:write-cmk-skill
Vendored (.agents/skills/cmk-<name>/)/cmk-write-cmk-skill

If it is in fact prefixed, an agent running cmk:sync contribute mode will instruct the user to type a command that does not exist. The test plan already flags this as unchecked — worth settling before merge rather than after, since it is now baked into shipped skill text on a required path, not just docs.

Related, for whoever picks up the drop-the-prefix / marketplace change: this PR adds one more skill with cmk: hardcoded into name:, plus 6 new /write-cmk-skill references, all of which that refactor will have to revisit.

3. Site registry not updated — lib/skill-types.ts

Precedent: 0d7b298 touched both lib/skills.ts and lib/skill-types.ts.

Skills are filesystem-discovered (lib/skills.ts:29), so this one will render — degraded. CATEGORY_MAP has no entry, so it falls to "other". SKILL_PURPOSE has no entry, so skillPurpose() falls back to the first quoted trigger phrase — and this description contains no quoted phrases, so it returns "", giving a blank purpose line on the catalog card and the graph node. Neither build nor skill-lint catches it.

// CATEGORY_LABELSmeta: "Meta",// CATEGORY_MAP"write-cmk-skill": "meta",// SKILL_PURPOSE"write-cmk-skill": "Author or review a cmk skill",

(Minor: the doc comment above SKILL_PURPOSE says "across 34 skills" — now 35.)

4. Broken markdown — SKILL.md:51 and SKILL.md:85

Backslash-escaped backticks inside a code span. CommonMark does not process escapes there. Verified through GitHub's own markdown API:

<code>REQUIRED SUB-SKILL: use \</code>cmk:learn``

It renders garbled on GitHub and on the devkit site, which renders SKILL.md directly. This is the only file under skills/ containing \ + backtick. Fix with a double-backtick fence so the inner backticks are literal:

``REQUIRED SUB-SKILL: use `cmk:learn` ``

Questions

Is the cmk:sync change meant to be in this PR? The title and all three Summary bullets say "add cmk:write-cmk-skill", with no mention that cmk:sync gained a mandatory workflow step and a version bump. If it is intentional, please add it to the description and the test plan — it changes behavior in a skill already vendored into consumer repos, and a reviewer going by the description would miss it. If it was folded in incidentally, splitting 2dc9069 into its own PR would keep the two risk profiles separate.

Should contribute-mode step 3 handle the skill not being installed? It assumes write-cmk-skill is present. A repo that vendored before this PR, or that vendors selectively, won't have it, and the only escape hatch offered is "the user already completed that pass."


Not blocking, and pre-existing:skills/enclave/ has no docs/ai/skills/enclave.md and is absent from the docs README roster — which is why that file's family counts were already off by one before this change.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jayden-dang@harrymove-ctrl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add cmk:write-cmk-skill - #28

Open
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill
Open

feat: add cmk:write-cmk-skill#28
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill

Conversation

@jayden-dang

Copy link
Copy Markdown
Contributor

Summary

  • Add cmk:write-cmk-skill (v1.0.0), ported from author-skills, as a user-invoked meta skill for creating/editing/reviewing cmk:* skills under a failing-baseline Iron Law.
  • Adapt packaging to kit conventions (references/, frontmatter order, 150-line budget, scripts/skill-lint.sh).
  • Update AI navigation docs, on-ramps, and CONTRIBUTING so contributors know when and how to use it.

Test plan

  • bash scripts/skill-lint.sh passes
  • Spot-check /write-cmk-skill discovery in the host agent slash menu after install/vendor
  • Confirm docs/ai/skills/write-cmk-skill.md links resolve from docs/ai/skills/README.md

Port author-skills into the kit as a user-invoked meta skill for
test-driven cmk skill authoring, and wire it into AI docs, on-ramps,
and CONTRIBUTING.
@jayden-dang
jayden-dang requested review from daniellam258 and harrymove-ctrl and removed request for harrymove-ctrlSeptember 1, 2026 03:57
Name the user-invoked authoring skill before preparing upstream PRs for
generic amendments; skip for project adaptations that stay local.

@harrymove-ctrlharrymove-ctrl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes. The content is strong and the docs work is thorough — README, conventions, the new doc page, and on-ramps all landed correctly. The cmk:sync hand-off is also written exactly right ("name/write-cmk-skill for the user to run… Do not invoke it"), which is the trap I'd have expected a commit like that to fall into. Credit where due.

Four things should be resolved before merge, plus two questions.

skill-lint is green, but it only checks frontmatter shape, the line budget, reference integrity, citations, paths, and JSON validity. None of the findings below are things it can catch.


1. The skill ships in violation of its own Iron Law — twice

NO NEW SKILL AND NO EDIT TO A SKILL SHIPS WITHOUT A FAILING TEST FIRST

For the new skill. The ship checklist requires "The RED/GREEN evidence for this edit is recorded in the skill's TESTS.md", and the description advertises TESTS.md as part of the deliverable — but the package has none. cmk:interpret, the closest analog (user-invoked, disable-model-invocation, ships an eval.json), landed its TESTS.md in the same commit that added it (0d7b298).

The tell is in the fixtures. Both entries here are derived_from: "SKILL.md § …" — assertions restated from the text that was just written. Interpret's are derived_from: "TESTS.md § S1 …", i.e. observed baseline failures. That is precisely the gap the skill itself names:

Wrote the text before running the baseline? You documented what you guess agents do wrong, not what they do wrong.

For the cmk:sync edit. The law covers edits, and the rationalization table has a row for exactly this: "'It's a tiny edit' → Edits regress skills exactly like code. Baseline against the old version first."2dc9069 adds a mandatory gate step to contribute mode with no baseline. skills/sync/ has no TESTS.md, and its eval.json (4 fixtures) wasn't touched — contribute mode has zero coverage before or after this PR.

Ask: run the RED/GREEN/REFACTOR loop on a named model roster into skills/write-cmk-skill/TESTS.md; re-derive eval.json from it; add a contribute-gate fixture to skills/sync/eval.json; and add - Pressure-test record: skills/write-cmk-skill/TESTS.md to the ## Where list in docs/ai/skills/write-cmk-skill.md (cf. interpret.md:25).

2. Slash-command form — now load-bearing, and still unverified

/write-cmk-skill (no prefix) appears in 6 files, including inside a model-invocable skill's workflow at skills/sync/SKILL.md:55 and its reference file.

README.md:17 documents the form as /cmk:requirements, and conventions.md says name is "used as the slash command". Under the plugin layout the namespace is supplied by the plugin itself (plugin:skill — e.g. hookify:writing-rules, whose frontmatter name carries no prefix), so the command comes out prefixed either way. I can't find an install path that yields the bare form:

Install pathResulting command
Plugin, as-is (ai-devkit + name: cmk:write-cmk-skill)ai-devkit:cmk:write-cmk-skill — two colons, likely malformed
Plugin, with the cmk plugin name/cmk:write-cmk-skill
Vendored (.agents/skills/cmk-<name>/)/cmk-write-cmk-skill

If it is in fact prefixed, an agent running cmk:sync contribute mode will instruct the user to type a command that does not exist. The test plan already flags this as unchecked — worth settling before merge rather than after, since it is now baked into shipped skill text on a required path, not just docs.

Related, for whoever picks up the drop-the-prefix / marketplace change: this PR adds one more skill with cmk: hardcoded into name:, plus 6 new /write-cmk-skill references, all of which that refactor will have to revisit.

3. Site registry not updated — lib/skill-types.ts

Precedent: 0d7b298 touched both lib/skills.ts and lib/skill-types.ts.

Skills are filesystem-discovered (lib/skills.ts:29), so this one will render — degraded. CATEGORY_MAP has no entry, so it falls to "other". SKILL_PURPOSE has no entry, so skillPurpose() falls back to the first quoted trigger phrase — and this description contains no quoted phrases, so it returns "", giving a blank purpose line on the catalog card and the graph node. Neither build nor skill-lint catches it.

// CATEGORY_LABELSmeta: "Meta",// CATEGORY_MAP"write-cmk-skill": "meta",// SKILL_PURPOSE"write-cmk-skill": "Author or review a cmk skill",

(Minor: the doc comment above SKILL_PURPOSE says "across 34 skills" — now 35.)

4. Broken markdown — SKILL.md:51 and SKILL.md:85

Backslash-escaped backticks inside a code span. CommonMark does not process escapes there. Verified through GitHub's own markdown API:

<code>REQUIRED SUB-SKILL: use \</code>cmk:learn``

It renders garbled on GitHub and on the devkit site, which renders SKILL.md directly. This is the only file under skills/ containing \ + backtick. Fix with a double-backtick fence so the inner backticks are literal:

``REQUIRED SUB-SKILL: use `cmk:learn` ``

Questions

Is the cmk:sync change meant to be in this PR? The title and all three Summary bullets say "add cmk:write-cmk-skill", with no mention that cmk:sync gained a mandatory workflow step and a version bump. If it is intentional, please add it to the description and the test plan — it changes behavior in a skill already vendored into consumer repos, and a reviewer going by the description would miss it. If it was folded in incidentally, splitting 2dc9069 into its own PR would keep the two risk profiles separate.

Should contribute-mode step 3 handle the skill not being installed? It assumes write-cmk-skill is present. A repo that vendored before this PR, or that vendors selectively, won't have it, and the only escape hatch offered is "the user already completed that pass."


Not blocking, and pre-existing:skills/enclave/ has no docs/ai/skills/enclave.md and is absent from the docs README roster — which is why that file's family counts were already off by one before this change.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jayden-dang@harrymove-ctrl
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: add cmk:write-cmk-skill - #28

Open
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill
Open

feat: add cmk:write-cmk-skill#28
jayden-dang wants to merge 2 commits into
mainfrom
feat/write-cmk-skill

Conversation

@jayden-dang

Copy link
Copy Markdown
Contributor

Summary

  • Add cmk:write-cmk-skill (v1.0.0), ported from author-skills, as a user-invoked meta skill for creating/editing/reviewing cmk:* skills under a failing-baseline Iron Law.
  • Adapt packaging to kit conventions (references/, frontmatter order, 150-line budget, scripts/skill-lint.sh).
  • Update AI navigation docs, on-ramps, and CONTRIBUTING so contributors know when and how to use it.

Test plan

  • bash scripts/skill-lint.sh passes
  • Spot-check /write-cmk-skill discovery in the host agent slash menu after install/vendor
  • Confirm docs/ai/skills/write-cmk-skill.md links resolve from docs/ai/skills/README.md

Port author-skills into the kit as a user-invoked meta skill for
test-driven cmk skill authoring, and wire it into AI docs, on-ramps,
and CONTRIBUTING.
@jayden-dang
jayden-dang requested review from daniellam258 and harrymove-ctrl and removed request for harrymove-ctrlSeptember 1, 2026 03:57
Name the user-invoked authoring skill before preparing upstream PRs for
generic amendments; skip for project adaptations that stay local.

@harrymove-ctrlharrymove-ctrl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Requesting changes. The content is strong and the docs work is thorough — README, conventions, the new doc page, and on-ramps all landed correctly. The cmk:sync hand-off is also written exactly right ("name/write-cmk-skill for the user to run… Do not invoke it"), which is the trap I'd have expected a commit like that to fall into. Credit where due.

Four things should be resolved before merge, plus two questions.

skill-lint is green, but it only checks frontmatter shape, the line budget, reference integrity, citations, paths, and JSON validity. None of the findings below are things it can catch.


1. The skill ships in violation of its own Iron Law — twice

NO NEW SKILL AND NO EDIT TO A SKILL SHIPS WITHOUT A FAILING TEST FIRST

For the new skill. The ship checklist requires "The RED/GREEN evidence for this edit is recorded in the skill's TESTS.md", and the description advertises TESTS.md as part of the deliverable — but the package has none. cmk:interpret, the closest analog (user-invoked, disable-model-invocation, ships an eval.json), landed its TESTS.md in the same commit that added it (0d7b298).

The tell is in the fixtures. Both entries here are derived_from: "SKILL.md § …" — assertions restated from the text that was just written. Interpret's are derived_from: "TESTS.md § S1 …", i.e. observed baseline failures. That is precisely the gap the skill itself names:

Wrote the text before running the baseline? You documented what you guess agents do wrong, not what they do wrong.

For the cmk:sync edit. The law covers edits, and the rationalization table has a row for exactly this: "'It's a tiny edit' → Edits regress skills exactly like code. Baseline against the old version first."2dc9069 adds a mandatory gate step to contribute mode with no baseline. skills/sync/ has no TESTS.md, and its eval.json (4 fixtures) wasn't touched — contribute mode has zero coverage before or after this PR.

Ask: run the RED/GREEN/REFACTOR loop on a named model roster into skills/write-cmk-skill/TESTS.md; re-derive eval.json from it; add a contribute-gate fixture to skills/sync/eval.json; and add - Pressure-test record: skills/write-cmk-skill/TESTS.md to the ## Where list in docs/ai/skills/write-cmk-skill.md (cf. interpret.md:25).

2. Slash-command form — now load-bearing, and still unverified

/write-cmk-skill (no prefix) appears in 6 files, including inside a model-invocable skill's workflow at skills/sync/SKILL.md:55 and its reference file.

README.md:17 documents the form as /cmk:requirements, and conventions.md says name is "used as the slash command". Under the plugin layout the namespace is supplied by the plugin itself (plugin:skill — e.g. hookify:writing-rules, whose frontmatter name carries no prefix), so the command comes out prefixed either way. I can't find an install path that yields the bare form:

Install pathResulting command
Plugin, as-is (ai-devkit + name: cmk:write-cmk-skill)ai-devkit:cmk:write-cmk-skill — two colons, likely malformed
Plugin, with the cmk plugin name/cmk:write-cmk-skill
Vendored (.agents/skills/cmk-<name>/)/cmk-write-cmk-skill

If it is in fact prefixed, an agent running cmk:sync contribute mode will instruct the user to type a command that does not exist. The test plan already flags this as unchecked — worth settling before merge rather than after, since it is now baked into shipped skill text on a required path, not just docs.

Related, for whoever picks up the drop-the-prefix / marketplace change: this PR adds one more skill with cmk: hardcoded into name:, plus 6 new /write-cmk-skill references, all of which that refactor will have to revisit.

3. Site registry not updated — lib/skill-types.ts

Precedent: 0d7b298 touched both lib/skills.ts and lib/skill-types.ts.

Skills are filesystem-discovered (lib/skills.ts:29), so this one will render — degraded. CATEGORY_MAP has no entry, so it falls to "other". SKILL_PURPOSE has no entry, so skillPurpose() falls back to the first quoted trigger phrase — and this description contains no quoted phrases, so it returns "", giving a blank purpose line on the catalog card and the graph node. Neither build nor skill-lint catches it.

// CATEGORY_LABELSmeta: "Meta",// CATEGORY_MAP"write-cmk-skill": "meta",// SKILL_PURPOSE"write-cmk-skill": "Author or review a cmk skill",

(Minor: the doc comment above SKILL_PURPOSE says "across 34 skills" — now 35.)

4. Broken markdown — SKILL.md:51 and SKILL.md:85

Backslash-escaped backticks inside a code span. CommonMark does not process escapes there. Verified through GitHub's own markdown API:

<code>REQUIRED SUB-SKILL: use \</code>cmk:learn``

It renders garbled on GitHub and on the devkit site, which renders SKILL.md directly. This is the only file under skills/ containing \ + backtick. Fix with a double-backtick fence so the inner backticks are literal:

``REQUIRED SUB-SKILL: use `cmk:learn` ``

Questions

Is the cmk:sync change meant to be in this PR? The title and all three Summary bullets say "add cmk:write-cmk-skill", with no mention that cmk:sync gained a mandatory workflow step and a version bump. If it is intentional, please add it to the description and the test plan — it changes behavior in a skill already vendored into consumer repos, and a reviewer going by the description would miss it. If it was folded in incidentally, splitting 2dc9069 into its own PR would keep the two risk profiles separate.

Should contribute-mode step 3 handle the skill not being installed? It assumes write-cmk-skill is present. A repo that vendored before this PR, or that vendors selectively, won't have it, and the only escape hatch offered is "the user already completed that pass."


Not blocking, and pre-existing:skills/enclave/ has no docs/ai/skills/enclave.md and is absent from the docs README roster — which is why that file's family counts were already off by one before this change.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jayden-dang@harrymove-ctrl