aepkit 0.6.0__tar.gz → 0.7.1__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.
Files changed (47) hide show
  1. {aepkit-0.6.0 → aepkit-0.7.1}/CHANGELOG.md +78 -9
  2. {aepkit-0.6.0/src/aepkit.egg-info → aepkit-0.7.1}/PKG-INFO +26 -12
  3. {aepkit-0.6.0 → aepkit-0.7.1}/README.md +21 -8
  4. {aepkit-0.6.0 → aepkit-0.7.1}/SKILL.md +13 -7
  5. {aepkit-0.6.0 → aepkit-0.7.1}/pyproject.toml +9 -4
  6. {aepkit-0.6.0/src/aepkit/skill → aepkit-0.7.1}/references/autonomous-mode.md +5 -1
  7. {aepkit-0.6.0/src/aepkit/skill → aepkit-0.7.1}/references/failure-modes-and-example.md +1 -1
  8. {aepkit-0.6.0/src/aepkit/skill → aepkit-0.7.1}/references/handoffs.md +10 -1
  9. aepkit-0.7.1/src/aepkit/__init__.py +1 -0
  10. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/cli.py +17 -7
  11. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/install_skill.py +1 -1
  12. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/lint.py +26 -19
  13. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/negcontrol.py +23 -6
  14. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/scaffold.py +4 -0
  15. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/skill/SKILL.md +13 -7
  16. {aepkit-0.6.0 → aepkit-0.7.1/src/aepkit/skill}/references/autonomous-mode.md +5 -1
  17. {aepkit-0.6.0 → aepkit-0.7.1/src/aepkit/skill}/references/failure-modes-and-example.md +1 -1
  18. {aepkit-0.6.0 → aepkit-0.7.1/src/aepkit/skill}/references/handoffs.md +10 -1
  19. aepkit-0.7.1/src/aepkit/status.py +314 -0
  20. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/templates/execution-guide.md +6 -3
  21. {aepkit-0.6.0 → aepkit-0.7.1/src/aepkit.egg-info}/PKG-INFO +26 -12
  22. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/requires.txt +4 -3
  23. {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_install_skill.py +39 -40
  24. {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_lint.py +87 -0
  25. {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_negcontrol.py +42 -1
  26. {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_scaffold.py +8 -0
  27. aepkit-0.7.1/tests/test_status.py +322 -0
  28. aepkit-0.6.0/src/aepkit/__init__.py +0 -1
  29. aepkit-0.6.0/src/aepkit/status.py +0 -122
  30. aepkit-0.6.0/tests/test_status.py +0 -112
  31. {aepkit-0.6.0 → aepkit-0.7.1}/LICENSE +0 -0
  32. {aepkit-0.6.0 → aepkit-0.7.1}/MANIFEST.in +0 -0
  33. {aepkit-0.6.0 → aepkit-0.7.1}/references/tasks-and-gates.md +0 -0
  34. {aepkit-0.6.0 → aepkit-0.7.1}/setup.cfg +0 -0
  35. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/__main__.py +0 -0
  36. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/py.typed +0 -0
  37. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/skill/references/tasks-and-gates.md +0 -0
  38. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/templates/compliance-log.md +0 -0
  39. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit/templates/plan-of-record.md +0 -0
  40. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/SOURCES.txt +0 -0
  41. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/dependency_links.txt +0 -0
  42. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/entry_points.txt +0 -0
  43. {aepkit-0.6.0 → aepkit-0.7.1}/src/aepkit.egg-info/top_level.txt +0 -0
  44. {aepkit-0.6.0 → aepkit-0.7.1}/tests/run.py +0 -0
  45. {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_cli.py +0 -0
  46. {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_readme_claims.py +0 -0
  47. {aepkit-0.6.0 → aepkit-0.7.1}/tests/test_skill_sync.py +0 -0
@@ -7,6 +7,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.7.1] - 2026-11-08
11
+
12
+ ### Added
13
+ - `references/handoffs.md`: an optional `Load: docs-only` line in the handoff template, for
14
+ runs where a tool holds back Executor launches while the machine is busy. It marks a task
15
+ that builds nothing, so it may run beside one that builds; a handoff without it counts as
16
+ a build. The protocol does not require it.
17
+ - `aeprogress` 0.2.0 (`integrations/claude-code/aeprogress/`): a launch limit that, while a
18
+ run is found, refuses launching another Executor past 2 live workers, 1 building worker,
19
+ or a machine more than 75% busy for a build (each a `/config` option), with the reason in
20
+ the refusal. It sees Claude Code subagents whose prompt names a task of the run, and Orca
21
+ `worker-start` and `send` to a dispatch that is not live; it counts both together, and
22
+ refuses when Orca cannot be asked. The pane shows the machine's load (Linux `/proc`,
23
+ macOS and BSD `sysctl`, Windows PowerShell) and how full the limit is. On macOS, when
24
+ Spotlight's indexing stays busy, it recommends excluding the project folder in System
25
+ Settings; it never changes a setting.
26
+ - `aeprogress`: Windows fallbacks for finding aepkit (`python -m`, `py -m`,
27
+ `%USERPROFILE%\.local\bin`).
28
+
29
+ ## [0.7.0] - 2026-11-08
30
+
31
+ ### Added
32
+ - `aepkit status --json` prints the status reading as one JSON object: each ID with its
33
+ phase, kind, effective state, verdict, latest report, executor (a status board column
34
+ named `Executor`, `Worker`, `Agent`, `Owner` or `Assignee`) and any board/header
35
+ conflict; the phases with their titles from `execution-guide.md` and the plan's phase
36
+ table, an optional `Weight` column, and phases the guide has not broken down; IDs the
37
+ guide lists that the log has no entry for yet, marked `inLog: false`. The text output
38
+ is unchanged.
39
+ - `aeprogress`, an optional Claude Code mod in `integrations/claude-code/aeprogress/`:
40
+ a pane with the run's progress per phase, who is working on which ID (Claude Code
41
+ subagents, Orca workers, or any harness through a command), what awaits audit and what
42
+ needs attention, opened with `/aeprogress`. `.claude-plugin/marketplace.json` makes the
43
+ repository installable with
44
+ `/plugin install aeprogress --marketplace tBeltty/auditor-executor-protocol`.
45
+
46
+ ### Fixed
47
+ - `SKILL.md`, `references/handoffs.md`, `references/autonomous-mode.md` and
48
+ `references/failure-modes-and-example.md` spoke of "a plain `PASS`" on one task. `PASS`
49
+ is not a verdict (the verdicts are `APPROVED`, `CONDITIONAL` and `REJECTED`), and a log
50
+ that used it showed the task as awaiting audit in `aepkit status`. The four sentences
51
+ now say `APPROVED`.
52
+
10
53
  ## [0.6.0] - 2026-10-24
11
54
 
12
55
  ### Added
@@ -29,6 +72,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
29
72
  (`pipx install aepkit`, `aepkit`, `python -m aepkit`) to eliminate naming collisions with
30
73
  external `auditkit` packages and binaries.
31
74
 
75
+ ## [0.5.1] - 2026-10-04
76
+
77
+ ### Fixed
78
+ - `negcontrol --file` without `--break-cmd` is now a usage error (exit 2). The backup was taken
79
+ of a file already broken by hand, so a correct `--restore-cmd` was overwritten with the broken
80
+ copy and blamed for it.
81
+ - `negcontrol` fails the control when the test times out with the protection removed: a hang is
82
+ not a caught break. It used to print `OK` with a warning.
83
+ - `negcontrol --file <directory>` and `auditkit init <existing file>` print an error and exit 2
84
+ instead of crashing with a traceback.
85
+ - The execution guide's reporting format puts the verify output in a fenced block, so a report
86
+ written as the template shows no longer fails `lint`.
87
+ - `lint` no longer cuts a report short at a `#`, `---` or `**Field:**` line inside pasted output.
88
+ - `lint`'s phase-order check reads verdicts the way `status` does: the latest report header wins,
89
+ and a status board verdict that disagrees with it is a conflict, not an approval.
90
+ - `install-skill` auto-detects Claude Code through `CLAUDECODE`, the variable Claude Code sets.
91
+ - The install-skill tests no longer depend on the agent environment they run in.
92
+
93
+ ### Changed
94
+ - The release workflow runs the full CI before building and publishing.
95
+ - CI pins ruff, mypy, build and twine through the `dev` extra, and smoke-tests the built wheel in
96
+ a clean environment.
97
+ - README links are absolute, so they work on PyPI; `auditkit --help` and the installed skill
98
+ link to GitHub instead of "the repo root".
99
+ - `--annex-threshold` is documented as a total with a per-phase breakdown, which is what it
100
+ checks.
101
+ - `SECURITY.md` lists 0.5.x as supported; `CONTRIBUTING.md` documents the release steps.
102
+
32
103
  ## [0.5.0] - 2026-10-02
33
104
 
34
105
  ### Added
@@ -85,9 +156,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
85
156
  requires Python 3.11+.
86
157
 
87
158
  ### Fixed
88
- - `AGENTS.md` imported itself and said nothing, because `GEMINI.md` was a symlink to it. It is
89
- now a short, generic agent guide that points to `CONTRIBUTING.md`; tool-specific instruction
90
- files (`CLAUDE.md`, `GEMINI.md`) are no longer tracked.
91
159
  - README: the compliance log template, `install-skill` detection and `--global`/`--dest`, every
92
160
  command's options, exit codes, and the BSD-only `sed -i ''` in the `negcontrol` example now match
93
161
  the CLI.
@@ -193,7 +261,7 @@ Fixes from an independent review of 0.3.0.
193
261
  field is missing, empty, or only a template placeholder. The protocol already records
194
262
  these as `FAILED`; the check makes that mechanical.
195
263
  - README: install `auditkit` without cloning via `pipx install git+https://github.com/tBeltty/auditor-executor-protocol`.
196
- - Conventional Commits specification documented in `CONTRIBUTING.md` and enforced in `AGENTS.md`.
264
+ - Conventional Commits specification documented in `CONTRIBUTING.md`.
197
265
  - `SKILL.md`: optional Guided/Autonomous operating mode, with the autonomy charter, per-task
198
266
  model-tier assignment, the per-task cycle, and an Auditor-brief template for starting an
199
267
  autonomous run.
@@ -218,8 +286,6 @@ Fixes from an independent review of 0.3.0.
218
286
  - `auditkit install-skill` copies `references/` beside `SKILL.md`. Destinations that hold a
219
287
  single file (Cursor `.mdc`, or a `--dest` not named `SKILL.md`) get one bundled file.
220
288
  - The packaged skill moved from `src/auditkit/templates/SKILL.md` to `src/auditkit/skill/`.
221
- - `GEMINI.md` imports `AGENTS.md` instead of duplicating it, so the agent rules have one
222
- source of truth.
223
289
  - Bumped `actions/checkout` and `actions/setup-python` to v7 in GitHub Actions CI workflow.
224
290
  - Configured grouped updates in `.github/dependabot.yml` to bundle action and pip dependency bumps.
225
291
 
@@ -250,7 +316,6 @@ Fixes from an independent review of 0.3.0.
250
316
  - 90%+ test coverage enforcement across the repository.
251
317
  - GitHub Actions CI workflow hardening: explicit token permissions, dedicated lint/format/typecheck job, package distribution verification, and weekly Dependabot configuration.
252
318
  - Open-source governance files: `SECURITY.md`, `CONTRIBUTING.md`, `CHANGELOG.md`, PR and issue templates.
253
- - Agent rule specifications (`AGENTS.md`, `GEMINI.md`) establishing mandatory changelog updates and test verification gates on every task.
254
319
 
255
320
  ### Changed
256
321
  - Conformed all Python code to Ruff formatting and PEP 8 import conventions.
@@ -269,8 +334,11 @@ Fixes from an independent review of 0.3.0.
269
334
  - Multi-framework agent installation support for Antigravity, Claude Code, and Cursor.
270
335
  - Zero-dependency test runner (`tests/run.py`).
271
336
 
272
- [Unreleased]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.6.0...HEAD
273
- [0.6.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.5.0...v0.6.0
337
+ [Unreleased]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.7.1...HEAD
338
+ [0.7.1]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.7.0...v0.7.1
339
+ [0.7.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.6.0...v0.7.0
340
+ [0.6.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.5.1...v0.6.0
341
+ [0.5.1]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.5.0...v0.5.1
274
342
  [0.5.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.4.0...v0.5.0
275
343
  [0.4.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.3.9...v0.4.0
276
344
  [0.3.9]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.3.8...v0.3.9
@@ -284,3 +352,4 @@ Fixes from an independent review of 0.3.0.
284
352
  [0.3.1]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.3.0...v0.3.1
285
353
  [0.3.0]: https://github.com/tBeltty/auditor-executor-protocol/compare/v0.2.0...v0.3.0
286
354
  [0.2.0]: https://github.com/tBeltty/auditor-executor-protocol/releases/tag/v0.2.0
355
+ [0.1.0]: https://github.com/tBeltty/auditor-executor-protocol/tree/7e9701cdacf732fa63b28428eedd9dcc7250fa2f
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: aepkit
3
- Version: 0.6.0
3
+ Version: 0.7.1
4
4
  Summary: Mechanical support for the Auditor/Executor protocol: scaffold, lint, and negative-control the document set for a multi-phase, multi-agent execution.
5
5
  Author-email: tBeltty <jhonatan@tbelt.online>
6
6
  License-Expression: MIT
@@ -30,9 +30,10 @@ Requires-Dist: pytest-cov>=4.0; extra == "test"
30
30
  Provides-Extra: dev
31
31
  Requires-Dist: pytest>=7.0; extra == "dev"
32
32
  Requires-Dist: pytest-cov>=4.0; extra == "dev"
33
- Requires-Dist: ruff>=0.1.0; extra == "dev"
34
- Requires-Dist: mypy>=1.0.0; extra == "dev"
35
- Requires-Dist: build>=1.0.0; extra == "dev"
33
+ Requires-Dist: ruff==0.16.10; extra == "dev"
34
+ Requires-Dist: mypy==2.4.0; extra == "dev"
35
+ Requires-Dist: build==1.6.1; extra == "dev"
36
+ Requires-Dist: twine==7.0.0; extra == "dev"
36
37
  Dynamic: license-file
37
38
 
38
39
  # Auditor/Executor Protocol
@@ -43,13 +44,13 @@ Dynamic: license-file
43
44
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
44
45
  [![Code style: ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/astral-sh/ruff)
45
46
  [![Checked with mypy](https://img.shields.io/badge/mypy-strict-blue)](https://mypy-lang.org/)
46
- [![Zero Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)](pyproject.toml)
47
+ [![Zero Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)](https://github.com/tBeltty/auditor-executor-protocol/blob/main/pyproject.toml)
47
48
 
48
49
  A two-role protocol for running multi-phase work through AI agents without the plan drifting into open-ended discussion and without "all tests pass" masquerading as verification.
49
50
 
50
51
  The **Auditor** defines what "done" means and proves it independently. The **Executor** implements one numbered task at a time and logs command output. Neither role crosses into the other.
51
52
 
52
- [`SKILL.md`](SKILL.md) specifies the protocol core; [`references/`](references/) holds the parts an agent loads only when it reaches that step (task and gate writing, handoff templates, Autonomous mode, failure modes and a worked example). `aepkit` is a zero-dependency Python CLI that automates scaffolding, drift linting, negative controls, status tallies, and installing the skill into your agent.
53
+ [`SKILL.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/SKILL.md) specifies the protocol core; [`references/`](https://github.com/tBeltty/auditor-executor-protocol/tree/main/references) holds the parts an agent loads only when it reaches that step (task and gate writing, handoff templates, Autonomous mode, failure modes and a worked example). `aepkit` is a zero-dependency Python CLI that automates scaffolding, drift linting, negative controls, status tallies, and installing the skill into your agent.
53
54
 
54
55
  ---
55
56
 
@@ -147,13 +148,15 @@ Inspect open tasks and tallied verdicts:
147
148
  aepkit status docs/<task-name>
148
149
  ```
149
150
 
151
+ `aepkit status --json docs/<task-name>` prints the same reading as JSON, with each ID's phase, effective state and executor, and the phases with their titles from `execution-guide.md` (and weights from an optional `Weight` column in the plan's phase table), for scripts and tools to use instead of parsing the log.
152
+
150
153
  Cross-check document consistency:
151
154
 
152
155
  ```bash
153
156
  aepkit lint docs/<task-name>
154
157
  ```
155
158
 
156
- `aepkit lint` catches an empty guide, tasks without a report line, missing report entries, log entries with no matching task, `DONE` reports whose verify output is not pasted in a code block, gates without a stated negative control (hypothetical or waived ones do not count), work reported in a phase before every earlier phase is `APPROVED`, unfilled opportunity/shaping/non-goal fields in `plan-of-record.md` once work is reported `DONE` or audited, open rows in the deferred items ledger for a phase being closed, duplicated log paragraphs, and annex buildup past `--annex-threshold` (default 6, overall or per phase). It checks that evidence is present and in the right form, not that it is genuine; the Auditor's re-run does that.
159
+ `aepkit lint` catches an empty guide, tasks without a report line, missing report entries, log entries with no matching task, `DONE` reports whose verify output is not pasted in a code block, gates without a stated negative control (hypothetical or waived ones do not count), work reported in a phase before every earlier phase is `APPROVED`, unfilled opportunity/shaping/non-goal fields in `plan-of-record.md` once work is reported `DONE` or audited, open rows in the deferred items ledger for a phase being closed, duplicated log paragraphs, and annex buildup past `--annex-threshold` (default 6 in total, with a per-phase breakdown). It checks that evidence is present and in the right form, not that it is genuine; the Auditor's re-run does that.
157
160
 
158
161
  ### 5. Run a Negative Control
159
162
 
@@ -169,9 +172,20 @@ aepkit negcontrol \
169
172
 
170
173
  The `sed -i ''` form above is BSD/macOS sed; on GNU/Linux use `sed -i 's/.../.../' file`.
171
174
 
172
- `negcontrol` backs up the target file, applies the break mutation, confirms the test fails, restores the file with byte-level verification, confirms the test passes, and outputs a transcript ready for `compliance-log.md`. Without `--file`, pass `--restore-cmd` to undo the break yourself; with both, the backup still wins if the file is not byte-identical afterwards. `--timeout` limits each command in seconds.
175
+ `negcontrol` backs up the target file, applies the break mutation, confirms the test fails, restores the file with byte-level verification, confirms the test passes, and outputs a transcript ready for `compliance-log.md`. Without `--file`, pass `--restore-cmd` to undo the break yourself; with both, the backup still wins if the file is not byte-identical afterwards. `--file` needs `--break-cmd`, because the backup must be taken before the break. `--timeout` limits each command in seconds, and a test that times out instead of failing fails the control: a hang is not a caught break.
176
+
177
+ A failure only proves something if it is the failure you meant. A syntax error, a missing import or a mistyped test command also makes the test exit non-zero. `--expect` takes a regular expression that the failing run's output must match, and the control fails if it does not. Without `--expect`, output that looks like a syntax, import, collection or command-not-found error is flagged with a `WARNING` next to the `OK`, and you need to read the transcript to confirm the reason.
178
+
179
+ ### Optional: Progress Pane for Claude Code
180
+
181
+ `aeprogress` is a Claude Code mod that keeps a pane beside the chat with the run's overall percentage, a bar per phase, who is working on which task ID (Claude Code subagents, Orca workers, or any other harness through a command of your own), what awaits audit, what needs attention, and the machine's load. It reads the log through `aepkit status --json` and refreshes after each turn, and every 20 seconds while the pane is open. While a run is found it also holds back launching another Executor past a worker count or a machine load (2 workers, 1 building, 75% busy by default; a handoff marked `Load: docs-only` does not count as a build), and on macOS it recommends excluding the project from Spotlight when indexing keeps the machine busy. The protocol does not depend on it.
182
+
183
+ ```
184
+ /plugin install aeprogress --marketplace tBeltty/auditor-executor-protocol
185
+ /aeprogress docs/<task-name>
186
+ ```
173
187
 
174
- A failure only proves something if it is the failure you meant. A syntax error, a missing import or a mistyped test command also makes the test exit non-zero. `--expect` takes a regular expression that the failing run's output must match, and the control fails if it does not. Without `--expect`, output that looks like a syntax, import, collection, timeout or command-not-found error is flagged with a `WARNING` next to the `OK`, and you need to read the transcript to confirm the reason.
188
+ It works in the terminal and in the desktop app's local sessions. Claude Code's mod API is early access, so a Claude Code release can break it. Setup, options and how the percentage is computed: [integrations/claude-code/aeprogress](https://github.com/tBeltty/auditor-executor-protocol/tree/main/integrations/claude-code/aeprogress).
175
189
 
176
190
  ---
177
191
 
@@ -183,7 +197,7 @@ A failure only proves something if it is the failure you meant. A syntax error,
183
197
  | `aepkit install-skill [dir]` | `--agent`, `--global`, `--dest`, `--force` | Provision `SKILL.md` and `references/` into Antigravity, Claude Code, or Cursor |
184
198
  | `aepkit lint <dir>` | `--annex-threshold` | Cross-check IDs both ways, flag `DONE` without evidence, detect missing negative controls, and flag log rot |
185
199
  | `aepkit negcontrol` | `--test-cmd` (required), `--file`, `--break-cmd`, `--restore-cmd`, `--expect`, `--timeout` | Run automated backup, break, fail, restore, and pass cycle |
186
- | `aepkit status <dir>` | | Combine status board verdicts with reports; list everything not `APPROVED` |
200
+ | `aepkit status <dir>` | `--json` | Combine status board verdicts with reports; list everything not `APPROVED` |
187
201
 
188
202
  `python -m aepkit` works the same as `aepkit`. Errors go to stderr.
189
203
 
@@ -212,11 +226,11 @@ pytest
212
226
 
213
227
  ## Contributing
214
228
 
215
- Contributions are welcome. [`CONTRIBUTING.md`](CONTRIBUTING.md) covers the development setup, the quality gates, and the PR checklist; participation follows the [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). Report vulnerabilities privately as described in [`SECURITY.md`](SECURITY.md). Changes are listed in [`CHANGELOG.md`](CHANGELOG.md).
229
+ Contributions are welcome. [`CONTRIBUTING.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CONTRIBUTING.md) covers the development setup, the quality gates, and the PR checklist; participation follows the [`CODE_OF_CONDUCT.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CODE_OF_CONDUCT.md). Report vulnerabilities privately as described in [`SECURITY.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/SECURITY.md). Changes are listed in [`CHANGELOG.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CHANGELOG.md).
216
230
 
217
231
  ## License
218
232
 
219
- MIT (see [`LICENSE`](LICENSE)).
233
+ MIT (see [`LICENSE`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/LICENSE)).
220
234
 
221
235
  ---
222
236
 
@@ -6,13 +6,13 @@
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
7
  [![Code style: ruff](https://img.shields.io/badge/code%20style-ruff-000000.svg)](https://github.com/astral-sh/ruff)
8
8
  [![Checked with mypy](https://img.shields.io/badge/mypy-strict-blue)](https://mypy-lang.org/)
9
- [![Zero Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)](pyproject.toml)
9
+ [![Zero Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)](https://github.com/tBeltty/auditor-executor-protocol/blob/main/pyproject.toml)
10
10
 
11
11
  A two-role protocol for running multi-phase work through AI agents without the plan drifting into open-ended discussion and without "all tests pass" masquerading as verification.
12
12
 
13
13
  The **Auditor** defines what "done" means and proves it independently. The **Executor** implements one numbered task at a time and logs command output. Neither role crosses into the other.
14
14
 
15
- [`SKILL.md`](SKILL.md) specifies the protocol core; [`references/`](references/) holds the parts an agent loads only when it reaches that step (task and gate writing, handoff templates, Autonomous mode, failure modes and a worked example). `aepkit` is a zero-dependency Python CLI that automates scaffolding, drift linting, negative controls, status tallies, and installing the skill into your agent.
15
+ [`SKILL.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/SKILL.md) specifies the protocol core; [`references/`](https://github.com/tBeltty/auditor-executor-protocol/tree/main/references) holds the parts an agent loads only when it reaches that step (task and gate writing, handoff templates, Autonomous mode, failure modes and a worked example). `aepkit` is a zero-dependency Python CLI that automates scaffolding, drift linting, negative controls, status tallies, and installing the skill into your agent.
16
16
 
17
17
  ---
18
18
 
@@ -110,13 +110,15 @@ Inspect open tasks and tallied verdicts:
110
110
  aepkit status docs/<task-name>
111
111
  ```
112
112
 
113
+ `aepkit status --json docs/<task-name>` prints the same reading as JSON, with each ID's phase, effective state and executor, and the phases with their titles from `execution-guide.md` (and weights from an optional `Weight` column in the plan's phase table), for scripts and tools to use instead of parsing the log.
114
+
113
115
  Cross-check document consistency:
114
116
 
115
117
  ```bash
116
118
  aepkit lint docs/<task-name>
117
119
  ```
118
120
 
119
- `aepkit lint` catches an empty guide, tasks without a report line, missing report entries, log entries with no matching task, `DONE` reports whose verify output is not pasted in a code block, gates without a stated negative control (hypothetical or waived ones do not count), work reported in a phase before every earlier phase is `APPROVED`, unfilled opportunity/shaping/non-goal fields in `plan-of-record.md` once work is reported `DONE` or audited, open rows in the deferred items ledger for a phase being closed, duplicated log paragraphs, and annex buildup past `--annex-threshold` (default 6, overall or per phase). It checks that evidence is present and in the right form, not that it is genuine; the Auditor's re-run does that.
121
+ `aepkit lint` catches an empty guide, tasks without a report line, missing report entries, log entries with no matching task, `DONE` reports whose verify output is not pasted in a code block, gates without a stated negative control (hypothetical or waived ones do not count), work reported in a phase before every earlier phase is `APPROVED`, unfilled opportunity/shaping/non-goal fields in `plan-of-record.md` once work is reported `DONE` or audited, open rows in the deferred items ledger for a phase being closed, duplicated log paragraphs, and annex buildup past `--annex-threshold` (default 6 in total, with a per-phase breakdown). It checks that evidence is present and in the right form, not that it is genuine; the Auditor's re-run does that.
120
122
 
121
123
  ### 5. Run a Negative Control
122
124
 
@@ -132,9 +134,20 @@ aepkit negcontrol \
132
134
 
133
135
  The `sed -i ''` form above is BSD/macOS sed; on GNU/Linux use `sed -i 's/.../.../' file`.
134
136
 
135
- `negcontrol` backs up the target file, applies the break mutation, confirms the test fails, restores the file with byte-level verification, confirms the test passes, and outputs a transcript ready for `compliance-log.md`. Without `--file`, pass `--restore-cmd` to undo the break yourself; with both, the backup still wins if the file is not byte-identical afterwards. `--timeout` limits each command in seconds.
137
+ `negcontrol` backs up the target file, applies the break mutation, confirms the test fails, restores the file with byte-level verification, confirms the test passes, and outputs a transcript ready for `compliance-log.md`. Without `--file`, pass `--restore-cmd` to undo the break yourself; with both, the backup still wins if the file is not byte-identical afterwards. `--file` needs `--break-cmd`, because the backup must be taken before the break. `--timeout` limits each command in seconds, and a test that times out instead of failing fails the control: a hang is not a caught break.
138
+
139
+ A failure only proves something if it is the failure you meant. A syntax error, a missing import or a mistyped test command also makes the test exit non-zero. `--expect` takes a regular expression that the failing run's output must match, and the control fails if it does not. Without `--expect`, output that looks like a syntax, import, collection or command-not-found error is flagged with a `WARNING` next to the `OK`, and you need to read the transcript to confirm the reason.
140
+
141
+ ### Optional: Progress Pane for Claude Code
142
+
143
+ `aeprogress` is a Claude Code mod that keeps a pane beside the chat with the run's overall percentage, a bar per phase, who is working on which task ID (Claude Code subagents, Orca workers, or any other harness through a command of your own), what awaits audit, what needs attention, and the machine's load. It reads the log through `aepkit status --json` and refreshes after each turn, and every 20 seconds while the pane is open. While a run is found it also holds back launching another Executor past a worker count or a machine load (2 workers, 1 building, 75% busy by default; a handoff marked `Load: docs-only` does not count as a build), and on macOS it recommends excluding the project from Spotlight when indexing keeps the machine busy. The protocol does not depend on it.
144
+
145
+ ```
146
+ /plugin install aeprogress --marketplace tBeltty/auditor-executor-protocol
147
+ /aeprogress docs/<task-name>
148
+ ```
136
149
 
137
- A failure only proves something if it is the failure you meant. A syntax error, a missing import or a mistyped test command also makes the test exit non-zero. `--expect` takes a regular expression that the failing run's output must match, and the control fails if it does not. Without `--expect`, output that looks like a syntax, import, collection, timeout or command-not-found error is flagged with a `WARNING` next to the `OK`, and you need to read the transcript to confirm the reason.
150
+ It works in the terminal and in the desktop app's local sessions. Claude Code's mod API is early access, so a Claude Code release can break it. Setup, options and how the percentage is computed: [integrations/claude-code/aeprogress](https://github.com/tBeltty/auditor-executor-protocol/tree/main/integrations/claude-code/aeprogress).
138
151
 
139
152
  ---
140
153
 
@@ -146,7 +159,7 @@ A failure only proves something if it is the failure you meant. A syntax error,
146
159
  | `aepkit install-skill [dir]` | `--agent`, `--global`, `--dest`, `--force` | Provision `SKILL.md` and `references/` into Antigravity, Claude Code, or Cursor |
147
160
  | `aepkit lint <dir>` | `--annex-threshold` | Cross-check IDs both ways, flag `DONE` without evidence, detect missing negative controls, and flag log rot |
148
161
  | `aepkit negcontrol` | `--test-cmd` (required), `--file`, `--break-cmd`, `--restore-cmd`, `--expect`, `--timeout` | Run automated backup, break, fail, restore, and pass cycle |
149
- | `aepkit status <dir>` | | Combine status board verdicts with reports; list everything not `APPROVED` |
162
+ | `aepkit status <dir>` | `--json` | Combine status board verdicts with reports; list everything not `APPROVED` |
150
163
 
151
164
  `python -m aepkit` works the same as `aepkit`. Errors go to stderr.
152
165
 
@@ -175,11 +188,11 @@ pytest
175
188
 
176
189
  ## Contributing
177
190
 
178
- Contributions are welcome. [`CONTRIBUTING.md`](CONTRIBUTING.md) covers the development setup, the quality gates, and the PR checklist; participation follows the [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md). Report vulnerabilities privately as described in [`SECURITY.md`](SECURITY.md). Changes are listed in [`CHANGELOG.md`](CHANGELOG.md).
191
+ Contributions are welcome. [`CONTRIBUTING.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CONTRIBUTING.md) covers the development setup, the quality gates, and the PR checklist; participation follows the [`CODE_OF_CONDUCT.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CODE_OF_CONDUCT.md). Report vulnerabilities privately as described in [`SECURITY.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/SECURITY.md). Changes are listed in [`CHANGELOG.md`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/CHANGELOG.md).
179
192
 
180
193
  ## License
181
194
 
182
- MIT (see [`LICENSE`](LICENSE)).
195
+ MIT (see [`LICENSE`](https://github.com/tBeltty/auditor-executor-protocol/blob/main/LICENSE)).
183
196
 
184
197
  ---
185
198
 
@@ -188,7 +188,6 @@ done before task 1 is drafted:**
188
188
  | Rule | Look for |
189
189
  |---|---|
190
190
  | Version bump per change | A version field (`package.json`, `pyproject.toml`, a `VERSION` file) and any script that already bumps it |
191
- | No AI co-author trailers | `git log --grep="Co-Authored-By"` — existing trailers (or their consistent absence) |
192
191
  | Fetch-before-push | Multiple contributors or branches in `git log`/`git branch -a` — a solo, single-branch repo needs this less |
193
192
  | Quality gate green before push | CI config (`.github/workflows/`, `.gitlab-ci.yml`) or a `test`/`lint`/`build` script already wired together |
194
193
  | i18n/locale parity | A locales/translations directory with more than one language file |
@@ -299,7 +298,7 @@ report's job is to point at the evidence, not to argue for a verdict.
299
298
  for the whole feature.
300
299
  8. **Before sending the verdict, check what it's missing, not just what it says.** This
301
300
  applies to every verdict, not only a full-phase `APPROVED` or a `CONDITIONAL`/
302
- `REJECTED` with an obvious remediation — a plain `PASS` on one task, mid-phase, with
301
+ `REJECTED` with an obvious remediation — a plain `APPROVED` on one task, mid-phase, with
303
302
  something else already outstanding (an earlier remediation, the next task) needs the
304
303
  same discipline: it does not end the message on its own. If anything is left to do —
305
304
  a remediation handoff, the next task's handoff, or a re-statement of a handoff already
@@ -423,7 +422,7 @@ If `aepkit` is installed, prefer it over doing these by hand:
423
422
  compliance log in both directions, flag `DONE` reports with no pasted verify output
424
423
  (output counts only inside a fenced code block; prose such as "all tests pass" or a lone
425
424
  "n/a" is not output), flag work reported in a phase before every earlier phase is
426
- `APPROVED`, flag near-duplicate paragraphs, warn on annex count per phase, flag gates with no
425
+ `APPROVED`, flag near-duplicate paragraphs, warn on annex count (listed per phase), flag gates with no
427
426
  stated negative control (it must name the action that removes the protection and the
428
427
  failure that follows; a negated, deferred, hypothetical, or waived mention such as "n/a",
429
428
  "TBD", or "we could remove it" does not count), and—once work has started (`DONE` or a
@@ -437,12 +436,19 @@ If `aepkit` is installed, prefer it over doing these by hand:
437
436
  file up, runs the break command, runs the test (expects failure), restores from the
438
437
  backup, runs the test again (expects success), and prints a paste-ready transcript.
439
438
  With `--restore-cmd`, the file must still end byte-identical to the backup or it is
440
- restored from it; `--timeout` bounds each command. Pass `--expect "<regex>"` with the
439
+ restored from it. `--file` needs `--break-cmd`, since the backup must come before the
440
+ break. `--timeout` bounds each command, and a test that times out instead of failing
441
+ fails the control. Pass `--expect "<regex>"` with the
441
442
  failure the break should cause (an assertion message, a 403): a test that fails for
442
443
  another reason, such as a syntax error or a missing import, then fails the control
443
444
  instead of passing it. Without `--expect`, such output is only flagged as a warning.
444
445
  - `aepkit status <dir>` — combines the status board verdicts with the latest report
445
446
  per ID and prints what's still open. Only `APPROVED` closes an item; a `DONE` with no
446
- verdict is listed as awaiting audit.
447
-
448
- See the repo's `README.md` for install instructions.
447
+ verdict is listed as awaiting audit. `--json` prints the same reading, with the phases
448
+ from the guide and the plan, for tools to use instead of parsing the log themselves.
449
+ - Optional, Claude Code only: the `aeprogress` mod keeps a pane beside the chat with the
450
+ run's progress per phase and who is working on which ID (subagents, Orca workers, or
451
+ any harness through a command). The protocol does not depend on it. See
452
+ `integrations/claude-code/aeprogress/` in the repository.
453
+
454
+ Install instructions: https://github.com/tBeltty/auditor-executor-protocol#quickstart
@@ -45,12 +45,15 @@ test = [
45
45
  "pytest>=7.0",
46
46
  "pytest-cov>=4.0",
47
47
  ]
48
+ # Exact pins, so a new linter rule or build-tool release cannot turn CI red or change a
49
+ # published build without a commit; Dependabot bumps them.
48
50
  dev = [
49
51
  "pytest>=7.0",
50
52
  "pytest-cov>=4.0",
51
- "ruff>=0.1.0",
52
- "mypy>=1.0.0",
53
- "build>=1.0.0",
53
+ "ruff==0.16.10",
54
+ "mypy==2.4.0",
55
+ "build==1.6.1",
56
+ "twine==7.0.0",
54
57
  ]
55
58
 
56
59
  [project.scripts]
@@ -68,6 +71,8 @@ where = ["src"]
68
71
  [tool.ruff]
69
72
  line-length = 100
70
73
  target-version = "py311"
74
+ # agent-produced run directories and experiment scripts are data, not package code
75
+ extend-exclude = ["benchmarks"]
71
76
 
72
77
  [tool.ruff.lint]
73
78
  select = ["E", "F", "W", "I", "UP", "B", "PL", "RUF"]
@@ -82,7 +87,7 @@ ignore = [
82
87
  ]
83
88
 
84
89
  [tool.ruff.lint.per-file-ignores]
85
- "tests/*" = ["RUF001", "BLE001"]
90
+ "tests/*" = ["RUF001"]
86
91
 
87
92
  [tool.mypy]
88
93
  python_version = "3.11"
@@ -47,6 +47,10 @@ it from a governance decision in the plan of record. It has four parts:
47
47
  made: <decision-entry IDs, or "none">. Next: <phase/task already launched>.
48
48
  ```
49
49
 
50
+ Between reports, an owner on Claude Code can follow the run in the optional
51
+ `aeprogress` pane (`integrations/claude-code/aeprogress/` in the repository), which
52
+ reads the compliance log and never messages the Auditor. The run does not depend on it.
53
+
50
54
  Harness permission prompts that need the owner go in **one batched request**, not one
51
55
  at a time. When every phase is `APPROVED` and the plan of record declares no further
52
56
  phase, say so as its own line — see "Closing the run" in `SKILL.md`.
@@ -91,7 +95,7 @@ each handoff. The shape that has worked here:
91
95
  its first task.
92
96
 
93
97
  Do not end a turn between a verdict and the next launch unless something on the
94
- critical-risk list is open. A run that stops to report a `PASS` and wait is Guided
98
+ critical-risk list is open. A run that stops to report an `APPROVED` and wait is Guided
95
99
  mode by accident.
96
100
 
97
101
  ### Starting the Auditor (the Auditor brief)
@@ -23,7 +23,7 @@ this file.
23
23
  - **Silent model inheritance.** A subagent launched without an explicit model runs on
24
24
  the Auditor's own model. Nothing fails; the rule is just broken on every task. Pass
25
25
  it every time.
26
- - **Guided by habit.** In Autonomous mode, the Auditor ends a turn after a `PASS` to
26
+ - **Guided by habit.** In Autonomous mode, the Auditor ends a turn after an `APPROVED` to
27
27
  "report," or asks the owner a question the charter already lets it decide. Each one
28
28
  costs the owner a message and adds nothing.
29
29
  - **A defect ships and nobody owns re-checking its blast radius.** A task changes what
@@ -32,6 +32,8 @@ ROLE: Executor. Work from <EXECUTION_GUIDE> (Phase <n>, `<TASK-ID>`) only; repor
32
32
  [Autonomous mode only:] You are the Auditor's subagent. Questions go as BLOCKED in the
33
33
  log and in your final report; you do not address the owner.
34
34
 
35
+ [Optional, only when the run uses a launch limit:] Load: docs-only
36
+
35
37
  REPORTED STATE: <what is already DONE in the log, and whether it was audited or only
36
38
  self-reported — do not conflate the two>. Do not reopen <prior tasks>.
37
39
 
@@ -71,6 +73,13 @@ mid-task.
71
73
  Do not paste a rules-of-engagement block from one project's run into another's handoff
72
74
  without re-confirming it applies. It is a per-run artifact, not part of this skill.
73
75
 
76
+ `Load: docs-only` is for runs where a tool holds back Executor launches while the machine
77
+ is busy, such as the optional `aeprogress` mod for Claude Code. Put it on its own line in
78
+ a handoff whose task compiles, builds and tests nothing (documentation, a plan, a review),
79
+ so it can run beside a task that builds. Leave it out when unsure: a handoff without it
80
+ counts as a build, which is the safe side. The protocol does not require the line, and a
81
+ run with no such tool ignores it.
82
+
74
83
  ## Remediation handoff (Auditor)
75
84
 
76
85
  A verdict is not the deliverable — a well-evidenced `CONDITIONAL` or `REJECTED` that
@@ -120,7 +129,7 @@ Auditor's own rule 4 ("The Auditor is bound by rule 4 too" in `SKILL.md`).
120
129
 
121
130
  **No verdict ends the loop by itself if anything is left to run — and "anything left to
122
131
  run" is not only "a phase remains" or "a remediation order is needed."** It also covers
123
- the most common case of all: a plain `PASS` on one task, mid-phase, with something else
132
+ the most common case of all: a plain `APPROVED` on one task, mid-phase, with something else
124
133
  already outstanding — an earlier remediation, the next task in line. That case has no
125
134
  name of its own in the Verdicts table of `SKILL.md`, which is exactly why it's the easiest one
126
135
  to ship without a handoff: closing with a status sentence that *describes* what's still
@@ -0,0 +1 @@
1
+ __version__ = "0.7.1"
@@ -1,9 +1,11 @@
1
1
  """aepkit — mechanical support for the Auditor/Executor protocol.
2
2
 
3
- See SKILL.md in the repo root for the protocol itself. This CLI operationalizes the
4
- parts of it that are checklist work, not judgment: scaffolding the document set,
5
- cross-checking it for drift, running a negative control end to end, and reporting
6
- status.
3
+ The protocol itself is SKILL.md:
4
+ https://github.com/tBeltty/auditor-executor-protocol/blob/main/SKILL.md
5
+
6
+ This CLI operationalizes the parts of it that are checklist work, not judgment:
7
+ scaffolding the document set, cross-checking it for drift, running a negative control
8
+ end to end, and reporting status.
7
9
  """
8
10
 
9
11
  from __future__ import annotations
@@ -15,7 +17,9 @@ from . import __version__, install_skill, lint, negcontrol, scaffold, status
15
17
 
16
18
 
17
19
  def build_parser() -> argparse.ArgumentParser:
18
- parser = argparse.ArgumentParser(prog="aepkit", description=__doc__)
20
+ parser = argparse.ArgumentParser(
21
+ prog="aepkit", description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
22
+ )
19
23
  parser.add_argument("--version", action="version", version=f"aepkit {__version__}")
20
24
  sub = parser.add_subparsers(dest="command", required=True)
21
25
 
@@ -39,7 +43,7 @@ def build_parser() -> argparse.ArgumentParser:
39
43
  type=int,
40
44
  metavar="N",
41
45
  default=lint.DEFAULT_ANNEX_THRESHOLD,
42
- help="flag more annexes than this, overall or per phase (default: %(default)s)",
46
+ help="flag more annexes than this in total, listed per phase (default: %(default)s)",
43
47
  )
44
48
 
45
49
  p_neg = sub.add_parser("negcontrol", help="run a backup/break/test/restore/test cycle")
@@ -85,6 +89,12 @@ def build_parser() -> argparse.ArgumentParser:
85
89
  "status", help="tally verdicts and reports in the compliance log; only APPROVED closes"
86
90
  )
87
91
  p_status.add_argument("target_dir", help="directory holding compliance-log.md")
92
+ p_status.add_argument(
93
+ "--json",
94
+ dest="as_json",
95
+ action="store_true",
96
+ help="print the reading as JSON, with phases from the execution guide and the plan",
97
+ )
88
98
 
89
99
  p_install = sub.add_parser(
90
100
  "install-skill", help="provision SKILL.md and references/ into an agent skills directory"
@@ -137,7 +147,7 @@ def main(argv: list[str] | None = None) -> int:
137
147
  expect=args.expect,
138
148
  )
139
149
  if args.command == "status":
140
- return status.run(args.target_dir)
150
+ return status.run(args.target_dir, as_json=args.as_json)
141
151
  return install_skill.run(
142
152
  target_dir=args.target_dir,
143
153
  agent=args.agent,
@@ -61,7 +61,7 @@ def _detect_agent(target: Path) -> str:
61
61
  # 2. Check runtime environment variables
62
62
  if os.environ.get("ANTIGRAVITY_AGENT") or os.environ.get("GEMINI_CLI"):
63
63
  return "antigravity"
64
- if os.environ.get("CLAUDE_CODE") or os.environ.get("CLAUDE_PROJECT_DIR"):
64
+ if any(os.environ.get(v) for v in ("CLAUDECODE", "CLAUDE_CODE", "CLAUDE_PROJECT_DIR")):
65
65
  return "claude"
66
66
  if os.environ.get("CURSOR_PROJECT_DIR"):
67
67
  return "cursor"