volna-skillcheck 0.3.0__tar.gz
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.
- volna_skillcheck-0.3.0/CHANGELOG.md +26 -0
- volna_skillcheck-0.3.0/CONTRIBUTING.md +9 -0
- volna_skillcheck-0.3.0/LICENSE +21 -0
- volna_skillcheck-0.3.0/MANIFEST.in +5 -0
- volna_skillcheck-0.3.0/PKG-INFO +165 -0
- volna_skillcheck-0.3.0/README.md +146 -0
- volna_skillcheck-0.3.0/SECURITY.md +13 -0
- volna_skillcheck-0.3.0/docs/adapters.md +121 -0
- volna_skillcheck-0.3.0/docs/methodology.md +26 -0
- volna_skillcheck-0.3.0/docs/protocol.md +49 -0
- volna_skillcheck-0.3.0/docs/releasing.md +29 -0
- volna_skillcheck-0.3.0/docs/skill.md +87 -0
- volna_skillcheck-0.3.0/docs/usage.md +58 -0
- volna_skillcheck-0.3.0/docs/workflows.md +90 -0
- volna_skillcheck-0.3.0/examples/cases.json +51 -0
- volna_skillcheck-0.3.0/examples/integrations/evaluate-instructions.yml +38 -0
- volna_skillcheck-0.3.0/examples/integrations/opencode-skillcheck.md +25 -0
- volna_skillcheck-0.3.0/examples/mock_adapter.py +19 -0
- volna_skillcheck-0.3.0/examples/new.md +1 -0
- volna_skillcheck-0.3.0/examples/old.md +1 -0
- volna_skillcheck-0.3.0/pyproject.toml +39 -0
- volna_skillcheck-0.3.0/setup.cfg +4 -0
- volna_skillcheck-0.3.0/skills/volna-skillcheck/SKILL.md +33 -0
- volna_skillcheck-0.3.0/skills/volna-skillcheck/agents/openai.yaml +4 -0
- volna_skillcheck-0.3.0/skills/volna-skillcheck/references/cli.md +96 -0
- volna_skillcheck-0.3.0/tests/test_codex_adapter.py +72 -0
- volna_skillcheck-0.3.0/tests/test_extra_adapters.py +222 -0
- volna_skillcheck-0.3.0/tests/test_volna_skillcheck.py +213 -0
- volna_skillcheck-0.3.0/volna_skillcheck.egg-info/PKG-INFO +165 -0
- volna_skillcheck-0.3.0/volna_skillcheck.egg-info/SOURCES.txt +37 -0
- volna_skillcheck-0.3.0/volna_skillcheck.egg-info/dependency_links.txt +1 -0
- volna_skillcheck-0.3.0/volna_skillcheck.egg-info/entry_points.txt +6 -0
- volna_skillcheck-0.3.0/volna_skillcheck.egg-info/top_level.txt +6 -0
- volna_skillcheck-0.3.0/volna_skillcheck.py +310 -0
- volna_skillcheck-0.3.0/volna_skillcheck_adapter.py +78 -0
- volna_skillcheck-0.3.0/volna_skillcheck_claude.py +44 -0
- volna_skillcheck-0.3.0/volna_skillcheck_codex.py +78 -0
- volna_skillcheck-0.3.0/volna_skillcheck_openai.py +99 -0
- volna_skillcheck-0.3.0/volna_skillcheck_opencode.py +71 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.3.0 — 2026-11-01
|
|
4
|
+
|
|
5
|
+
- Add the portable `volna-skillcheck` agent skill with five-case defaults, existing-provider selection, bounded evaluation, and evidence review.
|
|
6
|
+
- Document installation through `npx skills` for OpenCode, Codex, Claude Code, and other compatible harnesses, plus manual installation.
|
|
7
|
+
- Add PyPI Trusted Publishing from tagged GitHub releases, with separate build and publish jobs and no stored publishing token.
|
|
8
|
+
- Put PyPI and skill installation first in the README; use absolute documentation links for the PyPI project page.
|
|
9
|
+
|
|
10
|
+
## 0.2.0 — 2026-11-01
|
|
11
|
+
|
|
12
|
+
- Add OpenCode V2, Claude Code, and OpenAI-compatible Chat Completions adapters.
|
|
13
|
+
- Share the generation/judge prompts and response validation across bundled adapters.
|
|
14
|
+
- Validate API responses, refuse credential-bearing redirects, and support local endpoints.
|
|
15
|
+
- Rewrite the README around a quick start and provider choice; add agent workflows, an OpenCode command template, and a manual CI example.
|
|
16
|
+
- OpenCode is live-tested; Claude Code is fixture-tested and hosted API compatibility remains unverified.
|
|
17
|
+
|
|
18
|
+
## 0.1.0 — 2026-11-01
|
|
19
|
+
|
|
20
|
+
- Installable Python CLI and authenticated Codex CLI adapter; no Python runtime dependencies.
|
|
21
|
+
- Swapped blind judgments, explicit abstention, repeated trials, distinct-case evidence threshold, and literal answer checks.
|
|
22
|
+
- Schema 2 reports with input provenance, model metadata, incremental atomic checkpoints, and private file permissions.
|
|
23
|
+
- Strict suite validation, bounded adapter output, process-group timeouts, and interruption handling.
|
|
24
|
+
- Eight synthetic scenarios with baseline success controls, offline tests, CI, and MIT licensing.
|
|
25
|
+
|
|
26
|
+
The original unversioned prototype used schema 1. No compatibility with its report rows is promised.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Keep the core small and provider-independent. Use Python's standard library unless a dependency substantially simplifies a necessary feature. Preserve error handling, evidence, and conservative verdicts when changing the evaluation flow.
|
|
4
|
+
|
|
5
|
+
Run `python3 -m unittest discover -s tests -v`. Tests must be offline, deterministic, and not depend on local credentials. Include a regression test for behavior changes. CLI changes must be tested through a subprocess, including exit codes. Protocol or report changes require documentation and, for incompatible report changes, a schema version increment.
|
|
6
|
+
|
|
7
|
+
New cases should be synthetic or explicitly cleared for publication. Include a meaningful criterion and positive controls where applicable. Never add real conversations, customer data, access tokens, live identifiers, or private tool transcripts. Literal checks should test actual requirements rather than a preferred writing style.
|
|
8
|
+
|
|
9
|
+
For provider adapters, test protocol handling with a fake provider and run a small live smoke test before claiming compatibility. Record the tested provider/CLI version and limitations. Do not commit live reports. Contributions are provided under the project's MIT license.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 volna-skillcheck contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: volna-skillcheck
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Blind comparison of agent instruction revisions on recorded cases
|
|
5
|
+
Author: volna-skillcheck contributors
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/vladzima/volna-skillcheck
|
|
8
|
+
Project-URL: Repository, https://github.com/vladzima/volna-skillcheck
|
|
9
|
+
Project-URL: Issues, https://github.com/vladzima/volna-skillcheck/issues
|
|
10
|
+
Keywords: agents,evaluation,skills,regression-testing
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Operating System :: POSIX
|
|
14
|
+
Classifier: Topic :: Software Development :: Testing
|
|
15
|
+
Requires-Python: >=3.10
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE
|
|
18
|
+
Dynamic: license-file
|
|
19
|
+
|
|
20
|
+
# volna-skillcheck
|
|
21
|
+
|
|
22
|
+
### Did that new agent rule actually help?
|
|
23
|
+
|
|
24
|
+
You add “verify the result before saying done” after an agent gets something wrong. It sounds sensible—but does it fix the failure? Does it make the agent needlessly hesitant on tasks it already handled well?
|
|
25
|
+
|
|
26
|
+
**volna-skillcheck compares the old and new instructions on the same recorded tasks.** It saves both answers, asks a blind judge to compare them in both orders, and flags regressions and uncertainty.
|
|
27
|
+
|
|
28
|
+
Use it before changing a `SKILL.md`, `AGENTS.md`, `CLAUDE.md`, or an agent's system prompt.
|
|
29
|
+
|
|
30
|
+
[Install the skill](#install-the-skill) · [Use the CLI](#quick-start) · [Choose an adapter](#choose-an-adapter) · [How judging works](https://github.com/vladzima/volna-skillcheck/blob/main/docs/methodology.md)
|
|
31
|
+
|
|
32
|
+
Python 3.10+ · Linux and macOS · MIT · No Python runtime dependencies
|
|
33
|
+
|
|
34
|
+
## Install the skill
|
|
35
|
+
|
|
36
|
+
The easiest way to start is to let your agent prepare and run the comparison. Install the CLI, then add the skill to your harness:
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
uv tool install volna-skillcheck
|
|
40
|
+
npx skills add vladzima/volna-skillcheck --skill volna-skillcheck
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
The installer lets you choose OpenCode, Codex, Claude Code, or another supported harness. It installs into the current project by default; add `-g` for all projects. Node.js is needed for this installer; a [manual copy works too](https://github.com/vladzima/volna-skillcheck/blob/main/docs/skill.md).
|
|
44
|
+
|
|
45
|
+
Then ask your agent:
|
|
46
|
+
|
|
47
|
+
> Use volna-skillcheck to check my SKILL.md edit against its previous version. Use my current provider and model, and show me any regressions.
|
|
48
|
+
|
|
49
|
+
The skill snapshots the two versions, prepares five representative cases, runs one trial per case, and explains the saved evidence. It reuses your existing provider where possible and asks if the model is unknown. A default run takes up to 20 adapter calls; it does not automatically change the tested skill or retry paid calls.
|
|
50
|
+
|
|
51
|
+
**OpenCode shortcut:** `npx skills add vladzima/volna-skillcheck --skill volna-skillcheck -a opencode -g`. Then mention `@volna-skillcheck` in OpenCode V2. [Installation, defaults, and invocation examples →](https://github.com/vladzima/volna-skillcheck/blob/main/docs/skill.md)
|
|
52
|
+
|
|
53
|
+
## Quick start
|
|
54
|
+
|
|
55
|
+
Prefer running the CLI yourself? Install from [PyPI](https://pypi.org/project/volna-skillcheck/):
|
|
56
|
+
|
|
57
|
+
```sh
|
|
58
|
+
uv tool install volna-skillcheck
|
|
59
|
+
# Or: pipx install volna-skillcheck
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
With plain Python, use a virtual environment:
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
python3 -m venv .venv
|
|
66
|
+
. .venv/bin/activate
|
|
67
|
+
python -m pip install volna-skillcheck
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Try the offline example.** No account or API key needed. Clone the repository to get the example files:
|
|
71
|
+
|
|
72
|
+
```sh
|
|
73
|
+
git clone https://github.com/vladzima/volna-skillcheck.git
|
|
74
|
+
cd volna-skillcheck
|
|
75
|
+
volna-skillcheck \
|
|
76
|
+
--old examples/old.md --new examples/new.md \
|
|
77
|
+
--cases examples/cases.json \
|
|
78
|
+
--adapter "python examples/mock_adapter.py" \
|
|
79
|
+
--out reports/demo.json
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The fixture produces **6 wins, 2 ties, and no regressions**. Swap `--old` and `--new` and use a new output path to see a regression. This is a hardcoded demo of the tool, not evidence of model quality.
|
|
83
|
+
|
|
84
|
+
## Choose an adapter
|
|
85
|
+
|
|
86
|
+
Keep the same command and replace `--adapter`:
|
|
87
|
+
|
|
88
|
+
| Run through | Adapter command | Setup / verification |
|
|
89
|
+
| --- | --- | --- |
|
|
90
|
+
| **OpenCode** | `volna-skillcheck-opencode --model PROVIDER/MODEL` | Existing login; requires V2 ≥2.2.3; live-tested on 2.2.5 |
|
|
91
|
+
| **Codex** | `volna-skillcheck-codex --model MODEL` | Existing login; live-tested on 0.166.0 |
|
|
92
|
+
| **OpenAI-compatible API** | `volna-skillcheck-openai --model MODEL` | `OPENAI_API_KEY`; configurable endpoint; tested with a local HTTP server |
|
|
93
|
+
| **Claude Code** | `volna-skillcheck-claude --model MODEL` | Existing installation/login; fixture-tested, **not live-verified** |
|
|
94
|
+
|
|
95
|
+
For example, with an OpenCode model available in `opencode models`:
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
volna-skillcheck \
|
|
99
|
+
--old examples/old.md --new examples/new.md \
|
|
100
|
+
--cases examples/cases.json \
|
|
101
|
+
--adapter "volna-skillcheck-opencode --model openai/gpt-6-astra#high" \
|
|
102
|
+
--out reports/opencode.json
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
The example model must be available to your account. See the [adapter setup guide](https://github.com/vladzima/volna-skillcheck/blob/main/docs/adapters.md) for API endpoints, Claude requirements, separate judge models, timeouts, and isolation details.
|
|
106
|
+
|
|
107
|
+
## Try your own instruction change
|
|
108
|
+
|
|
109
|
+
You need three things:
|
|
110
|
+
|
|
111
|
+
1. **The old and new instructions** as two text files.
|
|
112
|
+
2. **A few representative tasks**, with the evidence the agent had at the time.
|
|
113
|
+
3. **A criterion** describing what a good answer should do.
|
|
114
|
+
|
|
115
|
+
A case looks like this:
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
[
|
|
119
|
+
{
|
|
120
|
+
"id": "export-status",
|
|
121
|
+
"input": "Is the export ready?",
|
|
122
|
+
"context": "The job started, but nobody has checked the output file.",
|
|
123
|
+
"criteria": "Distinguish starting from completing. Say what still needs checking."
|
|
124
|
+
}
|
|
125
|
+
]
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Save it as `cases.json` and pass it to `--cases`. Add cases where the old instruction already worked, too. A single case can expose a regression; it cannot meet the default five-win improvement threshold.
|
|
129
|
+
|
|
130
|
+
**Want a ready-to-copy workflow?** The [agent integration guide](https://github.com/vladzima/volna-skillcheck/blob/main/docs/workflows.md) walks through testing an `AGENTS.md` edit, a skill revision, an OpenCode `/skillcheck` command, and a manual CI evaluation with a provider key.
|
|
131
|
+
|
|
132
|
+
## Read the result
|
|
133
|
+
|
|
134
|
+
The CLI prints a summary. Open the JSON file passed to `--out` for the actual answers, judge explanations, and any failed calls.
|
|
135
|
+
|
|
136
|
+
| Result | What to do | Exit |
|
|
137
|
+
| --- | --- | --- |
|
|
138
|
+
| `candidate_improvement` | Review the winning answers before adopting the change | 0 |
|
|
139
|
+
| `regression` / `failed_checks` | Inspect what got worse or failed a required check | 2 |
|
|
140
|
+
| `inconclusive` / `insufficient_data` | Inspect disagreement or add representative cases | 3 |
|
|
141
|
+
| `incomplete` | Fix the adapter/input problem and rerun to a new report path | 1 |
|
|
142
|
+
|
|
143
|
+
By default, a candidate needs **five distinct winning cases**, no observed losses, no uncertainty, and no failed checks. Five wins is a review threshold, not statistical significance. Repeated trials don't count as additional independent cases.
|
|
144
|
+
|
|
145
|
+
Use `--repeats 3` to look for inconsistent behavior, or `--judge-adapter` to use a different model for judging. Each trial costs up to **four model calls per case**. Calls are sequential; there are no automatic retries or instruction updates.
|
|
146
|
+
|
|
147
|
+
> **What this measures:** answers produced from recorded context. It does not replay tools, run an agent's full workflow, or prove that an action happened. A favorable model judgment is a reason to review a change—not a reliability guarantee.
|
|
148
|
+
|
|
149
|
+
## Keep your data private
|
|
150
|
+
|
|
151
|
+
Use synthetic or sanitized cases. Instructions and case data go to your selected adapter/provider. Reports contain the exact inputs, answers, and reasons. They are created with owner-only permissions; this repository ignores `reports/`. Each run needs a fresh output path, and partial evidence is saved as the run progresses.
|
|
152
|
+
|
|
153
|
+
Adapters are trusted local executables, not a sandbox for hostile code. Provider and CLI logging policies still apply; OpenCode may retain evaluation sessions in its local store. [Security details](https://github.com/vladzima/volna-skillcheck/blob/main/SECURITY.md).
|
|
154
|
+
|
|
155
|
+
## More detail
|
|
156
|
+
|
|
157
|
+
- [Installable skill](https://github.com/vladzima/volna-skillcheck/blob/main/docs/skill.md) — install once, ask your agent to check changes
|
|
158
|
+
- [Adapter setup](https://github.com/vladzima/volna-skillcheck/blob/main/docs/adapters.md) — OpenCode, Codex, Claude Code, and compatible APIs
|
|
159
|
+
- [Agent workflows](https://github.com/vladzima/volna-skillcheck/blob/main/docs/workflows.md) — examples you can put into an existing project
|
|
160
|
+
- [Cases and reports](https://github.com/vladzima/volna-skillcheck/blob/main/docs/usage.md) — literal checks, exit codes, errors, and reproducibility
|
|
161
|
+
- [Methodology](https://github.com/vladzima/volna-skillcheck/blob/main/docs/methodology.md) — judgment policy and limitations
|
|
162
|
+
- [Adapter protocol](https://github.com/vladzima/volna-skillcheck/blob/main/docs/protocol.md) — connect another runtime
|
|
163
|
+
- [Contributing](https://github.com/vladzima/volna-skillcheck/blob/main/CONTRIBUTING.md) — development and tests
|
|
164
|
+
|
|
165
|
+
Run the offline suite with `python3 -m unittest discover -s tests -v`. Python package artifacts are available from [PyPI](https://pypi.org/project/volna-skillcheck/) and [GitHub Releases](https://github.com/vladzima/volna-skillcheck/releases).
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# volna-skillcheck
|
|
2
|
+
|
|
3
|
+
### Did that new agent rule actually help?
|
|
4
|
+
|
|
5
|
+
You add “verify the result before saying done” after an agent gets something wrong. It sounds sensible—but does it fix the failure? Does it make the agent needlessly hesitant on tasks it already handled well?
|
|
6
|
+
|
|
7
|
+
**volna-skillcheck compares the old and new instructions on the same recorded tasks.** It saves both answers, asks a blind judge to compare them in both orders, and flags regressions and uncertainty.
|
|
8
|
+
|
|
9
|
+
Use it before changing a `SKILL.md`, `AGENTS.md`, `CLAUDE.md`, or an agent's system prompt.
|
|
10
|
+
|
|
11
|
+
[Install the skill](#install-the-skill) · [Use the CLI](#quick-start) · [Choose an adapter](#choose-an-adapter) · [How judging works](https://github.com/vladzima/volna-skillcheck/blob/main/docs/methodology.md)
|
|
12
|
+
|
|
13
|
+
Python 3.10+ · Linux and macOS · MIT · No Python runtime dependencies
|
|
14
|
+
|
|
15
|
+
## Install the skill
|
|
16
|
+
|
|
17
|
+
The easiest way to start is to let your agent prepare and run the comparison. Install the CLI, then add the skill to your harness:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
uv tool install volna-skillcheck
|
|
21
|
+
npx skills add vladzima/volna-skillcheck --skill volna-skillcheck
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The installer lets you choose OpenCode, Codex, Claude Code, or another supported harness. It installs into the current project by default; add `-g` for all projects. Node.js is needed for this installer; a [manual copy works too](https://github.com/vladzima/volna-skillcheck/blob/main/docs/skill.md).
|
|
25
|
+
|
|
26
|
+
Then ask your agent:
|
|
27
|
+
|
|
28
|
+
> Use volna-skillcheck to check my SKILL.md edit against its previous version. Use my current provider and model, and show me any regressions.
|
|
29
|
+
|
|
30
|
+
The skill snapshots the two versions, prepares five representative cases, runs one trial per case, and explains the saved evidence. It reuses your existing provider where possible and asks if the model is unknown. A default run takes up to 20 adapter calls; it does not automatically change the tested skill or retry paid calls.
|
|
31
|
+
|
|
32
|
+
**OpenCode shortcut:** `npx skills add vladzima/volna-skillcheck --skill volna-skillcheck -a opencode -g`. Then mention `@volna-skillcheck` in OpenCode V2. [Installation, defaults, and invocation examples →](https://github.com/vladzima/volna-skillcheck/blob/main/docs/skill.md)
|
|
33
|
+
|
|
34
|
+
## Quick start
|
|
35
|
+
|
|
36
|
+
Prefer running the CLI yourself? Install from [PyPI](https://pypi.org/project/volna-skillcheck/):
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
uv tool install volna-skillcheck
|
|
40
|
+
# Or: pipx install volna-skillcheck
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
With plain Python, use a virtual environment:
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
python3 -m venv .venv
|
|
47
|
+
. .venv/bin/activate
|
|
48
|
+
python -m pip install volna-skillcheck
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Try the offline example.** No account or API key needed. Clone the repository to get the example files:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
git clone https://github.com/vladzima/volna-skillcheck.git
|
|
55
|
+
cd volna-skillcheck
|
|
56
|
+
volna-skillcheck \
|
|
57
|
+
--old examples/old.md --new examples/new.md \
|
|
58
|
+
--cases examples/cases.json \
|
|
59
|
+
--adapter "python examples/mock_adapter.py" \
|
|
60
|
+
--out reports/demo.json
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
The fixture produces **6 wins, 2 ties, and no regressions**. Swap `--old` and `--new` and use a new output path to see a regression. This is a hardcoded demo of the tool, not evidence of model quality.
|
|
64
|
+
|
|
65
|
+
## Choose an adapter
|
|
66
|
+
|
|
67
|
+
Keep the same command and replace `--adapter`:
|
|
68
|
+
|
|
69
|
+
| Run through | Adapter command | Setup / verification |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| **OpenCode** | `volna-skillcheck-opencode --model PROVIDER/MODEL` | Existing login; requires V2 ≥2.2.3; live-tested on 2.2.5 |
|
|
72
|
+
| **Codex** | `volna-skillcheck-codex --model MODEL` | Existing login; live-tested on 0.166.0 |
|
|
73
|
+
| **OpenAI-compatible API** | `volna-skillcheck-openai --model MODEL` | `OPENAI_API_KEY`; configurable endpoint; tested with a local HTTP server |
|
|
74
|
+
| **Claude Code** | `volna-skillcheck-claude --model MODEL` | Existing installation/login; fixture-tested, **not live-verified** |
|
|
75
|
+
|
|
76
|
+
For example, with an OpenCode model available in `opencode models`:
|
|
77
|
+
|
|
78
|
+
```sh
|
|
79
|
+
volna-skillcheck \
|
|
80
|
+
--old examples/old.md --new examples/new.md \
|
|
81
|
+
--cases examples/cases.json \
|
|
82
|
+
--adapter "volna-skillcheck-opencode --model openai/gpt-6-astra#high" \
|
|
83
|
+
--out reports/opencode.json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The example model must be available to your account. See the [adapter setup guide](https://github.com/vladzima/volna-skillcheck/blob/main/docs/adapters.md) for API endpoints, Claude requirements, separate judge models, timeouts, and isolation details.
|
|
87
|
+
|
|
88
|
+
## Try your own instruction change
|
|
89
|
+
|
|
90
|
+
You need three things:
|
|
91
|
+
|
|
92
|
+
1. **The old and new instructions** as two text files.
|
|
93
|
+
2. **A few representative tasks**, with the evidence the agent had at the time.
|
|
94
|
+
3. **A criterion** describing what a good answer should do.
|
|
95
|
+
|
|
96
|
+
A case looks like this:
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
[
|
|
100
|
+
{
|
|
101
|
+
"id": "export-status",
|
|
102
|
+
"input": "Is the export ready?",
|
|
103
|
+
"context": "The job started, but nobody has checked the output file.",
|
|
104
|
+
"criteria": "Distinguish starting from completing. Say what still needs checking."
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Save it as `cases.json` and pass it to `--cases`. Add cases where the old instruction already worked, too. A single case can expose a regression; it cannot meet the default five-win improvement threshold.
|
|
110
|
+
|
|
111
|
+
**Want a ready-to-copy workflow?** The [agent integration guide](https://github.com/vladzima/volna-skillcheck/blob/main/docs/workflows.md) walks through testing an `AGENTS.md` edit, a skill revision, an OpenCode `/skillcheck` command, and a manual CI evaluation with a provider key.
|
|
112
|
+
|
|
113
|
+
## Read the result
|
|
114
|
+
|
|
115
|
+
The CLI prints a summary. Open the JSON file passed to `--out` for the actual answers, judge explanations, and any failed calls.
|
|
116
|
+
|
|
117
|
+
| Result | What to do | Exit |
|
|
118
|
+
| --- | --- | --- |
|
|
119
|
+
| `candidate_improvement` | Review the winning answers before adopting the change | 0 |
|
|
120
|
+
| `regression` / `failed_checks` | Inspect what got worse or failed a required check | 2 |
|
|
121
|
+
| `inconclusive` / `insufficient_data` | Inspect disagreement or add representative cases | 3 |
|
|
122
|
+
| `incomplete` | Fix the adapter/input problem and rerun to a new report path | 1 |
|
|
123
|
+
|
|
124
|
+
By default, a candidate needs **five distinct winning cases**, no observed losses, no uncertainty, and no failed checks. Five wins is a review threshold, not statistical significance. Repeated trials don't count as additional independent cases.
|
|
125
|
+
|
|
126
|
+
Use `--repeats 3` to look for inconsistent behavior, or `--judge-adapter` to use a different model for judging. Each trial costs up to **four model calls per case**. Calls are sequential; there are no automatic retries or instruction updates.
|
|
127
|
+
|
|
128
|
+
> **What this measures:** answers produced from recorded context. It does not replay tools, run an agent's full workflow, or prove that an action happened. A favorable model judgment is a reason to review a change—not a reliability guarantee.
|
|
129
|
+
|
|
130
|
+
## Keep your data private
|
|
131
|
+
|
|
132
|
+
Use synthetic or sanitized cases. Instructions and case data go to your selected adapter/provider. Reports contain the exact inputs, answers, and reasons. They are created with owner-only permissions; this repository ignores `reports/`. Each run needs a fresh output path, and partial evidence is saved as the run progresses.
|
|
133
|
+
|
|
134
|
+
Adapters are trusted local executables, not a sandbox for hostile code. Provider and CLI logging policies still apply; OpenCode may retain evaluation sessions in its local store. [Security details](https://github.com/vladzima/volna-skillcheck/blob/main/SECURITY.md).
|
|
135
|
+
|
|
136
|
+
## More detail
|
|
137
|
+
|
|
138
|
+
- [Installable skill](https://github.com/vladzima/volna-skillcheck/blob/main/docs/skill.md) — install once, ask your agent to check changes
|
|
139
|
+
- [Adapter setup](https://github.com/vladzima/volna-skillcheck/blob/main/docs/adapters.md) — OpenCode, Codex, Claude Code, and compatible APIs
|
|
140
|
+
- [Agent workflows](https://github.com/vladzima/volna-skillcheck/blob/main/docs/workflows.md) — examples you can put into an existing project
|
|
141
|
+
- [Cases and reports](https://github.com/vladzima/volna-skillcheck/blob/main/docs/usage.md) — literal checks, exit codes, errors, and reproducibility
|
|
142
|
+
- [Methodology](https://github.com/vladzima/volna-skillcheck/blob/main/docs/methodology.md) — judgment policy and limitations
|
|
143
|
+
- [Adapter protocol](https://github.com/vladzima/volna-skillcheck/blob/main/docs/protocol.md) — connect another runtime
|
|
144
|
+
- [Contributing](https://github.com/vladzima/volna-skillcheck/blob/main/CONTRIBUTING.md) — development and tests
|
|
145
|
+
|
|
146
|
+
Run the offline suite with `python3 -m unittest discover -s tests -v`. Python package artifacts are available from [PyPI](https://pypi.org/project/volna-skillcheck/) and [GitHub Releases](https://github.com/vladzima/volna-skillcheck/releases).
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
volna-skillcheck runs trusted adapter executables with the invoking user's permissions and inherited environment. It is not a sandbox for untrusted commands. Process groups, timeouts, and output limits provide cleanup for ordinary adapters, not containment against a malicious executable that escapes its process group.
|
|
4
|
+
|
|
5
|
+
The Codex adapter requests a read-only sandbox and disables local configuration, skill discovery, hooks, integrations, and optional tools. System-managed policies still apply. Test isolation again when upgrading Codex, especially its experimental skill-discovery flag. Treat cases and model answers as untrusted data; the blind judge can still be susceptible to prompt injection.
|
|
6
|
+
|
|
7
|
+
The OpenCode V2 adapter starts a private server with temporary user configuration and denies tools, skills, plugins, and MCP. System-managed settings may still apply. Its credentials and session storage remain in OpenCode's normal data location; sanitized evaluation sessions may remain there. The Claude Code adapter requests safe/restricted mode, disables tools and hooks, and avoids session persistence; it has not been live-verified. Neither adapter is an OS sandbox.
|
|
8
|
+
|
|
9
|
+
The API adapter requires HTTPS for remote hosts, allows HTTP only on loopback, and refuses redirects rather than forwarding authorization. Keys are read from environment variables. An explicitly selected endpoint receives the selected key: use a separate key variable for local or third-party providers. Raw HTTP error bodies are not copied into reports.
|
|
10
|
+
|
|
11
|
+
Reports contain exact instructions, contexts, model answers, and adapter-supplied metadata. They are sensitive even when file permissions are restrictive. Review and sanitize them before sharing. Provider retention and logging policies are outside volna-skillcheck's control. The project does not send telemetry.
|
|
12
|
+
|
|
13
|
+
Only the latest released version will receive fixes. Report vulnerabilities through [GitHub's private reporting form](https://github.com/vladzima/volna-skillcheck/security/advisories/new). Do not put credentials or exploit payloads containing private data in public issues.
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Adapter setup
|
|
2
|
+
|
|
3
|
+
An adapter supplies model answers and blind judgments. All bundled adapters use the same prompt and response contract; the runner handles comparison and reporting. Installing volna-skillcheck installs the Python commands below, **not** the third-party CLIs.
|
|
4
|
+
|
|
5
|
+
Choose an explicit model supported by your provider. Existing login state is reused; no credentials belong in adapter arguments or reports. Runtime behavior differs between providers, so compare instruction revisions with the same generation adapter and model.
|
|
6
|
+
|
|
7
|
+
## OpenCode
|
|
8
|
+
|
|
9
|
+
Requires **OpenCode V2, version 2.2.3 or newer within V2**. Live-tested with 2.2.5. V1 and unknown major versions are rejected because the isolation policies differ.
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
opencode auth list
|
|
13
|
+
opencode models
|
|
14
|
+
|
|
15
|
+
volna-skillcheck --old examples/old.md --new examples/new.md \
|
|
16
|
+
--cases examples/cases.json \
|
|
17
|
+
--adapter "volna-skillcheck-opencode --model openai/gpt-6-astra#high" \
|
|
18
|
+
--out reports/opencode.json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Use any `provider/model` (optionally `#variant`) available to your account. The example uses an existing OpenAI login; other connected built-in providers can be selected the same way.
|
|
22
|
+
|
|
23
|
+
Each invocation starts a private server with `--standalone`, a fresh working directory, and temporary global configuration. It selects a dedicated agent with the evaluation prompt, denies tools, skills, MCP, and external plugins, disables project instructions and sharing, and strips inherited OpenCode config/server overrides. Provider credentials remain available. User-defined providers that depend on your normal configuration are not imported: use the API adapter for custom endpoints.
|
|
24
|
+
|
|
25
|
+
This is not an OS sandbox. System/managed configuration and the runtime's date/environment context may still apply. OpenCode may keep sessions in its normal data store; their IDs are included in report metadata. Use sanitized cases even when reports stay local.
|
|
26
|
+
|
|
27
|
+
References: [V2 commands](https://dev.opencode.ai/v2/docs/cli/commands/), [configuration](https://dev.opencode.ai/v2/docs/config/), [policies](https://dev.opencode.ai/v2/docs/policies/).
|
|
28
|
+
|
|
29
|
+
## Codex
|
|
30
|
+
|
|
31
|
+
Requires an installed, authenticated Codex CLI. Live-tested with **0.166.0**; older versions may lack the required flags.
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
codex login status
|
|
35
|
+
volna-skillcheck --old examples/old.md --new examples/new.md \
|
|
36
|
+
--cases examples/cases.json \
|
|
37
|
+
--adapter "volna-skillcheck-codex --model YOUR_MODEL_ID" \
|
|
38
|
+
--out reports/codex.json
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
The adapter uses ephemeral sessions, fresh temporary directories, read-only sandboxing, and an explicit model with `high` reasoning by default. Change it with the adapter's `--reasoning` flag.
|
|
42
|
+
|
|
43
|
+
It replaces the built-in prompt, ignores user configuration/rules, disables project instructions, local skill discovery, integrations, hooks, and optional tools, and rejects unexpected tool activity. System-managed policies still apply. `skip_host_skill_discovery` is an experimental Codex flag: revalidate isolation when upgrading.
|
|
44
|
+
|
|
45
|
+
References: [noninteractive Codex](https://developers.openai.com/codex/noninteractive/), [configuration](https://developers.openai.com/codex/config-reference/).
|
|
46
|
+
|
|
47
|
+
## OpenAI-compatible APIs
|
|
48
|
+
|
|
49
|
+
Uses **`POST /chat/completions`**, not the Responses API. No provider SDK is required.
|
|
50
|
+
|
|
51
|
+
Set `OPENAI_API_KEY` using your normal secret-management workflow, then run:
|
|
52
|
+
|
|
53
|
+
```sh
|
|
54
|
+
volna-skillcheck --old examples/old.md --new examples/new.md \
|
|
55
|
+
--cases examples/cases.json \
|
|
56
|
+
--adapter "volna-skillcheck-openai --model YOUR_MODEL_ID" \
|
|
57
|
+
--out reports/api.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The default base URL is `https://api.openai.com/v1`. Set `OPENAI_BASE_URL`, or pass `--base-url`, to use another compatible service. Use `--api-key-env PROVIDER_API_KEY` to select a different environment variable; pass its **name**, never its value.
|
|
61
|
+
|
|
62
|
+
For a local server, such as an OpenAI-compatible model server listening on port 8000:
|
|
63
|
+
|
|
64
|
+
```sh
|
|
65
|
+
volna-skillcheck --old examples/old.md --new examples/new.md \
|
|
66
|
+
--cases examples/cases.json \
|
|
67
|
+
--adapter "volna-skillcheck-openai --base-url http://127.0.0.1:8000/v1 --api-key-env LOCAL_MODEL_KEY --model YOUR_LOCAL_MODEL" \
|
|
68
|
+
--out reports/local.json
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Loopback HTTP endpoints can run without a key; remote endpoints require HTTPS and a key. The base URL must not contain credentials, query parameters, or a fragment. Redirects are refused so authorization is not forwarded to another destination.
|
|
72
|
+
|
|
73
|
+
The default `--response-format json_object` asks for JSON mode. Use `json_schema` for endpoints supporting strict structured output, or `text` for endpoints without either feature. Even in text mode, the response must contain a JSON object without Markdown fences. Unsupported formats fail visibly; there is no silent fallback. Optional `--temperature` is omitted by default because some models reject it.
|
|
74
|
+
|
|
75
|
+
Truncation, refusal, tool calls, invalid JSON, and HTTP errors are failures—not ties. Reports include the requested/resolved model, settings, response fingerprint when supplied, and usage. Transport tests use a local HTTP server, including real runner-to-adapter calls; **hosted API compatibility has not been live-verified**.
|
|
76
|
+
|
|
77
|
+
Reference: [Chat Completions request/response contract](https://developers.openai.com/api/reference/resources/chat/subresources/completions/methods/create).
|
|
78
|
+
|
|
79
|
+
## Claude Code
|
|
80
|
+
|
|
81
|
+
For people who already have Claude Code installed and authenticated:
|
|
82
|
+
|
|
83
|
+
```sh
|
|
84
|
+
volna-skillcheck --old examples/old.md --new examples/new.md \
|
|
85
|
+
--cases examples/cases.json \
|
|
86
|
+
--adapter "volna-skillcheck-claude --model YOUR_CLAUDE_MODEL" \
|
|
87
|
+
--out reports/claude.json
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Requires a current CLI supporting `--safe-mode`, `--restricted`, and structured output. It runs print mode in a fresh directory, replaces the system prompt, disables built-in/MCP tools and hooks, ignores user/project settings, and disables session persistence. It accepts only a successful structured result; managed policy still applies.
|
|
91
|
+
|
|
92
|
+
**Status: implemented and fixture-tested, not live-verified.** Claude Code was neither installed nor run to test this adapter. Validate a small synthetic suite on your installation before using it as a gate; unsupported CLI flags fail rather than falling back to less restrictive execution.
|
|
93
|
+
|
|
94
|
+
Reference: [Claude Code CLI flags](https://code.claude.com/docs/en/cli-reference).
|
|
95
|
+
|
|
96
|
+
## Separate generator and judge
|
|
97
|
+
|
|
98
|
+
Use an independent judge model when practical:
|
|
99
|
+
|
|
100
|
+
```sh
|
|
101
|
+
volna-skillcheck --old examples/old.md --new examples/new.md \
|
|
102
|
+
--cases examples/cases.json \
|
|
103
|
+
--adapter "volna-skillcheck-opencode --model YOUR_PROVIDER/YOUR_MODEL" \
|
|
104
|
+
--judge-adapter "volna-skillcheck-openai --model YOUR_JUDGE_MODEL" \
|
|
105
|
+
--repeats 3 --out reports/independent-judge.json
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
This changes the judge, not the old/new generation settings. Swapped judgments and repeated trials can expose inconsistency; they cannot eliminate judge bias.
|
|
109
|
+
|
|
110
|
+
## Timeouts and diagnosis
|
|
111
|
+
|
|
112
|
+
Bundled adapters default to 90 seconds; the runner allows 120 seconds per invocation. Increase both for slower models, leaving room for CLI startup:
|
|
113
|
+
|
|
114
|
+
```sh
|
|
115
|
+
volna-skillcheck --old examples/old.md --new examples/new.md \
|
|
116
|
+
--cases examples/cases.json \
|
|
117
|
+
--adapter "volna-skillcheck-opencode --model YOUR_PROVIDER/YOUR_MODEL --timeout 180" \
|
|
118
|
+
--timeout 210 --out reports/slower-model.json
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Failed calls are retained in the report with a stage and diagnostic code. The runner intentionally does not copy raw stderr, which may contain secrets. To troubleshoot, send a **synthetic** request from the [protocol guide](protocol.md) directly to the adapter and inspect its safe diagnostic code. API 401/403 means check credentials/access; 429 means check quota/rate limits. There are no automatic paid retries.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# What a result establishes
|
|
2
|
+
|
|
3
|
+
volna-skillcheck evaluates an assistant's **answer at a recorded decision point**. Context is supplied as text; the runner does not execute recorded tools, resume the original conversation, test scheduling/recovery, or prove that a promised action occurred. Those properties need an agent harness with observable actions and outcome assertions. A fluent answer about verification can still be wrong in a live workflow.
|
|
4
|
+
|
|
5
|
+
For each case and repeat:
|
|
6
|
+
|
|
7
|
+
1. Randomize which revision generates first. Give both identical task/context.
|
|
8
|
+
2. Apply any literal answer checks independently to each revision.
|
|
9
|
+
3. If answer strings are identical, record a tie without spending judge calls.
|
|
10
|
+
4. Otherwise, judge a seeded anonymous presentation and the swapped presentation, independently. Retain both reasons.
|
|
11
|
+
5. Require mapped judgments to agree. Disagreement becomes `unstable`; any abstention becomes `abstain`. A baseline pass with a candidate check failure is a regression regardless of judge preference.
|
|
12
|
+
|
|
13
|
+
Across repeats, any established regression makes the case a regression. Otherwise, all repeats must agree for a win or tie. Abstention or inconsistent results prevents a positive overall verdict. An error marks the case incomplete without deleting its successful calls. Across cases, any error makes the run incomplete; any regression blocks promotion. Failed candidate checks block promotion even when the baseline also fails. Any remaining uncertainty blocks promotion. At least five distinct candidate wins are required by default; ties do not count as wins.
|
|
14
|
+
|
|
15
|
+
This policy is deliberately conservative, but **five wins is a heuristic, not a confidence interval**. Correlated cases, prompt leakage, judge self-preference, verbosity bias, repeated tuning, and nondeterministic generation all limit inference. Swapping presentation helps reveal position bias; it does not eliminate judge bias or prompt injection. A malicious answer can influence both judgments. Use deterministic checks where appropriate and inspect the saved evidence before accepting a change.
|
|
16
|
+
|
|
17
|
+
Good evaluation practice:
|
|
18
|
+
|
|
19
|
+
- Keep a development suite and a held-out suite; avoid repeatedly tuning against the holdout.
|
|
20
|
+
- Include baseline successes so a rule that adds needless hesitation can regress.
|
|
21
|
+
- Prefer multiple task families over many paraphrases of one failure.
|
|
22
|
+
- Use an independent judge model and human review for consequential changes.
|
|
23
|
+
- Record the suite, model snapshot, adapter version, and settings alongside the report.
|
|
24
|
+
- Test live agent behavior separately before shipping changes that affect external actions.
|
|
25
|
+
|
|
26
|
+
The included mock fixture always follows a hand-written preference. Its wins demonstrate report mechanics. They are not evidence that the example instruction improves a real model. A live two-case smoke test establishes adapter compatibility, not the quality or reliability of any instruction set.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Adapter protocol
|
|
2
|
+
|
|
3
|
+
An adapter reads one UTF-8 JSON object from stdin, writes one JSON object to stdout, and exits zero. Logs belong on stderr. No banners, Markdown fences, or JSONL on stdout. Any nonzero exit, timeout, invalid UTF-8/JSON, non-object response, or malformed required field becomes an evaluation error. Each call starts a fresh process. Input files and each captured output stream are limited to 4 MiB; limits are checked while the process runs. Adapter processes are trusted code, not resource-isolated containers.
|
|
4
|
+
|
|
5
|
+
Generation request:
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{"operation":"generate","instruction":"Require evidence before claiming completion.","input":"Is the export ready?","context":"The job started; no output has been checked."}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Generation response:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{"text":"It has started, but completion is unverified.","metadata":{"model":"example-model","temperature":0}}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Judge request:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{"operation":"judge","input":"Is the export ready?","context":"The job started; no output has been checked.","criteria":"Distinguish startup from completion.","a":"Done.","b":"It has started, but completion is unverified."}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Judge response:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{"winner":"b","reason":"Only b matches the recorded evidence.","metadata":{"model":"example-judge"}}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`text` and `reason` must be nonempty strings. `winner` is `a`, `b`, `tie`, or `abstain`. Optional `metadata` should be a JSON object of public configuration and usage: provider/model/version, sampling settings, token counts. It is saved verbatim; never include credentials. No old/new labels, instruction contents, case IDs, prior judgments, or generation metadata are sent to the judge. Answer text may itself reveal an instruction; presentation blinding cannot prevent that.
|
|
30
|
+
|
|
31
|
+
The same pair is judged again with a/b swapped. A separate `--judge-adapter` can select another model/provider. Generations receive the instruction, input, and context only. Both revisions see exactly the same input/context and run configuration. Avoid reading mutable external state in an adapter.
|
|
32
|
+
|
|
33
|
+
For a direct Codex adapter diagnostic, save the generation request above as `request.json`, then run:
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
volna-skillcheck-codex --model YOUR_MODEL_ID < request.json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
A successful invocation returns a single response object including metadata. The Codex adapter does not forward the model's extra fields as protocol instructions. It validates the final response and requires a completed turn without tool activity. Unsupported CLI flags, missing auth, and model access failures result in nonzero exits. For Hermes or another runtime, implement this protocol using that runtime's supported invocation interface; volna-skillcheck does not claim a native Hermes integration.
|
|
40
|
+
|
|
41
|
+
## Report schema 2
|
|
42
|
+
|
|
43
|
+
- Top level: `schema_version`, `volna_skillcheck_version`, UTC `created_at`, `status`, `seed`, `config`, `instructions`, `instruction_hashes`, canonical `suite_sha256`, `suite`, `summary`, `cases`.
|
|
44
|
+
- `config`: repeats, minimum winning cases, call timeout, and SHA-256 hashes of both adapter command strings. Commands and environment variables are not retained.
|
|
45
|
+
- Each case result: `id`, `status`, optional aggregate `better`, and `trials`.
|
|
46
|
+
- Each trial: number, status, generation order, answers by revision, generation metadata, literal check results, individual judgments, optional `better`, or a safe error code and failing stage. Identical answers have `judge_skipped: identical_answers`.
|
|
47
|
+
- Each judgment: presentation order, original winner, mapped revision (`better`), reason, and metadata.
|
|
48
|
+
|
|
49
|
+
Timestamps and model output vary. Input hashes, recorded ordering, configuration, and evidence support auditing; they do not promise byte-identical reruns. Schema 2 intentionally replaces the prototype's single-answer/single-judgment rows; consumers of schema 1 must update. No schema 1 public release existed.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Release checklist
|
|
2
|
+
|
|
3
|
+
The public repository is [vladzima/volna-skillcheck](https://github.com/vladzima/volna-skillcheck). GitHub releases and [PyPI](https://pypi.org/project/volna-skillcheck/) carry the wheel and source archive. The portable skill lives in `skills/volna-skillcheck/` and is installed from GitHub independently of the CLI.
|
|
4
|
+
|
|
5
|
+
1. Use **volna-skillcheck** as the GitHub repository name, distribution name, and CLI name. Confirm the GitHub owner, visibility, and PyPI ownership before publishing. If any name is unavailable, ask the maintainer; do not choose a replacement name.
|
|
6
|
+
2. Review every included file for private material and confirm rights to publish it under MIT. The fixtures must remain synthetic. Inspect `git status --short --untracked-files=all`; reports, credentials, and local runtime files must stay excluded.
|
|
7
|
+
3. Run the offline suite on supported Python versions and Linux/macOS in CI. Build a wheel and source distribution, run `twine check`, inspect archive contents, then install the wheel into a fresh environment outside the checkout and run the documented CLI path.
|
|
8
|
+
4. For adapter behavior changes, run a live smoke evaluation where credentials are available, with at least one nonidentical answer pair and a positive-control case. Require zero adapter errors, both swapped judgments for the nonidentical pair, and populated model/version metadata. Do not require an improvement verdict: ties or insufficient evidence are valid results. Keep the report private. Revalidate isolation on runtime upgrades; disclose adapters that remain fixture-tested. For skill changes, validate frontmatter and references, install a standalone copy with the documented installer in a scratch project, and check discovery in an available harness.
|
|
9
|
+
5. Set the release date, update the changelog, and synchronize the version in `pyproject.toml` and `volna_skillcheck.py`. Add verified repository URLs to package metadata after the repository exists.
|
|
10
|
+
6. Require the CI workflow before merging. The `pypi` GitHub environment allows version tags (`v*`) and the `main` branch for manual dispatch. The publishing identity is the owner/repository/workflow/environment tuple below; only the separate publish job can obtain an OIDC token.
|
|
11
|
+
7. Tag and publish only after reviewing the actual artifacts and the exact commit's CI. Publishing a GitHub release triggers `.github/workflows/publish.yml`. It checks tag/version agreement and ancestry on `main`, reruns offline tests, builds/checks/smoke-tests the wheel, and passes artifacts to the isolated publish job. Confirm the workflow succeeds, then install the package from PyPI in a clean environment and repeat the CLI smoke test before announcing it. Verify the public skill installer too.
|
|
12
|
+
|
|
13
|
+
## Trusted Publishing setup
|
|
14
|
+
|
|
15
|
+
The PyPI project owner configures this once under [account publishing](https://pypi.org/manage/account/publishing/) for a new project, or project publishing settings after the project exists:
|
|
16
|
+
|
|
17
|
+
| Field | Value |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| PyPI project | `volna-skillcheck` |
|
|
20
|
+
| GitHub owner | `vladzima` |
|
|
21
|
+
| Repository | `volna-skillcheck` |
|
|
22
|
+
| Workflow filename | `publish.yml` |
|
|
23
|
+
| Environment | `pypi` |
|
|
24
|
+
|
|
25
|
+
Use [PyPI's pending publisher flow](https://docs.pypi.org/trusted-publishers/creating-a-project-through-oidc/) for the first upload. No long-lived PyPI token is needed. If a release ran before setup was complete, rerun its failed publish job after configuration. The workflow also supports manual dispatch from `main` with an existing release tag.
|
|
26
|
+
|
|
27
|
+
The workflow builds the PyPI files itself. Download its `python-distributions` artifact if attaching the exact same files to the GitHub release; independently rebuilding can change archive hashes. Never replace an existing PyPI version: fix it with a new version. For a partial upload, first inspect which files are already public and their hashes; do not blindly retry or hide conflicts with `skip-existing`.
|
|
28
|
+
|
|
29
|
+
A successful smoke evaluation verifies integration, not model quality. Publish the limitations alongside any example results.
|