[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