Commit graph

256 commits

Author SHA1 Message Date
flemming-it
14f824b8ef feat(doctor,shell): ollama host-service suggestion + hub-update hint (0.80.0)
Some checks failed
Security / Security check (push) Failing after 2s
Doctor: when the system AI uses an Ollama endpoint that no declared
host service covers (host:port match, /v1 suffix stripped), the
services panel says so in one sentence with a one-click 'declare as
host service' via the new DeclareService RPC — and states honestly
that it takes effect after a daemon restart (the restart button sits
on the same page). Pure suggestOllamaServiceEndpoint pins every
branch.

Shell: one slim, dismissible banner after connecting when the
release manifest offers a newer hub version; dismissal is persisted
per version so each release hints exactly once (pure
shouldShowUpdateHint + a widget test through the fake hub).
Deliberately manifest-based — Studio and hub versions are
independent counters, so a direct comparison would be wrong;
unreleased dev skew stays with the per-page classified states.
The probe stays inert under the test probe override: its timeout
timer leaked into hub_banner_test (the hermeticity class again).

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-23 00:03:42 +02:00
flemming-it
351c5a82bc feat(store): show module maintainers (0.79.0)
Some checks failed
Security / Security check (push) Failing after 2s
The detail sheet always answers 'who maintains this?': one
selectable line per maintainer from the store index's new
maintainers list, or an honest 'not specified' when the index
names nobody (StoreMaintainersSection, public for the widget
tests). The install trust gate carries the same fact when
present and stays terse otherwise. DE+EN; dialog-harness proof
captured with the maintainer row.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-22 22:06:18 +02:00
flemming-it
66886389a6 chore: pin the flow editor to its v0.25.0 tag
Some checks failed
Security / Security check (push) Failing after 1s
The night run pinned the editor by commit because its sandbox could
not create tags; the tag exists now (same tree, plus the changelog
commit), so the pin goes back to the reproducible tag form.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-22 20:40:49 +02:00
flemming-it
e784cb6987 docs: changelog — flows disturbance hardening under 0.78.0
Some checks failed
Security / Security check (push) Failing after 2s
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-22 14:13:18 +02:00
flemming-it
642d8feb1d fix(flows): honest unknown-store state + snapshot lifecycle
Some checks are pending
Security / Security check (push) Waiting to run
Store snapshot is now nullable: until the first successful store
search (or after a sealed-area connection switch) the editor gets
null and claims neither 'installable' nor 'not in store'. The
snapshot reloads after installs and on connection switches — a
sealed switch previously kept the other hub's capability offers
alive on the mounted Flows page. Editor pin 2535c28.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-22 14:02:54 +02:00
flemming-it
ae46258ff7 feat(flows): workspace switcher + project-filtered flow list
Some checks failed
Security / Security check (push) Failing after 1s
Mount the shared project switcher (same control as Audit, Approvals
and Runs) in the flow editor's toolbar via the editor's new
toolbarTrailing slot. The list filters by the active project with
'no key = general' display semantics, and new flows are stamped
with the active project's key. Editor pin moved to c4a39a3
(0.25.0 + project separation).

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-22 13:57:14 +02:00
flemming-it
e28fffee61 feat(errors): classify the install 'no store entry' failure
Some checks are pending
Security / Security check (push) Waiting to run
Even with the honest install badge the hub error stays reachable
(stale store snapshot, race with a store refresh, older hub). The
friendly-error mapper now gives it its own headline plus a hint
naming the three acquisition paths — local module install, adding
the providing store, configuring the MCP/n8n integration — in EN
and DE, with the verbatim hub message kept copyable. Matcher unit
tests EN+DE guard the classification.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-22 13:48:31 +02:00
flemming-it
08227410e6 fix(flows): only offer install for capabilities the store resolves
Some checks are pending
Security / Security check (push) Waiting to run
The capability set behind the flow editor's Install quick-fix and
the flow list's install badge ingested every store entry's
requiresCapabilities (dependencies, not provided capabilities) and
ignored entry status/kind. Clicking Install on such a capability
ended in the hub's "no store entry for '<name>'" error.

