Files
ARCADIA-Studio/harness/release-source-alias-rename-validation-20260912.md
T

25 KiB
Raw Blame History

Text alias rename — branch validation

Codex-9e8r6t /root, Windows, 2026-09-12. This records uncommitted branch work over be7a8cd8d7d63aa18e0196bbd36f9e646764c761; it is not an integrated release or native acceptance claim. Issue 9 owns the current task. The design and transaction critique define the intended behavior and evaluators. Linux/WSL remains user-paused.

Verification method

Root coordinates one Windows compiler job. The local toolchain environment is .local/toolchain/env.ps1; CARGO_BUILD_JOBS=1. Commands use --locked --offline and the Windows GNU LLVM development profile. The attempt helper .local/source-rename-integration-20260912/gate.py preserves each attempt in an exclusive directory, including raw input ZIP, complete scoped file membership, per-file hashes, compiler/environment records, raw logs and stage receipts. It verifies the same file membership and bytes before and after each command. Its scopes include the workspace manifests, crates, build support, Cargo config, documentation, examples and harness fixtures. These private evidence directories are not yet published artifacts; preserve them until final evidence packaging.

The serial gates are strict Clippy for all desktop targets, the complete desktop binary test suite, an explicit ignored representative timing experiment and the matching desktop build. Attempts 1–5 ran tests before Clippy; attempt 6 moves Clippy first to catch lint failures before the longer suite. A failed stage stops the attempt. Native checks use a separately identified executable only after these gates pass.

Earlier findings and verified results

The isolated Document/query trial initially omitted build/windows_manifest.rs from its reconstruction and failed before tests. Its corrected v2 capture passed 8 alias-transaction, 13 existing Document and 20 query tests, finishing at 11:20:55 UTC. This establishes those isolated seams only. The combined cargo check --locked --offline -p oa-desktop --tests subsequently passed; unused preview range accessors were removed after its warning.

Attempt 1 failed compilation on two mounted-test calls that attempted mutable widget operations through as_widget(). Correcting those test calls to as_widget_mut() allowed execution. Attempt 2 passed 791 tests, failed one and ignored two. Its sole failure used an invalid property-field key, name instead of /name, so it had never created the intended dirty draft. The fixture was corrected and strengthened to assert retention of the exact /name draft value. Neither finding justified a production behavior change.

Attempt 3 passed 792 tests, zero failed, two ignored, finishing at 11:49:39.273922 UTC (165.53 seconds of test execution). Its captured inputs remained unchanged. Raw stdout SHA-256: 392379b23ca446ad1d617da25c640f2911a9ab643fd61d6b8fc15a72d346f92b; stderr: f5b640295276418cb45226fe82f3dfdfe5f7ee018c1777516784f80d562620a3. The subsequent strict Clippy stage stopped on five diagnostics: a collapsible search conditional, two constant platform/profile assertions in the timing experiment, a test-case type-complexity diagnostic and field reassignment after Default in a query test. The correction uses a let-chain, scopes the manual timing module to Windows debug tests, names the case type and initializes the query limit directly. The platform-specific experiment does not prevent other platforms or release profiles from compiling their applicable tests.

No timing or desktop-build stage ran in attempts 1–3. Passing attempt 3 does not cover the subsequent paste guard described below.

Attempt 4 passed 792 tests, failed the newly added normal-paste assertion and ignored two, finishing at 12:03:16.113761 UTC (167.39 seconds of test execution). The rejection cases reached their expected outcomes before the normal-paste case failed. The attempt's captured inputs remained unchanged; no subsequent gate ran. Its stdout SHA-256 is 62cc9471678fabe08fc32db0e46665f1b9babd1d70f814371995c96a6b5de430. Root and the implementation owner independently traced the failure to the test fixture: Iced calls the test operation's selection callback before its focus callback, and focus() moves the cursor to the end. Thus the fixture erased its own selection before pasting. The correction must focus and select separately, assert a real nonempty selection and retain the exact replacement oracle. This is an evaluator defect, not a reason to change valid-paste production behavior.

Clipboard finding and correction

Root inspected the actual dependency source, Iced iced_widget 0.14.2 src/text_input.rs, whose paste path filters char::is_control before invoking either input callback. Consequently, a pasted foo\nbar could silently become the valid alias foobar. Merely validating the callback value or adding an on_paste callback would miss the original input. This contradicted the design's prohibition on silent replacement normalization.

