# macOS comparison protocol · complete document traversal

Protocol begun 18 October 2026; release verification updated 19 October. Earlier observations retain their original scope and are not silently relabelled as release measurements.

## Release verification · 19 October 2026

Recheck all eight applications on unchanged `common-test-light.md` and `diagram-control.md`, in separate cold/warm fresh processes. Additionally compare MDVu and MacDown on the original Complete and Heavy inputs and without a document. MDVu is the public 0.5.0 Universal package from tag revision `302c509`, not an older test build. Retain version, executable/input hashes and actual window geometry. Window sizes are their retained defaults and differ between applications; do not claim identical viewports.

Replace temporal WebKit attribution with the operating system's responsible PID. Sum physical footprint for app-bundle processes, descendants and **all** system/XPC services owned by that application, including non-WebKit services. Exclude unrelated applications even if their helper started during the observation. The earlier sampler's temporal WebKit heuristic could misattribute processes and omit native services; historical RAM is superseded for comparison purposes.

Keep the first eight seconds untouched. After successful verified EOF, keep recording for ten further seconds without UI input; report the median footprint in seconds 5–10 of that interval. Retain the sampled pass peak separately. It includes traversal/Accessibility overhead and is diagnostic, not a clean startup-memory ranking. A kernel main-process lifetime maximum is labelled separately: it is not the concurrent sampled process-tree peak. Never call first-eight-second memory a fully loaded Heavy result when EOF is unconfirmed. An incomplete cold pass blocks its warm phase.

Where the real preview exposes a native scrollbar/Scroll Down action, the approved input helper uses that Accessibility scroller with viewport overlap; otherwise it uses the previously validated targeted pointer transport. PID identity is checked against the kernel executable path. Window/title/single-document checks remain mandatory. A transient empty Accessibility reply is retried without input; a wrong document or extra window invalidates the attempt. These changes concern traversal, not the untouched startup timing. Offline frame analysis runs only between measured processes.

Traversal uses fast Vision OCR with retained frames and final visual review. Retrospective EOF recovery is bounded to the last 32 frames; it must not scan the entire document again. Accurate whole-frame OCR on dense multilingual Heavy text stalled and consumed several GiB in the helper, not MDVu. In the completed MDVu cold Heavy pass, the helper was stopped while the app, compositor recording and RAM sampler continued. Two overlapping CUA scrolls completed the remaining viewport; the visible final marker and stable scrollbar at 1 independently verified EOF. That manual review is retained in the result. Its long traversal wall time is not an app-render timing; the sampled RAM peak remains diagnostic with harness overhead. Subsequent traversals bound the history to 32 frames and drain an autorelease pool for each OCR request. Fast OCR drives movement; stationary frames and bounded EOF recovery may use accurate OCR. Loaded MDVu Complete/Heavy RAM is repeated in a preselected clean series after this correction, so helper memory pressure does not define its reported loaded-RAM result. Untouched first-eight-second measurements are unchanged.

Without a document, observe seconds 30–40. MDVu's default state is a system Open dialog, while MacDown's is an empty Untitled document. Include owned file-dialog services and disclose that these are different default states.

The 19 October summary uses the explicitly selected completed verification series, without choosing observations by favourable values. One observation per cell does not establish a statistical ranking. Missing timing or an incomplete pass remains explicit. The 73-format matrix is unchanged by this size/RAM/startup recheck.

The first frames of all 32 selected Light/control startup observations were visually reviewed. MacDown cold Light and both VS Code Light EOFs were independently confirmed from final-context frames and terminal scroll state after the adapter missed OCR context; their untouched startup observations remain valid. Manual reviews are explicit in the JSON. Reader-only geometry avoids mistaking toolbar/status changes for document movement. A complete one-screen control with its final marker already visible requires no artificial scroll. Restored MarkViewer tabs and Marked update/announcement/recovery dialogs invalidate a trial; close them outside measurement and repeat. Native cleanup cancels any automatic file picker and quits normally, checking process exit through the kernel rather than a stale workspace lookup.

## Original full-traversal protocol · 18 October

## Applications and inputs

MDVu, Typora, Obsidian, MacDown 3000, MarkViewer, MD Viewer, VS Code and activated Marked 3. Typora and Marked are usable without a trial gate in this series. No additional renderer plugins or external diagram server. Obsidian uses Reading view and VS Code its built-in Markdown preview. MacDown uses its normal preview-only start preference; earlier split-view observations remain raw evidence but are not selected for its current profile because synchronized source/preview scrolling prevented a complete walk on some files; MarkViewer uses its default live preview (its read-only toggle is per-tab and does not persist across files). An HTML-source fallback describes this measured mode, not a claim that its optional read-only HTML view cannot render the file.

