# Reported issues for ris

Pod holds 19 of 22 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to [ris](/mcp/ris).

## Most discussed

### fix(ui): chatgpt — pagination aus dem widget + csp-badge

Zwei Befunde aus der Live-Messung des Trefferlisten-Widgets (2026-08-02, ChatGPT Developer Mode, PR #59):

1. **Pagination aus dem Widget wirkt in ChatGPT nicht.** Klick auf „Weiter ›" ließ die Liste unverändert (claude.ai: funktioniert einwandfrei, Seite 2 lädt live). Hypothesen, in Prüf-Reihenfolge: (a) ChatGPT erlaubt Widget-initiierte `tools/call` nur für Tools mit `openai/widgetAccessible` bzw. `_meta.ui.visibility`-Freigabe → Registrierung prüfen; (b) ChatGPT liefert auch im `callServerToo

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/60) · 2026-08-02 · closed · 3 comments

### spike(ui): rendering gate claude.ai/chatgpt

**WP0 · Gate für die gesamte MCP-Apps-Initiative** (Follow-up zu #23, Research-Update 2026-08-01)

## Ziel

Beweisen (oder widerlegen), dass ein Custom-Connector-Widget in unserem Setup stabil rendert — **bevor** Produktiv-Code entsteht. Wegwerf-Code auf einem Spike-Branch, keine Build-Pipeline.

Hintergrund: Der Blank-Widget-Bug für Custom-Connector-UIs in claude.ai ist offen und launisch (kanonischer Tracker: [anthropics/claude-ai-mcp#165](https://github.com/anthropics/claude-ai-mcp/issues/165

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/45) · 2026-08-01 · closed · 3 comments

### feat(ui): dokument-viewer-widget

**WP7 · Das zweite Widget: Dokument-Viewer mit §-Navigation (Release 2)** (MCP-Apps-Initiative, siehe #23)

## Ziel

§-Outline links, Dokumenttext rechts, Nachladen beim Scrollen — auf dem `ui/shared/`-Fundament aus dem Trefferlisten-Widget.

## Scope

- Zweites Widget `ui/viewer/` mit eigener `ui://ris-mcp/viewer`-Resource (Build-Pipeline trägt es ohne Umbau); `_meta.ui.resourceUri` an `ris_dokument`.
- Erst-Render aus dem normalen Tool-Result (der Text-Block bis 25k ist ja da), dann Outline + 

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/52) · 2026-08-01 · closed · 2 comments

### chore(release): v1.6.0 live-pass + release

Abschluss des v1.6.0-Milestones (Muster: #50). Implementierung komplett — #83 (PR #85), #84 (PR #86), #53 (PR #87) gemerged. Vor dem Tag steht der manuelle Live-Pass (Tunnel + Dev-Connector; iframes nehmen keine Automation-Klicks).

## Live-Pass-Checkliste (claude.ai + ChatGPT)

**Datumswahl (#84):**
- [ ] Datum setzen/ändern/leeren bei `ris_bundesrecht`/`ris_landesrecht` — Re-Issue korrekt, Liste rendert
- [ ] Mid-Edit-Verhalten: feuert Chrome `change` mit `''` beim segmentweisen Löschen eines 

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/88) · 2026-08-04 · closed · 1 comment

### feat(viewer): fullscreen display mode — chatgpt-höhe ist host-diktiert

Follow-up aus dem v1.5.0-Live-Pass (2026-08-02): Der Viewer übernimmt in ChatGPT die vom Host gemeldete Container-Höhe (geclamped 320–1200px) — funktional korrekt, aber auf großen Monitoren wirkt das Lesefeld klein (Autor-Feedback). Der saubere Hebel ist der `fullscreen`-Display-Mode aus der ext-apps-Spec (`availableDisplayModes`, Design-Doc §3.6 — bewusst nicht in v1.5.0 gebaut, §9-Q5 unbeantwortet: ob einer der Hosts ihn anbietet, ist ungemessen).

Scope-Skizze: Feature-Detection auf `availabl

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/80) · 2026-08-02 · closed · 1 comment

### refactor(formatting): tabellen- und br-gerechte separatoren in htmlToText

Follow-up aus dem #64-Review (nicht im v1.4.1-Patch): Die Block-Boundary-Separierung behandelt `<br>`, `<td>`, `<th>` wie Absätze — `<br>` wird zur Leerzeile, jede Tabellenzelle zum eigenen Absatz (Zeilengruppierung geht verloren; relevant für BGBl-Gebühren-/Satztabellen). Kein Regress (vorher klebten die Zellen — das war Bug #64), aber Informationsverlust bei Tabellenstruktur.

Vom Reviewer skizzierte Ziel-Form: `$('td, th').after(' ')` (Space statt Absatz), `tr` trägt den Break, `$('br').repla

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/65) · 2026-08-02 · closed · 1 comment

### feat(ui): trefferlisten-widget v1

**WP4 · Das erste Widget: paginierte Trefferliste für alle 11 Suchtools** (MCP-Apps-Initiative, siehe #23)

## Ziel

Interaktive Trefferliste (Vanilla TypeScript, kein Framework — kleinstes Bundle) auf Basis des `structuredContent` aus WP2. Ein Widget bedient alle 11 Suchtools.

## Scope

- `App.connect()` + `ontoolresult`: Liste aus `structuredContent` rendern — Titel, `citation_display`, Applikations-Badge, aufklappbare Zeile mit Aktionen.
- Pagination: „Weiter/Zurück“ → `app.callServerTool(qu

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/49) · 2026-08-01 · closed · 1 comment

### feat(ui): register mcp app resource + tool meta

**WP3 · Server-Seite der MCP-Apps-Integration** (MCP-Apps-Initiative, siehe #23)

## Ziel

Widget-Resource registrieren und die 11 Suchtools UI-fähig machen — `ris_dokument` bleibt in diesem Schritt unangetastet.

## Scope

- Dependency `@modelcontextprotocol/ext-apps` (^1.7.5; Peer `sdk ^1.29.0` — unser ^1.30.0 erfüllt das, Kompilierung unter NodeNext verifiziert; der bekannte .d.ts-Bug ext-apps#704 betrifft nur den `app-bridge`-Subpath, den nur Hosts brauchen).
- `registerAppResource` für `ui:

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/48) · 2026-08-01 · closed · 1 comment

## Most recent

### perf(dokument): includes-prefilter vor scopeRisContent gegen den vierten cheerio-parse

Follow-up aus dem #94-Final-Review (2026-08-06): `scopeRisContent` parst jedes Dokument-HTML einmal zusätzlich (der vierte cheerio-Parse pro Load, ~33 % Parse-Mehrkosten, worst case ~600-KB-Statute) — auch auf dem Pass-through-Pfad, den die überwältigende Mehrheit der Calls nimmt.

**Fix (beweisbar sicher):** `if (!html.includes('documentContent')) return { html, pageTitle: null };` als erste Zeile in `scopeRisContent` (formatting.ts) — ein Klassen-Attribut kann ohne den Substring nicht matchen.

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/103) · 2026-08-07 · open · 0 comments

### feat(viewer): rail-aria-current folgt dem scrollen, nicht nur spruengen

Follow-up aus dem #80-Review (2026-08-06): `aria-current` auf den Gliederungs-Einträgen wird nur von `focusAfterJump` gesetzt — also bei Rail-Klicks und Re-Anchor-Renders. Scrollt der Leser in eine andere Sektion, highlightet die Rail weiterhin die zuletzt *geklickte*. Der `onScroll`-Handler aktualisiert `anchorOffset` bereits (debounced, für den Snapshot), rendert aber bewusst nicht.

**Fix-Skizze:** beim debounced Anchor-Update das `aria-current` gezielt umsetzen (targeted DOM-Update, kein vol

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/102) · 2026-08-07 · open · 0 comments

### a11y(viewer): persistente live-region statt best-effort role=status

Follow-up aus dem #92/#93-Review (2026-08-06): Das Lade-Feedback („Abschnitt lädt …", `.ris-doc-loading`) und das Replace-Skeleton tragen `role="status"`, werden aber als Knoten **mit bereits gesetztem Text eingefügt** — Live-Regions werden von Screenreadern nur zuverlässig angesagt, wenn die Region *vor* der Inhaltsänderung im DOM steht. Sehende Nutzer sehen das Feedback, SR-Nutzer vermutlich nicht.

**Fix-Skizze:** eine persistente, leere Live-Region in der Viewer-Shell (view.ts/index.html), i

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/101) · 2026-08-07 · open · 0 comments

