Skip to content

Python: [Bug]: get_latest raises TypeError when a storage holds naive and timezone-aware checkpoint timestamps #9941

Closed

Description

Observed Behavior

WorkflowCheckpoint.timestamp is documented as an "ISO 8601 timestamp", and both 2026-01-01T00:00:00 and 2026-01-02T00:00:00+00:00 are. get_latest compares them with datetime.fromisoformat, so a storage holding one of each raises TypeError, on InMemoryCheckpointStorage and FileCheckpointStorage alike. The default timestamp is aware, so this takes a checkpoint whose timestamp was supplied, for example one written by another tool.

Expected Behavior

get_latest returns the newest checkpoint, for example reading a naive timestamp as UTC, or the save rejects a naive timestamp.

Steps to Reproduce

  1. pip install agent-framework-core==1.23.0
  2. Run the script below.

Minimal Reproduction

import asyncio

from agent_framework import InMemoryCheckpointStorage
from agent_framework._workflows._checkpoint import WorkflowCheckpoint


async def main():
    storage = InMemoryCheckpointStorage()
    for name, stamp in [("a", "2026-01-01T00:00:00"), ("b", "2026-01-02T00:00:00+00:00")]:
        await storage.save(WorkflowCheckpoint(workflow_name="w", graph_signature_hash="h", checkpoint_id=name, timestamp=stamp))
    print((await storage.get_latest(workflow_name="w")).checkpoint_id)


asyncio.run(main())

Error Messages and Stack Traces

TypeError: can't compare offset-naive and offset-aware datetimes

Package Versions

agent-framework-core 1.23.0, and main at b7884ad.

Python Version

3.12

Operating System

Linux

Regression

Unknown

Additional Context

On main the comparison is in the max(datetime.fromisoformat(cp.timestamp) for cp in checkpoints) of _workflows/_checkpoint.py. The open #9902 changes how get_latest handles a decode failure; its diff adds no timezone handling.

Acknowledgements

  • I searched existing issues and did not find a duplicate.
  • I personally verified this behavior and the reproduction details are authentic.
  • I will wait for explicit maintainer agreement before starting implementation of a non-trivial change.

Activity

  1. added
    pythonUsage: [Issues, PRs], Target: Python
    triageUsage: [Issues], Target: All issues that still need to be triaged
    on Nov 1, 2026
  2. added
    reproducedUsage: [Issues], Target: all issues that can be reproduced by the triage workflow
    on Nov 1, 2026
  3. github-actions commented on Nov 1, 2026

    @github-actions
    Contributor

    🤖 Automated triage reproduction notes (agent-authored — trust but verify)

    Agent analysis

    The bug reproduces in python/packages/core/agent_framework/_workflows/_checkpoint.py::_select_latest_checkpoint at line 217 when one workflow contains both naive and timezone-aware ISO 8601 checkpoint timestamps. Minimal repro: save checkpoints timestamped 2026-01-01T00:00:00 and 2026-01-02T00:00:00+00:00 to either core storage implementation, then call get_latest(workflow_name="w").

    • Failing test: python/packages/core/tests/workflow/test_checkpoint.py::test_get_latest_compares_naive_and_aware_timestamps
    • Files examined: python/packages/core/agent_framework/_workflows/_checkpoint.py, python/packages/core/tests/workflow/test_checkpoint.py, python/packages/core/pyproject.toml
    • Tests run: python/packages/core/tests/workflow/test_checkpoint.py::test_get_latest_compares_naive_and_aware_timestamps[memory], python/packages/core/tests/workflow/test_checkpoint.py::test_get_latest_compares_naive_and_aware_timestamps[file]
    • Reported version: 1.23.0
    • Current version: 1.24.0
  4. added
    workflowsUsage: [Issues, PRs], Target: Workflows
    and removed
    triageUsage: [Issues], Target: All issues that still need to be triaged
    on Nov 1, 2026
  5. eavanvalkenburg commented on Nov 2, 2026

    @eavanvalkenburg
    Member

    /plan Resolve the confirmed mixed naive/aware checkpoint timestamp failure on current main before selecting the policy in #9944. Compare treating offset-naive ISO timestamps as UTC with rejecting them at a supported boundary; document compatibility for existing checkpoints and externally supplied timestamps. Preserve aware-offset ordering and existing lineage/tie-break semantics, and cover both InMemoryCheckpointStorage and FileCheckpointStorage, mixed/all-naive/all-aware values, equivalent instants, and invalid timestamp behavior. Coordinate with the existing #9944 implementation and the distinct #9902 decode-error work rather than creating a parallel fix. This is scoped planning, not implementation approval or a request to change assignments.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

pythonUsage: [Issues, PRs], Target: PythonreproducedUsage: [Issues], Target: all issues that can be reproduced by the triage workflowworkflowsUsage: [Issues, PRs], Target: Workflows

Type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions