PyCForge 1.3.50 — Responsive large-source loading
Prepared 2026-10-21 from the verified 1.3.49 source archive.

RELEASE SCOPE

This release addresses the large-source population portion of audit F07.
Sources above 262,144 characters are prepared on demand in a detached Qt
document. One owned timer inserts complete paragraphs in steps targeting
65,536 characters. The editor publishes only the complete document, with a
clean undo stack. Its temporary loading view is read-only in both split panes.

Switching tabs, replacing source or removing a document cancels obsolete work.
Completed buffers retain their edits and undo history. Unvisited large companion
files have no Qt buffer until selected or needed by a replacement preview.
Bundle replacement checks its existing size limit first, prepares buffers one
at a time, and retires the pending preview when the source bundle changes.

Search, outline and diagnostic navigation wait for readiness signals and check
the current selection generation. Changing tabs and returning cannot revive an
obsolete location. Python Check can read complete normalized source while its
editor buffer is still preparing. That normalized snapshot is reused after
publication instead of immediately copying the same text again. Save and
conversion consume complete source; partial staging text is never submitted.

Qt documents remain on the GUI thread. File reading and decoding continue on
the existing I/O workers. No new threads, processes, pools or dependencies are
introduced. All 144 converter files and all 10 Python-check analysis/ruleset
files match 1.3.49 byte for byte. Public API contracts and fingerprints remain
unchanged. Source binding lives with the editor-surface helpers, keeping the
workspace feature module below its existing 600-line limit.

Baseline source archive SHA256:
d3525339cbcc7f599fa57156c2e884cf8f84a16e8115dcb8492cfd09f8214014

PERFORMANCE OBSERVATIONS

Python 3.12.14, PySide6 6.12.0, Linux, QT_QPA_PLATFORM=offscreen.
Thirty fresh-process observations: three repetitions of five fixtures against
each version. Every active-source SHA256 matches across versions. Ordinary
fixtures use 128-character lines. The long-line fixture is one 1 MiB paragraph.
The component harness includes Qt buffer population, two visible editor views,
their binding and a short settling interval. It excludes file I/O, complete IDE
startup, revision validation and conversion. These are observations, not timing
gates or native-platform acceptance.

Median of each run's maximum 1 ms heartbeat gap, before -> after:
  One 1 MiB source:       29.37 ->   13.74 ms
  One 4 MiB source:      116.17 ->   39.82 ms
  One 16 MiB source:     458.18 ->  147.68 ms
  Eight 4 MiB sources:   581.47 ->   42.12 ms
  One 1 MiB long line: 1,437.45 -> 1,422.12 ms

For a 4 MiB ordinary source, initial snapshot reconciliation falls from 79.44 ms
to 0.25 ms; the median per-run p95 loading callback is 1.51 ms. The last callback
also binds the views and remains larger. For 16 MiB, that p95 is 2.35 ms, while
the final callback reaches about 138 ms. The UI can process events between steps;
final binding and very long paragraphs are still atomic Qt operations.

Yielding costs elapsed loading time. Including the harness's settling interval,
the single 4 MiB fixture takes 125.95 -> 184.16 ms, and 16 MiB takes
467.17 -> 812.10 ms. This release improves responsiveness, not every total-time
measurement. A single long paragraph remains slow and is not claimed fixed.

With eight 4 MiB sources, only the selected buffer is constructed instead of all
eight. Median RSS after loading is 223.71 -> 138.79 MiB; the increase from the
source-only state is 111.70 -> 26.51 MiB. A single prepared 4 MiB buffer uses
roughly comparable memory (28.91 -> 30.04 MiB added). Memory remains dependent on
source shape and visited buffers. There is no aggregate RSS quota.

Raw samples and reproduction tools are included under
evidence/source_loading_1_3_50 and tools/benchmark_source_loading.py.

VALIDATION

The 120-module broad run recorded 1,499 passed tests, 3,025 passed subtests,
13 skips and 19 failures. Initial failures involved an overfull Help keyword
list, its dependent Help/focus checks, an oversized integration module, omitted
historical release-procedure text and the current-state version declaration.

The Help keywords were consolidated within the existing 24-entry/48-character
bounds. Source projection responsibilities were split across existing modules;
the 600-line bound was retained. The complete historical release procedure was
restored below the new handoff, and CURRENT_STATE was advanced accurately.

