GData Server — Todo

Bugs / Issues to Fix

• Codeblock rendering bug: codeblocks with a lang attribute render as empty grey boxes in the notes viewer (gdata-browser). The underlying data is correct; fix belongs in the viewer, not the server.

Para bullet items not on separate lines: In the notes viewer, bullet items within a single para block (separate strings in the array) are rendered run-on rather than on separate lines. Visible on e.g. README/runnable in the Execution Model and Features sections. Fix belongs in the viewer rendering of para arrays.

Batch/patch apostrophe encoding bug: A batch call fails when block content contains an apostrophe (e.g. I'll). The ops parameter parser appears to do fragile JSON handling — likely shell-unescaping or double-decoding. Reproduce by passing a block with a plain apostrophe in a string value.

Cell name label low contrast in runnable sheet: The cell header strip is light blue-grey (#ECF0F7) but the cell name label has no explicit foreground colour, so it renders in a near-matching system default and is hard to read. Fix: set an explicit dark foreground colour (e.g. wx.Colour(30, 40, 70)) on self.name_label in sheet_ui.py.

Process / Maintenance

Review STATE_OF_PLAY scope: STATE_OF_PLAY is titled as storage architecture but includes an Optical RX Status section. Move that section to a domain-specific note or rename/split the note if it is intentionally broader.

MCP interface improvements: Findings from hands-on MCP tests are recorded in gdata-server/todo/mcp-interface-improvements.

JSONHTL documentation improvements: Assessment and recommended doc/linter improvements are recorded in gdata-server/todo/jsonhtl-documentation-improvements.

Re-evaluate read-on-trigger cadence (August 2026): The TRIGGERS note currently uses a freeform cadence — agents act on a trigger whenever they recognise it, with no fixed checkpoints. Assess in August whether this is working in practice (across Claude, Codex, Envoy) or whether fixed checkpoints (e.g. read-the-map before-execute and before-commit, tied to the SCP phases) give more reliable rule-reading. Decide then whether to keep freeform or switch.

Source control for live gdata-server: ~/py/gdata-server on gravlax is not a git checkout. Identify the upstream repository and apply patches/gdata_oauth_codex_mcp_oauth_20260528.patch there. Details are in gdata-server/mcp-server.

Notes written in isolation: Notes have been created without updating parent pages or adding cross-links. Need a proactive convention: whenever a note is created or significantly updated, immediately check and update parent/related notes. See README/orphaning.

Periodic reconciliation via Envoy: Cron job sends a short mail to Envoy saying something like: "Scan the notes system and look for inconsistencies — stale status, missing links, orphaned pages, outdated todos. Correct what you can directly; send a mail to ask about anything that needs a decision." No bespoke scanner needed; Envoy already has notes access and can reason about what it finds.

Feature Requests / Enhancements

Backlink index: No way to find which notes link to a given key. A backlinks <key> query (even read-only, no auto-update) would make rename maintenance and impact analysis tractable. Currently requires manually reading all candidate parent notes.

Pretty visualisation / graph view: Add a visual graph of note links (inspired by Obsidian's graph view). Nodes = notes, edges = links. Useful for navigation and spotting orphans. Could be a panel in gdata-browser or a standalone HTML artifact.

Tag-based retrieval: Tags are stored but there is no keys by-tag <tag> query. As the note count grows past ~300 the flat key list becomes hard to navigate. A tag filter on the keys endpoint would allow targeted retrieval without scanning everything.

Return block IDs from get by default: Structured edits via batch or patch require block IDs, yet they are only returned when include_block_ids=True is passed. Since the docs explicitly recommend ID-based over index-based ops, IDs should be returned by default (or always) to eliminate the extra round-trip before every edit.

Version-change summary field: The README pattern if you already know version N, skip this relies on the reader knowing what changed. A short changed string field per document (e.g. "changed": "added megadoc trap section") would let an LLM decide whether to re-read without doing so, making the version-skip optimisation actually work.

Runnable sheet input fields fillable via control API: Currently sheet.inputs.set only works on input fields declared via input_prompts in the codeblock spec. Input fields that appear at runtime via input() calls cannot be pre-filled or submitted through the control socket. Both cases should be settable via the API so that runnable sheets can be driven programmatically without manual interaction.

MCP Patch / Agent Editing Improvements

Plain get(key) response issue in ChatGPT: get(key) without include_block_ids succeeds but returns an empty resource in the ChatGPT connector, while get(key, include_block_ids=true) returns the full document. Investigate the plain-get response rendering/resource path. This may be a connector rendering issue rather than a storage issue.

Make batch reliable from ChatGPT: batch is the documented safest path for multi-step edits, but it failed from ChatGPT at dispatch/resource resolution rather than with a Notes-level error. Fixing this should be high priority because it enables atomic edits with if_rev and block IDs.

Clarify patch as single-op convenience and batch as preferred multi-op path: Document patch for simple one-shot edits and batch for coordinated edits, especially when metadata needs updating in the same logical change.

Improve patch payload validation and errors: Reject invalid op/argument combinations early with structured errors such as {code, message, expected, got, example}. Make it obvious which fields are required for each op (block, block_id, index, fields, etc.).

Reduce fragile JSON/string reparsing: Only unwrap JSON-encoded strings for block, fields, or ops when the incoming value is actually a string. Prefer native JSON objects from MCP callers. This should help avoid apostrophe/double-decoding problems.

Return richer success data from edits: Successful patch and batch calls should return at least the new rev, changed/inserted block IDs, and ideally the changed block or a compact summary. That makes verification easier for agents.

Add dry_run support: A dry_run: true option for patch and batch would let agents validate a change without applying it, useful when editing large or important notes.

Add simple convenience operations: Consider agent-friendly helpers such as append_para, append_heading, or auto_update_meta. Example: append a paragraph while automatically incrementing version and setting updated to today. This avoids forcing callers to construct full JSONHTL for common append-only notes.

Prefer IDs by default for edit workflows: Since safe patching requires stable block IDs, either return block IDs from all get calls by default or add a dedicated get_for_edit(key) convenience endpoint that always returns {document, rev, block_ids}.

Platform compatibility testing: ChatGPT previously blocked at least one replace_block call before it reached the server, while append_block succeeded. Test aliases or alternate operation names such as update_block if the safety layer continues to interfere with otherwise harmless note-editing operations.

Completed

• 2026-05-28: Generalized MEMORY for all LLM assistants, added MEMORY/claude and MEMORY/codex, refreshed the historical Envoy status wording, split README/tools into a tooling index plus README/command-line-tools and README/mcp-tools, normalized CLI codeblocks, updated current gdata-server deployment summary, and cleaned up the duplicate Future heading.

Private notes instance: Add a second notes_web.py / gdata-server instance on a separate port (e.g. 8022) serving a private key namespace. Should share the same OAuth auth layer as the existing instance (port 8021). Key design questions: separate database file vs. key prefix separation within the same DB; how the notes browser selects which instance to connect to.

version 15  ·  updated 2026-06-22