Desktop Renderer Fixes — 2026-07-21

Follow-on to the 2026-05-29 renderer fixes. All in notes-browser/notes_browser.py, git branch m (commits 90ee18a and c3512da), pushed to GitHub and pulled on kelp + gravlax. Pomelo to be updated separately. Takes effect after a browser restart.

1. strong/em/italic inline spans leaked raw JSON

The inline renderers knew link/code/bold but not strong, em, or italic, so e.g. {"strong": "Name the phases"} printed as its raw Python dict repr (seen on proposals/structured-context-protocol). Fix: dispatch span types through a shared module-level INLINE_SPAN_TAGS lookup (strong/bold->b, em/italic->i, code->code) in both _render_inline_list (HTML) and _inline_text (plain text/selection). Adding a new inline type is now one table entry.

2. Metadata list values shown as raw repr

Metadata like tags rendered as ['chess', 'board'] in the footer and status bar. Fix: format_meta_value() joins list/tuple values as comma-separated text, used in both the HTML footer and the status-bar meta line. Brings the desktop renderer to parity with the web renderer's 2026-07-07 metadata-list fix (see gdata-server/todo completed items).

3. NotesDataSource.read dict vs JSON string

gdata_local returns a parsed dict; gdata_local_simple returns a JSON string. read() now handles both (parses str/bytes, passes dicts through).

4. Sprint-row table colouring

_render_table colours rows by sprint number (detects a Sprint / Sprint / Queue column, matches Sprint N case-insensitively, same sprint -> same colour on every cell), falling back to alternating stripes. Used for the Jira tickets table.

Tests

Added notes-browser/test_render_inline_table_read.py (40 headless, display-guarded tests) covering all four items, reviewed for completeness via ask_gpt (gpt-5.1). Also fixed test_notes_browser_control.py to run its in-process gdata server against a throwaway temp gdbm (tmp_path_factory) instead of the deployed .agent_notes.gdbm named in .gdata_server.yaml, so control tests no longer fail with GDataLockedError when a notes server is running. Full browser suite: 82 passed.

Follow-up

notes-browser/notes_browser_runnable.py likely has the same strong/em/italic and metadata-list gaps (the 2026-05-29 fixes were applied to both files). It has unrelated uncommitted WIP, so it was left untouched here — apply the same two fixes there when that WIP is resolved.

created 2026-07-21  ·  updated 2026-07-21  ·  tags gdata-browser, notes-browser, renderer, bugfix