The first affected-module follow-up passed 81 tests and 561 subtests, with the
module-size check still failing at 602 lines. Moving the ready-buffer projection
callback into the projection mixin reduced that module to 591 lines. The final
loading/integration run passed 39 tests and 47 subtests, including all 20 new
loading tests. All initially failing checks are resolved. Counts overlap and
must not be added together. A final theme check passed 24 tests and 602
subtests after improving loading-placeholder contrast. The final editor/loading/
presentation run passed 52 tests and 602 subtests after removing the empty
read-only current-line overlay that obscured the loading label. Raw logs retain
the initial failures and follow-ups.

The 20 new tests cover complete publication and GUI heartbeats, lazy companions,
switch/reload/removal/close cancellation, CRLF/CR/Unicode normalization, preserving
undo, split-view ownership, source and checker navigation, conversion diagnostics
into a lazy companion, stale replacement previews, normalized snapshot reuse,
and saving the full source during preparation. No timing threshold is used to
claim a universal speedup.

The 13 skips retain the prior environment limitations: unavailable Clang and
historical validators needing a sealed predecessor archive. The full repository
test corpus and native Windows/macOS acceptance were not run for this update.

HTML HELP AND README

All 30 Help pages load in Qt, their offline links and fragments resolve, and
54 searches select the expected pages. All 81 documented Python examples pass
native GCC comparisons (32 Typed and 49 Runtime). Typed examples also pass
separate-module compilation. Five API examples, four C callers, three module
bundles, three export examples and three README Python examples pass.

The workspace guide explains the loading view, cancellation, lazy companions,
navigation, full-source saves and remaining memory/layout limits. It groups
loading guidance beside responsiveness limits. The changed Help section was
reviewed at 1220x850 and 900x680. Existing API documentation continues to explain
synchronous conversion, callback thread affinity, cooperative cancellation and
request identity.

The README diff contains only the 1.3.50 heading and one concise paragraph about
API integration contracts supporting other applications. No development-cycle
status, test counts or roadmap was added. Its four approved image URLs, ordering,
320/640 banner widths, historical screenshot labels and Crucible subtitle remain.
AGENTS.md and PyCForge-README-Guidelines.txt are preserved.

INSTALLED ARTIFACT AND HANDOFF

The wheel is installed into a separate target and exercised outside the source
tree. Checks cover the imported path/version, workspace/startup/About versions,
all Help footers, guarded saves and reviewed overwrite, checker queue admission
and cleanup, revision-cache identity and cleanup, API callback thread and
cooperative cancellation, the large-source loading view, saving while loading,
complete shared-buffer publication and editing undo. All 18 installed checks
pass on the final wheel, and pip check reports no broken requirements.

The final handoff copy of this report appends exact artifact filenames, sizes,
SHA256 values and strict distribution-check results after both files are built.
The source-archive copy necessarily precedes its own final hash. Review images
remain outside the release archives. CC alone publishes to PyPI; no upload to
PyPI or other public distribution service is performed here.

REMAINING SCOPE

Exceptionally long paragraphs and final Qt view binding can still pause the UI.
Completed buffers, undo history and complete controller source remain resident;
the 64-document and 16 MiB per-file admission limits are not a combined memory
quota. Multiple small new files still use synchronous population. Large pastes
and generated-C population are unchanged. These boundaries are documented and
remain candidates for later measured improvements.

FINAL DISTRIBUTION VERIFICATION

The exact wheel and source archive both pass twine check --strict and
tools.verify_public_distribution. The release directory contains only this
verified pair. Embedded README/version metadata and approved image references
pass; source README and both project guideline files match byte for byte.
The installed wheel matches final source files, including the loading behavior,
Help page and placeholder presentation. Runtime dependencies are unchanged.

pycforge-1.3.50-py3-none-any.whl
Bytes: 2313863
SHA256: 6e5cdc983e49177a6a6465a7e47ba7af64c2e2a03a15ddf772ff381ff62ef6db

pycforge-1.3.50.tar.gz
Bytes: 10066365
SHA256: dfc4b666bfd6c24fab1906bdf281dae86a8c9173bb97063b860237029dc2ac81

