plan-auditor 2.4.1__tar.gz → 2.4.3__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.
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/.gitignore +21 -0
- plan_auditor-2.4.3/CHANGELOG.md +456 -0
- plan_auditor-2.4.3/CITATION.cff +32 -0
- plan_auditor-2.4.3/CODE_OF_CONDUCT.md +136 -0
- plan_auditor-2.4.3/CONTRIBUTING.md +317 -0
- plan_auditor-2.4.3/PKG-INFO +399 -0
- plan_auditor-2.4.3/README.md +356 -0
- plan_auditor-2.4.3/SECURITY.md +108 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/SKILL.md +1 -1
- plan_auditor-2.4.3/bin/launcher_contract.test.js +292 -0
- plan_auditor-2.4.3/bin/plan-auditor.js +5 -0
- plan_auditor-2.4.3/bin/prepublish_gate.js +429 -0
- plan_auditor-2.4.3/bin/prepublish_gate_contract.test.js +285 -0
- plan_auditor-2.4.3/bin/prepublish_lifecycle.test.js +220 -0
- plan_auditor-2.4.3/bin/publish_mode_contract.test.js +204 -0
- plan_auditor-2.4.3/docs/benchmark.md +243 -0
- plan_auditor-2.4.3/docs/cli.md +186 -0
- plan_auditor-2.4.3/docs/index.md +95 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/docs/integrations.md +24 -0
- plan_auditor-2.4.3/docs/quickstart.md +408 -0
- plan_auditor-2.4.3/docs/release-status.md +76 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/docs/threat-model.md +2 -1
- plan_auditor-2.4.3/examples/fib/.plan-auditor/plan.json +68 -0
- plan_auditor-2.4.3/examples/fib/request-source.json +29 -0
- plan_auditor-2.4.3/hooks/gate_hook.py +98 -0
- plan_auditor-2.4.3/index.js +61 -0
- plan_auditor-2.4.3/mkdocs.yml +52 -0
- plan_auditor-2.4.3/package.json +61 -0
- plan_auditor-2.4.3/pyproject.toml +157 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/references/plan-format.md +7 -7
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/scripts/audit_check.py +132 -27
- plan_auditor-2.4.3/scripts/contract.py +172 -0
- plan_auditor-2.4.3/scripts/exec_trust.py +226 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/__init__.py +1 -1
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/request_contract.py +41 -4
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/sealing.py +27 -74
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_audit_check.py +18 -5
- plan_auditor-2.4.3/tests/test_doc_transcripts.py +397 -0
- plan_auditor-2.4.3/tests/test_docs_metadata.py +480 -0
- plan_auditor-2.4.3/tests/test_exec_trust_gate.py +515 -0
- plan_auditor-2.4.3/tests/test_npm_launcher.py +301 -0
- plan_auditor-2.4.3/tests/test_npm_registry_visibility.py +359 -0
- plan_auditor-2.4.3/tests/test_readme_quickstart.py +269 -0
- plan_auditor-2.4.3/tests/trusted_workspace.py +35 -0
- plan_auditor-2.4.1/CHANGELOG.md +0 -90
- plan_auditor-2.4.1/CONTRIBUTING.md +0 -19
- plan_auditor-2.4.1/PKG-INFO +0 -80
- plan_auditor-2.4.1/README.md +0 -51
- plan_auditor-2.4.1/docs/benchmark.md +0 -44
- plan_auditor-2.4.1/docs/quickstart.md +0 -30
- plan_auditor-2.4.1/examples/fib/.plan-auditor/plan.json +0 -25
- plan_auditor-2.4.1/pyproject.toml +0 -74
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/LICENSE +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/docs/architecture.md +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/docs/dependency-graph.md +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/docs/deployment-isolation.md +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/docs/formal-planning.md +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/examples/fib/fib.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/examples/fib/test_fib.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/hooks/README.md +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/scripts/__init__.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/scripts/integrity.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/scripts/plan_graph.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/scripts/stop_gate.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/adversarial.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/agents.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/agents_hardening.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/audit_session.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/cli.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/config.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/contracts.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/control_plane.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/coverage.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/daemon.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/events.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/evidence.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/formal_compiler.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/formal_planning.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/formal_semantics.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/gate.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/goals.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/integrity.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/lifecycle.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/lock_hardening.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/orchestrator.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/plan_verifier.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/plans.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/policies.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/priority.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/requirements.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/seal_migration.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/watchdog.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/supervisor/workspace.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/request_fixture.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_adversarial.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_agent_registry_chain.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_agents_gate.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_authenticated_integrity.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_cli.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_console_scripts.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_core_layers.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_daemon.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_dependency_graph.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_events.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_extra_layers.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_failure_injection.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_formal_compiler.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_formal_planning.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_formal_semantics.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_full_contract_hardening.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_hooks.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_integration_hardening.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_registry_lock_partial.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_request_contract_hardening.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_root_cause_fixes_v220.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/test_runtime_root_hardening.py +0 -0
- {plan_auditor-2.4.1 → plan_auditor-2.4.3}/tests/wheel_cli_smoke.py +0 -0
|
@@ -4,6 +4,11 @@ __pycache__/
|
|
|
4
4
|
build/
|
|
5
5
|
dist/
|
|
6
6
|
*.egg-info/
|
|
7
|
+
.venv/
|
|
8
|
+
venv/
|
|
9
|
+
.tmp-site/
|
|
10
|
+
site/
|
|
11
|
+
node_modules/
|
|
7
12
|
.plan-auditor/evidence.jsonl
|
|
8
13
|
.plan-auditor/evidence.head.json
|
|
9
14
|
.plan-auditor/evidence.write.lock
|
|
@@ -23,3 +28,19 @@ dist/
|
|
|
23
28
|
.plan-auditor/watchdog.jsonl
|
|
24
29
|
.plan-auditor/gate-warning.json
|
|
25
30
|
.plan-auditor/agents/
|
|
31
|
+
|
|
32
|
+
# coverage.py data file produced by the branch-coverage gate in
|
|
33
|
+
# .github/workflows/plan-audit.yml
|
|
34
|
+
.coverage
|
|
35
|
+
.coverage.*
|
|
36
|
+
coverage.xml
|
|
37
|
+
htmlcov/
|
|
38
|
+
|
|
39
|
+
# npm pack output written by the tarball-content gate in build.yml and
|
|
40
|
+
# npm-publish.yml, plus the tarball itself.
|
|
41
|
+
pack.json
|
|
42
|
+
*.tgz
|
|
43
|
+
|
|
44
|
+
# mypy cache from the type ratchet job
|
|
45
|
+
.mypy_cache/
|
|
46
|
+
.ruff_cache/
|
|
@@ -0,0 +1,456 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to plan-auditor. Versions are published to PyPI and npm.
|
|
4
|
+
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
## v2.4.3 - 2026-10-04
|
|
8
|
+
|
|
9
|
+
A documentation release. The README restructure and the three corrections below
|
|
10
|
+
land on PyPI's project page for the first time: `2.4.2`'s `long_description` is
|
|
11
|
+
the old 499-line README and still carries the "so it cannot drift from reality"
|
|
12
|
+
claim that this release removes. PyPI serves `description` per release, so only
|
|
13
|
+
a new release can change it.
|
|
14
|
+
|
|
15
|
+
**No behaviour change in `supervisor/`, in the deterministic core, or in the npm
|
|
16
|
+
launcher.** Verified against the published artifacts, not the working tree:
|
|
17
|
+
`supervisor/` has no commit since `311f4dc`, and the `index.js` and
|
|
18
|
+
`bin/plan-auditor.js` inside the PyPI `2.4.2` wheel are byte-identical to those
|
|
19
|
+
on `main`.
|
|
20
|
+
|
|
21
|
+
Two packaging changes do reach users. Both are already live on npm at `2.4.2`,
|
|
22
|
+
which was published at 16:16:46Z -- after #29 landed at 16:14:02Z -- so this is
|
|
23
|
+
the first release in which they reach PyPI:
|
|
24
|
+
|
|
25
|
+
- **The wheel's embedded `package.json` now declares `engines.node >=22.14.0`.**
|
|
26
|
+
The `2.4.2` wheel says `>=18`, because it was uploaded 2026-10-02T23:06:40Z and
|
|
27
|
+
therefore predates #27. Anyone copying the bundled launcher out of this wheel
|
|
28
|
+
onto Node 18 or 20 now gets npm's engine warning.
|
|
29
|
+
- **The sdist and npm tarball carry `bin/prepublish_gate.js`** in place of the
|
|
30
|
+
`bin/check_tarball_contents.js` and `bin/verify_installed_launcher.js` it
|
|
31
|
+
replaces. Both old scripts only ran under `prepublishOnly`; so does the new
|
|
32
|
+
one. Installed behaviour is unchanged -- what a publisher executes differs.
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
- **Three false claims in the README and quickstart are corrected.**
|
|
36
|
+
- The quick-start transcript documented `request_sha256`
|
|
37
|
+
`7b347f48...0db55f`. The CLI has never printed that value: `request_contract.py`
|
|
38
|
+
stamps `plan_contract_sha256s` into the request before hashing, so the printed
|
|
39
|
+
digest is not a hash of the source file. Running the documented walkthrough in
|
|
40
|
+
a clean virtualenv yields `d7d47e409fc1c53b9830346740bac2a20e716aefc71e7396ad3db0ebbdd837f2`.
|
|
41
|
+
Fixed in `README.md` and `docs/quickstart.md`. The value was unaffected by
|
|
42
|
+
reformatting the JSON, because the digest is taken over the parsed contract
|
|
43
|
+
rather than the file bytes.
|
|
44
|
+
- The README claimed the transcript "cannot drift from reality" because
|
|
45
|
+
`tests/test_readme_quickstart.py` executes it. It could. `_mask()` rewrites
|
|
46
|
+
every 64-hex string to `<sha256>` and the transcript check is a subset test, so
|
|
47
|
+
substituting `dead0000...` for the real digest left the suite green: measured
|
|
48
|
+
at 389 passed, 0 failed. The claim is corrected and two new tests close the gap
|
|
49
|
+
(see below).
|
|
50
|
+
- The README and `CONTRIBUTING.md` both described `examples/fib` as shipping a
|
|
51
|
+
"deliberately broken variant". It does not; the directory holds four files, none
|
|
52
|
+
of them broken. `docs/benchmark.md` is where you break it yourself, and says so.
|
|
53
|
+
|
|
54
|
+
- **`tests/test_readme_quickstart.py` can now fail on the two ways it used to
|
|
55
|
+
pass.** Proven by mutation against this commit.
|
|
56
|
+
- `test_readme_quickstart_hashes_are_not_normalised_away` compares the documented
|
|
57
|
+
digests against the *unmasked* real output, so a fabricated hash is rejected.
|
|
58
|
+
Replacing `request_sha256` with `dead0000...`: **389 passed / 0 failed before,
|
|
59
|
+
1 failed after**.
|
|
60
|
+
- `test_readme_quickstart_json_keys_match_the_real_output` compares the JSON key
|
|
61
|
+
sequence at each indentation level and only tolerates a shorter sequence where
|
|
62
|
+
the document actually used a `...` marker. Dropping `deterministic_core` from
|
|
63
|
+
the `audit` block, which had no elision, is now a failure. This check caught a
|
|
64
|
+
real omission introduced while compressing this very README.
|
|
65
|
+
- A third mutation, inserting a fabricated `plan_hash`, fails both the original
|
|
66
|
+
subset test and the new hash test.
|
|
67
|
+
|
|
68
|
+
- **The README now explains the repository instead of only the happy path.**
|
|
69
|
+
Measured against a 60-surface checklist drawn from the code, coverage goes from
|
|
70
|
+
14/60 to 60/60. Added: the L0-L14 layer table with the two layers that can decide
|
|
71
|
+
a verdict; all 11 command groups and their 17 nested actions; the other three
|
|
72
|
+
console scripts including `plan-auditor-formal`'s `verify`/`export-pddl`/
|
|
73
|
+
`make-check`; the core's `status`/`snapshot`/`rollback` modes; the `regex` check
|
|
74
|
+
type and the rule that `regex` and `file_exists` are non-behavioural; profiles,
|
|
75
|
+
run modes and the four LLM tiers; every file written under `.plan-auditor/`;
|
|
76
|
+
`hooks/gate_hook.py` as the single authoritative gate with no per-host adapter
|
|
77
|
+
files; exit codes including `3` for `UNKNOWN`; and
|
|
78
|
+
`references/plan-format.md`.
|
|
79
|
+
- Two checklist items from the audit were wrong and are documented as the code
|
|
80
|
+
actually is: the tiers are `NO_LLM`/`SMALL_LOCAL`/`STRONG_LOCAL`/`REMOTE`
|
|
81
|
+
(four, not "T1/T2/T3"), and there are no six hook adapters — `hooks/` contains
|
|
82
|
+
`gate_hook.py` and its README, and the per-host wiring patterns are documented
|
|
83
|
+
in `docs/integrations.md`.
|
|
84
|
+
|
|
85
|
+
- **The 53-line release-status block moved to `docs/release-status.md`** and is in
|
|
86
|
+
the mkdocs navigation. Almost all of it describes one version number and would be
|
|
87
|
+
wrong at the next release. The README keeps two lines, and keeps them honest
|
|
88
|
+
rather than dropping the substance: `2.4.2` is current on both registries, npm
|
|
89
|
+
has no provenance attestation and returns `404` for one, and PyPI publishes with a
|
|
90
|
+
PEP 740 attestation. `test_readme_states_the_npm_attestation_gap` still passes
|
|
91
|
+
against the shortened text, so the move did not cost the supply-chain disclosure.
|
|
92
|
+
|
|
93
|
+
- **Sections that GitHub or the docs already render are gone from the README:**
|
|
94
|
+
the inline `Troubleshooting` block (a 158-line per-error guide lives in
|
|
95
|
+
`docs/quickstart.md`), the standalone `npm` section, `Project links`, and
|
|
96
|
+
`License`. README length falls from 499 to 356 lines.
|
|
97
|
+
|
|
98
|
+
- **Two doc tests were updated because they pinned text that moved, not because
|
|
99
|
+
they were inconvenient.** `test_readme_adoption_region_covers_the_essentials`
|
|
100
|
+
used `## Troubleshooting` as its region sentinel; the sentinel is now
|
|
101
|
+
`## Documentation`, and the ordering assertions it exists to protect are
|
|
102
|
+
unchanged. `test_doc_transcripts.py` no longer requires the README to carry a
|
|
103
|
+
failing run, but now also requires the README to link the page that does, and
|
|
104
|
+
that page to still document the most common failure.
|
|
105
|
+
|
|
106
|
+
- **A new test keeps the deleted troubleshooting reachable.**
|
|
107
|
+
`test_readme_points_at_the_full_troubleshooting_page` fails if the README stops
|
|
108
|
+
linking `docs/quickstart.md`, or if that page stops documenting
|
|
109
|
+
`"request contract is not activated"`.
|
|
110
|
+
|
|
111
|
+
- **A successful npm publish is no longer reported as a failed one.** Run
|
|
112
|
+
37136117550 published `plan-auditor@2.4.2` and then failed its own
|
|
113
|
+
verification step one second later with `ERROR: npm reports 'nothing',
|
|
114
|
+
expected 2.4.2`. `npm publish` returns when the registry's *write* path accepts
|
|
115
|
+
the upload, while clients read from a CDN that converges asynchronously; the
|
|
116
|
+
run's own timestamps show the window, with the probe at 16:15:10Z against a
|
|
117
|
+
registry `time["2.4.2"]` of 16:16:46Z. The verification step now polls with a
|
|
118
|
+
growing backoff over a bounded budget — 12 attempts, ~200s of waiting, first
|
|
119
|
+
match wins — and a version that never appears still fails closed with a
|
|
120
|
+
`::warning::` explaining what to check. Both directions are covered by
|
|
121
|
+
`tests/test_npm_registry_visibility.py`.
|
|
122
|
+
- **The poll queries the registry over HTTP instead of `npm view`.** `npm view`'s
|
|
123
|
+
stdout is not a stable contract, its on-disk HTTP cache can answer from state
|
|
124
|
+
staler than the registry, and it inherits `npm_config_*` and `NODE_AUTH_TOKEN`
|
|
125
|
+
from the environment. `GET /<package>/<version>` is exactly what an
|
|
126
|
+
independent reader requests, with no cache in between.
|
|
127
|
+
- **Documentation now matches the registries.** `README.md`, `SECURITY.md` and
|
|
128
|
+
`docs/index.md`, `docs/quickstart.md`, `docs/integrations.md` no longer say npm
|
|
129
|
+
is unpublished or that the published builds are behind `main`. `2.4.2` is on
|
|
130
|
+
both registries; `2.4.0` and `2.4.1` carried the defects and `2.4.2` is the
|
|
131
|
+
fixed release.
|
|
132
|
+
- **The attestation story is stated per registry, from the registries themselves.**
|
|
133
|
+
PyPI `2.4.2` carries a PEP 740 provenance attestation. npm `2.4.2` does **not**:
|
|
134
|
+
the attestations endpoint returns `404` and the packument has no `provenance`
|
|
135
|
+
field, because it was published in token mode, which cannot mint one. The npm
|
|
136
|
+
`dist.signatures` block is npm's own signature over the packument and is not
|
|
137
|
+
described as provenance.
|
|
138
|
+
- **The npm badge is retained** only after confirming the registry's `latest`
|
|
139
|
+
(`2.4.2`) matches PyPI's version (`2.4.2`).
|
|
140
|
+
|
|
141
|
+
## v2.4.2 - 2026-10-03
|
|
142
|
+
|
|
143
|
+
- **npm publishing is restored, and `2.4.2` exists because the published `2.4.1`
|
|
144
|
+
npm build is broken.** Verified against the registry tarball, not against the
|
|
145
|
+
repository: `plan-auditor@2.4.1` ships an `index.js` that passes
|
|
146
|
+
`cwd: __dirname` to `spawn`, so `npx plan-auditor validate .` from a
|
|
147
|
+
workspace directory resolves `.` against the *installed package directory* and
|
|
148
|
+
reports `plan yok: .../node_modules/plan-auditor/.plan-auditor/plan.json`. The
|
|
149
|
+
launcher starts and an absolute workspace path works, so the failure is silent
|
|
150
|
+
and looks authoritative — it audits the wrong tree. `2.4.1` cannot be
|
|
151
|
+
republished because npm versions are immutable, hence the patch bump.
|
|
152
|
+
- **The launcher now runs the CLI in the caller's working directory.** `index.js`
|
|
153
|
+
keeps `process.cwd()` and prepends the package directory to `PYTHONPATH`
|
|
154
|
+
instead, so the bundled `supervisor` package stays importable without changing
|
|
155
|
+
what a relative workspace path means.
|
|
156
|
+
- **`npm publish` runs again.** The previous commit replaced the publish step
|
|
157
|
+
with `echo "npm publishing is disabled" && exit 0`, so the workflow reported
|
|
158
|
+
success while publishing nothing. Publishing is back, gated on the version not
|
|
159
|
+
already existing on the registry, and selectable between OIDC trusted
|
|
160
|
+
publishing and an `NPM_TOKEN` fallback that must be requested explicitly.
|
|
161
|
+
Correction: `2.4.2` itself was published in **token mode** — the run log
|
|
162
|
+
records `selected publish mode: token` — so it carries **no** provenance
|
|
163
|
+
attestation. The attestation endpoint for `plan-auditor@2.4.2` returns `404`
|
|
164
|
+
and the packument has no `provenance` field. Only PyPI publishes with
|
|
165
|
+
attestation, via trusted publishing.
|
|
166
|
+
- **The publish path proves the artifact works before uploading it.** The gate
|
|
167
|
+
packs the tarball, installs it into a throwaway directory, and runs the
|
|
168
|
+
*installed* `bin/plan-auditor.js` from an unrelated working directory against a
|
|
169
|
+
throwaway workspace. The `2.4.0` syntax error and the `2.4.1` wrong-directory
|
|
170
|
+
bug both fail that check.
|
|
171
|
+
- **npm and PyPI now share one release trigger.** Touching
|
|
172
|
+
`.github/pypi-release-trigger` on `main` publishes the same version to both
|
|
173
|
+
registries, so the two cannot drift apart.
|
|
174
|
+
|
|
175
|
+
### OSS visibility and onboarding (shipped in `2.4.2`)
|
|
176
|
+
|
|
177
|
+
Documentation and project-metadata work only. No behaviour in the supervisor, the
|
|
178
|
+
deterministic core or the npm launcher changed. This work was merged before the
|
|
179
|
+
`2.4.2` release commit, so it is part of `2.4.2` rather than still pending.
|
|
180
|
+
|
|
181
|
+
- **The README now states the real release status instead of implying parity.** The
|
|
182
|
+
published PyPI `2.4.1` was built 2026-09-29 and npm `2.4.1` 2026-10-01, from
|
|
183
|
+
different commits, and neither is byte-identical to `main`. The README carries a
|
|
184
|
+
table of what each published build actually contains, and says plainly which
|
|
185
|
+
surface to use for the verified quick start. A maintainer note marks the section
|
|
186
|
+
for deletion in the commit that bumps the version.
|
|
187
|
+
- **The "ships with the package" claim in `docs/benchmark.md` was false and is now
|
|
188
|
+
scoped.** The PyPI *wheel* contains only the `supervisor` and `scripts` packages;
|
|
189
|
+
`examples/fib` ships in the repository and in the *sdist*. Verified against the
|
|
190
|
+
published `plan_auditor-2.4.1-py3-none-any.whl`.
|
|
191
|
+
- **`docs/benchmark.md` gained a provenance table.** Every remaining quality claim
|
|
192
|
+
is tied to the exact command that produces it, plus the tool, the commit the text
|
|
193
|
+
describes and where the live value lives. The coverage figure for any commit is
|
|
194
|
+
deliberately not copied into the page, because a transcribed number goes stale;
|
|
195
|
+
the command and the workflow comment are the only places it appears. No
|
|
196
|
+
adoption, download or usage figure is printed anywhere, and telemetry is not
|
|
197
|
+
collected.
|
|
198
|
+
- **The skill path now says where the files come from.** The PyPI wheel ships no
|
|
199
|
+
`SKILL.md`, `references/` or `hooks/`, so `pipx install plan-auditor` alone
|
|
200
|
+
cannot use the Agent Skill path. The README and `docs/integrations.md` now give a
|
|
201
|
+
concrete `git clone` plus copy command instead of saying "copy the repository".
|
|
202
|
+
- **`docs/quickstart.md` no longer overstates its own verification.** It claimed
|
|
203
|
+
"everything on this page is executed by `tests/test_readme_quickstart.py`"; that
|
|
204
|
+
test parses the README's quick-start section only. The page now names the three
|
|
205
|
+
tests that actually check it and their separate responsibilities.
|
|
206
|
+
- **The `2.4.0` launcher troubleshooting entry was split by surface.** It conflated
|
|
207
|
+
the npm launcher bug with the pip console script; npm `2.4.0` is named as the
|
|
208
|
+
broken build and the fix is given per surface.
|
|
209
|
+
- **Interpreter requirement is documented where it bites.** The examples invoke
|
|
210
|
+
`python`; the note explains what to do on a system that only ships `python3`,
|
|
211
|
+
and that the npm launcher already picks `python3` off Windows.
|
|
212
|
+
- **README links are absolute and correct on every surface.** Repository-relative
|
|
213
|
+
links are dead on the PyPI project page, which renders this same file as the
|
|
214
|
+
package description. Every `docs/`, `SKILL.md`, `CHANGELOG.md`, `SECURITY.md`,
|
|
215
|
+
`CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `CITATION.cff` and `LICENSE` link is now
|
|
216
|
+
absolute, and each target was checked over HTTP.
|
|
217
|
+
- **A documentation URL is stated, and so is the reason there is no site yet.**
|
|
218
|
+
`docs/index.md` is the canonical entry point. `mkdocs.yml` is configured but no
|
|
219
|
+
GitHub Pages workflow exists, so the README no longer promises a rendered site
|
|
220
|
+
and instead gives the two-command local build with the `mkdocs-material`
|
|
221
|
+
dependency named. The old pointer to `CONTRIBUTING.md` for `mkdocs serve` was
|
|
222
|
+
false, since that file did not mention mkdocs at all.
|
|
223
|
+
- **"15 supervision layers" is now sourced.** The README attributes the count to
|
|
224
|
+
the L0-L14 table in `docs/architecture.md` instead of stating it bare.
|
|
225
|
+
- **A project-status section was added** without any download, star or user
|
|
226
|
+
figure: pre-1.0, single maintainer, no external contributors yet, no measured
|
|
227
|
+
comparison against other tools, and the note that human-readable output is
|
|
228
|
+
Turkish with no locale switch yet.
|
|
229
|
+
- **Governance files rewritten.** `SECURITY.md` gained a supported-versions table,
|
|
230
|
+
the private advisory route, a response target and an explicit statement that
|
|
231
|
+
there is no PGP key. `CODE_OF_CONDUCT.md` moved enforcement off the public
|
|
232
|
+
issue tracker, which would have exposed reporters, onto a private address, and
|
|
233
|
+
its Contact section now matches what Contributor Covenant 2.1 requires.
|
|
234
|
+
- **`CONTRIBUTING.md` documents the workflow the code actually implements** — the
|
|
235
|
+
real test and coverage commands, the seal and trust chain, exit codes, the
|
|
236
|
+
`CHECK_TYPES` extension path, and the release procedure including the reason the
|
|
237
|
+
two registries diverged.
|
|
238
|
+
- **Issue and pull-request templates added**, plus a documentation URL in
|
|
239
|
+
`CITATION.cff` and repository `topics`/`description` corrected to match what the
|
|
240
|
+
project is.
|
|
241
|
+
- **`mkdocs.yml`** gained `repo_name`, `edit_uri` so every page has an "edit on
|
|
242
|
+
GitHub" link, and social links for the repository, PyPI, npm and the citation
|
|
243
|
+
file. Navigation is unchanged and still covers every page.
|
|
244
|
+
|
|
245
|
+
#### Re-verified against `main` after #24
|
|
246
|
+
|
|
247
|
+
- **The README's release-status text was corrected against the merged code rather
|
|
248
|
+
than the previous `main`.** The wheel now force-includes the Agent Skill assets
|
|
249
|
+
under `plan_auditor_skill/`, so the earlier claim that a `pip` install cannot
|
|
250
|
+
supply `SKILL.md`, `references/` or `hooks/` was true of the published `2.4.1`
|
|
251
|
+
wheel and false of anything built from `main`. The README and
|
|
252
|
+
`docs/integrations.md` now document both routes — a checkout, or the installed
|
|
253
|
+
`plan_auditor_skill/` directory — with a command that prints its location, and
|
|
254
|
+
the claim is scoped to the already-published build. `docs/` and `examples/` are
|
|
255
|
+
still not in the wheel, which is stated as such.
|
|
256
|
+
- **The npm surface was re-checked against the merged launcher, not the old one.**
|
|
257
|
+
`index.js` now spawns the CLI with the caller's working directory and puts the
|
|
258
|
+
package directory on `PYTHONPATH`. The published npm `2.4.1` still resolves a
|
|
259
|
+
bare `.` against the installed package and can audit the wrong tree while
|
|
260
|
+
looking authoritative, so the README and `docs/quickstart.md` say so, give the
|
|
261
|
+
absolute-path workaround, and stop implying `npx` is unconditionally CI-safe.
|
|
262
|
+
Exit-code propagation, the `bin` field and the `python`/`python3` selection are
|
|
263
|
+
unchanged.
|
|
264
|
+
- **The coverage command in the provenance table was stale and is fixed.** It named
|
|
265
|
+
`--cov=supervisor --cov=scripts --cov-branch`, which measured the checkout. The
|
|
266
|
+
merged `pyproject.toml` reads `branch`, `source_pkgs` and `fail_under` from
|
|
267
|
+
`[tool.coverage.*]`, and `conftest.py` pins the suite to the installed
|
|
268
|
+
distribution, so the documented command is now
|
|
269
|
+
`python -m pytest tests/ -q --cov --cov-report=term-missing`.
|
|
270
|
+
- **"The mkdocs step is not part of CI" is no longer true** and was removed.
|
|
271
|
+
`docs (mkdocs --strict)` is a required check, pinned to `mkdocs==1.6.1` and
|
|
272
|
+
`mkdocs-material==9.6.14`; the page now names those pins and adds
|
|
273
|
+
`.github/scripts/check_dist_assets.py` to the reproduce list.
|
|
274
|
+
- **`CONTRIBUTING.md` documents the gates that now exist**: `ruff` and `mypy`
|
|
275
|
+
against ratchet baselines that refuse to record a higher count,
|
|
276
|
+
`version-lockstep`, `workflow-syntax`, `build (wheel + sdist)` with a
|
|
277
|
+
`twine check --strict`, `npm-launcher`, and `wheel-cli-smoke` on three
|
|
278
|
+
platforms. The release section was rewritten: OIDC trusted publishing only, the
|
|
279
|
+
GitHub release gated on the version-existence check, an npm `verify` job and an
|
|
280
|
+
already-published gate, and `main` protected by a ruleset with no bypass actors.
|
|
281
|
+
The local setup changed from `pip install -e .` to a non-editable install,
|
|
282
|
+
because `conftest.py` resolves the runtime packages from site-packages and fails
|
|
283
|
+
loudly if they are absent.
|
|
284
|
+
|
|
285
|
+
## The two published `2.4.1` builds are not the same artifact
|
|
286
|
+
|
|
287
|
+
Recorded here so nobody has to rediscover it: the same version number was
|
|
288
|
+
published to two registries from two different commits.
|
|
289
|
+
|
|
290
|
+
| Build | Published | Notes |
|
|
291
|
+
|---|---|---|
|
|
292
|
+
| PyPI `2.4.1` | 2026-09-29 | Built before the documentation and packaging rewrite. 14 keywords; its sdist omits `index.js`, `bin/`, `mkdocs.yml`, `SECURITY.md`, `CITATION.cff`, `CODE_OF_CONDUCT.md` and `package.json`; its project page serves the previous README. |
|
|
293
|
+
| npm `2.4.1` | 2026-10-01 | Built from the documentation rewrite; carries the `files` allowlist, the repaired launcher and the current README. |
|
|
294
|
+
|
|
295
|
+
`pyproject.toml` was left at `2.4.1` and the release workflow skips a version
|
|
296
|
+
that already exists on PyPI, so the metadata on `main` cannot be published without
|
|
297
|
+
a version bump. That part is unchanged by this entry.
|
|
298
|
+
|
|
299
|
+
The other half has been fixed since, by #24: the npm workflow now runs a `verify`
|
|
300
|
+
job — the launcher tests and the packed-tarball check — before publishing, and
|
|
301
|
+
refuses a version already on the registry, so the absence of any gate that let
|
|
302
|
+
`2.4.0` ship a syntax error is no longer the state of the tree. `main` is also
|
|
303
|
+
now protected by a ruleset with no bypass actors, so none of the required checks
|
|
304
|
+
can be skipped by pushing to `main`.
|
|
305
|
+
|
|
306
|
+
**Still outstanding:** the version bump itself. Until `2.4.2` is published to both
|
|
307
|
+
registries, a `pip` user keeps seeing the pre-rewrite README on the project page.
|
|
308
|
+
|
|
309
|
+
## v2.4.1 — PyPI 2026-09-29, npm 2026-10-01
|
|
310
|
+
|
|
311
|
+
### Published to both registries
|
|
312
|
+
|
|
313
|
+
- Metadata-only patch release: improved PyPI discovery keywords, classifiers, description, documentation links, and synchronized package version metadata.
|
|
314
|
+
|
|
315
|
+
### Published to npm only (built from the documentation rewrite)
|
|
316
|
+
|
|
317
|
+
#### README rebuilt around a verified quick start
|
|
318
|
+
|
|
319
|
+
- **README rebuilt around a verified quick start:** explicit problem/solution framing, "who it is for", `pipx` and `pip` install paths, a five-minute walkthrough, Agent Skill invocation table, a `plan-auditor doctor` troubleshooting section, accurate CI/PyPI/npm/license badges, and a stated list of honest limits.
|
|
320
|
+
- **Removed an inaccurate Python API example.** The previous README showed `from plan_auditor import AuditContract`; no such module exists in the distribution, which ships `supervisor` and `scripts`. The README now documents the real CLI only.
|
|
321
|
+
- **Quick start transcript is now machine-verified.** `tests/test_readme_quickstart.py` parses the documented JSON files and commands out of `README.md`, executes them through the installed CLI in a temporary workspace, and asserts every documented output line is real. The old transcript contained a `plan verify` block with fields that were never emitted.
|
|
322
|
+
- **Documentation site is coherent and strict-build clean.** Added `docs/index.md` and `docs/cli.md`, rewrote `docs/quickstart.md` with a full troubleshooting guide, added a working `examples/fib/request-source.json` so the shipped example passes the supervisor gate, and repaired `mkdocs.yml` navigation, which referenced a non-existent `index.md` and omitted four existing pages. `mkdocs build --strict` now exits 0.
|
|
323
|
+
- **`docs/benchmark.md` no longer contains fabricated comparative numbers.** It previously claimed results from "100 coding tasks" and detection rates for unnamed alternatives that no harness in this repository ever produced. It is replaced with a reproducible in-repo demo, the commands that back each remaining claim, and an explicit table of what is not measured.
|
|
324
|
+
- **Deterministic documentation and packaging checks.** New `tests/test_docs_metadata.py` verifies mkdocs navigation targets exist and cover every page, relative links resolve, README badges reference real workflows, no unverified adoption or trust-badge claims are present, every documented `plan-auditor` invocation is in the parser surface, and `pyproject.toml`/`package.json`/`SKILL.md`/`CITATION.cff` versions, classifiers, keywords, URLs, and npm launcher wiring agree with what ships.
|
|
325
|
+
- **`pyproject.toml` metadata completed:** broader keyword set, audience/topic/platform/typing classifiers, and `project.urls` entries for Security, Contributing, and Citation. `Development Status` and license metadata left unchanged because the published version is unchanged.
|
|
326
|
+
- **`package.json` aligned with the real CLI.** `npm test` was `echo "Error: no test specified" && exit 1`; it now syntax-checks the launcher. Added an explicit `files` allowlist so the published tarball no longer ships the entire working tree (the previous package included local virtual environments and build output). Version bumped to `2.4.1` to match the Python distribution.
|
|
327
|
+
- **`index.js` launcher repaired.** It contained a syntax error (`(code) =;`), so the published npm launcher could not run at all. It now forwards arguments to the Python CLI and propagates the child exit code. `files` ships everything the launcher needs at runtime (`supervisor`, `scripts`, `hooks`, `references`).
|
|
328
|
+
- **Housekeeping:** `.gitignore` now excludes `.venv/`, `venv/`, `.tmp-site/`, `site/`, and `node_modules/`.
|
|
329
|
+
- **Removed the broken PyPI downloads badge.** `img.shields.io/pypi/dm/plan-auditor`
|
|
330
|
+
answers HTTP 200 while rendering `downloads: inaccessible`, because shields.io
|
|
331
|
+
scrapes a third-party download API that is rate-limited or down. The README now
|
|
332
|
+
links the PyPI and npm project pages instead, which always answer 200 and always
|
|
333
|
+
carry the real numbers. No count is hardcoded. `tests/test_docs_metadata.py` now
|
|
334
|
+
fails if a `img.shields.io/pypi/d...` badge or a hand-copied download count
|
|
335
|
+
reappears anywhere in the docs.
|
|
336
|
+
|
|
337
|
+
#### npm launcher exit codes and transcript fidelity
|
|
338
|
+
|
|
339
|
+
- **Both npm entry points now propagate the verifier's exit code.** The fix was
|
|
340
|
+
initially placed only in `index.js`, but `package.json` maps the `plan-auditor`
|
|
341
|
+
bin to `bin/plan-auditor.js` — the file `npx plan-auditor` actually executes —
|
|
342
|
+
and that file discarded the child's result entirely. Verified: `node
|
|
343
|
+
bin/plan-auditor.js run <failing plan>` returned `0` while `index.js` returned
|
|
344
|
+
`1`. `index.js` now exposes `runPythonAndPropagate()`, which attaches the
|
|
345
|
+
`close` and `error` handlers and mirrors the code, and `bin/plan-auditor.js`
|
|
346
|
+
calls it. Exit codes are `1` for a failed step, `2` for a blocked audit, `0` for
|
|
347
|
+
a proven workspace, and nonzero if Python cannot be started.
|
|
348
|
+
- **`tests/test_npm_launcher.py` covers every entry point and the real package.**
|
|
349
|
+
Every exit-code assertion is parameterised over `bin/plan-auditor.js` and
|
|
350
|
+
`index.js`, the launcher's code is compared against the underlying CLI's, and the
|
|
351
|
+
failing/passing/blocked checks are repeated against the packed npm tarball so a
|
|
352
|
+
fix that works only in the working tree fails the suite. All of these were
|
|
353
|
+
confirmed to fail against the pre-fix `bin` (6 failures) and pass after.
|
|
354
|
+
- `test_docs_metadata.py` and `test_doc_transcripts.py` now check that the `bin`
|
|
355
|
+
field resolves to a launcher that propagates rather than a bare spawn, and that
|
|
356
|
+
documented launcher commands reference a file that exists.
|
|
357
|
+
- **Verbatim transcripts.** The README and `docs/quickstart.md`/`docs/cli.md` failure transcripts previously showed a single collapsed `çıktı:` line while the tool actually prints a `|`-joined multi-line traceback. Both blocks now reproduce the real output line for line and state that nothing is elided.
|
|
358
|
+
- **Removed a fabricated transcript line from `docs/benchmark.md`:** it showed
|
|
359
|
+
`çıktı: AssertionError` where the tool emits a full traceback. Replaced with
|
|
360
|
+
verbatim output, plus the equivalent launcher invocation and its exit code.
|
|
361
|
+
- **Transcripts are now stable across the CI matrix.** Two platform differences
|
|
362
|
+
had made the documented failure output wrong somewhere: the core joins a
|
|
363
|
+
captured traceback into one physical line separated by `" | "` (a Windows
|
|
364
|
+
carriage return before each separator makes a text-mode reader render it as
|
|
365
|
+
several lines), and Python 3.11+ adds the offending source line and a caret to
|
|
366
|
+
tracebacks. The attempt transcripts in the README, `docs/quickstart.md` and
|
|
367
|
+
`docs/cli.md` now use a stderr-free sentinel check (`sys.exit(3)`) so the
|
|
368
|
+
rendered output is byte-identical on every Python version and platform, with a
|
|
369
|
+
note explaining what a stderr-bearing check adds.
|
|
370
|
+
- `tests/test_doc_transcripts.py` reads raw bytes and normalises `\r` itself
|
|
371
|
+
instead of relying on text-mode universal newlines, and rejects any documented
|
|
372
|
+
traceback that pins a version-specific frame.
|
|
373
|
+
- **`.npmignore` added and `package.json` tightened:** `__pycache__` directories were still being packed despite the `files` allowlist, because the allowlist re-includes whole directories. Added `!**/__pycache__` and `!**/*.py[cod]` negation patterns and a minimal `.npmignore`. `npm pack --dry-run` now reports 59 entries / ~134 KB with zero `__pycache__`, `.venv`, or `site-packages` paths, down from 18502 entries / 29.1 MB.
|
|
374
|
+
|
|
375
|
+
## v2.4.0 — 2026-09-06
|
|
376
|
+
|
|
377
|
+
- **Deterministic automatic formalization:** `plan-auditor-formalize compile` converts structured Plan Auditor requirements, coverage, dependencies, named outputs, `requires_outputs`, and deterministic checks into a conservative grounded STRIPS contract without asking an LLM to invent authoritative symbolic semantics.
|
|
378
|
+
- **Independent formalization proof:** generated contracts carry a `formalization-source:<SHA256>` marker and are independently recompiled from the current plan; stale, weakened, omitted, or manually edited generated contracts are rejected even if their embedded contract SHA is recomputed.
|
|
379
|
+
- **Dataflow-bound symbolic state:** generated actions prove step completion, named-output availability, and canonical `requirement-satisfied:<REQ-ID>` goals; downstream `requires_outputs` become symbolic preconditions while the existing dependency DAG remains independently enforced.
|
|
380
|
+
- **Safe generated/manual split:** automatic formalization refuses to overwrite reviewed manual formal contracts and refuses to mutate already sealed plans. Domain semantics that cannot be derived mechanically remain explicit/manual rather than guessed.
|
|
381
|
+
- **New installed CLI:** adds `plan-auditor-formalize compile|verify`; package and skill identity advance to stable `2.4.0`.
|
|
382
|
+
- **Regression coverage:** tests exercise exact recompilation, source-staleness detection, goal weakening, dropped output preconditions, fake initial requirement goals, idempotence, sealed-plan mutation refusal, and manual-contract preservation.
|
|
383
|
+
|
|
384
|
+
## v2.3.0 — 2026-09-06
|
|
385
|
+
|
|
386
|
+
- **Sealed classical planning:** non-trivial multi-step plans can embed one sealed `formal_planning` contract with explicit initial facts, final goals, one grounded STRIPS-style action per Plan Auditor step, symbolic preconditions, add effects and delete effects.
|
|
387
|
+
- **Native LLM-free reachability:** monotonic contracts use deterministic forward reasoning while delete-effect contracts use bounded state-space search. Exhausting the configured state budget returns UNKNOWN instead of manufacturing PASS.
|
|
388
|
+
- **PDDL / Fast Downward cross-check:** the same normalized contract can be exported as sanitized PDDL `:strips` and optionally cross-checked with Fast Downward without making an external planner or GPU a package dependency.
|
|
389
|
+
- **Requirement-to-formal-goal binding:** every `must`/`should` requirement in a formalized plan must map to the canonical `requirement-satisfied:<REQ-ID>` final goal, may not be pre-satisfied in `initial_facts`, and must be produced by an action whose Plan Auditor step covers that same requirement.
|
|
390
|
+
- **Semantic fail-closed hardening:** missing requirement goals, non-covering producers, pre-satisfied required goals, duplicate formal anchors and effect-free formal actions are rejected before formal reachability can contribute to PASS.
|
|
391
|
+
- **Direct skill-name invocation:** `SKILL.md` and README now make `plan-auditor` the user-facing invocation; users do not need to hand-author plan JSON, STRIPS/PDDL contracts, seal metadata or evidence files for the normal skill workflow.
|
|
392
|
+
- **Regression coverage:** dedicated formal-planning and semantic-binding tests cover reachable/unreachable contracts, delete-effect dead ends, alternate valid orderings, bounded search, PDDL sanitization, duplicate anchors, requirement omissions and formal-contract mutation.
|
|
393
|
+
- **Version identity:** source/package/skill version advances to `2.3.0`, so the post-v2.2.0 formal-planning and semantic-binding code is no longer distributed under the already-published `2.2.0` identity.
|
|
394
|
+
|
|
395
|
+
## v2.2.0 — 2026-09-05
|
|
396
|
+
|
|
397
|
+
- **Physical control-plane confinement:** existing `.plan-auditor`, plan, seal, request/activation and policy path components are inspected with `lstat`; symlinked parents/leaves cannot redefine the workspace trust root.
|
|
398
|
+
- **Policy read confinement:** `load_config` authorizes only symlink-free workspace policy directories before policy loading; a resolved external symlink target is rejected before its files are read.
|
|
399
|
+
- **Sealed scope freeze:** automatic monotonic strengthening remains available for extra deterministic checks/prerequisites, but new steps, requirements, tools, coverage assignments or declared outputs now require a new host-approved request generation.
|
|
400
|
+
- **Safe v3→v4 migration:** `plan-auditor-migrate-seal` provides a representation-only migration path for exact full-contract v3 seals. It requires authoritative request alignment and refuses any plan-scope change.
|
|
401
|
+
- **Seal self-consistency:** v3/v4 seals validate their contract hash and criteria count on load/save before being trusted or authenticated.
|
|
402
|
+
- **Streaming evidence verification:** JSONL verification, hashing and HMAC migration retain one record/chunk at a time instead of reading complete evidence/archive files into RAM.
|
|
403
|
+
- **PID-aware registry locking:** registry transaction locks carry PID + random token; live owners are never evicted because of age alone, and stale cleanup requires a provably dead PID plus unchanged lock identity.
|
|
404
|
+
- **Activation semantics:** a lone `.plan-auditor/supervisor.json`, log or cache no longer makes a plans-free workspace look like an activated failed task; request/seal/evidence/plan/integrity/registry state still prevents deletion from degrading to `NO_PLAN`.
|
|
405
|
+
- **Single audit freeze implementation:** the unused `workspace.audit.lock` implementation was removed; `audit.freeze.lock`/`final_audit_session` remains the sole workspace final-audit freeze path.
|
|
406
|
+
- **Version identity:** source/package version advances to `2.2.0`, preventing post-v2.1.0 hardening from producing a different wheel under the already-published `2.1.0` version.
|
|
407
|
+
- **Trust-boundary documentation:** deliberate same-OS-user interference is explicitly treated as an OS isolation problem; separate account/container/VM deployment is required when that attacker is in scope.
|
|
408
|
+
- **Regression coverage:** new tests cover plan/policy symlink escapes, scope expansion, config-only activation, PID-aware registry locks, streaming evidence verification and exact legacy-seal migration.
|
|
409
|
+
|
|
410
|
+
## v2.1.0 — 2026-09-05
|
|
411
|
+
|
|
412
|
+
- **Aggregate multi-plan completion:** the integrated supervisor now enumerates the default plan and every safe `.plan-auditor/plans/<name>.json` plan. Global PASS requires every active plan to PASS; a passing default plan cannot hide an unfinished named plan, and a named-only workspace is no longer misclassified as `NO_PLAN`.
|
|
413
|
+
- **Explicit requirement coverage:** Supervisor Mode requires explicit requirements and deterministic `covers` links from steps. Every `must`/`should` requirement must be covered; omitted user requirements, unknown coverage IDs and duplicate requirement contracts block plan approval/PASS.
|
|
414
|
+
- **Full-contract format-v3 seals:** seals bind task, requirements, required tools, step identity/order/title, requirement coverage, dependencies, required outputs, output contracts/checks, step checks, and the supervisor profile/mode/tier/policy fingerprint. Existing criteria may only be strengthened.
|
|
415
|
+
- **Authenticated seals:** external-key HMAC integrity authenticates plan seals in addition to evidence, checkpoints, registry state and the integrity marker. Seal tampering or missing/wrong key material fails closed after integrity initialization.
|
|
416
|
+
- **Configuration/policy downgrade prevention:** malformed supervisor configuration and configured policy files are explicit blocking errors. Profile/mode/tier and policy-file fingerprint are part of the sealed environment contract, so a post-seal downgrade is detected.
|
|
417
|
+
- **Evidence concurrency and rotation continuity:** evidence append/rotation uses a cross-process exclusive lock, active evidence links the latest archive tail, and failed-attempt limits are counted across archived plus active evidence instead of resetting after rotation.
|
|
418
|
+
- **Complete evidence verification:** `plan-auditor evidence verify` checks both active evidence and anchored archives.
|
|
419
|
+
- **Safe plan addressing:** named plan IDs are validated as safe basenames and cannot use lexical `..` traversal outside `.plan-auditor/plans`.
|
|
420
|
+
- **Canonical multi-agent ownership:** agent IDs are safe basenames and ownership paths are canonical workspace-relative paths before conflict comparison, preventing alternate spellings from evading `parallel-strict` overlap detection.
|
|
421
|
+
- **Transactional full-scope rollback:** default snapshots carry a manifest with file type, mode and hash; rollback restores that state and removes files introduced after the snapshot. Explicit snapshot lists remain intentionally scoped.
|
|
422
|
+
- **Stronger fresh-audit fingerprint:** workspace fingerprints include directories, file type and mode/executable bits in addition to contents and symlink targets.
|
|
423
|
+
- **Internal shell removal:** workspace/world-model and watchdog Git probes use structured argv with `shell=False`; behavioral plan checks still require explicit `shell: true` for shell interpretation.
|
|
424
|
+
- **Bounded verifier output:** command output is spooled/bounded instead of being captured without limit in memory; output-limit overflow fails the check.
|
|
425
|
+
- **Doctor fail-closed exit codes:** `doctor` recomputes a current assessment and returns nonzero on FAIL/UNKNOWN instead of hiding a failed assessment behind exit 0.
|
|
426
|
+
- **Authoritative hook unification:** `hooks/gate_hook.py` is the single integrated gate. `scripts/stop_gate.py` remains only as an exit-code-2 compatibility adapter and delegates to the same multi-plan full-contract assessment instead of trusting `status=verified`.
|
|
427
|
+
- **Three-platform packaging and release gates:** real wheels are built and installed in clean virtual environments on Ubuntu, Windows and macOS. Smoke tests exercise multi-plan discovery, DAG/output dependencies, requirement coverage, full-contract seals, external-key HMAC, integrated audit, doctor, and evidence/integrity CLI paths. PyPI publishing waits for the same three-platform wheel preflight.
|
|
428
|
+
- **Versioning:** development version advanced to `2.1.0` so the hardened source cannot be confused with the already-published `2.0.2` artifact.
|
|
429
|
+
- **Regression hardening:** dedicated failure-injection tests cover named-plan bypasses, seal-contract weakening, environment downgrade, HMAC seal tampering, invalid config/policies, path traversal, evidence races/rotation/retry history, active-log tampering, rollback cleanup, executable-bit fingerprint changes, canonical agent conflicts, missing tools and bounded verifier output.
|
|
430
|
+
- **Observational final audit:** a full audit fails if a verifier mutates product workspace content, type, or mode. Verification must prove pre-existing implementation state rather than creating the claimed result during the audit itself.
|
|
431
|
+
|
|
432
|
+
## v2.0.2 — 2026-09-05
|
|
433
|
+
|
|
434
|
+
- **Integrated supervisor pipeline:** new `supervisor/orchestrator.py` wires plan validation, requirements, workspace state, policies, sealing, deterministic evidence, adversarial review, completion gating, lifecycle state, and multi-agent state into one fail-closed assessment.
|
|
435
|
+
- **Real hook enforcement:** `hooks/gate_hook.py` no longer trusts `status=verified` or fabricated integrity flags; PASS requires a valid seal and matching fresh full-audit evidence.
|
|
436
|
+
- **Deterministic audit freshness:** full audits record SHA-256 fingerprints of the verification contract and workspace contents instead of relying on filesystem mtimes.
|
|
437
|
+
- **Cross-archive evidence anchoring:** rotations write archive anchors and L11 verifies internal JSONL hash chains and links between archives.
|
|
438
|
+
- **Persistent multi-agent state:** ownership and heartbeat updates are written to the shared registry; separate processes see the same state, and `parallel-strict` rejects overlapping file claims.
|
|
439
|
+
- **Adversarial gate integration:** high/critical L12 findings with no deterministic follow-up prevent PASS and produce UNKNOWN instead of being ignored.
|
|
440
|
+
- **User policy loading:** deterministic JSON/TOML policies load from configured policy directories.
|
|
441
|
+
- **Workspace safety:** file checks and rollback are path-confined; workspace observation is read-only and uses `shutil.which()` instead of shell redirections that could create files.
|
|
442
|
+
- **Daemon integration:** the background supervisor persists an integrated assessment and final gate outcome on every observation cycle.
|
|
443
|
+
|
|
444
|
+
## v1.1.0 — 2026-09-03
|
|
445
|
+
|
|
446
|
+
- **Portable skill paths:** `SKILL.md` resolves auditor scripts relative to the skill directory.
|
|
447
|
+
- **Hard attempt cap:** `run` refuses a step after the configured failed-attempt cap unless explicitly forced.
|
|
448
|
+
- **Multi-plan core support:** `--plan <name>` operates on `.plan-auditor/plans/<name>.json`; evidence is scoped per plan.
|
|
449
|
+
- **Snapshot / rollback:** snapshot and rollback support were introduced and recorded in evidence.
|
|
450
|
+
- **Evidence rotation:** large evidence logs rotate into `.plan-auditor/archive/`.
|
|
451
|
+
|
|
452
|
+
## v1.0.0 — 2026-09-03
|
|
453
|
+
|
|
454
|
+
- Initial strict plan + independent auditor Agent Skill.
|
|
455
|
+
- Machine-checkable `verify` checks (`run`, `exec`, `file_exists`, `regex`, `pytest`).
|
|
456
|
+
- Deterministic fresh execution, append-only SHA-256 evidence, tamper detection, and full-audit final gate.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: >-
|
|
3
|
+
If you use this software, please cite it as below. The version field names the
|
|
4
|
+
release series; because the PyPI and npm artifacts published under 2.4.1 were
|
|
5
|
+
built from different commits, prefer citing the exact commit or tag you
|
|
6
|
+
actually used, and name the registry in your methods section.
|
|
7
|
+
type: software
|
|
8
|
+
title: "Plan Auditor: independent verification supervisor for AI coding agents"
|
|
9
|
+
abstract: >-
|
|
10
|
+
Plan Auditor turns an AI agent's claim that work is complete into a checkable
|
|
11
|
+
fact. Every step must carry at least one deterministic behavioural check that a
|
|
12
|
+
separate process re-runs in a fresh subprocess; the result is appended to a
|
|
13
|
+
SHA-256 hash-chained evidence log. The plan's verification contract is sealed on
|
|
14
|
+
host approval and may only be strengthened afterwards, and the final gate fails
|
|
15
|
+
closed until every active plan has an intact contract and a fresh deterministic
|
|
16
|
+
audit. There is no language model in the verification path.
|
|
17
|
+
authors:
|
|
18
|
+
- family-names: "Furox"
|
|
19
|
+
given-names: "Art"
|
|
20
|
+
alias: "Furox-Art"
|
|
21
|
+
repository-code: "https://github.com/Furox-Art/plan-auditor"
|
|
22
|
+
url: "https://github.com/Furox-Art/plan-auditor"
|
|
23
|
+
license: MIT
|
|
24
|
+
version: 2.4.3
|
|
25
|
+
date-released: "2026-10-03"
|
|
26
|
+
keywords:
|
|
27
|
+
- AI coding agents
|
|
28
|
+
- deterministic verification
|
|
29
|
+
- tamper-evident evidence
|
|
30
|
+
- independent completion gate
|
|
31
|
+
- STRIPS
|
|
32
|
+
- PDDL
|