@jesdi/skills 0.0.35 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jesdi/skills",
3
- "version": "0.0.35",
3
+ "version": "0.0.36",
4
4
  "description": "jesdi's agent skills (content package consumed by @jesdi/skills-cli)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -174,8 +174,8 @@ Every report has `status` (`DONE`, `DONE_WITH_CONCERNS`, `NEEDS_CONTEXT`, `BLOCK
174
174
  |---|---|---|---|
175
175
  | test-writer | `prompts/test-writer.md` | `locked` (paths), `red` (`test`, `line`) | With DONE: one commit, one locked file and one red line or more. Each locked path is in a commit that the role made. Each `line` is in the log. A locked file of a merged ticket that the role changed is in `locked`. |
176
176
  | implementer | `prompts/implementer.md` | `green` | With DONE: one commit or more. |
177
- | reviewer | `prompts/reviewer.md` | `findings` (`severity`, `file`, `line`, `title`, `evidence`, `kind`), `mutations` (`test`, `file`, `line`, `red`) | In the first review of a tip: `mutations` is required, with a proof for each locked test file. Each `red` is in the log. |
178
- | correctness | `prompts/correctness.md` | the same as the reviewer | `mutations` is optional. |
177
+ | reviewer | `prompts/reviewer.md` | `findings` (`severity`, `file`, `line`, `title`, `evidence`, `kind`), `mutations` (`test`, `file`, `line`, `red`); `commits` is empty | In the first review of a tip: `mutations` is required, with a proof for each locked test file (`test` is `<locked file>::<test name>`). Each `red` is in the log. |
178
+ | correctness | `prompts/correctness.md` | the same as the reviewer; `commits` is empty | `mutations` is optional. |
179
179
  | fixer | `prompts/fixer.md` | `green`, `ticket` | With DONE: one commit or more. |
180
180
  | final-reviewer | `prompts/final-reviewer.md` | `findings` | None. |
181
181
  | pr-writer | `prompts/pr-writer.md` | `body`; `commits` is empty | None. |
@@ -214,6 +214,6 @@ The driver enforces the mutation proof for each locked test file, not for each l
214
214
 
215
215
  - **A `codex` agent cannot commit.** A role that commits (test-writer, implementer, fixer, conflict) on an `openai` entry runs with `--sandbox workspace-write`, and that sandbox cannot run `git commit`. In the default `models.json` this is the second implementer entry, so fix rounds 3 and 4 fail. What to do: give a `--models` file with no `openai` entry in the `implementer`, `test-writer`, `fixer` and `conflict` lists.
216
216
  - **A `codex` reviewer cannot make a mutation proof.** A reviewer on an `openai` entry runs with `--sandbox read-only` and cannot make the temporary edit. The default `models.json` has such an entry first for the reviewer, and the first review needs the proofs. What to do: give a `--models` file whose reviewer list starts with an `anthropic` entry.
217
- - **The correctness pass reads a tree that the reviewer changes.** The two agents share one slot, and the reviewer makes temporary edits. `prompts/correctness.md` tells the pass to read from git at the reviewed commit and to run no tests. That sentence is the only guard: the driver cannot enforce it, so a pass that ignores it can report a false finding and start a fix round. What to do: when a correctness finding looks wrong, compare it with `git show <reviewed commit>:<file>` before you rule on it.
217
+ - **The correctness pass reads a tree that the reviewer changes.** The two agents share one slot, and the reviewer makes temporary edits. `prompts/correctness.md` tells the pass to read from git at the reviewed commit and to run no tests. It reads only the spec, the ticket and the findings file from the working tree, because git can lack them: `.agent/` is ignored. That rule is the only guard: the driver cannot enforce it, so a pass that ignores it can report a false finding and start a fix round. What to do: when a correctness finding looks wrong, compare it with `git show <reviewed commit>:<file>` before you rule on it.
218
218
  - **A ticket that is not merged stops the end of run.** While one ticket is BLOCKED, there is no tidy and no final review of the merged tickets.
219
219
  - **A published PR branch keeps its history.** See "End of run".
@@ -10,6 +10,7 @@ Checks: {correctness}
10
10
  Read the checks file and apply each of its checks to the diff of the range, with the Risk line of the ticket first: races, idempotency, time, authorization, persistence keys and identities, migrations, error paths.
11
11
  The output section of the checks file does not apply here: your findings go into the report.
