infinity-harness 2.0.0 → 2.0.1

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 (39) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/README.md +30 -3
  3. package/harness/docs/ARCHITECTURE.md +1 -1
  4. package/harness/docs/skills.md +89 -0
  5. package/harness/skills/auth-security.md +1 -0
  6. package/harness/skills/building-tools.md +35 -39
  7. package/harness/skills/capability-acquisition.md +1 -0
  8. package/harness/skills/cli-design.md +1 -0
  9. package/harness/skills/code-review.md +1 -0
  10. package/harness/skills/codebase-design.md +1 -0
  11. package/harness/skills/concurrency-async.md +1 -0
  12. package/harness/skills/config-and-secrets.md +1 -0
  13. package/harness/skills/context-hygiene.md +1 -0
  14. package/harness/skills/databases.md +1 -0
  15. package/harness/skills/diagnosing-bugs.md +1 -0
  16. package/harness/skills/domain-modeling.md +1 -0
  17. package/harness/skills/error-handling-logging.md +1 -0
  18. package/harness/skills/frontend-ui.md +1 -0
  19. package/harness/skills/grilling.md +1 -0
  20. package/harness/skills/http-apis.md +1 -0
  21. package/harness/skills/performance.md +1 -0
  22. package/harness/skills/pi-todo-adapted.md +1 -0
  23. package/harness/skills/planning-tasks.md +1 -0
  24. package/harness/skills/prototype.md +2 -1
  25. package/harness/skills/research.md +1 -0
  26. package/harness/skills/resolving-merge-conflicts.md +1 -0
  27. package/harness/skills/scope-discipline.md +1 -0
  28. package/harness/skills/self-review.md +1 -0
  29. package/harness/skills/stuck-protocol.md +1 -0
  30. package/harness/skills/tdd.md +1 -0
  31. package/harness/skills/testing-infra.md +1 -0
  32. package/harness/skills/writing-skills.md +2 -1
  33. package/package.json +1 -1
  34. package/src/core/brief.ts +45 -0
  35. package/src/core/skills.ts +386 -0
  36. package/src/core/skillsAudit.ts +223 -0
  37. package/src/core/types.ts +2 -0
  38. package/harness/skills/README.md +0 -60
  39. package/harness/skills/building-mcp-servers.md +0 -70
package/CHANGELOG.md CHANGED
@@ -4,6 +4,65 @@ All notable changes to this project are documented here.
4
4
  Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versions follow
