Merge remote-tracking branch 'origin/main'

This commit is contained in:
Syncthing
2026-06-01 18:01:08 +00:00
5 changed files with 464 additions and 0 deletions
+19
View File
@@ -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 (1529 мая) и 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 в контейнере.
+125
View File
@@ -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 19 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 12 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]]
+100
View File
@@ -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]]
+131
View File
@@ -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/<branch>` + 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]]
+89
View File
@@ -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/<filename>`.
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/<topic-name>.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/<filename>
content_hash: <sha256>
namespace: work
last_synced: <YYYY-MM-DD>
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]]