The set now mirrors the hub's install resolver (entry names only,
no planned or federated entries) via installableStoreCapabilities()
with unit tests for both classification states. Unresolvable
capabilities render the editor's 'not in store' state, which
explains the three recovery paths before any click; the editor pin
moves to 0.25.0 (commit-pinned until its tag exists) and the dialog
harness captures the badge states light+dark. Studio 0.78.0.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-22 13:46:08 +02:00
flemming-it
bef2dbe988 fix(store,doctor): doc-verifier findings on the trust surfaces
Some checks failed
Security / Security check (push) Failing after 1s
The doc-verifier pass over the new trust/exposure surfaces came back
PASS with five improvements, all applied:
- the store policy notice gains a 'Learn more' into the security doc
  (the notice named security.require_signatures but not where it
  lives)
- 'blocked' disables the trust gate's install button — an active
  button contradicted the 'install would be refused' statement right
  above it (guard test added)
- the unknown-exposure tooltip now says what the operator can do
  (check where the name resolves)
- dead l10n key verifPillUnverified removed (unverified is the
  page-level notice, never a card pill)
- stale header comment in install_verification.dart corrected

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-21 13:23:58 +02:00
flemming-it
2f076ccf29 feat(store,doctor): surface the hub's trust + exposure data (0.77.0)
Some checks failed
Security / Security check (push) Failing after 1s
The trust-gate dialog replaces its generic 'no per-entry status yet
(alpha)' note with the hub's classified verification statement —
pinned store key / trusted publishers (green), installs without
signature checking (amber), install would be refused (red), bridge
entry (neutral) — via one shared describeInstallVerification mapping.
Against a pre-0.23 hub the field is empty and the old honest wording
stays (pinned by test).

Information architecture: policy-off is a GLOBAL fact, so it appears
as ONE ChainInlineHelp notice above the store grid instead of a
warning pill on every card (card noise); only 'blocked' — a genuine
per-source anomaly — earns a card pill. Doctor's host services show
the hub-classified network reach per endpoint (local only / private
network / publicly reachable with a protect-it hint / reach unknown).

Verified end-to-end against the live dev hub (guide harness): the
wire field arrives, the store page shows exactly one policy notice
and quiet cards; trust-gate variants captured via the dialog
harness. Suite 123 green.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-21 13:14:13 +02:00
flemming-it
87afa4dc05 feat(docs): in-place help pattern — explain a surface where it happens
Some checks failed
Security / Security check (push) Failing after 2s
New ChainInlineHelp (intro strip: what this is + what will happen, with
an optional 'Learn more' into the doc sheet) and ChainFieldHelp /
ChainFieldLabel (a '?' affordance per field). First applied to the
add-satellite dialog, which asked for a bare 'name' with no hint of
what a satellite is or does (usertest): it now leads with a plain
explanation + a federation 'Learn more', and the name field carries a
'?'. Both widgets are quiet by design.

Verified: field_help_test covers the widgets + that the dialog explains
itself; dialog_shots_test.dart (a reusable headed dialog-capture
harness) proved the layout in light + dark. Studio 0.76.0.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-20 02:00:56 +02:00
flemming-it
5a3f00bb2c fix(docs): page help buttons open the right topic + wiring guard
The Federation and Runs help buttons opened the architecture doc:
federation.md/runs.md existed as assets but had no _DocEntry, so
showFaiDoc resolved the unknown slug to _kDocs.first. Register both
(onWelcome: false, so they don't clutter the newcomer grid but are
reachable), split the Welcome grid onto the curated subset, and make
the unknown-slug fallback assert in debug instead of silently opening
the wrong topic.

