Skip to content

Decision log

Not fully verified against the current code

These are maintained by hand and can drift from the actual code. Check the referenced code before relying on a specific claim.

# Title Status Summary
0001 Agents and tools Accepted Generation and retrieval both run through ai_agents; on follow-ups, retrieval is a real tool call the agent's LLM chooses to make, except the first turn, which the module forces directly.
0003 Event subscriber bridge Accepted An event-subscriber bridge injects the citation contract and captures tool results without driving the agent loop directly.
0004 Forced index required Accepted An agent must have a forced, hidden rag_search index; an LLM-pickable index is a prompt-injection risk.
0005 No-answer guarantee paths Accepted The JSON path is deterministic on no sources; the SSE path relies on the citation contract because tokens may already be in flight.
0006 Agent decides freshness Accepted The agent itself decides whether to re-retrieve on a follow-up, instead of a separate freshness-check LLM call.
0007 Runner id log correlation Accepted-stopgap Log/trace correlation uses a runner UUID set before the run and captured once afterward, until ai_agents exposes caller-supplied tags.
0009 Front-end contracts Accepted Blocks are cacheable static shells; markup attributes, CSS scoping, and JS dispatch path are load-bearing contracts.
0011 Citation finalization Accepted The Sources list only ever shows what the generated text actually cited, renumbered to close the gaps.
0012 Langfuse trace open timing Accepted generate() opens a Langfuse trace best-effort before running the agent, so captureIds() has something to correlate afterward.
0013 Entity cap skips rather than breaks Accepted The entity cap skips chunks of new entities past the limit but keeps chunks of already-included entities, instead of stopping the loop outright.
0014 Reference links prefer a configurable field over canonical Accepted An optional per-agent field name lets a reference link cite an entity's original external source instead of this site's copy, falling back to canonical when unset.

Template

New ADRs use a MADR-lite format:

# NNNN Title

## Status
Accepted / Accepted-stopgap / Superseded by NNNN

## Context
What forces made a decision necessary.

## Decision
What was decided.

## Consequences
What this makes easier or harder; what it rules out.

Rule

A new architectural choice requires a new ADR added in the same commit as the code that makes it. An ADR with no defended alternative design, that only describes an acknowledged limitation tracked against an upstream fix, belongs in known-gaps.md instead (ADR 0008 was moved there for this reason).