[2026-05-31] taiga sync: wiki/personal-os-catchup-plan-2026-04-27.md wiki/personal-os-schema.md wiki/personal-os-state-2026-04-27.md wiki/wiki-ingest-process.md
This commit is contained in:
@@ -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/<gid>-<slug>` 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]]
|
|
||||||
@@ -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]]
|
|
||||||
@@ -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]]
|
|
||||||
@@ -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 <path> | awk '{print $1}'`.
|
|
||||||
2. Search `~/obsidian/wiki/` for any `.md` with frontmatter
|
|
||||||
`source: raw/<filename>`.
|
|
||||||
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/<filename>
|
|
||||||
content_hash: <sha256>
|
|
||||||
namespace: work
|
|
||||||
last_synced: <YYYY-MM-DD>
|
|
||||||
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 — <date>
|
|
||||||
|
|
||||||
Processed: N files
|
|
||||||
Created: N new pages
|
|
||||||
Updated: N pages
|
|
||||||
Skipped: N (unchanged)
|
|
||||||
|
|
||||||
Pages updated:
|
|
||||||
- wiki/<filename> (source: raw/<source>)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 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]]
|
|
||||||
Reference in New Issue
Block a user