yasarda 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. yasarda-0.4.0/CHANGELOG.md +86 -0
  2. yasarda-0.4.0/MANIFEST.in +5 -0
  3. yasarda-0.4.0/PKG-INFO +325 -0
  4. yasarda-0.4.0/README.md +304 -0
  5. yasarda-0.4.0/docs/HANDOFF.md +50 -0
  6. yasarda-0.4.0/docs/SAFETY.md +93 -0
  7. yasarda-0.4.0/docs/TEST_REPORT.md +39 -0
  8. yasarda-0.4.0/docs/baseline-test-results.txt +184 -0
  9. yasarda-0.4.0/docs/installed-environment.txt +6 -0
  10. yasarda-0.4.0/docs/installed-wheel-test-results.txt +1 -0
  11. yasarda-0.4.0/docs/installed-wheel-test-results.xml +1 -0
  12. yasarda-0.4.0/docs/source-test-results.txt +1 -0
  13. yasarda-0.4.0/docs/source-test-results.xml +1 -0
  14. yasarda-0.4.0/docs/wheel-smoke.txt +3 -0
  15. yasarda-0.4.0/examples/basic/.yasarda/remediations/RP-001.json +24 -0
  16. yasarda-0.4.0/examples/basic/README.md +10 -0
  17. yasarda-0.4.0/examples/basic/hello.txt +1 -0
  18. yasarda-0.4.0/pyproject.toml +42 -0
  19. yasarda-0.4.0/setup.cfg +4 -0
  20. yasarda-0.4.0/src/yasarda/__init__.py +11 -0
  21. yasarda-0.4.0/src/yasarda/__main__.py +2 -0
  22. yasarda-0.4.0/src/yasarda/capabilities.py +19 -0
  23. yasarda-0.4.0/src/yasarda/catalog.py +81 -0
  24. yasarda-0.4.0/src/yasarda/cli.py +153 -0
  25. yasarda-0.4.0/src/yasarda/engine.py +107 -0
  26. yasarda-0.4.0/src/yasarda/errors.py +26 -0
  27. yasarda-0.4.0/src/yasarda/mcp_server.py +247 -0
  28. yasarda-0.4.0/src/yasarda/models.py +98 -0
  29. yasarda-0.4.0/src/yasarda/plan.py +169 -0
  30. yasarda-0.4.0/src/yasarda/policy.py +61 -0
  31. yasarda-0.4.0/src/yasarda/remediation.py +69 -0
  32. yasarda-0.4.0/src/yasarda/remediation.schema.json +319 -0
  33. yasarda-0.4.0/src/yasarda/repository.py +190 -0
  34. yasarda-0.4.0/src/yasarda/schema.py +47 -0
  35. yasarda-0.4.0/src/yasarda/service.py +59 -0
  36. yasarda-0.4.0/src/yasarda/transaction.py +391 -0
  37. yasarda-0.4.0/src/yasarda/transforms.py +106 -0
  38. yasarda-0.4.0/src/yasarda/util.py +97 -0
  39. yasarda-0.4.0/src/yasarda/verification.py +48 -0
  40. yasarda-0.4.0/src/yasarda.egg-info/PKG-INFO +325 -0
  41. yasarda-0.4.0/src/yasarda.egg-info/SOURCES.txt +49 -0
  42. yasarda-0.4.0/src/yasarda.egg-info/dependency_links.txt +1 -0
  43. yasarda-0.4.0/src/yasarda.egg-info/entry_points.txt +3 -0
  44. yasarda-0.4.0/src/yasarda.egg-info/requires.txt +6 -0
  45. yasarda-0.4.0/src/yasarda.egg-info/top_level.txt +1 -0
  46. yasarda-0.4.0/tests/conftest.py +5 -0
  47. yasarda-0.4.0/tests/test_audit_regressions.py +85 -0
  48. yasarda-0.4.0/tests/test_cli.py +30 -0
  49. yasarda-0.4.0/tests/test_core.py +180 -0
  50. yasarda-0.4.0/tests/test_hardening.py +502 -0
  51. yasarda-0.4.0/tests/test_interfaces.py +262 -0
