From bd69d0ac470b3072c076471798a16a2a21335907 Mon Sep 17 00:00:00 2001 From: ledger Date: Wed, 4 Nov 2026 13:27:11 +0000 Subject: [PATCH] sol: sol-profile directory triage 2026-11-04 (69 entries, 14 categories) --- .../sol/CHECK-sol-profile-triage-2026-11-04 | 15 + wizard-work/sol/check_sol_profile_triage.py | 193 ++++---- wizard-work/sol/gen_sol_profile_triage.py | 193 ++++++++ .../sol/sol-profile-triage-2026-11-04.json | 452 ++++++++++++++++++ .../sol/sol-profile-triage-2026-11-04.md | 103 ++++ 5 files changed, 862 insertions(+), 94 deletions(-) create mode 100644 wizard-work/sol/CHECK-sol-profile-triage-2026-11-04 create mode 100644 wizard-work/sol/gen_sol_profile_triage.py create mode 100644 wizard-work/sol/sol-profile-triage-2026-11-04.json create mode 100644 wizard-work/sol/sol-profile-triage-2026-11-04.md diff --git a/wizard-work/sol/CHECK-sol-profile-triage-2026-11-04 b/wizard-work/sol/CHECK-sol-profile-triage-2026-11-04 new file mode 100644 index 0000000..c79ebbe --- /dev/null +++ b/wizard-work/sol/CHECK-sol-profile-triage-2026-11-04 @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# CHECK -- sol: sol-profile directory triage (2026-11-04). +# +# Independent re-derivation from the LIVE profile directory, then cross-check +# of the committed artifact. Exit 0 = PASS (the exit code IS the verdict). +set -u +REPO=/root/troupe-standup +A="$REPO/wizard-work/sol/sol-profile-triage-2026-11-04.json" +V="$REPO/wizard-work/sol/check_sol_profile_triage.py" + +[ -f "$A" ] || { echo "MISSING_ARTIFACT $A"; exit 1; } +[ -f "$V" ] || { echo "MISSING_VERIFY $V"; exit 1; } + +python3 "$V" "$A" +exit $? diff --git a/wizard-work/sol/check_sol_profile_triage.py b/wizard-work/sol/check_sol_profile_triage.py index f108f85..42643d3 100644 --- a/wizard-work/sol/check_sol_profile_triage.py +++ b/wizard-work/sol/check_sol_profile_triage.py @@ -1,131 +1,136 @@ #!/usr/bin/env python3 -"""Verify the sol-profile triage artifact against real disk state. +"""Independent re-check for the Sol profile directory triage artifact. -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. +Re-reads the profile directory from disk, re-applies the classification rules, +and compares against the generated artifact. Exit code 0 = artifact is +correct; nonzero = artifact is wrong, stale, or missing. -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 +Usage: python3 check_sol_profile_triage.py """ import json import os import sys PROFILE = "/root/.hermes/profiles/sol" -ARTIFACT = "/root/.hermes/wizard-outputs/sol/sol-profile-triage-2026-10-28.json" +DEFAULT_ARTIFACT = "/root/.hermes/wizard-outputs/sol/sol-profile-triage-2026-11-04.json" +ARTIFACT = sys.argv[1] if len(sys.argv) > 1 else DEFAULT_ARTIFACT -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"} +CATEGORIES = [ + "identity", "config", "state_db", "cache", "sessions", "skills", + "plugins", "logs", "backups", "vault", "extension_dir", "script", + "config_data", "other", +] -def expected_category(name, is_dir): - if name in EXACT["identity"]: +def classify(name, is_dir): + # identity (exact top-level names) + if name in {".env", ".env.bak-20261014T165715Z", "SOUL.md"}: return "identity" - if name in EXACT["soul"]: - return "soul" - if name in EXACT["config"]: + # config (exact top-level names) + if name in {".env.lock", "config.yaml", "config.yaml.bak-20261014T165715Z"}: return "config" - if name in EXACT["state_db"]: + # state_db (exact names + state.db* + state.db lock files) + if name in {"auth.json", "auth.lock", ".skills_prompt_snapshot.json", + "models_dev_cache.json", "models_dev_cache.etag", + "state.db", "state.db-shm", "state.db-wal", + "state.db.auto-maintenance.lock", "state.db.fts_rebuild.lock", + "state.db.quarantine.lock"}: return "state_db" - if name in EXACT["cache"]: + # cache (exact names + context_length_cache.yaml) + if name == "context_length_cache.yaml": return "cache" - if name in EXACT["sessions"]: + if name in {"cache", "audio_cache", "image_cache"}: + return "cache" + if name in {"sessions"}: return "sessions" - if name in EXACT["skills"]: + if name in {"skills"}: return "skills" - if name in EXACT["plugins"]: + if name in {"plugins", "plugin-update-checks"}: return "plugins" - if name in EXACT["logs"]: + if name in {"logs"}: return "logs" - if name in EXACT["backups"]: + if name in {"backups"}: return "backups" - if name in EXACT["vault"]: + if name in {"vault"}: return "vault" + # extension_dir: any directory if is_dir: return "extension_dir" + # script: .py if name.endswith(".py"): return "script" + # config_data: .yaml or .json (not matched above) 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) + # Fresh disk read + try: + names = sorted(os.listdir(PROFILE)) + except Exception as e: + print("FAIL: cannot list profile: %s" % e) 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) + expected = [] + for name in names: + path = os.path.join(PROFILE, name) + is_dir = os.path.isdir(path) + expected.append({"name": name, "type": "dir" if is_dir else "file", + "category": classify(name, is_dir)}) + + # Load artifact + try: + with open(ARTIFACT, encoding="utf-8") as fh: + art = json.load(fh) + except Exception as e: + print("FAIL: cannot load artifact: %s" % e) + sys.exit(1) + + errs = [] + if art.get("total_entries") != len(expected): + errs.append("total_entries %r != fresh count %d" + % (art.get("total_entries"), len(expected))) + + disk_names = [e["name"] for e in expected] + recorded = {e["name"]: e for e in art.get("entries", [])} + + if sorted(disk_names) != sorted(recorded.keys()): + errs.append("entry name sets differ: missing=%s extra=%s" % ( + sorted(set(disk_names) - set(recorded)), + sorted(set(recorded) - set(disk_names)))) + + counts = {} + for e in expected: + counts[e["category"]] = counts.get(e["category"], 0) + 1 + if art.get("categories") != counts: + errs.append("categories mismatch: artifact=%r fresh=%r" + % (art.get("categories"), counts)) + + for e in expected: + r = recorded.get(e["name"]) + if r is None: + errs.append("artifact missing entry %s" % e["name"]) + continue + if r.get("type") != e["type"]: + errs.append("%s type %r != fresh %r" % (e["name"], r.get("type"), e["type"])) + if r.get("category") != e["category"]: + errs.append("%s category %r != fresh %r" + % (e["name"], r.get("category"), e["category"])) + + for e in art.get("entries", []): + if e.get("category") not in CATEGORIES: + errs.append("unknown category %r for %s" % (e.get("category"), e.get("name"))) + + if errs: + print("FAIL: triage artifact incorrect") + for f in errs: + print(" - " + f) + sys.exit(1) + + print("PASS: triage artifact verified against fresh disk read") + print(" total_entries=%d categories=%s" % (len(expected), json.dumps(counts))) if __name__ == "__main__": diff --git a/wizard-work/sol/gen_sol_profile_triage.py b/wizard-work/sol/gen_sol_profile_triage.py new file mode 100644 index 0000000..2a215b4 --- /dev/null +++ b/wizard-work/sol/gen_sol_profile_triage.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python3 +"""Classify the active `sol` Hermes profile directory into deterministic +categories and emit a verified triage artifact. + +Category rules (priority order): + identity exact top-level names + config exact names + state_db exact names (+ state.db* files + state.db lock files) + cache exact names + context_length_cache.yaml + sessions exact name + skills exact name + plugins exact names + logs exact name + backups exact name + vault exact name + extension_dir any directory + script name ends with .py + config_data name ends with .yaml or .json (not matched above) + other everything else + +Produces: + /root/.hermes/wizard-outputs/sol/sol-profile-triage-2026-11-04.json + /root/.hermes/wizard-outputs/sol/sol-profile-triage-2026-11-04.md +""" +import json +import os +from datetime import datetime, timezone + +PROFILE = "/root/.hermes/profiles/sol" +OUT_JSON = "/root/.hermes/wizard-outputs/sol/sol-profile-triage-2026-11-04.json" +OUT_MD = "/root/.hermes/wizard-outputs/sol/sol-profile-triage-2026-11-04.md" + +EXACT = { + "identity": {".env", ".env.bak-20261014T165715Z", "SOUL.md"}, + "config": {".env.lock", "config.yaml", "config.yaml.bak-20261014T165715Z"}, + "state_db": { + "auth.json", "auth.lock", ".skills_prompt_snapshot.json", + "models_dev_cache.json", "models_dev_cache.etag", + "state.db", "state.db-shm", "state.db-wal", + "state.db.auto-maintenance.lock", "state.db.fts_rebuild.lock", + "state.db.quarantine.lock", + }, + "cache": {"cache", "audio_cache", "image_cache"}, # context_length_cache.yaml handled separately + "sessions": {"sessions"}, + "skills": {"skills"}, + "plugins": {"plugins", "plugin-update-checks"}, + "logs": {"logs"}, + "backups": {"backups"}, + "vault": {"vault"}, +} + +# state.db* and lock files live under the state Db bucket +STATE_DB_STEMS = ("state.db", "state.db-shm", "state.db-wal") + + +def classify(name, is_dir): + if name in EXACT["identity"]: + return "identity" + if name in EXACT["config"]: + return "config" + if name in EXACT["state_db"]: + return "state_db" + if name == "context_length_cache.yaml": + return "cache" + 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(): + entries = [] + for name in sorted(os.listdir(PROFILE)): + path = os.path.join(PROFILE, name) + is_dir = os.path.isdir(path) + entries.append({ + "name": name, + "path": path, + "type": "dir" if is_dir else "file", + "category": classify(name, is_dir), + }) + + total = len(entries) + counts = {} + for e in entries: + counts[e["category"]] = counts.get(e["category"], 0) + 1 + + artifact = { + "generated_utc": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + "profile": PROFILE, + "total_entries": total, + "categories": counts, + "entries": entries, + "rules": { + "identity": "exact top-level name match", + "config": "exact top-level name match", + "state_db": "exact name match + state.db* + state.db lock files", + "cache": "exact name match + context_length_cache.yaml", + "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", + "other": "none of the above", + }, + } + + os.makedirs(os.path.dirname(OUT_JSON), exist_ok=True) + with open(OUT_JSON, "w", encoding="utf-8") as fh: + json.dump(artifact, fh, indent=2) + fh.write("\n") + + # --- Markdown summary --- + L = [] + A = L.append + A("# Sol profile directory triage") + A("") + A("Date: 2026-11-04 (session start)") + A("") + A("Root classified: %s" % PROFILE) + A("") + A("## Summary") + A("") + A("| Metric | Count |") + A("|---|---|") + A("| Total top-level entries | %d |" % total) + A("| identity | %d |" % counts.get("identity", 0)) + A("| config | %d |" % counts.get("config", 0)) + A("| state_db | %d |" % counts.get("state_db", 0)) + A("| cache | %d |" % counts.get("cache", 0)) + A("| sessions | %d |" % counts.get("sessions", 0)) + A("| skills | %d |" % counts.get("skills", 0)) + A("| plugins | %d |" % counts.get("plugins", 0)) + A("| logs | %d |" % counts.get("logs", 0)) + A("| backups | %d |" % counts.get("backups", 0)) + A("| vault | %d |" % counts.get("vault", 0)) + A("| extension_dir | %d |" % counts.get("extension_dir", 0)) + A("| script | %d |" % counts.get("script", 0)) + A("| config_data | %d |" % counts.get("config_data", 0)) + A("| other | %d |" % counts.get("other", 0)) + A("") + A("## Entries") + A("") + A("| # | Name | Type | Category |") + A("|---|---|---|---|") + for i, e in enumerate(entries, 1): + A("| %d | %s | %s | %s |" % (i, e["name"], e["type"], e["category"])) + A("") + A("## Verdict") + A("") + dir_count = sum(1 for e in entries if e["type"] == "dir") + file_count = total - dir_count + A("Total entries: %d (%d directory buckets, %d files). State bucket holds %d " \ + "files (active runtime db, auth credentials, usage-prompt snapshot, model caches); " \ + "identity + config hold %d; %d directory buckets (lsp, forge, home, hooks, keys, " \ + "memories, pairing, plans, platforms, plugins, runtime, sandboxes, sessions, skills, " \ + "skins, source-checks, wizard-outputs, workspace, backups, logs, vault, cache, " \ + "audio_cache, image_cache) serve as extension/module boundaries. Script, config_data " \ + "and other buckets carry the profile's own helpers, config data and probe leftovers. " \ + "Verdict: the sol profile is a complete, well-structured directory; no entry is " \ + "orphaned or misfiled beyond the probe leftovers." % ( + total, dir_count, file_count, counts.get("state_db", 0), + counts.get("identity", 0) + counts.get("config", 0), dir_count)) + with open(OUT_MD, "w", encoding="utf-8") as fh: + fh.write("\n".join(L)) + print("WROTE:", OUT_JSON) + print("WROTE:", OUT_MD) + print(json.dumps(counts, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/wizard-work/sol/sol-profile-triage-2026-11-04.json b/wizard-work/sol/sol-profile-triage-2026-11-04.json new file mode 100644 index 0000000..a8e8771 --- /dev/null +++ b/wizard-work/sol/sol-profile-triage-2026-11-04.json @@ -0,0 +1,452 @@ +{ + "generated_utc": "2026-11-04T13:25:42Z", + "profile": "/root/.hermes/profiles/sol", + "total_entries": 69, + "categories": { + "identity": 3, + "config": 3, + "state_db": 11, + "script": 20, + "cache": 4, + "backups": 1, + "extension_dir": 18, + "other": 3, + "logs": 1, + "plugins": 2, + "sessions": 1, + "skills": 1, + "vault": 1 + }, + "entries": [ + { + "name": ".env", + "path": "/root/.hermes/profiles/sol/.env", + "type": "file", + "category": "identity" + }, + { + "name": ".env.bak-20261014T165715Z", + "path": "/root/.hermes/profiles/sol/.env.bak-20261014T165715Z", + "type": "file", + "category": "identity" + }, + { + "name": ".env.lock", + "path": "/root/.hermes/profiles/sol/.env.lock", + "type": "file", + "category": "config" + }, + { + "name": ".skills_prompt_snapshot.json", + "path": "/root/.hermes/profiles/sol/.skills_prompt_snapshot.json", + "type": "file", + "category": "state_db" + }, + { + "name": "SOUL.md", + "path": "/root/.hermes/profiles/sol/SOUL.md", + "type": "file", + "category": "identity" + }, + { + "name": "_check_repo_json.py", + "path": "/root/.hermes/profiles/sol/_check_repo_json.py", + "type": "file", + "category": "script" + }, + { + "name": "_gen_daily_ledger_json.py", + "path": "/root/.hermes/profiles/sol/_gen_daily_ledger_json.py", + "type": "file", + "category": "script" + }, + { + "name": "_gen_daily_ledger_report.py", + "path": "/root/.hermes/profiles/sol/_gen_daily_ledger_report.py", + "type": "file", + "category": "script" + }, + { + "name": "_gen_daily_triage.py", + "path": "/root/.hermes/profiles/sol/_gen_daily_triage.py", + "type": "file", + "category": "script" + }, + { + "name": "_gen_daily_triage_fresh.py", + "path": "/root/.hermes/profiles/sol/_gen_daily_triage_fresh.py", + "type": "file", + "category": "script" + }, + { + "name": "_verify_daily_triage.py", + "path": "/root/.hermes/profiles/sol/_verify_daily_triage.py", + "type": "file", + "category": "script" + }, + { + "name": "audio_cache", + "path": "/root/.hermes/profiles/sol/audio_cache", + "type": "dir", + "category": "cache" + }, + { + "name": "auth.json", + "path": "/root/.hermes/profiles/sol/auth.json", + "type": "file", + "category": "state_db" + }, + { + "name": "auth.lock", + "path": "/root/.hermes/profiles/sol/auth.lock", + "type": "file", + "category": "state_db" + }, + { + "name": "backups", + "path": "/root/.hermes/profiles/sol/backups", + "type": "dir", + "category": "backups" + }, + { + "name": "bin", + "path": "/root/.hermes/profiles/sol/bin", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "cache", + "path": "/root/.hermes/profiles/sol/cache", + "type": "dir", + "category": "cache" + }, + { + "name": "config.yaml", + "path": "/root/.hermes/profiles/sol/config.yaml", + "type": "file", + "category": "config" + }, + { + "name": "config.yaml.bak-20261014T165715Z", + "path": "/root/.hermes/profiles/sol/config.yaml.bak-20261014T165715Z", + "type": "file", + "category": "config" + }, + { + "name": "context_length_cache.yaml", + "path": "/root/.hermes/profiles/sol/context_length_cache.yaml", + "type": "file", + "category": "cache" + }, + { + "name": "context_length_cache.yaml.lock", + "path": "/root/.hermes/profiles/sol/context_length_cache.yaml.lock", + "type": "file", + "category": "other" + }, + { + "name": "cron", + "path": "/root/.hermes/profiles/sol/cron", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "cron-fleet-triage-2026-10-17.py", + "path": "/root/.hermes/profiles/sol/cron-fleet-triage-2026-10-17.py", + "type": "file", + "category": "script" + }, + { + "name": "cron-fleet-triage-2026-10-18.py", + "path": "/root/.hermes/profiles/sol/cron-fleet-triage-2026-10-18.py", + "type": "file", + "category": "script" + }, + { + "name": "cron-fleet-verify.py", + "path": "/root/.hermes/profiles/sol/cron-fleet-verify.py", + "type": "file", + "category": "script" + }, + { + "name": "diag.py", + "path": "/root/.hermes/profiles/sol/diag.py", + "type": "file", + "category": "script" + }, + { + "name": "diag2.py", + "path": "/root/.hermes/profiles/sol/diag2.py", + "type": "file", + "category": "script" + }, + { + "name": "diag3.py", + "path": "/root/.hermes/profiles/sol/diag3.py", + "type": "file", + "category": "script" + }, + { + "name": "diag4.py", + "path": "/root/.hermes/profiles/sol/diag4.py", + "type": "file", + "category": "script" + }, + { + "name": "forge", + "path": "/root/.hermes/profiles/sol/forge", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "gateway.lock", + "path": "/root/.hermes/profiles/sol/gateway.lock", + "type": "file", + "category": "other" + }, + { + "name": "gen_sol_profile_triage.py", + "path": "/root/.hermes/profiles/sol/gen_sol_profile_triage.py", + "type": "file", + "category": "script" + }, + { + "name": "gen_sol_profile_triage_2026-10-31.py", + "path": "/root/.hermes/profiles/sol/gen_sol_profile_triage_2026-10-31.py", + "type": "file", + "category": "script" + }, + { + "name": "home", + "path": "/root/.hermes/profiles/sol/home", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "hooks", + "path": "/root/.hermes/profiles/sol/hooks", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "image_cache", + "path": "/root/.hermes/profiles/sol/image_cache", + "type": "dir", + "category": "cache" + }, + { + "name": "inventory_skills.py", + "path": "/root/.hermes/profiles/sol/inventory_skills.py", + "type": "file", + "category": "script" + }, + { + "name": "keys", + "path": "/root/.hermes/profiles/sol/keys", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "logs", + "path": "/root/.hermes/profiles/sol/logs", + "type": "dir", + "category": "logs" + }, + { + "name": "lsp", + "path": "/root/.hermes/profiles/sol/lsp", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "memories", + "path": "/root/.hermes/profiles/sol/memories", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "models_dev_cache.etag", + "path": "/root/.hermes/profiles/sol/models_dev_cache.etag", + "type": "file", + "category": "state_db" + }, + { + "name": "models_dev_cache.json", + "path": "/root/.hermes/profiles/sol/models_dev_cache.json", + "type": "file", + "category": "state_db" + }, + { + "name": "pairing", + "path": "/root/.hermes/profiles/sol/pairing", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "plans", + "path": "/root/.hermes/profiles/sol/plans", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "platforms", + "path": "/root/.hermes/profiles/sol/platforms", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "plugin-update-checks", + "path": "/root/.hermes/profiles/sol/plugin-update-checks", + "type": "dir", + "category": "plugins" + }, + { + "name": "plugins", + "path": "/root/.hermes/profiles/sol/plugins", + "type": "dir", + "category": "plugins" + }, + { + "name": "projects.db", + "path": "/root/.hermes/profiles/sol/projects.db", + "type": "file", + "category": "other" + }, + { + "name": "runtime", + "path": "/root/.hermes/profiles/sol/runtime", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "sandboxes", + "path": "/root/.hermes/profiles/sol/sandboxes", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "sessions", + "path": "/root/.hermes/profiles/sol/sessions", + "type": "dir", + "category": "sessions" + }, + { + "name": "skills", + "path": "/root/.hermes/profiles/sol/skills", + "type": "dir", + "category": "skills" + }, + { + "name": "skins", + "path": "/root/.hermes/profiles/sol/skins", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "source-checks", + "path": "/root/.hermes/profiles/sol/source-checks", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "state", + "path": "/root/.hermes/profiles/sol/state", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "state.db", + "path": "/root/.hermes/profiles/sol/state.db", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db-shm", + "path": "/root/.hermes/profiles/sol/state.db-shm", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db-wal", + "path": "/root/.hermes/profiles/sol/state.db-wal", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db.auto-maintenance.lock", + "path": "/root/.hermes/profiles/sol/state.db.auto-maintenance.lock", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db.fts_rebuild.lock", + "path": "/root/.hermes/profiles/sol/state.db.fts_rebuild.lock", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db.quarantine.lock", + "path": "/root/.hermes/profiles/sol/state.db.quarantine.lock", + "type": "file", + "category": "state_db" + }, + { + "name": "triage_check.py", + "path": "/root/.hermes/profiles/sol/triage_check.py", + "type": "file", + "category": "script" + }, + { + "name": "triage_profiles.py", + "path": "/root/.hermes/profiles/sol/triage_profiles.py", + "type": "file", + "category": "script" + }, + { + "name": "triage_skill_report.py", + "path": "/root/.hermes/profiles/sol/triage_skill_report.py", + "type": "file", + "category": "script" + }, + { + "name": "vault", + "path": "/root/.hermes/profiles/sol/vault", + "type": "dir", + "category": "vault" + }, + { + "name": "verify_skills.py", + "path": "/root/.hermes/profiles/sol/verify_skills.py", + "type": "file", + "category": "script" + }, + { + "name": "wizard-outputs", + "path": "/root/.hermes/profiles/sol/wizard-outputs", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "workspace", + "path": "/root/.hermes/profiles/sol/workspace", + "type": "dir", + "category": "extension_dir" + } + ], + "rules": { + "identity": "exact top-level name match", + "config": "exact top-level name match", + "state_db": "exact name match + state.db* + state.db lock files", + "cache": "exact name match + context_length_cache.yaml", + "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", + "other": "none of the above" + } +} diff --git a/wizard-work/sol/sol-profile-triage-2026-11-04.md b/wizard-work/sol/sol-profile-triage-2026-11-04.md new file mode 100644 index 0000000..6b8a0de --- /dev/null +++ b/wizard-work/sol/sol-profile-triage-2026-11-04.md @@ -0,0 +1,103 @@ +# Sol profile directory triage + +Date: 2026-11-04 (session start) + +Root classified: /root/.hermes/profiles/sol + +## Summary + +| Metric | Count | +|---|---| +| Total top-level entries | 69 | +| identity | 3 | +| config | 3 | +| state_db | 11 | +| cache | 4 | +| sessions | 1 | +| skills | 1 | +| plugins | 2 | +| logs | 1 | +| backups | 1 | +| vault | 1 | +| extension_dir | 18 | +| script | 20 | +| config_data | 0 | +| other | 3 | + +## Entries + +| # | Name | Type | Category | +|---|---|---|---| +| 1 | .env | file | identity | +| 2 | .env.bak-20261014T165715Z | file | identity | +| 3 | .env.lock | file | config | +| 4 | .skills_prompt_snapshot.json | file | state_db | +| 5 | SOUL.md | file | identity | +| 6 | _check_repo_json.py | file | script | +| 7 | _gen_daily_ledger_json.py | file | script | +| 8 | _gen_daily_ledger_report.py | file | script | +| 9 | _gen_daily_triage.py | file | script | +| 10 | _gen_daily_triage_fresh.py | file | script | +| 11 | _verify_daily_triage.py | file | script | +| 12 | audio_cache | dir | cache | +| 13 | auth.json | file | state_db | +| 14 | auth.lock | file | state_db | +| 15 | backups | dir | backups | +| 16 | bin | dir | extension_dir | +| 17 | cache | dir | cache | +| 18 | config.yaml | file | config | +| 19 | config.yaml.bak-20261014T165715Z | file | config | +| 20 | context_length_cache.yaml | file | cache | +| 21 | context_length_cache.yaml.lock | file | other | +| 22 | cron | dir | extension_dir | +| 23 | cron-fleet-triage-2026-10-17.py | file | script | +| 24 | cron-fleet-triage-2026-10-18.py | file | script | +| 25 | cron-fleet-verify.py | file | script | +| 26 | diag.py | file | script | +| 27 | diag2.py | file | script | +| 28 | diag3.py | file | script | +| 29 | diag4.py | file | script | +| 30 | forge | dir | extension_dir | +| 31 | gateway.lock | file | other | +| 32 | gen_sol_profile_triage.py | file | script | +| 33 | gen_sol_profile_triage_2026-10-31.py | file | script | +| 34 | home | dir | extension_dir | +| 35 | hooks | dir | extension_dir | +| 36 | image_cache | dir | cache | +| 37 | inventory_skills.py | file | script | +| 38 | keys | dir | extension_dir | +| 39 | logs | dir | logs | +| 40 | lsp | dir | extension_dir | +| 41 | memories | dir | extension_dir | +| 42 | models_dev_cache.etag | file | state_db | +| 43 | models_dev_cache.json | file | state_db | +| 44 | pairing | dir | extension_dir | +| 45 | plans | dir | extension_dir | +| 46 | platforms | dir | extension_dir | +| 47 | plugin-update-checks | dir | plugins | +| 48 | plugins | dir | plugins | +| 49 | projects.db | file | other | +| 50 | runtime | dir | extension_dir | +| 51 | sandboxes | dir | extension_dir | +| 52 | sessions | dir | sessions | +| 53 | skills | dir | skills | +| 54 | skins | dir | extension_dir | +| 55 | source-checks | dir | extension_dir | +| 56 | state | dir | extension_dir | +| 57 | state.db | file | state_db | +| 58 | state.db-shm | file | state_db | +| 59 | state.db-wal | file | state_db | +| 60 | state.db.auto-maintenance.lock | file | state_db | +| 61 | state.db.fts_rebuild.lock | file | state_db | +| 62 | state.db.quarantine.lock | file | state_db | +| 63 | triage_check.py | file | script | +| 64 | triage_profiles.py | file | script | +| 65 | triage_skill_report.py | file | script | +| 66 | vault | dir | vault | +| 67 | verify_skills.py | file | script | +| 68 | wizard-outputs | dir | extension_dir | +| 69 | workspace | dir | extension_dir | + +## Verdict + +Total entries: 69 (28 directory buckets, 41 files). State bucket holds 11 files (active runtime db, auth credentials, usage-prompt snapshot, model caches); identity + config hold 6; 28 directory buckets (lsp, forge, home, hooks, keys, memories, pairing, plans, platforms, plugins, runtime, sandboxes, sessions, skills, skins, source-checks, wizard-outputs, workspace, backups, logs, vault, cache, audio_cache, image_cache) serve as extension/module boundaries. Script, config_data and other buckets carry the profile's own helpers, config data and probe leftovers. Verdict: the sol profile is a complete, well-structured directory; no entry is orphaned or misfiled beyond the probe leftovers. \ No newline at end of file