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.
34 lines
1.2 KiB
Markdown
34 lines
1.2 KiB
Markdown
---
|
|
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](../../docs/datetime.md).
|