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.
Files changed (127) hide show
  1. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/.github/workflows/ci.yml +1 -1
  2. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/.github/workflows/release.yml +1 -1
  3. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/.github/workflows/testpypi.yml +1 -1
  4. patchshuttle-0.1.0a4/CHANGELOG.md +212 -0
  5. patchshuttle-0.1.0a4/PKG-INFO +955 -0
  6. patchshuttle-0.1.0a4/README.md +918 -0
  7. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/SPEC_V0_1.md +509 -57
  8. patchshuttle-0.1.0a4/docs/RELEASE.md +213 -0
  9. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/pyproject.toml +4 -0
  10. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/__init__.py +4 -0
  11. patchshuttle-0.1.0a4/src/patchshuttle/_ai_log.py +437 -0
  12. patchshuttle-0.1.0a4/src/patchshuttle/_architecture.py +334 -0
  13. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/_diff.py +68 -8
  14. patchshuttle-0.1.0a4/src/patchshuttle/_html_lint.py +49 -0
  15. patchshuttle-0.1.0a4/src/patchshuttle/_line_ranges.py +105 -0
  16. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/_process.py +22 -3
  17. patchshuttle-0.1.0a4/src/patchshuttle/_python_discovery.py +236 -0
  18. patchshuttle-0.1.0a4/src/patchshuttle/_python_structure.py +220 -0
  19. patchshuttle-0.1.0a4/src/patchshuttle/_python_symbols.py +58 -0
  20. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/_version.py +1 -1
  21. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/actions/__init__.py +16 -0
  22. patchshuttle-0.1.0a4/src/patchshuttle/actions/constructors.py +406 -0
  23. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/audit.py +237 -5
  24. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/backup.py +11 -0
  25. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/checks/__init__.py +4 -0
  26. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/checks/constructors.py +21 -0
  27. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/checks/runner.py +118 -23
  28. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/cli.py +487 -63
  29. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/config.py +164 -9
  30. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/context.py +26 -19
  31. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/errors.py +21 -1
  32. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/execution.py +12 -1
  33. patchshuttle-0.1.0a4/src/patchshuttle/formatter_policy.py +59 -0
  34. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/formatters/runner.py +33 -10
  35. patchshuttle-0.1.0a4/src/patchshuttle/linters/__init__.py +19 -0
  36. patchshuttle-0.1.0a4/src/patchshuttle/linters/runner.py +153 -0
  37. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/logging.py +434 -31
  38. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/models.py +200 -2
  39. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/planner.py +689 -25
  40. patchshuttle-0.1.0a4/src/patchshuttle/preflight.py +381 -0
  41. patchshuttle-0.1.0a4/src/patchshuttle/project_python.py +79 -0
  42. patchshuttle-0.1.0a4/src/patchshuttle/resources/AI_GUIDE.md +348 -0
  43. patchshuttle-0.1.0a4/src/patchshuttle/resources/PATCHSHUTTLE_PROTOCOL.md +258 -0
  44. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/runner.py +115 -8
  45. patchshuttle-0.1.0a4/src/patchshuttle/runtime_cache.py +185 -0
  46. patchshuttle-0.1.0a4/src/patchshuttle/selfdoc.py +282 -0
  47. patchshuttle-0.1.0a4/src/patchshuttle/warning_baseline.py +271 -0
  48. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/workspace.py +64 -0
  49. patchshuttle-0.1.0a4/tests/unit/test_a4_coverage_regressions.py +568 -0
  50. patchshuttle-0.1.0a4/tests/unit/test_ai_log.py +273 -0
  51. patchshuttle-0.1.0a4/tests/unit/test_architecture.py +350 -0
  52. patchshuttle-0.1.0a4/tests/unit/test_attempt_logging.py +148 -0
  53. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_audit_verify_execution.py +64 -1
  54. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_backup.py +21 -1
  55. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_checks.py +232 -4
  56. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_cli.py +477 -6
  57. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_config.py +85 -0
  58. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_context_and_constructors.py +171 -0
  59. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_diff.py +80 -0
  60. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_formatters.py +108 -0
  61. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_formatting_transaction.py +68 -0
  62. patchshuttle-0.1.0a4/tests/unit/test_guarded_ranges.py +471 -0
  63. patchshuttle-0.1.0a4/tests/unit/test_html_lint.py +355 -0
  64. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_logging.py +139 -0
  65. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_models.py +234 -0
  66. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_operational_execution.py +39 -0
  67. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_package.py +7 -4
  68. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_planner.py +206 -0
  69. patchshuttle-0.1.0a4/tests/unit/test_planner_ux.py +277 -0
  70. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_policy.py +30 -0
  71. patchshuttle-0.1.0a4/tests/unit/test_preflight.py +664 -0
  72. patchshuttle-0.1.0a4/tests/unit/test_project_python.py +219 -0
  73. patchshuttle-0.1.0a4/tests/unit/test_python_discovery.py +307 -0
  74. patchshuttle-0.1.0a4/tests/unit/test_python_structure.py +194 -0
  75. patchshuttle-0.1.0a4/tests/unit/test_python_structure_action.py +151 -0
  76. patchshuttle-0.1.0a4/tests/unit/test_python_symbols.py +72 -0
  77. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_release_configuration.py +2 -1
  78. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_rollback.py +8 -2
  79. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_runner.py +230 -1
  80. patchshuttle-0.1.0a4/tests/unit/test_runtime_cache.py +320 -0
  81. patchshuttle-0.1.0a4/tests/unit/test_selfdoc.py +84 -0
  82. patchshuttle-0.1.0a4/tests/unit/test_warning_baseline.py +126 -0
  83. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_workspace.py +107 -0
  84. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tools/index_smoke.py +66 -3
  85. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tools/release_checks.py +17 -0
  86. patchshuttle-0.1.0a4/tools/wheel_smoke.py +276 -0
  87. patchshuttle-0.1.0a2/CHANGELOG.md +0 -55
  88. patchshuttle-0.1.0a2/PKG-INFO +0 -535
  89. patchshuttle-0.1.0a2/README.md +0 -501
  90. patchshuttle-0.1.0a2/docs/RELEASE.md +0 -101
  91. patchshuttle-0.1.0a2/src/patchshuttle/actions/constructors.py +0 -211
  92. patchshuttle-0.1.0a2/src/patchshuttle/resources/AI_GUIDE.md +0 -163
  93. patchshuttle-0.1.0a2/src/patchshuttle/resources/PATCHSHUTTLE_PROTOCOL.md +0 -109
  94. patchshuttle-0.1.0a2/tools/wheel_smoke.py +0 -149
  95. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/.gitignore +0 -0
  96. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/LICENSE +0 -0
  97. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/SECURITY.md +0 -0
  98. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/actions/create.py +0 -0
  99. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/actions/modify.py +0 -0
  100. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/formatters/__init__.py +0 -0
  101. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/identifiers.py +0 -0
  102. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/inventory.py +0 -0
  103. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/operations.py +0 -0
  104. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/parser.py +0 -0
  105. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/policy.py +0 -0
  106. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/py.typed +0 -0
  107. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/registry.py +0 -0
  108. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/resources/AUDIT-EXAMPLE.psh.yaml +0 -0
  109. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/resources/PATCH-EXAMPLE.psh.yaml +0 -0
  110. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/resources/__init__.py +0 -0
  111. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/rollback.py +0 -0
  112. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/src/patchshuttle/verification.py +0 -0
  113. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/e2e/test_cli_project_cycle.py +0 -0
  114. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/integration/test_workflows.py +0 -0
  115. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_actions.py +0 -0
  116. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_change_transaction.py +0 -0
  117. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_check_transaction.py +0 -0
  118. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_execution.py +0 -0
  119. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_identifiers.py +0 -0
  120. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_inventory.py +0 -0
  121. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_inventory_transaction.py +0 -0
  122. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_manual_rollback.py +0 -0
  123. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_modify_actions.py +0 -0
  124. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_parser.py +0 -0
  125. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_phase19_cli.py +0 -0
  126. {patchshuttle-0.1.0a2 → patchshuttle-0.1.0a4}/tests/unit/test_registry.py +0 -0
  127. {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.