PINK: fix naive datetime → INVALID_INTENT_PARSE at column 41
Root cause: intent.timestamp was a naive datetime (no tzinfo). isoformat()
produces '2026-06-04T14:26:55.098914' (26 chars). The JSON prefix
'{"timestamp":"' is 14 chars → closing quote lands at column 41. Rust's
chrono::DateTime<Utc> serde rejects naive timestamps and serde_json reports
the error as 'premature end of input at line 1 column 41'.
Fix: _utc_isoformat() attaches UTC tzinfo before isoformat(), producing
'2026-06-04T14:26:55.098914+00:00' which chrono accepts.
Previous null-byte fix (_to_rust_bytes) and dangling-pointer fix (local vars)
remain correct and address real separate failure modes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -437,9 +437,25 @@ def _first_invalid_intent_field(intent: KernelIntent) -> Optional[tuple[str, flo
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _utc_isoformat(ts: Any) -> str:
|
||||||
|
"""Return an RFC3339 timestamp string with UTC offset (+00:00).
|
||||||
|
|
||||||
|
Rust's chrono::DateTime<Utc> serde deserializer requires a timezone-aware
|
||||||
|
string. A naive datetime (no tzinfo) produces e.g. '2026-06-04T14:26:55.098914'
|
||||||
|
(26 chars) which chrono rejects with 'premature end of input at column 41'
|
||||||
|
(14-char JSON key prefix + 26-char value + closing quote = column 41).
|
||||||
|
"""
|
||||||
|
from datetime import timezone as _tz
|
||||||
|
if hasattr(ts, "tzinfo"):
|
||||||
|
if ts.tzinfo is None:
|
||||||
|
ts = ts.replace(tzinfo=_tz.utc)
|
||||||
|
return ts.isoformat()
|
||||||
|
return str(ts)
|
||||||
|
|
||||||
|
|
||||||
def _intent_to_payload(intent: KernelIntent) -> Dict[str, Any]:
|
def _intent_to_payload(intent: KernelIntent) -> Dict[str, Any]:
|
||||||
return {
|
return {
|
||||||
"timestamp": intent.timestamp.isoformat() if hasattr(intent.timestamp, "isoformat") else str(intent.timestamp),
|
"timestamp": _utc_isoformat(intent.timestamp),
|
||||||
"intent_id": intent.intent_id,
|
"intent_id": intent.intent_id,
|
||||||
"trade_id": intent.trade_id,
|
"trade_id": intent.trade_id,
|
||||||
"slot_id": intent.slot_id,
|
"slot_id": intent.slot_id,
|
||||||
|
|||||||
Reference in New Issue
Block a user