chore(types): annotate fifteen signatures mypy could not check

Twelve gain `-> None`, each confirmed by AST to contain no returning
`return` and no `yield` rather than by reading the name and assuming.
The three context-manager exits gain the canonical
type[BaseException]/BaseException/TracebackType argument triple.

Both files taking TracebackType needed the import, and inserting it
before the first import broke ruff's I001 — lint was exit 0 at the
baseline commit, verified by stashing this work and re-running, so that
breakage was mine. Fixed with `ruff check --fix` on the two files, which
placed the import in sorted position.

86 errors -> 75; no-untyped-def 29 -> 14.

Suite: 658 passed. The baseline was 657 passed with one failure in
test_tatlock_tool_call_logging_calculator, which asserts on the content
of a live model's reply. It passing here is nondeterminism, NOT evidence
this commit fixed anything, and it may fail again on the next run.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-08-20 00:18:35 +02:00
co-authored by Claude
parent 7c5fca06c3
commit eabf0f4a11
9 changed files with 33 additions and 15 deletions
+1 -1
View File
@@ -218,7 +218,7 @@ class DelegationTask:
result: str | None = None
task_id: str = ""
def __post_init__(self):
def __post_init__(self) -> None:
"""Generate task ID if not provided."""
if not self.task_id:
import uuid
+1 -1
View File
@@ -109,7 +109,7 @@ class StewardAgent:
(preferred) and Ollama (fallback) backends via direct API calls.
"""
def __init__(self):
def __init__(self) -> None:
"""Initialize Steward with backend selection based on availability."""
# Ollama config (primary)
self.ollama_host = str(config.OLLAMA_HOST).rstrip("/")
+3 -3
View File
@@ -36,7 +36,7 @@ class ToolCallTracker:
calls: list[str] = field(default_factory=list)
def log_call(self, message: str):
def log_call(self, message: str) -> None:
"""Log a tool call."""
self.calls.append(message)
@@ -155,14 +155,14 @@ class TatlockAgent(AgentInterface):
currently in Phase 1 (basic LLM integration without expert agents).
"""
def __init__(self):
def __init__(self) -> None:
"""Initialize Tatlock (lazy agent creation)."""
# Deps are a ToolCallTracker: every registered tool takes
# RunContext[ToolCallTracker], and run() is called with one. Saying so
# is what lets the tool registrations below type-check at all.
self._agent: Agent[ToolCallTracker, str] | None = None # Lazy initialization
def _ensure_agent(self):
def _ensure_agent(self) -> None:
"""Ensure the PydanticAI agent is initialized (lazy initialization)."""
if self._agent is not None:
return
+13 -2
View File
@@ -18,6 +18,7 @@ Usage:
"""
from contextvars import ContextVar
from types import TracebackType
def get_default_user() -> str:
@@ -142,7 +143,12 @@ class RequestContext:
self._conv_token = current_conversation.set(self.conversation_id)
return self
async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
async def __aexit__(
self,
exc_type: type[BaseException] | None,
exc_val: BaseException | None,
exc_tb: TracebackType | None,
) -> None:
"""Reset context variables on exit."""
if self._user_token is not None:
current_user.reset(self._user_token)
@@ -155,7 +161,12 @@ class RequestContext:
self._conv_token = current_conversation.set(self.conversation_id)
return self
def __exit__(self, exc_type, exc_val, exc_tb) -> None:
def __exit__(
self,
exc_type: type[BaseException] | None,
exc_val: BaseException | None,
exc_tb: TracebackType | None,
) -> None:
"""Sync context manager exit."""
if self._user_token is not None:
current_user.reset(self._user_token)
+8 -1
View File
@@ -9,6 +9,8 @@ Provides async embedding operations via Ollama API:
Adapted from library-desk patterns.
"""
from types import TracebackType
import httpx
from .config import config
@@ -72,7 +74,12 @@ class OllamaEmbeddingClient:
await self._get_client()
return self
async def __aexit__(self, exc_type, exc_val, exc_tb) -> None:
async def __aexit__(
self,
exc_type: type[BaseException] | None,
exc_val: BaseException | None,
exc_tb: TracebackType | None,
) -> None:
"""Async context manager exit."""
await self.close()
+1 -1
View File
@@ -57,7 +57,7 @@ class HouseholdRegistry:
3. Agent delegation (Phase 4)
"""
def __init__(self):
def __init__(self) -> None:
"""Initialize empty registry."""
self._members: dict[str, HouseholdMember] = {}
logger.info("household_registry_initialized")
+1 -1
View File
@@ -74,7 +74,7 @@ class MemoryService:
- Semantic recall: "What did I mention about X?" → Use Memory Agent
"""
def __init__(self):
def __init__(self) -> None:
"""Initialize memory service with lazy client loading."""
self._qdrant = None
self._embedding = None
+2 -2
View File
@@ -47,7 +47,7 @@ def log_tenant_guard() -> None:
)
def register_household_members():
def register_household_members() -> None:
"""
Register all household members with the registry.
@@ -113,7 +113,7 @@ def register_household_members():
)
async def initialize_application():
async def initialize_application() -> None:
"""
Initialize the application.
+3 -3
View File
@@ -46,11 +46,11 @@ class ToolCallTracker:
return tool_name.replace("delegate_to_", "")
return tool_name
def log_call(self, message: str):
def log_call(self, message: str) -> None:
"""Log a tool call message (for UI display)."""
logger.debug("tool_call_message", message=message)
async def track_call(self, tool_name: str, duration: float):
async def track_call(self, tool_name: str, duration: float) -> None:
"""
Record a tool call with timing.
@@ -82,7 +82,7 @@ class ToolCallTracker:
was_recommended=was_recommended,
)
async def finalize(self):
async def finalize(self) -> None:
"""
Finalize tracking and log unused recommended tools.