sphica 0.6.34 → 0.6.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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/db/migrations/0011.sql +26 -0
- package/db/schema.sql +16 -2
- package/dist/capture.js +3 -1
- package/dist/cli.js +5 -57
- package/dist/deliver.js +8 -4
- package/dist/mcp-record.js +74 -71
- package/dist/mcp.js +455 -199
- package/package.json +1 -1
- package/skills/review/SKILL.md +2 -2
- package/skills/review/reviewers/precedent.md +18 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sphica",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.36",
|
|
4
4
|
"description": "Records Claude Code and Codex sessions on your machine and keeps past implementation and decisions, with their sources, for your agent to find.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
package/skills/review/SKILL.md
CHANGED
|
@@ -149,7 +149,7 @@ Layer 5 and "patterns the surrounding code already follows" remain, so the revie
|
|
|
149
149
|
|---|---|---|
|
|
150
150
|
| MCP does not connect, the database is unreachable, or the project is not registered | The tool call fails, or says "not checked" | **`unable`** + the reason it gave |
|
|
151
151
|
| Checked, and no record applies | "No active record applies" | **`ran`**. A grounded negative |
|
|
152
|
-
| Checked, and records apply | The
|
|
152
|
+
| Checked, and records apply | The first batch of records (`Batch 1 of n`, 50 at most) | Pass the change to the `precedent` aspect; it walks every batch |
|
|
153
153
|
|
|
154
154
|
## Step 3 — Start the reviewers
|
|
155
155
|
|
|
@@ -311,6 +311,7 @@ The launcher compares it with the lane name and model in the launch plan and wit
|
|
|
311
311
|
- `findings` does not match the number listed
|
|
312
312
|
- There are 2 or more such lines
|
|
313
313
|
- `coverage=COMPLETE` but `unfinished` is not empty
|
|
314
|
+
- Past decisions: its `Batch k of n backed (selection ...).` lines miss a batch from 1 to n, repeat one, pass `n`, or differ in `n` or `selection`
|
|
314
315
|
|
|
315
316
|
**Do not write causes you did not observe.** Whether it hit a limit, lost the connection, or forgot to write the line
|
|
316
317
|
is unknown unless the log shows it. **`UNKNOWN` means "could not observe", not "did not check".**
|
|
@@ -348,7 +349,6 @@ There are 3 verdicts. **`PLAUSIBLE` is the default.**
|
|
|
348
349
|
The cost of `PLAUSIBLE` is one unverified label left behind; **the cost of a wrong `REFUTED` is a real defect
|
|
349
350
|
disappearing, dressed up as having been ruled on.**
|
|
350
351
|
|
|
351
|
-
|
|
352
352
|
**When Codex is available, assign refutation to the other model.** Codex refutes Claude's findings, and
|
|
353
353
|
Claude refutes Codex's. For findings from both, prefer a decisive reproduction.
|
|
354
354
|
**If validators disagree, do not make them debate to agreement; mark it `needs_human`.**
|
|
@@ -32,15 +32,22 @@ Pass the diff under review and the root of the repository under review (`cwd`) t
|
|
|
32
32
|
|---|---|---|
|
|
33
33
|
| The tool call fails, or it says "Decision lane: not checked" | MCP does not connect, the database is unreachable, or the project is not registered | **`blocked_unknown`** + the reason it gave |
|
|
34
34
|
| "Decision lane: checked" with no record | No active record applies | Continue to Step 3; 0 records may be treated as a **grounded negative** |
|
|
35
|
-
| "Decision lane: checked" with records | Each record
|
|
35
|
+
| "Decision lane: checked" with records | One batch of at most 50 records, `Batch k of n`, and a `selection`. Each record says why it applies (anchored to a changed path, or an added line names an option it rejected); an AI's decision is marked `decided by an AI` | Continue |
|
|
36
36
|
|
|
37
37
|
**When returning `blocked_unknown`, state concretely what was missing.** Silently returning 0 results makes the caller read it as "no findings".
|
|
38
38
|
**This step is deterministic and can claim coverage.** It selects only active records; candidates and superseded records never apply.
|
|
39
39
|
|
|
40
|
+
**Records come 50 at a time.** Take the batches one after another: Steps 2 and 4 and "Check your verdicts" for one batch,
|
|
41
|
+
then `review_select` again with the `after` it names, until it says "This is the last batch". Keep the `selection` of the first batch:
|
|
42
|
+
every later batch and check must show the same one. A check that says the records changed means starting again from the first batch.
|
|
43
|
+
**A check that passes speaks for its batch only.** It never covers a batch you did not check.
|
|
44
|
+
Changes to the working tree between batches (which code locations still exist) are not detected; review a tree that does not change.
|
|
45
|
+
|
|
40
46
|
## Step 2 — Read every selected record
|
|
41
47
|
|
|
42
48
|
`read([keys], cwd)` returns each record's text, its options, the exact words cited as evidence and adoption with who said them, what it
|
|
43
49
|
superseded or conflicts with, and each code location checked in the working tree now. **Judge from this body, never from the key or the one line.**
|
|
50
|
+
When a reply says some refs were not read or a record continues, call `read` again with exactly what it names until nothing is left.
|
|
44
51
|
|
|
45
52
|
## Step 3 — Search by the approach's meaning
|
|
46
53
|
|
|
@@ -97,9 +104,11 @@ Then always check the following.
|
|
|
97
104
|
|
|
98
105
|
## Check your verdicts
|
|
99
106
|
|
|
100
|
-
|
|
101
|
-
`undetermined`), `unit` (the record key), `reason`, and for a
|
|
102
|
-
|
|
107
|
+
For each batch, pass your verdicts to `review_check(diff, findings, after, selection, cwd)` with the batch's `after` (none for the first) and the
|
|
108
|
+
`selection`: each finding is `outcome` (`violation`, `complies`, `unrelated`, `undetermined`), `unit` (the record key), `reason`, and for a
|
|
109
|
+
violation or compliance, `evidence` (the changed path and the added line number; for a deleted or renamed-away file, the path alone).
|
|
110
|
+
Give every record of the batch exactly one finding: when a record is violated in several places, list every place it is violated in that finding's evidence.
|
|
111
|
+
Fix what it reports and check again. A verdict it rejects is not a finding. Keep each line it returns as `Batch k of n backed (selection ...).`
|
|
103
112
|
|
|
104
113
|
## Output
|
|
105
114
|
|
|
@@ -111,10 +120,15 @@ Give every record `review_select` returned exactly one outcome (several violatio
|
|
|
111
120
|
verdict: pass | changes_required | blocked_unknown
|
|
112
121
|
findings: <count>
|
|
113
122
|
questions searched: <count> (of which returned 0: <count>)
|
|
123
|
+
Batch 1 of <n> backed (selection <selection>).
|
|
124
|
+
Batch 2 of <n> backed (selection <selection>).
|
|
114
125
|
1. [severity] file:line — one-line summary
|
|
115
126
|
2. ...
|
|
116
127
|
```
|
|
117
128
|
|
|
129
|
+
Write one `Batch k of n backed (selection ...).` line for every batch `review_check` passed: the first sentence of its reply, as it is. **Without a line for every batch from 1 to n, the verdict is `blocked_unknown`**, never `pass`.
|
|
130
|
+
With no record selected there are no batch lines.
|
|
131
|
+
|
|
118
132
|
**Never shorten or cut off the list. Give every finding.**
|
|
119
133
|
|
|
120
134
|
### Full text (when numbers are requested)
|