Provide native create/edit/generate workflows over storage-owned structured documents.
Scope
Add iPhone forms to create an entry, edit dynamic fields and multiline notes, reorder/add/remove fields, and request generated or replacement passwords.
Keep passwords hidden by default with explicit reveal and generation choices supplied/validated by crates/storage.
Save only through storage commands; serialization, encryption, recipients, password policy, filesystem mutation, and commits remain in Rust.
Track transient dirty form state and confirm before Cancel, back navigation, tab replacement, lock, or another operation would discard changes.
On failed save or stale/conflicting storage state, retain the form and present an explicit recovery choice rather than overwriting.
Dynamic entries round-trip without dropping unknown or repeated fields.
Create, edit, generate, save, cancel, failed save, conflict, and lock-during-edit paths are covered.
Unsaved changes cannot be lost through ordinary navigation without confirmation.
Swift does not generate passwords, choose recipients, serialize entries, or mutate the repository.
## Goal
Provide native create/edit/generate workflows over storage-owned structured documents.
## Scope
- Add iPhone forms to create an entry, edit dynamic fields and multiline notes, reorder/add/remove fields, and request generated or replacement passwords.
- Keep passwords hidden by default with explicit reveal and generation choices supplied/validated by `crates/storage`.
- Save only through storage commands; serialization, encryption, recipients, password policy, filesystem mutation, and commits remain in Rust.
- Track transient dirty form state and confirm before Cancel, back navigation, tab replacement, lock, or another operation would discard changes.
- On failed save or stale/conflicting storage state, retain the form and present an explicit recovery choice rather than overwriting.
- Integrate native keyboard behavior, validation presentation, accessibility, and secure text-entry controls.
## Acceptance criteria
- Dynamic entries round-trip without dropping unknown or repeated fields.
- Create, edit, generate, save, cancel, failed save, conflict, and lock-during-edit paths are covered.
- Unsaved changes cannot be lost through ordinary navigation without confirmation.
- Swift does not generate passwords, choose recipients, serialize entries, or mutate the repository.
hugo
added this to the 04 - iPhone and Apple Watch apps milestone 2026-08-09 20:00:31 +00:00
The iPhone app now creates and edits complete storage-owned EntryDocument drafts. Rust owns field identity/order, dynamic and multiline serialization, password generation and validation, recipient resolution, encryption, atomic stale-write detection, automatic Git commits, and recoverable save state. The native UIKit form uses secure text entry with explicit reveal, native delete/reorder controls, add-field and storage-backed generation actions, dirty-form discard confirmation, and explicit conflict recovery without overwriting the draft. Unknown non-UTF-8 values and repeated fields are preserved losslessly.
simulator visual/accessibility inspection of the aligned create control and native creation prompt
signed, optimized Release-iphoneos build using the existing app icon and team provisioning
The Rust regression test covers dynamic/repeated fields, long multiline comments, add/remove/reorder, generated replacement passwords, cancellation without mutation, stale-write rejection, failure retention, and non-UTF-8 preservation using local compatibility fixtures only (no live server).
Deferred under the untested label because no unlock/user interaction is available:
authenticated simulator create/edit/generate/save using populated long, multiline, password, and OTP fields
secure reveal, keyboards, validation alerts, dirty Cancel/pull-down, and lock/expiry-during-edit interaction
visible save-failure and stale-conflict recovery choices in the authenticated form
VoiceOver and large Dynamic Type inspection of a populated editor
physical iPhone Release install/launch and interaction; the signed Release build succeeded, but CoreDevice could not currently locate the paired phone
UIKit choices follow Apple guidance for text fields/text views, alerts/action sheets, adaptive dismissal, and native table editing/reordering:
Implemented in `ae64ce4` and pushed to `main`.
The iPhone app now creates and edits complete storage-owned `EntryDocument` drafts. Rust owns field identity/order, dynamic and multiline serialization, password generation and validation, recipient resolution, encryption, atomic stale-write detection, automatic Git commits, and recoverable save state. The native UIKit form uses secure text entry with explicit reveal, native delete/reorder controls, add-field and storage-backed generation actions, dirty-form discard confirmation, and explicit conflict recovery without overwriting the draft. Unknown non-UTF-8 values and repeated fields are preserved losslessly.
Verified:
- `cargo fmt --all -- --check`
- `RUSTFLAGS="-D warnings" cargo check --workspace --all-targets`
- `cargo clippy --workspace --all-targets -- -D warnings`
- `cargo test --workspace`
- `xcodegen generate`
- iPhone 17 Pro simulator Debug build
- Xcode Analyze for the simulator target
- simulator visual/accessibility inspection of the aligned create control and native creation prompt
- signed, optimized `Release-iphoneos` build using the existing app icon and team provisioning
The Rust regression test covers dynamic/repeated fields, long multiline comments, add/remove/reorder, generated replacement passwords, cancellation without mutation, stale-write rejection, failure retention, and non-UTF-8 preservation using local compatibility fixtures only (no live server).
Deferred under the `untested` label because no unlock/user interaction is available:
- authenticated simulator create/edit/generate/save using populated long, multiline, password, and OTP fields
- secure reveal, keyboards, validation alerts, dirty Cancel/pull-down, and lock/expiry-during-edit interaction
- visible save-failure and stale-conflict recovery choices in the authenticated form
- VoiceOver and large Dynamic Type inspection of a populated editor
- physical iPhone Release install/launch and interaction; the signed Release build succeeded, but CoreDevice could not currently locate the paired phone
UIKit choices follow Apple guidance for text fields/text views, alerts/action sheets, adaptive dismissal, and native table editing/reordering:
- https://developer.apple.com/design/human-interface-guidelines/text-fields
- https://developer.apple.com/design/human-interface-guidelines/alerts
- https://developer.apple.com/documentation/uikit/uiadaptivepresentationcontrollerdelegate/presentationcontrollershoulddismiss%28_%3A%29
- https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/TableView_iPhone/ManageReorderRow/ManageReorderRow.html
Non-destructive validation completed on 2026-08-12. In the iPhone simulator, the create editor opened with its dynamic entry fields; a disposable dirty draft was canceled and no entry was saved. Existing edit, ordering, generation, cancellation, and conflict-retention behavior also passed in the current isolated Rust workspace tests. No password-store mutation was retained. Removing the untested label.
Non-destructive validation completed on 2026-08-12. In the iPhone simulator, the create editor opened with its dynamic entry fields; a disposable dirty draft was canceled and no entry was saved. Existing edit, ordering, generation, cancellation, and conflict-retention behavior also passed in the current isolated Rust workspace tests. No password-store mutation was retained. Removing the untested label.
hugo
removed the untested label 2026-08-12 17:32:38 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Goal
Provide native create/edit/generate workflows over storage-owned structured documents.
Scope
crates/storage.Acceptance criteria
Implemented in
ae64ce4and pushed tomain.The iPhone app now creates and edits complete storage-owned
EntryDocumentdrafts. Rust owns field identity/order, dynamic and multiline serialization, password generation and validation, recipient resolution, encryption, atomic stale-write detection, automatic Git commits, and recoverable save state. The native UIKit form uses secure text entry with explicit reveal, native delete/reorder controls, add-field and storage-backed generation actions, dirty-form discard confirmation, and explicit conflict recovery without overwriting the draft. Unknown non-UTF-8 values and repeated fields are preserved losslessly.Verified:
cargo fmt --all -- --checkRUSTFLAGS="-D warnings" cargo check --workspace --all-targetscargo clippy --workspace --all-targets -- -D warningscargo test --workspacexcodegen generateRelease-iphoneosbuild using the existing app icon and team provisioningThe Rust regression test covers dynamic/repeated fields, long multiline comments, add/remove/reorder, generated replacement passwords, cancellation without mutation, stale-write rejection, failure retention, and non-UTF-8 preservation using local compatibility fixtures only (no live server).
Deferred under the
untestedlabel because no unlock/user interaction is available:UIKit choices follow Apple guidance for text fields/text views, alerts/action sheets, adaptive dismissal, and native table editing/reordering:
Non-destructive validation completed on 2026-08-12. In the iPhone simulator, the create editor opened with its dynamic entry fields; a disposable dirty draft was canceled and no entry was saved. Existing edit, ordering, generation, cancellation, and conflict-retention behavior also passed in the current isolated Rust workspace tests. No password-store mutation was retained. Removing the untested label.