Todo 47.1 Plugin Normalization and Validation Plan
Status: in_progress
Goal
Close review-confirmed plugin safety gaps while preserving the generic kernel and identical built-in behavior across dual_agent and chat_agent_tools.
Scope
- Add an optional generic event argument normalizer that runs after text-event resolution and on provider-resolved arguments, before validation and execution.
- Keep provider-resolved arguments ineligible for EventAgent LLM fallback; normalization is deterministic only.
- Move canonical volume/search structured normalization into this shared hook.
- Treat negated volume commands as incomplete/invalid and capture full numeric tokens so values such as
1000 are rejected rather than truncated to 100.
- Enforce real RFC3339 date-time validity and real IANA timezone validity through generic JSON Schema format checking.
- Reject blank/whitespace-only search queries and blank schedule titles.
- Prevent in-memory adapters from returning stale results when short parser event IDs collide with different normalized arguments.
Idempotency Decision
The lab adapters will cache by event ID plus canonical normalized arguments, not event ID alone. This preserves same-call replay behavior while preventing event_1 with a different operation from returning an earlier result. Runtime-scoped deduplication and production session/turn idempotency remain Todo 48/service integration responsibilities.
Files
- Modify:
src/agent_lab/application/events/models.py
- Modify:
src/agent_lab/application/events/kernel.py
- Modify:
src/agent_lab/application/events/registry.py
- Modify:
src/agent_lab/application/events/__init__.py
- Modify:
src/agent_lab/application/events/builtin_plugins.py
- Modify:
src/agent_lab/application/tools.py only to preserve ToolDefinition compatibility with the new optional normalizer
- Modify:
tests/test_event_kernel.py
- Modify:
tests/test_builtin_event_plugins.py
Requirement Execution Loop
Plan
- Add RED generic-kernel tests proving normalizers run for both sources, preserve provider raw arguments, and never enable provider LLM fallback.
- Add RED plugin parity tests for canonicalization through text and provider sources.
- Add RED safety tests for English/Chinese negation,
1000, invalid dates, invalid IANA zones, blank query/title, and no port calls.
- Add RED adapter tests for same short ID with different arguments and replay with identical arguments.
- Implement generic format checking and the smallest plugin normalizers/validators.
- Run focused/full verification and renewed reviews.
Observe / Update
Close Todo 47 only when all four plugins reject unsafe inputs before ports, both invocation modes share deterministic normalization, and no event-name logic enters generic orchestration.
Verification
UV_CACHE_DIR=.uv-cache uv run pytest tests/test_event_kernel.py tests/test_builtin_event_plugins.py -q
UV_CACHE_DIR=.uv-cache uv run pytest
git diff --check