chain-studio/test
flemming-it ebc668d28d feat(approvals,audit): record the reviewer as the unchecked claim it is
The hub copies the reviewer string a client sends straight into
decided_by (DecideApproval, ClearEventLog); nothing on the wire ties
it to the authenticated caller. Studio filled it from the OS account,
so an export read like non-repudiation while being an arbitrary
client claim — the legal finding of the 2026-07-26 usertest panel.

The real fix is hub-side (derive decided_by from CALLER_IDENTITY);
that contract is written down in docs/reviewer-identity.md and needs
a hub release. Until then Studio does the one thing it can do
honestly and marks its own claim as a claim, inside the record:

- data/reviewer_identity.dart is the single place that produces and
  reads the value; wire() is idempotent, so page and HubService may
  both normalise. Every write path funnels through HubService, so no
  surface can send a bare handle.
- The inbox states before the decision who will be recorded, what
  that attribution is worth on this hub (from AuthStatus), and the
  literal string that lands in decided_by. An unreadable auth policy
  stays unreadable — never optimistic.
- Reading back: a marked value shows its plain name plus an
  unchecked flag; an unmarked one (legacy row, CLI decision, or a
  future hub-derived identity) is not classified either way.
- The audit wipe seeds the same kind of marked attribution into its
  chain.reset marker.

When the hub starts deriving the value it overwrites the field and
the prefix disappears by itself — no Studio release needed.

Guards: reviewer_identity_test (the value) and
approvals_reviewer_identity_test (every surface that writes or
renders it, against the hermetic fake hub). Visual proof for both
themes via the dialog-shot harness.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-08-03 23:50:34 +02:00
..
integration feat(settings): hub auth-policy panel — T4/T5 security parity in the GUI 2026-07-15 03:19:33 +02:00
support feat(approvals,audit): record the reviewer as the unchecked claim it is 2026-08-03 23:50:34 +02:00
a11y_test.dart feat(test): hermetic hub fake + state-matrix sweep across all pages 2026-07-19 01:02:51 +02:00
approvals_origin_test.dart fix(approvals): usertest-panel hardening (0.81.0) 2026-07-26 16:05:55 +02:00
approvals_reviewer_identity_test.dart feat(approvals,audit): record the reviewer as the unchecked claim it is 2026-08-03 23:50:34 +02:00
audit_filter_test.dart feat(audit): full-history JSONL export in the actions menu 2026-07-18 01:49:20 +02:00
chain_log_test.dart feat(settings): hub auth-policy panel — T4/T5 security parity in the GUI 2026-07-15 03:19:33 +02:00
chain_segments_test.dart refactor(ui): one canonical segment control (ChainSegments) everywhere 2026-07-19 02:58:54 +02:00
detached_run_test.dart feat: detached-runs monitor page (T3 parity) 2026-07-12 14:43:37 +02:00
doc_help_wiring_test.dart fix(docs): page help buttons open the right topic + wiring guard 2026-07-20 02:00:56 +02:00
doctor_deeplinks_test.dart feat(doctor): deep-link findings to the page where they are actioned 2026-07-18 18:02:04 +02:00
doctor_facts_test.dart fix(doctor): honest module count, temp-path audit warning, connection line 2026-07-18 00:56:46 +02:00
field_help_test.dart feat(docs): in-place help pattern — explain a surface where it happens 2026-07-20 02:00:56 +02:00
friendly_error_test.dart feat(errors): classify the install 'no store entry' failure 2026-07-22 13:48:31 +02:00
guided_setup_test.dart feat(setup): first-run gate, hub-first preview, honest wording — setup before the app 2026-07-17 00:59:22 +02:00
hub_auth_policy_panel_test.dart fix(shell): daemon-start and health-poll auth handling; policy panel freshness 2026-07-15 05:50:24 +02:00
hub_banner_test.dart fix(shell): daemon-start and health-poll auth handling; policy panel freshness 2026-07-15 05:50:24 +02:00
install_confirm_test.dart feat(store): trust gate before every module install 2026-07-17 23:44:14 +02:00
install_verification_test.dart fix(store,doctor): doc-verifier findings on the trust surfaces 2026-07-21 13:23:58 +02:00
l10n_formality_test.dart fix(l10n): no literal backticks in UI text, two stray informal imperatives 2026-07-18 00:25:31 +02:00
load_docs_test.dart refactor: rename internal Fai* design system + fai_ helpers to chain 2026-06-16 17:53:17 +02:00
nav_manifest_test.dart test: generated nav manifest guards the sidebar truth 2026-07-12 23:27:49 +02:00
ollama_service_suggestion_test.dart feat(doctor,shell): ollama host-service suggestion + hub-update hint (0.80.0) 2026-07-23 00:03:42 +02:00
pref_corruption_test.dart fix: survive corrupt preferences at startup; drop CocoaPods leftovers 2026-07-15 10:46:22 +02:00
responsive_test.dart fix(audit): wrap overflow-menu labels instead of clipping them 2026-08-03 23:49:48 +02:00
reviewer_identity_test.dart feat(approvals,audit): record the reviewer as the unchecked claim it is 2026-08-03 23:50:34 +02:00
runs_error_classification_test.dart feat(approvals,runs): explain approvals in place + one-click hub update (0.81.0) 2026-07-26 15:50:41 +02:00
sealed_identity_bar_test.dart feat: sealed-area connection switch + identity bar (multi-project stage 3) 2026-07-12 17:31:39 +02:00
setup_gate_test.dart feat(setup): first-run gate, hub-first preview, honest wording — setup before the app 2026-07-17 00:59:22 +02:00
sidebar_test.dart feat(nav): discoverable sidebar — instant tooltips, shortcuts made visible, pinnable rail 2026-07-17 23:36:33 +02:00
state_matrix_test.dart feat(test): hermetic hub fake + state-matrix sweep across all pages 2026-07-19 01:02:51 +02:00
store_caps_test.dart fix(flows): only offer install for capabilities the store resolves 2026-07-22 13:46:08 +02:00
store_maintainers_test.dart feat(store): show module maintainers (0.79.0) 2026-07-22 22:06:18 +02:00
store_today_badge_test.dart fix(store,audit,workspace): usertest low-findings tail (0.72.1) 2026-07-18 01:08:09 +02:00
widget_test.dart refactor: rename app fai_studio -> chain_studio 2026-06-16 17:48:11 +02:00
workspace_switcher_test.dart feat(workspace): sealed-area names are confidential by default 2026-07-19 03:34:05 +02:00