diff --git a/family/documents/vault-sync/2026-06-01.md b/family/documents/vault-sync/2026-06-01.md index 78f9680a..a4773208 100644 --- a/family/documents/vault-sync/2026-06-01.md +++ b/family/documents/vault-sync/2026-06-01.md @@ -24,3 +24,22 @@ - `family/how-to/syncthing-truenas-android.md` — обновлён - `family/how-to/truenas-access.md` — обновлён - `personal/projects/personal-os/wiki-curation-runs/` — несколько файлов перемещены в `.stversions/` Syncthing-ом (предыдущие версии) + + +## 16:01 — cron sync summary + +**Статус:** ✅ Успешно +**Активность за день:** 8 циклов синхронизации (02:00–15:00) + +**Ключевые события:** +- Разрешены sync-conflict файлы от 2026-06-01 (13:51 и 14:51) — конфликты от Syncthing между Eagle и мной. Все переименованы обратно, конфликты разрешены. +- Очищены `.stversions/` — удалены 12 старых файлов wiki-curation-runs (15–29 мая) и workspace-mobile.json. +- `movies-watchlist.md` — синхронизированы изменения (Eagle → bare repo). +- `Untitled.canvas` — восстановлен из `.stversions/`. +- Удалены мусорные файлы: `Untitled.md`, `_index.md`, `wiki/ddg-asana-workflow.md`. + +**Неразрешённое:** удалены из vault (но не из git): +- `_index.md`, `Untitled.md`, `wiki/ddg-asana-workflow.md` — значатся как deleted в unstaged +- `work/briefs/` файлы — рабочие, vault их не хранит (ожидаемо) + +**Известная проблема:** `chmod on /obsidian-syncthing/.git/config.lock failed: Operation not permitted` — не влияет на синхронизацию, права на config.lock в контейнере. diff --git a/wiki/personal-os-catchup-plan-2026-04-27.md b/wiki/personal-os-catchup-plan-2026-04-27.md new file mode 100644 index 00000000..b5828408 --- /dev/null +++ b/wiki/personal-os-catchup-plan-2026-04-27.md @@ -0,0 +1,125 @@ +--- +source: raw/personal-os-catchup-plan-2026-04-27.md +content_hash: 5081ceb719104e1b7c6b5edd642c1daf38b3fd7cf1a96442a00516e7cdb15379 +namespace: work +last_synced: 2026-06-01 +confidence: 0.8 +tags: [personal-os, planning, executor, catchup] +--- + +# Personal OS — Catch-Up Plan (2026-04-27) + +Handoff doc for the executor agent: what to build next and why. Companion +to [[personal-os-state-2026-04-27]] (state snapshot). All open questions +resolved at write time; postponed: NAS migration, personal, Phase 2-family. + +## Architectural Principle + +**No new YAML files, no new shell scripts, no new launchd plists.** +Everything extends existing components: postgres tables, +`generate-status.js` queries, prompt files in `agent/prompts/`, Eagle's +SOUL.md rules. The system has enough moving parts. + +## Nine Deliverables (Dependency Order) + +### 1. Schema migration +Three additions to [[personal-os-schema]]: +- `corrections_log` — Tactic records pushback by `reason_tag`, + Retrospector aggregates patterns. Table beats markdown because + Retrospector needs `GROUP BY`. +- `executor_runs` — state machine for autonomous executor work + (`analyzing → awaiting_analysis_approval → fixing → pr_open → + ci_running → ci_failed → awaiting_user → complete`). Survives + worker crashes mid-run. +- `activity_daily.quadrant` column — `project | aor | career | + strategy | other` for Retrospector drift detection. + +### 2. `generate-status.js` — three new query blocks +- **Advisor pipeline**: last 14d advisor-tagged tasks → new `## ⚡ Career` + section. Empty result → omit (no noise). +- **Visibility gaps**: open Assessment / O-N / O-L tasks where Alex + hasn't commented in 7+ days → `## 📊 Visibility` section. +- **Quadrant classification at AW write time**: map project → quadrant + using a static map plus a *dynamic* "current top priority" slot read + from config so it shifts as focus shifts. + +### 3. `inbox-triage.md` STEP 0 +Gating + scope filter at prompt level (not wrapper) so the agent can +override on edge cases: +- Active calendar meeting → silent exit. +- `focus_score > 60` + Xcode/Cursor + 20+ min uninterrupted → silent + unless 🔴 section is 3h+ stale. +- Scope: only **new** signal (new human comments, new assignments, + Ship/TD status changes, new mentions). **Never** overdue tasks + (those belong in `daily-brief`, not `#inbox`). + +### 4. `retrospector.md` — SQL-based blocks +- Correction patterns: `reason_tag` count ≥ 3 in last 4 weeks. +- Quadrant drift: pivot weeks × quadrants; flag any quadrant < 5% for + 3+ weeks. Career quadrant gets strongest flag — it's first to collapse. +- Visibility: weekly count of strategic comments — measurable proxy + for the "thin Strategic Leadership" EP3 gap. + +### 5. Eagle SOUL.md — corrections_log writeback +On any user pushback, classify `reason_tag` and `INSERT INTO +corrections_log` *before* responding. Eagle writes, no separate hook — +the natural moment to capture a correction is during the conversation. + +### 6. Executor v2 — draft-PR flow +**Single human gate**: Analysis approval. Then autonomous: +worktree → build → test → branch → push → `gh pr create --draft +--assignee @me` (no `--reviewer`) → self-review comment → CI loop +(poll every 10 min, auto-fix up to 3 attempts, escalate on exhaustion). + +Hard prohibitions baked into the prompt: never push to `main` / +`develop` / `release/*`, never non-draft PR, never `--reviewer`, never +`gh pr merge`, never modify `.github/` or CI configs without explicit +thread confirmation. + +Draft + `assignee=@me` + no reviewers = durable surface visible in +"assigned to me" without dragging the team into WIP work. + +### 7. Microsoft 365 MCP into Hermes +Wire `outlook_calendar_search` into the Hermes MCP config so +`inbox-triage`, `weekly-plan`, and `daily-brief` can all check for +active meetings. STEP 0 gating depends on this. Wire once at the +config layer, not per prompt. + +### 8. Vault consolidation +Move process docs from `~/Developer/personal-os/` into +`~/obsidian/work/wiki/`. Runtime files (`system-prompt.md`, +`agent/prompts/*.md`, SOUL/IDENTITY) **stay in place**. +**Decision rule**: process/convention → vault; runtime config → +original location. **Copy** (don't move) `apple-browsers/.cursor/*.mdc` +files because Cursor IDE still reads them in-tree. Verification step +is non-negotiable — run each prompt/skill end-to-end after the move. + +### 9. Executor PR template (Option B — inline) +Team PR template requires manual confirmation of task / reviewer / +description. For the autonomous flow all three are deterministic. +Inline a variant in the executor prompt that auto-generates the body +(task link, root cause, fix summary, build/test status, self-review +checklist, notes for reviewer). Draft state is the safety net. + +## Execution Order + +Items 1–9 are largely independent; only Executor v2 (item 6 prompt +rewrite) requires schema (1), vault consolidation (8), and PR template +(9) first. Each step ends with a concrete test (insert a row, run a +query, post to thread, etc.). + +## "Done" Looks Like + +1. Retrospector says specific things ("deferred 4×", "Career <5% for 3 + weeks", "3 strategic comments vs 0"). +2. `#inbox` stays signal-dense — empty or 1–2 entries most days, no + pings during meetings. +3. `status.md` has a `## ⚡ Career` section. +4. Pushback in any channel → one DB row, no ceremony. +5. "fix [task]" in `#executor` → analysis → approval → draft PR within + 30 min for trivial bugs, CI runs autonomously. +6. Vault is the one searchable surface for `.mdc`, UI testing skill, + and process docs via [[obsidian-mcp]]. + +## Related +[[personal-os-state-2026-04-27]] [[personal-os-schema]] [[wiki-ingest-process]] [[ddg-asana-workflow]] diff --git a/wiki/personal-os-schema.md b/wiki/personal-os-schema.md new file mode 100644 index 00000000..b228621a --- /dev/null +++ b/wiki/personal-os-schema.md @@ -0,0 +1,100 @@ +--- +source: raw/schema.sql +content_hash: 71b47e47b483834c887de14c76d5b16506d90ad64198d76a92a7b3731132dab8 +namespace: work +last_synced: 2026-06-01 +confidence: 0.9 +tags: [personal-os, postgres, schema, database] +--- + +# Personal OS — Postgres Schema + +The `personal_os` database is the durable store behind the Personal OS. It +holds Asana state, the agent's annotations, the wiki, and semantic memory. +Created with `psql -U admin -d personal_os -f schema.sql`. + +## Extensions + +- `vector` — pgvector, used for embeddings (tasks, wiki, memory) +- `pg_trgm` — trigram GIN index on `tasks.name` for fuzzy search + +## Core Tables + +### `tasks` +One row per Asana task GID, upserted every sync. Mirrors enough of the Asana +task object to answer questions without round-tripping. `source` tracks +*how* we discovered the task: `my_tasks` | `following` | `delegated` | +`project` — highest-priority single value when multiple apply. Includes +`possibly_deleted` + `last_seen_in_full_sync` for soft deletion. The full +API response is preserved in `raw_json` (JSONB). + +### `stories` +Raw Asana event log per task. `resource_subtype` is Asana's event type +(`comment_added`, `assigned`, `due_date_changed`, `section_changed`, etc.). +Both `text` and `html_text` are kept — the HTML lets us parse embedded task +GID references for [[task-edges]]. + +### `task_edges` +Directed graph of task→task relationships. `relation_type`: +`subtask` | `dependency` | `dependent` | `project_sibling` | `mention`. +`related_gid` may not yet exist in `tasks` (edges can point to unfetched +tasks). + +### `task_annotations` +Agent-written (or user-written) notes about tasks. `annotation_type`: +`irrelevant` | `watching` | `needs_action` | `snoozed`. The `note` column +holds the agent's reasoning. Tracked by `annotated_by` (`agent` | `user`). + +### `sync_state` +One row per logical sync stream. Keys include `my_tasks`, `following`, +`delegated`, `project:{gid}`, `workspace_events`. `cursor` is either an ISO +timestamp (`modified_since`) or an Events API sync_token. + +## Embeddings & Wiki + +### `task_embeddings` +1024-dim Voyage AI embeddings per task, HNSW index for cosine similarity. + +### `file_references` +Files / URLs queued for wiki ingest. `bookmark_data` stores macOS +security-scoped bookmarks (BYTEA). `wiki_stale=true` → next [[wiki-ingest-process]] +run will process it. `modification_log` (JSONB) keeps a hash-change trail. + +### `wiki_pages` +LLM-synthesised pages. `content` is markdown synthesis, **never** a raw +copy. `sources` (JSONB) links back to `file_references`. `superseded_by` +chains old versions. 1536-dim embedding for semantic search. +`confidence` — 0.6 inferred, 0.8 default, 0.9 structured source, 1.0 +human-written. + +### `memory_store` +Semantic memory accumulated from Discord / Claude / manual entries. +`type`: `fact` | `preference` | `decision` | `person`. `source`: +`discord` | `claude` | `manual`. Optional `expires_at` (null = permanent). + +## Namespacing + +All core tables carry `namespace TEXT NOT NULL DEFAULT 'work'`, constrained +to `work` | `personal` | `family`. Lets one DB serve multiple Personal OS +contexts without cross-leakage. + +## Views + +### `active_tasks` +Convenience view: not completed, not annotated `irrelevant`, not snoozed +into the future. Ordered by `source` priority (my_tasks → delegated → +following → project), then `due_on`, then `modified_at DESC`. The agent's +default starting point for daily review. + +## Key Design Choices + +- Asana stays the source of truth — DB is a queryable cache. +- `raw_json` on tasks preserves un-modeled fields without schema churn. +- `task_edges.related_gid` is intentionally not a foreign key — we record + references to tasks we haven't fetched. +- Annotations are append-keyed by `(task_gid, annotation_type)` so the + agent can have one note per category without overwriting history via + the [[corrections-log]] table. + +## Related +[[personal-os-state-2026-04-27]] [[wiki-ingest-process]] [[personal-os-catchup-plan-2026-04-27]] [[ddg-asana-workflow]] diff --git a/wiki/personal-os-state-2026-04-27.md b/wiki/personal-os-state-2026-04-27.md new file mode 100644 index 00000000..3e203e60 --- /dev/null +++ b/wiki/personal-os-state-2026-04-27.md @@ -0,0 +1,131 @@ +--- +source: raw/personal-os-state-2026-04-27.md +content_hash: 1640cb63145b49263b9476e2c39fe443ac561fdf6c27faccc50cfc8568552614 +namespace: work +last_synced: 2026-06-01 +confidence: 0.8 +tags: [personal-os, state, snapshot, executor] +--- + +# Personal OS — State Snapshot (2026-04-27) + +Current state after the [[personal-os-catchup-plan-2026-04-27|catch-up +plan]] executed. Supersedes `state-2026-04-27.md` and +`personal-os-plan-v3.md`. + +## Infrastructure (✅ Live) + +| Component | Notes | +|-----------|-------| +| PostgreSQL `personal_os` | tasks, stories, task_edges, sync_state, signal_queue, activity_daily — see [[personal-os-schema]] | +| `sync.js` | 4-source Asana fetch, incremental deltas, `sweepRecentlyCompleted()` | +| `generate-status.js` | DB → `status.md` + `asana_context.md`, `possibly_deleted` filter fixed | +| ActivityWatch | DDG browser watcher + Xcode watcher | +| Hermes v0.11.x | launchd `ai.hermes.gateway`, Claude Code OAuth, `claude-sonnet-4-6` | +| Discord bot `Орёл#0898` | No `@`-mention required; channels: `#daily-brief #inbox #focus #executor #projects #journal #retrospector` | + +## Automation + +**Hermes cron** (workdays): data-pipeline `*/30`, morning-brief 08:30, +eod-summary 18:00, inbox-check `*/30 9-19`, weekly-plan Mon 08:00, +weekly-review Fri 17:00, retrospector Fri 17:30, commit-vault 23:00. + +**launchd** (fires on wake): `personal.os.heartbeat` `:05` hourly +(watchdog), `personal.os.wiki-ingest` 22:00 daily (see +[[wiki-ingest-process]]). + +## Vault Layout + +Git remote: `ssh://truenas_admin@mallexxx.duckdns.org/mnt/RED_2TB/storage/git/obsidian-vault.git` + +``` +~/obsidian/ +├── wiki/ ← LLM-generated (this skill) + human-written (confidence 1.0) +├── raw/ ← symlinks to external sources +├── work/ ← Eagle write zone (projects/, decisions/, tech-design/) +├── personal/ +└── family/ +``` + +## Agent Prompts (`agent/prompts/`) +`daily-brief`, `weekly-plan`, `weekly-review`, `inbox-triage`, +`generate-status`, `wiki-ingest`, `executor-bug-fix`, +`executor-td-review`. + +## Catch-up Plan — Execution Status + +All ten items shipped: +1. Schema migration ✅ (corrections_log, executor_runs, activity_daily.quadrant) +2. MS365 MCP 🟡 — cloud connector works in Claude Code; Hermes `claude -p` will pick it up once exposed to the CLI env. No local npm package available. +3. `inbox-triage` STEP 0 ✅ +4. Advisor + visibility + executor queue queries ✅ (first run: 5 advisor opps, 8 visibility gaps, 10 executor queue items) +5. Quadrant classification + `upsertActivityDaily` ✅ +6. Retrospector SQL blocks ✅ +7. SOUL.md writeback to `corrections_log` ✅ +8. Vault consolidation ✅ (43 `.cursor/rules/*.mdc` files in `~/obsidian/work/wiki/apple-browsers/`) +9. Inline PR template ✅ +10. Executor v2 prompt ✅ (prompt written; not yet exercised on a real task) + +## Open Items + +| Item | Status | +|------|--------| +| Executor v2 end-to-end live run | 🟡 not yet exercised | +| `work/projects/` | 🟡 empty — Eagle fills on first relevant convo | +| MS365 MCP in Hermes runtime | 🟡 blocked on CLI env exposure | +| Phase 2-family | 🔴 deferred until after Phase 4 | + +## Executor v2 — Design Summary + +On-demand worker that evaluates the backlog, picks a task, spawns a +sub-agent in a Discord thread under `#executor`, streams progress, +opens a draft PR, self-reviews, runs a CI poll loop (every 10 min, 3 +auto-fix attempts), and surfaces summaries in daily/weekly briefs. + +Trigger modes: user-initiated (`fix [task]` in `#executor`), scheduled +(Friday weekly-review suggests next), and status-driven +(`## ⚡ Executor Queue` in `status.md`). + +Task qualification SQL: assigned to me, not completed, not +`possibly_deleted`, no stories in 14 days, due in next 30 days. + +Worktree path: `~/DuckDuckGo/apple-browsers.git/.claude/worktrees/executor-{gid}-{slug}/`. +Scheme: `DuckDuckGo macOS` (workspace required, `xcbeautify` required). + +Cleanup on merge/close: `git worktree remove --force` + +`git push --delete executor/` + stop/delete VM if used. + +## Key Divergences From Plan v3 (Reasoning) + +1. **wiki-ingest moved from Hermes cron → launchd `claude -p`** — + needs local filesystem (read raw, write vault); Hermes agents only + touch the API. +2. **`personal-wiki` MCP → `obsidian-mcp`** — the custom DB-backed + wiki was never finished; standard package over `~/obsidian/` + replaces it. `wiki_pages` / `file_references` tables dropped. +3. **Per-job launchd plists → single hourly heartbeat** — one + watchdog reads `jobs.json` and triggers missed one-per-day jobs. + Frequent jobs self-recover within Hermes's 2-hour grace window. +4. **Retrospector split out of weekly-review** — separate prompt, + separate cron, separate `#retrospector` channel; weekly-review + rewritten without duplicate `OUTPUT FORMAT` blocks. +5. **NAS git path `/home/...` → `/mnt/RED_2TB/storage/git/`** — boot + pool is wiped on TrueNAS OS update; persistent data must live on + `/mnt/`. +6. **Phase 2-family deferred** — VPS + family Hermes + iCloud vault + sync waits until Executor v2 (Phase 4) proves itself. +7. **Executor v1 = manual-only STOP gates** — first autonomous code + agent ships conservative; v2 (single gate + PR/CI loop) follows. +8. **wiki-ingest rewritten DB-first → file-based** — vault is now + source of truth; SHA256 content_hash in frontmatter does + incremental sync without DB dependency. See [[wiki-ingest-process]]. + +## Known Tech Debt + +- Morning brief not yet smoke-tested in production +- `executor-bug-fix.md` v1 is the live prompt — needs replacement with v2 +- NAS SSH key still in boot-pool `/home` — must migrate to `/mnt/RED_2TB/` +- Hermes memory (`~/.hermes/memory/`) not backed up + +## Related +[[personal-os-catchup-plan-2026-04-27]] [[personal-os-schema]] [[wiki-ingest-process]] [[ddg-asana-workflow]] diff --git a/wiki/wiki-ingest-process.md b/wiki/wiki-ingest-process.md new file mode 100644 index 00000000..3cb55a34 --- /dev/null +++ b/wiki/wiki-ingest-process.md @@ -0,0 +1,89 @@ +--- +source: raw/wiki-ingest-prompt.md +content_hash: 29f6a0914d428cf62eeb2a832d6b3048edf3e1d16aa7714c09f686377394d128 +namespace: work +last_synced: 2026-06-01 +confidence: 0.9 +tags: [personal-os, wiki, agent-prompt, obsidian] +--- + +# Wiki Ingest — Process + +Daily process that keeps `~/obsidian/wiki/` synchronised with external +source files surfaced via symlinks in `~/obsidian/raw/`. Runs as a +launchd subprocess (`personal.os.wiki-ingest`) invoking `claude -p` — +not a Hermes cron job, because it needs local filesystem access to read +sources and write wiki pages. + +## Flow + +### STEP 0 — Discover changed files +For each entry in `~/obsidian/raw/`: +1. Read the symlink target. +2. Compute `shasum -a 256`. +3. Scan `~/obsidian/wiki/` for any `.md` whose frontmatter has + `source: raw/`. +4. If page exists AND `content_hash` matches → **skip** (unchanged). +5. Otherwise → queue for processing. +6. If a symlink is broken, skip silently — never create a page for + missing content. + +Empty queue → print "Wiki is up to date. Nothing to ingest." and exit. + +### STEP 1 — Synthesise (per file) +- Update an existing wiki page if one references the source, otherwise + create `~/obsidian/wiki/.md` named by **topic, not source + filename** (e.g. `personal-os-schema.md`, not `schema.md`). +- Write a synthesis: extract key facts, decisions, structure — **never + copy verbatim**. +- Cap at ~800 words; split big topics into linked pages. +- Use `[[wiki-links]]` for cross-references. + +### STEP 2 — Report +Print processed / created / updated / skipped counts and a list of +touched pages. + +## Frontmatter Schema + +```yaml +source: raw/ +content_hash: +namespace: work +last_synced: +confidence: 0.8 +tags: [tag1, tag2] +``` + +`content_hash` and `last_synced` are always updated after a write — they +are how the next ingest decides what changed. + +## Confidence Scale + +| Value | Meaning | +|-------|---------| +| 0.6 | inferred or partial content | +| 0.8 | clear single source (default) | +| 0.9 | highly structured, authoritative source (e.g. SQL schema) | +| 1.0 | reserved for human-written notes in `work/`, `personal/`, `family/` | + +## Hard Rules + +- **Never** verbatim-copy source files; always synthesise. +- **Never** edit files marked `confidence: 1.0` — those are + human-authored. +- **Never** process `namespace: family` files unless explicitly told. +- Always update `content_hash` and `last_synced` after writing. +- Broken symlink → skip, do not create. + +## Why File-Based, Not DB-Backed + +Earlier design (v3) had `wiki_pages` / `file_references` tables drive +ingest via SQL. That was replaced by file-based ingest because +[[obsidian-mcp]] now exposes the vault directly — the filesystem is the +source of truth and the DB tables would have been a duplicate index of +the same content. The Postgres tables for [[personal-os-schema|wiki_pages]] +still exist but the agent doesn't read or write them anymore (see +[[personal-os-state-2026-04-27|Decision 8]]). + +## Related +[[personal-os-schema]] [[personal-os-state-2026-04-27]] [[personal-os-catchup-plan-2026-04-27]]