app

Local-first trade for farms and co-ops
git clone https://radroots.dev/git/app.git
Log | Files | Refs | README | LICENSE

commit fee6dce0c8a11b71b86f4c4cae7120031271724f
parent 53c8d7f48977e2317d15c02957f23402ed121f75
Author: triesap <tyson@radroots.org>
Date:   Thu, 13 Aug 2026 05:22:18 +0000

ui: clarify import secret custody

- describe temporary import custody truthfully
- retain masked bounded and redacted draft behavior
- lock the approved two-paragraph copy in Compose
- prove the retired nonretention claim is absent

Diffstat:
Mapp/shared/src/commonMain/kotlin/org/harvestcircle/ui/shell/BootstrapIdentityEntry.kt | 5++++-
Mapp/shared/src/desktopTest/kotlin/org/harvestcircle/ui/shell/BootstrapIdentityEntryTest.kt | 24++++++++++++++++++++++++
2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/app/shared/src/commonMain/kotlin/org/harvestcircle/ui/shell/BootstrapIdentityEntry.kt b/app/shared/src/commonMain/kotlin/org/harvestcircle/ui/shell/BootstrapIdentityEntry.kt @@ -95,7 +95,10 @@ private fun ImportIdentityBody( }.testTag("import-nsec-input"), visualTransformation = PasswordVisualTransformation(), ) - ShellText("The secret is sent directly to the local native runtime and is not retained in the interface.") + ShellText( + "The secret is held only for this import.\n\n" + + "It is cleared after it is sent to the local native runtime.", + ) model.importGuidance?.let { ShellText(it, Modifier.testTag("identity-entry-guidance")) } model.problem?.let { ShellText(it, Modifier.testTag("identity-entry-problem")) } } diff --git a/app/shared/src/desktopTest/kotlin/org/harvestcircle/ui/shell/BootstrapIdentityEntryTest.kt b/app/shared/src/desktopTest/kotlin/org/harvestcircle/ui/shell/BootstrapIdentityEntryTest.kt @@ -6,6 +6,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsFocused import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performTextInput import androidx.compose.ui.test.v2.runComposeUiTest @@ -57,6 +58,29 @@ class BootstrapIdentityEntryTest { onNodeWithTag("generate-key").performClick() assertEquals(1, generate) } + + @Test + fun hcEx004ImportScreenExplainsTemporaryCustodyTruthfully() = + runComposeUiTest { + setContent { + BootstrapIdentityEntry( + BootstrapStep.ImportIdentity, + model = model(), + actions = HarvestCircleUiActions(), + onBack = {}, + ) + } + + onNodeWithText( + "The secret is held only for this import.\n\n" + + "It is cleared after it is sent to the local native runtime.", + ).assertExists() + onNodeWithText( + "The secret is sent directly to the local native runtime " + + "and is not retained in the interface.", + ).assertDoesNotExist() + onNodeWithTag("import-nsec-input").assertIsFocused() + } } private fun model(importDraft: String = "") =