Skip to content

lode v1.3.0

Choose a tag to compare

@github-actions github-actions released this 09 Aug 06:00
· 615 commits to trunk since this release

Ask-screen readability, offline search, and tool-augmented Q&A (lode-35nu)

The Ask experience gets citations you can actually follow, a non-AI quick search that works
without a model call, and — behind the sub-epic below — the ability to consult external
sources mid-answer.

  • Every citation now resolves to a real note identity (note id + title), not a bare version id (lode-35nu.1)
  • Cited results group by note and render surrounding context with the quoted span highlighted (lode-35nu.3)
  • Jump straight from a cited result to the note it came from (lode-35nu.4)
  • A live spinner and in-flight status replace the static "Thinking…" placeholder (lode-35nu.5)
  • Browse: non-AI quick search over your notes via the FTS5 index (lode-35nu.6)
  • Fix: selecting a tag on the Tags screen no longer filters out every note (lode-35nu.7)
  • Fix: the related-notes panel no longer swallows the edit cursor line when it expands (lode-35nu.10)
  • Spike: confirmed faithfulness.py's word-boundary tokenization is good enough to keep (lode-35nu.8)
  • cli.py refactored into src/lode/cli/** as dispatch-only (lode-35nu.9)
  • Empty tables across the TUI use LodeDataTable.empty_message instead of a blank grid (lode-ligf)
  • Recorded the deliberate wont-do on per-claim LLM annotation in the answer schema (lode-35nu.12)

Tools for Ask: read-only external query, snapshot-then-cite (lode-35nu.11)

Ask can now reach read-only external sources mid-answer, snapshot what it read, and cite the
snapshot — so an answer stays verifiable after the source changes or disappears.

  • Read-only JIRA, Confluence, and web query tools exposed to the Ask path (lode-8hsk)
  • Snapshot-then-cite: a live tool result is persisted as an external snapshot before synthesis (lode-35nu.11.1)
  • Tool-augmented Ask wired through the production cited_answer.ask path, with gate-eligible tool snapshots (lode-8vvp)
  • "Ask about THIS note" — a per-note question entry point (lode-35nu.11.3)
  • Save an ask answer as a new note, linked to its source, on user confirmation (lode-35nu.11.4)
  • Multi-turn tool use on the LLMProvider seam (lode-35nu.11.6)
  • Schema plus the first migration mechanism for tool-call egress and discovered_via (lode-35nu.11.7)
  • Scope-level no_egress rules that cover not-yet-seen external sources (lode-35nu.11.8)
  • Design settled for identity, persistence, and egress under tool-augmented Ask (lode-35nu.11.5)
  • Fix: lode egress --purpose tool no longer rejects rows lode itself writes (lode-l87l)

Hardening around the new tool path

  • web_fetch SSRF: redirect-chain and DNS-rebinding gaps closed at the webfetch layer (lode-xwah)
  • Bounded where the model may point web_fetch (lode-ejfv)
  • Defenses against prompt injection via tool results steering later tool calls (lode-80bv)
  • run_tool_turns' max_tokens settled as a per-run budget (lode-3dh1)
  • Verified jira_search's endpoint against Atlassian's removal of GET /rest/api/3/search (lode-6nwu)

Features

  • lode reindex for the lexical (FTS5) index — notes saved before the lexical leg landed now surface in quick search (lode-x9lu)
  • Lexical coverage gaps are no longer silent: a reconcile step plus a lode status hint (lode-fd2g)
  • The enrichment inspector shows a note's externally-inherited tags (lode-f0m1)
  • Table empty-state moved onto LodeDataTable instead of a sentinel row (lode-t7pw)

Fixes

  • Search works for notes in any non-Latin script — build_match_query no longer drops non-ASCII text (lode-8irr)
  • Faithfulness coupling no longer lets a negated span couple by ignoring extra span tokens (lode-w2y7)
  • The coupling fast path no longer fails open on compound-identifier fragments (lode-1qxy)
  • A repeated quoted span highlights the right occurrence — Support carries a body offset (lode-hruz)
  • App-side Support.body_offset kept out of the LLM structured-output schema (lode-9nmk)
  • Pinned-note ask context is bounded and no longer re-sends the same parent block (lode-ol2v)
  • Dangling :func: docstring references after the _resolve_target rename repaired (lode-2hfd)

Internal / workflow

  • Citation identity and as-of resolution moved out of lode.tui into a shared read module (lode-kuc7)
  • cited_answer.ask batches target resolution into two IN(...) queries (lode-ekqh), re-cut as a whole-SQL {placeholders} seam with one shared placeholder builder (lode-oca9) over a shared batched polymorphic resolver (lode-r9z0)
  • cli._retrieve moved into lode.retrieval, closing the cross-package CLI seam (lode-z3es)
  • lode.cli.console seam collapsed to patch-where-used, removing the status.py special case (lode-1bfn, lode-nftw), with stale src/lode/cli.py pointers swept from source and tests (lode-1dmu, lode-j25e) and the console docstring/test cross-reference corrected (lode-gt5b, lode-tts0)
  • jobs_read.list_egress returns a NamedTuple instead of an 8-wide positional tuple (lode-kl1i)
  • New gate: Python :func: docstring refs must resolve to real symbols (lode-8oeu); docstringcheck's 81 standing wrapped-ref WARNINGs cleared so new ones are visible (lode-hg49)
  • Worktree isolation enforced by a PreToolUse hook rather than markdown checkpoints alone (lode-p8zl), with hook cwd verified under isolation (lode-lnvi) and the stale payload premise corrected in docs/decisions.md (lode-5ido)
  • Fix: a launch worktree deleted mid-session under /code fan-out no longer strands the agent on trunk (lode-6wgc)
  • land_head/review_head validated as full 40-hex SHAs on write (lode-xdg3); the validate-sha40 call-site gate replaced its hand-maintained roster with a hazard-keyed corpus scan (lode-rby4)
  • /land: an all-bounced or empty-accepted pass falls through instead of letting the lock age out (lode-0jan); the four $STATE_DIR load sites share one missing-vs-empty policy (lode-dc4n); /sweep adopts the same loader (lode-3oik)
  • Re-entry table routes a land-review escalation needing an on-branch edit to ready-for-code-review (lode-2m93); stale review_head claims corrected (lode-8n4k) and the structurally-stale exit-(d) path fixed (lode-9b5n)
  • docs/decisions.md marker gate: catches **AMENDMENT ( (lode-125q) and all-caps RETRACTED/OBSOLETE/FALSIFIED/OUTDATED lead-ins (lode-bv9o); silent in-place rewrites now detectable (lode-rl6s) and the checker actually runs somewhere (lode-d7pm)
  • Test-suite consolidation: shared tool-turn Anthropic fake and stub Fetcher in conftest (lode-pw9o), remaining hand-rolled tool_use/text block sites swept onto it (lode-gyq3, lode-j5o1), the .claude markdown corpus glob and its cached fence-block parse hoisted into conftest (lode-2evf, lode-es1i), a flaky SHA-timing test stabilized under pytest -n 8 (lode-vaxe), and a stale PEP 649 eager-import rationale corrected (lode-t402)