write-skills 0.1.0 → 0.2.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/docs/EVALS.md +15 -5
- package/package.json +1 -1
- package/skills/write-comments/evals/evals.json +29 -0
- package/skills/write-commit/SKILL.md +13 -27
- package/skills/write-compact/evals/evals.json +40 -0
- package/skills/write-core/evals/evals.json +40 -0
- package/skills/write-docs/SKILL.md +7 -0
- package/skills/write-docs/evals/evals.json +42 -0
- package/skills/write-jira/SKILL.md +8 -0
- package/skills/write-longform/evals/evals.json +28 -0
package/docs/EVALS.md
CHANGED
|
@@ -6,16 +6,26 @@ Date: 24 October 2026. Method: one eval case per skill, run twice in fresh agent
|
|
|
6
6
|
|
|
7
7
|
| Skill | Case | Control run | Skilled run | Verdict |
|
|
8
8
|
|---|---|---|---|---|
|
|
9
|
-
| write-commit | 1, simple fix | Correct subject, correct format | Same subject, code block as specified | No separation. The case is too easy for the base model.
|
|
9
|
+
| write-commit | 1, simple fix | Correct subject, correct format | Same subject, code block as specified | No separation. The case is too easy for the base model. |
|
|
10
|
+
| write-commit | 2, breaking change | Correct subject with "!", body, migration date, ticket, BREAKING CHANGE footer | Same structure, dash bullets, migration step | No separation. The base model knows the breaking-change convention. |
|
|
11
|
+
| write-commit | 3, repo with its own convention | Followed the observed "Area: change" style | Same style, matched the history wording | No separation. Both arms respected the given convention. |
|
|
10
12
|
| write-pr | 1, rate limit change | Improvised sections, invented a justification the input never gave | Exact template: summary with sketch, evidence before and after, door type, blast radius | Clear pass for the skill. |
|
|
11
13
|
| write-jira | 1, attachments plan | Sliced by layer, bare points, no blocking edges | Vertical slices, outcome epic, blocking edges, points with reason lines | Clear pass for the skill. |
|
|
14
|
+
| all blocks | Trigger routing, 8 tasks, 2 samples | 16 of 16 correct, no variance | same | Discovery works from the descriptions alone. |
|
|
15
|
+
| write-commit | Live repo with its own convention | Ignored the observed convention, narrated implementation detail | Read the history, matched it: "Queue: add RetryQueue class" | Clear pass for the process rules. The format spec was pruned in 0.2.0. |
|
|
16
|
+
| write-jira | 3, vague plan, first run | Invented precise targets from nothing | Also invented targets | No separation. Both arms failed the intent. |
|
|
17
|
+
| write-jira | 3, vague plan, after the thin-plan rule | not rerun | Refused to slice, named the missing facts, asked, offered an assumption-marked draft | Fixed and validated. The rule was added in 0.2.0. |
|
|
18
|
+
| write-compact | 1, explain again | Rebuilt well, missed two terms, no next step | Named the break, defined all five terms, ended with a next step | Partial pass for the skill. |
|
|
19
|
+
| write-docs | 1, revise a paragraph | Good revision, warning after the action | Good revision, explicit warning before the action | Thin separation. Both improved the text. |
|
|
20
|
+
| write-comments | 1, comment a function | Acceptable, one restated line | Constraint at the decision line, no restatement | Thin separation. |
|
|
12
21
|
|
|
13
22
|
## Reading
|
|
14
23
|
|
|
15
|
-
-
|
|
16
|
-
- The
|
|
17
|
-
-
|
|
18
|
-
-
|
|
24
|
+
- Every block now carries eval cases in its `evals/` folder. Cases for write-core and write-longform are written but not run.
|
|
25
|
+
- The PR, Jira, and commit blocks change behavior in the intended direction. The commit value sits in the process rules, proven by the live-repo test: read the history first, let the repo convention win.
|
|
26
|
+
- The compact block earns a partial pass. The docs and comments blocks show thin separation on one case each. The base model is already close, and the skill adds placement and ordering discipline.
|
|
27
|
+
- Trigger routing is clean: 16 of 16 in two samples. This test shows the descriptions as written to a host. A real host injects them differently, so in-host firing stays unverified.
|
|
28
|
+
- The vague-plan case exposed a real gap, fixed the same day. The thin-plan rule now stops slicing before the facts arrive, and the rerun proved it.
|
|
19
29
|
|
|
20
30
|
## Run more
|
|
21
31
|
|
package/package.json
CHANGED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "write-comments",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Add code comments to this function. Context: byte 0 is the protocol version; version 2 is the only one the gateway still accepts; versions 0 and 1 were removed in 2025. Code: function parseHeader(buf) { const version = buf.readUInt8(0); if (version !== 2) throw new Error('unsupported'); return { version }; }",
|
|
7
|
+
"expected_output": "Comments state the constraint and the trap: only version 2 accepted, older versions removed. No comment restates the code.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"States the version 2 constraint",
|
|
10
|
+
"Names the removal fact or date",
|
|
11
|
+
"No restatement of the code",
|
|
12
|
+
"Comment sits next to the line it explains"
|
|
13
|
+
],
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"prompt": "Review these comments and delete or fix the bad ones: '// increment i by one' above i++; '// TODO: fix this' above a date parser; '// returns the result' above a return statement; '// The API allows 10 calls per second. See ticket 812.' above a retry delay.",
|
|
19
|
+
"expected_output": "Restatements deleted. The bare TODO gets a reason or goes. The API constraint comment stays.",
|
|
20
|
+
"assertions": [
|
|
21
|
+
"Restatements removed",
|
|
22
|
+
"Bare TODO flagged or replaced with a reason",
|
|
23
|
+
"Constraint comment kept",
|
|
24
|
+
"No new narration added"
|
|
25
|
+
],
|
|
26
|
+
"files": []
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
|
@@ -7,37 +7,27 @@ description: >
|
|
|
7
7
|
|
|
8
8
|
# Write commit
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
The message gives the intent. The diff already shows the what.
|
|
11
11
|
|
|
12
12
|
## Read first
|
|
13
13
|
|
|
14
|
-
1. Read the staged diff.
|
|
15
|
-
2. Read the history with `git log --oneline -15`.
|
|
16
|
-
3. Read the contribution guide when the repo has one. It wins
|
|
14
|
+
1. Read the staged diff. The message describes the staged change, not the plan.
|
|
15
|
+
2. Read the history with `git log --oneline -15`. The history sets the format: the type words, the scope style, the capitalization, the length.
|
|
16
|
+
3. Read the contribution guide when the repo has one. It wins over the history.
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
The repo convention wins over any default. When the history writes "Area: change", write "Area: change". When the history writes Conventional Commits, write Conventional Commits.
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
- Types: `feat`, `fix`, `refactor`, `perf`, `docs`, `test`, `chore`, `build`, `ci`, `style`, `revert`.
|
|
22
|
-
- Imperative mood: "add", not "added" or "adds".
|
|
23
|
-
- Fifty characters or fewer when possible. Seventy-two is the hard cap. No trailing period.
|
|
20
|
+
## Write
|
|
24
21
|
|
|
25
|
-
|
|
22
|
+
- One subject line, imperative, the real change. Keep to the length the history uses.
|
|
23
|
+
- Add a body only for what the diff cannot show: a why, a migration path, a linked ticket.
|
|
24
|
+
- A breaking change, a security fix, a data migration, and a revert always get a body.
|
|
25
|
+
- Keep file narration out. The diff lists files.
|
|
26
|
+
- No tool attribution, unless a repo rule requires a trailer.
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
1. A why the diff cannot show.
|
|
30
|
-
2. A breaking change and its migration path.
|
|
31
|
-
3. A linked issue or a follow-up.
|
|
32
|
-
|
|
33
|
-
Always add a body for a breaking change, a security fix, a data migration, and a revert. Future debuggers need the context. Wrap the body at 72 characters. Use dash bullets.
|
|
34
|
-
|
|
35
|
-
## Never
|
|
28
|
+
## Output
|
|
36
29
|
|
|
37
|
-
|
|
38
|
-
- No "I", "we", "now", "this commit".
|
|
39
|
-
- No tool attribution, unless a repo rule requires a trailer. Then add it as a trailer.
|
|
40
|
-
- No emoji, unless the repo history uses them.
|
|
30
|
+
Give one code block, ready to paste. This block writes text only. It never stages, commits, or amends.
|
|
41
31
|
|
|
42
32
|
## Example
|
|
43
33
|
|
|
@@ -50,10 +40,6 @@ passed as valid. Compare timestamps as numbers instead.
|
|
|
50
40
|
Closes #412
|
|
51
41
|
```
|
|
52
42
|
|
|
53
|
-
## Output
|
|
54
|
-
|
|
55
|
-
Give one code block, ready to paste. This block writes text only. It never stages, commits, or amends.
|
|
56
|
-
|
|
57
43
|
## Output language
|
|
58
44
|
|
|
59
45
|
Write prose in ASD-STE100 Simplified Technical English. The rules live in `references/ste.md`.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "write-compact",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Your previous reply was: 'The decorator wraps the handler so the middleware chain stays pure and the retry policy stays composable.' The user answers: 'wait, what? I don't follow.' Rebuild the explanation.",
|
|
7
|
+
"expected_output": "Explain-again mode: finds where the read broke, defines the failed terms, rebuilds with the missing context, ends with the next step. Not a shorter repetition of the same words.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Defines the terms that failed: decorator, middleware chain",
|
|
10
|
+
"Adds the context the reader lacked",
|
|
11
|
+
"Uses plain constructions and short sentences",
|
|
12
|
+
"Ends with one next step"
|
|
13
|
+
],
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"prompt": "User says: 'be brief from now on'. Then asks: 'does the migration in PR 41 drop the old column, and is it reversible?'",
|
|
19
|
+
"expected_output": "Brief mode: answer first, facts exact, no ceremony, full sentences because the answer covers an irreversible action and order matters.",
|
|
20
|
+
"assertions": [
|
|
21
|
+
"Answer first",
|
|
22
|
+
"No greeting, recap, or closing line",
|
|
23
|
+
"Facts and names exact",
|
|
24
|
+
"Full sentences where order or safety matters"
|
|
25
|
+
],
|
|
26
|
+
"files": []
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": 3,
|
|
30
|
+
"prompt": "Brief mode is on. The user asks for the exact error line from a log that contains: TypeError: Cannot read properties of undefined (reading 'id') at updateCart (cart.ts:88) plus 40 lines of stack.",
|
|
31
|
+
"expected_output": "One decisive error line quoted exact with file and line, no stack dump, one next step.",
|
|
32
|
+
"assertions": [
|
|
33
|
+
"Shortest decisive error line quoted exact",
|
|
34
|
+
"No stack dump",
|
|
35
|
+
"One next step"
|
|
36
|
+
],
|
|
37
|
+
"files": []
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "write-core",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Explain to a new team member why the build failed: the CI log says 'error TS2322: Type string is not assignable to type number at src/cart.ts line 41'. They have never used TypeScript.",
|
|
7
|
+
"expected_output": "Level 1 reply: defines type checking and the error in plain words, gives the fix, one example. No jargon without expansion. Short sentences, active voice.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Defines the terms a newcomer lacks",
|
|
10
|
+
"States the fix and the file location",
|
|
11
|
+
"Sentences short and active",
|
|
12
|
+
"No AI patterns"
|
|
13
|
+
],
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"prompt": "Status update for the channel, level 2, depth 3: the flaky login test was fixed by waiting for the session cookie instead of a fixed sleep. Test run went from 14 failures this week to 0.",
|
|
19
|
+
"assertions": [
|
|
20
|
+
"Answer first, then reason, then next step",
|
|
21
|
+
"Exact numbers kept: 14, 0",
|
|
22
|
+
"Real symbol and command names",
|
|
23
|
+
"Report held to a few lines"
|
|
24
|
+
],
|
|
25
|
+
"files": []
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": 3,
|
|
29
|
+
"prompt": "Rewrite this reply so it carries no AI patterns: 'In order to boost your productivity, this robust tool leverages cutting-edge caching to deliver a seamless experience that will help you delve into your data like never before.'",
|
|
30
|
+
"expected_output": "Every banned word and filler removed. The rewrite names what the tool does in plain words.",
|
|
31
|
+
"assertions": [
|
|
32
|
+
"No banned vocabulary remains",
|
|
33
|
+
"No 'in order to', no 'leverage', no 'seamless'",
|
|
34
|
+
"Names a mechanism or number",
|
|
35
|
+
"Meaning kept"
|
|
36
|
+
],
|
|
37
|
+
"files": []
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -41,6 +41,13 @@ Jobs stay separate. Split the page and link, rather than mixing.
|
|
|
41
41
|
11. One thing carries one name across the whole document.
|
|
42
42
|
12. Name the real symbols, paths, flags, and commands. The codebase supplies the words.
|
|
43
43
|
|
|
44
|
+
## Revise an existing document
|
|
45
|
+
|
|
46
|
+
1. Read the whole page once before you change a line.
|
|
47
|
+
2. Settle the job of the page. Check every section against that job.
|
|
48
|
+
3. Repair the sentences that break the rules. Leave the sentences that hold.
|
|
49
|
+
4. Do not reword text that did not change. A rewrite of untouched text costs the reviewer time.
|
|
50
|
+
|
|
44
51
|
## Rhythm
|
|
45
52
|
|
|
46
53
|
A page can pass every rule and still read like a machine wrote it.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "write-docs",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Revise this README paragraph: 'Configuration of the exporter is performed via exporter.json. Note that it's important to remember that running with --reset should only be done when you want to forget all state, as data loss may occur if misused.'",
|
|
7
|
+
"expected_output": "The revision names the real actor and file, puts the condition before the action, cuts the filler, and keeps every fact. Untouched meaning stays in place.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Real symbol and flag names kept",
|
|
10
|
+
"Warning placed before the action",
|
|
11
|
+
"Filler deleted: 'note that', 'it's important to remember'",
|
|
12
|
+
"Active voice, actor named",
|
|
13
|
+
"No facts lost"
|
|
14
|
+
],
|
|
15
|
+
"files": []
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": 2,
|
|
19
|
+
"prompt": "Plan a short doc page that teaches a newcomer to run their first import with our CLI tool. Choose the document job and outline the page.",
|
|
20
|
+
"expected_output": "Tutorial job chosen: build-a-thing framing, every step shows a visible result, written as commands. No reference tables or argument sections mixed in.",
|
|
21
|
+
"assertions": [
|
|
22
|
+
"Chooses tutorial and says why",
|
|
23
|
+
"Opens with what the learner ends with",
|
|
24
|
+
"Steps produce visible results",
|
|
25
|
+
"No mixed modes"
|
|
26
|
+
],
|
|
27
|
+
"files": []
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": 3,
|
|
31
|
+
"prompt": "Write the structure for an agent instruction file that a coding agent reads on every run: how to run tests, what never to commit, and where the domain glossary lives.",
|
|
32
|
+
"expected_output": "Agent mode: stable headings, steps with checkable end conditions, facts the environment does not show, one meaning in one place.",
|
|
33
|
+
"assertions": [
|
|
34
|
+
"Stable headings per topic",
|
|
35
|
+
"Steps end on checkable conditions",
|
|
36
|
+
"Points at the glossary location",
|
|
37
|
+
"No restated rules"
|
|
38
|
+
],
|
|
39
|
+
"files": []
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
@@ -15,6 +15,14 @@ Turn a plan into tickets an engineer can pick up without a meeting. Each story c
|
|
|
15
15
|
2. Read the code area when access exists. Use the domain words of the codebase.
|
|
16
16
|
3. List the slices before you write the tickets. Confirm the list with the user.
|
|
17
17
|
|
|
18
|
+
## When the plan is thin
|
|
19
|
+
|
|
20
|
+
A plan without a goal, a number, or a constraint is not a plan yet. Do not slice it.
|
|
21
|
+
|
|
22
|
+
1. Name what is missing: the user-visible goal, the current numbers, the constraints.
|
|
23
|
+
2. Ask for those facts before you draft. A story with invented targets tests nothing.
|
|
24
|
+
3. When the user wants a draft anyway, mark every invented target as an assumption. Carry every unknown into the points reason.
|
|
25
|
+
|
|
18
26
|
## Slice rules
|
|
19
27
|
|
|
20
28
|
1. One story is one complete path through the stack: data, API, interface, tests.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill_name": "write-longform",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Start a staged mission on the topic: why our team moved from REST to gRPC. I have a notes file with fragments at notes.md.",
|
|
7
|
+
"expected_output": "Stage 0 first: a shared brief with topic, reader, sources, output path, and done condition, confirmed with the user. Then the explore interview begins. No article text yet.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Writes the brief before any material moves",
|
|
10
|
+
"Asks for confirmation of the brief",
|
|
11
|
+
"Begins the interview or fragment mining",
|
|
12
|
+
"Produces no article prose yet"
|
|
13
|
+
],
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"prompt": "In exploit stage, shape mode, the article so far grounded 'streaming' and 'deadline'. The next planned block uses 'backpressure' without grounding it.",
|
|
19
|
+
"expected_output": "The skill refuses the ungrounded move: it names the gap, grounds backpressure first or moves it earlier, then continues.",
|
|
20
|
+
"assertions": [
|
|
21
|
+
"Names the ungrounded concept",
|
|
22
|
+
"Grounds it before the block leans on it",
|
|
23
|
+
"Keeps the running grounded list"
|
|
24
|
+
],
|
|
25
|
+
"files": []
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|