@wrongstack/core 0.308.0 → 0.308.2

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.
Files changed (61) hide show
  1. package/dist/coordination/agents/index.js +4 -4
  2. package/dist/coordination/index.d.ts +1 -0
  3. package/dist/coordination/index.js +113 -15
  4. package/dist/coordination/task-boundary.d.ts +64 -0
  5. package/dist/core/index.js +1 -1
  6. package/dist/defaults/index.js +116 -19
  7. package/dist/execution/index.js +11 -8
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.js +127 -20
  10. package/dist/infrastructure/index.js +1 -1
  11. package/dist/storage/index.js +2 -1
  12. package/dist/tools/index.js +4 -4
  13. package/dist/types/config/ui.d.ts +1 -1
  14. package/dist/types/context-window.d.ts +18 -1
  15. package/dist/types/index.d.ts +1 -1
  16. package/dist/types/index.js +11 -4
  17. package/dist/types/runtime-capability-manifest.d.ts +1 -1
  18. package/instructions/agents/backend.md +3 -0
  19. package/instructions/agents/bug-hunter.md +3 -0
  20. package/instructions/agents/code-reviewer.md +1 -0
  21. package/instructions/agents/frontend.md +2 -0
  22. package/instructions/agents/test.md +2 -0
  23. package/instructions/coordination/director-preamble.md +9 -1
  24. package/instructions/coordination/subagent-baseline.md +4 -0
  25. package/instructions/modes/code-reviewer.md +1 -1
  26. package/instructions/modes/debugger.md +2 -2
  27. package/instructions/modes/refactorer.md +2 -2
  28. package/instructions/modes/tester.md +2 -2
  29. package/instructions/system-lite.md +37 -33
  30. package/instructions/system-pro.md +23 -7
  31. package/instructions/system.md +33 -11
  32. package/package.json +6 -4
  33. package/skills/api-design/SKILL.md +26 -1
  34. package/skills/audit-log/SKILL.md +22 -1
  35. package/skills/auto-review/SKILL.md +21 -1
  36. package/skills/bug-hunter/SKILL.md +8 -0
  37. package/skills/chimera/SKILL.md +9 -0
  38. package/skills/data-governance/SKILL.md +25 -1
  39. package/skills/design-system/SKILL.md +19 -1
  40. package/skills/docker-deploy/SKILL.md +26 -1
  41. package/skills/git-flow/SKILL.md +26 -1
  42. package/skills/mailbox-bridge/SKILL.md +25 -1
  43. package/skills/mnemosyne/SKILL.md +25 -2
  44. package/skills/multi-agent/SKILL.md +12 -0
  45. package/skills/node-modern/SKILL.md +28 -1
  46. package/skills/observability/SKILL.md +25 -1
  47. package/skills/output-standards/SKILL.md +28 -1
  48. package/skills/plugin-author/SKILL.md +31 -1
  49. package/skills/prompt-engineering/SKILL.md +27 -1
  50. package/skills/react-modern/SKILL.md +29 -1
  51. package/skills/refactor-planner/SKILL.md +10 -0
  52. package/skills/research-web/SKILL.md +28 -1
  53. package/skills/sdd/SKILL.md +18 -0
  54. package/skills/security-scanner/SKILL.md +25 -1
  55. package/skills/skill-creator/SKILL.md +25 -1
  56. package/skills/tech-stack/SKILL.md +25 -1
  57. package/skills/testing/SKILL.md +25 -1
  58. package/skills/typescript-strict/SKILL.md +30 -1
  59. package/skills/wrongstack-kanban/SKILL.md +24 -0
  60. package/skills/wrongstack-mailbox/SKILL.md +29 -1
  61. package/skills/wrongstack-mailbox-mcp/SKILL.md +30 -3
@@ -5,7 +5,7 @@ description: |
5
5
  with Docker. Triggers: user says "docker", "container", "dockerfile",
6
6
  "image", "docker-compose", "deploy", "containerize", "registry",
7
7
  "multi-stage", "distroless".
8
- version: 1.0.0
8
+ version: 1.1.0
9
9
  required-capabilities: [filesystem.read, filesystem.write, execution.shell]
10
10
  required-tools: []
11
11
  ---
@@ -149,6 +149,31 @@ trivy image --exit-code 1 --ignore-unfixed --severity HIGH,CRITICAL wrongstack:$
149
149
  - **Session storage**: Sessions are stored at `WRONGSTACK_SESSION_ROOT` — mount a volume for persistence.
150
150
  - **Config**: Config is at `WRONGSTACK_CONFIG_DIR` — mount for config persistence across restarts.
151
151
 
152
+ ## Out of scope
153
+
154
+ - **Don't run as root in the container.** A non-root user is mandatory. A container compromise that lands root on the host is the failure this rule exists to prevent.
155
+ - **Don't use `node:latest` or unversioned base images.** Pin to `node:22-alpine` (or current). Reproducibility starts at the base.
156
+ - **Don't bake secrets into the image.** Pass via environment variables at runtime. A `RUN echo $API_KEY > /app/config.key` is a permanent secret in the image layer.
157
+ - **Don't skip the `.dockerignore`.** Without it, `node_modules`, `dist`, `.git`, and `*.test.ts` end up in the image — bigger, slower, more attack surface.
158
+ - **Don't tag production images `latest`.** Tag with the git SHA. `latest` is a moving target; production needs a specific commit.
159
+ - **Don't ship without a `HEALTHCHECK`.** Orchestrators need a probe; an image without one can't be load-balanced cleanly.
160
+ - **Don't skip image scanning.** `trivy image` or `docker scout` before push. Critical vulnerabilities are blocking.
161
+ - **Don't mix build and runtime stages.** Multi-stage is the rule: build with dev deps, runtime with production deps only. A 1GB image is a build hygiene failure.
162
+ - **Don't deploy without persistent volume mounts.** Sessions at `WRONGSTACK_SESSION_ROOT` and config at `WRONGSTACK_CONFIG_DIR` need volumes; container restarts lose data otherwise.
163
+
164
+ ## Before returning
165
+
166
+ - [ ] Multi-stage build; runtime stage is production-deps only
167
+ - [ ] Base image pinned to a specific tag (`node:22-alpine`, not `latest`)
168
+ - [ ] Non-root user; `USER wrongstack` set before `ENTRYPOINT`
169
+ - [ ] Secrets via env at runtime, not baked into the image
170
+ - [ ] `.dockerignore` excludes `node_modules`, `dist`, `.git`, `*.test.ts`
171
+ - [ ] Image tagged with git SHA, not `latest`
172
+ - [ ] `HEALTHCHECK` directive points to the CLI's self-check command
173
+ - [ ] `trivy image` or `docker scout` run before push; critical vulns blocked
174
+ - [ ] Volumes mounted for `WRONGSTACK_SESSION_ROOT` and `WRONGSTACK_CONFIG_DIR`
175
+ - [ ] Build runs from repo root with `pnpm build` before `docker build` (workspace order)
176
+
152
177
  ## Skills in scope
