ralphctl 0.25.0 → 0.27.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.
Files changed (59) hide show
  1. package/README.md +11 -5
  2. package/THIRD-PARTY-NOTICES.md +65 -2
  3. package/dist/agent-definitions/ralphctl-generator.md +3 -2
  4. package/dist/{cli-GQBXYNFN.mjs → cli-EYDXERW6.mjs} +9423 -6665
  5. package/dist/cli.mjs +1 -1
  6. package/dist/manifest.json +20 -3
  7. package/dist/prompts/_partials/approval-gate.md +5 -5
  8. package/dist/prompts/_partials/autonomous-operation.md +23 -6
  9. package/dist/prompts/_partials/conventions-agents-md.md +8 -20
  10. package/dist/prompts/_partials/conventions-claude-md.md +12 -15
  11. package/dist/prompts/_partials/conventions-copilot-instructions.md +6 -10
  12. package/dist/prompts/_partials/decisions.md +3 -9
  13. package/dist/prompts/_partials/evaluator-failure-modes.md +11 -5
  14. package/dist/prompts/_partials/evaluator-grading-rules.md +25 -10
  15. package/dist/prompts/_partials/evidence-bound.md +2 -2
  16. package/dist/prompts/_partials/git-boundary.md +7 -0
  17. package/dist/prompts/_partials/harness-context.md +1 -1
  18. package/dist/prompts/_partials/one-shot-operation.md +6 -0
  19. package/dist/prompts/_partials/question-format.md +7 -0
  20. package/dist/prompts/_partials/skill-body.md +5 -0
  21. package/dist/prompts/_partials/task-blocked.md +10 -0
  22. package/dist/prompts/_partials/task-fields.md +19 -3
  23. package/dist/prompts/_partials/task-sizing.md +2 -2
  24. package/dist/prompts/_partials/validation-checklist.md +6 -8
  25. package/dist/prompts/apply-feedback/template.md +24 -25
  26. package/dist/prompts/create-pr/template.md +21 -15
  27. package/dist/prompts/detect-scripts/template.md +10 -9
  28. package/dist/prompts/detect-skills/template.md +19 -23
  29. package/dist/prompts/distill-learnings/template.md +10 -8
  30. package/dist/prompts/evaluate/template.md +74 -93
  31. package/dist/prompts/evaluate-continuation/template.md +19 -22
  32. package/dist/prompts/ideate/template.md +36 -47
  33. package/dist/prompts/implement/template.md +59 -73
  34. package/dist/prompts/implement-continuation/template.md +21 -20
  35. package/dist/prompts/implement-crash-resume/template.md +13 -4
  36. package/dist/prompts/plan/template.md +75 -64
  37. package/dist/prompts/readiness/template.md +36 -27
  38. package/dist/prompts/refine/template.md +37 -50
  39. package/dist/prompts/reproduce/template.md +9 -7
  40. package/dist/prompts/select-candidate/template.md +17 -10
  41. package/dist/skills/ralphctl-api-and-interface-design/SKILL.md +117 -0
  42. package/dist/skills/ralphctl-code-review-and-quality/SKILL.md +119 -8
  43. package/dist/skills/ralphctl-code-simplification/SKILL.md +100 -0
  44. package/dist/skills/ralphctl-codebase-design/SKILL.md +82 -0
  45. package/dist/skills/ralphctl-debugging-and-error-recovery/SKILL.md +23 -5
  46. package/dist/skills/ralphctl-deprecation-and-migration/SKILL.md +106 -0
  47. package/dist/skills/ralphctl-frontend-ui-engineering/SKILL.md +94 -0
  48. package/dist/skills/ralphctl-humanizer/SKILL.md +137 -0
  49. package/dist/skills/ralphctl-idea-refinement/SKILL.md +2 -0
  50. package/dist/skills/ralphctl-iterative-review/SKILL.md +10 -4
  51. package/dist/skills/ralphctl-observability-and-instrumentation/SKILL.md +104 -0
  52. package/dist/skills/ralphctl-performance-optimization/SKILL.md +123 -0
  53. package/dist/skills/ralphctl-ponytail/SKILL.md +38 -28
  54. package/dist/skills/ralphctl-security-and-hardening/SKILL.md +259 -0
  55. package/dist/skills/ralphctl-source-driven-development/SKILL.md +103 -0
  56. package/dist/skills/ralphctl-spec-driven-development/SKILL.md +148 -0
  57. package/dist/skills/ralphctl-test-driven-development/SKILL.md +29 -2
  58. package/dist/skills/ralphctl-writing-for-agents/SKILL.md +113 -0
  59. package/package.json +10 -10
