sol: sol-profile directory triage artifact (2026-10-28)

This commit is contained in:
sol committed 2026-10-28 11:09:49 +00:00
1 parent 5b0b2e4ef8
commit 7e02b24143
3 files changed
+654

No files matched your search

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