153
178
 
154
179
  - `security-scanner` — for scanning Dockerfiles and container configs for vulnerabilities
@@ -4,7 +4,7 @@ description: |
4
4
  Use this skill when proposing, reviewing, or troubleshooting git commits,
5
5
  branches, pull requests, or merge strategies in a WrongStack project session.
6
6
  Triggers: user mentions "commit", "branch", "PR", "merge", "rebase", "stash", "diff".
7
- version: 1.2.0
7
+ version: 1.3.0
8
8
  required-capabilities: [version-control.manage]
9
9
  required-tools: [test]
10
10
  ---
@@ -154,6 +154,31 @@ git rebase main && git merge --ff-only feature
154
154
  Open a PR at GitHub linking to issue #123 with the commit message describing the fix.
155
155
  ```
156
156
 
157
+ ## Out of scope
158
+
159
+ - **Don't force-push shared branches.** `--force-with-lease` on your own branch is the cap; shared branches get a PR + merge, never a force.
160
+ - **Don't commit lockfile changes with logic changes.** Separate commits, separate rollbacks. A lockfile muddied with a feature commit is impossible to bisect.
161
+ - **Don't make "Update stuff" mega-commits.** One concern per commit. 15 packages in one commit is process for process's sake.
162
+ - **Don't branch from branches.** Always branch from `main` or a stable release tag. Branching from a feature branch is git history debt.
163
+ - **Don't write a "what" commit message.** "fix: fixed bug" tells the reader nothing. Subject ≤ 72 chars, imperative mood, body explains why.
164
+ - **Don't `git reset --hard` with uncommitted work.** Stash first. A hard reset that loses work is the kind of incident a `git-flow` skill exists to prevent.
165
+ - **Don't amend a pushed commit.** It rewrites shared history. Open a follow-up commit or revert.
166
+ - **Don't leave WIP commits on `main`.** Use `git stash` or a feature branch, not a commit message like "WIP".
167
+ - **Don't skip self-review.** Self-review the diff before requesting review. Sending a diff the author hasn't read wastes the reviewer's time.
168
+
169
+ ## Before returning
170
+
171
+ - [ ] Branch is from `main` or a stable release tag, not from another feature branch
172
+ - [ ] One concern per commit; lockfile changes isolated
173
+ - [ ] Subject ≤ 72 chars, imperative, no trailing period; body explains why
174
+ - [ ] Issue reference included (`Fix #123` or `Closes GH-456`)
175
+ - [ ] Self-review done before requesting review
176
+ - [ ] No `git push --force` to shared branches; `--force-with-lease` only on own branch
177
+ - [ ] Branch deleted after merge (unless shared or releasing)
178
+ - [ ] PR title follows commit format; body links the issue and lists changed files
179
+ - [ ] No `WIP` or "Update stuff" commits in the history
180
+ - [ ] `<nextsteps>` mirrors the recommended commit/PR actions
181
+
157
182
  ## Skills in scope
158
183
 
159
184
  - `refactor-planner` — when a refactor involves multiple git-managed changes
@@ -8,7 +8,7 @@ description: |
8
8
  bridge". Starts a loopback HTTP façade over the same GlobalMailbox that
9
9
  WrongStack-internal agents already share, so any agent with curl or
10
10
  fetch can read, send, and acknowledge messages.
11
- version: 1.0.0
11
+ version: 1.1.0
12
12
  required-capabilities: [execution.shell]
13
13
  required-tools: []
14
14
  optional-capabilities: [web.research]
@@ -342,6 +342,30 @@ is 15 s.
342
342
  audit trails of which external agent called which route are needed,
343
343
  the agent itself should log them client-side.
344
344
 
345
+ ## Out of scope
346
+
347
+ - **Don't expose the bridge on `0.0.0.0` without a trusted reverse proxy.** Loopback binding makes "reach" require shell access on the host. LAN exposure without re-authentication and rate-limiting at the proxy is a trust leak.
348
+ - **Don't log the bearer token.** The structured `mailbox_serve_started` event includes bind URL, port, project dir, and token path — never the token itself. Logging it once is a permanent compromise.
349
+ - **Don't treat the bearer as identity-bound.** Every caller uses the same project token. The bridge does not separately authorize `steer`/control messages or prevent impersonation; the caller can claim any `from`, `type`, or `readerId`. Add an identity-aware trusted proxy before exposing beyond mutually trusted local clients.
350
+ - **Don't expose the filesystem, shell, or non-mailbox tools through the bridge.** It is the mailbox surface only. If a caller needs more, they need a different bridge.
351
+ - **Don't start the bridge for an external agent that already speaks MCP natively.** Use `wstack mcp serve` to expose WrongStack's full tool registry including the mailbox tool. Two bridges for the same purpose is operational debt.
352
+ - **Don't run as a long-lived daemon for the caller.** The bridge is short-lived; spawn it for the duration of the caller's session and let it exit. `mbWithBootstrap()` is the pattern.
353
+ - **Don't hardcode a token into prompts or committed code.** Read it from `.mailbox.token` or accept it from the environment; re-read after a 401.
354
+ - **Don't send `control` messages through the bridge.** Control is a runtime-only surface; the bridge doesn't expose it, and the only legitimate override is `steer` via the `mailbox_manage` route, not through the bridge.
355
+
356
+ ## Before returning
357
+
358
+ - [ ] `wstack mailbox serve` (or `mbWithBootstrap`) used; no parallel implementation
359
+ - [ ] Bind address is `127.0.0.1` unless behind a reverse proxy that re-authenticates
360
+ - [ ] Bearer token read from `.mailbox.token` or env, not hardcoded
361
+ - [ ] Token not present in any log line, event, or error message
362
+ - [ ] Body cap of 256 KB enforced; rate limit of 120/min/token enforced
363
+ - [ ] `/healthz` reachable; no auth or rate limit on the health probe
364
+ - [ ] Pair with `wrongstack-mailbox` skill for external-agent usage
365
+ - [ ] Graceful shutdown handles SIGINT/SIGTERM, flushes the cache, unlinks the token
366
+ - [ ] Mailbox health watchdog wired if running unattended
367
+ - [ ] No `control` messages; `steer` only via the canonical `mailbox_manage` route
368
+
345
369
  ## Skills in scope
