Files
EverOS/.claude/rules/datetime-handling.md
Elliot Chen 518b8eca85 chore: initialize EverOS 1.0.0
md-first memory extraction framework for AI agents.

Markdown is the single source of truth; SQLite holds state and LanceDB
provides the rebuildable vector + BM25 + scalar index. The codebase follows
a single-direction DDD layering (entrypoints -> service -> memory -> infra,
with component / core / config cross-cutting) enforced by import-linter.

Engineering surface:
- Coding conventions in .claude/rules/ (path-scoped) and workflows in
  .claude/skills/ (/commit, /new-branch, /pr).
- GitHub Actions CI runs make lint + test + integration; pre-commit mirrors
  the gates locally (ruff, hygiene hooks, gitlint commit-msg).
- Commit messages follow Conventional Commits, enforced by gitlint.
- make lint also enforces datetime two-zone discipline and OpenAPI drift.
2026-06-06 07:33:17 +08:00

1.2 KiB

paths
paths
src/**/*.py
tests/**/*.py

Datetime handling rule (two-zone discipline)

Never construct or read "now" directly. All datetime flows through everos.component.utils.datetime. This is a hard CI gate (make check-datetime, wired into make lint).

Banned (the checker fails the build on these)

  • datetime.now(), datetime.utcnow(), datetime.today()
  • time.time(), time.time_ns()
  • datetime(YYYY, ...) without tzinfo=
  • .astimezone(...) / .replace(tzinfo=...) outside the helper module

Use instead

Need Helper
"now" for storage (UTC) get_utc_now()
"now" for display (configured TZ) get_now_with_timezone()
today's date, display TZ today_with_timezone()
normalize a value to UTC ensure_utc(d)
render to display TZ to_display_tz(d)
parse ISO / epoch / str from_iso_format(v), from_timestamp(ts)
serialize to_iso_format(d), to_date_str(d), to_timestamp_ms(d)

Two zones: persist in UTC, present in the configured display TZ. Crossing them goes through the helpers — never ad-hoc. See docs/datetime.md.