Two scalable artefacts under assets/branding/ so the brand can
travel outside the Flutter app — favicon source, slide footers,
press kit, GitHub social-preview, README hero. Both files use
prefers-color-scheme so a single asset inverts cleanly on
ink/paper backdrops, with the petrol signal (#2E8F9E) staying
constant on the ∆-eye and the ∆I letters in the wordmark.
reclaim-lockup.svg — 720×200 viewBox, mark on the left, the
wordmark 'Recl∆Im' on the right, ∆I in
petrol. The single artefact a stage or
browser tab wants to show.
reclaim-mark.svg — 160×160 viewBox, just the triangle and
the eye. Favicon source, social cards,
any tight-box context.
Signed-off-by: flemming-it <sf@flemming.it>
Local working directory now lines up with the product name and
the Forgejo repo (fai/reclaim). Two doc references updated;
the chain_client_sdk path-dep, the build/setup/serve scripts
(all use $(dirname $0)) and the git remote URL are unaffected
because none of them encoded the parent directory name.
flutter pub get refreshes the relative path resolution.
flutter test 2/2 stays green. flutter analyze clean.
Signed-off-by: flemming-it <sf@flemming.it>
Each Evaluation grows a componentSummary field — a small list of
plain strings, one per SKM ingredient (P / F / T / h), tagged
with its tier in the form 'P · T1 — DESTATIS Gewerbeanzeigen'.
The fixtures fill it in for all five pilot norms; the field
defaults to an empty list so flow-produced Evaluations remain
backwards-compatible until a future flow step writes one.
NormsListPage re-arranges the row to make use of the wide-screen
real-estate on the right that used to sit empty:
┌─────────────────────────────────────────────────────────────┐
│ GewO § 14 — Anzeigepflicht │ Schaden │ Komponenten │
│ eli/bund/gewo/14 │ 2.8 Mio € │ P · T1 … │
│ [T1 · amtlich] │ Nutzen │ F · T1 … │
│ │ 2.5 / 5 │ T · T1 … │
│ │ Betroffene │ h · T3 … │
│ │ 180 k │ │
└─────────────────────────────────────────────────────────────┘
The TierBadge moved into the title column (right under the eli)
so the eye lands on the tier of the figure right where the
figure's identity is named. The three metric columns stack
vertically (no more horizontal-only row) which leaves the right
third of the row free for the componentSummary lines — the
information a reviewer was always asking for ('which Komponente
is the bottleneck here?') is now visible without opening the
detail page.
Signed-off-by: flemming-it <sf@flemming.it>
Adds a dedicated BrandWordmark widget that splits 'Recl∆Im'
into three TextSpans and tints the middle ∆I in the petrol
signal colour. The fai_web universe uses this same accent rule
for the F∆I and Ch∆In glyphs — Recl∆Im now follows it, so
the brand stays visually coherent across every F∆I surface.
Where it lands:
- Landing page: large DeltaMark (96 px) and BrandWordmark
(56 px) sit on a single row, the wordmark to the right of
the mark. The two together carry the brand identity that
a viewer sees first when opening the app.
- NavigationRail leading: the muted 'Recl∆Im' Text line is
replaced with the petrol-accented BrandWordmark (18 px),
keeping the vendor tag 'F∆I' as a small muted line under it.
widget_test.dart adapts: the literal 'Recl∆Im'-find no longer
matches because the wordmark is now three text spans, so the
test checks for BrandWordmark by type — equivalent assertion,
robust to glyph-level splits.
Signed-off-by: flemming-it <sf@flemming.it>
The legend below the heatmap used four full prose paragraphs at
all times — visually it claimed about a quarter of the heatmap
page's height while the plot itself was the actual artefact.
Now the legend defaults to a single-line header strip:
Legende ↔ Schaden ↕ Nutzen ● Betroffenheit
◐ Evidenz-Stufe ⌄
Tap anywhere on the strip and an AnimatedSize transition opens
the full _LegendRow descriptions (180 ms). Same content, hidden
until asked for. The Expanded(heatmap) above reclaims the
height — concretely on a 900 px window the plot grows from
~420 px to ~600 px tall, which is what makes hover-targeting
the smaller points actually comfortable.
Signed-off-by: flemming-it <sf@flemming.it>
Three small frictions a first-time reader hit at the same time,
fixed in one pass:
1. The TierBadge said 'T1' without context. Default form is
now 'T1 · amtlich' / 'T2 · Verband' / 'T3 · Erhebung' /
'T4 · Signal'. Compact form (heatmap chip wrap) keeps the
bare code. Tooltip spells out the long form + cites the
Regel der niedrigsten Stufe (Studie §6.7) so the meaning
of the cap is at hand on hover.
2. The Legende's tier row was the abstract one of the four —
it now inlines all four stage names (amtlich / Verband /
Erhebung / Signal) and explains why a single T4 component
drags a whole figure to T4. No more 'what is Tier?' on
screen.
3. The DemoBanner repeated 'Tier T4' without explaining what
T4 is. Now: 'qualitatives Signal — bis NKR/Verbands-
Pipeline + Juristen-Approval laufen'. The cause-and-cure
is visible at a glance.
4. The NavigationRail leading column showed only 'F∆I' as
brand mark. Now shows 'Recl∆Im' prominently (petrol-signal,
bold) with 'F∆I' as a small muted vendor tag below.
Product first, vendor second.
EvidenceTierLabel extension grows a new 'headline' getter for
the one-word default ('amtlich'/'Verband'/…), and 'description'
gets longer, source-naming text (NKR / DESTATIS / DIHK / IHK /
ZDH / BDI). Code paths that used the old short-only badge keep
working because 'short' still returns 'T1'.
flutter pub get refreshed against chain_client_sdk 0.18, which
the fai_chain agent confirmed already carries the gRPC-Web
channel — no SDK bump needed for the web-hub-mode wire.
Signed-off-by: flemming-it <sf@flemming.it>
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 <sf@flemming.it>
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 <sf@flemming.it>
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 <sf@flemming.it>
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 <sf@flemming.it>
Window title and menu bar now read 'Recl∆Im — Pflicht-basierte
Wirkungsanalyse' instead of just 'Recl∆Im'. The product name
alone said nothing about what the app does; the tagline ties
the brand to the Studie's methodische Kernaussage in the
fenster-chrome itself — that's the line a reviewer will see
on screenshots, AG-Folien, Dock-Tooltips.
Signed-off-by: flemming-it <sf@flemming.it>
serve-web.sh builds the release web bundle and serves it via
python3's stdlib http.server on http://127.0.0.1:8080, so an
AG reviewer can click a link instead of being asked to install
Flutter to see the demo.
RUN.md grows three new sections:
- Web-Variante: single-command local serve, scope (mock works
1:1, hub mode pending gRPC-Web in chain_client_sdk_dart).
- Production deploy path: Hetzner-CX + Caddy, DNS
reclaim.flemming.ai — matches the existing F∆I Hetzner
pattern documented in fai_chain release-host.
- Hub-Smoke-Test: how to verify the new HubRepository.list()
wiring against a separately-running 'chain serve'
(Hub-Reiter → Verbindung testen → flow.completed events
populate the Heatmap-Tab once chain run has been invoked
and the approval gate is cleared).
Signed-off-by: flemming-it <sf@flemming.it>
Replaces the Phase-0 placeholder (returns const []) with a real
event-log reader. When the app starts in hub mode and the hub
is healthy, list() now:
1. Calls HubClient.eventLog(types: ['flow.completed']) over
gRPC (up to 200 most recent events).
2. Decodes each event's detail JSON as the Recl∆Im output bag
produced by flows/durchstich-gewo-14.yaml — keys: norm,
skm, benefit, frust, cohort, duties.
3. Skips events from other flows (detected by absence of
norm + skm keys). One hub can serve many flows; only
Recl∆Im-shaped runs surface here.
4. Sorts by skmEurPerYear DESC, matching MockRepository's
'most-harmful first' ordering — UI behaves identically
across the mock-vs-live switch.
Field mapping (tolerant on absence, defaults documented):
norm.eli / title / jurabk / paragraph / paragraphs[]
-> Norm
skm.total_eur_per_year, skm.tier_lowest -> skmEurPerYear, tier
benefit.total -> benefitScore
frust.composite_frust -> frustScore
cohort.count -> affectedCount
cohort.source + .tier -> first Source entry
duties.duties[] -> List<Duty>
event.eventId -> auditEventId
event.timestamp -> norm.standDate
byEli() walks the same list once; for small per-norm caches we
defer batching to Phase 2.
Empty list = honest state: 'hub connected, no Recl∆Im flow
runs yet'. Caller decides how to render that (HeatmapPage
currently shows an empty grid; a clearer 'chain run flows/'-
hint lands in the same pass as the demo-banner reorganisation).
Signed-off-by: flemming-it <sf@flemming.it>
Each of the five fixture Evaluations now carries a notes field
that breaks the lowest-tier-rule (Studie §6.7) into its four
SKM components (Population, Frequenz, Tarif, Zeitaufwand) and
names which one is the bottleneck. Tier markings stay
conservatively T4 on the surface — what changes is that a
reviewer reading the norm-detail panel now sees:
- which Komponenten are real T1 numbers (DESTATIS-derived P,
Verdiensterhebung-T) vs. where the demo extrapolates
- which Komponenten still wait on NKR-Validierung (mostly h)
- the political bottom line per norm: GewO §14 needs an
NKR-h-Wert; KassenSichV is largely documented; DSGVO Art.30
is EU-bound, reform-Hebel sits in Brüssel; BauO Bln §60 is
Land-domain without Bundes-NKR support; MiLoG §17 is under
Bürokratieentlastungsgesetz-IV-Bewegung.
No data-model change. Same fixtures, more honest reading.
Signed-off-by: flemming-it <sf@flemming.it>
The macOS window title and the application menu bar (About / Hide
/ Quit) were rendering 'reclaim_app' — the technical bundle name —
because Info.plist only carried CFBundleName from $(PRODUCT_NAME).
CFBundleDisplayName takes precedence for everything the user sees,
so adding it pins the product name independently of the binary
filename. The .app is still reclaim_app.app on disk; the title bar
now reads Recl∆Im.
Signed-off-by: flemming-it <sf@flemming.it>
Replaces the [PLACEHOLDER] entries in the Recht-Tab with the
real legal-entity data published on flemming.ai (single source
of truth across F∆I surfaces):
- Anbieter Dr. Stefan Flemming, Flemming.IT, freiberuflich
- Anschrift Dardanellenweg 41, 12109 Berlin
- Kontakt contact@flemming.ai, +49 30 66302929
- USt-IdNr. DE269393425 (§ 27a UStG)
- Verantw. Dr. Stefan Flemming (§ 18 Abs. 2 MStV)
- Hosting Hetzner Online GmbH, Gunzenhausen (AVV nach Art. 28)
- Logs max. 14 Tage
Also brings the wording in line with the current §-Lage:
- § 5 TMG / § 7 Abs. 1 TMG → § 5 DDG / § 7 Abs. 1 DDG
(Digitale-Dienste-Gesetz seit Mai 2024 — das TMG existiert
in der zitierten Form nicht mehr).
- Adds the standard 'Haftung für Inhalte', 'Haftung für
Links' und 'Urheberrecht'-Abschnitte des fai_web-Templates,
Letzterer verweist auf Abschnitt 3 (§ 5 UrhG amtliche Werke)
für die in der App dargestellten Norm-Texte.
Recl∆Im ist damit aus Recht-Sicht so weit, wie fai_web es ist —
und gleichermaßen reif für eine öffentliche Sichtbarkeit, sobald
Methodik-Beirat + Volljuristen-Approval-Kette stehen.
Signed-off-by: flemming-it <sf@flemming.it>
Recl∆Im now carries the six-section legal layer that any
public-facing duty-evaluation tool needs before either the
.app or the web build can go live to an audience beyond the
working group itself.
Sections, in the order a careful reader cares about them:
1. Disclaimer — keine Rechtsberatung, RDG-konform geframed,
T1–T4 Tier-Bedeutung explizit, Demo-Daten klar abgesetzt.
2. EU AI Act Art. 50 — Transparenz-Notice, klare 'kein
Hochrisiko-KI-System nach Anhang III'-Positionierung,
Human-in-the-Loop via system.approval@^0, Modell-Digest
im Audit-Log.
3. Quellen + Urheberrecht — § 5 UrhG-Hinweis für die
dargestellten amtlichen Werke, T1- und T2-Quellen-Liste,
Apache 2.0 für eigenen Code und Methodik.
4. Datenschutz — DSGVO Art. 13-Pflichtangaben, Hosting-
Provider-Platzhalter, Server-Log-Rechtsgrundlage Art. 6
Abs. 1 lit. f, Betroffenenrechte, Berliner
Aufsichtsbehörde.
5. Impressum — § 5 TMG + § 18 Abs. 2 MStV-Pflichtangaben
als Vorlage, ODR-Plattform-Hinweis.
6. Open Source — Apache 2.0, Repo-Link, Commit-Konvention.
Jede Section markiert deployment-spezifische Werte
(Anbieter-Adresse, Hosting-Provider, AVV-Stand,
Kontakt-E-Mail) als [PLACEHOLDER] und der Schlussabsatz weist
ausdrücklich darauf hin, dass eine Volljuristen-Prüfung vor
der ersten öffentlichen Veröffentlichung pflichtig ist.
Plumbing
- ShellPage gets a fifth NavigationRail-Destination 'Recht'
mit gavel-Icon.
- LegalPage scrollt mit ReclaimCard-Sektionen und nutzt
SelectableText überall, damit Reviewer-Zitate direkt
rauskopierbar sind.
- DemoBanner erweitert um 'KEINE Rechtsberatung'-Hinweis und
verweist auf den Recht-Reiter — der politische Disclaimer-
Pfad ist damit aus jeder Datenseite einen Klick entfernt.
flutter analyze: clean. flutter test: 2/2 grün. Web- und
macOS-Build laufen, Recht-Reiter rendert auf beiden Targets
identisch.
Signed-off-by: flemming-it <sf@flemming.it>
Adds the platform scaffolding flutter create produces for web
(web/index.html, manifest.json, favicon, icons). flutter build
web --release compiles the existing codebase to JS in ~16 s.
.metadata records the platform now lists web.
What works on web today:
- Mock-mode UI (the same five fixture norms, sorted,
inline-text-card, browser-open via launchUrl which becomes
'open in new tab' in the browser).
- All static screens (Heatmap, Normen, Methodik, Recht).
What does NOT yet work on web:
- Hub-mode gRPC. chain_client_sdk_dart uses package:grpc,
which in a browser needs the gRPC-Web wire format
(text/grpc-web+proto over fetch). The Ch∆In Hub speaks
gRPC-Web on the same port per docs/architecture/
protocol-surfaces.md, but the client SDK needs a small
web-channel branch to actually use it. Phase 1 task.
Why this matters: a single URL the AG can click is a different
political artefact than a downloaded .app. Web + macOS share
the same Recl∆Im codebase; nobody has to choose.
Signed-off-by: flemming-it <sf@flemming.it>
Adds the actual paragraphs of the law right next to the
evaluation panel on the norm-detail page. A reviewer no longer
has to leave the app to confirm what a score is about; the
canonical source URL stays one click away via 'Im Browser
öffnen' (url_launcher) and one click away as a clipboard copy.
Schema
models.dart gains a NormParagraph (number + text). Norm carries
a List<NormParagraph> paragraphs, defaulted to const [] so
norms harvested by text.akoma_normalize@^0 in live mode slot
in without breaking the Mock path.
Demo data
fixtures.dart embeds the public source paragraphs verbatim
under §5 UrhG (amtliche Werke) for the five pilot norms.
Plumbing
NormTextCard (lib/widgets/norm_text_card.dart) is the renderer:
per-paragraph hanging label, selectable body text, source URL
in mono at the bottom, two action buttons. NormDetailPage
drops the card between the metric row and the duties card so
the eye lands on it during a 'why this score?' read-through.
macOS sandbox
The Release entitlement file gains
com.apple.security.network.client so url_launcher's NSWorkspace
call and the HubRepository's gRPC channel can both reach the
network. The DebugProfile already had server; client matches
the production posture.
GeneratedPluginRegistrant.swift was re-generated by
flutter pub get after url_launcher was added — no hand edits.
flutter analyze: clean. flutter test: 2/2 passing. The macOS
build via build-macos.sh launches and the new card renders the
GewO § 14, KassenSichV, DSGVO Art. 30, BauO Bln § 60 ff and
MiLoG § 17 fixtures with their actual normative text.
Signed-off-by: flemming-it <sf@flemming.it>
Recl∆Im — the F∆I product line for Pflicht-basierte
Wirkungsanalyse und Reform-Vorschlags-Pipelines. Replaces the
working title 'Law-Heatmap', which described the demo view
rather than the platform. Heatmap, Norms list, Hub view,
Methodik are now four panes of the same Recl∆Im app.
Renames in this commit:
Flutter package lawheatmap_app -> reclaim_app
macOS bundle id ai.flemming.lawheatmapApp -> ai.flemming.reclaim
macOS PRODUCT_NAME lawheatmap_app -> reclaim_app
Theme tokens LawHeatmapColors/Space/Radius/Typography/Theme
-> Reclaim*
Surface card LawHeatmapCard -> ReclaimCard
Top-level widget LawHeatmapApp -> ReclaimApp
Theme files lawheatmap_theme.dart/lawheatmap_tokens.dart
-> reclaim_theme.dart/reclaim_tokens.dart
Widget file lawheatmap_card.dart -> reclaim_card.dart
Build script build-macos.sh paths and headline string
Docs MACHBARKEITSSTUDIE.md, METHODIK.md, RUN.md,
app/README.md, flow YAML
UI strings 'F∆I Law-Heatmap' / 'Law-Heatmap'
-> 'Recl∆Im' / 'Recl∆Im (F∆I)' for vendor-
prefixed contexts
flutter analyze: clean. flutter test: 2/2 passing.
The local working directory stays fai_lawheatmap/ for now —
the dir is referenced by the .claude project metadata; renaming
it would break session continuity for no real gain. The Forgejo
repo was renamed via API in the same change-set (fai/lawheatmap
-> fai/reclaim), with the legacy slug serving a redirect
courtesy of Forgejo's built-in rename handling.
Signed-off-by: flemming-it <sf@flemming.it>
The Ch∆In rename is months old and the AG audience never knew
the previous name. Calling out 'vormals …' in three places —
the study header, the glossary, and the About page — added
noise without informing anyone. Ch∆In stands on its own.
Signed-off-by: flemming-it <sf@flemming.it>
Repository.list() now hands the UI a list sorted by the harm
proxy (Studie §6 SKM-€/Jahr). Most-harmful first, deterministic
across launches and across mock-vs-hub repositories. Removes
the perceived non-determinism in the Norms list and gives the
heatmap chip-wrap a politically meaningful first row.
Signed-off-by: flemming-it <sf@flemming.it>
HubCapabilitiesCard wires HubClient.listCapabilities() into the
hub-status page below the connection form: once the app starts
in hub mode and the connection is healthy, the card shows
capability@version, the providing module, and its kind for
every entry the hub reports.
In mock mode the card prints an explanatory hint instead of
loading, so no confusing empty-state appears when the user is
just browsing the demo data.
A small refresh-icon next to the heading lets the user re-poll
without a full page reload — useful right after a chain install
in another terminal.
Signed-off-by: flemming-it <sf@flemming.it>
Adds a real Ch∆In hub backend to the Flutter client as a
sibling-path dependency on chain_client_sdk_dart, alongside the
existing MockRepository (which stays the default until the
flow.completed-to-Evaluation pipeline lands in Phase 0 week 1).
Wiring
HubSettings (lib/data/hub_endpoint.dart) — persists host /
port / secure / token / useHub flags via SharedPreferences
under the Studio-compatible hub.* keys. Distinct from the
SDK's chain.HubEndpoint, which is a transport-level value
type — HubSettings adapts in that direction.
HubRepository (lib/data/hub_repository.dart) — implements
EvaluationRepository on top of HubClient. connect() runs a
4-second healthy() probe; on failure returns a repository
with isHealthy=false rather than throwing, so the UI can
surface "hub-down" without an exception-handling round-trip.
list() / byEli() return empty data in Phase 0 because no
hub-side flow yet produces Evaluation objects in the
lawheatmap-specific shape.
main.dart — loads HubSettings on startup; if useHub=false
starts with MockRepository (fast offline default), otherwise
probes the hub and falls back to MockRepository on probe
failure. No mid-session swap to keep the Phase 0 wiring
simple; a settings save instructs the user to restart.
HubStatusPage — read-only summary card at the top, editable
endpoint form, "Verbindung testen" probe button, "Speichern"
persist button. Live-flow runbook below describes the
chain serve / install / run / approve sequence so a user
can wire the real flow themselves once Phase 1 lands.
flutter analyze: clean. flutter test: 2/2 passing.
Smoke-launch on macOS: app boots, Dart VM service comes up,
no runtime errors in mock mode.
Signed-off-by: flemming-it <sf@flemming.it>
METHODIK.md distils the methodological core of MACHBARKEITS-
STUDIE.md §3 + §6 into a Beirats-ready, PDF-able document that
stands on its own without Ch∆In implementation context.
Structure follows the eight non-negotiable methodological
decisions in the Studie:
1. Pflicht, nicht Gesetz, ist die Bewertungseinheit
2. 6-Schichten-Architektur (S1 Korpus, S2 Norm-Graph,
S3 Pflicht-Extraktion, S4 Bewertung, S5 Roll-up &
Attribution, S6 Heatmap-Output)
3. typisierter Norm-Graph mit Coupette-2021-Kanten-Schema
4. hybride Pflicht-Extraktion (regex + LLM, Cohen's κ ≥ 0,7)
5. Shapley-artige Attribution entlang Ketten
6. 4-Tier-Evidenz-Modell mit Regel-der-niedrigsten-Stufe
7. LLMs sind Mörtel, nicht Datenstein (RAG + Zitat-Pflicht)
8. Engpass-Variable h motiviert Verbands-Vorlauf
Includes Vorbilder-Tabelle (Coupette, QuantGov, NKR, REFIT,
RPC, ATR, Akoma Ntoso, LegalRuleML, ELI, Hohfeldian) und die
methodische Selbstbeschränkungs-Liste.
Versionierung: jede Methodik-Version markiert Altbewertungen
re-bewerten — historischer Wert bleibt, fließt aber nicht in
den aktuellen Heatmap-Stand ein, bis re-bewertet.
Lizenz: Apache-2.0 (gleiche wie Repo).
Signed-off-by: flemming-it <sf@flemming.it>
NOTICE lists the three SIL-OFL fonts the Flutter client bundles
(Space Grotesk, Inter, JetBrains Mono — fetched by app/setup.sh
from the upstream google/fonts repo) and the methodological
attributions that anchor the Studie: SKM (Normenkontrollrat),
the Coupette-2021 graph schema, QuantGov / RegData, Akoma Ntoso,
LegalRuleML, EU Better Regulation Toolbox, OECD iREG, UK RPC.
The Phase-0 demonstration corpus (five pilot norms in
lib/data/fixtures.dart) is also called out as plausibility-
graded approximation that is not NKR- or Beirats-validated —
the in-app banner shows T4 on every figure.
Signed-off-by: flemming-it <sf@flemming.it>
First end-to-end-buildable cut of the pflicht-/graph-basierte
Wirkungsanalyse von Rechtsnormen, running on Ch∆In. Demo runs
without external dependencies and without a hub connection so
the methodology + UI stack can be reviewed before any Verbands-
Kooperation or Beirats-Validierung kicks in.
Tree layout
MACHBARKEITSSTUDIE.md v0.3 — pflicht-basierte Methodik,
4-Tier-Evidenz, 8 law*-Module
auf Ch∆In statt der alten F∆I-
Plattform.
RUN.md one-page how-to-run.
flows/durchstich-gewo-14.yaml
vertical Phase-0 flow: pull →
normalize → duties → citations →
cohort → skm → frust → benefit →
attribution → system.approval.
app/ Flutter macOS client, design
language pulled from fai_web
(ink #08090A, paper #F4F3EF,
petrol signal #2E8F9E). Mock
repository ships five fixture
norms with real source URLs and a
permanent T4 demo-banner so no
figure can be mistaken for a
validated one.
Module repos (separate, see chain-modules*/):
text-akoma-normalize, text-deontic-extract, graph-citation-
extract, text-readability-score, stats-cohort-size, graph-
shapley-attribution, econ-skm-score, law-benefit-score.
What runs today
- flutter analyze: 0 issues
- flutter test: 2/2 (landing + nav-to-shell smoke)
- flutter build macos (via app/build-macos.sh) and ad-hoc
codesign, app launches and the Dart VM service comes up
- native cargo test green on every module
- cargo build --release --target wasm32-wasip2 produces a
130 KiB artefact for text-akoma-normalize
What is deliberately mock / stub
- gRPC wire from the client to a chain serve hub (Repository
abstraction is in place; live impl is the next step)
- NKR Bürokratiekosten-Datenbank ingestion (for the canonical
h-Werte that close out the Engpass per Studie §6.7)
- DESTATIS GENESIS-API adapter for stats.cohort_size
License: Apache-2.0. Author/contact in MACHBARKEITSSTUDIE.md.
Signed-off-by: flemming-it <sf@flemming.it>