Guard (no-bugfix-without-a-guard): doc_help_wiring_test.dart scans
lib/ for every showFaiDoc('slug') call and asserts each has a
registered entry AND both assets/docs/<slug>[_de].md files. Exposes
kKnownDocSlugs for the test.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-20 02:00:56 +02:00
flemming-it
588f437395 feat(workspace): sealed-area names are confidential by default
Some checks failed
Security / Security check (push) Failing after 2s
The switcher listed sealed areas by name ('lbs', 'stromnetz') on
any glance or screenshot — but the names themselves often carry
client/mandate identity (usertest security finding). The sealed
section now renders one aggregated row ('2 sealed areas') with a
deliberate 'Show names' reveal per menu opening; selection still
pops the regular s:<slug> value. Settings -> Security gains 'list
sealed areas with their names right away' (WorkspacePrefs,
SidebarPrefs pattern, default off).

The aggregate row wraps to two lines — popup menus cap their
width and action texts must never be truncated (the first cut
showed '1 abgeschotte…' in the proof shot). Guard: switcher tests
cover aggregated-until-reveal and the Settings toggle; the old
direct-listing test now asserts the reveal contract. DE+EN.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-19 03:34:05 +02:00
flemming-it
ed680c507a refactor(ui): one canonical segment control (ChainSegments) everywhere
Some checks failed
Security / Security check (push) Failing after 1s
The same single-select choice pattern appeared as four widgets:
audit's hover pills, the store's SegmentedButton, the store filter
dialog's ChoiceChips, and the approvals TabBar (usertest finding
#14 / night-log decision 'pill segment as canon'). The audit
pattern is promoted to a shared ChainSegments widget (optional
icons, hover, selected border, button+selected semantics) and all
four sites use it; approvals switches lists via IndexedStack so
both stay alive and switching does not refetch.

Guard per the no-bugfix-without-a-guard rule: widget tests for
selection + semantics, plus a canon sweep that bans
TabBar/TabBarView/TabController/SegmentedButton/ChoiceChip from
lib/ (comments exempt). Deliberately out of scope: the flow
editor's Graph/Text/Run tabs live in the separate editor package.
Studio 0.75.0; guide images regenerated, dark + light verified.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-19 02:58:54 +02:00
flemming-it
bfd58baa75 test(skew): version-skew smoke — dev Studio against the released hub
Some checks failed
Security / Security check (push) Failing after 2s
Walks every sidebar page against an older, released chain binary
(hermetic fixture hub) and fails when any page claims 'unreachable'
although the hub answers, or renders raw error text. Run via the
platform repo's scripts/skew-smoke.sh as a Studio release gate.

Verified against the real pair hub 0.21.0 vs workspace 0.22.0: all
invariants hold. Two timing notes are handled explicitly: real-async
settles between navigations and an app teardown before the fixture
teardown keep grpc-dart's data-after-cancel race (unguarded
_responses.add, call.dart:395) from failing the walk spuriously;
the final fake-time pump drains the channel's 5-minute idle timer.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-19 02:08:48 +02:00
flemming-it
66b26304fd feat(test): hermetic hub fake + state-matrix sweep across all pages
The widget suites used to talk to whatever listens on the real
endpoint — results depended on the operator's machine (a running
hub fed real data into a11y/responsive runs and its gRPC channel
timers caused the historic flake). Hardening round:

- HubService.instance is now injectable (debugSetInstance);
  FakeHubService (test/support/fake_hub.dart) answers every member
  the pages touch with healthy-empty defaults and scripts per-RPC
  failures (UNIMPLEMENTED / UNAVAILABLE / detached gate) through a
  GrpcError-shaped fake. Unimplemented members are recorded and
  fail the sweep with the exact list.
- state_matrix_test.dart pins the app-wide invariants for every
  sidebar page x hub condition: healthy => no unreachable claims
  and no raw error text; hub gone => honest unreachable states;
  UNIMPLEMENTED => never 'not reachable' while the sidebar shows
  connected; detached gate => plain-language feature-off state.
- a11y + responsive sweeps now inject the fake (hermetic); the
  6-minute idle-timer drain workaround is gone with the cause.

Real bugs the new sweep caught immediately:
- every data page (store, doctor, audit, approvals, federation)
  folded ANY load failure into 'hub not reachable' — the runs-page
  bug class; they now share HubLoadErrorView, which classifies
  into unreachable / needs-newer-hub / load-failed-with-copyable-
  detail (new generic DE+EN strings)