346
370
 
347
371
  - `prompt-engineering` — for the external-facing `wrongstack-mailbox`
@@ -4,7 +4,7 @@ description: |
4
4
  Use when curating WrongStack SAGE memory: run deterministic hygiene and
5
5
  anchor verification first, then review contradictions, drift, and noise;
6
6
  file destructive outcomes as review proposals instead of deleting directly.
7
- version: 1.1.0
7
+ version: 1.2.0
8
8
  required-capabilities: [memory.manage, memory.curate]
9
9
  required-tools: [cron_cancel, cron_schedule, mail_send, mailbox, memory_candidates, memory_delete, memory_hygiene, memory_search, memory_update, memory_verify, skill]
10
10
  ---
@@ -102,7 +102,7 @@ memory_candidates({
102
102
  })
103
103
  ```
104
104
 
105
- Never call `memory_delete`, never set `status: "deleted"`, and never set
105
+ Never trigger `memory_delete`, never set `status: "deleted"`, and never set
106
106
  `status: "archived"` as part of an autonomous Mnemosyne cycle. The user owns
107
107
  the later `memory_candidates({ action: "resolve", ... })` decision.
108
108
 
@@ -149,6 +149,29 @@ tools are absent, run on demand instead.
149
149
  - Never advertise commands, config keys, background services, or tools that
150
150
  are not present in the live runtime.
151
151
 
152
+ ## Out of scope
153
+
154
+ - **Don't delete or archive memories autonomously.** `memory_delete` and `status: "deleted"` / `"archived"` are not part of an autonomous Mnemosyne cycle. File `memory_candidates` proposals and let the user resolve.
155
+ - **Don't re-author untouched memories to bump timestamps.** A memory that passes review stays as it is. Bumping timestamps corrupts recency signals and churns the store.
156
+ - **Don't skip the deterministic pass.** Hygiene, anchor verification, and supersede/stale marking are run before any LLM analysis. The LLM is a bounded second pass over deterministic results, not a replacement.
157
+ - **Don't infer absence from a missing search result.** A search miss is not proof a memory doesn't exist. Report what was searched; let deterministic checks carry the absence claim.
158
+ - **Don't claim a successful broadcast or scheduled cycle that didn't run.** If the mailbox or cron tools are absent, say so. Never invent a successful delivery or a scheduled job.
159
+ - **Don't describe cron as a persistent daemon.** Cron jobs belong to the live runtime; they must be inspected and cancelled through the cron tools. The skill is session-scoped.
160
+ - **Don't bypass store protections with `force`.** Permanent and high-importance memories receive extra scrutiny. Bypassing protections is a bug, not a feature.
161
+ - **Don't use it as a generic memory CRUD layer.** Mnemosyne is the curation workflow. Direct memory creation/update without going through the workflow is the wrong lane.
162
+
163
+ ## Before returning
164
+
165
+ - [ ] `memory_hygiene({ verify: true })` ran first; counts captured
166
+ - [ ] Non-zero `deleted` or `archived` counters treated as a bug and reported
167
+ - [ ] Bounded semantic review searched related memories, not whole store
168
+ - [ ] Direct updates only for non-terminal corrections (text, classification, confidence, `stale`, supersede/contradict links)
169
+ - [ ] Deletion or archival recommendations filed as `memory_candidates` proposals, not applied
170
+ - [ ] Every proposal includes a supported `reason`
171
+ - [ ] Report contains trigger, counts, safe corrections, proposals, errors
172
+ - [ ] Broadcast only when mailbox tools are registered and coordination is active
173
+ - [ ] No claim of scheduled cycle or broadcast that didn't actually run
174
+
152
175
  ## Skills in Scope
153
176
 
154
177
  - `auto-review` — bounded background-review and reporting patterns.
@@ -351,6 +351,18 @@ session that dies halfway — and they let you synthesize as you go.
351
351
 
352
352
  ---
353
353
 
354
+ ## Out of scope
355
+
356
+ - **Don't fan out a single atomic task.** One task is one agent. Subagent overhead exceeds the benefit below ~5 tool calls per subtask.
357
+ - **Don't fan out work that needs shared mutable state.** Subagents share nothing — no memory, no session state, no variable scope. If two subtasks would read or write the same thing, they don't fan out.
358
+ - **Don't fan out work with sequential dependencies.** Worker 2 needing worker 1's output means either chain it inside one agent, or use the fleet pattern with explicit hand-off. One-shot fan-out fails on dependencies.
359
+ - **Don't write briefs by reference.** "Audit the file we discussed" — the worker has no idea. Include exact scope, the specific question, definition of done, return format, and boundaries.
360
+ - **Don't dispatch workers one turn at a time.** Serialized fan-out throws away the only thing parallelism was for. Fire the whole batch in one turn.
361
+ - **Don't ignore `budget_exhausted`.** Partial results are still results. Re-split and retry; never silently absorb a failure into a clean-looking report.
362
+ - **Don't present partial coverage as complete.** A 7-of-10 fleet is a partial audit. Naming the missing three is the only way the user keeps trusting the report.
363
+ - **Don't pick a role that doesn't match the task.** A `bug-hunter` writing docs or a `refactor-planner` running a security audit produces confident output shaped by the wrong priorities — worse than no output.
364
+ - **Don't fan out "because the context is too big".** With 200K–1M windows, work that used to need splitting now fits. Fan out for wall-clock time and genuinely independent attention, not for size.
365
+
354
366
  ## Skills in scope
355
367
 
356
368
  - `bug-hunter` — parallel file audits
@@ -4,7 +4,7 @@ description: |
4
4
  Use this skill when writing, reviewing, or refactoring Node.js >= 22
5
5
  TypeScript code in WrongStack. Triggers: ESM imports, fetch usage, AbortSignal,
6
6
  node: protocol, Web Streams, or any async patterns.
7
- version: 1.1.0
7
+ version: 1.2.0
8
8
  required-capabilities: [filesystem.read, filesystem.write]
9
9
  required-tools: []
10
10
  optional-capabilities: [verification.run]
@@ -185,6 +185,33 @@ while (true) {
185
185
  }
186
186
  ```
187
187
 
