From dd0737b8b1324ebf7c09d5f23d7d241019834ec2 Mon Sep 17 00:00:00 2001 From: flemming-it Date: Sat, 18 Jul 2026 00:00:17 +0200 Subject: [PATCH 1/3] chore: complete the flow editor 0.24.0 pin (lockfile) Signed-off-by: flemming-it --- pubspec.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.lock b/pubspec.lock index d9b5bd8..6564c81 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -46,7 +46,7 @@ packages: path: "../fai_chain_studio_flow_editor" relative: true source: path - version: "0.23.0" + version: "0.24.0" characters: dependency: transitive description: From 79e08c8d177414f50239802d222051fc9a26089f Mon Sep 17 00:00:00 2001 From: flemming-it Date: Sat, 18 Jul 2026 00:00:17 +0200 Subject: [PATCH 2/3] test(shots): seed demo flows so the flows page proves module logic both ways hello.yaml needs debug.echo (not installed on the fixture hub) and must carry the missing-module note; genehmigung-demo.yaml only uses the hub builtin system.approval and must show a plain play button. Signed-off-by: flemming-it --- integration_test/guide_shots_test.dart | 36 ++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/integration_test/guide_shots_test.dart b/integration_test/guide_shots_test.dart index 77c88fe..f1c7dc7 100644 --- a/integration_test/guide_shots_test.dart +++ b/integration_test/guide_shots_test.dart @@ -187,6 +187,42 @@ void main() { ]); } + // Seed two demo flows so the Flows page shows the real list + // instead of its empty state (and proves the missing-module + // logic both ways): hello needs debug.echo — not installed on + // the fixture hub, so it must carry the "1 module missing" + // note; the approval flow only uses the hub builtin + // system.approval and must show a plain play button. + final flowsDir = Directory( + '${Platform.environment['HOME']}/.chain/data/flows', + )..createSync(recursive: true); + File('${flowsDir.path}/hello.yaml').writeAsStringSync( + '# F∆I sample flow\n' + 'inputs:\n' + ' name:\n' + ' type: string\n' + 'steps:\n' + ' - id: echo\n' + ' use: debug.echo@^0\n' + ' with:\n' + ' text: "Hello, {{ inputs.name }}!"\n' + 'outputs:\n' + ' greeting: "{{ steps.echo.text }}"\n', + ); + File('${flowsDir.path}/genehmigung-demo.yaml').writeAsStringSync( + '# F∆I sample flow\n' + 'inputs:\n' + ' antrag:\n' + ' type: string\n' + 'steps:\n' + ' - id: freigabe\n' + ' use: system.approval@^0\n' + ' with:\n' + ' show: "{{ inputs.antrag }}"\n' + 'outputs:\n' + ' entscheidung: "{{ steps.freigabe.decision }}"\n', + ); + // Hermetic prefs: never read or write the operator's real ones. SharedPreferences.setMockInitialValues({}); From dfc24d3c58e2dbd009dff4fb2dd2ae9a96be1131 Mon Sep 17 00:00:00 2001 From: flemming-it Date: Sat, 18 Jul 2026 00:00:17 +0200 Subject: [PATCH 3/3] fix(l10n): plain approvals hint, real plurals, de-jargoned chain pill - approvals inbox hint explains human approval in plain words instead of citing system.approval@^0 - doctor summary counts use ICU plurals (1 module / n modules) - audit chain pill says 'Integrity chain verified' instead of 'v1' Signed-off-by: flemming-it --- lib/l10n/app_de.arb | 8 ++++---- lib/l10n/app_en.arb | 8 ++++---- lib/l10n/app_localizations.dart | 8 ++++---- lib/l10n/app_localizations_de.dart | 26 ++++++++++++++++++++++---- lib/l10n/app_localizations_en.dart | 26 ++++++++++++++++++++++---- 5 files changed, 56 insertions(+), 20 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 2627f1d..6a38afa 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1067,7 +1067,7 @@ "approvalsTabPending": "Offen", "approvalsTabHistory": "Verlauf", "approvalsInboxZero": "Posteingang leer", - "approvalsInboxHint": "Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.", + "approvalsInboxHint": "Alles erledigt. Wenn ein Flow eine menschliche Freigabe verlangt, erscheint die Anfrage automatisch hier.", "approvalsReloadTooltip": "Aktualisieren", "approvalsPillPending": "offen", "approvalsPillApproved": "freigegeben", @@ -1149,7 +1149,7 @@ "doctorSummaryApprovals": "Freigaben", "doctorSummaryAudit": "Protokoll", "doctorSummaryServices": "Dienste", - "doctorSummaryCapabilities": "{n} Fähigkeiten", + "doctorSummaryCapabilities": "{n, plural, =1{1 Fähigkeit} other{{n} Fähigkeiten}}", "@doctorSummaryCapabilities": { "placeholders": { "n": { @@ -1170,7 +1170,7 @@ } }, "doctorSummaryDeclared": "deklariert", - "doctorModulesPanelSummary": "{n} Module · {m} Fähigkeiten", + "doctorModulesPanelSummary": "{n, plural, =1{1 Modul} other{{n} Module}} · {m, plural, =1{1 Fähigkeit} other{{m} Fähigkeiten}}", "@doctorModulesPanelSummary": { "placeholders": { "n": { @@ -1225,7 +1225,7 @@ } } }, - "doctorChainPillOk": "Integritätskette v1", + "doctorChainPillOk": "Integritätskette geprüft", "doctorChainPillTamper": "MANIPULIERT", "doctorVerifyNow": "Jetzt prüfen", "doctorRestart": "Neustart", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a0d7111..d258a9d 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1085,7 +1085,7 @@ "approvalsTabPending": "Pending", "approvalsTabHistory": "History", "approvalsInboxZero": "Inbox zero", - "approvalsInboxHint": "All caught up. New `system.approval@^0` steps land here automatically.", + "approvalsInboxHint": "All caught up. When a flow asks for a human approval, the request appears here automatically.", "approvalsReloadTooltip": "Reload", "approvalsPillPending": "pending", "approvalsPillApproved": "approved", @@ -1173,7 +1173,7 @@ "doctorSummaryApprovals": "Approvals", "doctorSummaryAudit": "Audit", "doctorSummaryServices": "Services", - "doctorSummaryCapabilities": "{n} capabilities", + "doctorSummaryCapabilities": "{n, plural, =1{1 capability} other{{n} capabilities}}", "@doctorSummaryCapabilities": { "placeholders": { "n": { @@ -1194,7 +1194,7 @@ } }, "doctorSummaryDeclared": "declared", - "doctorModulesPanelSummary": "{n} modules · {m} capabilities", + "doctorModulesPanelSummary": "{n, plural, =1{1 module} other{{n} modules}} · {m, plural, =1{1 capability} other{{m} capabilities}}", "@doctorModulesPanelSummary": { "placeholders": { "n": { @@ -1249,7 +1249,7 @@ } } }, - "doctorChainPillOk": "Integrity chain v1", + "doctorChainPillOk": "Integrity chain verified", "doctorChainPillTamper": "TAMPER", "doctorVerifyNow": "Verify now", "doctorRestart": "Restart", diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 5d897e0..3d3bbbd 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -3359,7 +3359,7 @@ abstract class AppLocalizations { /// No description provided for @approvalsInboxHint. /// /// In en, this message translates to: - /// **'All caught up. New `system.approval@^0` steps land here automatically.'** + /// **'All caught up. When a flow asks for a human approval, the request appears here automatically.'** String get approvalsInboxHint; /// No description provided for @approvalsReloadTooltip. @@ -3563,7 +3563,7 @@ abstract class AppLocalizations { /// No description provided for @doctorSummaryCapabilities. /// /// In en, this message translates to: - /// **'{n} capabilities'** + /// **'{n, plural, =1{1 capability} other{{n} capabilities}}'** String doctorSummaryCapabilities(int n); /// No description provided for @doctorSummaryPending. @@ -3587,7 +3587,7 @@ abstract class AppLocalizations { /// No description provided for @doctorModulesPanelSummary. /// /// In en, this message translates to: - /// **'{n} modules · {m} capabilities'** + /// **'{n, plural, =1{1 module} other{{n} modules}} · {m, plural, =1{1 capability} other{{m} capabilities}}'** String doctorModulesPanelSummary(int n, int m); /// No description provided for @doctorApprovalsNone. @@ -3695,7 +3695,7 @@ abstract class AppLocalizations { /// No description provided for @doctorChainPillOk. /// /// In en, this message translates to: - /// **'Integrity chain v1'** + /// **'Integrity chain verified'** String get doctorChainPillOk; /// No description provided for @doctorChainPillTamper. diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 11f62e4..2e1cad1 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -1941,7 +1941,7 @@ class AppLocalizationsDe extends AppLocalizations { @override String get approvalsInboxHint => - 'Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.'; + 'Alles erledigt. Wenn ein Flow eine menschliche Freigabe verlangt, erscheint die Anfrage automatisch hier.'; @override String get approvalsReloadTooltip => 'Aktualisieren'; @@ -2063,7 +2063,13 @@ class AppLocalizationsDe extends AppLocalizations { @override String doctorSummaryCapabilities(int n) { - return '$n Fähigkeiten'; + String _temp0 = intl.Intl.pluralLogic( + n, + locale: localeName, + other: '$n Fähigkeiten', + one: '1 Fähigkeit', + ); + return '$_temp0'; } @override @@ -2079,7 +2085,19 @@ class AppLocalizationsDe extends AppLocalizations { @override String doctorModulesPanelSummary(int n, int m) { - return '$n Module · $m Fähigkeiten'; + String _temp0 = intl.Intl.pluralLogic( + n, + locale: localeName, + other: '$n Module', + one: '1 Modul', + ); + String _temp1 = intl.Intl.pluralLogic( + m, + locale: localeName, + other: '$m Fähigkeiten', + one: '1 Fähigkeit', + ); + return '$_temp0 · $_temp1'; } @override @@ -2153,7 +2171,7 @@ class AppLocalizationsDe extends AppLocalizations { } @override - String get doctorChainPillOk => 'Integritätskette v1'; + String get doctorChainPillOk => 'Integritätskette geprüft'; @override String get doctorChainPillTamper => 'MANIPULIERT'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 4bb85ab..b450b96 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -1950,7 +1950,7 @@ class AppLocalizationsEn extends AppLocalizations { @override String get approvalsInboxHint => - 'All caught up. New `system.approval@^0` steps land here automatically.'; + 'All caught up. When a flow asks for a human approval, the request appears here automatically.'; @override String get approvalsReloadTooltip => 'Reload'; @@ -2070,7 +2070,13 @@ class AppLocalizationsEn extends AppLocalizations { @override String doctorSummaryCapabilities(int n) { - return '$n capabilities'; + String _temp0 = intl.Intl.pluralLogic( + n, + locale: localeName, + other: '$n capabilities', + one: '1 capability', + ); + return '$_temp0'; } @override @@ -2086,7 +2092,19 @@ class AppLocalizationsEn extends AppLocalizations { @override String doctorModulesPanelSummary(int n, int m) { - return '$n modules · $m capabilities'; + String _temp0 = intl.Intl.pluralLogic( + n, + locale: localeName, + other: '$n modules', + one: '1 module', + ); + String _temp1 = intl.Intl.pluralLogic( + m, + locale: localeName, + other: '$m capabilities', + one: '1 capability', + ); + return '$_temp0 · $_temp1'; } @override @@ -2160,7 +2178,7 @@ class AppLocalizationsEn extends AppLocalizations { } @override - String get doctorChainPillOk => 'Integrity chain v1'; + String get doctorChainPillOk => 'Integrity chain verified'; @override String get doctorChainPillTamper => 'TAMPER';