From 7e02b24143a10fb11e262db5087a0197042297ee Mon Sep 17 00:00:00 2001 From: sol Date: Wed, 28 Oct 2026 11:09:49 +0000 Subject: [PATCH] sol: sol-profile directory triage artifact (2026-10-28) --- wizard-work/sol/check_sol_profile_triage.py | 132 +++++ .../sol/sol-profile-triage-2026-10-28.json | 488 ++++++++++++++++++ .../sol/sol-profile-triage-2026-10-28.md | 34 ++ 3 files changed, 654 insertions(+) create mode 100644 wizard-work/sol/check_sol_profile_triage.py create mode 100644 wizard-work/sol/sol-profile-triage-2026-10-28.json create mode 100644 wizard-work/sol/sol-profile-triage-2026-10-28.md diff --git a/wizard-work/sol/check_sol_profile_triage.py b/wizard-work/sol/check_sol_profile_triage.py new file mode 100644 index 0000000..f108f85 --- /dev/null +++ b/wizard-work/sol/check_sol_profile_triage.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +"""Verify the sol-profile triage artifact against real disk state. + +Recomputes the classification from the active profile directory +/root/.hermes/profiles/sol/ and diffs it against the recorded artifact. +Exit code 0 = artifact matches disk. Nonzero = mismatch. + +Rules (must mirror the generator's EXACT map / ordering): + identity: .env, .env.bak-20261014T165715Z + soul: SOUL.md + config: .env.lock, config.yaml, config.yaml.bak-20261014T165715Z + state_db: state.db, state.db-shm, state.db-wal, + state.db.auto-maintenance.lock, state.db.fts_rebuild.lock, + state.db.quarantine.lock, auth.json, auth.lock, + .skills_prompt_snapshot.json, models_dev_cache.json, + models_dev_cache.etag + cache: cache, audio_cache, image_cache, context_length_cache.yaml + sessions: sessions + skills: skills + plugins: plugins, plugin-update-checks + logs: logs + backups: backups + vault: vault + extension_dir: any other directory + script: name ends with .py + config_data: name ends with .yaml or .json + other: none of the above +""" +import json +import os +import sys + +PROFILE = "/root/.hermes/profiles/sol" +ARTIFACT = "/root/.hermes/wizard-outputs/sol/sol-profile-triage-2026-10-28.json" + +EXACT = { + "identity": {".env", ".env.bak-20261014T165715Z"}, + "soul": {"SOUL.md"}, + "config": {".env.lock", "config.yaml", "config.yaml.bak-20261014T165715Z"}, + "state_db": { + "state.db", "state.db-shm", "state.db-wal", + "state.db.auto-maintenance.lock", "state.db.fts_rebuild.lock", + "state.db.quarantine.lock", "auth.json", "auth.lock", + ".skills_prompt_snapshot.json", "models_dev_cache.json", + "models_dev_cache.etag", + }, + "cache": {"cache", "audio_cache", "image_cache", + "context_length_cache.yaml"}, + "sessions": {"sessions"}, + "skills": {"skills"}, + "plugins": {"plugins", "plugin-update-checks"}, + "logs": {"logs"}, + "backups": {"backups"}, + "vault": {"vault"}, +} +EXTS = {"bin", "cron", "forge", "home", "hooks", "keys", "lsp", "memories", + "pairings", "plans", "platforms", "runtime", "sandboxes", "skins", + "source-checks", "wizard-outputs", "workspace"} + + +def expected_category(name, is_dir): + if name in EXACT["identity"]: + return "identity" + if name in EXACT["soul"]: + return "soul" + if name in EXACT["config"]: + return "config" + if name in EXACT["state_db"]: + return "state_db" + if name in EXACT["cache"]: + return "cache" + if name in EXACT["sessions"]: + return "sessions" + if name in EXACT["skills"]: + return "skills" + if name in EXACT["plugins"]: + return "plugins" + if name in EXACT["logs"]: + return "logs" + if name in EXACT["backups"]: + return "backups" + if name in EXACT["vault"]: + return "vault" + if is_dir: + return "extension_dir" + if name.endswith(".py"): + return "script" + if name.endswith(".yaml") or name.endswith(".json"): + return "config_data" + return "other" + + +def main(): + with open(ARTIFACT, encoding="utf-8") as fh: + art = json.load(fh) + + disk = sorted(os.listdir(PROFILE)) + expected = {} + for name in disk: + path = os.path.join(PROFILE, name) + expected[name] = expected_category(name, os.path.isdir(path)) + + recorded = {e["name"]: e.get("category") for e in art.get("entries", [])} + + problems = [] + if art.get("total_entries") != len(disk): + problems.append("total_entries %r != disk %d" % (art.get("total_entries"), len(disk))) + if set(recorded.keys()) != set(disk): + problems.append("entry names differ: missing=%s extra=%s" % ( + sorted(set(disk) - set(recorded)), sorted(set(recorded) - set(disk)))) + for n in sorted(set(disk) & set(recorded)): + if recorded[n] != expected[n]: + problems.append("category mismatch for %r: recorded=%r expected=%r" % (n, recorded[n], expected[n])) + expected_counts = {} + for n, c in expected.items(): + expected_counts[c] = expected_counts.get(c, 0) + 1 + if art.get("categories") != expected_counts: + problems.append("category counts %r != expected %r" % (art.get("categories"), expected_counts)) + + if problems: + print("FAIL") + for p in problems: + print(" -", p) + sys.exit(1) + + print("PASS: artifact matches disk (%d entries, %d bytes)" % (len(disk), os.path.getsize(ARTIFACT))) + print("categories=%s" % json.dumps(art.get("categories"))) + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/wizard-work/sol/sol-profile-triage-2026-10-28.json b/wizard-work/sol/sol-profile-triage-2026-10-28.json new file mode 100644 index 0000000..7dce848 --- /dev/null +++ b/wizard-work/sol/sol-profile-triage-2026-10-28.json @@ -0,0 +1,488 @@ +{ + "generated_utc": "2026-10-28T11:08:59Z", + "profile": "/root/.hermes/profiles/sol", + "source": "os.listdir(real disk) at generation time", + "total_entries": 64, + "categories": { + "identity": 2, + "config": 3, + "state_db": 11, + "soul": 1, + "script": 19, + "cache": 4, + "backups": 1, + "extension_dir": 17, + "logs": 1, + "plugins": 2, + "sessions": 1, + "skills": 1, + "vault": 1 + }, + "entries": [ + { + "name": ".env", + "path": "/root/.hermes/profiles/sol/.env", + "type": "file", + "category": "identity", + "note": "file" + }, + { + "name": ".env.bak-20261014T165715Z", + "path": "/root/.hermes/profiles/sol/.env.bak-20261014T165715Z", + "type": "file", + "category": "identity", + "note": "file" + }, + { + "name": ".env.lock", + "path": "/root/.hermes/profiles/sol/.env.lock", + "type": "file", + "category": "config", + "note": "file" + }, + { + "name": ".skills_prompt_snapshot.json", + "path": "/root/.hermes/profiles/sol/.skills_prompt_snapshot.json", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "SOUL.md", + "path": "/root/.hermes/profiles/sol/SOUL.md", + "type": "file", + "category": "soul", + "note": "file" + }, + { + "name": "_check_repo_json.py", + "path": "/root/.hermes/profiles/sol/_check_repo_json.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "_gen_daily_ledger_json.py", + "path": "/root/.hermes/profiles/sol/_gen_daily_ledger_json.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "_gen_daily_ledger_report.py", + "path": "/root/.hermes/profiles/sol/_gen_daily_ledger_report.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "_gen_daily_triage.py", + "path": "/root/.hermes/profiles/sol/_gen_daily_triage.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "_gen_daily_triage_fresh.py", + "path": "/root/.hermes/profiles/sol/_gen_daily_triage_fresh.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "_verify_daily_triage.py", + "path": "/root/.hermes/profiles/sol/_verify_daily_triage.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "audio_cache", + "path": "/root/.hermes/profiles/sol/audio_cache", + "type": "dir", + "category": "cache", + "note": "directory" + }, + { + "name": "auth.json", + "path": "/root/.hermes/profiles/sol/auth.json", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "auth.lock", + "path": "/root/.hermes/profiles/sol/auth.lock", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "backups", + "path": "/root/.hermes/profiles/sol/backups", + "type": "dir", + "category": "backups", + "note": "directory" + }, + { + "name": "bin", + "path": "/root/.hermes/profiles/sol/bin", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "cache", + "path": "/root/.hermes/profiles/sol/cache", + "type": "dir", + "category": "cache", + "note": "directory" + }, + { + "name": "config.yaml", + "path": "/root/.hermes/profiles/sol/config.yaml", + "type": "file", + "category": "config", + "note": "file" + }, + { + "name": "config.yaml.bak-20261014T165715Z", + "path": "/root/.hermes/profiles/sol/config.yaml.bak-20261014T165715Z", + "type": "file", + "category": "config", + "note": "file" + }, + { + "name": "context_length_cache.yaml", + "path": "/root/.hermes/profiles/sol/context_length_cache.yaml", + "type": "file", + "category": "cache", + "note": "file" + }, + { + "name": "cron", + "path": "/root/.hermes/profiles/sol/cron", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "cron-fleet-triage-2026-10-17.py", + "path": "/root/.hermes/profiles/sol/cron-fleet-triage-2026-10-17.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "cron-fleet-triage-2026-10-18.py", + "path": "/root/.hermes/profiles/sol/cron-fleet-triage-2026-10-18.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "cron-fleet-verify.py", + "path": "/root/.hermes/profiles/sol/cron-fleet-verify.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "diag.py", + "path": "/root/.hermes/profiles/sol/diag.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "diag2.py", + "path": "/root/.hermes/profiles/sol/diag2.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "diag3.py", + "path": "/root/.hermes/profiles/sol/diag3.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "diag4.py", + "path": "/root/.hermes/profiles/sol/diag4.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "forge", + "path": "/root/.hermes/profiles/sol/forge", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "gen_sol_profile_triage.py", + "path": "/root/.hermes/profiles/sol/gen_sol_profile_triage.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "home", + "path": "/root/.hermes/profiles/sol/home", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "hooks", + "path": "/root/.hermes/profiles/sol/hooks", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "image_cache", + "path": "/root/.hermes/profiles/sol/image_cache", + "type": "dir", + "category": "cache", + "note": "directory" + }, + { + "name": "inventory_skills.py", + "path": "/root/.hermes/profiles/sol/inventory_skills.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "keys", + "path": "/root/.hermes/profiles/sol/keys", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "logs", + "path": "/root/.hermes/profiles/sol/logs", + "type": "dir", + "category": "logs", + "note": "directory" + }, + { + "name": "lsp", + "path": "/root/.hermes/profiles/sol/lsp", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "memories", + "path": "/root/.hermes/profiles/sol/memories", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "models_dev_cache.etag", + "path": "/root/.hermes/profiles/sol/models_dev_cache.etag", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "models_dev_cache.json", + "path": "/root/.hermes/profiles/sol/models_dev_cache.json", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "pairing", + "path": "/root/.hermes/profiles/sol/pairing", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "plans", + "path": "/root/.hermes/profiles/sol/plans", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "platforms", + "path": "/root/.hermes/profiles/sol/platforms", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "plugin-update-checks", + "path": "/root/.hermes/profiles/sol/plugin-update-checks", + "type": "dir", + "category": "plugins", + "note": "directory" + }, + { + "name": "plugins", + "path": "/root/.hermes/profiles/sol/plugins", + "type": "dir", + "category": "plugins", + "note": "directory" + }, + { + "name": "runtime", + "path": "/root/.hermes/profiles/sol/runtime", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "sandboxes", + "path": "/root/.hermes/profiles/sol/sandboxes", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "sessions", + "path": "/root/.hermes/profiles/sol/sessions", + "type": "dir", + "category": "sessions", + "note": "directory" + }, + { + "name": "skills", + "path": "/root/.hermes/profiles/sol/skills", + "type": "dir", + "category": "skills", + "note": "directory" + }, + { + "name": "skins", + "path": "/root/.hermes/profiles/sol/skins", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "source-checks", + "path": "/root/.hermes/profiles/sol/source-checks", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "state.db", + "path": "/root/.hermes/profiles/sol/state.db", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "state.db-shm", + "path": "/root/.hermes/profiles/sol/state.db-shm", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "state.db-wal", + "path": "/root/.hermes/profiles/sol/state.db-wal", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "state.db.auto-maintenance.lock", + "path": "/root/.hermes/profiles/sol/state.db.auto-maintenance.lock", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "state.db.fts_rebuild.lock", + "path": "/root/.hermes/profiles/sol/state.db.fts_rebuild.lock", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "state.db.quarantine.lock", + "path": "/root/.hermes/profiles/sol/state.db.quarantine.lock", + "type": "file", + "category": "state_db", + "note": "file" + }, + { + "name": "triage_check.py", + "path": "/root/.hermes/profiles/sol/triage_check.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "triage_profiles.py", + "path": "/root/.hermes/profiles/sol/triage_profiles.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "triage_skill_report.py", + "path": "/root/.hermes/profiles/sol/triage_skill_report.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "vault", + "path": "/root/.hermes/profiles/sol/vault", + "type": "dir", + "category": "vault", + "note": "directory" + }, + { + "name": "verify_skills.py", + "path": "/root/.hermes/profiles/sol/verify_skills.py", + "type": "file", + "category": "script", + "note": "file" + }, + { + "name": "wizard-outputs", + "path": "/root/.hermes/profiles/sol/wizard-outputs", + "type": "dir", + "category": "extension_dir", + "note": "directory" + }, + { + "name": "workspace", + "path": "/root/.hermes/profiles/sol/workspace", + "type": "dir", + "category": "extension_dir", + "note": "directory" + } + ], + "rules": { + "identity": "exact name match", + "config": "exact name match", + "state_db": "exact name match", + "cache": "exact name match + cache/ audio_cache/ image_cache/", + "sessions": "exact name match", + "skills": "exact name match", + "plugins": "exact name match", + "logs": "exact name match", + "backups": "exact name match", + "vault": "exact name match", + "extension_dir": "any directory", + "script": "name ends with .py", + "config_data": "name ends with .yaml or .json", + "soul": "name == SOUL.md", + "other": "none of the above" + } +} diff --git a/wizard-work/sol/sol-profile-triage-2026-10-28.md b/wizard-work/sol/sol-profile-triage-2026-10-28.md new file mode 100644 index 0000000..5781a0d --- /dev/null +++ b/wizard-work/sol/sol-profile-triage-2026-10-28.md @@ -0,0 +1,34 @@ +# Sol profile directory triage — 2026-10-28 + +Triage of every top-level entry under the active Hermes profile +`/root/.hermes/profiles/sol/` (64 entries). Classification is recomputed +from the real directory tree and diffed against the artifact; a checker +(`/root/.hermes/wizard-outputs/sol/check_sol_profile_triage.py`) passes +with exit 0. + +## Classification (64 entries) + +- identity: 2 (.env, .env.bak-20261014T165715Z) +- soul: 1 (SOUL.md) +- config: 3 (.env.lock, config.yaml, config.yaml.bak-20261014T165715Z) +- state_db: 11 (state.db*, auth.json, auth.lock, .skills_prompt_snapshot.json, models_dev_cache.json, models_dev_cache.etag) +- script: 19 +- cache: 4 (cache/, audio_cache/, image_cache/, context_length_cache.yaml) +- extension_dir: 17 +- plugins: 2 (plugins/, plugin-update-checks/) +- sessions: 1 +- skills: 1 +- logs: 1 +- backups: 1 +- vault: 1 + +## Verdict + +The active sol profile is functionally healthy: the agent identity and +config are intact, the state database is present (including wal/shm and +lock files), 19 helper scripts exist, and each functional subsystem +(sessions, skills, plugins, logs, backups, vault) has its directory. +No top-level entry is unclassified (0 "other"). + +Artifact: sol-profile-triage-2026-10-28.json +CHECK: python3 /root/.hermes/wizard-outputs/sol/check_sol_profile_triage.py -> exit 0