188
+ ## Out of scope
189
+
190
+ - **Don't use `require()`.** ESM only. `import { x } from './y.js'` with the `.js` extension, even in TS source.
191
+ - **Don't use axios, node-fetch, or got.** Native fetch is sufficient. Third-party HTTP clients are an obsolete layer.
192
+ - **Don't call fetch without `AbortSignal.timeout()`**. Every long-running operation needs a timeout. A request that hangs forever is a CI failure waiting to happen.
193
+ - **Don't use `__dirname` directly in ESM.** ESM doesn't have it. `path.dirname(fileURLToPath(import.meta.url))` is the replacement.
194
+ - **Don't mix callback `fs` with `await`.** Callback APIs don't return promises. Use `fs.promises.*` for `await`able access.
195
+ - **Don't swallow `AbortError` silently.** An `AbortError` means a timeout or abort — it is signal, not success. Log it or handle it explicitly.
196
+ - **Don't trust `process.cwd()` blindly.** It may not match the user's cwd. Accept `cwd` as a parameter and default sensibly.
197
+ - **Don't use setTimeout for cancellable delays in new code.** `setTimeout(handler, ms, { signal })` (Node 22+) is the cancellable form.
198
+ - **Don't write non-atomic file updates.** Use the write-temp + rename pattern. A crash mid-write leaves the file in an indeterminate state otherwise.
199
+ - **Don't enable axios or got for "familiarity".** Node 22+ ships everything you need.
200
+
201
+ ## Before returning
202
+
203
+ - [ ] ESM only; no `require()`, no `module.exports`
204
+ - [ ] All relative imports use the `.js` extension
205
+ - [ ] Built-in modules imported via the `node:` protocol (`node:fs/promises`, `node:http`, `node:path`)
206
+ - [ ] fetch carries `AbortSignal.timeout()` for any operation that can wait
207
+ - [ ] `__dirname` replaced with `path.dirname(fileURLToPath(import.meta.url))`
208
+ - [ ] `fs.promises.*` for awaited file access; no callback `fs`
209
+ - [ ] `AbortError` caught and handled explicitly, not swallowed
210
+ - [ ] `cwd` accepted as parameter; `process.cwd()` is not a default
211
+ - [ ] File writes atomic: `writeFile(tmp)` + `rename(tmp, target)`
212
+ - [ ] `Promise.allSettled` for parallel tasks where partial failure is acceptable
213
+ - [ ] `<nextsteps>` mirrors any open follow-up (timeout wiring, ESM migration, abort handling)
214
+
188
215
  ## Skills in scope
189
216
 
190
217
  - `typescript-strict` — strict TypeScript patterns
@@ -5,7 +5,7 @@ description: |
5
5
  or when setting up observability for a new feature. Triggers: user says
6
6
  "log", "trace", "metrics", "observability", "instrument", "structured logging",
7
7
  "opentelemetry", "log level", "debug", "monitoring".
8
- version: 1.0.0
8
+ version: 1.1.0
9
9
  required-capabilities: [filesystem.read, filesystem.write]
10
10
  required-tools: []
11
11
  optional-capabilities: [code.inspect]
@@ -129,6 +129,30 @@ Every log should include:
129
129
  - **Redaction**: Use `redactKeys()` helper — never log `Authorization`, `token`, `apiKey`, `secret`.
130
130
  - **Tool tracing**: Each tool wrapper should emit a structured log on start and end.
131
131
 
132
+ ## Out of scope
133
+
134
+ - **Don't log secrets, tokens, or PII.** Redact at the boundary. A single `Authorization` header in a log line is a credential leak; redact `token`, `apiKey`, `secret`, `Authorization` keys before they reach the stream.
135
+ - **Don't use plain text logs.** JSON to stdout is the contract. `console.log('User logged in')` is unsearchable and breaks log aggregators.
136
+ - **Don't emit logs without a `traceId`.** Correlation across tools is the whole point. A log without a trace is an event with no story.
137
+ - **Don't use DEBUG level in production.** DEBUG is dev-only. Production logs are `INFO`, `WARN`, `ERROR`; DEBUG in prod is noise that hides real signals.
138
+ - **Don't log and ignore.** Every log entry should answer: what happened, what context, what was the outcome. A `console.log('done')` after a side effect is process for process's sake.
139
+ - **Don't write to file logs from app code.** CI captures stdout. File logs bypass the pipeline and become unsearchable tribal knowledge.
140
+ - **Don't skip trace spans on tool calls.** Every tool wrapper should open a span on start and end it on completion, with timing. Without spans, latency questions are unanswerable.
141
+ - **Don't conflate counters and gauges.** Counters increment (`tool.executions`); gauges track current state (`session.iterations`). Mixing them produces nonsense dashboards.
142
+ - **Don't include exception objects in span attributes.** `span.recordException(err)` is the OpenTelemetry path; serialization into a JSON log is its own discipline.
143
+
144
+ ## Before returning
145
+
146
+ - [ ] All logs are JSON to stdout, never plain text or file logs
147
+ - [ ] Every entry has `level`, `traceId`, `event`, `timestamp`, `outcome`
148
+ - [ ] No secrets, tokens, `Authorization`, `apiKey`, or PII in any log line
149
+ - [ ] DEBUG level only in dev; production uses `INFO` / `WARN` / `ERROR`
150
+ - [ ] Tool wrappers emit structured start + end events with `duration_ms`
151
+ - [ ] OpenTelemetry spans opened on tool entry, closed on exit with status
152
+ - [ ] Counters vs. gauges respected; histograms used for latency
153
+ - [ ] Redaction centralized at the serialization boundary, not per call site
154
+ - [ ] Log volume and pattern sanity-checked against `audit-log` skill's metrics
155
+
132
156
  ## Skills in scope
133
157
 
134
158
  - `audit-log` — for analyzing the logs this skill produces
@@ -4,7 +4,7 @@ description: |
4
4
  Use this skill when defining or enforcing output formatting standards for agent
5
5
  responses in WrongStack. Triggers: user says "next steps format", "output standard",
6
6
  "response format", "final message format", "standardize next steps".
7
- version: 1.0.0
7
+ version: 1.1.0
8
8
  required-capabilities: []
9
9
  required-tools: []
10
10
  ---
@@ -156,6 +156,33 @@ When a **subagent** completes its task, it MUST:
156
156
  - **Don't assign manual work to the user** — "manually check if X is correct yourself" is not a valid next prompt; when tools permit it, use an agent-directed prompt such as "Use the browser tools to verify X and fix any issue you find"
157
157
  - **Don't include `<nextsteps>` in subagent output** — subagents report findings, leaders produce next steps
158
158
 