5
5
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.0.1] — 2026-08-23
8
+
9
+ ### Fixed
10
+
11
+ - **pi printed a skill conflict on every start.** `harness/skills/README.md` was a README, and pi
12
+ loads *every* `.md` in a declared skills directory as a skill — so every session opened with
13
+ `[Skill conflicts] … description is required`. The README moved to `harness/docs/skills.md`, and
14
+ `tests/skills.test.ts` now audits the shipped skills against pi's own rules (frontmatter present,
15
+ `description` non-empty and within length, `name` lowercase-and-hyphens, matching its filename, no
16
+ duplicates, no UTF-8 BOM hiding the header). A warning the user saw at runtime is a failure we see
17
+ at test time.
18
+ - **Four shipped skills told the agent to run a CLI that does not exist.**
19
+ `capability-acquisition`, `building-tools`, `writing-skills` and the deleted MCP skill all
20
+ instructed the model to register capabilities with `infinity-harness capability add …` — a command
21
+ from the `dev-harness` ancestor that this package never had. An agent following them got stuck at
22
+ 3am on a command not found. Rewritten around what pi actually provides: a skill file in
23
+ `.pi/skills/`, a script in the repo, or an extension via `pi install`.
24
+
25
+ ### Removed
26
+
27
+ - **`building-mcp-servers.md`**, and every other reference to MCP. pi has no MCP client — no
28
+ dependency, no configuration, no code — so a skill about scaffolding MCP servers and registering
29
+ them could only send the agent somewhere pi cannot follow. This is a pi extension; MCP was
30
+ another system's answer.
31
+ - **`harness/capability/sources.json` and `harness/tools/`.** Neither was read by any code, neither
32
+ was published, and both documented the same missing CLI.
33
+
34
+ ### Added
35
+
36
+ - **The brief names the skills that match the work.** The docs claimed it did; nothing implemented
37
+ it. Every skill now declares a `kind` — `process` (belongs to its phase), `domain` (needs to share
38
+ vocabulary with the task) or `meta` (asked for explicitly) — and the brief ranks them by phase
39
+ position, tag hits and name mentions, showing the best two. A task about *"two workers racing on
40
+ the lock"* gets `concurrency-async`; a bare BUILD task gets `tdd`; a task that matches nothing gets
41
+ no section at all, because a padded section teaches the model to skip it.
42
+ - **`src/core/skills.ts`** — skill loading, header parsing and matching, resolved from the package so
43
+ it works in an install with no project setup.
44
+ - **`src/core/skillsAudit.ts`** — pi's validation rules, reproduced strictly enough that a clean
45
+ audit means a clean start. Also catches what pi does not: a duplicate name (pi keys skills by name,
46
+ so one silently ceases to exist), a mistyped phase, a missing `kind`, and a name that disagrees
47
+ with its filename.
48
+ - **A `package` E2E scenario** — `npm pack`, extracted and inspected. Every bug it looks for was
49
+ found by a user after install and by nothing in this repository: a file pi rejects, a symlink out
50
+ of the tree, a module the extension imports that npm did not publish, a UTF-8 BOM. The repo working
51
+ tree is not the product; the tarball is.
52
+ - **A reachability guard.** "The tested code was not the shipped code" was this project's worst bug.
53
+ The `package` scenario now also walks every import from the extension entry point and fails on any
54
+ *new* module that ships without a path to it. Nine modules are unreachable today — `worker`,
55
+ `unstuck`, `review`, `rework`, `replan`, the three `goal*` modules and the audit itself — and they
56
+ are named in the test with the reason, so the debt is visible and cannot grow quietly.
57
+
58
+ ### Changed
59
+
60
+ - `prototype` now leads with PLAN rather than BUILD — it answers a design question before you commit
61
+ to one, and the phase a skill leads with is what decides its rank.
62
+ - Tag matching tolerates plurals, so a task about "two workers" matches the `worker` tag.
63
+
64
+ ---
65
+
7
66
  ## [2.0.0] — 2026-08-23
8
67
 
9
68
  Renamed from `pi-harness` to **infinity-harness**, and rebuilt from a working prototype into
package/README.md CHANGED
@@ -186,6 +186,32 @@ verdict. It refreshes itself every 5 seconds and reconnects with backoff if the
186
186
  The dashboard is strictly read-only and binds to `127.0.0.1`. It never writes, and never bumps
187
187
  `baseRevision` — opening it can't perturb the run you're watching.
188
188
 
189
+ ## Craft skills
190
+
191
+ 28 short documents on how to do the work well — how to write a test worth
192
+ keeping, how to debug something intermittent, how to design a module boundary.
193
+ They ship with the package, so pi loads them wherever it's installed and the
194
+ model can invoke any of them by name.
195
+
196
+ A model with 28 skills available and no idea which one applies reads none of
197
+ them, so **the brief names the ones that match the work in hand**. Each skill
198
+ declares what it's for:
199
+
200
+ ```yaml
201
+ kind: domain # process | domain | meta
202
+ phases: [plan, build, verify] # the phase it leads counts most
203
+ tags: [concurrency, race, lock, mutex, deadlock] # vocabulary a task would use
204
+ ```
205
+
206
+ A `process` skill belongs to its phase — TDD is the right answer for a BUILD
207
+ task whatever the task says. A `domain` skill has to share vocabulary with the
208
+ task: nobody needs the database skill because they happen to be in BUILD. So a
209
+ task called *"serialise plan writes so two workers can't race on the lock"*
210
+ gets `concurrency-async`, and a bare BUILD task gets `tdd`.
211
+
212
+ When nothing matches, the brief has no skills section. An empty section is
213
+ honest; a padded one teaches the model to skip it.
214
+
189
215
  ## Model routing (optional)
190
216
 
191
217
  Send cheap tasks to a small model and hard ones to a large one. Pick them with `/infinity:config` →
@@ -229,6 +255,7 @@ infinity-harness/
229
255
  ├── src/
230
256
  │ ├── core/ types · paths · fsx · config · phases · gates · brief
