sol: sol-profile directory triage 2026-11-04 (69 entries, 14 categories)
This commit is contained in:
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 $?
|
||||
@@ -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__":
|
||||
|
||||
@@ -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.
|
||||
Reference in new issue
Block a user