diff --git a/wiki/personal-os-catchup-plan-2026-04-27.md b/wiki/personal-os-catchup-plan-2026-04-27.md deleted file mode 100644 index c8306b46..00000000 --- a/wiki/personal-os-catchup-plan-2026-04-27.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -source: raw/personal-os-catchup-plan-2026-04-27.md -content_hash: 5081ceb719104e1b7c6b5edd642c1daf38b3fd7cf1a96442a00516e7cdb15379 -namespace: work -last_synced: 2026-05-31 -confidence: 0.9 -tags: [personal-os, planning, executor, catch-up-plan] ---- - -# Personal OS — Catch-Up Plan (2026-04-27) - -Handoff plan to the executor agent — what to build next and why. -Companion to [[personal-os-state-2026-04-27]] (current state). - -## Context - -Alex is a macOS Browser DRI at DuckDuckGo, ADHD profile, fully async -work. The Personal OS holds work context outside Alex's head so -comments don't get lost, the day doesn't drift, and career goals -don't get crushed by the current project. - -Four-agent design: **Стратег** (Strategist, ✅), **Тактик** (Tactician, -🟡 partial), **Ретроспектор** (Retrospector, ✅), **Исполнитель** -(Executor, 🟡 v1 only). - -## Architectural Principle - -**No new YAML files, shell scripts, or launchd plists.** Everything -extends what's there: Postgres tables, `generate-status.js` queries, -prompts in `agent/prompts/`, and Eagle's `SOUL.md`. The system has -enough moving parts. - -## Nine Deliverables (dependency-ordered) - -### 1.1 Schema migration -Three changes (see [[personal-os-schema]]): -- `corrections_log` table — Tactic records pushback, Retrospector - aggregates patterns by `reason_tag` / `week_number`. -- `executor_runs` table — state machine for autonomous Executor work - (states: `analyzing → awaiting_analysis_approval → fixing → pr_open - → ci_running → ci_failed → awaiting_user → complete | abandoned`). -- `activity_daily.quadrant` column — - `project | aor | career | strategy | other`. - -### 1.2 generate-status.js — three new query blocks -- **Career: Advisor Opportunities** — ILIKE `%Project Advisor%` notes, - modified ≤14d. Empty → omit section. -- **Visibility: Active Assessments** without Alex's input in 7+ days. -- **Quadrant classification** at AW write time, dynamic top-priority - project read from config (iOS toggle today won't be the TP in June). - -### 1.3 inbox-triage.md — STEP 0 gating -- **0a Focus check** — read latest `activity_daily`, check MS365 - calendar for active meeting. Active meeting OR - `focus_score>60 AND current_app IN (Xcode,Cursor,VSCode) AND >20m - no switch` → exit silently unless `status.md` has 🔴 sections >3h. -- **0b Scope filter** — `#inbox` is NEW SIGNAL ONLY. Exclude overdue - (lives in daily-brief), system events, already-responded tasks. - Include only new human comments, new assignments, ship/TD status - changes, mentions in untracked tasks. - -Gating in the prompt (not a wrapper) so the agent can override on -edge cases (e.g. Dominik directly tagging Alex during deep focus). - -### 1.4 retrospector.md — three SQL blocks -Replaces the markdown `corrections_log.md`. Surfaces correction -patterns (≥3 in 4 weeks by `reason_tag`), quadrant drift (4-week × -4-quadrant pivot, flag <5% for 3+ weeks), and visibility this week -(strategic comment count). - -### 1.5 Eagle SOUL.md — corrections_log writeback -On pushback in any channel, Eagle classifies (`discord_pushback | -morning_brief_correction | manual`), tags the reason -(`ship-review-crunch | urgent-bug | meeting-day | ...`), INSERTs a -row via psql, then responds normally without announcing the insert. - -### 1.6 Executor v2 — draft-PR autonomous flow -Single human gate: **Analysis approval.** After that, autonomous. - -Pipeline: Analysis → STOP → Fix → Build (`xcodebuild`) → Test → -`executor/-` branch → push → `gh pr create --draft ---assignee @me --title "[executor] ..."` (NO `--reviewer`) → -self-review → CI poll every 10 min (max 3 auto-fix attempts). - -Hard prohibitions: no push to main/develop/release, no non-draft PRs, -no `--reviewer`, no `gh pr merge`, no force-push, no `.github/` or -CI config edits. - -Draft + assignee=@me + no reviewers because the goal is **durable -surface, not interruption.** Discord scrolls; GitHub doesn't. - -### 1.7 MS365 MCP wired into Hermes -Calendar access for `inbox-triage`, `weekly-plan`, `daily-brief`. Only -needs `outlook_calendar_search` between now and now+1h. Wire once at -Hermes config layer, not per-prompt. - -### 1.8 Vault consolidation -Move process docs into `~/obsidian/work/wiki/`. Decision rule: -**process/conventions/workflows → vault; runtime configs read by -agents → leave in place.** `.cursor/*.mdc` files are **copied** (not -moved) because Cursor IDE still reads them from `apple-browsers/.cursor/`. -Frontmatter notes the original path. Verification after every move -is non-negotiable (silent skill breakage is the failure mode). - -### 1.9 Executor PR template (Option B inline) -Adapted variant — team template requires manual confirmation of -task/reviewer/description; Executor knows all three deterministically. -Inline the template in the prompt rather than checking a file into -`.github/`. The draft state IS the safety net. - -## Order of Execution - -Items 1–9 in any order. Item 10 (Executor v2 prompt) needs schema -(1.1) + vault consolidation (1.8) + PR template (1.9) done first. - -**No new Discord channels needed.** Existing seven cover everything. - -## Open Questions — All Resolved - -- macOS repo: `~/DuckDuckGo/apple-browsers/main`, sibling executor - worktrees. -- Xcode scheme: one-time discovery during Executor v2 setup, hardcoded - into config. -- GitHub remote: `gh` CLI auto-detects from worktree. -- No CODEOWNERS file → no auto-assigned reviewers. -- Team OK with `[executor]` drafts on Alex only. - -Postponed: NAS, personal, Phase 2-family. - -## Definition of Done - -1. Friday retrospector says specific things ("deferred bug work 4× - for ship-review-crunch", "career quadrant <5% three weeks"). -2. `#inbox` shows only new human signal; silent during meetings. -3. `status.md` has `## ⚡ Career` section, empty when nothing. -4. Pushing back on Discord adds one `corrections_log` row, no - ceremony. -5. `fix [task]` in `#executor` → analysis post → approval → draft - PR in GitHub within 30 min for trivial bugs. -6. Vault contains UI skill, all `.cursor/*.mdc`, and process docs, - all reachable 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 deleted file mode 100644 index 740afe5c..00000000 --- a/wiki/personal-os-schema.md +++ /dev/null @@ -1,118 +0,0 @@ ---- -source: raw/schema.sql -content_hash: 71b47e47b483834c887de14c76d5b16506d90ad64198d76a92a7b3731132dab8 -namespace: work -last_synced: 2026-05-31 -confidence: 0.9 -tags: [personal-os, postgres, schema, database] ---- - -# Personal OS — Postgres Schema - -The `personal_os` Postgres database is the system of record for Asana sync, -agent annotations, wiki sources, and semantic memory. Extensions: `vector` -(pgvector) and `pg_trgm`. - -## Core Asana Tables - -### `tasks` -One row per Asana task GID, upserted on every sync. Tracks name, notes -(plain + HTML), due/start dates, completion, assignee, creator, project -membership, and a `source` enum: - -- `my_tasks` — assigned to me, in My Tasks sections -- `following` — I'm a follower (CC'd, commented) -- `delegated` — I created it, someone else is assignee -- `project` — member of a project, not otherwise classified - -Sync bookkeeping: `fetched_at`, `stories_fetched_before` (cursor for -incremental story pulls), `raw_json` (full Asana response). - -Later additions: `namespace` (default `work`), `possibly_deleted`, -`last_seen_in_full_sync`. - -Indexes cover modified time, due date (partial WHERE NOT completed), -section, assignee, source, completed, and trigram on `name` for fuzzy -search. - -### `stories` -Raw event log per task. `resource_subtype` is Asana's event type -(`comment_added`, `assigned`, `due_date_changed`, `section_changed`, -`dependency_added`, `attachment_added`, `marked_complete`, etc.). Stores -both plain text and HTML so embedded task GID refs can be parsed out. - -### `task_edges` -Directed graph between tasks. `relation_type`: - -- `subtask` — related is a subtask of task -- `dependency` — task is blocked by related -- `dependent` — task is blocking related -- `project_sibling` — same project + section -- `mention` — related was referenced in a story on task - -Composite PK `(task_gid, related_gid, relation_type)`. `related_gid` may -not yet exist in `tasks`. - -### `task_annotations` -Agent-written (or user-written) tags. `annotation_type`: `irrelevant`, -`watching`, `needs_action`, `snoozed`. Includes agent reasoning note and -`snoozed_until` date. `annotated_by` distinguishes agent vs user. - -### `sync_state` -One row per logical sync stream keyed by stream name (`my_tasks`, -`following`, `delegated`, `project:{gid}`, `workspace_events`). Stores -`cursor` (ISO timestamp or events sync_token) and `full_sync_at` for -when the last full pull happened. - -## Vector / Wiki / Memory Tables - -### `task_embeddings` -Voyage AI 1024-dim vectors with HNSW cosine index for semantic task -search. - -### `file_references` -Tracks files (macOS security-scoped bookmarks in `bookmark_data`) and -web URLs that should be ingested into the wiki. `content_hash` for -incremental sync, `wiki_stale=true` triggers reprocessing, -`modification_log` keeps before/after hash history. Namespace constrained -to `work | personal | family`. - -### `wiki_pages` -LLM-synthesised wiki entries (NOT raw copies). Carries `sources` JSONB, -`confidence` float, `superseded_by` self-ref for version chains, -`last_synced_hash`, and a 1536-dim embedding for semantic search. **Note: -the live system has moved off this table** — the wiki now lives in the -Obsidian vault (`~/obsidian/wiki/`) and uses file-frontmatter hashing -instead. See [[wiki-ingest-process]]. - -### `memory_store` -Semantic memory accumulated from Discord/Claude/manual sources. -`type`: `fact | preference | decision | person`. Carries entity refs in -JSONB, 1536-dim embedding, optional `expires_at` (null = permanent). - -## Views - -### `active_tasks` -Convenience view: non-completed, non-irrelevant, non-snoozed tasks -joined with their annotations. Ordered by source priority -(`my_tasks > delegated > following > project`), then due date, then -modified date. Used as the starting point for the agent's daily review. - -## Migration Tables (Catch-Up Plan 2026-04-27) - -Three additions land via the catch-up plan and are referenced by the -state doc as `✅` applied: - -- `corrections_log` — Tactic records pushback, Retrospector aggregates - patterns by `reason_tag` and `week_number`. -- `executor_runs` — state machine row per Executor task (states: - `analyzing → awaiting_analysis_approval → fixing → pr_open → - ci_running → ci_failed → awaiting_user → complete | abandoned`). -- `activity_daily.quadrant` — column added for weekly drift detection - (`project | aor | career | strategy | other`). - -See [[personal-os-catchup-plan-2026-04-27]] for the rationale (DB over -markdown/YAML, extend existing components). - -## Related -[[personal-os-state-2026-04-27]] [[personal-os-catchup-plan-2026-04-27]] [[wiki-ingest-process]] diff --git a/wiki/personal-os-state-2026-04-27.md b/wiki/personal-os-state-2026-04-27.md deleted file mode 100644 index ed137e43..00000000 --- a/wiki/personal-os-state-2026-04-27.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -source: raw/personal-os-state-2026-04-27.md -content_hash: 1640cb63145b49263b9476e2c39fe443ac561fdf6c27faccc50cfc8568552614 -namespace: work -last_synced: 2026-05-31 -confidence: 0.9 -tags: [personal-os, state-snapshot, architecture, executor] ---- - -# Personal OS — State Snapshot 2026-04-27 - -Current state of the Personal OS after the catch-up plan was executed. -Supersedes earlier `state-2026-04-27.md` and `personal-os-plan-v3.md`. - -## Infrastructure (✅ all live) - -- **PostgreSQL on Mac** — tasks, stories, task_edges, sync_state, - signal_queue, activity_daily. See [[personal-os-schema]]. -- **sync.js** — 4-source Asana fetch with incremental deltas and - `sweepRecentlyCompleted()`. -- **generate-status.js** — DB → `status.md` + `asana_context.md`. -- **ActivityWatch** — DDG browser watcher + Xcode watcher. -- **Hermes v0.11.x** — launchd daemon `ai.hermes.gateway`, Claude Code - OAuth, `claude-sonnet-4-6` backend. -- **Discord bot Орёл#0898** — no @-mention required. Channels: - `#daily-brief #inbox #focus #executor #projects #journal #retrospector`. - -## Automation Schedule - -Hermes crons handle data-pipeline (every 30 min, 7–21 workdays), -morning-brief (08:30), eod-summary (18:00), inbox-check (every 30 min, -9–19 workdays), weekly-plan (Mon 08:00), weekly-review (Fri 17:00), -retrospector (Fri 17:30 → `#retrospector`), commit-vault (23:00). - -Mac-level launchd agents (fire on wake after sleep): -- `personal.os.heartbeat` — `:05` hourly watchdog, triggers missed - one-per-day Hermes jobs. -- `personal.os.wiki-ingest` — 22:00 daily, `claude -p` writes - `~/obsidian/wiki/`. See [[wiki-ingest-process]]. - -## Obsidian Vault - -Git remote: `ssh://truenas_admin@mallexxx.duckdns.org/mnt/RED_2TB/storage/git/obsidian-vault.git` -(under `/mnt/` because TrueNAS wipes `/home/` on OS updates). - -``` -~/obsidian/ -├── wiki/ ← LLM-generated, except confidence: 1.0 hand-written notes -├── raw/ ← symlinks to source files -├── work/ ← Eagle writeable (projects/, decisions/, tech-design/) -├── personal/ ← Eagle writeable -└── family/ ← family namespace -``` - -## Catch-Up Plan Execution - -All 10 items applied. See [[personal-os-catchup-plan-2026-04-27]] for -the full plan. Notable status: - -- Schema migration (corrections_log, executor_runs, quadrant column) ✅ -- inbox-triage STEP 0 with focus + overdue exclusion ✅ -- generate-status.js: advisor + visibility + executor queue ✅ -- quadrant classification + `upsertActivityDaily()` ✅ -- Retrospector SQL-based patterns/quadrant drift/visibility ✅ -- SOUL.md corrections_log writeback via SQL INSERT ✅ -- Vault consolidation — 43 `.cursor/rules/*.mdc` in - `~/obsidian/work/wiki/apple-browsers/` ✅ -- Executor v2 prompt rewrite (single STOP gate, autonomous PR + CI - loop) ✅ -- **MS365 MCP in Hermes** — 🟡 cloud connector only, available in - Claude Code sessions; `claude -p` jobs will pick it up once exposed - to the CLI env. - -## Executor v2 Architecture - -On-demand autonomous worker that evaluates the macOS backlog, -prioritises, spawns a worker agent in a Discord thread under -`#executor`, streams progress, opens a draft PR, self-reviews, and -monitors CI. - -**Trigger modes:** user-initiated (`fix [task]` / `evaluate backlog`), -scheduled (Friday weekly-review surface), status-driven (`## ⚡ Executor -Queue` in `status.md`). - -**Task qualification:** assigned, not completed, no stories in 14+ days, -due in ≤30 days. Macos backlog filtered separately by project name. - -**Worker pipeline:** Analysis → STOP (approval gate) → Fix → Build → -Test → Branch → Push → `gh pr create --draft --assignee @me` -(no reviewer) → Self-review → CI poll every 10 min (max 3 auto-fix -attempts). - -**Hard prohibitions:** no push to main/develop/release, no `--reviewer` -flag, no `gh pr merge`, no modifying `.github/` or CI configs. - -Implementation phases 4a–4e cover evaluation engine, worker spawning, -PR/CI loop, feedback loop, scheduled evaluation. - -## Decisions Diverging from Plan v3 - -1. **wiki-ingest moved from Hermes cron → launchd subprocess** — Hermes - has no local filesystem; `claude -p` does. -2. **`personal-wiki` MCP replaced by `obsidian-mcp`** — DB tables - dropped, vault is canonical. -3. **Single heartbeat watchdog** instead of per-job launchd plists — - simpler, covers wake-from-sleep. -4. **Retrospector extracted** to standalone prompt + `#retrospector` - channel — separate signal from weekly-review. -5. **NAS git path** moved to `/mnt/RED_2TB/storage/git/` (boot pool - wipes on update; `backup/` was wrong directory). -6. **Phase 2-family deferred** until after Executor v2. -7. **Executor v1 prompts are manual-only** — STOP gates everywhere - until v2 proves itself. -8. **wiki-ingest rewritten file-based**, no more `file_references` / - `wiki_pages` DB tables. - -## Known Tech Debt - -- Morning brief was untested (first real run scheduled 08:30 next day). -- `work/projects/` empty — Eagle fills on first use. -- `executor-bug-fix.md` v1 still in place — replace with v2. -- Hermes memory not backed up to vault or NAS. - -## 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 deleted file mode 100644 index 1ce66402..00000000 --- a/wiki/wiki-ingest-process.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -source: raw/wiki-ingest-prompt.md -content_hash: 29f6a0914d428cf62eeb2a832d6b3048edf3e1d16aa7714c09f686377394d128 -namespace: work -last_synced: 2026-05-31 -confidence: 0.9 -tags: [personal-os, wiki, obsidian, agent-prompts] ---- - -# Wiki Ingest — Process & Prompt - -The wiki-ingest agent keeps `~/obsidian/wiki/` synchronised with external -source files exposed as symlinks in `~/obsidian/raw/`. It runs daily at -22:00 via the `personal.os.wiki-ingest` launchd agent, which invokes -`claude -p` as a local subprocess (Hermes can't reach the local -filesystem). See [[personal-os-state-2026-04-27]] Decision 1. - -## How sync works - -1. For every file in `~/obsidian/raw/`, compute SHA256 via - `shasum -a 256 | awk '{print $1}'`. -2. Search `~/obsidian/wiki/` for any `.md` with frontmatter - `source: raw/`. -3. If a page exists AND `content_hash` in frontmatter matches → skip. -4. Otherwise → queue for synthesis. -5. Broken symlinks → skip silently, do not create a page. - -If the queue is empty after the scan, output -"Wiki is up to date. Nothing to ingest." and stop. - -## Synthesis rules - -- **Never copy source files verbatim.** Extract key facts, decisions, - and structure. Keep each page under 800 words. -- Name the wiki file **by topic, not by source filename** - (e.g. `personal-os-schema.md`, not `schema.md`). -- If a topic is large, split into multiple linked pages. -- Cross-reference related pages with `[[double brackets]]`. -- Existing page found → update in place (preserving the file path). - -## Frontmatter format - -```markdown ---- -source: raw/ -content_hash: -namespace: work -last_synced: -confidence: 0.8 -tags: [tag1, tag2] ---- -``` - -`last_synced` and `content_hash` MUST be updated after every successful -write. - -## Confidence scale - -| Value | Meaning | -|-------|---------| -| 1.0 | Human-written notes in `work/`, `personal/`, `family/`. **Never edit these.** | -| 0.9 | Highly structured, authoritative source (e.g. schema files) | -| 0.8 | Clear single source (default) | -| 0.6 | Inferred or partial content | - -## Hard rules - -- Do not edit any wiki page with `confidence: 1.0` — those are - human-authored. -- Do not process `namespace: family` files unless explicitly instructed. -- Broken `raw/` symlinks are skipped, not removed. -- Always update `content_hash` and `last_synced` after writing. - -## Output format - -At the end of a run, print: - -``` -Wiki Ingest — - -Processed: N files -Created: N new pages -Updated: N pages -Skipped: N (unchanged) - -Pages updated: -- wiki/ (source: raw/) -``` - -## Why file-based, not DB-based - -Original design (v3) used `file_references` + `wiki_pages` Postgres -tables with embeddings. That was dropped in favour of file-frontmatter -hashing once Obsidian became the canonical vault. The vault is now -self-contained, portable, and version-controlled via the NAS git remote -without any DB dependency. See [[personal-os-state-2026-04-27]] -Decision 8 and Decision 2 (`obsidian-mcp` replaced `personal-wiki` -MCP). - -## Related -[[personal-os-schema]] [[personal-os-state-2026-04-27]] [[personal-os-catchup-plan-2026-04-27]]