The five unchanged originals (`test-light.md`, `test-medium.md`, `test-complete.md`, `test-heavy.md`, `test-onescreen.md`), their five existing diagram-fence-free derivatives, `test-diagrams.md` (73 supported MDVu examples), and the unchanged two-node Mermaid control. Every trial retains source SHA-256, executable version/hash and app package size. Common-content and original-format results remain separate. The shared image/transclusion dependencies are mirrored with recorded SHA-256 hashes; intentionally missing references stay missing. Obsidian uses a benchmark-only vault with the measured primary document and these small dependencies, not the old whole test corpus. Its regenerable IndexedDB metadata is cleared in cold phases.

## One document per process

The target application must be stopped before every trial. Open exactly the measured document, with no baseline tab or unrelated document. The isolated Obsidian workspace contains one reading-mode leaf for that exact file; its open URI reuses that leaf. VS Code uses an isolated user-data profile and a benchmark-only workspace. Before each launch, its session is restored from a normal saved session containing exactly one explicitly selected built-in Markdown preview; only the target URI/title is replaced and scroll position is zero. The CLI opens that workspace directly. This prevents cached editor selection from opening source during a warm launch; no UI command is injected into the measured interval. Native applications close the measured document before quitting. Wait for loaded tab controls, recheck tab count after body readiness, and verify the named tab actually disappears before quitting; an accepted asynchronous close action alone is not completion. Window/tab checks and recorded window titles are retained. The approved native input helper verifies the bundle path, PID, document title and one-document scope before sending input. Extra document tabs/windows invalidate a trial; close them and repeat rather than subtracting their cost. Setup and cleanup take place outside the stopwatch. Request the same standard outer window frame on the same display (display origin + 30/40 logical points, display size minus 60/100 points); record actual window rectangles in each capture, including OS/application size constraints. A run used to change retained window geometry is a setup attempt and is excluded from the comparison.

## Cold and warm are distinct process starts

Cold: clear identified regenerable application HTTP, JavaScript, GPU/shader and rendered-diagram caches, recording exact directories/file counts/byte counts. Settings, activation/license data and documents remain. OS filesystem cache is not flushed and the machine is not rebooted; this is application-cache cold, not a cold-storage test.

Warm: after the cold document has been traversed, close it, quit, then relaunch the same document with the caches populated by that complete cold pass. Restore the same single-document session configuration. Do not clear caches between the paired phases. An interrupted or incomplete cold pass cannot supply a valid warm pair.

## Timing and memory

Start ScreenCaptureKit before dispatching the file. Record only target-app windows, no audio/cursor; other content is black. Use process birth / actual dispatch host time and compositor presentation timestamps to find the first readable body, including frontmatter. Initial eight seconds are recorded without accessibility polling or scroll automation. Offline Vision revision 1 analysis and visually verified frame evidence determine first paint. The reader ROI spans the full height; its left edge excludes native sidebars without clipping the first letter of a document heading. Each ROI is recorded. SVG label matching ignores arrow/punctuation attached by OCR but requires exactly the expected label words; raw A[Input] → B[Output] source retains extra words and cannot pass. Analysis uses the same rule for every application, restricted to frames before the first input intervention. Ignore frames before the target document window appears; onescreen requires its distinctive “beautifully connected” subtitle, not an application welcome logo. Preserve the previous-to-matching-frame time bracket; sparse compositor frames limit timing precision. Trial gates, raw source and errors are not successful formatted rendering.

Mermaid control requires the actual two-node SVG with both Input and Output labels. Warm SVG disk-cache hits are an intended result of repeated opening, not a measurement of engine layout throughput.

Sample summed main/helper/new-WebKit physical footprint every 200 ms throughout the trial. Telemetry is appended as JSON Lines rather than repeatedly serializing the growing full-trial array; legacy calibration arrays remain readable. Report the median during seconds 7–8 after actual dispatch, peak during the first eight seconds, and peak during full traversal separately. Shared-service attribution is approximate. A small footprint while content remains unloaded is not a successful render.

## Traverse the entire document

Earlier groups, through original medium, use accurate OCR on every viewport with a 300 ms settle. Starting with complete/heavy, movement checks use fast Vision revision 1 OCR with a 100 ms settle; initial content, loading/EOF context words, near-bottom and stationary frames receive accurate OCR confirmation. Every viewport still has a fresh saved compositor frame. Thirty-two real saved frames and synthetic loading labels at 12/14/18 pt validated this change; small text missed by fast OCR is handled by accurate stationary-frame confirmation. Once final-context evidence is seen, recognition stays accurate; stable final content can confirm a terminal viewport despite caret/scrollbar animation. The MacDown preview-only cold two-node control required a documented visual EOF review after an OCR-mode stability-counter defect; the entire graph and final marker were visible in one unchanged, non-scrollable frame. Its first-eight-second observations are unchanged. Step metadata is appended once as JSONL, with occasional full checkpoints, avoiding quadratic serialization. This affects only scripted traversal, not the untouched startup recording or its offline accurate first-paint analysis. All remaining complete/heavy passes use the same faster traversal version. MacDown’s replacement preview-only series uses it for all inputs. This changes no first-eight-second measurement; full-pass RAM and traversal are not ranked. Full-pass RAM remains a diagnostic with harness overhead.