### feat(viewer): prefetch-margin erhöhen + sichtbares abschnitt-lädt-feedback

Live-Pass-Befund (#88): Zwischen Scroll-Ans-Ende und erscheinendem Abschnitt liegen in claude.ai 10–15s Host-Call-Latenz — ohne sichtbares Feedback wirkt das wie Stillstand.

- **Prefetch-Margin** des IntersectionObservers von 600px auf einen Wert erhöhen, der die Latenz beim normalen Lesen versteckt (z. B. 2.000px; messen statt raten — Harness-Szenario mit delayMs).
- **Lade-Zustand am Sentinel** sichtbar machen („Abschnitt lädt …“, deutscher Copy-Stil aus `states.ts`/`copy.ts`), damit Warten a

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/93) · 2026-08-05 · closed · 0 comments

### feat(viewer): outline eager beim mount laden statt scroll-gated

**Größter UX-Hebel aus dem v1.6-Live-Pass (#88, 2026-08-05):** Bei Dokumenten, deren Outline das Mount-Budget sprengt (konsolidierte Gesetze — DSG: 157k Text, 22k Outline), erscheint die Gliederungsleiste erst, nachdem der Leser durch die kompletten ~25k Mount-Zeichen gescrollt hat (Sentinel sitzt am Textende) plus Host-Call-Latenz (claude.ai: 10–15s). Genau bei den Dokumenten, wo die Rail am wertvollsten wäre, ist sie praktisch unsichtbar.

**Fix-Skizze:** Den ersten Abschnitts-Call (Offset 0 —

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/92) · 2026-08-05 · closed · 0 comments

### feat(ui): „Rechtslage am …“-datumswahl für bundesrecht/landesrecht

**WP2 des v1.6.0-Milestones** (Design lokal: `.superpowers/sdd/v160-plan/v160-design-facetten.md`, von Phil abgenommen 2026-08-04). Herausgelöst aus #53.

Natives `<input type="date">` mit Label „Rechtslage am“ im Trefferlisten-Header, sichtbar nur wenn `query.tool` `ris_bundesrecht` oder `ris_landesrecht` ist. Datum ändern → Re-Issue des Query-Echos mit neuem `fassung_vom` und `seite`-Reset auf 1; Datum leeren → Re-Issue ohne `fassung_vom` (RIS-Default = geltende Fassung). Während eines laufend

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/84) · 2026-08-04 · closed · 0 comments

