Pure Phoenix Inventory, 2026-04-28¶
URL: https://mkdocs.justinsforge.com/memory/handoffs/pure-phoenix-inventory-2026-04-28/
Canonical inventory of forge state at the start of the Pure Phoenix refactor. Generated by three parallel Explore agents on 2026-04-28. This file is the source of truth for what exists, what is in scope for cleanup, what gets renamed, and what stays. Updated as phases close.
Plan: /home/justinwieb/.claude/plans/yes-lets-go-into-pure-phoenix.md
Doctrine: FORGE-DOCTRINE.md
Decisions Locked (from AskUserQuestion 2026-04-28)¶
| Decision | Resolution |
|---|---|
| JustinWieb scope | Legacy site only. Brand directories (JustinWieb-VR, JustinWieb-Tech) and personal-identifier mentions stay. |
| Greg bot fate | Hard delete, no replacement. Mobile chat-control surface surrendered. |
| Mount watchdog | Folded into Phase 4.6 Drive subsystem redesign. Watchdog stays alive as bridge through Phase 3. |
| Naming form | Tiered. Tier A forge-<function> for infrastructure (no env prefix, no -01 for singletons). Tier C friendly aliases (Sol, Venus, Vector) for personal endpoints. |
Em-Dash Audit¶
Total fleet count: 2,883 em-dashes across 287 files. Hard rule per Section 9: zero allowed.
Distribution: 92% concentrated in memory/. 33% of persona-name uses are code-level identifiers, 67% prose.
Top 30 offending files:
| Em-dashes | File |
|---|---|
| 280 | memory/daily/2026-04-27.md |
| 130 | memory/daily/2026-04-13.md |
| 112 | memory/daily/2026-04-21.md |
| 87 | scripts/integrations/telegram/inbox_brain.py |
| 87 | comms/inbox/parent-session-wellness-status.md |
| 85 | memory/daily/2026-04-23.md |
| 80 | memory/handoffs/forge-state-report-2026-04-28.md |
| 65 | memory/handoffs/forge-cleanup-inventory-2026-04-28.md |
| 63 | memory/handoffs/version-audit-2026-04-27.md |
| 53 | memory/handoffs/worker-builder-playbook-2026-04-23.md |
| 53 | memory/handoffs/jwvr-brand-travel-ops-2026-04-21.md |
| 53 | memory/handoffs/building-the-brain-life-os-inbox-2026-04-27.md |
| 51 | recent.md |
| 51 | memory/handoffs/decorator-crab-master-plan-2026-04-21.md |
| 51 | memory/daily/2026-03-15.md |
| 43 | memory/handoffs/forge-refactor-2026-04-28.md |
| 42 | memory/handoffs/device-energy-storage-2026-04-21.md |
| 41 | memory/handoffs/trading-bot-plan-2026-04-21.md |
| 41 | .claude/agents/chief-director.md |
| 39 | memory/daily/2026-04-24.md |
| 36 | memory/handoffs/forge-cleanup-2026-04-28.md |
| 35 | memory/daily/2026-04-28.md |
| 34 | memory/handoffs/frigate-reolink-optimization-2026-04-21.md |
| 33 | CLAUDE.md |
| 30 | memory/handoffs/notion-scaffold-life-os-jwvr-2026-04-28.md |
| 29 | memory/handoffs/wellness-stack-improvements-2026-04-28.md |
| 27 | sites/justinkrystal.com/README.md |
| 27 | memory/handoffs/telegram-3bot-fleet-plan-2026-04-23.md |
| 24 | memory/handoffs/arch-optimization-2026-04-21.md |
| 23 | docs/refactor/claude-md-notes-2026-04-28.md |
Purge happens in Phase 2.2, programmatic with reviewed-batch (CP-6).
Naming Surfaces (renames in Phase 4.1)¶
Tier A: Infrastructure (must rename)¶
Systemd unit files (forge/infra/systemd/):
| Current | New | Notes |
|---|---|---|
forge-context-api.service |
unchanged | already compliant |
forge-dispatcher.service |
unchanged | already compliant |
forge-home-base.service |
forge-tmux-anchor.service |
DONE 2026-04-28 (Phase 4.1): unit renamed, daemon-reload, enabled, active. References swept across README + scripts/README + infra/systemd/{install,uninstall}.sh + steering draft. |
forge-inbox-webhook.service |
unchanged | already compliant |
forge-mkdocs.service |
unchanged | already compliant |
forge-telegram-bot.service |
retired | hard delete per Q2 |
forge-telegram-inbox.service |
forge-inbox-capture.service |
persona to function |
forge-telegram-ava.service |
forge-lifeos-coordinator.service |
persona to function |
LXC containers on Finn (Proxmox pct/qm rename) — DONE 2026-04-28 in Phase 4.1:
| VMID | Type | Old | New | IP |
|---|---|---|---|---|
| 100 | VM | homeassistant | forge-homeassistant (Proxmox display only; internal HA hostname untouched) |
192.168.86.70 |
| 101 | LXC | plex | forge-plex (config; applies on next container reboot) |
192.168.86.73 |
| 102 | LXC | media-server | forge-media-server (config) |
192.168.86.74 |
| 103 | VM | ubuntu-dev | console (Proxmox display + OS hostnamectl set) |
192.168.86.50 |
| 105 | LXC | adguard | forge-adguard (config) |
192.168.86.75 |
| 106 | LXC | n8n | forge-n8n (config) |
192.168.86.82 |
| 107 | LXC | immich | forge-immich (config) |
192.168.86.83 |
| 108 | LXC | frigate | forge-frigate (config) |
192.168.86.84 |
| 110 | LXC | minecraft | forge-minecraft (config) |
192.168.86.23 |
Fleet machines (per Section 3 personal endpoint amendment merged 2026-04-28):
| Current | New | Notes |
|---|---|---|
| Finn | Finn (kept) |
Proxmox host, personal endpoint per Section 3 amendment |
| UDev | Console |
dev VM, portmanteau forbidden, friendly alias under amendment |
SSH config aliases (~/.ssh/config):
9 aliases need updating to match new hostnames. biz-apps alias removed entirely (Batch 3.3).
Telegram bots:
| Current | New | Notes |
|---|---|---|
@GregTwoPointO_Bot |
retired | hard delete per Q2 |
@jw_inbox_bot |
@forge_inbox_capture_bot |
new BotFather token |
@Ava_JForgeBot |
@forge_lifeos_coordinator_bot |
new BotFather token |
@Manager_JForgeBot |
@forge_notify_outbound_bot |
new BotFather token |
Tier C: Personal endpoints (kept per Section 3 amendment 2026-04-28)¶
Sol (Mac), Venus (iPhone), Vector (Windows PC), Finn (Proxmox host), Console (dev VM, replaces UDev). system-map/fleet.md documents the function so LLM has the alias-to-role mapping.
Directory rename (executed 2026-04-28 as part of Phase 2.4)¶
forge/nexus/ renamed to forge/system-map/ via git mv. Cross-references swept across all forge .md, .py, .sh, .json, .yml, .yaml, .service, .conf files via sed -i 's|nexus/|system-map/|g'. Capital-N persona references in CLAUDE.md doctrine ("Greg / Ava / Nexus") kept intentionally as historical retired-name examples.
Bot redo (deferred from Phase 4.2 to its own design pass)¶
Justin signaled 2026-04-28 that the bot fleet needs a redo, not just a rename. Phase 4.2 stays parked until a pure-phoenix-bot-redesign-2026-XX-XX.md sub-handoff produces a fresh architecture (functional split, brain unification, token strategy, capture pipeline scope, tool-surface allocation, cost discipline, voice-friendliness). Recommended sequencing: spin the bot redesign after Phase 2 lands so new bots are built on the new substrate.
Cleanup Targets (Section 14B)¶
| Target | Refs | Resolution | Phase |
|---|---|---|---|
| Cursor Pro | 0 | DONE 2026-04-28: verified gone | 3.1 |
| Japandi Noir | 0 | DONE 2026-04-28: verified gone | 3.1 |
| VR Alliance | 1 | DONE 2026-04-28: stripped from forge-state-report | 3.1 |
| TNappe | 1 | DONE 2026-04-28: stripped from forge-state-report | 3.1 |
| TickTick | 56 (3 n8n JSONs) | DONE 2026-04-28: 3 JSONs moved to infra/n8n/workflows/_legacy/ |
3.1 |
| Ntfy | 64 | DONE 2026-04-28: stripped from scripts/notify.sh (FORGE_NTFY_TOPIC, FORGE_NTFY_SERVER, send_ntfy fn, dispatch refs) |
3.1 |
| JustinWieb (legacy site only) | 0 | DONE 2026-04-28: sites/justinwieb.com/ does not exist |
3.1.5 |
| justinkrystal.com prose refs | 49 (non-DNS) | DONE 2026-04-28 in Phase 3.6: 19-file sed sweep across forge tree | 3.1 / 3.6 |
| security-check cron | 21 | DONE 2026-04-28: cron entry removed, script archived to memory/_archive/cron-pre-phoenix-2026-04-28/ |
3.2 |
| infra-check cron | 16 | DONE 2026-04-28: same archive path | 3.2 |
| business-check cron | 10 | DONE 2026-04-28: same archive path | 3.2 |
| mount-watchdog cron | 13 | KEEP through Phase 3 as bridge, retire during Phase 4.6 | 3.2 / 4.6 |
| biz-apps | 11 | DONE 2026-04-28: SSH alias removed from ~/.ssh/config. CT 104 already destroyed earlier. |
3.3 |
| Greg / OpenClaw | 61 | DONE 2026-04-28 (except @BotFather delete by Justin manually): service stopped + disabled + unit removed from /etc/systemd/system/, bot.py + service file + telegram.env archived to memory/_archive/greg-openclaw-pre-phoenix-2026-04-28/. Active prose scrubbed from system-map (architecture, fleet, network-sharing-plan, README, lm-studio-setup archived) + auto-context hook. Doctrine + LESSONS + CLAUDE retired-name references kept as historical examples. |
3.4 |
| Minecraft world backup | 4 | DONE 2026-04-28: cron removed, backup.sh archived to memory/_archive/cron-pre-phoenix-2026-04-28/minecraft-backup.sh, 143MB of snapshots moved from /mnt/storage/minecraft-backups/ to cold archive at /mnt/storage/forge-archive/minecraft-backups-2026-04-28/. Live MC server on CT 110 unaffected. |
3.5 |
| justinandkrystal.com to justinkrystal.com (DNS) | n/a | DISCOVERY 2026-04-28: justinandkrystal.com was never a Cloudflare zone; live site has always been justinkrystal.com. No DNS work needed for the rename itself. Forge-internal subdomain migration to justinsforge.com staged in pure-phoenix-phase-3-6-dns-migration-2026-04-28.md for sign-off. |
3.6 |
Persona-Name Code-Level Identifiers (Phase 4.2 cleanup)¶
| File | Identifier | Count |
|---|---|---|
scripts/integrations/telegram/ava_bot.py |
Ava_JForgeBot |
1 (bot class/service ref) |
scripts/integrations/telegram/bot.py |
Greg |
2 (bot logic) |
scripts/hooks/auto-context.py |
Greg |
1 (script logic) |
scripts/checkpoint.sh |
Greg |
2 (shell refs) |
system-map/lm-studio-setup.md |
Greg |
6 (setup docs) |
Lower-priority prose mentions (170 total):
- Greg: 107 across memory/daily/, memory/handoffs/, system-map/, CLAUDE.md
- Venus: 32 (device/brand mentions, preview scripts, daily logs)
- Ava_JForgeBot / Manager_JForgeBot: 13 in refactor docs and state reports
- Nexus: 5 in archive references
Flat-Directory Status (Section 8)¶
Already largely compliant. forge/scripts/integrations/ is single-level under _lib/, telegram/, eight-sleep/, garmin/, minecraft/, wellness/. No deep persona-style nesting found. Brand and site directories already kebab-case. Aggressive flat refactor unnecessary; CP-3 conservative scope (rename only on touch) is the chosen approach.
MEMORY.md Status¶
~/.claude/projects/-home-justinwieb-forge/memory/MEMORY.md: 182 lines, 23.8KB. Compliant with Section 12 cap (200 lines, 25KB).forge/MEMORY.md: does not exist. Only canonical MEMORY.md is at the Claude project level.
Slim-down still planned in Phase 2.4 to convert dense entries into topic files for index purity, but no urgent overage.
Cron Inventory (live as of 2026-04-28)¶
*/5 * * * * /home/justinwieb/forge/scripts/monitors/security-check.sh
*/10 * * * * /home/justinwieb/forge/scripts/monitors/infra-check.sh
*/15 * * * * /home/justinwieb/forge/scripts/monitors/business-check.sh
*/10 * * * * /home/justinwieb/forge/scripts/monitors/mount-watchdog.sh
0 4 * * * /home/justinwieb/forge/scripts/integrations/minecraft/backup.sh
Phase 3.2 retires the first three. mount-watchdog stays through Phase 4.6. Minecraft backup handled in Phase 3.5.
Files Created / Modified by Phase 0¶
| File | Action |
|---|---|
forge/FORGE-DOCTRINE.md |
created |
forge/CLAUDE.md |
banner added pointing to doctrine |
forge/memory/handoffs/pure-phoenix-inventory-2026-04-28.md |
this file |
Phase 4.7 (system-wide quota observability) + open-items cleanup DONE 2026-04-28T23:39¶
| Surface | Action |
|---|---|
heartbeat.py, morning-brief.py, forge_wellness_daily_summary.py, forge_memory_auto_capture.py, forge_memory_auto_dream.py |
each call_sonnet() wrapped with forge_quota_tracker.record(...). |
forge_dispatcher.sh |
launch + complete events recorded for each pipe-mode worker spawn. |
forge_tmux_anchor_session.sh |
skipped (interactive claude invocation, not -p; already covered by ~/.claude/stats-cache.json). |
| crontab | 30 4 * * * forge_quota_tracker.py --write-summary added (after auto-dream 04:00). |
forge_gdoc_to_drive.sh |
rewritten to upload via forge_gdrive_write.py (API path, no FUSE dependency). Smoke-tested live + cleaned up. |
| Mount-watchdog cron | doctrine-violation status closed in LESSONS.md. Cron stays alive as human-convenience infra (Files.app on Sol/Venus). |
eval.json no-em-dashes baseline |
67 -> 65 (tightened). |
eval.json naming-taxonomy-services severity |
warning -> error (whitelist empty). |
~/.claude/projects/-home-justinwieb-forge/memory/reference_quota_tracker.md + MEMORY.md |
created/updated. |
Quota tracker now records calls from 7 forge invokers + merges with stats-cache.json for interactive sessions. Aggregator writes nightly to data/claude-quota/summary.json.
8 of 8 eval green throughout.
Phase 4.2 (bot redesign) DONE 2026-04-28T23:25¶
| Surface | Action |
|---|---|
forge_quota_tracker.py |
created. record + aggregate + merge_with_stats_cache. Foundation for Phase 4.7. |
forge_telegram_brain.py |
created. persona-aware facade (capture persona = 7 tools, coordinator = 28). Wraps every Sonnet call with quota_tracker.record(). |
forge_telegram_capture_bot.py + forge_telegram_coordinator_bot.py |
created. Thin pollers, voice + text, call brain.handle(persona=...). |
infra/systemd/forge-inbox-capture.service + forge-lifeos-coordinator.service |
created. Hardened (NoNewPrivileges, ProtectSystem, ReadWritePaths). |
forge_telegram_push.sh |
new selectors capture/coordinator/notify; legacy aliases map to notify. |
forge_notify.sh |
send_manager reads telegram-notify-outbound.env. |
forge_telegram_inbox_webhook.py |
calls capture persona; iOS Shortcut endpoint on port 7400 unchanged. |
heartbeat.py, morning-brief.py, forge_telegram_nudge_fire.py |
rewired to push via notify selector. |
forge_eval_check_service_names.sh |
whitelist emptied (Phase 4.2 retired ava + inbox unit names). |
~/.forge-secrets/telegram-{inbox-capture,lifeos-coordinator,notify-outbound}.env |
created chmod 600. Verified via getMe. |
~/.claude/projects/-home-justinwieb-forge/memory/reference_telegram_fleet.md + MEMORY.md |
created/updated. Replaces 4 separate per-bot topic files. |
| Old systemd units | archived to memory/_archive/cron-pre-phoenix-2026-04-28/. |
Cutover verified live: capture brain wrote test row to Notion Inbox; quota tracker recorded the call. notify.sh pushed to outbound bot.
Justin owes: delete @jw_inbox_bot, @Ava_JForgeBot, @Manager_JForgeBot, @jw_updates_bot via @BotFather.
Phase 4.6 (Drive subsystem redesign, forge side) DONE 2026-04-28T22:48¶
| Surface | Action |
|---|---|
forge_gdrive_search.py |
created. rclone lsjson wrapper, JSON output, --in / --id / --recursive / --max / --files-only / --dirs-only / --name / --ext. |
forge_gdrive_read.py |
created. rclone cat / copyto, supports --id, --out, --as md\|docx\|pdf\|... for native Google Doc export. |
forge_gdrive_write.py |
created. rclone copyto, supports --stdin --as-name <fn>, --mkdir-parents, --import-as docx\|md\|... for convert-to-Google-Doc. |
forge_gdrive_move.py |
created. rclone moveto + rmdir, --mkdir-parents. |
forge_gdrive_index_extend.py |
created. Mirrors Drive subtrees as markdown into forge/data/gdrive-cache/ via pandoc; extends /recall coverage. |
forge_search_index.py |
ROOTS extended to include data/gdrive-cache. |
infra/n8n/workflows/gdrive-search.json |
scaffold using SSH + Execute Command pattern. |
infra/n8n/workflows/README-gdrive-phase-4-6.md |
n8n integration playbook (SSH vs native Drive node). |
data/gdrive-cache/ |
created with 5 sample extracted Drive files. |
~/.claude/projects/-home-justinwieb-forge/memory/reference_gdrive_subsystem.md |
created topic file. |
MEMORY.md |
added gdrive subsystem pointer. |
LESSONS.md |
Phase 4.6 closeout entry; mount-watchdog soak gated 2026-05-05. |
Auth model: reuses Justin's existing gdrive: rclone remote (full drive OAuth scope). No new credentials.
Verified end-to-end: search, write, move, read, index extend all live against real Drive content. Test artifacts cleaned up.
Mount-watchdog cron stays alive for 7-day soak per CP-4. Retirement gated on 2026-05-05 + /save-to-drive skill migration.
Phase 4.3 (variable + flat-file refactor) DONE 2026-04-28T22:24¶
| Surface | Action |
|---|---|
scripts/forge_rename_helper.py |
created. Audits + git mv + path-only rewrite of references. Skips historical paths (memory/daily, handoffs, comms/results, logs, LESSONS.md). |
| 5 wave manifests | memory/handoffs/pure-phoenix-phase-4-3-waves/wave{1..5}.tsv |
| 38 script renames | scripts/{sites,assets,gdoc,n8n,cloudflare,search,cleanup,monitors,hooks,integrations,checkpoint,dispatcher,notify,fleet-*,home-base-session} flattened to scripts/forge_<context>_<function>.{py,sh} |
| 7 cron entries | rewritten via crontab -l \| sed \| crontab - for search-index, retention, mount-watchdog, wellness daily summary, morning wellness check, garmin poll x14, telegram nudge-fire. |
| 4 systemd units | re-deployed (sudo cp to /etc/systemd/system, daemon-reload, restart): forge-tmux-anchor, forge-telegram-ava, forge-telegram-inbox, forge-inbox-webhook. |
forge/.claude/settings.local.json |
SessionStart, UserPromptSubmit, Stop hook chains updated to forge_hook_* paths. |
| Cross-module imports | 4 telegram scripts rewrote import inbox_brain etc. to import forge_telegram_inbox_brain as inbox_brain. |
parents[N] fix |
forge_garmin_poll.py adjusted from parents[3] to parents[1] after directory-depth change. |
| Asset wrapper | forge_assets_run.sh updated to dispatch via forge_assets_${cmd}.py instead of ${cmd}.py. |
forge_notify.sh |
variable convention pass (clean_* for inputs, payload_* for outbound JSON, <source>_<entity>_url for endpoints). Canonical example for Phase 4.3. |
forge/LESSONS.md |
self-iteration entry on basename-rewrite hazard + Phase 4.3 closeout. |
Smoke tests passed end-to-end; eval harness 8/8 green throughout. Forge_garmin_poll fetched live data from Garmin Connect and posted to Home Assistant successfully after rename.
Phase 4.4 (memory architecture build) DONE 2026-04-28T21:33¶
| File | Action |
|---|---|
forge/scripts/forge_memory_auto_capture.py |
created. Stop-hook fact extractor; self-detaches; redacts sensitive patterns before sending to Sonnet 4.6; confidence-gates writes (>=0.85 direct, 0.65-0.85 staged, <0.65 dropped); 5-write per-session cap; logs to LESSONS.md keyed by session_id. |
forge/scripts/forge_memory_auto_dream.py |
created. Nightly multi-pass: A dedup, B stale prune (90d), C promote staged, D orphan-index check. File moves only, never deletes. |
forge/scripts/forge_memory_revert.py |
created. --list to enumerate reversible sessions, --session <id> to roll back, --dry-run for preview. |
forge/.claude/settings.local.json |
Stop hook chain extended to call auto-checkpoint.sh then forge_memory_auto_capture.py. |
| crontab | 0 4 * * * forge_memory_auto_dream.py added (after eval 03:00 and search-index 03:30). |
forge/LESSONS.md |
closeout entry appended. |
~/.claude/projects/-home-justinwieb-forge/memory/MEMORY.md |
added auto-memory pointer. |
~/.claude/projects/-home-justinwieb-forge/memory/reference_auto_memory.md |
created topic file. |
Smoke tests passed end-to-end; eval harness still 8/8 green.
Phase 4.5 (eval harness) DONE 2026-04-28T21:23¶
| File | Action |
|---|---|
forge/eval.json |
created, 8 initial checks |
forge/scripts/forge_eval_harness.py |
created, supports --staged + --full, severity ladder, regression detection, LESSONS.md writer |
forge/scripts/forge_eval_check_mkdocs_urls.sh |
created |
forge/scripts/forge_eval_check_persona_code.sh |
created |
forge/scripts/forge_eval_check_service_names.sh |
created |
forge/.git/hooks/pre-commit |
created, calls harness --staged, blocks on fatal |
| crontab | added 0 3 * * * forge_eval_harness.py --full --quiet (before search-index 03:30) |
forge/LESSONS.md |
appended Phase 4.5 closeout entry, baselines logged |
~/.claude/projects/-home-justinwieb-forge/memory/MEMORY.md |
added eval-harness pointer in Tools and Surfaces |
~/.claude/projects/-home-justinwieb-forge/memory/reference_eval_harness.md |
created topic file |
First full run: 8 of 8 pass. Em-dash count 55 (down from 67 baseline). MEMORY.md 109 lines / 8238 bytes (well under 200/25000 cap).
Whitelisted (deferred to Phase 4.2 bot redesign):
- forge-telegram-ava.service, forge-telegram-inbox.service in forge_eval_check_service_names.sh
- Ava_JForgeBot, Manager_JForgeBot not in persona-code check (current bot identifiers, not yet retired)
Open Questions (resolved during execution)¶
- Em-dash purge approach (programmatic with diff vs per-file): asked at Phase 2.2 entry
- justinkrystal.com domain ownership: asked at Phase 3.6 entry
- Minecraft world preservation: asked at Phase 3.5 entry
- Greg bot final delete via @BotFather (irreversible): asked at Phase 3.4 final step
- Drive subsystem architecture (mount vs API vs hybrid): asked at Phase 4.6 entry
[Claude Code]