159
+ ## Out of scope
160
+
161
+ - **Don't include `<nextsteps>` in subagent output.** Subagents report findings; the leader produces the unified tag. A subagent that emits `<nextsteps>` is stepping on the leader's lane.
162
+ - **Don't emit parseable-looking prose instead of the tag.** "Next steps:", "Suggested next:", "Let me know if you want..." all look like the tag to the parser and break the `/next` workflow.
163
+ - **Don't put human-only actions in `<nextsteps>`.** "Open DevTools yourself", "manually check the browser console" — those are informational, not agent prompts. They go outside the tag as plain text.
164
+ - **Don't put markdown inside the tag.** Plain text only, one item per line. `**bold**`, code spans, headings — all break the parser.
165
+ - **Don't use dashes or asterisks inside the tag.** Numbered items only: `1.`, `2.`, `3.`. Dash and asterisk bullets are wrong and silently fail the parser.
166
+ - **Don't put `auto="true"` on items 2+.** Only item 1 may carry the marker. The marker on later items is parsed-and-discarded.
167
+ - **Don't write vague prompts.** "Fix bugs" is not a prompt; "fix auth/session.ts:42 and add a regression test" is. The selected text is submitted verbatim — vague prompts are vague runs.
168
+ - **Don't exceed 5 items without reason.** If the list is over 5, it's probably not a single task. Split it or hand off.
169
+ - **Don't emit `<nextsteps>` while `ctx.todos` has open items.** The in-flight todo list isn't done; new prompt options race the todo loop. Finish the list first, re-arm the tag on the turn where the last todo flips to `completed`.
170
+ - **Don't address the user inside the tag.** Items are agent-directed prompt inputs. Imperative wording is valid when it tells the agent what to do.
171
+
172
+ ## Before returning
173
+
174
+ - [ ] Only the leader emits `<nextsteps>`; subagents return findings only
175
+ - [ ] Tag is well-formed: `<nextsteps>...</nextsteps>`, no attributes on the tags
176
+ - [ ] Plain text only inside the tag; no markdown, dashes, or asterisks
177
+ - [ ] Numbered items `1.`, `2.`, `3.`; one prompt per line
178
+ - [ ] At most one `auto="true"`, and only on item 1
179
+ - [ ] Items are agent-directed prompts, not human-only actions
180
+ - [ ] Items are specific enough to submit verbatim (file:line + concrete action)
181
+ - [ ] At most 5 items unless a single task genuinely requires more
182
+ - [ ] Tag omitted if `ctx.todos` still has pending or in_progress items
183
+ - [ ] Leader output synthesized from subagent findings, deduplicated and re-prioritized
184
+ - [ ] Human-only actions sit outside the tag as plain text, not inside it
185
+
159
186
  ## Skills in scope
160
187
 
161
188
  - `bug-hunter` — inherits output-standards for bug reports
@@ -7,7 +7,7 @@ description: |
7
7
  data, and the entry-point registration steps (package.json and index.ts).
8
8
  Triggers: user says "new plugin", "add a plugin", "plugin teardown", "plugin
9
9
  health", "register a tool", "PluginAPI extension".
10
- version: 1.0.0
10
+ version: 1.1.0
11
11
  required-capabilities: [filesystem.read, filesystem.write, execution.shell]
12
12
  required-tools: [bash, cron_cancel, cron_list, cron_schedule, edit, fetch, git, git_autocommit, json, read, search, secret_scanner_test, semver_bump, semver_changelog, semver_current, todo, watch_list, watch_start, watch_stop, write]
13
13
  optional-capabilities: [verification.run]
@@ -336,6 +336,36 @@ For the H1 pattern, extend `tests/plugin-teardown.test.ts` with a
336
336
  8. **Run verification**: `pnpm --filter @wrongstack/plugins test` + `pnpm --filter @wrongstack/plugins typecheck` + `pnpm --filter @wrongstack/plugins build`
337
337
  9. **Update `src/index.ts` doc comment** — bump the plugin count
338
338
 
339
+ ## Out of scope
340
+
341
+ - **Don't put state in the `setup()` closure.** State must live at module scope; the Plugin interface does not thread state from `setup()` to `teardown()`. Closure state leaks on reload.
342
+ - **Don't ship a plugin without `teardown()` and `health()`.** Even stateless plugins add both. The H1 audit pattern is the floor; `/diag plugins` exposes the gap.
343
+ - **Don't make `setup()` non-idempotent.** Calling `setup()` twice must leave a clean slate. Hot-reload must not accumulate state.
344
+ - **Don't delete on-disk state in `teardown()`.** File-based plugins leave the file in place. Only in-memory counters and resource handles (timers, watchers) are cleaned.
345
+ - **Don't collide with built-in tool names.** `read`, `write`, `bash`, `edit`, `fetch`, `search`, `json`, `todo`, `git` are reserved. Pick unique names; `api.tools.register()` enforces uniqueness.
346
+ - **Don't bump `apiVersion` for additive changes.** New optional fields on `PluginAPI` don't break the contract. Bump only when the surface breaks.
347
+ - **Don't read config from `config.plugins`.** Config options go under `config.extensions['<plugin-name>']`. The loader's `buildPluginOptions` merges both, but the convention is `extensions`.
348
+ - **Don't block `setup()` with async hydration.** Use `void (async () => { ... })()` for fire-and-forget. The first call should fall through to fallback if the async hasn't completed.
349
+ - **Don't skip the test files.** `tests/<name>.test.ts` (unit) and `tests/<name>-exec.test.ts` (integration) are required. Plugins without tests rot fast.
350
+ - **Don't lower-case-skip the model and config keys.** Case-insensitive lookup is the convention; `model.toLowerCase()` everywhere.
351
+
352
+ ## Before returning
353
+
354
+ - [ ] `name`, `version`, `apiVersion: '^0.1.x'` (current), description, capabilities set
355
+ - [ ] Module-scope state, never in `setup()` closure
356
+ - [ ] `setup()` idempotent: clears state before re-initializing
357
+ - [ ] `teardown()` releases every resource acquired in `setup()`, never deletes on-disk state
358
+ - [ ] `health()` returns `{ ok, message, invocationCount, lastRun? }`
359
+ - [ ] Tool names are unique `snake_case`; no collision with built-ins
360
+ - [ ] Config read from `api.config.extensions['<plugin-name>']`, validated by `configSchema`
361
+ - [ ] Hooks are registered via `api.registerHook(...)` with the correct event/matcher; `HookOutcome` shape honored
362
+ - [ ] `src/index.ts` re-exports the plugin; `package.json` adds the subpath export
363
+ - [ ] `packages/cli/src/wiring/plugins.ts` adds the built-in factory
364
+ - [ ] Tests: `<name>.test.ts` + `<name>-exec.test.ts` + `plugin-teardown.test.ts` block
365
+ - [ ] Verification: `pnpm --filter @wrongstack/plugins test && typecheck && build` all pass
366
+ - [ ] `src/index.ts` doc comment updated with the new plugin count
367
+ - [ ] `<nextsteps>` lists each open follow-up (config, hooks, tests, build)
368
+
339
369
  ## Skills in scope