@@ -0,0 +1,86 @@
1
+ # Changelog
2
+
3
+ ## 0.4.0 - 2026-09-22
4
+
5
+ Standalone release on PyPI, aligning versioning with the unified Vinyasar 0.4.0 supervisor integration.
6
+
7
+ - Verified standalone package boundary and entry points (`yasarda` CLI and `yasarda-mcp` stdio server).
8
+ - Established canonical bundle storage on Google Drive with Tiny Horse.
9
+ - Full regression suite verified against local POSIX and guarded storage.
10
+
11
+ ## 0.3.0 - 2026-09-09
12
+
13
+ Public supervisor boundary for the separately packaged Vinyasar 0.1.0 release.
14
+
15
+ - Add `Engine.pending_operations()` as the supported read-only recovery-status
16
+ API; callers no longer need to inspect transaction journals directly.
17
+ - Add `Repository.mutation_filesystem_issue()` so supervisors can explain a
18
+ storage refusal without attempting mutation.
19
+ - Add `Service.operations()` and advertise `inspect_operations` in capability
20
+ metadata.
21
+ - Apply the same known cloud/remote filesystem refusal to Yasarda's journal state
22
+ directory; local repository bytes are not mutated when durable recovery state
23
+ is configured on unsupported storage.
24
+ - Keep all transaction serialization, staging, rollback, and conditional restore
25
+ behavior private and unchanged.
26
+
27
+ ## 0.2.1 - 2026-09-09
28
+
29
+ Patch hardening release; local artifacts only.
30
+
31
+ - Refuse mutation and recovery in known iCloud/macOS cloud-storage paths and
32
+ known Linux remote/FUSE mounts unless the host explicitly opts in.
33
+ - Reject a `build_server(repo=Repository(...), policy=...)` configuration when
34
+ the supplied policy conflicts with the policy already bound to the repository.
35
+ - Deprecate the legacy `allow_commands=True` SDK argument visibly; it still never
36
+ enables command execution.
37
+ - Add Python 3.14 metadata and regression tests for filesystem detection, host
38
+ override behavior, MCP policy conflicts, and the deprecated command flag.
39
+
40
+ ## 0.2.0 - 2026-09-09
41
+
42
+ Hardening of the supplied 0.1.0 package. Local artifacts only; not published.
43
+
44
+ ### Correctness
45
+
46
+ - Fixed the eight supplied audit cases: repeated replacement, conflicting edits,
47
+ missing desired-state verification, direct SDK dependency bypass, invalid
48
+ counts, contradictory hashes, newline rewriting, and symlink-target deletion.
49
+ - Enforced the packaged JSON Schema, duplicate-key checks, strict field types,
50
+ path validation, graph validation, output-size bounds, and final-state checks.
51
+ - Kept transforms pure; only the shared execution engine writes destination files.
52
+
53
+ ### Execution
54
+
55
+ - Added immutable saved plans and exact-digest approval, whole-file input/output
56
+ fingerprints, branch/HEAD binding, scoped dependency snapshots, and mode guards.
57
+ - Added external private state, cooperative writer locks, output staging, journals,
58
+ verified retries, guarded rollback, and interrupted-operation recovery.
59
+ - Refuses unknown third-party changes, pending recovery, protected paths, bare Git
60
+ object stores, links, case-fold collisions, and unsupported file types.
61
+
62
+ ### Interfaces
63
+
64
+ - SDK, CLI, and MCP share Engine and Service; no interface-specific transforms.
65
+ - CLI supports saved-plan execution, receipts, recovery, rollback, and operating
66
+ modes. Immediate local `apply --yes` remains for trusted callers.
67
+ - MCP is now built into the base distribution as a small stdio tools/resources
68
+ adapter. No external `mcp` package is needed. Root scope and approval are set by
69
+ the host; tool callers cannot widen them. MCP defaults to read-only.
70
+
71
+ ### Deliberate compatibility changes
72
+
73
+ - Multiple transformations of one file are rejected, not sequentially guessed.
74
+ - Unrecognized manifest fields/types fail rather than being ignored/coerced.
75
+ - Arbitrary command verification is unsupported, including when the old SDK
76
+ `allow_commands=True` argument is passed. Such checks fail before publication.
77
+ - The old MCP `apply_remediation(execute=True, repo_path=..., allow_commands=...)`
78
+ surface is replaced by saved-plan execution with independent host authorization.
79
+ - `init --force` and implicit catalog overwrites are removed. Author catalogs as
80
+ explicit files or copy the example into a disposable directory.
81
+ - Mutation is currently restricted to POSIX local filesystems. No cross-platform
82
+ or network-filesystem guarantees were inferred from the Linux test run.
83
+
84
+ No product service, marketplace, automatic model decisions, or DUD3-specific
85
+ remediation catalog was added. No publication license was selected on the user's
86
+ behalf; choose one before any public distribution.
@@ -0,0 +1,5 @@
1
+ include README.md CHANGELOG.md
2
+ recursive-include docs *.md *.txt *.xml
3
+ recursive-include tests *.py
4
+ recursive-include examples *.json *.txt *.md
5
+ include src/yasarda/remediation.schema.json
yasarda-0.4.0/PKG-INFO ADDED
@@ -0,0 +1,325 @@
1
+ Metadata-Version: 2.4
2
+ Name: yasarda
3
+ Version: 0.4.0
4
+ Summary: Reviewed plans, guarded repository file changes, durable receipts, and a public recovery-status API.
5
+ Keywords: codemod,remediation,mcp,repository
6
+ Classifier: Development Status :: 3 - Alpha
7
+ Classifier: Environment :: Console
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Programming Language :: Python :: 3.13
13
+ Classifier: Programming Language :: Python :: 3.14
14
+ Classifier: Topic :: Software Development :: Version Control :: Git
15
+ Requires-Python: >=3.10
16
+ Description-Content-Type: text/markdown
17
+ Requires-Dist: jsonschema<5,>=4.23
18
+ Provides-Extra: mcp
19
+ Provides-Extra: dev
20
+ Requires-Dist: pytest<10,>=8; extra == "dev"
21
+
22
+ # Yasarda 0.4.0
23
+
24
+ **Reviewed plans. Guarded file changes. Durable receipts.**
25
+
26
+ A local tool with a Python SDK, CLI, and MCP stdio interface over one engine.
27
+ No account, cloud service, model API, GitHub dependency, or project-specific code.
28
+
29
+ ## Install
30
+
31
+ ```sh
32
+ pip install yasarda
33
+ yasarda --version
34
+ ```
35
+
36
+ From the source project: `python -m pip install .`.
37
+ Python 3.10+ is declared. The runtime dependency is `jsonschema>=4.23,<5`.
38
+ MCP stdio is included in the base installation; `yasarda[mcp]` remains an empty
39
+ compatibility extra. There is no separate transport dependency.
40
+
41
+ Guarded mutation currently requires supported POSIX local filesystems for both
42
+ the target repository and journal state. Yasarda refuses known macOS cloud-synced locations (including iCloud Drive and
43
+ `~/Library/CloudStorage`) and known Linux remote/FUSE mounts by default. The
44
+ host-only `--allow-unsupported-filesystem` override exists for deliberate testing
45
+ or recovery, but does not make remote filesystem semantics safe. Linux and local
46
+ macOS storage are exercised in the accompanying report; Windows mutation and
47
+ power-loss behavior remain unsupported.
48
+
49
+ ## The workflow
50
+
51
+ Put reviewed manifests in `<repository>/.yasarda/remediations/*.json`, or use an
52
+ external catalog with `--catalog /absolute/catalog/path`. Catalog creation is an
53
+ explicit authoring step; Yasarda does not install a sample over an existing file.
54
+
55
+ ```sh
56
+ # Inspection and planning do not change repository files.
57
+ yasarda --repo /path/to/repo doctor
58
+ yasarda --repo /path/to/repo list
59
+ yasarda --repo /path/to/repo plan RP-001 --out /outside/repo/RP-001.plan.json
60
+
61
+ # Read the diff and approve this specific digest independently.
62
+ yasarda --repo /path/to/repo --mode approved-mutation \
63
+ execute /outside/repo/RP-001.plan.json \
64
+ --approve REVIEWED_64_CHARACTER_PLAN_ID --yes
65
+
66
+ yasarda --repo /path/to/repo verify RP-001
67
+ yasarda --repo /path/to/repo receipt REVIEWED_64_CHARACTER_PLAN_ID
68
+ ```
69
+
70
+ Global options go before the subcommand. `--out` never overwrites an existing
71
+ artifact and must point outside the repository. An output directory must already
72
+ exist. A plan contains exact input bytes, output bytes, modes, dependency
73
+ manifests, Git identity, and a digest of its derived contents. Loading checks that
74
+ the stored transformations, diff, and digest agree. Execution does not replan.
75
+
76
+ A plan digest is an integrity identifier, **not a signature or proof of human
77
+ approval**. The caller/host must independently decide whether to authorize it.
78
+
79
+ For trusted, immediate local use, `yasarda --repo /path apply RP-001 --yes` plans
80
+ and authorizes that plan in one invocation. It is not the deferred-review path.
81
+ Without `--yes`, this command is inert. An explicit restrictive `--mode` wins
82
+ even when `--yes` is present.
83
+
84
+ A changed input, changed branch/HEAD, unknown file state, unresolved prerequisite,
85
+ unsupported link, or conflicting scope stops execution. The plan is bound to its
86
+ absolute repository root. To use another checkout location, regenerate a plan
87
+ from the manifests and review the new digest; do not edit saved plan JSON.
88
+
89
+ If a repository is stored in iCloud Drive, copy or clone it to local storage before
90
+ executing a plan. Planning and structural verification remain available in the
91
+ cloud-synced location because they do not publish repository changes.
92
+
93
+ ## Modes
94
+
95
+ | Mode | Repository behavior |
96
+ | --- | --- |
97
+ | `read-only` | Inspect, plan, and structurally verify; no mutation. |
98
+ | `proposal-only` | Same repository restrictions; proposals can be explicitly saved outside it. |
99
+ | `new-files-only` | Create absent files or recognize exact existing results; no changes to existing files. |
100
+ | `approved-mutation` | Execute explicitly approved plans within all remaining guards. |
101
+
102
+ Read/plan CLI commands default to proposal-only. MCP defaults to read-only.
103
+ The SDK retains a trusted-code convention: constructing `Repository(path)` and
104
+ calling `apply` is explicit caller authorization. Set `Policy(mode=...)` when
105
+ embedding Yasarda in a restricted worker; the documentation examples do so.
106
+ A Python caller with direct filesystem access is not sandboxed by a Python class.
107
+
108
+ Dirty Git worktrees are refused by default. The **host** can permit them using
109
+ `--allow-dirty`; exact input fingerprints remain mandatory. Git's index is never
110
+ updated by Yasarda. Bare Git object stores are not mutation targets.
111
+
112
+ ## Manifest example
113
+
114
+ ```json
115
+ {
116
+ "schema_version": 1,
117
+ "id": "RP-001",
118
+ "version": 1,
119
+ "title": "Replace the legacy greeting",
120
+ "changes": [
121
+ {
122
+ "type": "replace_text",
123
+ "path": "hello.txt",
124
+ "before": "hello old world\n",
125
+ "after": "hello new world\n",
126
+ "count": 1
127
+ }
128
+ ],
129
+ "verify": [
130
+ {"type": "contains", "path": "hello.txt", "text": "hello new world\n"}
131
+ ]
132
+ }
133
+ ```
134
+
135
+ `yasarda schema` emits the same JSON Schema enforced by the loader. Unknown
136
+ fields, incorrect types, nonpositive counts, conflicting hashes, duplicate JSON
137
+ keys, unsupported schema versions, and unsafe paths are rejected.
138
+
139
+ The four primitives are `replace_text`, `replace_file`, `create_file`, and
140
+ `delete_file`. `replace_file` requires `expected_old_sha256`; the desired hash is
141
+ computed from `content`. `delete_file` requires the old hash. `create_file` only
142
+ creates an absent path or recognizes matching bytes/mode. New files default to
143
+ 0644; an explicit integer `mode` is permitted.
144
+
145
+ Text replacements operate on UTF-8 token bytes, not newline-normalized file
146
+ strings. Unrelated bytes, CRLF, BOMs, final-newline state, and permission bits are
147
+ preserved. Counted text detection is conservative, not semantic code analysis.
148
+ For stronger old/new identity, add **both** `expected_old_sha256` and
149
+ `expected_new_sha256` to a text change. Empty replacement text requires both.
150
+
151
+ One transformation per path is deliberate. Duplicate paths, case-fold collisions,
152
+ and parent/child collisions are rejected before publication. To make several
153
+ edits to one file, author one exact final `replace_file` payload instead of a
154
+ sequence of loosely overlapping edits.
155
+
156
+ Optional `branches` and `depends_on` are enforced through all orchestrating APIs,
157
+ including `catalog[id].apply(repo)`. Missing prerequisites and cycles fail closed.
158
+ The staged result is also checked not to undo its own prerequisites.
159
+
160
+ ## Verification means what it says
161
+
162
+ Supported structural checks: `exists`, `absent`, `contains`, `not_contains`, and
163
+ `sha256`. Every execution also checks the **exact planned final bytes and modes**.
164
+ `verify RP-001` checks the manifest's desired-state predicates and declared checks;
165
+ a historical receipt is not a fresh observation of today's files.
166
+
167
+ **Command checks do not run.** A manifest containing a legacy `command` check
168
+ fails staged verification before destination publication. Run builds, tests,
169
+ Instruments, benchmarks, or other executable checks in a separately authorized
170
+ environment. A successful structural check is not proof that an app is correct,
171
+ fast, accessible, or secure.
172
+
173
+ ## Recovery and receipts
174
+
175
+ Before publication, Yasarda stores an operation journal outside the repository,
176
+ stages the scoped output in a private directory, verifies it, and rechecks the
177
+ live inputs. Cooperating Yasarda writers share an advisory lock. Publication is
178
+ conditional and per-file; new-file publication does not clobber an existing path.
179
+
180
+ ```sh
181
+ # Recover an interrupted operation to its original file state.
182
+ yasarda --repo /path/to/repo recover PLAN_ID --approve PLAN_ID --yes
183
+
184
+ # Explicitly undo a completed operation, provided its outputs have not diverged.
185
+ yasarda --repo /path/to/repo rollback PLAN_ID --approve PLAN_ID --yes
186
+ ```
187
+
188
+ Repeating execution of the **same saved plan** returns its verified receipt only
189
+ when the result still matches. It does not apply the transformation twice. A
190
+ rolled-back or failed operation needs a fresh reviewed plan, not a forced retry.
191
+ An interrupted operation blocks further publication until recovery is resolved.
192
+ `doctor` reports pending operation IDs.
193
+
194
+ Recovery checks all affected files before restoring any. Unknown/newer content
195
+ or a changed Git branch/HEAD causes refusal, not overwriting. Recoverable original
196
+ bytes and modes remain in the journal. Empty directories created by an operation
197
+ are removed on rollback; directories containing somebody else's additions remain.
198
+ Receipts distinguish staged, published, and rollback verification.
199
+
200
+ Default state location:
201
+ `~/.local/state/yasarda/<repository-root-digest>/<plan-id>.json`.
202
+ Use `--state-dir` or host environment `YASARDA_STATE_DIR` to choose another private
203
+ location **outside** the repository. State directories are 0700; journals and
204
+ exported plans are 0600. Journals and plans contain source bytes; treat them as
205
+ sensitive, keep them while recovery may be needed, and manage retention yourself.
206
+ Receipts returned through the API omit those embedded source payloads.
207
+ Known cloud/remote filesystem refusal applies to this state path as well as the
208
+ repository because its lock and journal durability are part of recovery safety.
209
+
210
+ ## Vinyasar supervisor boundary
211
+
212
+ Yasarda 0.3.0 adds two narrow read-only SDK methods for the separately packaged
213
+ Vinyasar automation layer:
214
+
215
+ ```python
216
+ engine.pending_operations() # exact IDs requiring recovery
217
+ repository.mutation_filesystem_issue() # reason mutation storage is unsupported
218
+ ```
219
+
220
+ Vinyasar calls these methods plus the existing `Engine.recover()` API. It does
221
+ not read journal files or call transaction internals. Yasarda remains the only
222
+ component that stages, publishes, restores, and verifies repository bytes.
223
+
224
+ ## Python SDK
225
+
226
+ ```python
227
+ from pathlib import Path
228
+ from yasarda import Catalog, Engine, Plan, Policy, Repository
229
+
230
+ root = Path("/path/to/repo")
231
+ repo = Repository(root, policy=Policy(mode="proposal-only"))
232
+ catalog = Catalog.load(root / ".yasarda/remediations")
233
+ plan = catalog.plan("RP-001", repo)
234
+ print(plan.diff)
235
+ plan.save("/outside/repo/reviewed.plan.json")
236
+
237
+ # Later, potentially in a new process, after independent review:
238
+ reviewed = Plan.load("/outside/repo/reviewed.plan.json")
239
+ executor = Repository(root, policy=Policy(mode="approved-mutation"))
240
+ receipt = Engine(executor).execute(reviewed, approval=reviewed.id)
241
+ assert receipt["state"] in {"verified", "already_satisfied"}
242
+ ```
243
+
244
+ The approval in this example represents a trusted host decision. Do not copy
245
+ that auto-approval pattern into an untrusted agent endpoint. `Engine(...,
246
+ catalog=live_catalog)` additionally checks its supplied catalog snapshot against
247
+ the plan. A self-contained saved plan without a live catalog deliberately uses
248
+ its embedded, approved manifests and verifies dependencies against current files.
249
+
250
+ Errors have stable `code`, `message`, and `details` fields. CLI failures are JSON
251
+ on stderr; codes are 0 success, 2 blocked/invalid/I/O, 3 missing immediate-apply
252
+ confirmation, 4 verification failure, and 130 keyboard interruption.
253
+
254
+ ## MCP stdio
255
+
256
+ Read-only host configuration:
257
+
258
+ ```json
259
+ {
260
+ "mcpServers": {
261
+ "yasarda": {
262
+ "command": "yasarda-mcp",
263
+ "args": ["--repo", "/absolute/repository", "--mode", "read-only"]
264
+ }
265
+ }
266
+ }
267
+ ```
268
+
269
+ To delegate execution, the host separately supplies the saved plan and approved
270
+ ID at process startup:
271
+
272
+ ```sh
273
+ yasarda-mcp --repo /absolute/repository --mode approved-mutation \
274
+ --plan-file /outside/repo/reviewed.plan.json --approve REVIEWED_PLAN_ID
275
+ ```
276
+
277
+ There are **no tool arguments** for changing repository/catalog roots, mode,
278
+ dirty-worktree permission, command permission, or approvals. Read-only servers
279
+ omit mutation tools. A write-enabled server still rejects plans absent from its
280
+ host approval set. Completed-operation rollback additionally requires the host's
281
+ `--allow-rollback` flag; interrupted-operation recovery uses its approved ID.
282
+
283
+ Tools expose status, catalogs, inspection, planning, structural verification,
284
+ plan summaries, and receipts. Authorized hosts additionally expose execution and
285
+ recovery. Plans and manifests are available as `yasarda://` JSON resources.
286
+
287
+ The included transport is a bounded, synchronous tools/resources implementation
288
+ of MCP stdio for protocol versions 2025-11-25 and 2025-06-18. It negotiates the
289
+ version, validates input schemas, returns structured results/tool errors, and
290
+ keeps stdout protocol-only. It does not provide HTTP, OAuth, prompts, sampling,
291
+ tasks, subscriptions, or live mid-operation cancellation. Process interruption is
292
+ handled through the journal. See the test report for what was actually exercised;
293
+ this is not a claim of certification or testing in every MCP host application.
294
+
295
+ ## Important limits
296
+
297
+ - This is not an OS security boundary, multi-file atomic filesystem, or semantic
298
+ code-repair oracle. Keep noncooperating writers out of the destination while
299
+ publishing. An agent with independent shell/filesystem access can bypass a tool.
300
+ - Regular singly-linked files only. Symlinks, hardlinks, devices, special
301
+ permission bits, and directory transformations are rejected. Content and POSIX
302
+ mode are tracked; ownership, ACLs, xattrs, and timestamps are not preserved as a
303
+ complete metadata snapshot. Use an appropriate filesystem copy tool when those
304
+ attributes matter.
305
+ - Protected paths include Git metadata, Yasarda configuration, credential
306
+ directories, dotenv files, and root CI workflows. A trusted SDK host may supply
307
+ a different `Policy`; MCP callers cannot.
308
+ - Default limits: 8 MiB per file, 24 MiB input snapshot, 200 scoped files. Generated
309
+ outputs have an 8 MiB hard cap; serialized plans have a 64 MiB cap. MCP sessions
310
+ hold at most 100 plans and 64 MiB of serialized plans. Oversized jobs must be
311
+ deliberately split, not silently truncated.
312
+ - Local source artifacts only. No AST adapters, signed registries, network
313
+ publication, sandboxed build runner, or hidden cloud dependencies.
314
+
315
+ ## Tests and handoff
316
+
317
+ ```sh
318
+ python -m pip install '.[dev]'
319
+ python -m pytest
320
+ ```
321
+
322
+ The source includes the unmodified seven original tests and eight original audit
323
+ regressions, plus failure-injection, interruption, permission, saved-plan, and MCP
324
+ wire tests. See `docs/TEST_REPORT.md`, `docs/SAFETY.md`, `CHANGELOG.md`, and
325
+ `docs/HANDOFF.md` for evidence and precise limitations.