231
257
  │ │ · featureList (the SSOT) · lock · exec
258
+ │ │ · skills (match) · skillsAudit (guard)
232
259
  │ ├── ui/ theme · widget (terminal) · dashboard (web)
233
260
  │ ├── loop.ts the continuous-run driver and its stop conditions
234
261
  │ ├── taskList.ts atomic plan editor
@@ -242,8 +269,8 @@ infinity-harness/
242
269
  │ ├── config.json pipeline state and settings
243
270
  │ ├── model-router.json optional routing
244
271
  │ ├── docs/ architecture · decisions · phase and role docs
245
- │ └── skills/ 29 craft skills the brief points at
246
- ├── tests/ 20 files, plain node:assert
272
+ │ └── skills/ 28 craft skills the brief points at
273
+ ├── tests/ 22 files, plain node:assert
247
274
  └── scripts/run-tests.mjs
248
275
  ```
249
276
 
@@ -255,7 +282,7 @@ there is one implementation, and the adapter calls it.
255
282
  ```bash
256
283
  npm install
257
284
  npm run check # tsc --noEmit
258
- npm test # 20 test files
285
+ npm test # 22 test files
259
286
  npm run e2e # end-to-end against a live model
260
287
  ```
261
288
 
@@ -153,7 +153,7 @@ Every stop carries a reason. A human coming back finds an explanation, not a mys
153
153
  ## Verification
154
154
 
155
155
  - `npm test` — 20 unit files, plain `node:assert`, no framework.
156
- - `npm run e2e` — 11 scenarios over real temp projects, real git repos, real child processes: the
156
+ - `npm run e2e` — 12 scenarios over real temp projects, real git repos, real child processes: the
157
157
  full pipeline walkthrough, loop convergence, every stop condition, SIGKILL-and-restart, a 6-way
158
158
  concurrent write fan-out with an unlocked control, data round-trip, the dashboard, widget
159
159
  rendering across shapes, adversarial input, and the extension adapter itself.
@@ -0,0 +1,89 @@
1
+ <!--
2
+ Kept in docs/, not in harness/skills/.
3
+
4
+ pi loads every .md in a declared skills directory as a skill and requires
5
+ `name` and `description` frontmatter on each. A README has neither, so leaving
6
+ it beside the skills made pi print a skill conflict on every start.
7
+ `tests/skills.test.ts` now fails if anything in harness/skills/ would do that.
8
+ -->
9
+
10
+ # Craft Skills
11
+
12
+ How to do the work WELL — the engineering discipline behind each pipeline
13
+ phase. The phase docs (`harness/docs/phases/`) say *what* to produce; these
14
+ skills say *how* an expert produces it.
15
+
16
+ They ship with the package, so pi loads them wherever it is installed: the
17
+ model can invoke any of them by name, and `/skill:<name>` lists them.
18
+
19
+ **The brief names the ones that match the work in hand.** Each skill declares
20
+ what it is for, so the brief can route:
21
+
22
+ ```yaml
23
+ kind: domain # process | domain | meta
24
+ phases: [plan, build, verify] # leading phase counts most
25
+ tags: [concurrency, race, lock, mutex, deadlock] # vocabulary a task would use
26
+ ```
27
+
28
+ - **`process`** — how to work in a phase. Belonging to the phase is enough;
29
+ TDD is the right answer for a BUILD task whatever the task says.
30
+ - **`domain`** — a subject area. Surfaces only when the task shares its
31
+ vocabulary. Nobody needs the database skill for being in BUILD.
32
+ - **`meta`** — growing the toolkit. Vocabulary only, never a phase.
33
+
34
+ Read the one the brief names before you start. Each is short, and it changes
35
+ what you do.
36
+
37
+ ## Process skills
38
+
39
+ | Skill | Leads | One-liner |
40
+ |-------|-------|-----------|
41
+ | `grilling.md` | DEFINE | Stress-test the spec with relentless questions |
42
+ | `domain-modeling.md` | DEFINE | Pin down domain terms before writing code |
43
+ | `research.md` | DEFINE | Answer questions from primary sources only |
44
+ | `planning-tasks.md` | PLAN | Break specs into tracer-bullet vertical slices |
45
+ | `codebase-design.md` | PLAN | Design deep modules behind small interfaces |
46
+ | `prototype.md` | PLAN | Throwaway code that answers a design question |
47
+ | `tdd.md` | BUILD | Red → green loop; tests worth keeping |
48
+ | `self-review.md` | BUILD | The pass that runs before every validate |
49
+ | `diagnosing-bugs.md` | VERIFY | Build a feedback loop before hypothesising |
50
+ | `code-review.md` | REVIEW | Two-axis review: standards + spec |
51
+ | `resolving-merge-conflicts.md` | any | Resolve conflicts by original intent |
52
+ | `context-hygiene.md` | any | Externalise discoveries the moment they happen |
53
+ | `scope-discipline.md` | any | The contract is the boundary; park everything else |
54
+ | `stuck-protocol.md` | any | Stop thrashing, escalate cleanly |
55
+
56
+ ## Domain skills
57
+
58
+ Matched by vocabulary, not by phase:
59
+
60
+ `databases` · `http-apis` · `auth-security` · `frontend-ui` ·
61
+ `testing-infra` · `concurrency-async` · `performance` ·
62
+ `error-handling-logging` · `config-and-secrets` · `cli-design` ·
63
+ `pi-todo-adapted`
64
+
65
+ ## Meta skills
66
+
67
+ | Skill | Purpose |
68
+ |-------|---------|
69
+ | `capability-acquisition.md` | HAVE → ACQUIRE → CREATE → KEEP |
70
+ | `writing-skills.md` | How to author a skill worth keeping |
71
+ | `building-tools.md` | Standards for a project script anyone can run |
72
+
73
+ Growing the library is part of the job. A skill you write into
74
+ `.pi/skills/<name>.md` is loaded by pi on the next start — there is nothing to
75
+ register — and committing it means the next session starts one rung higher.
76
+
77
+ ## Adding one here
78
+
79
+ Frontmatter is a strict subset: `key: value`, `key: [a, b]`, `key: { k: v }`.
80
+ No block scalars, no multi-line values. `name` must match the filename, be
81
+ lowercase `a-z0-9-`, and `description`, `kind` and `phases` must all be
82
+ present and valid — `npm test` enforces every one of those, because pi only
83
+ warns and it warns on every single start.
84
+
85
+ ## Attribution
86
+
87
+ Skills marked "Adapted from mattpocock/skills" derive from
88
+ [Matt Pocock's skills repository](https://github.com/mattpocock/skills)
89
+ (MIT License, © 2026 Matt Pocock), adapted for the infinity-harness pipeline.
@@ -4,6 +4,7 @@ description: Authentication, authorization, secrets, and the injection/XSS/CSRF
4
4
  tags: [auth, authentication, authorization, security, login, password, token, jwt, session, oauth, secret, csrf, xss, injection, permission]
5
5
  when: task touches login, sessions, tokens, permissions, user input, or secrets
6
6
  phases: [plan, build, verify]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -1,60 +1,56 @@
1
1
  ---
2
2
  name: building-tools
3
- description: Project tool standards — idempotent, self-documenting, non-interactive executables
4
- tags: [meta, tool, script, cli, automation, executable]
5
- when: a repeatable action deserves a registered executable instead of ad-hoc shell
3
+ description: Project script standards — idempotent, self-documenting, non-interactive executables
4
+ tags: [meta, tool, script, cli, automation, executable, makefile]
5
+ when: a repeatable action deserves a script instead of the same shell dance twice
6
6
  phases: []
7
+ kind: meta
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
10
11
  # Building Tools
11
12
 
12
- A tool is a registered executable under `harness/tools/` that future
13
- sessions (and other agents) can find and run. Build one when you catch
14
- yourself doing the same multi-step shell dance twice.
13
+ Build one when you catch yourself doing the same multi-step shell dance
14
+ twice. The bar is not "it worked once on my machine" an unattended agent
15
+ will run this at 3am with no one watching.
15
16
 
16
- ## Process
17
+ There is nothing to register. A script in the repo, named in `AGENTS.md` or
18
+ `package.json`, is discoverable by the next session; a script nobody can
19
+ find is a script nobody runs.
17
20
 
18
- 1. `infinity-harness capability create tool <name>` → stub at
19
- `harness/tools/<name>.sh` (any language works — .mjs, .py; the stub is
20
- bash).
21
- 2. Implement to the standards below.
22
- 3. Register:
23
-
24
- ```
25
- infinity-harness capability add tool harness/tools/<name>.sh \
26
- --run "bash harness/tools/<name>.sh" \
27
- --tags db,fixtures --description "Reset local db to fixtures"
28
- ```
29
-
30
- ## Standards (the registration bar)
21
+ ## Standards
31
22
 
32
23
  - **Idempotent** — running it twice is safe and converges to the same state.
33
- - **`--help` works** — prints usage + purpose, exits 0. (`capability
34
- doctor` checks exactly this.)
35
- - **`--json` where output is consumed** — machine-readable when another
36
- tool or agent reads the result.
37
- - **Exit codes:** 0 success · 1 operation failed · 2 usage error.
38
- - **Never interactive** no prompts, no confirmations; flags only. An
39
- unattended agent runs this at 3am.
40
- - **Fail loud and specific** — errors name the thing that's wrong and the
41
- likely fix, on stderr.
42
- - **Self-contained** resolve paths relative to the project root, not the
43
- caller's cwd.
24
+ - **`--help` works** — prints usage and purpose, exits 0. This is the first
25
+ thing anyone runs, human or model.
26
+ - **`--json` where output is consumed** — machine-readable when something
27
+ downstream reads the result. Humans get the summary line.
28
+ - **Exit codes** — `0` success · `1` the operation failed · `2` you were
29
+ called wrong. An agent branches on these; get them right.
30
+ - **Never interactive** no prompts, no confirmations, no "are you sure".
31
+ Flags only.
32
+ - **Fail loud and specific** — errors name the thing that is wrong and the
33
+ likely fix, on stderr. "Error: 1" costs someone an hour.
34
+ - **Self-contained** — resolve paths from the project root, not the
35
+ caller's cwd. Check prerequisites at startup and fail with the install
36
+ command.
44
37
 
45
38
  ## Anti-patterns
46
39
 
47
- - **The snowflake** — works only on the author's machine (hardcoded paths,
48
- undeclared deps). Fix: check prerequisites at startup, fail with install
40
+ - **The snowflake** — hardcoded paths, undeclared dependencies, works only
41
+ where it was written. Fix: check prerequisites first, fail with
49
42
  instructions.
50
43
  - **The chatterbox** — pages of output hiding the result. Fix: one summary
51
44
  line by default, `--verbose` for the rest.
52
- - **The mutation surprise** — destructive with no dry-run. Fix: anything
53
- destructive gets `--dry-run` and defaults to showing what it would do.
45
+ - **The mutation surprise** — destructive with no dry run. Fix: anything
46
+ destructive gets `--dry-run`, and says what it would do.
47
+ - **The second source of truth** — a script that keeps its own copy of state
48
+ the project already stores. Fix: read the real file.
54
49
 
55
50
  ## Checklist
56
51
 
57
- - [ ] Idempotent (ran it twice to prove it)
58
- - [ ] `--help` exit 0; exit codes correct
59
- - [ ] Registered with 2 tags + description
60
- - [ ] `infinity-harness capability doctor --type tool` passes
52
+ - [ ] Ran it twice; the second run was a no-op
53
+ - [ ] `--help` exits 0 and explains the purpose
54
+ - [ ] Exit codes are 0 / 1 / 2 and mean what they should
55
+ - [ ] No prompt, no confirmation, no TTY assumption
56
+ - [ ] Named somewhere a cold reader will find it
@@ -4,6 +4,7 @@ description: The capability ladder — HAVE, ACQUIRE, CREATE, KEEP — for skill
4
4
  tags: [meta, capability, acquire, search, skill, mcp, tool, ladder, library]
5
5
  when: a task needs knowledge, system access, or an executable the project lacks
6
6
  phases: []
7
+ kind: meta
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Command-line tool design — argument conventions, output contracts
4
4
  tags: [cli, command, terminal, flags, arguments, stdout, stdin, shell, script, tool]
5
5
  when: task builds or extends a command-line interface
6
6
  phases: [plan, build]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Two-axis review (spec fidelity + standards/smells) with the Fowler
4
4
  tags: [review, quality, smell, refactor, standards, spec, diff, audit]
5
5
  when: reviewing a diff, a branch, or the whole delivery before shipping
6
6
  phases: [review, simplify]
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Deep modules — small interfaces hiding lots of behavior, seams, t
4
4
  tags: [design, architecture, module, interface, seam, refactor, coupling, abstraction, api]
5
5
  when: designing module boundaries, planning features, refactoring for clarity
6
6
  phases: [plan, simplify]
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Concurrency and async correctness — races, idempotency, queues, c
4
4
  tags: [concurrency, async, race, parallel, queue, lock, mutex, retry, idempotent, worker, thread, promise, deadlock, atomic]
5
5
  when: task involves parallel work, background jobs, shared state, or retried operations
6
6
  phases: [plan, build, verify]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Configuration discipline — env-driven config, validation at boot,
4
4
  tags: [config, configuration, environment, env, secret, settings, deploy, dotenv, variable]
5
5
  when: task adds configuration, environment handling, or deployment settings
6
6
  phases: [build, ship]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Externalize state before it decays — write discoveries down, re-r
4
4
  tags: [meta, context, memory, handoff, session, notes, playbook]
5
5
  when: any long session, and always before ending one
6
6
  phases: []
7
+ kind: process
7
8
  provenance: { origin: built-in, notes: frontier-playbook }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Relational database craft — schema design, migrations, transactio
4
4
  tags: [database, db, sql, postgres, postgresql, mysql, sqlite, schema, migration, transaction, index, query, orm, persistence, storage]
5
5
  when: task touches persistent data, schemas, queries, or migrations
6
6
  phases: [plan, build, verify]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Feedback-loop-first debugging discipline for hard bugs and regressi
4
4
  tags: [debug, debugging, bug, error, failure, crash, flaky, slow, performance, regression, bisect]
5
5
  when: something is broken, throwing, failing intermittently, or slow
6
6
  phases: [verify, build]
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Pin down domain terminology — glossary discipline and decision re
4
4
  tags: [domain, glossary, terminology, naming, model, ubiquitous, language, adr, decision]
5
5
  when: defining specs, resolving fuzzy or conflicting terms, recording decisions
6
6
  phases: [define, plan]
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Error taxonomy, fail-loud handling, structured logging that debugs
4
4
  tags: [error, exception, logging, log, observability, retry, crash, handling, monitoring, trace]
5
5
  when: task defines error paths, adds logging, or hardens failure behavior
6
6
  phases: [build, verify]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Frontend craft — state discipline, componentization, accessibilit
4
4
  tags: [frontend, ui, component, react, vue, svelte, state, form, accessibility, a11y, css, browser, render]
5
5
  when: task builds or changes user interface
6
6
  phases: [plan, build]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Stress-test a spec or plan with relentless one-at-a-time questions
4
4
  tags: [grill, spec, requirements, questions, stress, interview, scope, clarify]
5
5
  when: before proposing the sprint contract, or when a plan feels underspecified
6
6
  phases: [define]
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: HTTP/REST API design — resources, status codes, errors, versionin
4
4
  tags: [api, http, rest, endpoint, route, json, status, error, versioning, pagination, webhook, request, response]
5
5
  when: task designs or implements HTTP endpoints or consumes external APIs
6
6
  phases: [plan, build]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Performance work — measure first, fix the biggest cost, cache wit
4
4
  tags: [performance, slow, latency, profiling, optimize, cache, memory, benchmark, throughput, speed]
5
5
  when: something is slow, memory-hungry, or a task sets performance targets
6
6
  phases: [verify, build]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: "Atomic infinity_plan pattern with omission deletion, baseRevision
4
4
  tags: [harness, pi-todo, atomic, baseRevision, omission, deletion, compaction, widget, task-list, dependency]
5
5
  when: "implementing infinity_plan, atomic revisioning, Pi widget with session persistence or task dependencies"
6
6
  phases: [build, verify]
7
+ kind: domain
7
8
  provenance: { origin: "https://github.com/99percentpeople/pi-extensions", license: MIT, adapted: true, url: "https://github.com/99percentpeople/pi-extensions", contentHash: abf626df6a74a6fb }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Break specs into tracer-bullet vertical slices with checkable accep
4
4
  tags: [plan, planning, slice, ticket, decompose, criteria, backlog, breakdown, refactor]
5
5
  when: writing or restructuring the feature list from a spec
6
6
  phases: [plan]
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -3,7 +3,8 @@ name: prototype
3
3
  description: Throwaway code that answers a design question fast, then gets deleted
4
4
  tags: [prototype, spike, experiment, explore, poc, throwaway, design]
5
5
  when: a state model, logic shape, or UI direction cannot be judged on paper
6
- phases: [build, plan]
6
+ phases: [plan, build]
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Answer factual questions from primary sources; capture cited findin
4
4
  tags: [research, docs, documentation, investigate, source, facts, api, spec, evidence]
5
5
  when: a factual question about an API, library, protocol, or tool blocks progress
6
6
  phases: [define, plan, build]
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Resolve git merge/rebase conflicts by original intent, verify, and
4
4
  tags: [git, merge, rebase, conflict, branch, hunk]
5
5
  when: an in-progress git merge or rebase has conflicting hunks
6
6
  phases: []
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: The contract is the boundary — park ideas, resist drive-by fixes,
4
4
  tags: [meta, scope, creep, contract, focus, discipline, playbook]
5
5
  when: mid-task ideas, adjacent problems, or "while I'm here" temptations appear
6
6
  phases: []
7
+ kind: process
7
8
  provenance: { origin: built-in, notes: frontier-playbook }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Structured pass before claiming done — criteria re-check, real ru
4
4
  tags: [meta, review, verify, done, quality, check, playbook]
5
5
  when: before running validate on any task — every time
6
6
  phases: [build, verify, simplify]
7
+ kind: process
7
8
  provenance: { origin: built-in, notes: frontier-playbook }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: What to do after repeated failures — stop, write down, reframe on
4
4
  tags: [meta, stuck, retry, failure, escalate, blocked, playbook]
5
5
  when: the same step has failed 2-3 times, or you notice you are looping
6
6
  phases: []
7
+ kind: process
7
8
  provenance: { origin: built-in, notes: frontier-playbook }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Red → green test-driven loop — what a good test is, seams, anti
4
4
  tags: [tdd, test, testing, unit, integration, red-green, seam, mock, coverage]
5
5
  when: implementing any BUILD task, or fixing a bug that needs a regression test
6
6
  phases: [build, verify]
7
+ kind: process
7
8
  provenance: { origin: "mattpocock/skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: Test infrastructure — fixtures, isolation, flaky-test policy, CI
4
4
  tags: [test, testing, fixture, ci, flaky, coverage, mock, isolation, pipeline, suite]
5
5
  when: task sets up test tooling, fixtures, CI, or fights slow/flaky suites
6
6
  phases: [build, verify]
7
+ kind: domain
7
8
  provenance: { origin: built-in }
8
9
  ---
9
10
 
@@ -4,6 +4,7 @@ description: How to author a skill worth keeping — scope, structure, frontmatt
4
4
  tags: [meta, skill, writing, author, documentation, checklist]
5
5
  when: creating a new skill or adapting an acquired one
6
6
  phases: []
7
+ kind: meta
7
8
  provenance: { origin: "mattpocock/skills writing-great-skills", license: MIT, adapted: true }
8
9
  ---
9
10
 
@@ -54,7 +55,7 @@ Frontmatter uses a strict subset: `key: value`, `key: [a, b]`,
54
55
 
55
56
  ## Checklist
56
57
 
57
- - [ ] Frontmatter passes: `infinity-harness capability add skill <path>` (it validates)
58
+ - [ ] Frontmatter is complete: `name` matching the filename, `description`, `kind`, `tags`, `when`, `phases`
58
59
  - [ ] A cold reader knows exactly what to do and how to check they did it
59
60
  - [ ] Every rule is checkable; every anti-pattern has a fix
60
61
  - [ ] Attribution line present if adapted from elsewhere
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "infinity-harness",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "A pi agent extension that runs a gated build pipeline unattended \u2014 enforces phases, validates with deterministic gates, and keeps working for hours or days without losing the plan.",
5
5
  "type": "module",
6
6
  "keywords": [