plan-auditor 2.4.1__tar.gz → 2.4.2__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.

Potentially problematic release.


This version of plan-auditor might be problematic. Click here for more details.

Files changed (113) hide show
  1. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/.gitignore +21 -0
  2. plan_auditor-2.4.2/CHANGELOG.md +317 -0
  3. plan_auditor-2.4.2/CITATION.cff +32 -0
  4. plan_auditor-2.4.2/CODE_OF_CONDUCT.md +136 -0
  5. plan_auditor-2.4.2/CONTRIBUTING.md +317 -0
  6. plan_auditor-2.4.2/PKG-INFO +520 -0
  7. plan_auditor-2.4.2/README.md +477 -0
  8. plan_auditor-2.4.2/SECURITY.md +89 -0
  9. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/SKILL.md +1 -1
  10. plan_auditor-2.4.2/bin/check_tarball_contents.js +124 -0
  11. plan_auditor-2.4.2/bin/launcher_contract.test.js +292 -0
  12. plan_auditor-2.4.2/bin/plan-auditor.js +5 -0
  13. plan_auditor-2.4.2/bin/verify_installed_launcher.js +196 -0
  14. plan_auditor-2.4.2/docs/benchmark.md +243 -0
  15. plan_auditor-2.4.2/docs/cli.md +186 -0
  16. plan_auditor-2.4.2/docs/index.md +94 -0
  17. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/docs/integrations.md +24 -0
  18. plan_auditor-2.4.2/docs/quickstart.md +407 -0
  19. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/docs/threat-model.md +2 -1
  20. plan_auditor-2.4.2/examples/fib/.plan-auditor/plan.json +68 -0
  21. plan_auditor-2.4.2/examples/fib/request-source.json +29 -0
  22. plan_auditor-2.4.2/hooks/gate_hook.py +98 -0
  23. plan_auditor-2.4.2/index.js +61 -0
  24. plan_auditor-2.4.2/mkdocs.yml +51 -0
  25. plan_auditor-2.4.2/package.json +59 -0
  26. plan_auditor-2.4.2/pyproject.toml +157 -0
  27. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/references/plan-format.md +7 -7
  28. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/scripts/audit_check.py +132 -27
  29. plan_auditor-2.4.2/scripts/contract.py +172 -0
  30. plan_auditor-2.4.2/scripts/exec_trust.py +226 -0
  31. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/__init__.py +1 -1
  32. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/request_contract.py +41 -4
  33. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/sealing.py +27 -74
  34. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_audit_check.py +18 -5
  35. plan_auditor-2.4.2/tests/test_doc_transcripts.py +384 -0
  36. plan_auditor-2.4.2/tests/test_docs_metadata.py +404 -0
  37. plan_auditor-2.4.2/tests/test_exec_trust_gate.py +515 -0
  38. plan_auditor-2.4.2/tests/test_npm_launcher.py +301 -0
  39. plan_auditor-2.4.2/tests/test_readme_quickstart.py +154 -0
  40. plan_auditor-2.4.2/tests/trusted_workspace.py +35 -0
  41. plan_auditor-2.4.1/CHANGELOG.md +0 -90
  42. plan_auditor-2.4.1/CONTRIBUTING.md +0 -19
  43. plan_auditor-2.4.1/PKG-INFO +0 -80
  44. plan_auditor-2.4.1/README.md +0 -51
  45. plan_auditor-2.4.1/docs/benchmark.md +0 -44
  46. plan_auditor-2.4.1/docs/quickstart.md +0 -30
  47. plan_auditor-2.4.1/examples/fib/.plan-auditor/plan.json +0 -25
  48. plan_auditor-2.4.1/pyproject.toml +0 -74
  49. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/LICENSE +0 -0
  50. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/docs/architecture.md +0 -0
  51. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/docs/dependency-graph.md +0 -0
  52. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/docs/deployment-isolation.md +0 -0
  53. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/docs/formal-planning.md +0 -0
  54. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/examples/fib/fib.py +0 -0
  55. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/examples/fib/test_fib.py +0 -0
  56. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/hooks/README.md +0 -0
  57. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/scripts/__init__.py +0 -0
  58. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/scripts/integrity.py +0 -0
  59. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/scripts/plan_graph.py +0 -0
  60. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/scripts/stop_gate.py +0 -0
  61. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/adversarial.py +0 -0
  62. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/agents.py +0 -0
  63. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/agents_hardening.py +0 -0
  64. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/audit_session.py +0 -0
  65. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/cli.py +0 -0
  66. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/config.py +0 -0
  67. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/contracts.py +0 -0
  68. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/control_plane.py +0 -0
  69. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/coverage.py +0 -0
  70. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/daemon.py +0 -0
  71. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/events.py +0 -0
  72. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/evidence.py +0 -0
  73. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/formal_compiler.py +0 -0
  74. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/formal_planning.py +0 -0
  75. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/formal_semantics.py +0 -0
  76. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/gate.py +0 -0
  77. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/goals.py +0 -0
  78. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/integrity.py +0 -0
  79. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/lifecycle.py +0 -0
  80. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/lock_hardening.py +0 -0
  81. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/orchestrator.py +0 -0
  82. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/plan_verifier.py +0 -0
  83. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/plans.py +0 -0
  84. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/policies.py +0 -0
  85. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/priority.py +0 -0
  86. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/requirements.py +0 -0
  87. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/seal_migration.py +0 -0
  88. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/watchdog.py +0 -0
  89. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/supervisor/workspace.py +0 -0
  90. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/request_fixture.py +0 -0
  91. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_adversarial.py +0 -0
  92. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_agent_registry_chain.py +0 -0
  93. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_agents_gate.py +0 -0
  94. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_authenticated_integrity.py +0 -0
  95. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_cli.py +0 -0
  96. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_console_scripts.py +0 -0
  97. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_core_layers.py +0 -0
  98. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_daemon.py +0 -0
  99. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_dependency_graph.py +0 -0
  100. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_events.py +0 -0
  101. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_extra_layers.py +0 -0
  102. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_failure_injection.py +0 -0
  103. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_formal_compiler.py +0 -0
  104. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_formal_planning.py +0 -0
  105. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_formal_semantics.py +0 -0
  106. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_full_contract_hardening.py +0 -0
  107. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_hooks.py +0 -0
  108. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_integration_hardening.py +0 -0
  109. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_registry_lock_partial.py +0 -0
  110. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_request_contract_hardening.py +0 -0
  111. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_root_cause_fixes_v220.py +0 -0
  112. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/tests/test_runtime_root_hardening.py +0 -0
  113. {plan_auditor-2.4.1 → plan_auditor-2.4.2}/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,317 @@
