PyCForge 1.3.51 — Reliable large-workspace editing
Prepared 2026-10-21 UTC from the verified 1.3.50 source archive.

RELEASE SCOPE

This release reduces redundant editor layout work and manages rebuildable text
storage while protecting editing state. It continues the large-source work in
1.3.50. The public conversion API, conversion semantics, fingerprints and runtime
dependencies remain unchanged. Workspace admission gains a documented limit.
All 144 converter files and all 10 Python Check analysis/ruleset files match the
verified 1.3.50 archive byte for byte.

Baseline archive SHA256:
dfc4b666bfd6c24fab1906bdf281dae86a8c9173bb97063b860237029dc2ac81

EDITOR BEHAVIOR

Detached source documents inherit the current view's font and text options
before population. Binding defers margin and extra-selection refreshes until
the document is attached. Unchanged font, tab width, whitespace flags and
margins are not reapplied. Returning to a previously visited buffer correctly
updates its document font even if the widget already has the requested size.

A coalesced, single-shot retention timer targets 32 MiB of retained UTF-16 text
payload plus independently copied Python snapshots. It first releases eligible
inactive snapshots and then least recently accessed clean large buffers with no
undo or redo. Active sources, dirty workspace records, unsynchronized Qt edits,
undo/redo history, replacement previews and definition-return cursors remain
protected. Saved documents with undo history remain protected. Revisited clean
buffers are reconstructed completely through the existing lazy loading path.
Independent owners hold preview and navigation pins; releasing one cannot
release another. Small buffers are retained to avoid repeated reconstruction.

Unvisited normalized text has a separate 8 MiB duplicate-cache allowance.
Oversized normalized text is returned in full without retaining a second copy.
Shared controller strings do not count as duplicate cache storage.

New/opened sources, reloads and project restores are checked before publication.
A transition is rejected if it both exceeds 64 MiB of retained Python source
and disk-baseline strings and increases that storage. Identity accounting visits
at most 128 references without encoding or rescanning text. Rejection preserves
the existing workspace. Existing edits, undo/redo, saves and non-increasing
replacements remain available above the allowance. Existing 64-document and
per-file UTF-8 limits are unchanged.

These are text-storage policies, not a total-process memory limit. Native Qt
layout, undo allocations, transient file reads and worker memory are excluded.
Protected buffers may exceed the cache target. No new threads, processes,
pools, polling loops or dependencies were introduced. Qt remains on its GUI
thread and existing asynchronous services retain their execution ownership.

PERFORMANCE OBSERVATIONS

Python 3.12.14, PySide6 6.12.0, Linux, QT_QPA_PLATFORM=offscreen.
Thirty-six fresh-process observations: six fixtures, three repetitions each,
against both versions. Runs were serial, with no test runner competing for
CPU; the version order alternated. Every corresponding source SHA256 agrees.
Ordinary sources use 128-character lines. Two editor views share each active
document. The component harness measures population, binding and settling;
it excludes file I/O, complete IDE startup, revision validation and conversion.

The following are medians across three runs, before -> after. Heartbeat values
are the median of each run's largest gap for a nominal 1 ms timer:

  One 1 MiB ordinary source:
    Maximum heartbeat gap: 19.32 -> 13.67 ms
    Total loading/settling: 58.33 -> 53.38 ms
  One 4 MiB ordinary source:
    Maximum heartbeat gap: 41.04 -> 25.32 ms
    Total loading/settling: 201.77 -> 165.35 ms
  One 16 MiB ordinary source:
    Maximum heartbeat gap: 125.50 -> 94.80 ms
    Total loading/settling: 733.86 -> 710.94 ms
  Eight 4 MiB sources; first selected:
    Maximum heartbeat gap: 38.35 -> 30.23 ms
    Total loading/settling: 179.46 -> 173.19 ms
  One 1 MiB paragraph:
    Maximum heartbeat gap: 1334.89 -> 624.33 ms
    Total loading/settling: 1450.18 -> 710.30 ms
  Eight 4 MiB sources; all visited:
    Maximum heartbeat gap: 50.94 -> 28.70 ms
    Total loading/settling: 1382.86 -> 1318.75 ms

After visiting eight clean 4 MiB sources, median process RSS was 312.63 ->
242.13 MiB. Ready buffers were 8 -> 4; candidate counted buffer text was 32 MiB.
The source-only starting RSS was 112.96 -> 111.45 MiB. Allocators and Qt layout
retain memory, so dropping half the text buffers does not halve process RSS.
Single-buffer ordinary-source memory remained roughly comparable.

The long-line improvement is substantial in this fixture, but a roughly 624 ms
heartbeat pause is still noticeable. Large pastes, long paragraphs and final
Qt layout remain atomic work. These measurements are observations, not latency
guarantees or native Windows/macOS acceptance. Raw samples and the common
reproduction harness are included. After measurement, one margin method moved
unchanged into the existing command mixin to retain the editor module's size
bound. Its AST is identical; focused and installed checks were repeated.

VALIDATION

