5.6 KiB
ADDED Requirements
Requirement: ToolBoundary SHALL enforce explicit preflight before execution
The Harness SHALL reject a Tool call before invoking the executor when the envelope has a blank/unsafe framework tool_call_id, a run ID different from RunContext, invalid JSON object input, unauthorized access, non-read-only access, an inactive/deadline-expired Run, duplicate canonical key, or exhausted Tool/Run budget.
Scenario: Cross-Run Tool Call is rejected
- WHEN an envelope run ID differs from the explicit RunContext run ID
- THEN ToolBoundary returns a safe
ERROR, does not create a canonical record, and does not invoke the Tool
Scenario: Unauthorized or writable Tool is rejected
- WHEN
authorized=falseorreadOnly=false - THEN ToolBoundary returns
ERRORbefore execution and does not expose the request to an Agent
Requirement: Canonical invocation SHALL keep complete data in one record
The store SHALL save the complete request JSON, raw Tool response, bounded Agent result, framework tool_call_id, run ID, tool name, lifecycle status, evidence status, timestamps, and error code in one canonical record. The raw response SHALL NOT be replaced by a preview, and SHALL NOT be returned to the Agent.
Scenario: Tool begins execution
- WHEN preflight succeeds and the Tool is about to execute
- THEN one record is created with
status=PROJECTING, the complete request, the exact framework ID, and no Agent result yet
Scenario: Projector succeeds
- WHEN the executor returns raw data and the projector returns a bounded result
- THEN the same record contains raw data and Agent result with
status=READY, and ToolBoundary returns only the bounded Agent result
Requirement: Invocation lifecycle and evidence semantics SHALL be enforced centrally
The store SHALL allow only PROJECTING -> READY or PROJECTING -> ERROR. READY SHALL require EVIDENCE_FOUND or NO_EVIDENCE; ERROR SHALL use evidence_status=ERROR and SHALL NOT be referencable. NO_EVIDENCE SHALL remain a scoped negative observation and SHALL NOT be upgraded to success or retried by the boundary.
Scenario: No evidence projection completes
- WHEN a projector returns a valid bounded result with
NO_EVIDENCE - THEN the record becomes
READY, preserves the result scope, and remains eligible only for a negative observation
Scenario: Projection fails
- WHEN the projector throws or returns an invalid evidence status
- THEN the same record becomes
ERROR, stores a safe error code, and no Agent result is returned
Requirement: Tool Call ID and Run ownership SHALL be preserved
The boundary SHALL use the exact framework tool_call_id with the RunContext run ID to create the canonical key. It SHALL reject missing, unsafe, duplicate, and cross-Run references and SHALL never generate or replace a fallback ID.
Scenario: Duplicate Tool Call ID is submitted
- WHEN a second invocation uses the same valid run ID and framework Tool Call ID
- THEN the second Tool is not executed and returns
ERRORwithout overwriting the first record
Scenario: Framework ID is preserved
- WHEN a valid envelope passes preflight
- THEN the key and canonical record contain the exact supplied
tool_call_id
Requirement: TTL and size limits SHALL fail closed
The Redis implementation SHALL set TTL only when a canonical record is created. Reads SHALL NOT refresh TTL; updates SHALL preserve only the current remaining TTL. Request/raw/record and Agent-result byte limits SHALL be enforced in UTF-8. Raw overflow SHALL produce ERROR/RESULT_TOO_LARGE without silent truncation; Agent projection overflow SHALL produce the same error.
Scenario: Read does not renew TTL
- WHEN a canonical record is read before expiration
- THEN its expiry remains at or before the original expiry and no expire/refresh operation is issued
Scenario: Raw response is too large
- WHEN the executor returns raw data beyond the record limit
- THEN the record becomes
ERRORwithRESULT_TOO_LARGE, the raw payload is not silently truncated, and the projector is not invoked
Scenario: Agent result is too large
- WHEN a projector returns a result beyond the Agent projection limit
- THEN the record becomes
ERROR/RESULT_TOO_LARGEand the oversized result is not returned to the Agent
Requirement: Tool and store failures SHALL return safe errors
Execution, serialization, Redis, duplicate, preflight, and projection failures SHALL return a bounded error code without raw payload, credentials, internal stack trace, or Redis key to the Agent. If raw data was safely stored before a projection failure, it remains Harness-only canonical data.
Scenario: Tool execution throws
- WHEN the executor raises an exception after PROJECTING begins
- THEN the record becomes
ERRORwith a stable execution error code and ToolBoundary returns no raw response
Requirement: Stage 3A SHALL remain reusable and independent from legacy audit
The boundary and canonical store SHALL be usable by later RAG/log/MySQL projectors without modifying legacy ToolInvocationRecorder, JPA ToolInvocation, Chat/AIOps, Controller, or public protocol. Redis access SHALL remain inside the store implementation and no Agent-facing API SHALL expose the Redis client.
Scenario: Fake projector tests pass
- WHEN Fake Tool/Projector tests cover success, no evidence, error, duplicate, TTL, and capacity cases
- THEN later Tool-specific changes can depend on the same boundary without copying lifecycle or Redis logic, while legacy call sites remain unchanged