package/dist/cli.mjs CHANGED
@@ -4,5 +4,5 @@
4
4
  process.env.NODE_ENV ??= "production";
5
5
  var { isColorDisabled } = await import("./use-no-color-NEMCAVY3.mjs");
6
6
  if (isColorDisabled()) process.env.FORCE_COLOR = "0";
7
- var { runCli } = await import("./cli-GQBXYNFN.mjs");
7
+ var { runCli } = await import("./cli-EYDXERW6.mjs");
8
8
  await runCli(process.argv);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "0.25.0",
4
- "generatedAt": "2026-10-04T21:06:53.092Z",
3
+ "packageVersion": "0.27.0",
4
+ "generatedAt": "2026-10-25T09:18:02.901Z",
5
5
  "assets": [
6
6
  "agent-definitions/ralphctl-evaluator.md",
7
7
  "agent-definitions/ralphctl-generator.md",
@@ -14,8 +14,13 @@
14
14
  "prompts/_partials/evaluator-failure-modes.md",
15
15
  "prompts/_partials/evaluator-grading-rules.md",
16
16
  "prompts/_partials/evidence-bound.md",
17
+ "prompts/_partials/git-boundary.md",
17
18
  "prompts/_partials/harness-context.md",
19
+ "prompts/_partials/one-shot-operation.md",
18
20
  "prompts/_partials/parallel-tool-calls.md",
21
+ "prompts/_partials/question-format.md",
22
+ "prompts/_partials/skill-body.md",
23
+ "prompts/_partials/task-blocked.md",
19
24
  "prompts/_partials/task-fields.md",
20
25
  "prompts/_partials/task-sizing.md",
21
26
  "prompts/_partials/validation-checklist.md",
@@ -37,16 +42,28 @@
37
42
  "prompts/select-candidate/template.md",
38
43
  "skills/ralphctl-abstraction-first/SKILL.md",
39
44
  "skills/ralphctl-alignment/SKILL.md",
45
+ "skills/ralphctl-api-and-interface-design/SKILL.md",
40
46
  "skills/ralphctl-cherny-workflow/SKILL.md",
41
47
  "skills/ralphctl-code-review-and-quality/SKILL.md",
48
+ "skills/ralphctl-code-simplification/SKILL.md",
49
+ "skills/ralphctl-codebase-design/SKILL.md",
42
50
  "skills/ralphctl-debugging-and-error-recovery/SKILL.md",
51
+ "skills/ralphctl-deprecation-and-migration/SKILL.md",
43
52
  "skills/ralphctl-domain-driven-design/SKILL.md",
53
+ "skills/ralphctl-frontend-ui-engineering/SKILL.md",
54
+ "skills/ralphctl-humanizer/SKILL.md",
44
55
  "skills/ralphctl-idea-refinement/SKILL.md",
45
56
  "skills/ralphctl-iterative-review/SKILL.md",
46
57
  "skills/ralphctl-karpathy-guidelines/SKILL.md",
47
58
  "skills/ralphctl-minimal-scaffolding/SKILL.md",
59
+ "skills/ralphctl-observability-and-instrumentation/SKILL.md",
60
+ "skills/ralphctl-performance-optimization/SKILL.md",
48
61
  "skills/ralphctl-ponytail/SKILL.md",
62
+ "skills/ralphctl-security-and-hardening/SKILL.md",
63
+ "skills/ralphctl-source-driven-development/SKILL.md",
64
+ "skills/ralphctl-spec-driven-development/SKILL.md",
49
65
  "skills/ralphctl-surgical-simplicity/SKILL.md",
50
- "skills/ralphctl-test-driven-development/SKILL.md"
66
+ "skills/ralphctl-test-driven-development/SKILL.md",
67
+ "skills/ralphctl-writing-for-agents/SKILL.md"
51
68
  ]
52
69
  }
@@ -2,12 +2,12 @@
2
2
  Approval works on exactly what the operator sees: what you show them is what goes into `signals.json`,
3
3
  so the operator can only approve what is fully on screen.
4
4
 
5
- 1. Run this prompt's pre-output checklist before you present anything, so the document you show already
6
- passes it. The checklist may appear later in these instructions, and for requirements the interview's
7
- stop criteria are the applicable checks; either way, check first and present second.
5
+ 1. Run this prompt's checklist before you present anything, so the document you show already passes it.
6
+ For requirements the interview's stop criteria are the applicable checks; either way, check first and
7
+ present second.
8
8
  2. Show the complete document you will write, verbatim — for requirements, every section; for a task
9
- plan, every task with all its fields (name, repository, ticket, description, `blockedBy`, every step,
10
- and every verification criterion with its check type and command), followed by the dependency order.
9
+ plan, every task with all its fields (name, repository, ticket, description, `blockedBy`, extra evaluator
10
+ dimensions, every step, and every verification criterion with its check type and command), followed by the dependency order.
11
11
  Print it as its own message, not as a lead-in to the question.
