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:
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 = "") =