diff --git a/src/central/adapter.py b/src/central/adapter.py
index 2a408b0..76ab04e 100644
--- a/src/central/adapter.py
+++ b/src/central/adapter.py
@@ -85,5 +85,16 @@ class SourceAdapter(ABC):
Return list[dict] (framework renders as a generic table; columns come from
the first dict's keys, in insertion order). Return None to skip preview.
Raise to surface an error banner — framework catches at the route boundary.
+
+ Contract:
+ - Preview is a pure function of `settings`. Do NOT access
+ self._config_store or cursor_db state — the framework may instantiate
+ adapters with a stub config_store solely to call this method.
+ - Network preview implementations must open their own short-lived
+ aiohttp session (the adapter's polling session may not exist; the GUI
+ process never calls startup()).
+ - Return None when preview is not meaningful (e.g., required settings
+ like region are unset). Return [] explicitly if the query ran and
+ matched zero rows — the framework renders that distinctly from None.
"""
return None
diff --git a/src/central/gui/templates/_adapter_preview.html b/src/central/gui/templates/_adapter_preview.html
index ff9ef0c..ab8a7f1 100644
--- a/src/central/gui/templates/_adapter_preview.html
+++ b/src/central/gui/templates/_adapter_preview.html
@@ -2,9 +2,10 @@