The complete pytest collection contains 3,006 tests in 235 modules.
Every collected module was run in a fresh process, with at most two concurrent
test processes and separate Qt settings. No selection filter, exclusion or new
skip was added. Final results: 2,934 passed tests, 4,818 passed
subtests, 72 existing environment-dependent skips, zero remaining failures.
Each module's attempts, exact test-file SHA256, return code and log are retained.

An earlier single-process full-suite attempt ended before a pytest summary;
its partial log contains failure markers. Its termination cause is not known.
It is not claimed as a successful single-process run. The complete coverage
above comes from the separately recorded per-module runs and follow-ups.

The follow-ups corrected a historical converter count (135 -> 144) and used
bounded fixtures for historical snapshot hash tests. Those tests previously
tried to snapshot modern release evidence containing a 13.6 MB historical patch
through builders with an 8 MiB file limit. Builder size, symlink and other
safety checks were not weakened; current distributions use their own verifier.
Fingerprint self-exclusion is also checked after changing the fingerprint file.

Two structural checks found editor.py at 1,001 lines. The unchanged viewport
margin method moved into SourceCommandMixin, leaving editor.py at 989 lines
and the workspace feature module at 591. Existing size bounds remain intact.
One source test assumed QObject was the only base class; it now checks the
parsed class's QObject base while allowing the retention mixin. All affected
modules passed on follow-up.

After the helper relocation, the combined editor/loading/settings/integration/
lifecycle checks passed 140 tests and 28 subtests. They include 17 new resource
tests covering atomic admission, editing/saving above the allowance, exact
rebuilds, dirty and saved history, redo, independent pins, bounded normalized
copies, unchanged settings, shared fonts and repeated workspace cleanup.
These counts overlap the complete collection and must not be added to it.

Existing skips, grouped by their reported reason:
  8: clang unavailable
  7: sealed Phase 14D predecessor archive is not beside this tree
  12: clang is not installed
  17: Set PCFC11_PATH for native compilation
  2: Set PCFC11_PATH for target assembly
  11: Set PCFC11_PATH for native compiler integration tests
  3: Set PCFC11_PATH for the compilation dialog test
  1: PySide6 is installed in this environment
  1: sealed predecessor archive is not beside this source tree
  1: sealed Phase 13 archive is not beside this source tree
  1: sealed Phase 14A archive is not beside this source tree
  1: sealed Phase 14B archive is not beside this source tree
  1: sealed Phase 14B wheel is not beside this source tree
  1: sealed Phase 14C archive is not beside the release tree
  1: sealed Phase 14C wheel is not beside the release tree
  1: sealed Phase 14D archive is not beside the Checkpoint E tree
  1: optional sealed Phase 15A archive is unavailable
  1: authenticated Phase 15B predecessor is unavailable
  1: optional sealed Checkpoint E archive is unavailable

The final wheel was installed into a clean target outside the source tree.
All 889 packaged members match both source and installed bytes. Its 22 smoke
checks passed: version/startup/About/30 Help footers; disk-conflict protection
and reviewed overwrite; checker queue/admission/budget release; revision cache
identity/cleanup; API callback thread and cooperative cancellation; complete
loading publication, full save, split ownership, undo/redo, safe eviction and
rebuild, atomic source admission, and editing/saving above the allowance.
An initial smoke invocation omitted its screenshot output argument; it was
corrected, and the harness gained a main guard for multiprocessing imports.
The successful final log is final-installed-smoke-result.txt.

DOCUMENTATION AND README

Offline Help verification passed all 30 pages in five categories, 56 search
queries, local links/fragments, 81 executable Python examples (49 Runtime and
32 Typed native comparisons), separate Typed checks, five API examples, four
C callers, three module bundles, three export examples and three README Python
examples. The new workspace-memory section explains admission, retention and
undo preservation without implying a total-memory cap. Wide and narrow Help
renders and the installed workspace were visually inspected.

The README body differs from 1.3.50 only in its version heading. It retains the
brief API integration paragraph, concise product information and exactly the
four approved image URLs, original image order, banner widths, screenshot
labels and Crucible subtitle. No roadmap, development-cycle status or test
counts were added to it. AGENTS.md and PyCForge-README-Guidelines.txt remain
byte-identical to the verified baseline and are included in the source archive.

REMAINING PLATFORM ACCEPTANCE

Native Windows and macOS were not available for this verification. On CC's
Windows machine, verify a clean install and startup; open/switch several large
sources; edit/save/undo/redo across tabs and split panes; change font size then
return to an older tab; cancel preparation and close the workspace; exercise
replacement previews and return navigation; check admission messages and Help
at the display scaling in use. Confirm ordinary conversion/build workflows
with the installed Windows compiler. Native macOS acceptance remains later work.

RELEASE HANDOFF

CC alone uploads from CC's own computer. No publication was performed here.
The current pair is pycforge-1.3.51-py3-none-any.whl and pycforge-1.3.51.tar.gz.
The accompanying handoff copy of this report adds final archive verification,
sizes and SHA256 values. The source-embedded copy stops before those values to
avoid a self-referential source-archive hash. Earlier review files are separate.