340
370
 
341
371
  - `skill-creator` — for the SKILL.md format and frontmatter rules
@@ -4,7 +4,7 @@ description: |
4
4
  Use this skill when designing, critiquing, or fixing system prompts,
5
5
  tool descriptions, skill definitions, or LLM instruction text in WrongStack.
6
6
  Triggers: user mentions "prompt", "system instruction", "skill description", "tool hint", "usage hint", "system prompt".
7
- version: 1.1.0
7
+ version: 1.2.0
8
8
  required-capabilities: [filesystem.read, filesystem.write]
9
9
  required-tools: []
10
10
  ---
@@ -131,6 +131,32 @@ See `skill-creator` skill for the format. Key points:
131
131
  - Include concrete code examples in "Do" and "Don't" sections
132
132
  - End with "Skills in scope" so agents know to delegate
133
133
 
134
+ ## Out of scope
135
+
136
+ - **Don't ship filler in prompts.** "Please be helpful", "Sure, I'd be happy to", "You are a helpful AI" — every filler line costs tokens and adds no signal. Strip it.
137
+ - **Don't write vague trigger sentences.** "This skill is about Docker" matches nothing. "Use this skill when deploying Docker containers to a production cluster" matches.
138
+ - **Don't describe a tool by what it does alone.** Tool descriptions need when to use, key parameters, and what it returns. "Search files" is incomplete; "Search file contents with regex. Pattern is regex. Use output_mode to select…" is the bar.
139
+ - **Don't put volatile content before static content.** Cache-friendly prompts put identity, tools, and instructions first; session state and recent errors last. Reversing the order costs tokens per turn.
140
+ - **Don't write a long preamble before the question.** The model reads the preamble, then the question. Put the question first.
141
+ - **Don't use ambiguous pronouns.** "Do it again" — which tool, which file? Name the specific thing.
142
+ - **Don't claim trigger keywords cover a domain they don't.** Trigger keywords must be specific. Generic phrases like "improve" or "help with" match too much and the loader can't disambiguate.
143
+ - **Don't re-invent the agent's identity.** WrongStack's system prompt already establishes who the agent is. Don't repeat it; layer domain-specific instruction on top.
144
+ - **Don't design prompts the way you'd write a doc.** Prompts are instruction; docs are reference. Reference material goes in skill `references/`, not in the trigger-matching body.
145
+
146
+ ## Before returning
147
+
148
+ - [ ] No filler ("Please be helpful", "Sure, I'd be happy to", "You are a helpful AI")
149
+ - [ ] Skill description's first sentence is a concrete trigger; trigger keywords follow
150
+ - [ ] Tool descriptions cover when to use, key parameters, what it returns
151
+ - [ ] Static content first; volatile content last
152
+ - [ ] No long preamble before the actual question
153
+ - [ ] No ambiguous pronouns; specific things named
154
+ - [ ] Trigger keywords specific enough to disambiguate
155
+ - [ ] Skill body under ~500 lines; deep material in `references/`
156
+ - [ ] Concrete `Do` / `Don't` examples, not abstract principles
157
+ - [ ] `Skill in scope` lists the hand-off targets with a reason for each
158
+ - [ ] `<nextsteps>` mirrors open follow-up prompt-tuning tasks in priority order
159
+
134
160
  ## Skills in scope
135
161
 
136
162
  - `skill-creator` — for creating new skills (primary — prompt-engineering feeds into skill creation)
@@ -4,7 +4,7 @@ description: |
4
4
  Use this skill when writing or reviewing React 19+ code in WrongStack.
5
5
  Triggers: user mentions "React", "component", "useState", "useEffect",
6
6
  "Server Component", "Client Component", "Suspense", "useTransition", "use hook".
7
- version: 1.1.0
7
+ version: 1.2.0
8
8
  required-capabilities: [filesystem.read, filesystem.write]
9
9
  required-tools: []
10
10
  optional-capabilities: [verification.run]
@@ -207,6 +207,34 @@ const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => { ... };
207
207
  const inputRef = useRef<HTMLInputElement>(null);