- the approvals page's hidden tab had no future listener: a load
  failure there surfaced as an uncaught async error
- the audit status bar rendered the raw gRPC error wall verbatim;
  it now shows the classified friendly headline (still selectable)

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-19 01:02:51 +02:00
flemming-it
adc5fc2311 chore: bump to 0.74.0 + changelog for the doctor/runs round
Some checks failed
Security / Security check (push) Failing after 2s
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 18:02:44 +02:00
flemming-it
e67e0c9e73 feat(doctor): deep-link findings to the page where they are actioned
Doctor findings used to be dead-end statements — 'approvals
waiting for review' left the operator to find the approvals inbox
on their own. Every finding with a dedicated surface is now one
tap away from it:

- summary tiles: modules -> store, approvals -> approvals inbox,
  audit chain -> audit log (chevron affordance, tooltip + semantics
  button; the services tile stays plain — no dedicated page)
- modules/approvals panel rows link the same way
- the event-log headline opens the audit page next to the
  existing verify button
- host-services empty state gains a 'view the configuration'
  button opening the in-Studio config viewer the hint refers to
- the update banner's release-notes URL is now an underlined,
  clickable link instead of dead text

Tiles and the panel are public callback-driven widgets so the
widget tests pump them without a live hub. New DE+EN link labels.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 18:02:04 +02:00
flemming-it
c18bb7f357 fix(test): kill the a11y suite's pending-timer flake at its root
Finally caught with a creation stack trace: when the last gRPC
stream closes, Http2ClientConnection arms the channel's 5-minute
idleTimeout timer — even on a shut-down connection — so the
test's 1-minute drain never covered it and the framework's
pending-timer invariant tripped whenever the arm landed inside
the test window (frequent while a real hub listens on 50051).

The suite now closes the channel in real-async space at the end
of the body (new @visibleForTesting HubService.debugResetChannel;
shutdown is deliberately not awaited — it wedges on a mid-connect
socket, but cancels its timers synchronously) and pumps past the
idle timeout so the timer fires inside the test. 6 consecutive
full-suite runs + 3 isolated runs green; before, roughly 1 in 3
full runs failed.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 18:02:03 +02:00
flemming-it
383490027b fix(audit): cancel the live-stream reconnect timer on dispose
The onDone handler armed an anonymous 3 s reconnect timer that
nothing could cancel; when the stream closed right before the page
was disposed (no hub, connect ends in onDone instead of onError),
the timer outlived the tree. The a11y suite caught this as the
rare 'Timer is still pending' flake noted in the night log — the
failure reason is now captured and the timer lives in a field that
dispose() cancels.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 17:33:11 +02:00
flemming-it
ea2cd87b5e fix(runs): stop claiming the hub is unreachable on RPC-level errors
The runs monitor folded every load failure into 'hub not reachable',
contradicting the sidebar's green connected dot whenever the hub
answered but the RPC failed — most visibly against a pre-0.22 hub
whose version predates the ListInvocations RPC (UNIMPLEMENTED).

Classify the failure instead (top-level, unit-tested):
- UNIMPLEMENTED -> 'this view needs a newer hub version' with a
  doctor-page link (the update banner lives there)
- FAILED_PRECONDITION from the detached gate -> the regular
  feature-off empty state with the guide button
- UNAVAILABLE / DEADLINE_EXCEEDED / socket-level failures -> the
  honest 'hub not reachable' state (unchanged)
- everything else -> a load-failed state with the friendly error
  and a copyable detail box

