Files

4.1 KiB

Milestone 22 evidence — coordinated draft editing

Run: 2026-10-29T23:14:00+02:00. Base commit: 2766c62 (clean at start). The integrated dirty source inputs are src/app.rs, new src/app/draft.rs, src/domain.rs, and docs/PROJECT_LAYOUT.md. PLANS.md and this report are coordinator records. Reproduce source identity with sha256sum:

Input SHA-256
src/app.rs a2ae18af4a5755397d86f36da3938baba01bc434da1b024aad64720267cebb7d
src/app/draft.rs 4b4c7b4ef9f8d673dad44d017badad8edbe1c73c19a74c1454008229e8fb1cbc
src/domain.rs 47740c902eee54053c1a4e46c7dacaf18204dc6366cb32d1189d6a04b293a516
docs/PROJECT_LAYOUT.md 500fd91848e5896153fa39a330131103a50a2f442e58ecfd6ad2bafc6ba9ba07
target/release/wireguard-admin 1b955bc2858924811043f48a66bfc7e2180ff0ecbc6d93b8b0339b791a9646e5

The native host toolchain was rustc/Cargo 1.97.1, rustfmt 1.9.0 and Clippy 0.1.97. Cargo.toml, Cargo.lock, persistence and archive code have no diff.

Implementation and independent review

M22.1 added private DraftChanges to own the lossless document, narrower client states with pending address reservations, and encrypted vault draft. Its explicit staged replacement publishes selected prepared components without saved-file or runtime effects. M22.2 moved create/add/rename/delete, discard, initial vault setup and selected-file import through that boundary. Fallible document parsing/projection, state insertion, vault serialization/encryption/import and saved-state reading finish before publication. Vault copies are made through encrypted TOML only when a vault-changing operation needs one; document-only edits keep the current vault. A new client's session-first-delivery material is registered after successful draft publication.

The unrestricted ClientStates::draft_mut and test-only public Application::vault_draft_mut methods were removed after caller audit. Application facade entry points remain. Three behavioral app tests cover a late missing-vault creation failure, selected import failure, and discard parse failure without partial draft or issue-state mutation. Layout documentation now names the actual draft module and existing integration targets.

Fresh GPT-6-Luna/high reviewer /root/m22_review, separate from the implementer, inspected the base-to-current diff and relevant startup, TUI, integration and container-driver callers. The reviewer found no actionable issue. Review covered authority, secret lifetime, all publication callers, unsupported peers, source-file preservation, public API, fixture restart scope and unchanged formats/dependencies. No repair cycle was needed.

Validation on integrated source

Exact command Result
cargo fmt --all -- --check exit 0
cargo clippy --locked --all-targets -- -D warnings exit 0
cargo test --locked exit 0; 401 passed, 3 ignored opt-in Alpine tests, 0 failed, including 2 doctests
cargo build --locked --release exit 0
git diff --check exit 0

The implementer and reviewer also ran the required focused suites: cargo test --locked app:: (64), cargo test --locked --test config_preservation (10), cargo test --locked --test client_delivery (5), cargo test --locked --test vault_import (5), and cargo test --locked --test tui_workflow (8), all passed. The implementer additionally ran cargo test --locked domain:: (15), passed. The final full test command supersedes the focused runs as integrated host evidence.

Acceptance scope

M22-A1 is supported by staged publication and failure tests. M22-A2 is supported by byte-preserving document and import tests plus source review. M22-A3 is supported by synthetic app/TUI creation, Commit, first delivery, explicit fixture restart, deletion and discard coverage; draft and Commit flows make no live runtime call. M22-A4 is supported by the independent review and completion gates. This is host/synthetic evidence. The opt-in Alpine driver and disposable systemd VM were not run for M22; no real systemd, live VPN, production or IPv6 integration result is claimed. The M23 unprojectable-peer restore reservation gap remains assigned to M23 and is not claimed resolved here.