The alias field now has a narrow widget adapter that checks the actual paste shortcut before the child input handles it. It rejects the whole paste if it contains control characters, retaining field text and selection, displaying feedback and invalidating the previous preview approval and pending intent. An occupied worker remains occupied until its matching completion. Permitted first-paste input uses one captured clipboard value passed to the child; normal Iced editing, focus and key-repeat behavior remain with the child widget. No dependency, vendor or cached Iced source was changed.

Mounted evaluator cases cover newline, tab, CRLF and NUL refusal; unchanged selection through feedback/rebuild; normal valid paste; exactly one actual clipboard read; and refusal of an old confirmation. Independent review checks the wrapper against the cached Iced implementation, with particular attention to stored modifiers, focus, pending workers and repeated paste.

That review found another production counterexample: the wrapper initially reset its modifier state on KeyPressed.key == Escape, whereas the child uses its effective dispatch, including modified_key and earlier shortcut returns. For key=Escape, modified_key=Home, the wrapper could clear Command while the child retained it, allowing a following paste to bypass rejection. The correction observes the child's actual focused-to-unfocused transition after forwarding a key press instead of guessing its dispatch. Mounted tests must exercise mismatched key fields, pending worker retention and the relevant focus/enabled/modifier conditions. Held-key paste may reuse the child's earlier admitted cache; the single-read claim applies to fresh clipboard reads.

The final bounded static review found no remaining concrete paste defect and bound the corrected adapter, wrapper tests and controller tests to exact hashes in .local/source-rename-controller-independent-review-20260912/paste-resolution-bindings.json. The focused source_rename:: run then passed 32 tests, zero failed, one ignored, finishing at 12:08:16.497392 UTC (3.20 seconds of test execution). This includes the actual-selection correction, valid paste, the 20-condition focus/enabled/modifier matrix, divergent key fields, held-key cache release and pending-worker rejection. Raw logs and the command receipt are retained under .local/source-rename-integration-20260912/focused-paste-v2.

Remaining acceptance

Attempt 5 passed the full desktop suite: 796 passed, zero failed, two ignored, finishing at 12:11:20.769886 UTC (147.44 seconds of execution). Inputs remained unchanged. Stdout SHA-256: 38e9413b678de73fdc1e277be5313193002c81326f32e29bafdd4e45701fe322; stderr: 43c2d65557dd4392177fcb91e097ca375acfc796928e92a51b129c69892fb66d. Its Clippy stage subsequently found a preview helper used only by tests and an obsolete expect(dead_code) on the now-used authored identity accessor. The helper is now test-only and the obsolete expectation removed. Attempt 5 stopped at 12:12:23.924779 UTC without timing/build execution; its Clippy stderr SHA-256 is 87a4858cf1d4116b1938268db07095c17b301e64a1e115f42a4020da633ea58f. Before attempt 6 the edited guide and generated HTML were aligned to the repository's LF policy; no frozen evidence or fixture bytes were normalized. Attempt 6 captures these final inputs, with lint first. The native launch helper checks this same required gate order; its behavior otherwise remains the independently reviewed launch protocol.

Attempt 6 passed strict all-target Clippy at 12:14:39.585030 UTC, then the full suite (796 passed, zero failed, two ignored) at 12:18:12.718483 UTC (172.07 seconds of test execution). The explicit timing experiment also passed its complete-model/source/identity/history assertions at 12:18:36.171758 UTC. All three stages verified unchanged captured inputs. The desktop build also passed at 12:21:39.274814 UTC. Its preserved executable is 113,854,464 bytes, SHA-256 d1ec63050e95513064155e9d04f443d95667b1e468dcdbb3b810dad379504814. The 513-file raw input ZIP SHA-256 is 03b5a9e3f4e9e220421320c09f1ecf46f811edf2e3c6c45dcd9522c6d78b8255. All four gates verified unchanged captured membership and bytes.

For the 30-file, 78,414-byte, 258-identity walkthrough, five measured Windows debug trials after one warmup reported these median/range values in milliseconds:

Phase Median Min–max
Mint Document request 0.092 0.052–0.170
Worker Document preparation 282.259 165.302–298.259
Worker preview and origin 13.429 10.763–23.969
Guarded Document commit 0.0109 0.0082–0.0229
Application synchronization 495.499 472.030–610.017
Actual Confirm update 571.893 433.909–1122.241

The phases and full Confirm use separate fresh fixtures with alternating trial order; their values must not be added or subtracted as simultaneous timings. Task polling, layout, GPU work and first paint are excluded. Fast snapshot adoption does not establish a responsive UI: application refresh still takes roughly half a second in these samples. Native assessment and a discriminating refresh-phase diagnosis are needed before making a responsiveness claim. The timing log SHA-256 is a063b67755b972e7f0b6a42c4af7fb9e1a41ecbda9775e1f40b031b8dd0c9a5c.

Native fixtures in .local/source-rename-native-20260912 preserve independent baseline/work/expected trees for a four-source project and the 30-source engineering walkthrough. Their expected edits were authored by literal role-specific replacements, preserving every physical supporting file. Preparation-only oracle passes do not establish future GUI correctness.

Native acceptance must inspect complete preview access, focus and bounded layout, cancellation, confirmation, model Undo/Redo, Save and reopen, comparing the full saved Project, identities and source bytes against the authored oracle. The reviewed launch helper preserves the identified executable and runtime, uses a private profile and retains the child process handle until exit to record the actual exit code and final logs.

First native transaction trial and blocking findings

The identified attempt-6 executable ran in a private profile as PID 9108 from 12:22:14 UTC, with actual process exit zero recorded at 12:45:42.336483 UTC. Both logs were empty; the executable and runtime DLL remained unchanged. The private profile initially lacked a Desktop directory, causing a file-picker notice. Creating that private directory resolved the harness setup issue.

The four-source Unicode-path project exercised F2 on the typed reference, invalid alias feedback, Enter to preview, Enter again without confirmation, both changed-file previews, minimum 1100×700 client layout, Escape cancellation, explicit confirmation, Save, persistent model Undo/Save, Redo/Save and reopen. The new alias was selected at the original typed reference after confirmation; the same spelling in prose remained unchanged. Reopen showed the expected assess_damage alias. Five independent saved-disk oracle runs passed: cancelled baseline, renamed save, undone save, redone save and reopened result. Each compared the complete Project, identities and all four exact physical files. The representative 30-source native workflow and immediate Undo Rename button were not exercised in this trial.

Native preview acceptance failed: screenshot trial-attempt-6/screenshots/032-simple-preview-minimum-bottom-0.jpg shows the final brace of the longer After declaration occluded by the vertical scrollbar. Independent image/source review confirmed default Shrink width and a floating scrollbar, plus inadequate wrapping for unbroken fragments. Byte-complete preview indexes and rectangle-only layout checks did not catch this defect. The correction must reserve scrollbar space, wrap unbroken fragments, and add actual shaped-glyph/paint visibility checks before a new native trial.

Publication also needs byte-reproducible source. The provenance review verified all 513 captured files but identified 13 Git-clean baseline files whose live CRLF bytes differ from the LF bytes in HEAD. These are strict newline-only differences, distinct from intentional alias changes. After closing the native trial, root verified each current hash, Git-clean status and strict newline-only equivalence, then aligned exactly those 13 ordinary files with their HEAD LF bytes. The receipt is aligned-reviewed-lf.json in the integration evidence directory. New checks/builds use new captures; attempt-6 and all earlier raw archives remain unchanged and bound to their original bytes.

The new real-paragraph visibility evaluator compiled against the old layout and failed as intended at 12:57:38.285740 UTC. It identified the exact native declaration's final brace (UTF-8 cluster 92–93) at x591.398 with width6.598, crossing the actual scrollbar boundary x587.996. Captured inputs remained unchanged. This is a demonstrated regression falsifier, not a passing gate. Receipt/logs: clipping-negative-1 in the integration evidence directory; stderr SHA-256 2ac214f31252edeef4f33b64a46b11fb42dbf0c04848d38bb8730978d9d5ce10. The reviewed correction fills the preview width, reserves the scrollbar's actual width plus spacing, and uses glyph-fallback wrapping. It leaves source indexing and the transaction unchanged. A positive check is separate.

