From 1a649d75332d46d25bfcfda1c074c02eb6fd3dd8 Mon Sep 17 00:00:00 2001 From: flemming-it Date: Thu, 18 Jun 2026 14:29:15 +0200 Subject: [PATCH 1/4] docs: add reclaim agent CLAUDE.md (cross-agent boundaries) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Establish the per-session context for the reclaim agent: product identity (Recl∆Im / reclaim_app), that this is a domain app on top of the Ch∆In platform, the ownership boundary (platform + client SDK belong to the chain agent — request changes via shared/HANDOFFS.md, never edit them), and the confidentiality rule that MACHBARKEITSSTUDIE.md is AG-intern. Points to ../../shared/AGENTS.md as the cross-agent charter. Signed-off-by: flemming-it --- CLAUDE.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 CLAUDE.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..4f9ee54 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,58 @@ +# Recl∆Im — Context for Claude Code + +You are the **reclaim** agent. Read this first, every session. + +## Identity + +- **Product:** Recl∆Im (ASCII / code: `reclaim`) — a domain app for + law / duty reform-mapping (Pflicht-basierte Wirkungsanalyse). +- **Flutter package:** `reclaim_app` (snake_case Dart identifier — this + stays; only user-facing display names use the `∆` spelling). +- **Author:** Dr. Stefan Flemming, F∆I (Flemming.AI). +- **Repository (dev):** `git.flemming.ai/fai/reclaim`. +- **License:** Apache 2.0. + +> Naming: `∆` replaces the "AI" letters; in ASCII / code use the plain +> spelling `reclaim`. The Dart package identifier `reclaim_app` and the +> on-disk macOS bundle `reclaim_app.app` are code references and stay +> snake_case; user-facing product strings read **Recl∆Im**. + +## What this is + +Recl∆Im is **a domain app built on top of the Ch∆In platform.** It +consumes the platform — it is not the platform. It connects to a Ch∆In +hub over gRPC via the `chain_client_sdk` (a path dependency) and runs +WASM modules + YAML flows the hub orchestrates. + +## Cross-agent boundaries + +Read `../../shared/AGENTS.md` (the cross-agent charter) and +`../../shared/HANDOFFS.md` (your task list) every session. + +- **You own:** the Recl∆Im Flutter app (`reclaim_app`) — its UI and + domain logic — plus Recl∆Im-specific flows / modules, branding, and + the Recl∆Im docs (METHODIK, RUN, MACHBARKEITSSTUDIE). +- **You do NOT own** the platform. The hub, the `chain` CLI, the runtime + / sandbox, the module ABI (`chain:platform`), the gRPC wire + (`chain.v1`), Studio, and the client SDKs all belong to the **chain** + agent. Recl∆Im uses `chain_client_sdk` via a path dep but **never + modifies it.** +- Need a new RPC / SDK method / ABI capability, or any change to the + hub / SDK / wire? Do **not** edit it — append a handoff row to + `../../shared/HANDOFFS.md` (from: reclaim, to: chain) and skip that + item. + +## Confidentiality + +The internal `MACHBARKEITSSTUDIE.md` is **AG-intern** and must never go +into public docs, code, commits, or examples. Never name pilot +institutions (ITDZ, Kammergericht, HTW, J∆I) or customer↔label mappings +in public material. Generic terms only ("a regulated organization"). + +## Commit conventions + +- Conventional commits in English: `type(scope): message`. +- DCO sign-off on every commit: `git commit -s` + (`Signed-off-by: …`). No `Co-Authored-By` trailer. +- Make the smallest change that works; verify with `flutter analyze` + (in `app/`) before claiming done where practical. From 5de87697cfc5167bbc5b6f70ac680b3c3446ef3b Mon Sep 17 00:00:00 2001 From: flemming-it Date: Thu, 18 Jun 2026 14:29:24 +0200 Subject: [PATCH 2/4] =?UTF-8?q?fix(web):=20replace=20Flutter=20default=20p?= =?UTF-8?q?laceholders=20with=20Recl=E2=88=86Im=20branding?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The generated web target still carried 'reclaim_app' titles and the 'A new Flutter project.' description. Set the document title, apple-mobile-web-app-title, PWA manifest name/short_name to the display mark Recl∆Im and give both the index meta and the manifest a real product description. The Dart package identifier reclaim_app stays — only the user-facing strings change. Signed-off-by: flemming-it --- app/web/index.html | 6 +++--- app/web/manifest.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/web/index.html b/app/web/index.html index ba23a71..a299f3b 100644 --- a/app/web/index.html +++ b/app/web/index.html @@ -18,18 +18,18 @@ - + - + - reclaim_app + Recl∆Im diff --git a/app/web/manifest.json b/app/web/manifest.json index 2bcfb6d..543e961 100644 --- a/app/web/manifest.json +++ b/app/web/manifest.json @@ -1,11 +1,11 @@ { - "name": "reclaim_app", - "short_name": "reclaim_app", + "name": "Recl∆Im", + "short_name": "Recl∆Im", "start_url": ".", "display": "standalone", "background_color": "#0175C2", "theme_color": "#0175C2", - "description": "A new Flutter project.", + "description": "Recl∆Im — Pflicht-basierte Wirkungsanalyse für Rechtsnormen, auf der Ch∆In-Plattform.", "orientation": "portrait-primary", "prefer_related_applications": false, "icons": [ From 91a87e2bd873945b3892fd396327ea4e4022b770 Mon Sep 17 00:00:00 2001 From: flemming-it Date: Thu, 18 Jun 2026 14:29:34 +0200 Subject: [PATCH 3/4] docs: fix stale 'lawheatmap' product references to reclaim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The repo was renamed to fai/reclaim but two docs still cited the old fai/lawheatmap name and one glossary entry wrongly placed the Ch∆In platform 'unter fai_lawheatmap'. Update the repository URLs to git.flemming.ai/fai/reclaim and clarify that Ch∆In is its own repo (fai_chain) on which Recl∆Im sits as a domain app. The local directory name fai_lawheatmap and its path references are left as they are pending an explicit dir-rename decision. Signed-off-by: flemming-it --- MACHBARKEITSSTUDIE.md | 4 ++-- METHODIK.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/MACHBARKEITSSTUDIE.md b/MACHBARKEITSSTUDIE.md index 9305180..a8a3690 100644 --- a/MACHBARKEITSSTUDIE.md +++ b/MACHBARKEITSSTUDIE.md @@ -870,7 +870,7 @@ liegt dann woanders. 4. **Rechtliche Kurz-Stellungnahme** anstoßen (EU AI Act, DSGVO, §5 UrhG, juris-Lizenz). Möglichst kostenneutral über Lehrstuhl-Kooperation. -5. **Repo `fai/lawheatmap` initialisieren** (Forgejo unter `git.flemming.ai`, +5. **Repo `fai/reclaim` initialisieren** (Forgejo unter `git.flemming.ai`, Vendor-Namespace `fai/`), Lizenz Apache 2.0, DCO an, CI-Pipeline analog `fai/chain` (DCO-Sign-off, Conventional Commits, SBOM, sigstore). `law.*`-Module später in `chain-modules-law/` als product-scoped Org. @@ -890,7 +890,7 @@ liegt dann woanders. - **ELI**: European Legislation Identifier (eli.dlri.de / EUR-Lex) - **CELEX**: EU-Dokumenten-ID-System - **REFIT**: EU-Programm zur Regulatorischen Eignungsprüfung -- **Ch∆In** (CLI: `chain`): Orchestrierungs-Plattform unter `fai_lawheatmap`. Vendor: **F∆I = Flemming.AI**. +- **Ch∆In** (CLI: `chain`): Orchestrierungs-Plattform (eigenes Repo `fai_chain`), auf der Recl∆Im als Domänen-App aufsetzt. Vendor: **F∆I = Flemming.AI**. - **Hub / Module / Flow**: Ch∆In-Server (`chain serve`), WASM-Komponente (ABI `chain:platform`), YAML-Workflow - **RAG**: Retrieval Augmented Generation — LLM mit verpflichteter Quelleneinbindung - **Hochrisiko-KI (EU AI Act)**: KI-System, das Rechtsfolgen für Personen diff --git a/METHODIK.md b/METHODIK.md index bb3d292..7196e34 100644 --- a/METHODIK.md +++ b/METHODIK.md @@ -297,5 +297,5 @@ Jede Methodik-Version benötigt: --- **Kontakt:** Dr. Stefan Flemming, F∆I (Flemming.AI), -chain@flemming.ai. Repository: `git.flemming.ai/fai/lawheatmap`. +chain@flemming.ai. Repository: `git.flemming.ai/fai/reclaim`. Lizenz: Apache-2.0. From f61865a3c274bc1be02c91bf8ec065590d594a56 Mon Sep 17 00:00:00 2001 From: flemming-it Date: Thu, 18 Jun 2026 14:41:07 +0200 Subject: [PATCH 4/4] feat(ui): add legend card below the heatmap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The four-line description above the heatmap was concise but opaque: 'X: log10 €/year. Y: 0–5. Punktgröße.' said the right words, but a reviewer who isn't already methodologically oriented can't tell what they're looking at. Adds a dedicated Legende-Karte directly under the heatmap. Four rows, each: leading symbol (↔ ↕ ● ◐), axis-or-quantity label, prominent name (Schaden / Nutzen / Betroffenheit / Evidenz-Stufe), and a short prose explanation tying the visual back to the Studie: ↔ Abszisse (X) Schaden — log10 €/Jahr, SKM §3.1 ↕ Ordinate (Y) Nutzen — 7-dim. Komposit §3.2 ● Punktgröße Betroffenheit — sqrt scale, DESTATIS-/IHK ◐ Tier-Farbe Evidenz-Stufe — Regel der niedrigsten §6.7 Top description tightened to one line of context only: 'Schaden × Nutzen × Betroffenheit pro Norm. Klick auf einen Punkt öffnet das Detail …'. No redundancy with the legend, no jargon up top. Signed-off-by: flemming-it --- app/lib/pages/heatmap_page.dart | 139 +++++++++++++++++++++++++++++++- 1 file changed, 136 insertions(+), 3 deletions(-) diff --git a/app/lib/pages/heatmap_page.dart b/app/lib/pages/heatmap_page.dart index 9fd69ce..f6ebf48 100644 --- a/app/lib/pages/heatmap_page.dart +++ b/app/lib/pages/heatmap_page.dart @@ -50,9 +50,9 @@ class _HeatmapPageState extends State { Text('Heatmap', style: t.displaySmall), const SizedBox(height: ReclaimSpace.xs), Text( - 'X: jährliche Bürokratiekosten (€, log10). ' - 'Y: Nutzen-Score 0–5. Punktgröße: Betroffenheit. ' - 'Klick auf einen Punkt → Detail mit Pflichten + Quellen.', + 'Schaden × Nutzen × Betroffenheit pro Norm. ' + 'Klick auf einen Punkt öffnet das Detail mit ' + 'Pflichten, Quellen und Gesetzestext.', style: t.bodyLarge?.copyWith( color: ReclaimColors.mute, ), @@ -77,6 +77,8 @@ class _HeatmapPageState extends State { ), ), ), + const SizedBox(height: ReclaimSpace.md), + _LegendCard(), const SizedBox(height: ReclaimSpace.lg), Wrap( spacing: ReclaimSpace.md, @@ -126,3 +128,134 @@ class _HeatmapPageState extends State { ); } } + +/// Axis + circle legend below the heatmap. Spells out what is +/// plotted and how — the four-line top description deliberately +/// stays short and high-level, this card carries the precise +/// reading instructions a reviewer needs to defend the plot +/// against "what does that even mean?" +class _LegendCard extends StatelessWidget { + @override + Widget build(BuildContext context) { + final t = Theme.of(context).textTheme; + return ReclaimCard( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Legende', style: t.headlineSmall), + const SizedBox(height: ReclaimSpace.md), + _LegendRow( + symbol: '↔', + axis: 'Abszisse (X)', + label: 'Schaden', + description: + 'Bürokratiekosten pro Jahr in Euro, logarithmisch ' + 'skaliert (10⁴ = 10 k, 10⁶ = 1 Mio, 10⁹ = 1 Mrd). ' + 'Berechnet nach Standardkostenmodell ' + 'P × F × T × h (Studie §3.1).', + ), + const SizedBox(height: ReclaimSpace.sm), + _LegendRow( + symbol: '↕', + axis: 'Ordinate (Y)', + label: 'Nutzen', + description: + 'Komposit-Score von 0–5, Mittelwert aus den sieben ' + 'Dimensionen Schutz · Markt · Rechtssicherheit · ' + 'EU-Binnenmarkt · Sicherheit · Umwelt · Einnahmen ' + '(Studie §3.2). Jede Dimension einzeln ' + 'quellen-begründet.', + ), + const SizedBox(height: ReclaimSpace.sm), + _LegendRow( + symbol: '●', + axis: 'Punktgröße', + label: 'Betroffenheit', + description: + 'Anzahl der Adressaten (KMU, Bürger, Behörden), ' + 'wurzel-skaliert. Mehr Adressaten → größerer Kreis. ' + 'Quellen: DESTATIS Unternehmensregister, ' + 'IHK-/Handwerkskammer-Mitgliederzahlen.', + ), + const SizedBox(height: ReclaimSpace.sm), + _LegendRow( + symbol: '◐', + axis: 'Tier-Farbe', + label: 'Evidenz-Stufe', + description: + 'Petrol → warm-orange markiert die Stufe (T1–T4) der ' + 'schwächsten Eingangs-Variable. Eine SKM-Zahl mit ' + 'T4-Schätzwert für h trägt die ganze Zahl als T4 ' + '(Regel der niedrigsten Stufe, Studie §6.7).', + ), + ], + ), + ); + } +} + +class _LegendRow extends StatelessWidget { + const _LegendRow({ + required this.symbol, + required this.axis, + required this.label, + required this.description, + }); + + final String symbol; + final String axis; + final String label; + final String description; + + @override + Widget build(BuildContext context) { + final t = Theme.of(context).textTheme; + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: 28, + child: Text( + symbol, + style: t.titleMedium?.copyWith( + color: ReclaimColors.signal, + fontSize: 18, + ), + ), + ), + SizedBox( + width: 140, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + axis, + style: t.labelSmall?.copyWith( + color: ReclaimColors.mute, + letterSpacing: 0.4, + ), + ), + Text( + label, + style: t.titleMedium, + ), + ], + ), + ), + const SizedBox(width: ReclaimSpace.md), + Expanded( + child: Padding( + padding: const EdgeInsets.only(top: 2), + child: Text( + description, + style: t.bodyLarge?.copyWith( + color: ReclaimColors.mute, + height: 1.5, + ), + ), + ), + ), + ], + ); + } +}