### fix(ui): reopen-restore — 'Unerwartete Daten'-Notice bei nutzlosem host-global toolOutput unterdrücken

Live-Befund aus dem #60-Pass (2026-08-02): Beim Reopen einer ChatGPT-Conversation stellt das Widget die letzte Seite korrekt aus `widgetState` wieder her, zeigt aber zusätzlich „Unerwartete Daten erhalten. Die angezeigte Seite bleibt unverändert." — ChatGPT replayed ein nicht-parsebares `toolOutput` (`source: 'host-global'`), und `presentFromHost` unterdrückt bei aktivem Restore nur `source === 'missing'`.

Im #69-Review exakt so als parked minor vorhergesagt. Fix-Skizze: bei `restored === true`

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/72) · 2026-08-02 · closed · 0 comments

### fix(dokument): RIS Vorlese-Dubletten (sr-only) verdoppeln jeden Gliederungsmarker im Volltext

Live-Befund von Phil (2026-08-02, Prompt «Zeig mir § 1295 ABGB in der geltenden Fassung»): `ris_dokument` reicht die RIS-Barrierefreiheits-Duplikate ungefiltert durch — jede Gliederungseinheit erscheint doppelt («(1)Absatz eins,», «§ 1295.Paragraph 1295,»), und Metadaten kleben ohne Trenner aneinander («KurztitelAllgemeines bürgerliches Gesetzbuch»).

**Ursache (am echten NOR12019037-HTML verifiziert):** RIS markiert die Vorlesefassung mit `<span class="sr-only">…</span>` neben den sichtbaren `<

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/64) · 2026-08-02 · closed · 0 comments

### docs(tools): Agents zu titel/paragraph statt suchworte leiten; ABGB-Querverweis bei Gewährleistungs-Suchen fehlt

Zwei Produkt-Findings aus den Live-Tests am 2026-08-01 (claude.ai + ChatGPT über Custom Connector, Query «Gewährleistung»):

1. **Volltextsuche ertrinkt:** `suchworte="Gewährleistung"` liefert 3.337 Treffer, von der RIS-API alphabetisch nach Gesetzestitel sortiert statt nach Relevanz — oben stehen Beschußverordnung und Zinsertrags-Abkommen. Beide Modelle (Opus in claude.ai, GPT in ChatGPT) griffen reflexhaft zuerst zu `suchworte`. Vorschlag: Tool-Description von `ris_bundesrecht`/`ris_landesrech

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/54) · 2026-08-01 · closed · 0 comments

### feat(ui): facetten-chips + fassung-datum

**WP8 · Backlog: Ausbaustufe der Trefferliste — unabhängig, kann vor oder nach dem Viewer laufen** (MCP-Apps-Initiative, siehe #23)

## Scope (Grobschnitt, wird beim Anpacken verfeinert)

- **Judikatur-Facetten-Chips** über der Trefferliste (Gerichtsbarkeit, Gericht, Rechtssatz/Entscheidungstext, Rechtsgebiet): Chip setzen/entfernen → verfeinerter Aufruf desselben Suchtools über das Query-Echo. Reine Widget-Erweiterung, kein Server-Umbau.
- **„Rechtslage am …“-Datumswahl** im Widget-Header für `

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/53) · 2026-08-01 · closed · 0 comments

### feat(dokument): chunk-api + document cache

**WP6 · Server-Fundament für den Dokument-Viewer (Release 2)** (MCP-Apps-Initiative, siehe #23)

## Ziel

Große Dokumente in Abschnitten ausliefern, ohne pro Abschnitt einen vollen RIS-Fetch zu bezahlen — und ohne den bestehenden `ris_dokument`-Textpfad anzufassen.

Hintergrund: Heute stirbt der geholte Volltext im Handler-Scope (kein Cache, nirgends); `truncateResponse()` gibt nur den gekürzten String zurück (keine Offsets, keine Gesamtlänge, `CHARACTER_LIMIT` nicht exportiert). Ein naiver Chun

[Read the thread](https://github.com/Honeyfield-Org/ris-mcp-ts/issues/51) · 2026-08-01 · closed · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/philrox/ris-mcp-ts/issues).