12
12
  Read file content from git at {start_sha} (`git diff`, `git show {start_sha}:<path>`), never from the working tree, and run no tests: another agent makes temporary edits in this worktree while you work.
13
+ The one exception is the input of the driver, which git can lack because `.agent/` is ignored: read the spec, the ticket and the findings file from the working tree. The other agent does not edit them.
13
14
  Report only a defect that you can show with a concrete sequence of events. `mutations` is optional for this pass.
14
15
  Give each finding a severity (critical, important or minor), the file and line, a title, the evidence, and a kind: `code`, `test`, or `fixture` when a locked test encodes a stale path, format or setup detail.
15
16
  Do not commit and do not dispatch subagents. Leave the tree as you found it.
@@ -22,11 +23,11 @@ Write one JSON report at {report}. When your sandbox is read-only, give the JSON
22
23
  "required": ["status", "commits", "files", "concerns", "findings"],
23
24
  "properties": {
24
25
  "status": {"enum": ["DONE", "DONE_WITH_CONCERNS", "NEEDS_CONTEXT", "BLOCKED"]},
25
- "commits": {"type": "array", "items": {"type": "string", "pattern": "^[0-9a-f]{7,40}$"}},
26
+ "commits": {"description": "Only the commits you created. A review creates none, so this list is empty: never list a commit of the range.", "type": "array", "items": {"type": "string", "pattern": "^[0-9a-f]{7,40}$"}},
26
27
  "files": {"type": "array", "items": {"type": "string"}},
27
28
  "concerns": {"type": "array", "items": {"type": "string"}},
28
29
  "findings": {"type": "array", "items": {"type": "object", "required": ["severity", "file", "line", "title", "evidence", "kind"], "properties": {"severity": {"enum": ["critical", "important", "minor"]}, "file": {"type": "string"}, "line": {"type": "integer"}, "title": {"type": "string", "minLength": 1}, "evidence": {"type": "string", "minLength": 1}, "kind": {"enum": ["code", "fixture", "test"]}}}},
29
- "mutations": {"type": "array", "items": {"type": "object", "required": ["test", "file", "line", "red"], "properties": {"test": {"type": "string", "minLength": 1}, "file": {"type": "string", "minLength": 1}, "line": {"type": "integer"}, "red": {"type": "string", "minLength": 1}}}}
30
+ "mutations": {"description": "Optional for this pass.", "type": "array", "items": {"type": "object", "required": ["test", "file", "line", "red"], "properties": {"test": {"type": "string", "minLength": 1}, "file": {"type": "string", "minLength": 1}, "line": {"type": "integer"}, "red": {"type": "string", "minLength": 1}}}}
30
31
  }
31
32
  }
32
33
  ```
@@ -10,7 +10,7 @@ Test-writer report, when the ticket has a test-writer: {writer_report}
10
10
  Check the diff against the ticket and the spec, then for quality. Check that each criterion has a locked test. Test each suspicion that the ticket names in its Suspicions line.
11
11
  In round 1, for each locked test, break the production line the test protects, run the test, print its failing output, then revert the edit. A test that stays green is a critical finding. Run again each mutation that the test-writer report names in `concerns`.
12
12
  A mutation proof is keyed to its test and its production line: a later round repeats it only when that line changed.
13
- In `mutations`, give for each proof the test, the production file and line, and one failure line copied exactly from the output you printed.
13
+ In `mutations`, give for each proof the test as `<locked file>::<test name>`, the production file and line, and one failure line copied exactly from the output you printed.
14
14
  Give each finding a severity (critical, important or minor), the file and line, a title, the evidence, and a kind: `code`, `test`, or `fixture` when a locked test encodes a stale path, format or setup detail.
15
15
  Do not commit and do not dispatch subagents. Leave the tree as you found it.
16
16
 
@@ -22,11 +22,11 @@ Write one JSON report at {report}. When your sandbox is read-only, give the JSON
22
22
  "required": ["status", "commits", "files", "concerns", "findings"],
23
23
  "properties": {
24
24
  "status": {"enum": ["DONE", "DONE_WITH_CONCERNS", "NEEDS_CONTEXT", "BLOCKED"]},
25
- "commits": {"type": "array", "items": {"type": "string", "pattern": "^[0-9a-f]{7,40}$"}},
25
+ "commits": {"description": "Only the commits you created. A review creates none, so this list is empty: never list a commit of the range.", "type": "array", "items": {"type": "string", "pattern": "^[0-9a-f]{7,40}$"}},
26
26
  "files": {"type": "array", "items": {"type": "string"}},
27
27
  "concerns": {"type": "array", "items": {"type": "string"}},
28
28
  "findings": {"type": "array", "items": {"type": "object", "required": ["severity", "file", "line", "title", "evidence", "kind"], "properties": {"severity": {"enum": ["critical", "important", "minor"]}, "file": {"type": "string"}, "line": {"type": "integer"}, "title": {"type": "string", "minLength": 1}, "evidence": {"type": "string", "minLength": 1}, "kind": {"enum": ["code", "fixture", "test"]}}}},
29
- "mutations": {"type": "array", "items": {"type": "object", "required": ["test", "file", "line", "red"], "properties": {"test": {"type": "string", "minLength": 1}, "file": {"type": "string", "minLength": 1}, "line": {"type": "integer"}, "red": {"type": "string", "minLength": 1}}}}
29
+ "mutations": {"description": "Required in the first review of a tip: one proof or more for each locked test file, with `test` as `<locked file>::<test name>`. A review scoped to a fix gives the proofs that it names.", "type": "array", "items": {"type": "object", "required": ["test", "file", "line", "red"], "properties": {"test": {"type": "string", "minLength": 1}, "file": {"type": "string", "minLength": 1}, "line": {"type": "integer"}, "red": {"type": "string", "minLength": 1}}}}
30
30
  }
31
31
  }
32
32
  ```
