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.