1
+ # Changelog
2
+
3
+ All notable changes to plan-auditor. Versions are published to PyPI and npm.
4
+
5
+ ## v2.4.2 - 2026-10-03
6
+
7
+ - **npm publishing is restored, and `2.4.2` exists because the published `2.4.1`
8
+ npm build is broken.** Verified against the registry tarball, not against the
9
+ repository: `plan-auditor@2.4.1` ships an `index.js` that passes
10
+ `cwd: __dirname` to `spawn`, so `npx plan-auditor validate .` from a
11
+ workspace directory resolves `.` against the *installed package directory* and
12
+ reports `plan yok: .../node_modules/plan-auditor/.plan-auditor/plan.json`. The
13
+ launcher starts and an absolute workspace path works, so the failure is silent
14
+ and looks authoritative — it audits the wrong tree. `2.4.1` cannot be
15
+ republished because npm versions are immutable, hence the patch bump.
16
+ - **The launcher now runs the CLI in the caller's working directory.** `index.js`
17
+ keeps `process.cwd()` and prepends the package directory to `PYTHONPATH`
18
+ instead, so the bundled `supervisor` package stays importable without changing
19
+ what a relative workspace path means.
20
+ - **`npm publish` runs again.** The previous commit replaced the publish step
21
+ with `echo "npm publishing is disabled" && exit 0`, so the workflow reported
22
+ success while publishing nothing. Publishing is back, gated on the version not
23
+ already existing on the registry, using OIDC trusted publishing with
24
+ `npm publish --provenance`. `NPM_TOKEN` remains available as an explicitly
25
+ documented fallback only.
26
+ - **The publish path proves the artifact works before uploading it.** The gate
27
+ packs the tarball, installs it into a throwaway directory, and runs the
28
+ *installed* `bin/plan-auditor.js` from an unrelated working directory against a
29
+ throwaway workspace. The `2.4.0` syntax error and the `2.4.1` wrong-directory
30
+ bug both fail that check.
31
+ - **npm and PyPI now share one release trigger.** Touching
32
+ `.github/pypi-release-trigger` on `main` publishes the same version to both
33
+ registries, so the two cannot drift apart.
34
+
35
+ ## Unreleased — OSS visibility and onboarding
36
+
37
+ Documentation and project-metadata work only. No behaviour in the supervisor, the
38
+ deterministic core or the npm launcher changed, and the version numbers in
39
+ `pyproject.toml`, `package.json`, `SKILL.md` and `CITATION.cff` are untouched at
40
+ `2.4.1` — a release owner must bump them for any of this to reach a registry.
41
+
42
+ - **The README now states the real release status instead of implying parity.** The
43
+ published PyPI `2.4.1` was built 2026-09-29 and npm `2.4.1` 2026-10-01, from
44
+ different commits, and neither is byte-identical to `main`. The README carries a
45
+ table of what each published build actually contains, and says plainly which
46
+ surface to use for the verified quick start. A maintainer note marks the section
47
+ for deletion in the commit that bumps the version.
48
+ - **The "ships with the package" claim in `docs/benchmark.md` was false and is now
49
+ scoped.** The PyPI *wheel* contains only the `supervisor` and `scripts` packages;
50
+ `examples/fib` ships in the repository and in the *sdist*. Verified against the
51
+ published `plan_auditor-2.4.1-py3-none-any.whl`.
52
+ - **`docs/benchmark.md` gained a provenance table.** Every remaining quality claim
53
+ is tied to the exact command that produces it, plus the tool, the commit the text
54
+ describes and where the live value lives. The coverage figure for any commit is
55
+ deliberately not copied into the page, because a transcribed number goes stale;
56
+ the command and the workflow comment are the only places it appears. No
57
+ adoption, download or usage figure is printed anywhere, and telemetry is not
58
+ collected.
59
+ - **The skill path now says where the files come from.** The PyPI wheel ships no
60
+ `SKILL.md`, `references/` or `hooks/`, so `pipx install plan-auditor` alone
61
+ cannot use the Agent Skill path. The README and `docs/integrations.md` now give a
62
+ concrete `git clone` plus copy command instead of saying "copy the repository".
63
+ - **`docs/quickstart.md` no longer overstates its own verification.** It claimed
64
+ "everything on this page is executed by `tests/test_readme_quickstart.py`"; that
65
+ test parses the README's quick-start section only. The page now names the three
66
+ tests that actually check it and their separate responsibilities.
67
+ - **The `2.4.0` launcher troubleshooting entry was split by surface.** It conflated
68
+ the npm launcher bug with the pip console script; npm `2.4.0` is named as the
69
+ broken build and the fix is given per surface.
70
+ - **Interpreter requirement is documented where it bites.** The examples invoke
71
+ `python`; the note explains what to do on a system that only ships `python3`,
72
+ and that the npm launcher already picks `python3` off Windows.
73
+ - **README links are absolute and correct on every surface.** Repository-relative
74
+ links are dead on the PyPI project page, which renders this same file as the
75
+ package description. Every `docs/`, `SKILL.md`, `CHANGELOG.md`, `SECURITY.md`,
76
+ `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `CITATION.cff` and `LICENSE` link is now
77
+ absolute, and each target was checked over HTTP.
78
+ - **A documentation URL is stated, and so is the reason there is no site yet.**
79
+ `docs/index.md` is the canonical entry point. `mkdocs.yml` is configured but no
80
+ GitHub Pages workflow exists, so the README no longer promises a rendered site
81
+ and instead gives the two-command local build with the `mkdocs-material`
82
+ dependency named. The old pointer to `CONTRIBUTING.md` for `mkdocs serve` was
83
+ false, since that file did not mention mkdocs at all.
84
+ - **"15 supervision layers" is now sourced.** The README attributes the count to
85
+ the L0-L14 table in `docs/architecture.md` instead of stating it bare.
86
+ - **A project-status section was added** without any download, star or user
87
+ figure: pre-1.0, single maintainer, no external contributors yet, no measured
88
+ comparison against other tools, and the note that human-readable output is
89
+ Turkish with no locale switch yet.
90
+ - **Governance files rewritten.** `SECURITY.md` gained a supported-versions table,
91
+ the private advisory route, a response target and an explicit statement that
92
+ there is no PGP key. `CODE_OF_CONDUCT.md` moved enforcement off the public
93
+ issue tracker, which would have exposed reporters, onto a private address, and
94
+ its Contact section now matches what Contributor Covenant 2.1 requires.
95
+ - **`CONTRIBUTING.md` documents the workflow the code actually implements** — the
96
+ real test and coverage commands, the seal and trust chain, exit codes, the
97
+ `CHECK_TYPES` extension path, and the release procedure including the reason the
98
+ two registries diverged.
99
+ - **Issue and pull-request templates added**, plus a documentation URL in
100
+ `CITATION.cff` and repository `topics`/`description` corrected to match what the
101
+ project is.
102
+ - **`mkdocs.yml`** gained `repo_name`, `edit_uri` so every page has an "edit on
103
+ GitHub" link, and social links for the repository, PyPI, npm and the citation
104
+ file. Navigation is unchanged and still covers every page.
105
+
106
+ ### Re-verified against `main` after #24
107
+
108
+ - **The README's release-status text was corrected against the merged code rather
109
+ than the previous `main`.** The wheel now force-includes the Agent Skill assets
110
+ under `plan_auditor_skill/`, so the earlier claim that a `pip` install cannot
111
+ supply `SKILL.md`, `references/` or `hooks/` was true of the published `2.4.1`
112
+ wheel and false of anything built from `main`. The README and
113
+ `docs/integrations.md` now document both routes — a checkout, or the installed
114
+ `plan_auditor_skill/` directory — with a command that prints its location, and
115
+ the claim is scoped to the already-published build. `docs/` and `examples/` are
116
+ still not in the wheel, which is stated as such.
117
+ - **The npm surface was re-checked against the merged launcher, not the old one.**
118
+ `index.js` now spawns the CLI with the caller's working directory and puts the
119
+ package directory on `PYTHONPATH`. The published npm `2.4.1` still resolves a
120
+ bare `.` against the installed package and can audit the wrong tree while
121
+ looking authoritative, so the README and `docs/quickstart.md` say so, give the
122
+ absolute-path workaround, and stop implying `npx` is unconditionally CI-safe.
123
+ Exit-code propagation, the `bin` field and the `python`/`python3` selection are
124
+ unchanged.
125
+ - **The coverage command in the provenance table was stale and is fixed.** It named
126
+ `--cov=supervisor --cov=scripts --cov-branch`, which measured the checkout. The
127
+ merged `pyproject.toml` reads `branch`, `source_pkgs` and `fail_under` from
128
+ `[tool.coverage.*]`, and `conftest.py` pins the suite to the installed
129
+ distribution, so the documented command is now
130
+ `python -m pytest tests/ -q --cov --cov-report=term-missing`.
131
+ - **"The mkdocs step is not part of CI" is no longer true** and was removed.
132
+ `docs (mkdocs --strict)` is a required check, pinned to `mkdocs==1.6.1` and
133
+ `mkdocs-material==9.6.14`; the page now names those pins and adds
134
+ `.github/scripts/check_dist_assets.py` to the reproduce list.
135
+ - **`CONTRIBUTING.md` documents the gates that now exist**: `ruff` and `mypy`
136
+ against ratchet baselines that refuse to record a higher count,
137
+ `version-lockstep`, `workflow-syntax`, `build (wheel + sdist)` with a
138
+ `twine check --strict`, `npm-launcher`, and `wheel-cli-smoke` on three
139
+ platforms. The release section was rewritten: OIDC trusted publishing only, the
140
+ GitHub release gated on the version-existence check, an npm `verify` job and an
141
+ already-published gate, and `main` protected by a ruleset with no bypass actors.
142
+ The local setup changed from `pip install -e .` to a non-editable install,
143
+ because `conftest.py` resolves the runtime packages from site-packages and fails
144
+ loudly if they are absent.
145
+
146
+ ## The two published `2.4.1` builds are not the same artifact
147
+
148
+ Recorded here so nobody has to rediscover it: the same version number was
149
+ published to two registries from two different commits.
150
+
151
+ | Build | Published | Notes |
152
+ |---|---|---|
153
+ | 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. |
154
+ | npm `2.4.1` | 2026-10-01 | Built from the documentation rewrite; carries the `files` allowlist, the repaired launcher and the current README. |
155
+
156
+ `pyproject.toml` was left at `2.4.1` and the release workflow skips a version
157
+ that already exists on PyPI, so the metadata on `main` cannot be published without
158
+ a version bump. That part is unchanged by this entry.
159
+
160
+ The other half has been fixed since, by #24: the npm workflow now runs a `verify`
161
+ job — the launcher tests and the packed-tarball check — before publishing, and
162
+ refuses a version already on the registry, so the absence of any gate that let
163
+ `2.4.0` ship a syntax error is no longer the state of the tree. `main` is also
164
+ now protected by a ruleset with no bypass actors, so none of the required checks
165
+ can be skipped by pushing to `main`.
166
+
167
+ **Still outstanding:** the version bump itself. Until `2.4.2` is published to both
168
+ registries, a `pip` user keeps seeing the pre-rewrite README on the project page.
169
+
170
+ ## v2.4.1 — PyPI 2026-09-29, npm 2026-10-01
171
+
172
+ ### Published to both registries
173
+
174
+ - Metadata-only patch release: improved PyPI discovery keywords, classifiers, description, documentation links, and synchronized package version metadata.
175
+
176
+ ### Published to npm only (built from the documentation rewrite)
177
+
178
+ #### README rebuilt around a verified quick start
179
+
180
+ - **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.
181
+ - **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.
182
+ - **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.
183
+ - **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.
184
+ - **`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.
185
+ - **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.
186
+ - **`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.
187
+ - **`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.
188
+ - **`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`).
189
+ - **Housekeeping:** `.gitignore` now excludes `.venv/`, `venv/`, `.tmp-site/`, `site/`, and `node_modules/`.
190
+ - **Removed the broken PyPI downloads badge.** `img.shields.io/pypi/dm/plan-auditor`
191
+ answers HTTP 200 while rendering `downloads: inaccessible`, because shields.io
192
+ scrapes a third-party download API that is rate-limited or down. The README now
193
+ links the PyPI and npm project pages instead, which always answer 200 and always
194
+ carry the real numbers. No count is hardcoded. `tests/test_docs_metadata.py` now
195
+ fails if a `img.shields.io/pypi/d...` badge or a hand-copied download count
196
+ reappears anywhere in the docs.
197
+
198
+ #### npm launcher exit codes and transcript fidelity
199
+
200
+ - **Both npm entry points now propagate the verifier's exit code.** The fix was
201
+ initially placed only in `index.js`, but `package.json` maps the `plan-auditor`
202
+ bin to `bin/plan-auditor.js` — the file `npx plan-auditor` actually executes —
203
+ and that file discarded the child's result entirely. Verified: `node
204
+ bin/plan-auditor.js run <failing plan>` returned `0` while `index.js` returned
205
+ `1`. `index.js` now exposes `runPythonAndPropagate()`, which attaches the
206
+ `close` and `error` handlers and mirrors the code, and `bin/plan-auditor.js`
207
+ calls it. Exit codes are `1` for a failed step, `2` for a blocked audit, `0` for
208
+ a proven workspace, and nonzero if Python cannot be started.
209
+ - **`tests/test_npm_launcher.py` covers every entry point and the real package.**
210
+ Every exit-code assertion is parameterised over `bin/plan-auditor.js` and
211
+ `index.js`, the launcher's code is compared against the underlying CLI's, and the
212
+ failing/passing/blocked checks are repeated against the packed npm tarball so a
213
+ fix that works only in the working tree fails the suite. All of these were
214
+ confirmed to fail against the pre-fix `bin` (6 failures) and pass after.
215
+ - `test_docs_metadata.py` and `test_doc_transcripts.py` now check that the `bin`
216
+ field resolves to a launcher that propagates rather than a bare spawn, and that
217
+ documented launcher commands reference a file that exists.
218
+ - **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.
219
+ - **Removed a fabricated transcript line from `docs/benchmark.md`:** it showed
220
+ `çıktı: AssertionError` where the tool emits a full traceback. Replaced with
221
+ verbatim output, plus the equivalent launcher invocation and its exit code.
222
+ - **Transcripts are now stable across the CI matrix.** Two platform differences
223
+ had made the documented failure output wrong somewhere: the core joins a
224
+ captured traceback into one physical line separated by `" | "` (a Windows
225
+ carriage return before each separator makes a text-mode reader render it as
226
+ several lines), and Python 3.11+ adds the offending source line and a caret to
227
+ tracebacks. The attempt transcripts in the README, `docs/quickstart.md` and
228
+ `docs/cli.md` now use a stderr-free sentinel check (`sys.exit(3)`) so the
229
+ rendered output is byte-identical on every Python version and platform, with a
230
+ note explaining what a stderr-bearing check adds.
231
+ - `tests/test_doc_transcripts.py` reads raw bytes and normalises `\r` itself
232
+ instead of relying on text-mode universal newlines, and rejects any documented
233
+ traceback that pins a version-specific frame.
234
+ - **`.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.
235
+
236
+ ## v2.4.0 — 2026-09-06
237
+
238
+ - **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.
239
+ - **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.
240
+ - **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.
241
+ - **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.
242
+ - **New installed CLI:** adds `plan-auditor-formalize compile|verify`; package and skill identity advance to stable `2.4.0`.
243
+ - **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.
244
+
245
+ ## v2.3.0 — 2026-09-06
246
+
247
+ - **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.
248
+ - **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.
249
+ - **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.
250
+ - **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.
251
+ - **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.
252
+ - **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.
253
+ - **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.
254
+ - **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.
255
+
256
+ ## v2.2.0 — 2026-09-05
257
+
258
+ - **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.
259
+ - **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.
260
+ - **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.
261
+ - **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.
262
+ - **Seal self-consistency:** v3/v4 seals validate their contract hash and criteria count on load/save before being trusted or authenticated.
263
+ - **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.
264
+ - **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.
265
+ - **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`.
266
+ - **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.
267
+ - **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.
268
+ - **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.
269
+ - **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.
270
+
271
+ ## v2.1.0 — 2026-09-05
272
+
273
+ - **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`.
274
+ - **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.
275
+ - **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.
276
+ - **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.
277
+ - **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.
278
+ - **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.
279
+ - **Complete evidence verification:** `plan-auditor evidence verify` checks both active evidence and anchored archives.
280
+ - **Safe plan addressing:** named plan IDs are validated as safe basenames and cannot use lexical `..` traversal outside `.plan-auditor/plans`.
281
+ - **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.
282
+ - **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.
283
+ - **Stronger fresh-audit fingerprint:** workspace fingerprints include directories, file type and mode/executable bits in addition to contents and symlink targets.
284
+ - **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.
285
+ - **Bounded verifier output:** command output is spooled/bounded instead of being captured without limit in memory; output-limit overflow fails the check.
286
+ - **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.
287
+ - **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`.
288
+ - **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.
289
+ - **Versioning:** development version advanced to `2.1.0` so the hardened source cannot be confused with the already-published `2.0.2` artifact.
290
+ - **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.
291
+ - **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.
292
+
293
+ ## v2.0.2 — 2026-09-05
294
+
295
+ - **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.
296
+ - **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.
297
+ - **Deterministic audit freshness:** full audits record SHA-256 fingerprints of the verification contract and workspace contents instead of relying on filesystem mtimes.
298
+ - **Cross-archive evidence anchoring:** rotations write archive anchors and L11 verifies internal JSONL hash chains and links between archives.
299
+ - **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.
300
+ - **Adversarial gate integration:** high/critical L12 findings with no deterministic follow-up prevent PASS and produce UNKNOWN instead of being ignored.
301
+ - **User policy loading:** deterministic JSON/TOML policies load from configured policy directories.
302
+ - **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.
303
+ - **Daemon integration:** the background supervisor persists an integrated assessment and final gate outcome on every observation cycle.
304
+
305
+ ## v1.1.0 — 2026-09-03
306
+
307
+ - **Portable skill paths:** `SKILL.md` resolves auditor scripts relative to the skill directory.
308
+ - **Hard attempt cap:** `run` refuses a step after the configured failed-attempt cap unless explicitly forced.
309
+ - **Multi-plan core support:** `--plan <name>` operates on `.plan-auditor/plans/<name>.json`; evidence is scoped per plan.
310
+ - **Snapshot / rollback:** snapshot and rollback support were introduced and recorded in evidence.
311
+ - **Evidence rotation:** large evidence logs rotate into `.plan-auditor/archive/`.
312
+
313
+ ## v1.0.0 — 2026-09-03
314
+
315
+ - Initial strict plan + independent auditor Agent Skill.
316
+ - Machine-checkable `verify` checks (`run`, `exec`, `file_exists`, `regex`, `pytest`).
317
+ - 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.2
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
@@ -0,0 +1,136 @@
1
+ # Contributor Covenant Code of Conduct
2
+
3
+ ## Our Pledge
4
+
5
+ We as members, contributors, and leaders pledge to make participation in our
6
+ community a harassment-free experience for everyone, regardless of age, body
7
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
8
+ identity and expression, level of experience, education, socio-economic status,
9
+ nationality, personal appearance, race, caste, color, religion, or sexual
10
+ identity and orientation.
11
+
12
+ We pledge to act and interact in ways that contribute to an open, welcoming,
13
+ diverse, inclusive, and healthy community.
14
+
15
+ ## Our Standards
16
+
17
+ Examples of behavior that contributes to a positive environment for our
18
+ community include:
19
+
20
+ * Demonstrating empathy and kindness toward other people
21
+ * Being respectful of differing opinions, viewpoints, and experiences
22
+ * Giving and gracefully accepting constructive feedback
23
+ * Accepting responsibility and apologizing to those affected by our mistakes,
24
+ and learning from the experience
25
+ * Focusing on what is best not just for us as individuals, but for the overall
26
+ community
27
+
28
+ Examples of unacceptable behavior include:
29
+
30
+ * The use of sexualized language or imagery, and sexual attention or advances of
31
+ any kind
32
+ * Trolling, insulting or derogatory comments, and personal or political attacks
33
+ * Public or private harassment
34
+ * Publishing others' private information, such as a physical or email address,
35
+ without their explicit permission
36
+ * Other conduct which could reasonably be considered inappropriate in a
37
+ professional setting
38
+
39
+ ## Enforcement Responsibilities
40
+
41
+ Community leaders are responsible for clarifying and enforcing our standards of
42
+ acceptable behavior and will take appropriate and fair corrective action in
43
+ response to any behavior that they deem inappropriate, threatening, offensive,
44
+ or harmful.
45
+
46
+ Community leaders have the right and responsibility to remove, edit, or reject
47
+ comments, commits, code, wiki edits, issues, and other contributions that are
48
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
49
+ decisions when appropriate.
50
+
51
+ ## Scope
52
+
53
+ This Code of Conduct applies within all community spaces, and also applies when
54
+ an individual is officially representing the community in public spaces.
55
+ Examples of representing our community include using an official email address,
56
+ posting via an official social media account, or acting as an appointed
57
+ representative at an online or offline event.
58
+
59
+ ## Enforcement
60
+
61
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
62
+ reported to the community leaders responsible for enforcement at
63
+ **real.furkannn@gmail.com** (the address published on this project's npm
64
+ maintainer record). All complaints will be reviewed and investigated promptly and
65
+ fairly.
66
+
67
+ All community leaders are obligated to respect the privacy and security of the
68
+ reporter of any incident.
69
+
70
+ **Do not report Code of Conduct violations through GitHub Issues.** A public
71
+ issue thread exposes the reporter and permanently publishes the allegation before
72
+ anyone has reviewed it. Use the email address above instead.
73
+
74
+ For anything that is a security vulnerability rather than a conduct matter, use
75
+ the private route in [SECURITY.md](https://github.com/Furox-Art/plan-auditor/blob/main/SECURITY.md)
76
+ rather than this address.
77
+
78
+ ## Enforcement Guidelines
79
+
80
+ Community leaders will follow these Community Impact Guidelines in determining
81
+ the consequences for any action they deem in violation of this Code of Conduct:
82
+
83
+ ### 1. Correction
84
+
85
+ **Community Impact**: Use of inappropriate language or other behavior deemed
86
+ unprofessional or unwelcome in the community.
87
+
88
+ **Consequence**: A private, written warning from community leaders, providing
89
+ clarity around the nature of the violation and an explanation of why the
90
+ behavior was inappropriate. A public apology may be requested.
91
+
92
+ ### 2. Warning
93
+
94
+ **Community Impact**: A violation through a single incident or series of
95
+ actions.
96
+
97
+ **Consequence**: A warning with consequences for continued behavior. No
98
+ interaction with the people involved, including unsolicited interaction with
99
+ those enforcing the Code of Conduct, for a specified period of time. This
100
+ includes avoiding interactions in community spaces as well as external channels
101
+ like social media. Violating these terms may lead to a temporary or permanent
102
+ ban.
103
+
104
+ ### 3. Temporary Ban
105
+
106
+ **Community Impact**: A serious violation of community standards, including
107
+ sustained inappropriate behavior.
108
+
109
+ **Consequence**: A temporary ban from any sort of interaction or public
110
+ communication with the community for a specified period of time. No public or
111
+ private interaction with the people involved, including unsolicited interaction
112
+ with those enforcing the Code of Conduct, is allowed during this period.
113
+ Violating these terms may lead to a permanent ban.
114
+
115
+ ### 4. Permanent Ban
116
+
117
+ **Community Impact**: Demonstrating a pattern of violation of community
118
+ standards, including sustained inappropriate behavior, harassment of an
119
+ individual, or aggression toward or disparagement of classes of individuals.
120
+
121
+ **Consequence**: A permanent ban from any sort of public interaction within the
122
+ community.
123
+
124
+ ## Attribution
125
+
126
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
127
+ version 2.1, available at
128
+ <https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.
129
+
130
+ Community Impact Guidelines were inspired by
131
+ [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/inclusion).
132
+
133
+ [homepage]: https://www.contributor-covenant.org
134
+
135
+ For answers to common questions about this code of conduct, see the FAQ at
136
+ <https://www.contributor-covenant.org/faq>.