@@ -544,6 +544,32 @@ def test_the_correctness_prompt_keeps_the_agent_off_the_tree_the_reviewer_edits(
544
544
  assert "run no tests" in text
545
545
 
546
546
 
547
+ def test_the_correctness_pass_reads_the_untracked_inputs_of_the_driver_from_the_working_tree(tmp_path):
548
+ """Issue 66: the ticket and the findings files are in the ignored .agent/, so git at the tip has none of them."""
549
+ rig = Inside(tmp_path, RISKY, {"correctness": [SOL, OPUS], "implementer": [OPUS]})
550
+ rig.run(plan(**{"02/correctness": [correct([finding("C-IMPORTANT")])], "02/fixer": [fix("02", 1)]}))
551
+ assert rig.code == 0, rig.ledger()
552
+ again = rig.prompt("correctness-1", "02")
553
+ inputs = (".agent/tickets/02-quote-fields.md", ".agent/implement/02/findings-0.json")
554
+ assert all(path in again for path in inputs), again
555
+ tracked = subprocess.run(["git", "-C", str(rig.repo), "ls-files", *inputs], capture_output=True, text=True).stdout
556
+ assert tracked == ""
557
+ assert "read the spec, the ticket and the findings file from the working tree" in again
558
+
559
+
560
+ @pytest.mark.parametrize("role", ["reviewer", "correctness"])
561
+ def test_the_schema_of_a_review_says_that_commits_holds_only_the_agents_own_commits(role):
562
+ """Issue 66: a reviewer that lists a commit of the range costs a rerun (`is not a new commit`)."""
563
+ description = driver_report.schema(role)["properties"]["commits"]["description"]
564
+ assert "only the commits you created" in description.lower() and "empty" in description
565
+
566
+
567
+ def test_the_reviewer_schema_asks_for_one_proof_for_each_locked_test_file_in_the_first_review():
568
+ """Issue 66: a first review with no proof for a locked test file costs a rerun."""
569
+ description = driver_report.schema("reviewer")["properties"]["mutations"]["description"]
570
+ assert "each locked test file" in description and "`<locked file>::<test name>`" in description
571
+
572
+
547
573
  def test_git_identity_is_not_needed_to_open_the_merge_for_the_conflict_agent(tmp_path):
548
574
  import driver_merge
549
575
  rig = Inside(tmp_path)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-10-15T17:09:44.505Z",
3
+ "generatedAt": "2026-10-15T17:11:47.113Z",
4
4
  "skills": [
5
5
  {
6
6
  "name": "backlog",
@@ -46,8 +46,8 @@
46
46
  },
47
47
  {
48
48
  "name": "implement-spec",
49
- "version": "0.1.11",
50
- "hash": "sha256-c58d05ad78d3d1ae1381c02a96f4e5ca64f6387cea2b16ac5e1997bf52767467",
49
+ "version": "0.1.12",
50
+ "hash": "sha256-d50cbfcb02b148c9f122d16333274b2d758efc8a1b35e0cf54eb831f34eba6de",
51
51
  "description": "Implement a specification in code."
52
52
  },
53
53
  {