12
12
  3. Do this on every approval round, including after each revision. Never substitute a summary, a diff,
13
13
  "unchanged sections omitted", or a pointer to an earlier message — an operator who has to scroll back
@@ -1,14 +1,31 @@
1
1
  <autonomous-operation>
2
2
  You are operating autonomously. The user is not watching in real time and cannot answer questions
3
3
  mid-task, so asking "Want me to…?" or "Shall I…?" leaves the work blocked with no one there to
4
- answer — decide and proceed instead.
4
+ answer. For reversible actions that follow from the task, decide and proceed.
5
5
 
6
6
  Before ending your turn, check your last paragraph. If it is a plan, an analysis, a question, a
7
- list of next steps, or a promise about work you have not done yet ("I'll…", "next, I'll…", "let me
8
- know when…"), that is not a stopping point — do that work now, with tool calls, before the turn
9
- ends. The harness reads only the signals file this role writes; a turn that ends on a description
10
- of the next step, instead of the tool call that performs it, is indistinguishable from a turn that
11
- did nothing.
7
+ list of next steps, a list of decisions none of which blocks the rest of the work, a status report
8
+ written because the turn has run long or a milestone is done, or a promise about work you have not
9
+ done yet ("I'll…", "next, I'll…", "let me know when…"), that is not a stopping point — do that
10
+ work now, with tool calls, before the turn ends. That includes retrying after errors and gathering
11
+ missing information yourself. The harness reads only the signals file this role writes; a turn that
12
+ ends on a description of the next step, instead of the tool call that performs it, is
13
+ indistinguishable from a turn that did nothing.
14
+
15
+ Two endings are legitimate. Either the work is done and recorded in the signals file — out-of-scope
16
+ extras you noticed belong in that file as a note, and an evaluator's verdict is its finished work —
17
+ or you hit something only a person can resolve (a destructive or irreversible step, a real scope
18
+ change, input only they can supply, a command or path the harness deliberately denies you): end
19
+ with this role's blocked, failed or not-reproduced outcome from the output contract, naming the one
20
+ thing that would unblock you.
21
+
22
+ This prompt's output contract and constraints take precedence over any installed skill or project
23
+ context file. When a skill or context file conflicts with them, follow this prompt and record that
24
+ file's path and the quoted instruction in a `note` signal instead of pausing.
25
+
26
+ Before running a command that changes system state (a restart, a delete, a config edit), check that
27
+ the evidence supports that specific action — a symptom that matches a known failure can have
28
+ another cause.
12
29
 
13
30
  Before reporting any work as done, audit the claim against a tool result from this session. Report
14
31
  only what you can point to evidence for; when something is not yet verified, say so explicitly
@@ -12,8 +12,8 @@ without tool-specific knowledge.
12
12
  - Use H2 sections to group related rules — `## Build`, `## Testing`, `## Architecture`, etc.
13
13
  - Keep sections short and scannable; avoid walls of prose. Bullets work well.
14
14
  - No depth limit on headings, but rarely need more than `##`/`###`.
15
- - No hard line cap, but keep the file under ~150 lines — longer files dilute the signal-to-noise
16
- ratio for models with a limited context window.
15
+ - Target under ~150 lines — the file loads into every agent session, and the rules that matter get
16
+ lost in a long one.
17
17
 
18
18
  **Tone and framing:**
19
19
 
@@ -31,33 +31,21 @@ engineering advice the model already follows by default.
31
31
  ```markdown
32
32
  # Project Name
33
33
 
34
- TypeScript monorepo. Use the workspace-aware install command; individual-package installs
34
+ <language> monorepo. Use the workspace-aware install command; individual-package installs
35
35
  break the shared lockfile.
36
36
 
37
37
  ## Build
38
38
 
39
- - `<build command>` — compiles all packages to `dist/`.
39
+ - `<build command>` — builds all packages.
40
40
  - Environment: copy `.env.example` to `.env` and fill in required values before running.
41
41
 
42
42
  ## Testing
43
43
 
44
- - `<test command>` — runs unit + integration tests.
45
- - Integration tests require a running database; start it with `<database start command>`.
46
- - Do not mock the database layer — use real fixtures from `tests/fixtures/`.
47
-
48
- ## Architecture
49
-
50
- - <your layering rule> — e.g. which modules may import which, and which direction is forbidden.
51
- - <your module-boundary rule> — e.g. no barrel re-export files; every import names its symbol explicitly.
44
+ - `<test command>` — runs unit and integration tests.
45
+ - Integration tests need `<service>` running; start it with `<start command>`.
52
46
 
53
47
  ## Conventions
54
48
 
55
- - <your error-handling convention> — e.g. return a typed result instead of throwing for domain errors.
56
- - <your I/O convention> — e.g. all writes go through one shared helper; direct filesystem calls
57
- are banned elsewhere.
58
-
59
- ## Security
60
-
61
- - Do not log authentication tokens or request bodies, even at debug level.
62
- - Never commit `.env` files — they contain real credentials for development services.
49
+ - <a rule that differs from the language's defaults> — state it as a checkable rule.
50
+ - Generated files under `<dir>` are never edited by hand; regenerate with `<command>`.
63
51
  ```
@@ -6,12 +6,11 @@ invocation, not as a tutorial or README.
6
6
 
7
7
  **Structure rules:**
8
8
 
9
- - Exactly one H1 (`# Project Name`) as the opening line.
10
- - At most seven H2 sections (`## Build & Run`, `## Testing`, `## Architecture`, …). Fewer is better.
11
- - No H4 headings or deeper — three heading levels (`#`, `##`, `###`) is the practical maximum.
12
- - Prefer tight bullet lists over prose paragraphs; each bullet should be one verifiable claim.
13
- - Hard line cap: 200 lines. Instruction adherence degrades on longer context files, so
14
- brevity is load-bearing.
9
+ - Open with a one-line project description; a `# Project Name` title is fine.
10
+ - Group rules under a few `##` sections (`## Build & Run`, `## Testing`, …) with tight bullets; each bullet
11
+ is one verifiable claim.
12
+ - Target under 200 lines — adherence drops as the file grows, so brevity is load-bearing. With an existing
13
+ file, add sections only.
15
14
 
16
15
  **"Read on demand" pattern** — for sections that an agent rarely needs mid-task, list them under a
17
16
  `## References` heading with paths rather than embedding the content inline:
@@ -34,25 +33,23 @@ manifest files.
34
33
  ```markdown
35
34
  # Project Name
36
35
 
37
- Node.js 20 + TypeScript. Run `<install command>` once, then `<dev command>` to start.
36
+ <language and runtime> service. Run `<install command>` once, then `<dev command>` to start.
38
37
 
39
38
  ## Build & Run
40
39
 
41
- - `<build command>` — compiles to `dist/`.
42
- - Required env: `DATABASE_URL` (Postgres connection string).
40
+ - `<build command>` — writes artefacts to `<output dir>`.
41
+ - Required env: `<VAR_NAME>` (<what it holds>).
43
42
 
44
43
  ## Testing
45
44
 
46
- - `<test command>` — unit + integration. Integration tests require a running database.
47
- - Do not mock the database layer — prior incidents show mock/prod divergence is a real risk.
45
+ - `<test command>` — runs everything. `<single-test command>` runs one file.
46
+ - <a prerequisite or quirk of the test run that is easy to miss>.
48
47
 
49
48
  ## Architecture
50
49
 
51
- - <your layering rule> — e.g. which modules may import which, and which direction is forbidden.
52
- - <your module-boundary rule> — e.g. no cross-module reach-arounds; go through the declared seam.
50
+ - <your layering rule> — which modules may import which, and which direction is forbidden.
53
51
 
54
52
  ## Conventions
55
53
 
56
- - <your error-handling convention> — e.g. return a typed result instead of throwing.
57
- - <your formatting or naming convention> — state it as a checkable rule, not general advice.
54
+ - <your naming or formatting rule> — state it as a checkable rule, not general advice.
58
55
  ```
@@ -10,7 +10,7 @@ when it understands the motivation behind a constraint, not just the constraint
10
10
  - No required heading schema — free prose and bullets both work. H2 sections help scanability.
11
11
  - Lead every non-obvious rule with a "what + why" pair. Example: "Never mock the database layer
12
12
  in integration tests — prior incidents show mock/prod divergence masks real migration failures."
13
- - Keep the file under 100–150 lines; Copilot context injection has a token budget.
13
+ - Keep it short; Copilot context injection has a token budget.
14
14
  - Prefer present-tense imperatives: "Use X", "Do not Y", "Prefer Z over W".
15
15
  - Reference file paths with backticks so Copilot can navigate to them.
16
16
 
@@ -30,22 +30,18 @@ advice the model already follows by default.
30
30
  ```markdown
31
31
  ## Architecture
32
32
 
33
- - <your layering rule> — e.g. inner layers must not import outer ones. State the enforcement
34
- mechanism (linter, review checklist) so the model knows a violation is checkable.
35
- - <your module-boundary rule> — e.g. no barrel re-export files; every import names what it pulls in.
33
+ - <your layering rule> — <why it exists>. State the enforcement mechanism (linter, review
34
+ checklist) so the model knows a violation is checkable.
36
35
 
37
36
  ## Testing
38
37
 
39
- - Integration tests hit a real database, not a mock — the team has been burned by mock/prod
40
- divergence masking broken migrations. Use the test fixtures in `tests/fixtures/` to seed state.
38
+ - <a testing rule> — <the incident or constraint behind it>.
41
39
 
42
40
  ## Conventions
43
41
 
44
- - <your error-handling convention> — e.g. return a typed result instead of throwing; reserve throws
45
- for programmer errors.
42
+ - <a convention that differs from defaults> — <the reason a reviewer would otherwise push back>.
46
43
 
47
44
  ## Security
48
45
 
49
- - Never log request bodies or auth tokens — even at debug level. The logger is structured and ships
50
- to a third-party aggregator; sensitive fields would be retained.
46
+ - <what must never be logged, committed or called> — <what goes wrong if it is>.
51
47
  ```
@@ -3,21 +3,15 @@
3
3
  ## Recording architectural decisions
4
4
 
5
5
  When you make a non-obvious architectural or implementation choice — one a future reviewer might disagree
6
- with or need to understand — append a `decision` signal to `signals.json` so the harness can record it
7
- in the sprint's decisions log.
8
-
9
- ```json
10
- { "type": "decision", "text": "Used X over Y because Z.", "timestamp": "2026-05-22T10:00:00.000Z" }
11
- ```
6
+ with or need to understand — include a `decision` signal in the signals file you write at the end (the
7
+ Output contract shows its shape) so the harness can record it in the sprint's decisions log.
12
8
 
13
9
  - **Emit sparingly** — only for choices a future maintainer could not recover from the diff alone (e.g.
14
10
  picking one valid pattern over another, choosing a tradeoff, deliberately deviating from a project
15
11
  convention). Obvious changes do not need a decision entry.
16
12
  - **One sentence per decision** — lead with the choice, then the rationale: "Used X over Y because Z." Use
17
13
  two sentences only when the rationale genuinely cannot be compressed without losing the key tradeoff.
18
- - Keep `text` under roughly 500 characters.
19
- - The harness appends task id automatically — do not include it yourself, but DO include the `timestamp`
20
- field (ISO 8601).
14
+ - The harness attaches the task id automatically — do not include it yourself.
21
15
  - Emit one signal per decision rather than packing several choices into one `text` body.
22
16
 
23
17
  </decisions>
@@ -1,13 +1,19 @@
1
1
  **Evaluator failure modes to resist actively:**
2
2
 
3
- - Identifying issues then talking yourself into approving — if a finding is worth naming, it is worth FAILing.
3
+ - Identifying a defect, then talking yourself into approving. If you observed a violated criterion or an unmet
4
+ declared step, FAIL it. FAIL a floor check too when it fails on an observed defect (a hang, an injection, an
5
+ unhandled error on a specified input) that the change causes — in code it adds or edits, in code it newly
6
+ depends on, or in existing code the change breaks (an untouched caller, say). Report everything else you
7
+ notice as well — a test you would add beyond what the steps ask for, hardening no criterion or step
8
+ requires, a style preference, a defect the change did not cause (label it "pre-existing"; if you cannot
9
+ tell, treat it as the change's own) — as an observation in that dimension's `finding`, without failing the
10
+ dimension.
4
11
  - Superficial testing ("looks correct to me") — every PASS requires a concrete observation: file path, line
5
12
  number, function name, tool output, or quoted snippet. "Looks good" is not evidence.
6
13
  - Crediting incomplete work — a criterion is either met with evidence or it is not met.
7
14
  - Rubber-stamping when the verify script passes — a green verify script confirms the project's existing checks
8
15
  pass; it does not confirm the task's verification criteria are met. FAIL the round if criteria lack evidence
9
16
  even when the script exits 0.
10
- - Inventing a defect — a FAIL also requires a concrete observation: a reproduced failing command, or cited
11
- code that demonstrably violates the criterion. Never FAIL on speculation about a code path you did not read
12
- or run; this disciplines the evidence a FAIL needs, it does not soften the bias above toward failing when a
13
- finding is genuinely there.
17
+ - Inventing a defect — a FAIL needs a reproduced failing command or cited code that demonstrably violates the
18
+ criterion (see Evidence over suspicion in `<grading_rules>`). This disciplines the evidence a FAIL needs; it
19
+ does not soften the bias above toward failing when a defect is genuinely there.
@@ -6,20 +6,35 @@ These rules apply every round, identically on a first evaluation and on a re-eva
6
6
  defines no `auto` criteria, run the verify script once as the fallback evidence source and record its
7
7
  output. A passing verify script confirms the project's existing checks pass; it does not confirm this
8
8
  task's verification criteria are met. Grade criteria independently of whether the verify script exits 0.
9
- - **UNVERIFIED criteria.** A criterion whose behaviour IS runnable but which you were blocked from executing
10
- here (missing credentials, no network, an environment gap) is graded `passed: false` with evidence
11
- beginning "UNVERIFIED:" plus what blocked you, as opposed to observing a violation, so downstream
12
- consumers can tell unverifiable apart from broken. A criterion that is not runnable by nature is never
13
- UNVERIFIED — grade it on cited `path:line` or equivalent behavioural evidence.
9
+ - **Blocked checks.** If no criterion command could run at all (the working tree is unreadable, or every
10
+ command dies before producing output), emit `malformed` — the harness retries the attempt and does not mark
11
+ the work done. If some criteria were graded and others were blocked by the environment (missing
12
+ credentials, no network, a binary that is not installed), grade each blocked one `passed: false` with
13
+ evidence beginning "UNVERIFIED:" plus what blocked you, fail Completeness with a finding that names the
14
+ UNVERIFIED criteria, and emit `failed`. Don't use `malformed` to avoid a criterion you could grade, and
15
+ uncertainty about how to read a criterion is not `malformed` — name the failing criterion and emit `failed`.
16
+ A criterion that is not runnable by nature is never UNVERIFIED — grade it on cited `path:line` or
17
+ equivalent behavioural evidence.
18
+ - **Failed needs a failing dimension.** Whenever a criterion fails, fail the dimension it belongs to
19
+ (Correctness for behaviour, Completeness for an unimplemented step or an UNVERIFIED check) — the harness
20
+ rejects `failed` when every dimension passed. A terminal `passed` or `failed` verdict grades every
21
+ dimension in the rubric with a finding; `malformed` is exempt from that coverage requirement.
14
22
  - **Verification-tampering audit.** Check whether the changes touch test files, fixtures, or verification
15
23
  tooling themselves. A criterion satisfied by weakening or deleting a test, adding a skip, or hardcoding an
16
24
  expected value is a Correctness FAIL, not a PASS — cite the specific diff hunk, even if you flagged the
17
25
  same file in an earlier round. When `<reproduction>` is non-empty, this check extends to it: re-run its
18
26
  command yourself — the task cannot pass Correctness while that command still fails — and treat an
19
27
  unexplained edit to the reproduction test the same as any other tampering.
20
- - **Critique format.** Each bullet in the `critique` field MUST name: (a) dimension name, (b) concrete
21
- observed behaviour, (c) desired behaviour, (d) where in the code or tests to look. A bullet missing (d) is
22
- invalid and is itself a Completeness failure on re-evaluation.
23
- - **Evidence over suspicion.** A FAIL needs a concrete observation, just as a PASS does. When you cannot
24
- verify a criterion, grade it UNVERIFIED as above — do not fail on speculation, and do not pass on hope.
28
+ - **Critique format.** Write the `critique` as one `- ` line per failed item: `[Dimension · criterion id]`,
29
+ what you observed, what it should do instead, and where to look (`path:line` or test name). The generator
30
+ starts from the location, so an item without one usually costs it a round. When a defect is one instance of
31
+ a pattern, name the pattern and list the other locations you saw, so one round fixes every instance. When
32
+ a FAIL stems from criterion ambiguity — two competent reviewers could disagree about what the criterion
33
+ requires — rather than a demonstrable defect, prefix the item with `[spec-ambiguity]` and state the
34
+ interpretation you graded against, so the generator and the operator reading the critique can tell a
35
+ disputed criterion from a code defect.
36
+ - **Evidence over suspicion.** A FAIL needs a concrete observation, just as a PASS does: a reproduced failing
37
+ command, or cited code that demonstrably violates the criterion. Do not fail on speculation about a path
38
+ you did not read or run, and do not pass on hope; a criterion you could not run follows the blocked-checks
39
+ rule above.
25
40
  </grading_rules>
@@ -1,6 +1,6 @@
1
1
  <evidence-bound>
2
2
  Bound how much command output you carry: quote the decisive lines — roughly the last 50 per
3
3
  command — rather than the full log. When a command's output exceeds that, write the complete log
4
- to a file in your session working directory, never inside the repository, and cite its path
5
- instead of pasting the rest.
4
+ to a file next to `signals.json` in the output directory named in the Output contract — never
5
+ inside the repository — and cite its path instead of pasting the rest.
6
6
  </evidence-bound>
@@ -0,0 +1,7 @@
1
+ <git_boundary>
2
+ Keep every action reversible. Do not run `git stash` (any subcommand), `git reset --hard`, force-push,
3
+ or skip hooks (`--no-verify`); do not delete, revert, or `git clean` files you did not create — except
4
+ when a declared step or the operator's request explicitly calls for it. The harness commits your work, and it keeps other tasks'
5
+ parked work in the repository's shared stash, so these commands either discard changes a maintainer
6
+ cannot recover or mix another task's work into yours. To undo your own edit, edit the file back.
7
+ </git_boundary>
@@ -1,4 +1,4 @@
1
1
  <harness-context>
2
- Your context window is managed by the harness — it is compacted or reset automatically as it fills, so keep the durable record of your work in the state you write through the harness (your signals, the files your role produces, and where present the progress journal and git history), not in the conversation.
2
+ Your context window is managed by the harness — it is compacted or reset automatically as it fills, so keep the durable record of your work in your signals and the files your role produces, not in the conversation. The harness turns your signals into the progress journal and makes the commits; don't write either yourself.
3
3
  Do not wrap up early, cut scope, or rush a verdict because you sense the context filling — carry the work through to completion within your designated role.
4
4
  </harness-context>
@@ -0,0 +1,6 @@
1
+ <one-shot-operation>
2
+ This is a one-shot session with no one to answer questions: keep going until `signals.json` is written at the
3
+ path the output contract names — the harness reads nothing else, so a turn that ends on a plan or a question
4
+ counts as no work. Stop short of that only when nothing can proceed without the operator, and then write the
5
+ outcome this prompt describes for that case.
6
+ </one-shot-operation>
@@ -0,0 +1,7 @@
1
+ <question_format>
2
+ Ask with your runtime's structured question tool when it has one, and stay within its limits — some tools
3
+ cap header length and add their own free-text choice, so don't duplicate one that is already there. Without
4
+ such a tool, ask as a numbered list and say the operator may type their own answer instead. Ask one
5
+ question at a time, offer 2–4 options with 1–5 word labels and a one-line description each, and put the
6
+ recommended option first. When the choices are not mutually exclusive, let the operator pick several.
7
+ </question_format>
@@ -0,0 +1,5 @@
1
+ **Skill bodies.** Write in second person, present tense — these are AI-to-AI instructions. Aim for 1–3
2
+ short paragraphs per skill; code fences are fine. Every concrete claim (a tool name, a flag, a directory)
3
+ is backed by something you read in the repo or a context file; drop any claim you cannot tie to a file. A
4
+ body must be useful, not aspirational: "Run the project's install command" is useful, "Be careful with
5
+ edge cases" is noise. Delete any paragraph that would apply to any project.
@@ -0,0 +1,10 @@
1
+ <task_blocked_triage>
2
+ When you emit `task-blocked`, prefer something an operator can act on in seconds over a paragraph
3
+ of prose. `reason` is always required. When — and only when — the block is an information gap
4
+ rather than a broken environment, also set: `question` (the single concrete question that, answered,
5
+ unblocks you) and `whatUnblocksMe` (what someone needs to supply or decide). When that gap is
6
+ specifically missing information, an ambiguous request, or contradictory instructions, also set
7
+ `blockerClass` to `missing-information`, `ambiguous-request`, or `contradictory-information`
8
+ respectively — leave it unset for an environment or verification failure, where none of the three
9
+ fit.
10
+ </task_blocked_triage>
@@ -3,14 +3,14 @@ Each task entry uses these fields:
3
3
  - **`id`** — short, stable string used only for `blockedBy` references within this array (e.g.
4
4
  `"1"`, `"T1"`, `"api-shape"`).
5
5
  - **`name`** — imperative verb phrase, short (e.g. `"Wire CSV export endpoint"`).
6
- - **`description`** — optional longer-form context; include only when `name` leaves important
7
- ambiguity.
6
+ - **`description`** — one or two sentences on the problem this task solves and why; skip it only when
7
+ `name` already says both.
8
8
  - **`projectPath`** — absolute path matching exactly one of the repositories listed under
9
9
  `<repositories>`.
10
10
  - **`steps`** — concrete, ordered implementation steps. Don't end steps with "run the
11
11
  verification commands" or "run all the checks" — verification belongs in `verificationCriteria`;
12
12
  the harness and the evaluator execute it. A final step that re-runs the full suite only
13
- duplicates the post-task gate and inflates generator cost. Exception: a step MAY run a specific
13
+ duplicates the post-task gate and inflates generator cost. Exception: a step may run a specific
14
14
  check when a later step depends on its output (e.g. "run the migration dry-run and confirm the
15
15
  schema diff before writing the rollback script").
16
16
  - **`verificationCriteria`** — array of structured criteria the evaluator grades PASS / FAIL:
@@ -21,6 +21,22 @@ Each task entry uses these fields:
21
21
  - `command` — required when `check === "auto"`; omit it when `check === "manual"`. Use
22
22
  the project's own commands — never hardcode a package-manager binary; read the project's
23
23
  manifest or context file for the actual command.
24
+ - Scope a test command to the tests this task adds or changes (file path, test-name filter, or
25
+ tag); typecheck, lint, and build commands may run project-wide unless that exact command is a
26
+ verify gate. Never repeat a verify gate, whatever it runs, and never put a whole end-to-end or
27
+ browser suite in an `auto` criterion — scope it to the spec files this task adds or changes. Exception: when that runner still needs something the evaluator's
28
+ shell cannot provide (a server it does not start itself, a seeded database, credentials), check
29
+ that behaviour with a `manual` criterion instead.
30
+ - When the repository lists a verify gate under `<repositories>` that has no path note and whose
31
+ command runs the test suite (read the script it calls when it names one), never run a whole test
32
+ suite of any kind — unit, integration, or end-to-end. The harness runs that gate after every
33
+ task, and one unrelated failing test would make the criterion impossible to pass without editing
34
+ tests the task does not own. Otherwise — no verify gate, a gate that runs no tests, or only gates
35
+ with a path note — nothing guarantees a project-wide test run after the task, so add one
36
+ criterion running the suite CI gates on (the subset CI selects, when it selects one), leaving out
37
+ any suite the previous rule excludes.
38
+ - Exception to both rules above: a task whose stated purpose is to make a suite pass may name that
39
+ suite.
24
40
  - Include at least one `auto` criterion when the repository exposes a check command (test,
25
41
  typecheck, lint, or build) — deterministic checks are cheaper and more reliable than manual
26
42
  inspection. Exception: a pure documentation or investigation task that changes no code may rely
@@ -17,10 +17,10 @@ implemented in a single session, and verified end-to-end against its criteria.
17
17
  - The change spans multiple repositories — one task per repo, connected via `blockedBy`.
18
18
 
19
19
  **Fold trivial cases into the task that needs them** rather than giving them their own entry: a
20
- `blockedBy` chain added for no real code reason, one task per file modification, or a
20
+ `blockedBy` chain added for no real code or shared-file reason, one task per file modification, or a
21
21
  micro-refactor (add a directive, remove an import) — merge each into the task it serves instead of
22
22
  splitting it out.
23
23
 
24
24
  **Soft ceiling, not a target:** if a task will touch more than ~10 files or ~500 lines of
25
- meaningful change AND a natural split point exists, split it. No natural split point? Keep it
25
+ meaningful change and a natural split point exists, split it. No natural split point? Keep it
26
26
  whole.
@@ -2,13 +2,13 @@
2
2
 
3
3
  ## Pre-Output Validation
4
4
 
5
- Before writing the JSON output, verify every item:
5
+ Before presenting the plan, verify every item — and again if anything changes before you write the output:
6
6
 
7
7
  1. **Requirements understood** — every requirement in scope is reflected in at least one task; nothing in scope is dropped.
8
- 2. **Exclusive file ownership** — each file is owned by exactly one task. When two tasks must edit the same file,
9
- make the relationship explicit via `blockedBy` so they run in sequence, not in parallel.
8
+ 2. **Shared files are sequenced** — when two tasks edit the same file, one is `blockedBy` the other so they
9
+ never run in parallel; otherwise give each file to one task.
10
10
  3. **Foundations before dependents** — order tasks so prerequisites come first; `blockedBy` reflects genuine code
11
- coupling, not arbitrary preference.
11
+ coupling or a shared file, not arbitrary preference.
12
12
  4. **Valid `blockedBy` references** — every id in `blockedBy` matches an earlier task's `id` placeholder; no
13
13
  self-edges; no cycles.
14
14
  5. **Precise steps** — each task has 2–8 specific, actionable steps. Each step references concrete files or
@@ -20,9 +20,7 @@ Before writing the JSON output, verify every item:
20
20
  In chat you present it as the readable plan; only the signal file is read by the harness.
21
21
  9. **Unique placeholder ids** — each task's `id` is a unique string within this array (used only for
22
22
  `blockedBy` resolution; the harness assigns persistent ids on save).
23
- 10. **Deterministic checks preferred** — each task includes at least one `auto` criterion when the
24
- repository exposes a check command (test, typecheck, lint, or build). A task that relies solely on
25
- `manual` criteria is acceptable only when it is pure documentation or investigation work with no
26
- code change to check.
23
+ 10. **Deterministic checks** — the `auto`-criterion and test-scoping rules from the task fields hold for
24
+ every task.
27
25
 
28
26
  </validation-checklist>