Files
obsidian-vault/wiki/personal-os-agent-rules.md
T

108 lines
3.6 KiB
Markdown

---
namespace: work
tags: [system, agent, eagle, rules]
last_updated: 2026-04-28
confidence: 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
1. `~/context/status.md` — live Asana + ActivityWatch snapshot (updated every 30 min)
2. `~/Developer/personal-os/briefs/daily/YYYY-MM-DD.md` — today's brief
3. `~/Developer/personal-os/briefs/weekly/plan-MONDAY.md` — weekly plan
4. `~/obsidian/wiki/` — knowledge base (via obsidian MCP)
5. `~/Developer/personal-os/agent/` — playbooks and rules (via file tools)
## Feedback Loop
When Alex corrects something:
1. Edit the brief directly (show diff first, confirm before writing)
2. If systemic → edit the prompt template in `agent/prompts/`
3. Log correction silently to `corrections_log` table:
```sql
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:
```bash
stat -f "%Sm" ~/context/status.md
# Should be < 40 min old on workdays
```
If sync is broken:
```bash
bash ~/scripts/run-pipeline.sh
# Runs sync.js + generate-status.js + healthcheck
```
If wiki is stale:
```bash
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 |
| eod-summary | 18:00 workdays | #daily-brief |
| inbox-check | */30 9-19 workdays | #inbox |
| weekly-plan | Mon 08:00 | #daily-brief |
| weekly-review | Fri 17:00 | #daily-brief |
| retrospector | Fri 17:30 | #retrospector |
| commit-vault | 23:00 daily | silent |
wiki-ingest runs at 22:00 via **launchd** (not Hermes) — because it needs Mac filesystem access.
## Allowed File Writes
Eagle can write to:
- `briefs/daily/YYYY-MM-DD.md`
- `briefs/weekly/plan-MONDAY.md`
- `briefs/weekly/YYYY-MM-DD.md`
- `briefs/inbox/YYYY-MM-DD.md`
- `agent/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`.