Luis Mendes
34c2acc354
fix(acms): implement context tier runtime promotion/demotion/eviction
...
Implement the missing runtime logic for the ACMS context tier service.
Previously only data models and manual promote()/demote()/evict_lru()
methods existed. This commit adds:
- Auto-promotion on access: get() now promotes fragments one tier up
when access_count reaches the configurable promotion_threshold
(default: 5 accesses). The access counter resets after each
successful promotion so fragments must accumulate fresh accesses
before the next tier transition.
- Staleness enforcement: new enforce_staleness() method demotes hot
fragments older than hot_ttl (default: 24h) to warm, and warm
fragments older than warm_ttl to cold. A snapshot of existing
warm-tier IDs prevents double-demotion in a single pass.
- Budget enforcement on store and promote: store() and promote()
now enforce TierBudget.max_tokens_hot by evicting LRU hot-tier
fragments until the token budget is met. The eviction loop uses
incremental token tracking to avoid recomputing the sum.
- Event emission: Added TIER_PROMOTED, TIER_DEMOTED, TIER_EVICTED
event types to EventType enum. All tier transitions emit
DomainEvent instances through the optional EventBus.
- Configuration: Added context_tier_promotion_threshold,
context_tier_hot_ttl_hours, context_tier_warm_ttl_hours settings.
The warm TTL setting also accepts the spec-defined env var
CLEVERAGENTS_CTX_WARM_HOURS as an alias.
- DI wiring: container.py now injects event_bus into
context_tier_service.
Review fixes applied (code review on PR #1150 ):
- C1: Reset access_count to 0 after each auto-promotion to prevent
chain promotion that bypassed the warm tier.
- C2: Call _enforce_hot_budget() inside promote() warm-to-hot path
so auto-promoted fragments respect the token budget.
- H1: Corrected _enforce_hot_budget() docstring: actual complexity
is O(n + n*k) not O(n), since min() scans remaining entries on
each eviction.
- M1: Added CLEVERAGENTS_CTX_WARM_HOURS as an additional env var
alias for context_tier_warm_ttl_hours per specification line 30555.
Review fixes applied (second code review on PR #1150 ):
- B-CRIT-1: Fixed data loss in promote() warm-to-hot: emit
TIER_PROMOTED before _enforce_hot_budget(), and if the promoted
fragment is evicted by budget, restore it to the warm tier instead
of silently losing it.
- B-HIGH-1: Fixed self-eviction on store(): fragments whose
token_count exceeds the entire hot-tier budget are now redirected
to the warm tier with a warning log.
- B-MED-1: Wrapped _emit_tier_event() in try/except so a failing
event bus does not break tier operations (best-effort emission).
- B-MED-2: Fixed event ordering so TIER_PROMOTED fires before any
budget-triggered TIER_EVICTED events.
- D-LOW-1: Fixed type hint in Robot helper (dict[str, Callable]).
- D-LOW-2: Added __all__ export to context_tiers.py.
- S-LOW-1: Added thread-safety docstring note to ContextTierService.
Review fixes applied (third code review on PR #1150 ):
- B-MED-1: Added TIER_DEMOTED event emission for oversized fragment
redirect in store(), closing the observability gap where the only
tier transition without event emission was the hot-to-warm redirect
for fragments exceeding the entire hot-tier budget.
- S-LOW-1: Added CLEVERAGENTS_CTX_HOT_HOURS as an additional env var
alias for context_tier_hot_ttl_hours, for consistency with the
warm-tier alias CLEVERAGENTS_CTX_WARM_HOURS.
- S-LOW-2: Added docstring note to enforce_staleness() reconciling
the hot-tier TTL with the specification statement that hot-tier
retention is "Until resource removed" (TTL controls tier placement,
not data retention).
Review fixes applied (fourth code review on PR #1150 ):
- B-HIGH-1: Reset access_count to 0 on demotion so that demoted
fragments must accumulate fresh accesses before re-promotion.
Without this reset, a previously popular fragment whose
access_count already exceeded the promotion threshold would be
re-promoted on the very next get() call, making staleness
enforcement ineffective.
Review fixes applied (freemo APPROVED review on PR #1150 ):
- #1 : Removed all # type: ignore annotations from test files.
Fixed _EventCollector, _FailingBus, and _NullBus subscribe()
signatures to use Callable[[DomainEvent], None] matching the
EventBus protocol. Replaced dict-spread TieredFragment construction
with explicit keyword arguments and post-construction assignment.
- #2 : Extracted runtime policy logic (enforce_staleness,
_maybe_auto_promote, _re_fetch_after_promotion, _enforce_hot_budget,
_emit_tier_event) into TierRuntimeMixin in tier_runtime.py to
reduce context_tiers.py toward the 500-line guideline.
- #3 : Added fragment_id non-empty validation guard to promote() and
demote() per CONTRIBUTING.md argument validation policy.
- #8 : Renamed _resolve to _re_fetch_after_promotion for clarity.
Removed @tdd_expected_fail from TDD tests (Behave + Robot) as the
bug is now fixed. All 3 TDD scenarios pass normally.
Tests: 27 Behave scenarios (24 feature + 3 TDD), 4 Robot integration
tests, 4 ASV benchmark suites.
ISSUES CLOSED : #821
2026-03-25 17:49:06 +00:00
..
2026-03-10 03:39:32 +00:00
2026-03-13 18:21:50 +00:00
2026-03-22 03:23:42 +00:00
2026-03-12 14:38:57 +00:00
2026-03-18 17:33:30 +00:00
2026-03-12 14:38:57 +00:00
2026-03-20 21:22:10 +00:00
2026-03-12 14:38:57 +00:00
2026-03-12 14:38:57 +00:00
2026-03-22 01:07:20 +00:00
2026-03-09 13:01:58 -04:00
2026-03-03 03:29:31 +00:00
2026-03-10 15:09:03 +00:00
2026-03-05 15:13:19 +00:00
2026-03-05 10:27:36 -05:00
2026-03-07 14:53:18 +00:00
2026-03-05 01:28:50 +00:00
2026-03-09 13:01:58 -04:00
2026-03-12 20:42:14 +00:00
2026-02-14 12:16:39 -05:00
2026-03-15 19:33:11 -04:00
2026-02-14 12:16:39 -05:00
2026-02-22 00:43:08 -05:00
2026-02-13 09:41:28 -05:00
2026-02-13 09:41:28 -05:00
2026-03-02 02:01:27 +00:00
2026-02-20 15:57:21 +00:00
2026-02-13 09:41:28 -05:00
2026-03-17 09:53:57 +00:00
2026-03-09 13:01:58 -04:00
2026-03-19 09:30:35 +00:00
2026-02-24 19:12:01 +00:00
2026-02-24 17:57:18 +00:00
2026-02-24 17:57:18 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-02-16 14:21:06 -05:00
2026-02-18 12:18:37 +00:00
2026-02-25 10:30:42 +00:00
2026-03-10 23:11:22 +00:00
2026-02-20 20:24:10 +00:00
2026-02-20 08:48:33 -05:00
2026-02-20 08:48:33 -05:00
2026-02-20 08:48:33 -05:00
2026-03-09 13:01:58 -04:00
2026-02-22 08:31:45 +00:00
2026-03-18 06:58:39 +00:00
2026-03-20 21:22:10 +00:00
2026-03-09 13:01:58 -04:00
2026-02-26 09:10:35 +00:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-09 13:01:58 -04:00
2026-02-25 10:01:57 +00:00
2026-02-25 10:05:57 +00:00
2026-03-04 23:47:20 +00:00
2026-03-09 13:01:58 -04:00
2026-03-12 23:32:48 +00:00
2026-03-12 23:32:48 +00:00
2026-03-22 05:01:06 +00:00
2026-03-20 21:22:10 +00:00
2026-02-27 09:47:10 -05:00
2026-02-20 15:57:21 +00:00
2026-03-20 21:22:10 +00:00
2026-03-17 09:53:53 +00:00
2026-03-17 09:53:53 +00:00
2026-03-17 09:53:53 +00:00
2026-02-18 03:27:00 +00:00
2026-02-20 15:57:21 +00:00
2026-03-02 17:44:18 +00:00
2026-02-22 10:19:43 +00:00
2026-03-09 13:01:58 -04:00
2026-03-10 14:18:04 -04:00
2026-02-18 03:27:00 +00:00
2026-02-18 03:27:00 +00:00
2026-03-09 13:01:58 -04:00
2026-02-27 13:47:42 -05:00
2026-03-09 13:01:58 -04:00
2026-03-21 05:30:01 +00:00
2026-03-09 13:01:58 -04:00
2026-02-21 16:27:40 +00:00
2026-03-12 10:31:37 +00:00
2026-02-27 23:08:55 +00:00
2026-02-27 23:08:55 +00:00
2026-03-01 03:09:51 +00:00
2026-03-18 16:51:14 +00:00
2026-03-20 21:22:10 +00:00
2026-03-21 00:29:49 +00:00
2026-03-20 21:22:10 +00:00
2026-03-11 17:42:13 +00:00
2026-02-22 00:43:08 -05:00
2026-02-22 00:43:08 -05:00
2026-03-21 01:14:18 +00:00
2026-03-17 09:53:57 +00:00
2026-03-23 22:22:16 +00:00
2026-03-18 06:58:39 +00:00
2026-03-06 20:28:37 +00:00
2026-03-09 13:01:58 -04:00
2026-03-18 06:58:39 +00:00
2026-03-15 20:50:02 +00:00
2026-02-22 00:43:08 -05:00
2026-03-22 01:54:33 +00:00
2026-02-18 03:27:00 +00:00
2026-02-18 03:27:00 +00:00
2026-03-19 23:30:55 +00:00
2026-03-22 05:01:06 +00:00
2026-03-02 02:01:27 +00:00
2026-03-09 13:01:58 -04:00
2026-03-20 21:22:10 +00:00
2026-03-17 13:14:37 -04:00
2026-03-07 11:49:14 -05:00
2026-02-25 10:48:05 -05:00
2026-03-09 13:01:58 -04:00
2026-03-01 04:38:30 +00:00
2026-03-22 05:01:06 +00:00
2026-03-01 04:38:30 +00:00
2026-03-02 15:05:20 +00:00
2026-02-23 10:44:58 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-20 21:22:10 +00:00
2026-02-27 09:47:10 -05:00
2026-03-20 21:22:10 +00:00
2026-03-24 08:46:58 +00:00
2026-03-12 10:31:37 +00:00
2026-03-20 21:22:10 +00:00
2026-02-27 09:47:10 -05:00
2026-02-27 09:47:10 -05:00
2026-03-17 09:53:57 +00:00
2026-03-05 14:11:23 +00:00
2026-03-09 13:01:58 -04:00
2026-02-27 09:47:10 -05:00
2026-02-27 09:47:10 -05:00
2026-03-09 13:01:58 -04:00
2026-03-02 02:01:27 +00:00
2026-03-05 12:58:57 +00:00
2026-03-11 01:36:06 +00:00
2026-03-25 17:49:06 +00:00
2026-03-21 01:40:58 +00:00
2026-02-14 04:01:20 +00:00
2026-03-09 13:01:58 -04:00
2026-02-22 17:15:51 +00:00
2026-02-22 17:56:18 +00:00
2026-03-20 21:22:10 +00:00
2026-02-25 19:38:43 -05:00
2026-02-24 12:19:04 -05:00
2026-02-22 16:15:49 -05:00
2026-03-23 18:41:53 +00:00
2026-03-20 21:22:10 +00:00
2026-03-10 14:18:04 -04:00
2026-02-25 12:08:01 -05:00
2026-03-17 09:53:57 +00:00
2026-02-24 00:41:01 +00:00
2026-03-02 02:01:27 +00:00
2026-03-09 13:01:58 -04:00
2026-03-17 09:53:57 +00:00
2026-02-13 22:25:16 +00:00
2026-02-13 18:54:15 +00:00
2026-02-16 21:35:54 +00:00
2026-03-09 13:01:58 -04:00
2026-03-04 21:20:47 +00:00
2026-03-04 21:20:47 +00:00
2026-03-02 14:32:31 +00:00
2026-03-16 22:50:27 +00:00
2026-03-20 21:22:10 +00:00
2026-02-20 15:57:21 +00:00
2026-03-18 08:13:56 +00:00
2026-03-23 23:33:33 +00:00
2026-02-24 12:19:04 -05:00
2026-03-18 08:13:56 +00:00
2026-02-22 00:43:08 -05:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-10 19:29:27 +00:00
2026-03-20 21:22:10 +00:00
2026-03-18 17:16:32 +00:00
2026-03-20 21:22:10 +00:00
2026-03-04 23:47:20 +00:00
2026-03-19 07:53:43 +00:00
2026-02-26 16:13:44 +00:00
2026-02-26 16:13:44 +00:00
2026-03-19 07:53:43 +00:00
2026-03-03 12:53:28 +00:00
2026-03-09 13:01:58 -04:00
2026-03-03 12:53:28 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-03 21:44:20 +00:00
2026-02-25 10:04:31 +00:00
2026-03-05 15:42:20 +00:00
2026-03-20 21:22:10 +00:00
2026-03-10 12:17:51 +00:00
2026-03-12 14:38:57 +00:00
2026-03-12 10:31:37 +00:00
2026-03-10 12:17:51 +00:00
2026-03-20 21:22:10 +00:00
2026-03-10 12:17:51 +00:00
2026-02-25 10:02:38 +00:00
2026-03-09 13:01:58 -04:00
2026-03-20 21:22:10 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 23:55:33 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-02-13 20:34:57 +00:00
2026-03-17 09:53:57 +00:00
2026-02-25 10:07:09 +00:00
2026-03-21 01:40:58 +00:00
2026-03-03 15:42:53 +00:00
2026-03-03 14:48:55 -05:00
2026-03-24 22:01:48 +00:00
2026-03-24 22:01:48 +00:00
2026-02-19 14:20:16 +00:00
2026-02-19 14:20:16 +00:00
2026-02-21 18:11:31 +00:00
2026-02-16 21:35:54 +00:00
2026-02-14 04:01:20 +00:00
2026-03-04 15:36:34 +00:00
2026-02-22 16:15:49 -05:00
2026-02-22 09:23:35 +00:00
2026-03-04 20:26:42 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-03 21:44:20 +00:00
2026-03-03 21:44:20 +00:00
2026-03-09 13:01:58 -04:00
2026-02-20 15:57:21 +00:00
2026-03-20 21:22:10 +00:00
2026-03-03 17:04:17 -05:00
2026-02-27 13:47:42 -05:00
2026-02-22 16:15:49 -05:00
2026-03-24 13:01:12 +00:00
2026-03-24 13:01:12 +00:00
2026-03-12 14:38:57 +00:00
2026-03-23 23:33:33 +00:00
2026-02-25 04:13:55 +00:00
2026-03-12 20:42:14 +00:00
2026-03-18 10:09:06 +00:00
2026-03-25 12:05:40 +00:00
2026-03-12 14:38:57 +00:00
2026-03-02 17:44:18 +00:00
2026-03-02 02:01:27 +00:00
2026-03-19 08:46:46 +00:00
2026-02-25 14:17:34 +00:00
2026-03-10 17:23:05 +00:00
2026-03-18 17:16:32 +00:00
2026-02-25 19:38:43 -05:00
2026-02-25 19:38:43 -05:00
2026-02-25 19:38:43 -05:00
2026-03-02 02:01:27 +00:00
2026-03-09 13:01:58 -04:00
2026-03-03 14:55:58 -05:00
2026-02-13 21:54:31 +00:00
2026-03-19 08:46:46 +00:00
2026-03-21 03:14:40 +00:00
2026-02-28 20:21:18 +00:00
2026-02-20 20:34:29 +00:00
2026-02-23 09:47:00 -05:00
2026-03-15 19:59:38 -04:00
2026-03-01 03:09:51 +00:00
2026-03-09 13:01:58 -04:00
2026-03-17 09:53:57 +00:00
2026-02-24 12:19:04 -05:00
2026-03-15 20:50:02 +00:00
2026-03-20 21:22:10 +00:00
2026-03-15 20:50:02 +00:00
2026-03-15 20:50:02 +00:00
2026-02-27 13:47:42 -05:00
2026-03-23 23:33:33 +00:00
2026-02-20 15:57:21 +00:00
2026-02-25 19:38:43 -05:00
2026-03-12 20:42:14 +00:00
2026-03-09 13:01:58 -04:00
2026-03-07 19:36:09 +00:00
2026-03-12 20:42:14 +00:00
2026-03-17 09:53:57 +00:00
2026-02-22 00:43:08 -05:00
2026-02-22 15:13:43 +00:00
2026-03-20 21:22:10 +00:00
2026-02-27 13:47:42 -05:00
2026-03-01 03:09:51 +00:00
2026-03-09 13:01:58 -04:00
2026-03-19 22:10:23 +00:00
2026-03-17 09:53:57 +00:00
2026-03-20 21:22:10 +00:00
2026-02-27 09:47:10 -05:00
2026-02-27 09:47:10 -05:00
2026-02-13 20:34:57 +00:00
2026-03-09 13:01:58 -04:00
2026-03-23 23:33:33 +00:00
2026-03-19 21:13:01 +00:00
2026-03-20 21:22:10 +00:00
2026-02-25 19:38:43 -05:00
2026-03-23 23:33:33 +00:00
2026-02-17 00:37:53 +00:00
2026-03-20 21:22:10 +00:00
2026-02-25 14:00:04 -05:00
2026-03-18 06:58:39 +00:00
2026-02-24 12:19:04 -05:00
2026-02-15 00:12:07 -05:00
2026-02-25 19:38:43 -05:00
2026-03-09 13:01:58 -04:00
2026-02-15 00:12:07 -05:00
2026-02-20 15:57:21 +00:00
2026-02-22 00:43:08 -05:00
2026-03-23 23:33:33 +00:00
2026-02-15 06:16:19 +00:00
2026-03-09 13:01:58 -04:00
2026-03-18 06:58:39 +00:00
2026-02-20 15:57:21 +00:00
2026-03-09 13:01:58 -04:00
2026-02-25 14:00:04 -05:00
2026-03-20 21:22:10 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-02 02:01:27 +00:00
2026-02-22 00:43:08 -05:00
2026-03-03 14:40:37 +00:00
2026-03-18 08:13:56 +00:00
2026-03-10 14:51:39 +00:00
2026-03-20 21:22:10 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-20 21:22:10 +00:00
2026-03-08 21:53:21 -04:00
2026-03-17 09:53:57 +00:00
2026-02-18 03:27:00 +00:00
2026-03-09 13:01:58 -04:00
2026-03-17 09:53:57 +00:00
2026-03-22 05:01:06 +00:00
2026-03-19 06:53:06 +00:00
2026-03-17 09:53:57 +00:00
2026-02-18 03:27:00 +00:00
2026-03-09 06:59:15 +00:00
2026-03-13 13:32:52 +08:00
2026-03-20 21:22:10 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 07:56:38 +00:00
2026-02-15 11:04:18 -05:00
2026-03-08 22:19:40 +00:00
2026-02-27 09:47:10 -05:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-19 09:30:35 +00:00
2026-03-09 13:01:58 -04:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-18 10:09:06 +00:00
2026-03-18 10:09:06 +00:00
2026-03-20 22:28:32 +00:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-09 23:55:33 +00:00
2026-03-20 21:22:10 +00:00
2026-03-25 13:05:04 +00:00
2026-03-10 22:27:37 +00:00
2026-02-27 13:47:42 -05:00
2026-03-18 08:13:56 +00:00
2026-03-01 03:09:51 +00:00
2026-03-06 03:22:45 +00:00
2026-03-02 17:44:18 +00:00
2026-02-20 15:57:21 +00:00
2026-03-09 13:01:58 -04:00
2026-03-10 03:39:32 +00:00
2026-03-09 13:01:58 -04:00
2026-03-17 09:53:57 +00:00
2026-03-17 09:53:57 +00:00
2026-02-18 03:27:00 +00:00
2026-03-20 21:22:10 +00:00
2026-03-24 13:53:41 +00:00
2026-02-24 12:19:04 -05:00
2026-02-23 22:20:44 +00:00
2026-03-10 04:06:02 +00:00
2026-03-10 04:06:02 +00:00
2026-03-07 19:36:09 +00:00
2026-02-13 21:54:31 +00:00
2026-03-09 13:01:58 -04:00
2026-03-18 02:30:00 +00:00
2026-02-17 21:07:54 +00:00
2026-02-20 08:49:30 -05:00
2026-03-06 20:44:36 +00:00
2026-03-07 19:36:09 +00:00
2026-02-15 10:44:14 -05:00
2026-03-19 14:03:17 +00:00
2026-03-18 02:30:00 +00:00
2026-02-18 03:27:00 +00:00
2026-03-10 03:39:32 +00:00
2026-03-10 03:39:32 +00:00
2026-03-10 03:39:32 +00:00
2026-03-24 13:21:12 +00:00
2026-03-20 21:22:10 +00:00
2026-03-18 02:30:00 +00:00
2026-03-18 01:45:25 +00:00
2026-03-09 13:01:58 -04:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-20 21:22:10 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-20 21:22:10 +00:00
2026-02-20 20:38:53 +00:00
2026-03-03 22:21:14 +00:00
2026-03-03 22:21:14 +00:00
2026-03-04 15:59:15 +00:00
2026-03-02 10:18:14 +00:00
2026-02-27 13:47:42 -05:00
2026-03-21 03:14:40 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-20 21:22:10 +00:00
2026-02-20 03:31:43 +00:00
2026-03-21 04:46:45 +00:00
2026-03-06 00:49:33 +00:00
2026-03-06 00:49:33 +00:00
2026-03-12 14:38:57 +00:00
2026-02-25 04:50:43 +00:00
2026-02-21 16:32:03 +00:00
2026-02-25 10:05:57 +00:00
2026-02-26 20:33:20 +00:00
2026-02-13 19:24:24 +00:00
2026-02-19 11:15:18 +00:00
2026-03-09 13:01:58 -04:00
2026-02-25 10:06:27 +00:00
2026-03-04 12:18:51 -05:00
2026-02-28 17:46:54 +00:00
2026-03-02 22:05:53 +00:00
2026-03-17 09:53:57 +00:00
2026-03-12 14:38:57 +00:00
2026-03-11 17:42:13 +00:00
2026-03-11 17:42:13 +00:00
2026-03-20 21:22:10 +00:00
2026-03-11 17:42:13 +00:00
2026-02-18 03:27:00 +00:00
2026-03-02 02:01:27 +00:00
2026-03-20 21:22:10 +00:00
2026-02-20 01:10:19 +00:00
2026-03-12 16:16:41 +00:00
2026-03-10 21:39:31 +00:00
2026-03-12 16:16:41 +00:00
2026-02-20 15:57:21 +00:00
2026-02-20 15:57:21 +00:00
2026-02-18 00:10:15 +00:00
2026-03-20 21:22:10 +00:00
2026-03-09 13:01:58 -04:00
2026-03-20 21:22:10 +00:00
2026-03-24 08:46:58 +00:00
2026-03-05 21:38:55 +00:00
2026-03-08 02:57:44 +00:00
2026-03-19 09:30:35 +00:00
2026-02-26 10:57:07 +00:00
2026-02-27 13:47:42 -05:00
2026-02-24 12:19:04 -05:00
2026-02-26 10:57:07 +00:00
2026-02-20 08:50:08 -05:00
2026-02-24 17:57:18 +00:00
2026-02-21 10:23:33 -05:00
2026-02-24 17:57:18 +00:00
2026-02-20 08:50:08 -05:00
2026-02-20 08:50:08 -05:00
2026-02-20 08:50:08 -05:00
2026-03-02 02:01:27 +00:00
2026-02-27 20:09:26 +00:00
2026-02-25 10:03:57 +00:00
2026-02-21 16:30:40 +00:00
2026-02-17 19:58:15 +00:00
2026-02-17 10:13:19 +00:00
2026-02-21 10:23:33 -05:00
2026-03-20 21:22:10 +00:00
2026-03-09 13:01:58 -04:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-08 22:19:40 +00:00
2026-02-21 16:32:03 +00:00
2026-03-09 13:01:58 -04:00
2026-03-19 07:53:43 +00:00
2026-02-20 20:34:29 +00:00
2026-03-09 13:01:58 -04:00
2026-03-18 17:07:07 +00:00
2026-03-02 09:41:25 -05:00
2026-03-09 13:01:58 -04:00
2026-02-22 00:43:08 -05:00
2026-02-20 15:57:21 +00:00
2026-03-08 21:53:21 -04:00
2026-03-10 22:40:15 +00:00
2026-03-16 01:45:50 +00:00
2026-03-19 22:24:41 +00:00
2026-03-12 20:42:14 +00:00
2026-03-12 19:49:11 +00:00
2026-03-12 19:49:11 +00:00
2026-03-19 06:31:20 +00:00
2026-03-21 00:13:17 +00:00
2026-03-19 07:31:12 +00:00
2026-03-19 21:13:01 +00:00
2026-03-19 07:21:11 +00:00
2026-03-12 16:16:41 +00:00
2026-03-12 16:16:41 +00:00
2026-03-12 16:16:41 +00:00
2026-03-22 01:54:33 +00:00
2026-03-24 17:08:22 +00:00
2026-03-24 20:29:49 +00:00
2026-03-16 01:12:24 +00:00
2026-03-16 22:45:55 +00:00
2026-03-11 01:36:06 +00:00
2026-03-11 01:36:06 +00:00
2026-03-11 01:36:06 +00:00
2026-03-11 01:36:06 +00:00
2026-03-08 22:11:49 +00:00
2026-02-14 14:03:28 -05:00
2026-02-20 08:49:30 -05:00
2026-02-20 08:49:30 -05:00
2026-02-22 00:43:08 -05:00
2026-03-20 23:51:46 +00:00
2026-02-16 21:35:54 +00:00
2026-02-14 18:55:48 +00:00
2026-02-17 21:14:46 +00:00
2026-02-17 22:59:16 -05:00
2026-02-25 10:03:57 +00:00
2026-02-22 00:43:08 -05:00
2026-02-17 20:28:20 +00:00
2026-02-21 10:23:33 -05:00
2026-02-14 13:46:10 -05:00
2026-03-04 18:21:19 +00:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-18 10:09:06 +00:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-18 10:09:06 +00:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-20 21:22:10 +00:00
2026-03-05 19:20:39 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-11 00:40:07 +00:00
2026-03-13 18:21:50 +00:00
2026-03-13 18:21:50 +00:00
2026-03-13 18:21:50 +00:00
2026-03-13 18:21:50 +00:00
2026-03-16 12:11:08 +00:00
2026-03-16 12:11:08 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-05 21:38:55 +00:00
2026-03-09 13:01:58 -04:00
2026-02-20 15:57:21 +00:00
2026-02-25 10:03:21 +00:00
2026-02-22 00:43:08 -05:00
2026-02-20 02:54:08 +00:00
2026-03-02 02:01:27 +00:00
2026-02-25 10:03:57 +00:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-03-09 13:01:58 -04:00
2026-02-16 14:21:06 -05:00