Problem
The import-linter contract depends on src/tools/ being a real layer. With no tools, the contract is vacuous and the pattern isn't demonstrated for users.
Proposed solution
Add src/tools/registry.py (dict-based tool dispatcher with type-checked registration). Add an echo_tool whose input/output are StrictModels. Add src/tools/__init__.py. The registry imports only from src/data/ and src/observability/ (consistent with the layer contract).
Acceptance criteria
Priority rationale
Medium: not a quality gate itself, but it makes the tool-registry pattern concrete for future LLM coders.
Depends on
#18
Problem
The import-linter contract depends on
src/tools/being a real layer. With no tools, the contract is vacuous and the pattern isn't demonstrated for users.Proposed solution
Add
src/tools/registry.py(dict-based tool dispatcher with type-checked registration). Add anecho_toolwhose input/output areStrictModels. Addsrc/tools/__init__.py. The registry imports only fromsrc/data/andsrc/observability/(consistent with the layer contract).Acceptance criteria
src/tools/registry.pyexposes aRegistryclass withregister()anddispatch()methods.echo_toolis registered at module load and dispatches successfully via the registry.lint-importsconfirms tools imports nothing fromapi/oragent/.Priority rationale
Medium: not a quality gate itself, but it makes the tool-registry pattern concrete for future LLM coders.
Depends on
#18