patchshuttle 0.1.0a2__tar.gz → 0.1.0a4__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.
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/.github/workflows/ci.yml +1 -1
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/.github/workflows/release.yml +1 -1
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/.github/workflows/testpypi.yml +1 -1
- patchshuttle-0.1.0a4/CHANGELOG.md +212 -0
- patchshuttle-0.1.0a4/PKG-INFO +955 -0
- patchshuttle-0.1.0a4/README.md +918 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/SPEC_V0_1.md +509 -57
- patchshuttle-0.1.0a4/docs/RELEASE.md +213 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/pyproject.toml +4 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/__init__.py +4 -0
- patchshuttle-0.1.0a4/src/patchshuttle/_ai_log.py +437 -0
- patchshuttle-0.1.0a4/src/patchshuttle/_architecture.py +334 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/_diff.py +68 -8
- patchshuttle-0.1.0a4/src/patchshuttle/_html_lint.py +49 -0
- patchshuttle-0.1.0a4/src/patchshuttle/_line_ranges.py +105 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/_process.py +22 -3
- patchshuttle-0.1.0a4/src/patchshuttle/_python_discovery.py +236 -0
- patchshuttle-0.1.0a4/src/patchshuttle/_python_structure.py +220 -0
- patchshuttle-0.1.0a4/src/patchshuttle/_python_symbols.py +58 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/_version.py +1 -1
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/actions/__init__.py +16 -0
- patchshuttle-0.1.0a4/src/patchshuttle/actions/constructors.py +406 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/audit.py +237 -5
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/backup.py +11 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/checks/__init__.py +4 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/checks/constructors.py +21 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/checks/runner.py +118 -23
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/cli.py +487 -63
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/config.py +164 -9
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/context.py +26 -19
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/errors.py +21 -1
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/execution.py +12 -1
- patchshuttle-0.1.0a4/src/patchshuttle/formatter_policy.py +59 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/formatters/runner.py +33 -10
- patchshuttle-0.1.0a4/src/patchshuttle/linters/__init__.py +19 -0
- patchshuttle-0.1.0a4/src/patchshuttle/linters/runner.py +153 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/logging.py +434 -31
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/models.py +200 -2
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/planner.py +689 -25
- patchshuttle-0.1.0a4/src/patchshuttle/preflight.py +381 -0
- patchshuttle-0.1.0a4/src/patchshuttle/project_python.py +79 -0
- patchshuttle-0.1.0a4/src/patchshuttle/resources/AI_GUIDE.md +348 -0
- patchshuttle-0.1.0a4/src/patchshuttle/resources/PATCHSHUTTLE_PROTOCOL.md +258 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/runner.py +115 -8
- patchshuttle-0.1.0a4/src/patchshuttle/runtime_cache.py +185 -0
- patchshuttle-0.1.0a4/src/patchshuttle/selfdoc.py +282 -0
- patchshuttle-0.1.0a4/src/patchshuttle/warning_baseline.py +271 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/workspace.py +64 -0
- patchshuttle-0.1.0a4/tests/unit/test_a4_coverage_regressions.py +568 -0
- patchshuttle-0.1.0a4/tests/unit/test_ai_log.py +273 -0
- patchshuttle-0.1.0a4/tests/unit/test_architecture.py +350 -0
- patchshuttle-0.1.0a4/tests/unit/test_attempt_logging.py +148 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_audit_verify_execution.py +64 -1
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_backup.py +21 -1
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_checks.py +232 -4
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_cli.py +477 -6
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_config.py +85 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_context_and_constructors.py +171 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_diff.py +80 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_formatters.py +108 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_formatting_transaction.py +68 -0
- patchshuttle-0.1.0a4/tests/unit/test_guarded_ranges.py +471 -0
- patchshuttle-0.1.0a4/tests/unit/test_html_lint.py +355 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_logging.py +139 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_models.py +234 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_operational_execution.py +39 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_package.py +7 -4
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_planner.py +206 -0
- patchshuttle-0.1.0a4/tests/unit/test_planner_ux.py +277 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_policy.py +30 -0
- patchshuttle-0.1.0a4/tests/unit/test_preflight.py +664 -0
- patchshuttle-0.1.0a4/tests/unit/test_project_python.py +219 -0
- patchshuttle-0.1.0a4/tests/unit/test_python_discovery.py +307 -0
- patchshuttle-0.1.0a4/tests/unit/test_python_structure.py +194 -0
- patchshuttle-0.1.0a4/tests/unit/test_python_structure_action.py +151 -0
- patchshuttle-0.1.0a4/tests/unit/test_python_symbols.py +72 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_release_configuration.py +2 -1
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_rollback.py +8 -2
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_runner.py +230 -1
- patchshuttle-0.1.0a4/tests/unit/test_runtime_cache.py +320 -0
- patchshuttle-0.1.0a4/tests/unit/test_selfdoc.py +84 -0
- patchshuttle-0.1.0a4/tests/unit/test_warning_baseline.py +126 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_workspace.py +107 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tools/index_smoke.py +66 -3
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tools/release_checks.py +17 -0
- patchshuttle-0.1.0a4/tools/wheel_smoke.py +276 -0
- patchshuttle-0.1.0a2/CHANGELOG.md +0 -55
- patchshuttle-0.1.0a2/PKG-INFO +0 -535
- patchshuttle-0.1.0a2/README.md +0 -501
- patchshuttle-0.1.0a2/docs/RELEASE.md +0 -101
- patchshuttle-0.1.0a2/src/patchshuttle/actions/constructors.py +0 -211
- patchshuttle-0.1.0a2/src/patchshuttle/resources/AI_GUIDE.md +0 -163
- patchshuttle-0.1.0a2/src/patchshuttle/resources/PATCHSHUTTLE_PROTOCOL.md +0 -109
- patchshuttle-0.1.0a2/tools/wheel_smoke.py +0 -149
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/.gitignore +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/LICENSE +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/SECURITY.md +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/actions/create.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/actions/modify.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/formatters/__init__.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/identifiers.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/inventory.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/operations.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/parser.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/policy.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/py.typed +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/registry.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/resources/AUDIT-EXAMPLE.psh.yaml +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/resources/PATCH-EXAMPLE.psh.yaml +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/resources/__init__.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/rollback.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/verification.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/e2e/test_cli_project_cycle.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/integration/test_workflows.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_actions.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_change_transaction.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_check_transaction.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_execution.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_identifiers.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_inventory.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_inventory_transaction.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_manual_rollback.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_modify_actions.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_parser.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_phase19_cli.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_registry.py +0 -0
- {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tools/check_tag.py +0 -0
|
@@ -41,7 +41,7 @@ jobs:
|
|
|
41
41
|
- name: Install development environment
|
|
42
42
|
run: |
|
|
43
43
|
python -m pip install --upgrade pip
|
|
44
|
-
python -m pip install -e ".[dev]"
|
|
44
|
+
python -m pip install -e ".[dev,html]"
|
|
45
45
|
- name: Check import ordering
|
|
46
46
|
run: python -m isort --check-only src tests tools
|
|
47
47
|
- name: Check formatting
|
|
@@ -27,7 +27,7 @@ jobs:
|
|
|
27
27
|
- name: Test, build, and validate distributions
|
|
28
28
|
run: |
|
|
29
29
|
python -m pip install --upgrade pip
|
|
30
|
-
python -m pip install -e ".[dev]"
|
|
30
|
+
python -m pip install -e ".[dev,html]"
|
|
31
31
|
python -m isort --check-only src tests tools
|
|
32
32
|
python -m black --check src tests tools
|
|
33
33
|
python -m coverage erase
|
|
@@ -20,7 +20,7 @@ jobs:
|
|
|
20
20
|
- name: Build and validate distributions
|
|
21
21
|
run: |
|
|
22
22
|
python -m pip install --upgrade pip
|
|
23
|
-
python -m pip install -e ".[dev]"
|
|
23
|
+
python -m pip install -e ".[dev,html]"
|
|
24
24
|
python -m isort --check-only src tests tools
|
|
25
25
|
python -m black --check src tests tools
|
|
26
26
|
python -m coverage erase
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to PatchShuttle are recorded in this file. The project
|
|
4
|
+
uses semantic versioning, including Python-compatible pre-release versions.
|
|
5
|
+
|
|
6
|
+
## Unreleased
|
|
7
|
+
|
|
8
|
+
## 0.1.0a4 - 2026-08-27
|
|
9
|
+
|
|
10
|
+
Third alpha release, focused on bounded Python source discovery, compact
|
|
11
|
+
structure output, and owner-controlled architecture ratchets.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- Owner-controlled Python architecture ratchets evaluate the planner's virtual
|
|
15
|
+
file state before execution. Defaults warn at 500 lines per module, 15 direct
|
|
16
|
+
Python files per package, five new Python files, or one new package; hard
|
|
17
|
+
limits are 1000, 25, 10, and three respectively. Stable bounded `ARCH` findings
|
|
18
|
+
appear in plans and logs, while unchanged or improving legacy violations remain
|
|
19
|
+
allowed.
|
|
20
|
+
|
|
21
|
+
- Read-only `python_structure` uses the standard-library AST to report a
|
|
22
|
+
bounded declaration map for one Python file or directory, including
|
|
23
|
+
imports, classes, functions, methods, parameters, decorators, bases,
|
|
24
|
+
source ranges, parse errors, and explicit file and symbol limit signals,
|
|
25
|
+
without importing or executing project code. Its opt-in `compact: true`
|
|
26
|
+
mode retains navigational symbol identities and ranges while omitting
|
|
27
|
+
detailed import and declaration metadata; full output remains the default.
|
|
28
|
+
|
|
29
|
+
- Read-only `search_context` returns bounded physical-line context around
|
|
30
|
+
literal matches, and `read_symbol` returns one exactly resolved
|
|
31
|
+
decorator-aware Python symbol with its physical range and canonical
|
|
32
|
+
LF/UTF-8 SHA-256.
|
|
33
|
+
- Guarded `replace_symbol` replaces one exactly resolved Python class,
|
|
34
|
+
function, method, or nested symbol using the hash returned by
|
|
35
|
+
`read_symbol` and the planner's sequential simulated file state.
|
|
36
|
+
- The built-in `ruff: {}` check runs fixed Ruff `F` rules without fixes
|
|
37
|
+
over only the Python files changed by the current patch.
|
|
38
|
+
- `logs --last --ai` and `logs --last --ai-json` render bounded
|
|
39
|
+
deterministic text and JSON views of the newest stored log without
|
|
40
|
+
changing it or executing project code.
|
|
41
|
+
- Run and early-failure logs include evidence-only
|
|
42
|
+
`PYTHON_DISCOVERY_EVALUATION` telemetry for the current job. It records
|
|
43
|
+
explicit Python paths, audit action/output volume, targeting styles, and
|
|
44
|
+
relevant failure signals without estimating tokens or deciding whether a
|
|
45
|
+
project symbol index should be implemented.
|
|
46
|
+
- Python discovery telemetry also aggregates reported file and search
|
|
47
|
+
matches, result-limit signals, and durations already present in bounded
|
|
48
|
+
audit results. Newly generated workspace policy covers conventional
|
|
49
|
+
`.venv`, `venv`, and `node_modules` trees at any depth; backup directories
|
|
50
|
+
remain owner-configured exclusions.
|
|
51
|
+
- Best-effort whole-log redaction recognizes common sensitive Python
|
|
52
|
+
assignment identifiers, including prefixed passwords, API and access keys,
|
|
53
|
+
secret and private keys, tokens, and one-line `SECRET_KEY_FALLBACKS`
|
|
54
|
+
collections. Safe annotations, same-name references, and loader calls remain
|
|
55
|
+
visible; the redaction guarantee remains `NONE`.
|
|
56
|
+
- Explicit project-local Django warning baselines classify known and new
|
|
57
|
+
W-class system-check warnings without changing the check exit status.
|
|
58
|
+
- Optional owner-controlled `[execution].python_executable` selects the
|
|
59
|
+
interpreter for Python-based project checks and `{python}` local
|
|
60
|
+
profiles. Jobs cannot set it, and omitted configuration retains the
|
|
61
|
+
existing interpreter behavior.
|
|
62
|
+
|
|
63
|
+
### Changed
|
|
64
|
+
|
|
65
|
+
- AI handoffs use a deterministic capability hash, generated handoff trees
|
|
66
|
+
omit legacy backup and archive artifacts, and source audit output avoids
|
|
67
|
+
the confirmed token-name redaction false positive.
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
|
|
71
|
+
- `replace_symbol` execution now enters the same guarded file-change
|
|
72
|
+
transaction as other planned text modifications, including revalidation,
|
|
73
|
+
backups, checks, rollback, logging, and workspace comparison.
|
|
74
|
+
|
|
75
|
+
## 0.1.0a3 - 2026-08-23
|
|
76
|
+
|
|
77
|
+
Second alpha release, focused on AI-facing planning diagnostics, legacy-project
|
|
78
|
+
formatter compatibility, optional HTML linting, operational self-documentation,
|
|
79
|
+
and strict guarded physical-line operations.
|
|
80
|
+
|
|
81
|
+
### Added
|
|
82
|
+
|
|
83
|
+
- `patchshuttle plan JOB.psh.yaml --diff` prints a bounded unified preview of
|
|
84
|
+
the fully resolved in-memory file changes without writing project files.
|
|
85
|
+
- Exact text-action mismatches now include exact line numbers or up to three
|
|
86
|
+
bounded, similarity-ranked nearby snippets. Unified-diff failures include
|
|
87
|
+
hunk numbers, declared and actual counts, and first context mismatches.
|
|
88
|
+
- Changed Python files receive a read-only PEP 263 encoding, isort, and Black
|
|
89
|
+
compatibility preflight during planning.
|
|
90
|
+
- The optional `patchshuttle[html]` extra installs djLint. Local configuration
|
|
91
|
+
can enable lint-only checks for the exact changed `.html` scope, including
|
|
92
|
+
isolated stdin-based planning preflight, fixed non-shell execution, log
|
|
93
|
+
records, and automatic rollback on failure. Project djLint configuration
|
|
94
|
+
cannot override this local PatchShuttle policy.
|
|
95
|
+
- Validation and planning failures now write timestamped AI-readable attempt
|
|
96
|
+
logs after a workspace is resolved, so `logs --last` exposes the newest
|
|
97
|
+
recorded failure without archiving invalid job source or updating registry
|
|
98
|
+
state.
|
|
99
|
+
- A global `--workspace PATH` option routes workspace-aware commands to an
|
|
100
|
+
exact root. Missing implicit workspaces can report bounded direct-child
|
|
101
|
+
candidates without selecting one automatically.
|
|
102
|
+
- Workspace-independent `capabilities`, `schema`, and `explain TOPIC` commands
|
|
103
|
+
expose the installed protocol surface without weakening protected paths.
|
|
104
|
+
- Local `isort_exclude` and `black_exclude` lists accept exact normalized
|
|
105
|
+
changed-Python paths. Plans and logs expose a per-file, per-tool decision
|
|
106
|
+
matrix while jobs remain unable to change formatter policy.
|
|
107
|
+
- `django_import_check` imports bounded dotted module names through
|
|
108
|
+
`manage.py shell -c`, allowing project checks that require initialized
|
|
109
|
+
Django settings and the app registry without accepting arbitrary code.
|
|
110
|
+
- Read-only `hash_range` and guarded `replace_range`, `delete_range`, and
|
|
111
|
+
`insert_at_line` operations add 1-based inclusive physical-line addressing
|
|
112
|
+
without weakening identity checks. Content and SHA-256 guards use canonical
|
|
113
|
+
LF/UTF-8 bytes, evaluate against sequential simulated content, and fail
|
|
114
|
+
closed without fuzzy relocation or partial application.
|
|
115
|
+
|
|
116
|
+
### Changed
|
|
117
|
+
|
|
118
|
+
- Backup manifests record the approved HTML lint scope, and run logs include a
|
|
119
|
+
fixed `LINT_HTML` section plus `html_lint_status` in the summary.
|
|
120
|
+
- HTML linting is disabled by default and cannot be enabled or reconfigured by
|
|
121
|
+
an AI job.
|
|
122
|
+
- Formatter preflight distinguishes an incompatible legacy baseline from
|
|
123
|
+
incompatibility introduced by planned content, allows a patch that repairs
|
|
124
|
+
the baseline, and retains bounded Black stderr in planning diagnostics.
|
|
125
|
+
- Black compatibility preflight and execution use the same controlled CLI
|
|
126
|
+
policy options; Black's ordinary check-only reformat exit remains compatible.
|
|
127
|
+
|
|
128
|
+
### Fixed
|
|
129
|
+
|
|
130
|
+
- Source-version transitions no longer compare a new checkout version with
|
|
131
|
+
stale editable-install metadata before rebuilding. Distribution metadata
|
|
132
|
+
remains validated from the wheel and source archive by the release gates.
|
|
133
|
+
- Python checks now redirect bytecode caches to an isolated temporary
|
|
134
|
+
directory, so `compileall`, imports, and test collection do not leave
|
|
135
|
+
`__pycache__` entries that can obstruct rollback of a newly created package.
|
|
136
|
+
- A defensive runtime-cache ledger removes only new regular `.pyc` files and
|
|
137
|
+
newly empty `__pycache__` directories in the changed-Python scope before
|
|
138
|
+
completion or rollback, while preserving every pre-existing or foreign
|
|
139
|
+
entry.
|
|
140
|
+
- Binary Python targets are classified before PEP 263 formatter preflight, and
|
|
141
|
+
resolved-diff no-change coverage now uses platform-stable LF bytes.
|
|
142
|
+
- Symlink-dependent tests now skip consistently when the platform or current
|
|
143
|
+
process cannot create symbolic links.
|
|
144
|
+
|
|
145
|
+
## 0.1.0a2 - 2026-08-16
|
|
146
|
+
|
|
147
|
+
First published alpha release, qualified on TestPyPI and released to production
|
|
148
|
+
PyPI through Trusted Publishing.
|
|
149
|
+
|
|
150
|
+
### Added
|
|
151
|
+
|
|
152
|
+
- Existing-project and empty-directory initialization with stable project IDs.
|
|
153
|
+
- Protocol 1 YAML jobs and equivalent immutable Python constructors.
|
|
154
|
+
- Bounded `audit`, transactional `patch`, and one-pass `verify` workflows.
|
|
155
|
+
- All v0.1 text actions, controlled Python, pytest, unittest, Django, import,
|
|
156
|
+
and locally configured checks.
|
|
157
|
+
- Per-job backups, automatic rollback, guarded manual rollback, and explicit
|
|
158
|
+
`--keep-changes` failure handling.
|
|
159
|
+
- Changed-Python-only isort followed by Black, with final check reruns.
|
|
160
|
+
- Workspace inventory comparison and unexpected side-effect reporting.
|
|
161
|
+
- Fixed-section timestamped logs, exact job archives, registry idempotency,
|
|
162
|
+
project snapshots, and compact AI handoffs.
|
|
163
|
+
- Integration, end-to-end, wheel smoke, release validation, and index smoke
|
|
164
|
+
tests.
|
|
165
|
+
- GitHub Actions workflows for the required Ubuntu and Windows matrix and for
|
|
166
|
+
Trusted Publishing to TestPyPI and PyPI.
|
|
167
|
+
|
|
168
|
+
### Security
|
|
169
|
+
|
|
170
|
+
- Deny-by-default confirmation for patch and verify execution.
|
|
171
|
+
- Protected and ignored path policy, symbolic-link and special-file rejection,
|
|
172
|
+
bounded inputs and outputs, non-shell subprocess execution, and best-effort
|
|
173
|
+
log redaction.
|
|
174
|
+
|
|
175
|
+
### Fixed
|
|
176
|
+
|
|
177
|
+
- Python 3.10 TOML compatibility in package and index-smoke checks.
|
|
178
|
+
- Windows inventory capture when path metadata does not expose stable inode
|
|
179
|
+
identifiers.
|
|
180
|
+
- Persistent cross-platform workspace locking with `filelock` native locks.
|
|
181
|
+
- Platform-neutral subprocess newlines and portable filesystem test fixtures.
|
|
182
|
+
|
|
183
|
+
### Qualification status
|
|
184
|
+
|
|
185
|
+
- Local Linux/Python 3.10 and 3.12 verification is complete with 100% statement
|
|
186
|
+
and branch coverage.
|
|
187
|
+
- The required GitHub-hosted Ubuntu/Python 3.10, 3.12, and 3.14 plus
|
|
188
|
+
Windows/Python 3.12 and 3.14
|
|
189
|
+
[matrix passed](https://github.com/ratundo/patchshuttle/actions/runs/31969439894)
|
|
190
|
+
on 2026-08-16.
|
|
191
|
+
- The
|
|
192
|
+
[TestPyPI workflow](https://github.com/ratundo/patchshuttle/actions/runs/31968375793)
|
|
193
|
+
and its clean index installation passed before production publication.
|
|
194
|
+
- The
|
|
195
|
+
[production workflow](https://github.com/ratundo/patchshuttle/actions/runs/31969527644),
|
|
196
|
+
[GitHub pre-release](https://github.com/ratundo/patchshuttle/releases/tag/v0.1.0a2),
|
|
197
|
+
and [PyPI publication](https://pypi.org/project/patchshuttle/0.1.0a2/)
|
|
198
|
+
completed on 2026-08-16, followed by a clean installation smoke test.
|
|
199
|
+
- TestPyPI and PyPI received byte-identical files. The wheel SHA-256 is
|
|
200
|
+
`debf664d9ffc1f2763d55fcb0fb4bb47b226ad5b40aa1bf099ce0ab9c6c0c2e6` and
|
|
201
|
+
the source archive SHA-256 is
|
|
202
|
+
`1ae7f233a674704a49f186ef1842e490f10f9814701f712aabed9d16ebe5164c`.
|
|
203
|
+
- A recorded ChatGPT audit, patch, formatting, repeated-check, and independent
|
|
204
|
+
verification workflow passed on Windows 11 with Python 3.14.2 on 2026-08-17.
|
|
205
|
+
See [the release record](docs/RELEASE.md#chatgpt-end-to-end-record) for its
|
|
206
|
+
scope and job hashes.
|
|
207
|
+
|
|
208
|
+
## 0.1.0a1 - 2026-08-06
|
|
209
|
+
|
|
210
|
+
Internal development checkpoint containing the initial package scaffold,
|
|
211
|
+
typed job model, validation, workspace, path policy, planner, and early
|
|
212
|
+
transaction engine. It was not published as a supported release.
|