The corrected layout then passed all 33 focused rename tests, zero failed, one ignored, at 13:05:52.950223 UTC (11.89 seconds of test execution). That capture included disabled-by-default temporary timing instrumentation; the geometry and transaction tests did not enable it. Inputs remained unchanged. Stdout SHA-256 307bd915536983fc19102fcff39535df950cee06841d968f5be2092c091ccc76.

The independently reviewed nested diagnostic subsequently passed the existing full Project/source/identity/history/origin assertions in all warmup and measured trials, finishing at 13:07:20.854282 UTC. It measured the same real Confirm message path, with fixed-capacity timestamps enabled only around direct sync or Confirm. In the whole-Confirm arm, five measured samples gave these medians: actual update 1039.0 ms, source Content assignment 996.7 ms (814.4–1182.2), validation 26.4 ms, property refresh 6.3 ms, and Workspace acceptance 0.28 ms. Each nested phase belongs to that same arm; earlier runs have different absolute timings and are not a paired performance comparison. Source Content assignment includes construction and destruction of the previous editor. Layout, highlighting during draw and native paint remain excluded. The raw log SHA-256 is a98877362ca52a024942803e0ab698a1fd84703d4512fcf7137c147a28817039. The temporary instrumentation was removed afterwards, restoring both exact production baselines before implementing any candidate.

This evidence justifies a bounded display-refresh experiment: retain the laid-out editor and apply complete, preflighted same-line changes only after the existing Document commit succeeds. Every ordinary synchronization step remains shared; incompatible line endings, stale display bytes or a failed exact final readback fall back to reconstruction from accepted source. A review found that deleting an entire line body could introduce a greedy LFCR boundary; both before and after preflight now refuse that representation. The candidate resets highlighting from line zero without changing text, and restores the same approved origin. It passed cargo check --locked --offline -p oa-desktop --tests at 13:25:02.235871 UTC, with unchanged captured inputs. Execution, first subsequent layout/highlighting cost, native behavior and final gates remain separate acceptance requirements.

The user's new Text UX issue 13 also rules out adding permanent command clutter. The new separate Undo Rename row has been removed; the existing model Undo control uses the guarded rename action while it remains available. Broader compact-editor work is owned in that issue and is not claimed complete by this local adjustment.

The completed native trial is preserved in the attempt-6 evidence archive, with archive receipt and independent verification. Its 284 members occupy 3,221,627 compressed bytes; SHA-256 77adda5a33eb1def6dab23352ca0ab172300ea65fc21d2c215d545d7fcce0d08. The archive retains all original captures, complete fixture trees, five saved verification receipts, helper sources and clean-exit logs; executable/DLL bytes are externally hash-bound. The gate inputs and provenance evidence are preserved separately below. This archive describes the first trial only; later corrections and execution do not turn its clipping failure into a passing native result.

Corrected editor refresh execution

The next-layout evaluator initially failed to compile because its new focus call lacked Iced's Focusable trait import. The failed editor-patch-tests-1 capture is preserved unchanged; no runtime result is claimed for it. After adding that test-only import, editor-patch-tests-2 passed 38 focused tests, zero failed, two ignored, at 13:51:44.023824 UTC. This includes exact editor text and line endings, the LFCR refusal, retained-tree highlighter reset, real Confirm/history checks and normal synchronization fallback. All captured inputs stayed unchanged. Stdout SHA-256: a25dd49c669c09936d1da7ddeba4f7d3d6b6a918b72cd39dde4df6f75d201344.

On the same source, editor-patch-timing-1 passed both ignored experiments at 13:54:04.503303 UTC. The real App Confirm update had median 46.0 ms (23.0–206.1 ms, five measured samples); ordinary app_sync deliberately retains the reconstruction path and is not the same operation. The paired editor trial used one warmup and five alternating fresh trials per arm, the 29,506-byte traceability source, a retained widget tree, a 640×350 viewport, 14px monospace font and 16px padding. Replacement plus next layout plus draw/highlighting had median 35.5 ms with reuse (13.6–73.4), versus 2782.7 ms with reconstruction (2697.7–3994.6). Exact source/line-ending/cursor checks and accepted alias attributes, shaped glyph colors and visible glyph bounds passed after every arm. This measures real text layout and highlighting, but excludes GPU/native paint and is not an end-to-end production latency guarantee. Source inputs stayed unchanged; stdout SHA-256: ae8d57e0d65084d71d92815c093607c7cd4d9d9166c562cec33a061b2fcba74c.