After the untouched startup interval, the approved native helper operates the rendered preview through CoreGraphics pointer scroll events, each 85% of the observed reader viewport height. Never skip intermediate viewports to shorten a pass. Every pointer event requires the verified target PID to be foreground and the native Accessibility element-at-position hit test to belong to that PID. It targets the observed reader viewport without changing editor focus. A standard mouse-moved event precedes each wheel event so AppKit tracking areas are current; cursor warping alone is insufficient to establish mouse-enter tracking in split views. AXFocused can scroll a retained live-editor caret to EOF and is excluded from pointer traversal. Each step requests a fresh ScreenCaptureKit frame and retains Vision revision 1 OCR plus the frame. OCR uses the full-height reader region; an inset ROI that returned empty text for a visible VS Code graph was rejected during calibration. Scroll by at most one viewport with overlap; never jump straight to End. Keyboard-only calibration attempts that failed to focus the reader are excluded. Resolve the preview scroller rather than a TOC or source editor. Retain step timestamps, scroll positions, visible content evidence, loading/error observations and a final screenshot. Wait up to 90 seconds for the expected initial body. Wait up to 40 seconds for a visible pending-diagram indicator to settle, then record the timeout and continue so one failed diagram does not conceal later cases. Native scrollbar movement is authoritative where exposed; otherwise use changed OCR text and frame digest. A narrow text column must not be called stalled because a sampled margin stays white. A stalled scrollbar or blank viewport does not count as advancement.

At the bottom, verify the corresponding EOF text and a stable terminal scroll position on repeated checks. Retain verified final-context evidence across subsequent viewport frames: blank padding after the last line must not erase evidence already seen. For complete, require its unique final-sentinel paragraph before accepting the marker repeated earlier in the document. End markers: `MDVU-LIGHT-END`, Appendix G / Glossary for medium, `MDVU-COMPLETE-END`, `MDVU-TORTURE-TEST-END`, the live-source footer/footnote for onescreen, and the final D110 ArchiMate example for the catalogue. The light marker also appears near the beginning: require its final paragraph about automated smoke tests as context, together with the terminal scrollbar. For medium, require the final glossary sentence as well as the heading. Short documents require a non-scrollable preview and all expected content visible.

Report separately: reached and verified EOF; loading/error/unsupported content observed; rendered-vs-source format coverage. Reaching EOF alone never means that all 73 diagrams rendered. The supported-format catalogue is not an exhaustive catalogue of rival-specific features. In this series Typora jumped from D040 near the catalogue end in both phases; intermediate PlantUML cases are therefore corroborated by its complete AX document tree, not claimed to have appeared in every viewport. Format outcomes combine saved body frames and AX evidence; MDVu Timing D047 is visually checked because its fine labels fall below the OCR threshold.

Traversal duration is an end-to-end scripted-reading diagnostic and includes UI-automation cadence and deliberate checks. It is not ranked or advertised as pure rendering speed. First-paint timing comes from system frames and excludes automation round-trip delays. No scrolling FPS/p95 claim follows from this correctness pass.

Select the earliest valid completed cold/warm pair per application/input by observed cold start time, before examining performance values. Valid later repeats remain in raw data but are not additional comparison cells. Every attempt is retained. Invalid session/recording attempts are explicitly excluded with a reason. Missing results remain incomplete, never estimated. All reports and website changes stay local; no deployment or remote push.

## Application size

Logical bytes of regular app files plus each symlink payload, counted with lstat without following aliases. Excludes directory metadata, resource forks/xattrs, user profiles and system WebKit; allocated-file bytes are recorded separately. Universal packages on all eight apps. The size inventory records the previous counting method and its corrections, not an application optimization.

## Startup qualification versus later traversal

First-eight-second startup observations are independent of later input transport. A reviewed warm trial may retain valid first-paint and first-8-s memory when the paired cold pass completed and one-document/source/hash checks passed, even if later scroll input did not advance. Such rows carry an explicit † and unverified traversal status; the later observed memory peak is not a full-file result. No app failure or complete-read claim is inferred from an adapter limitation. Earlier invalid sessions, source/dependency failures and unreviewed failures remain excluded.