The error view is a public callback-driven widget so the tests pump
each variant without a live hub. New DE+EN strings for the too-old
and load-failed states; grpcCodeOf/grpcMessageOf exposed from the
friendly-error mapper instead of duplicating the duck-typing.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 17:33:11 +02:00
flemming-it
b47d8c4646 feat(audit): full-history JSONL export in the actions menu
Some checks failed
Security / Security check (push) Failing after 1s
The menu so far only exported the current view (type + search
filter over the page 100-event window). A second action now fetches
the complete event history of the active project scope in one
EventLog call (the RPC has no cursor and no server-side cap) and
writes it as JSONL. Serialisation extracted to a top-level function
with unit tests; a stale comment advertising the never-shipped
"chain audit export" command now names "chain admin events --json".
Studio 0.73.0.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 01:49:20 +02:00
flemming-it
ae8fdcc762 fix(store,audit,workspace): usertest low-findings tail (0.72.1)
Some checks failed
Security / Security check (push) Failing after 1s
- Store hero: 'TODAY' badge only for an operator-accepted story; the
  rotating compiled-in fallback deck now says 'FEATURED' (no false
  freshness claim). Policy as a top-level function with unit tests.
- Audit filter chips: standard label typography instead of mono —
  mono stays reserved for paths and identifiers.
- DE chain wording: 'Hash-Kette geprüft' as the one confirmation term
  (audit header now matches the doctor pill); 'intakt' stays the
  state headline. EN was already consistent.
- Workspace switcher: contrast bump for the sealed-area 'stopped'
  label.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 01:08:09 +02:00
flemming-it
6152c80c84 docs: changelog for the doctor fixes + version-sync note
Some checks failed
Security / Security check (push) Failing after 2s
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:57:37 +02:00
flemming-it
703d961cec fix(doctor): honest module count, temp-path audit warning, connection line
Some checks are pending
Security / Security check (push) Waiting to run
Three doctor-page findings from the usertest panel:

- Module tile no longer counts the hub's built-in 'system'
  pseudo-module — a fresh hub shows 0 modules, matching the
  welcome checklist's definition of an install. Counting is a
  top-level function with unit tests.
- When the audit DB lives in an OS-cleanable temp directory
  (/var/folders, /tmp, Windows Temp), the daemon-files panel
  says so instead of presenting the state as healthy. The
  classifier is a top-level function with unit tests.
- The daemon card states who-talks-to-whom-how in one line:
  endpoint, transport security (TLS / unencrypted-local /
  unencrypted), and whether a bearer token is attached (length
  only) — the auditor's baseline the green dot cannot answer.

Also syncs pubspec.yaml (0.70.0 -> 0.72.0) with kStudioVersion,
which had drifted to 0.71.0 while pubspec stayed behind.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:56:46 +02:00
flemming-it
afa3fa7eae docs: changelog for the 2026-07-17 usertest round
Some checks failed
Security / Security check (push) Failing after 2s
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:37:24 +02:00
flemming-it
b42003e600 fix(welcome,store): sticky flow-completed tick, carousel position text
Some checks are pending
Security / Security check (push) Waiting to run
- the 'start a saved flow' checklist tick no longer unticks once
  the flow.completed event scrolls out of the 100-event window —
  a local sticky marker keeps it honest to its wording
- the Today carousel shows 'n/m' next to the 6-px dots so the
  position is readable without aiming at them

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:36:00 +02:00
flemming-it
5578c32710 fix(store): localized category labels, 'Studio & Designs' tab in German
Some checks are pending
Security / Security check (push) Waiting to run
'document' rendered as a raw lowercase English token next to
localized neighbours; unknown categories at least capitalize.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:34:28 +02:00
flemming-it
12b2e8327a fix(l10n): low-severity language findings from the usertest panel
Some checks are pending
Security / Security check (push) Waiting to run
- 'Mit Endpunkt verbinden' — no Endpoint/Endpunkt mix
- audit-chain lead term is 'Hash-Kette' everywhere (doctor pill);
  chain detail says 'Verkettung lückenlos geprüft' instead of the
  raw field name prev_event_sha256
- welcome checklist line says who refreshes what
- setup privacy note explains the local model instead of ending in
  a bare model tag