Independent static review of the App seam found no actionable defect: commit authority, ordinary synchronization order, fallback, metadata, histories and guarded reveal remain intact. Native focus/reveal, the next text edit, corrected preview rendering and full gates still require their own evidence.

The earlier completed gates and experiments are preserved separately in the historical evidence archive with its independent review. All 77 members, five nested source archives, eight receipt/log pairs and 73 original readbacks passed verification. ZIP SHA-256: 2282e4e755bb03ab3ecb079391909f3978297ad307e76306ef7eb5a87a9437cf. That archive intentionally ends at the earlier check-only candidate; the newer focused execution and timing captures are separate.

Full corrected Windows gates

Attempt 7 completed unchanged at 14:15:41.805763 UTC: strict desktop Clippy with all targets and -D warnings, 802 desktop tests passed (zero failed, three ignored), the required isolated Confirm experiment passed, and the GUI build passed. The repeated Confirm median was 71.9 ms (43.2–101.8); the separate paired layout experiment above remains the rendering-cost evidence. Formatting of all changed/new Rust files passed with rustfmt --edition 2024 --check --config skip_children=true; git diff --check also passed.

The identified GUI is 113,879,552 bytes, SHA-256 2486eecc00d8de9160ecd930f69394e00b1a1ce102d76fb776b978db33414ed3, built with the Windows GNU LLVM development profile, no optimization/debuginfo, and debug assertions enabled. All 516 captured input files match the preceding focused test and paired timing inputs byte for byte.

Corrected refresh evidence preserves those three complete captures, receipts, raw logs and independent App and execution reviews. Its independent archive review verified all 37 members, three nested source snapshots, six command receipts and original bindings. ZIP SHA-256: d46aacbba1dfccec64b195482e2857c97ceefecad6b0176c62c73c50964e18ba. This is a source-verification checkpoint, not a released or fully native-accepted milestone. The corrected native trial is separate and must retain its actual workflow coverage and limitations.

Closed native trial on dfb6102

The corrected trial used the identified GUI above and source commit dfb6102ba5aec9e26a48cc5472b51a4b349459fd. Its original 516 build inputs were verified against the raw committed blobs. The native process closed normally with exit code 0 at 22:20:26.337292 UTC; stdout and stderr were empty, and the executable and runtime DLL remained unchanged. The long interruption between the afternoon and evening captures is not a responsiveness measurement.

Both the four-file Unicode fixture and the representative 30-source fixture passed explicit rename, restoration of the selected original reference, the first subsequent text edit, Text Undo, Save, whole-model Undo/Redo and native reopen. Eight saved-state checks passed complete model, identity and reachable source equality plus every physical file: four in the small fixture and 37 in the representative fixture, including support files. Confirm alone left the saved baseline unchanged. These oracles inspect saved disk state; they do not independently inspect unsaved GUI memory.

At the minimum 1100-by-700 client size, the previously clipped declaration brace and all six changed lines in the larger fixture were readable. Native multiline paste after a valid preview explicitly rejected the whole paste, retained the alias, removed the preview and disabled confirmation. Re-entering a valid alias required fresh Preview. This caret-only trial does not prove selection-range preservation during rejection; the separately executed mounted tests cover it.

Two recoverable usability findings remain separate from transaction correctness: preview page/file changes retain the previous vertical scroll position, and an OS system-menu sizing sequence invalidated an apparently valid alias field. The latter's exact input bytes and event cause remain unproven. No accidental confirmation or model/source corruption was observed. A subsequent scroll correction requires its own source-bound tests and native evidence; this trial does not verify later code.

The closed native archive and independent review preserve and verify all 355 members, 351 original readbacks, eight oracle receipts, the final 41 physical files and 516 raw committed build inputs. ZIP SHA-256: abff68aeb2bd893577d4226c9ec4b6b0823b4ec22895a273ab2d22f344354207; size 6,449,971 bytes. Screenshot 023's unrelated occluding window image is excluded; its hash and exclusion reason are retained. This remains a prerelease preparation checkpoint, not full OA/SA acceptance. Linux verification remains paused by the user.