sol: sol-profile directory triage 2026-11-04 (69 entries, 14 categories)

This commit is contained in:
ledger committed 2026-11-04 15:14:46 +00:00
1 parent 009dd2daf0
commit bd69d0ac47
5 files changed
+862 -94

No files matched your search

@@ -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 $?
+99 -94
View File
@@ -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__":
+193
View File
@@ -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()
@@ -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"
}
}
@@ -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.