- default project renders localized ('Allgemein') in the switcher;
  sealed-area status pills explain run state on hover

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:33:27 +02:00
flemming-it
32e2510c63 feat(store): license pill on the module card
Some checks are pending
Security / Security check (push) Waiting to run
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:29:07 +02:00
flemming-it
240c424a5b chore: pin flow editor v0.24.1
Some checks failed
Security / Security check (push) Failing after 1s
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:27:57 +02:00
flemming-it
6bbe670074 fix(l10n): no literal backticks in UI text, two stray informal imperatives
Some checks are pending
Security / Security check (push) Waiting to run
Text widgets render markdown backticks verbatim (usertest: reads
as typos / raw dev output) — stripped across both catalogs; code
terms stay inline in plain type. 'Zeig dem Hub' / 'Nimm das CLI'
now use the formal address; the guard test learns both stems.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:25:31 +02:00
flemming-it
eab58c0b68 fix(ux): quick wins from the usertest medium list
Some checks are pending
Security / Security check (push) Waiting to run
- audit type filter: 'Alle'/'All' capitalized like every other label
- settings -> setup wizard: close Settings first (one modal layer),
  stronger wizard scrim
- try-out setup profile discloses the upgrade path to a regulated
  profile
- store maturity pills explain themselves on hover (experimental/
  published/planned)

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:24:13 +02:00
flemming-it
ae97b88257 fix(runs): honest empty state — feature off vs. no runs yet
Some checks are pending
Security / Security check (push) Waiting to run
The empty state unconditionally claimed background runs were
switched off, even on hubs where the operator had enabled them.
The hub now reports the flag on the list RPC (detached_enabled);
the hint picks the truthful variant.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:20:43 +02:00
flemming-it
5aa69104e7 feat(audit): free-text search, JSONL export of the view, labeled dev reset
Some checks failed
Security / Security check (push) Failing after 1s
- search field over flow/step/module/error/detail/project/id backs
  the list and the export ('current view' semantics); match logic
  is a top-level function with unit tests
- export writes one JSON object per line via the save dialog; the
  CLI stays the canonical WORM-grade export
- the bare trash icon on the audit toolbar read as 'delete
  evidence' (security-auditor finding) — the dev-only reset now
  sits in a labeled overflow menu next to the export action

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:08:51 +02:00
flemming-it
0e53572589 fix(federation): primary action in the app bar and empty state, no FAB
Every other page carries its primary action top right (New flow,
Add store) — the lone Material FAB bottom right broke the pattern
and sat far from the empty-state text asking for exactly that
action. The empty state now offers the button in place too.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:08:51 +02:00
flemming-it
b52590c7d3 fix(doctor): copy button per path row, readable chain count, cased source kinds
Some checks are pending
Security / Security check (push) Waiting to run
- every daemon file row gets a copy-to-clipboard action next to
  view/open so terminal users can grab the raw path
- audit stat subtitle says 'n of m events verified' instead of the
  cryptic 'n/m chain'
- capability source-kind breakdown renders display names
  (Bundle/MCP/System) instead of raw lowercase wire tokens

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:04:05 +02:00
flemming-it
8d5d1d74bb fix(l10n): one term for capabilities, plain federation language
- 'Fähigkeiten' is the German lead term everywhere (welcome step 2,
  integrations panel, federation) — English jargon only as a
  parenthesized technical term on first mention
- 'Enrollment-Token' -> 'Registrierungs-Token', bootstrap label in
  plain words, CA spelled out, enrollment hint now formal address