208
208
  ```
209
209
 
210
+ ## Out of scope
211
+
212
+ - **Don't default to Client Components.** Server Components are the default in React 19+. Mark `'use client'` only for interactive code; the boundary carries a serialization cost.
213
+ - **Don't reach for `useEffect` when fetching data.** Use Server Components or `use(promise)`. The `useEffect` + fetch + `setState` dance is the pattern React 19 replaced.
214
+ - **Don't reach for `forwardRef` in new code.** `ref` is a regular prop in React 19. `forwardRef` is the old way; the new way is `function Button({ ref, ...props })`.
215
+ - **Don't use default exports for components.** Named exports only. Default exports hinder refactoring and tree-shaking; named exports are the convention.
216
+ - **Don't use class components in new code.** Function components + hooks. Class components are deprecated in modern React.
217
+ - **`useEffect` is the wrong tool for syncing props to state.** It causes an extra render and stale data. Lift state or use a controlled component.
218
+ - **`useMemo` is overkill for trivial calculations.** `useMemo(() => count * 2, [count])` is more expensive than the multiplication. Measure before memoizing.
219
+ - **Don't reach for `useCallback` when deps change every render.** `useCallback(fn, [obj])` where `obj` is fresh each render provides no stability. Reach for it only when child deps actually benefit.
220
+ - **Don't mix Server/Client boundaries carelessly.** Serialization errors at the boundary are some of the hardest to debug. Keep the boundary clean.
221
+ - **Don't call React's `use()` outside component render.** It's a render-only hook.
222
+
223
+ ## Before returning
224
+
225
+ - [ ] Server Components by default; `'use client'` only for interactive code
226
+ - [ ] No `useEffect` for data fetching; Server Components or `use(promise)` instead
227
+ - [ ] No `forwardRef` in new code; `ref` is a regular prop
228
+ - [ ] Named exports for components; no default exports
229
+ - [ ] No class components in new code; function components + hooks only
230
+ - [ ] Event handlers carry explicit types (`React.MouseEvent<HTMLButtonElement>`)
231
+ - [ ] `useState` for local state; `useReducer` for state machines
232
+ - [ ] `useTransition` for non-urgent updates; `useDeferredValue` for expensive search
233
+ - [ ] `useMemo` / `useCallback` only where profiling showed a need
234
+ - [ ] `useEffect` reserved for side effects (subscriptions, manual DOM, focus); not for derived state or data fetching
235
+ - [ ] Props interface explicit; no `any` or `Function`
236
+ - [ ] `<nextsteps>` mirrors any open follow-up (boundary cleanup, hook refactor, prop typing)
237
+
210
238
  ## Skills in scope
211
239
 
212
240
  - `typescript-strict` — for TypeScript patterns
@@ -306,6 +306,16 @@ parallelizes.
306
306
 
307
307
  ---
308
308
 
309
+ ## Out of scope
310
+
311
+ - **Don't start refactoring while planning.** A half-done refactor with no graph behind it is the failure this skill exists to prevent. Plan first, hand the plan to the executing agent phase by phase.
312
+ - **Don't write code or apply edits.** This skill produces a plan, not a diff. If the user wants the refactor done, the executing agent picks it up; this skill's deliverable is the phased plan.
313
+ - **Don't skip the dependency graph.** Ordering without a graph is guessing. Imports are the truth; build the graph from `import` statements, not from directory layout or someone's mental model.
314
+ - **Don't ignore cycles.** A cycle means no valid ordering. List cycles explicitly, schedule their breaking first. A plan over a cycle is fiction.
315
+ - **Don't refactor modules under 50% coverage blind.** Phase 1 of any such module is characterization tests, not the refactor itself. The safety argument is "behavior preserved" — without tests, there is no safety net.
316
+ - **Don't over-phase.** Tasks under 1h merge with related tasks. A 12-phase plan for a 3-day refactor is process for process's sake.
317
+ - **Don't write exit criteria that aren't checkable.** "Code is cleaner" is not an exit criterion. `pnpm test passes` is. If a phase has no checkable exit, it never formally ends.
318
+
309
319
  ## Skills in scope
310
320
 
311
321
  - `bug-hunter` — for finding bugs exposed by the refactor
@@ -8,7 +8,7 @@ description: |
8
8
  Triggers: user says "research", "current version", "is this still true",
9
9
  "latest", "what's new in", "breaking changes", "find current",
10
10
  "web research", "search the web", "look up".
11
- version: 1.0.0
11
+ version: 1.1.0
12
12
  required-capabilities: [web.research]
13
13
  required-tools: [context_manager, delegate, fetch, search]
14
14
  optional-capabilities: [runtime.admin]
@@ -335,6 +335,33 @@ Agent: search("TypeScript null check best practices") // NO
335
335
  7. CITE — In your response, cite sources for every factual claim
336
336
  ```
337
337
 
338
+ ## Out of scope
339
+
340
+ - **Don't claim a version, deprecation, or API surface from training memory.** Verify against a live source. The cutoff is wrong; the registry is right.
341
+ - **Don't research-loop.** 2–3 searches + 1–2 fetches per topic. If the answer isn't there after that, surface the ambiguity, don't keep searching.
342
+ - **Don't re-research what you've already injected.** Once a finding is in `context_manager` notes, future turns see it. Re-searching the same topic is a context-bloat failure.
343
+ - **Don't fetch URLs you guessed.** Search first, fetch the result. `fetch("https://react.dev/blog/2025/03/15/...")` is a 404 waiting to happen.
344
+ - **Don't inject raw search results.** Inject a structured summary, not a JSON dump of `search(...)`. Future turns need to parse, not re-read.
345
+ - **Don't cite a single source as fact.** Two-source minimum for a claim; one-source is tentative. Tertiary sources (Reddit, SO, LLM-generated content) need corroboration.
346
+ - **Don't accept a Medium post as ground truth.** Source tiers matter: primary (official docs, GitHub, registries) is fact; secondary is "according to"; tertiary needs corroboration.
347
+ - **Don't research during tactical work.** "Fix the null deref" doesn't need web search. Research mode is for analysis and discussion phases, not bug fixes.
348
+ - **Don't skip the null-result note.** A "no current changes found" note prevents the next turn from re-researching the same topic. Always include it.
349
+ - **Don't spend $0.50 on a version check.** Cost awareness: a quick lookup is 1 search + 1 fetch ≈ 2000 tokens. Landscape surveys justify $2.00; version checks don't.
350
+
351
+ ## Before returning
352
+
353
+ - [ ] Every claim cites a source URL; domain minimum, date when visible
354
+ - [ ] Two-source minimum for important claims; single-source labeled tentative
355
+ - [ ] Tertiary sources corroborated before citing
356
+ - [ ] Recency checked: version claims ≤ 6 months old; ecosystem trends from current year
357
+ - [ ] Findings injected via `context_manager` `add_note` with structured summary
358
+ - [ ] Null-result note included when no current changes found
359
+ - [ ] Search→fetch→validate→inject→cite workflow followed
360
+ - [ ] Stop rule honored: 2–3 searches + 1–2 fetches per topic; no loops
361
+ - [ ] Cost aligned with answer value; no $0.50 version checks
362
+ - [ ] No research done for tactical work that doesn't need it
363
+ - [ ] `<nextsteps>` lists any open follow-up research or pending validation
364
+
338
365
  ## Skills in scope
339
366
 
340
367
  - `tech-stack` — for package version verification and ecosystem validation
@@ -129,6 +129,24 @@ Stage shown in real-time. Pause stops after current iteration completes.
129
129
  - **Spec without acceptance criteria** — how do you know when it's done?
130
130
  - **Skipping /sdd for urgent tasks** — the spec is what makes "urgent" possible
131
131
 
132
+ ## Out of scope
133
+
134
+ - **Don't start coding before the spec exists.** You'll rewrite the code anyway — the spec is what makes the rewrite possible. SDD comes first or the spec is fiction.
135
+ - **Don't accept a spec without acceptance criteria.** "Done" must be a checkable state. Without criteria, the task has no formal end and the verifier has nothing to run.
136
+ - **Don't write vague requirements.** "Improve auth" is not a requirement; "Users authenticate via OAuth2 with PKCE, sessions expire after 24h" is. If a requirement can't be tested, it's not a requirement.
137
+ - **Don't skip `/sdd` because the task is urgent.** Urgency without a spec produces urgency-shaped rework. The spec is what makes "urgent" possible to ship correctly.
138
+ - **Don't start a multi-file refactor from SDD.** When the spec reveals a refactor, delegate to `refactor-planner` for the phased plan. SDD defines the goal; refactor-planner sequences the work.
139
+ - **Don't execute the task graph yourself unless the user asks.** SDD produces the plan and task graph; an executor (the leader, a subagent, or the user) picks it up.
140
+
141
+ ## Before returning
142
+
143
+ - [ ] Spec has explicit acceptance criteria the verifier can run as commands
144
+ - [ ] Every requirement is specific enough to be tested, not "improve X"
145
+ - [ ] Tasks have dependencies; no orphan tasks at the leaves
146
+ - [ ] Spec template matches the work type (feature/bugfix/refactor/infra/integration/cli-command)
147
+ - [ ] Multi-file refactors are routed to `refactor-planner`, not absorbed into SDD tasks
148
+ - [ ] Critical path called out; bottlenecks named; parallel groups identified
149
+
132
150
  ## Skills in scope
