PyCForge 1.3.47 — Python save integrity
Prepared 2026-10-20 from the supplied 1.3.46 source archive.

RELEASE SCOPE

This release addresses audit findings F01, F02 and F08: unsafe overwrites of
externally edited Python files, incorrect or missing disk observations, and
repeated assessments caused by bursts of file-change notifications.

Each linked Python document retains the disk version last opened or saved,
independently of its editable buffer. Both synchronous and asynchronous Python
saves check disk bytes immediately before atomic replacement. External edits,
deletions and existing Save As destinations require an explicit decision.

The comparison dialog offers Keep Editing, Reload from Disk, Save As, and
Overwrite Disk (or Recreate File). Keep Editing is the default. An overwrite
rechecks the exact reviewed disk version. Cancel or reload stops Save All and
automatic exit. Later local edits remain dirty after an earlier write completes.
Overlapping Python writes are rejected until the active write completes.

Disk monitoring remains active during edits and revision preparation. It uses
per-path debounce timers, one in-flight observation per path, and one coalesced
follow-up when more notifications arrive. A ten-notification regression probe
produced one assessment. Reads and hashing use the existing bounded I/O worker
service; this release adds no process pool and performs no disk read on typing.
Persistent conflict markers appear in tabs and the active source header.

Project checkpoint restoration keeps the actual disk baseline. Opening a newly
materialized project establishes its baseline from the materialized contents.
The conversion engine is unchanged: all 144 converter files match 1.3.46 by
SHA256. Python save failure injection now targets the shared guarded I/O path;
the legacy injected AtomicWriter remains the generated-C writer.

VALIDATION

Environment: Python 3.12.14, PySide6 6.12.0, Linux, QT_QPA_PLATFORM=offscreen.
Thirty new regression cases cover external edits/deletions/replacements,
raw-byte/newline changes, reviewed overwrite freshness, Save As, overlapping
writes, newer local edits, checkpoints, UI decisions, Save All/exit, stale
observations, watch recovery, notification coalescing and bounded comparisons.

Broad regression run: 108 test modules; 1,362 passed, 8 initially failed,
13 skipped, and 3,482 subtests passed. Seven failures were current-version
assertions still expecting 1.3.46. One injected a failure into the previous
Python writer instead of the guarded I/O path. These tests were updated without
changing the product code after that run.

Follow-up: all 15 affected/current-version test modules; 109 passed, no failures,
5 skipped, and 201 subtests passed. Every one of the eight initially failing
cases passed on rerun. Counts overlap and must not be added. Earlier focused
compatibility run: 171 passed and 688 subtests passed.

The broad run's skips were eight unavailable-Clang checks and five historical
validator cases requiring a sealed predecessor archive not supplied beside this
tree. The five follow-up skips have the same missing-predecessor reason.
Original logs, JUnit results, test selections and a resolution summary are in
evidence/save_integrity_1_3_47. No failed case remains unresolved in this scope.

Visual inspection: themed conflict dialog at 1000x640 and 620x420; both comparison
panes and all four actions remained visible, with Keep Editing the default.

README: only the top heading changed from 1.3.46 to 1.3.47. The approved prose,
four image URLs, banner widths and historical screenshot labels are retained.
The PyPI Markdown renderer check passed. Practical conflict instructions were
added to installed workspace/project Help. Project guidelines are retained.

LIMITS AND NEXT WORK

Disk checks are optimistic. An unrelated process can still write in the small
interval between the final check and os.replace; this is not cross-process file
locking. Readers reject unreadable/nonregular/unstable/invalid-UTF-8/NUL-containing
or over-16-MiB files. Comparisons show at most 64,000 characters per side; saves
use the full buffer. One prior immutable disk-text version is retained per
document, which can increase memory use after editing a large file.

Native Windows/macOS interaction, native filesystem-notification behavior and
real-display scaling were not exercised in this Linux offscreen environment.
The recommended next update is checker scheduling, resource-budget enforcement,
and removal of GUI-thread process waits (audit F03/F04), followed by incremental
index/Help cache work. Those findings are not claimed fixed by this release.

The accompanying final handoff report records checks on the exact wheel/source
pair, installed-package validation, final byte sizes and SHA256 values. Those
hashes are external to this source archive to avoid a self-referential checksum.
Only CC publishes the release to PyPI from CC's own computer.