- formality guard also rejects reader-addressed imperatives

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:04:05 +02:00
flemming-it
dfc24d3c58 fix(l10n): plain approvals hint, real plurals, de-jargoned chain pill
Some checks failed
Security / Security check (push) Failing after 1s
- 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 <stefan.a.flemming@googlemail.com>
2026-07-18 00:00:17 +02:00
flemming-it
79e08c8d17 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 <stefan.a.flemming@googlemail.com>
2026-07-18 00:00:17 +02:00
flemming-it
dd0737b8b1 chore: complete the flow editor 0.24.0 pin (lockfile)
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:00:17 +02:00
flemming-it
097351a7aa chore: pin flow editor v0.24.0
Some checks are pending
Security / Security check (push) Waiting to run
Picks up the usertest fixes: hub-truth builtin detection (hello's
false play button), calm missing-modules badge with a separate
never-truncated install action, flow-list filter, and formal
German address in the editor strings.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-17 23:51:56 +02:00
flemming-it
039f11b6bc feat(store): trust gate before every module install
Some checks failed
Security / Security check (push) Failing after 2s
One-click installs showed no trust signal at all (top security
finding of the usertest panel). Every install path — store card,
detail sheet, and the flow list's quick fix — now routes through
one confirmation dialog showing what the hub actually knows
before download: origin store, version, license, maturity, and
required services/capabilities, plus the sandbox model and an
honest note that per-entry signature status is not in the store
index yet (verification happens hub-side at install). Widget
tests cover content and confirm/cancel semantics.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-17 23:44:14 +02:00
flemming-it
c253f5d23e feat(settings): About section — vendor, versions, license, contact
Some checks are pending
Security / Security check (push) Waiting to run
Procurement personas found no vendor, version, license, or
support information anywhere in the app (a hard checklist fail
for regulated buyers). Settings gains an About category:
product name, Studio + running-hub version, vendor Flemming.AI,
author, Apache 2.0 license, contact address, and the docs URL —
every value selectable and one-click copyable. Studio version
constant moved to data/about_info.dart so sidebar tag and About
can never drift. Bumps Studio to 0.71.0.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-17 23:40:21 +02:00
flemming-it
c436e12601 feat(nav): discoverable sidebar — instant tooltips, shortcuts made visible, pinnable rail
Some checks are pending
Security / Security check (push) Waiting to run
The icon-only rail forced first-time users to guess (usertest:
Senior, a11y, UX personas). Three changes:
- Nav tooltips appear instantly and carry the page shortcut
  (Cmd+1..9, Ctrl on non-mac — Ctrl activators added); expanded
  labels show the same hint. Explicit button semantics for
  screen readers on every destination.
- A visible 'Search & commands' row above the footer opens the
  existing Cmd+K palette, which nothing in the UI advertised.
- Settings -> Appearance gains 'Keep the navigation expanded':
  pins the rail with permanent labels (persisted preference).
Footer strip and pillar toggle made overflow-safe for the
animating rail; responsive test scrolls the by-design scrollable
destinations list.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-17 23:36:33 +02:00
flemming-it
ca01fd2ec0 fix(l10n): consistent formal address across the German catalog
Some checks are pending
Security / Security check (push) Waiting to run
Store search, security panel, System-AI fix hint and the
approvals payload hint addressed the operator informally while
the rest of the app uses Sie — the panel flagged the break on
every second screen. All DE strings now use the formal address,
and a guard test rejects any future informal form in app_de.arb.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-17 23:25:50 +02:00
flemming-it
3e1ce6e1fd fix(welcome): concept cards speak everyday language first
Some checks are pending
Security / Security check (push) Waiting to run
The Hub/Module/Flow cards explained the basics in the very
vocabulary they were supposed to introduce (Rust binary, WASM,
YAML, hash-chained). Each card now leads with a plain-language
explanation; the technical wording moved behind a per-card
'for the technically curious' toggle. DE and EN.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-17 23:24:46 +02:00
flemming-it
cc1618f512 fix(runs): plain-language empty state with a guide button
Some checks are pending
Security / Security check (push) Waiting to run
The empty state explained itself in operator jargon (detach,
detached.enabled, operator config) and offered no way forward.
Now it says what background runs are in everyday language and
opens the built-in guide — which carries the exact activation
steps — via a real button. DE and EN.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-17 23:23:15 +02:00
flemming-it
9cc330fca0 test(security): env-gated proof shot of the auth-policy panel (Settings -> Security)
Some checks failed
Security / Security check (push) Failing after 2s
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-17 19:26:54 +02:00
flemming-it
c81bc16eb9 test(setup): guide-shot harness opens the wizard via Settings; changelog for the setup rework
Some checks failed
Security / Security check (push) Failing after 2s
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-17 19:08:40 +02:00