133
151
 
134
152
  - `refactor-planner` — when the spec reveals a multi-file refactor
@@ -4,7 +4,7 @@ description: |
4
4
  Use this skill when scanning code or configuration for security vulnerabilities
5
5
  in WrongStack. Triggers: user says "security", "vulnerability", "CVE", "secret",
6
6
  "injection", "XSS", "SQL injection", "audit security", "supply chain".
7
- version: 1.2.0
7
+ version: 1.3.0
8
8
  required-capabilities: [filesystem.read, code.inspect]
9
9
  required-tools: []
10
10
  optional-capabilities: [dependencies.manage]
@@ -167,6 +167,30 @@ element.textContent = userInput;
167
167
  </nextsteps>
168
168
  ```
169
169
 
170
+ ## Out of scope
171
+
172
+ - **Don't echo a full secret in the report.** Redact. A `ghp_…36 chars` is enough for the reader to find and rotate it. The unredacted value in a report is itself a leak.
173
+ - **Don't flag a `file:line` you haven't read.** Generic patterns cause false positives; verify the line is real before reporting. No "looks like a secret" findings.
174
+ - **Don't flag test fixtures as leaked secrets.** Mock credentials in `tests/` and `__fixtures__` are expected. Skip them; flag leaks in production code.
175
+ - **Don't scan `node_modules`.** Use `npm audit` / `pnpm audit` for supply chain. Grepping `node_modules` is a noise machine.
176
+ - **Don't report without remediation.** "Found X" without "do Y" is a finding the user has to research themselves. Always include the fix.
177
+ - **Don't claim CRITICAL without proof of exploitability.** Severity ladders are real. A pattern hit is a lead, not a warrant. State the input that triggers the bug and the consequence.
178
+ - **Don't bypass dependency audit.** Supply chain is an attack vector; skipping `npm audit` / lockfile review is skipping the scanner.
179
+ - **Don't disable TLS or relax auth configs as a "config option" without flagging CRITICAL.** TLS disabled in production is a CRITICAL, not a config note.
180
+
181
+ ## Before returning
182
+
183
+ - [ ] Every `file:line` opened and confirmed; no flag from a regex guess
184
+ - [ ] Secrets redacted in the report (prefix + char count, never the value)
185
+ - [ ] Test fixtures skipped for secrets; flagged only for leak/unawaited patterns
186
+ - [ ] `node_modules` not scanned; supply chain via `npm audit` / lockfile review
187
+ - [ ] Every finding carries a remediation; "found X" without "do Y" not shipped
188
+ - [ ] Severity passes the ladder; CRITICAL reserved for proven exploitability
189
+ - [ ] Dependency audit included; CVE/version drift covered
190
+ - [ ] TLS / HTTP / CORS / rate-limit configuration checked and reported
191
+ - [ ] False-positive rate called out with a cause when it exceeds 30%
192
+ - [ ] Summary counts match the findings listed; `<nextsteps>` mirrors them in severity order
193
+
170
194
  ## Skills in scope
171
195
 
172
196
  - `bug-hunter` — for general code quality bugs found during security scan
@@ -3,7 +3,7 @@ name: skill-creator
3
3
  description: |
4
4
  Use this skill when the user wants to create a new AI skill in WrongStack.
5
5
  Triggers: user says "create a skill", "new skill", "add a skill", "skill definition".
6
- version: 1.2.0
6
+ version: 1.3.0
7
7
  required-capabilities: [filesystem.write, runtime.admin]
8
8
  required-tools: [bash, skill]
9
9
  ---
@@ -162,6 +162,30 @@ Before writing the file, verify:
162
162
  - [ ] Content is actionable (rules, patterns, not just prose)
163
163
  - [ ] File will be placed in `.wrongstack/skills/`
164
164
 
165
+ ## Out of scope
166
+
167
+ - **Don't write skills without running `/skill-gen validate <name>` first.** A name that collides with an existing skill or breaks the kebab-case rule is a wall hit after the file is written. Validate first, always.
168
+ - **Don't ship a skill with a vague description.** "This skill is about Docker" matches nothing. First sentence = trigger; rest = `Triggers: user says "..."` listing concrete keywords.
169
+ - **Don't name skills in PascalCase or with underscores.** `MySkill` and `my_skill` are wrong; only `my-skill` (kebab-case) loads. The loader rejects the others.
170
+ - **Don't place project skills outside `.wrongstack/skills/<name>/`.** Bundled, user-profile, and foreign paths are for other owners. User-created skills always go in the project directory.
171
+ - **Don't write prose-only skills.** Rules, patterns, anti-patterns, code examples — the content has to be actionable. Prose without a checkable rule does not constrain the model.
172
+ - **Don't skip "Skills in scope".** Without the hand-off list, the model doesn't know where to delegate adjacent questions. The list is what makes the skill part of a system.
173
+ - **Don't forget to bump the version on structural change.** New section, scope change, rule change → major or minor bump. Patch only for wording.
174
+ - **Don't move work into the skill that belongs in `/skill-gen`.** The sub-commands are the deterministic layer: validation, scaffolding, from-prompt conversion. The wizard is for the parts they can't do.
175
+
176
+ ## Before returning
177
+
178
+ - [ ] Name is kebab-case; `/skill-gen validate <name>` passed
179
+ - [ ] Name doesn't collide with bundled, project, or user-profile skills
180
+ - [ ] First sentence of `description` is a concrete trigger; trigger keywords follow
181
+ - [ ] File path is `.wrongstack/skills/<name>/SKILL.md` for project skills
182
+ - [ ] Content is actionable: rules, patterns, anti-patterns, code examples
183
+ - [ ] "Out of scope" lists what the skill is NOT for and where to hand off
184
+ - [ ] "Before returning" gives the model a mechanical completion check
185
+ - [ ] "Skills in scope" names the hand-off targets and the reason for each
186
+ - [ ] Version bumped appropriately; change recorded in CHANGELOG.md
187
+ - [ ] `/skill-gen validate <name>` re-run after writing; loads cleanly
188
+
165
189
  ## Skills in scope
166
190
 
167
191
  - `prompt-engineering` — for crafting the skill description and prompt text