feat: guided setup — persona re-audit fixes (grade-1 round)

- Regulated path finishes without a terminal: the signed-source
  state offers 'Add a signed source…' (stores dialog with pin-a-key)
  plus the per-module install buttons and a plain-language hint why
  pinning the publisher's key matters — instead of a hint with no
  affordance.
- Apply warnings (e.g. the empty-trusted-publishers caveat) surface
  selectable in the done state instead of being swallowed.
- Truthful preview: new lines state which machine is being set up
  (server/container targets configure THIS machine), that regulated
  profiles always get the hash-chained audit log (even with WORM
  off), and that the curated reading list is stored with the setup
  record.
- Language pass: onboarding checklist in Sie-form + 'System-KI'
  (was du-form + 'System-AI'), 'Audit-Sperre' jargon replaced,
  answers file moved to a private per-dialog temp dir.
- Screenshot harness: GUIDE_SHOTS_THEME=light for light-parity
  proof runs.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-07-13 01:20:59 +02:00
parent cf4024a4e2
commit ddac84ce8e
9 changed files with 308 additions and 33 deletions

View file

@ -72,6 +72,13 @@ Future<void> _pumpUntil(
String get _outDir =>
Platform.environment['GUIDE_SHOTS_OUT'] ?? 'build/guide-shots';
/// Guide images ship dark; GUIDE_SHOTS_THEME=light exists for the
/// light-parity proof runs (release gate: both themes must hold).
ThemeModeValue get _theme =>
Platform.environment['GUIDE_SHOTS_THEME'] == 'light'
? ThemeModeValue.light
: ThemeModeValue.dark;
/// Rasterize the app's RepaintBoundary into `<outDir>/<name>.png`.
Future<void> _shot(WidgetTester tester, String name) async {
// Two extra frames so ripples/route transitions settle visually.
@ -179,9 +186,9 @@ void main() {
await tester.pumpWidget(
RepaintBoundary(
key: _shotKey,
child: const StudioApp(
initialThemeMode: ThemeModeValue.dark,
initialLocale: Locale('de'),
child: StudioApp(
initialThemeMode: _theme,
initialLocale: const Locale('de'),
),
),
);