4.4 KiB
namespace, tags, last_updated, confidence
| namespace | tags | last_updated | confidence | ||||
|---|---|---|---|---|---|---|---|
| work |
|
2026-05-15 | 1.0 |
Personal OS — Agent Rules & Architecture
Eagle (Орёл) is the Zulip-facing Hermes agent. This page documents what Eagle knows about its own environment and how to reason about it.
Data Flow
Asana API
→ sync.js (every 30 min, workdays via Hermes cron)
→ PostgreSQL (tasks, stories, task_edges, sync_state, task_annotations)
→ generate-status.js
→ ~/Developer/personal-os/asana_context.md ← raw Asana context (inbox-check)
→ ~/context/status.md ← Eagle reads THIS
Eagle only reads ~/context/status.md. It never touches the DB directly or calls Asana API.
Eagle's Knowledge Sources
~/context/status.md— live Asana + ActivityWatch snapshot (updated every 30 min)~/Developer/personal-os/briefs/daily/YYYY-MM-DD.md— today's brief~/Developer/personal-os/briefs/weekly/plan-MONDAY.md— weekly plan~/obsidian/wiki/— knowledge base (via obsidian MCP)~/Developer/personal-os/agent/— playbooks and rules (via file tools)
Feedback Loop
When Alex corrects something:
- Edit the brief directly (show diff first, confirm before writing)
- If systemic → edit the prompt template in
agent/prompts/ - Log correction silently to
corrections_logtable:
INSERT INTO corrections_log (date, week_number, source, original_plan, correction, deferred_gids, reason_tag)
VALUES (current_date, EXTRACT(WEEK FROM current_date)::int,
'<source>', '<original>', '<user_message>',
ARRAY[<gids>]::text[], '<reason_tag>');
source values: zulip_pushback | morning_brief_correction | manual
reason_tag examples: ship-review-crunch | urgent-bug | meeting-day | over-estimated | scope-change
Never announce the log insertion. It is silent instrumentation.
Self-Diagnostics
If pipeline seems stale, Eagle can check:
stat -f "%Sm" ~/context/status.md
# Should be < 40 min old on workdays
If sync is broken:
bash ~/scripts/run-pipeline.sh
# Runs sync.js + generate-status.js + healthcheck
If wiki is stale:
bash ~/scripts/run-wiki-ingest.sh
# Runs at 22:00 via launchd; call manually if needed
Cron Schedule (Hermes)
| Job | Schedule | Channel |
|---|---|---|
| data-pipeline | */30 7-21 workdays | silent |
| morning-brief | 08:30 workdays | #daily-brief (Zulip → MM post-migration) |
| eod-summary | 18:00 workdays | #daily-brief (Zulip → MM post-migration) |
| inbox-check | */30 9-19 workdays | #inbox (Zulip → MM post-migration) |
| weekly-plan | Mon 08:00 | #daily-brief (Zulip → MM post-migration) |
| weekly-review | Fri 17:00 | #daily-brief (Zulip → MM post-migration) |
| retrospector | Fri 17:30 | #retrospector |
| commit-vault | 23:00 daily | silent |
| wiki-curation | 02:00 daily | silent (cron report) |
⚠️ Work channels (morning-brief, eod-summary, inbox-check, weekly-plan, weekly-review) migrating from Zulip → Mattermost. Blocked on IT Ops MM bot accounts. See
work/plans/mattermost-migration.md.
wiki-ingest runs at 22:00 via launchd (not Hermes) — because it needs Mac filesystem access.
wiki-curation runs at 02:00 daily via Hermes cron — llm-wiki skill, lints and updates wiki/ folder.
Allowed File Writes
Eagle can write to:
briefs/daily/YYYY-MM-DD.mdbriefs/weekly/plan-MONDAY.mdbriefs/weekly/YYYY-MM-DD.mdbriefs/inbox/YYYY-MM-DD.mdagent/prompts/*.md(with confirmation)~/obsidian/work/projects/SLUG.md~/obsidian/work/decisions/YYYY-MM-TOPIC.md~/obsidian/personal/~/obsidian/family/
Never write to obsidian/wiki/ directly — that's wiki-ingest's job.
Never write corrections_log.md — use the SQL INSERT above (table, not file).
Activity Classification
Work activity is classified via aw-projects.json. Projects with namespace: "personal" (e.g., AXPressDeck, media_files_db) appear as a footnote in the Activity section of status.md but are not counted as work time and not upserted to activity_daily.
To re-classify a project (personal ↔ work), ask Eagle to edit aw-projects.json.
See Also
- personal-os-architecture — full system map and data flows
- personal-os-self-modification — how to safely change prompts, schema, crons
- vault-filling-guide — what goes where in the Obsidian vault