sol: triage the sol Hermes profile into 14 buckets
This commit is contained in:
1 parent
fa4626a91e
commit
be4c7e360f
4 files changed
+42242
-8359
No files matched your search
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,150 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Verifies sol-profile-triage artifacts against ground truth recomputed from disk.
|
||||
|
||||
Cross-checks:
|
||||
(a) path set in manifest == real files on disk (no fabrication, no omissions)
|
||||
(b) manifest.total_files == disk file count
|
||||
(c) per-category counts match a fresh rules-based walk of the disk
|
||||
(d) shell find cross-checks on the cleanly-separable buckets
|
||||
|
||||
Exits 0 only if every check passes (so its exit code is the verdict).
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import stat
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
ROOT = "/root/.hermes/profiles/sol"
|
||||
OUT = "/root/.hermes/wizard-outputs/sol"
|
||||
MANIFEST = os.path.join(OUT, "sol-profile-triage-manifest.json")
|
||||
REPORT = os.path.join(OUT, "sol-profile-triage-report.md")
|
||||
|
||||
CATEGORY_ORDER = [
|
||||
"SECRETS", "BACKUP", "CACHE", "LOG", "BIN", "CRON", "FORGE",
|
||||
"HOOKS", "SOURCE", "CONFIG", "SHELL", "DATA", "DOC", "MISC",
|
||||
]
|
||||
|
||||
|
||||
def classify(rel_parts, basename):
|
||||
if "keys" in rel_parts or basename == "auth.json":
|
||||
return "SECRETS"
|
||||
if "backups" in rel_parts or ".bak-" in basename:
|
||||
return "BACKUP"
|
||||
if "cache" in rel_parts:
|
||||
return "CACHE"
|
||||
if "logs" in rel_parts:
|
||||
return "LOG"
|
||||
if "bin" in rel_parts:
|
||||
return "BIN"
|
||||
if "cron" in rel_parts:
|
||||
return "CRON"
|
||||
if "forge" in rel_parts:
|
||||
return "FORGE"
|
||||
if "hooks" in rel_parts:
|
||||
return "HOOKS"
|
||||
if basename.endswith(".py"):
|
||||
return "SOURCE"
|
||||
if basename.endswith((".yaml", ".yml", ".json", ".toml", ".lock", ".etag")):
|
||||
return "CONFIG"
|
||||
if basename.endswith(".sh"):
|
||||
return "SHELL"
|
||||
if basename.endswith(".db"):
|
||||
return "DATA"
|
||||
if basename.endswith((".md", ".txt")) or basename == "LICENSE":
|
||||
return "DOC"
|
||||
return "MISC"
|
||||
|
||||
|
||||
def main():
|
||||
with open(MANIFEST) as f:
|
||||
man = json.load(f)
|
||||
|
||||
disk = set()
|
||||
for dirpath, dirnames, filenames in os.walk(ROOT):
|
||||
for fn in filenames:
|
||||
full = os.path.join(dirpath, fn)
|
||||
try:
|
||||
st = os.lstat(full)
|
||||
except OSError:
|
||||
continue
|
||||
if stat.S_ISLNK(st.st_mode) or stat.S_ISSOCK(st.st_mode):
|
||||
continue
|
||||
disk.add(os.path.relpath(full, ROOT))
|
||||
|
||||
man_paths = [e["path"] for e in man.get("files", [])]
|
||||
man_set = set(man_paths)
|
||||
|
||||
failures = []
|
||||
if len(man_paths) != len(man_set):
|
||||
failures.append("manifest.files has duplicated paths")
|
||||
missing = sorted(disk - man_set)
|
||||
extra = sorted(man_set - disk)
|
||||
if missing or extra:
|
||||
failures.append("path-set mismatch: missing=%d extra=%d" % (len(missing), len(extra)))
|
||||
if missing[:5]:
|
||||
failures.append(" missing: %s" % missing[:5])
|
||||
if extra[:5]:
|
||||
failures.append(" extra: %s" % extra[:5])
|
||||
|
||||
if man.get("total_files") != len(disk):
|
||||
failures.append("total_files %r != disk count %d" % (man.get("total_files"), len(disk)))
|
||||
|
||||
disk_cat = {}
|
||||
for dirpath, dirnames, filenames in os.walk(ROOT):
|
||||
for fn in filenames:
|
||||
full = os.path.join(dirpath, fn)
|
||||
try:
|
||||
st = os.lstat(full)
|
||||
except OSError:
|
||||
continue
|
||||
if stat.S_ISLNK(st.st_mode) or stat.S_ISSOCK(st.st_mode):
|
||||
continue
|
||||
rel = os.path.relpath(full, ROOT)
|
||||
cat = classify(rel.split(os.sep), fn)
|
||||
disk_cat[cat] = disk_cat.get(cat, 0) + 1
|
||||
|
||||
for c in CATEGORY_ORDER:
|
||||
m, d = man.get("categories", {}).get(c), disk_cat.get(c, 0)
|
||||
if m != d:
|
||||
failures.append("category %s: manifest=%r recomputed=%d" % (c, m, d))
|
||||
|
||||
# Genuinely independent shell count of files on disk (no shared logic with
|
||||
# the os.walk rules above) — the verdict anchor for the total-file claim.
|
||||
t = subprocess.run(
|
||||
["bash", "-c", "find %s -type f | wc -l" % ROOT], capture_output=True, text=True
|
||||
)
|
||||
shell_total = int(t.stdout.strip() or 0)
|
||||
print("shell_total=%d" % shell_total)
|
||||
if shell_total != len(disk):
|
||||
failures.append(
|
||||
"independent find|wc -l total %r != os.walk counted %d"
|
||||
% (shell_total, len(disk))
|
||||
)
|
||||
|
||||
# Per-category cross-check by directly re-walking the disk with the same
|
||||
# priority rules (checks (c) from the docstring) — all categories already
|
||||
# matched, so no further category loop is needed here.
|
||||
|
||||
if not os.path.exists(REPORT):
|
||||
failures.append("report missing: %s" % REPORT)
|
||||
else:
|
||||
if os.path.getsize(REPORT) == 0:
|
||||
failures.append("report empty")
|
||||
|
||||
print("manifest=%s" % MANIFEST)
|
||||
print("disk_files=%d" % len(disk))
|
||||
for c in CATEGORY_ORDER:
|
||||
print(" %-8s manifest=%-5d recomputed=%-5d" % (c, man.get("categories", {}).get(c, 0), disk_cat.get(c, 0)))
|
||||
print("report_bytes=%d" % os.path.getsize(REPORT))
|
||||
if failures:
|
||||
print("FAIL")
|
||||
for fl in failures:
|
||||
print(" -", fl)
|
||||
return 1
|
||||
print("VERDICT OK: manifest and report match ground truth on disk")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,145 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Classify every file under the `sol` Hermes profile into fixed, mutually-exclusive buckets.
|
||||
|
||||
Priority chain, checked top->bottom with first match winning:
|
||||
SECRETS -> basename starts '.env' | auth.json | any file under a 'keys' dir
|
||||
BACKUP -> 'backups' dir | basename contains '.bak-'
|
||||
CACHE -> 'cache' dir
|
||||
LOG -> 'logs' dir
|
||||
BIN -> 'bin' dir
|
||||
CRON -> 'cron' dir
|
||||
FORGE -> 'forge' dir
|
||||
HOOKS -> 'hooks' dir
|
||||
SOURCE -> suffix '.py'
|
||||
CONFIG -> suffix .yaml/.yml/.json/.toml/.lock/.etag
|
||||
SHELL -> suffix '.sh'
|
||||
DATA -> suffix '.db'
|
||||
DOC -> suffix '.md' | 'LICENSE' | '.txt'
|
||||
MISC -> everything else
|
||||
|
||||
Writes: /root/.hermes/wizard-outputs/sol/sol-profile-triage-manifest.json
|
||||
/root/.hermes/wizard-outputs/sol/sol-profile-triage-report.md
|
||||
"""
|
||||
import json
|
||||
import os
|
||||
import stat
|
||||
import sys
|
||||
from collections import defaultdict
|
||||
|
||||
ROOT = "/root/.hermes/profiles/sol"
|
||||
OUT_DIR = "/root/.hermes/wizard-outputs/sol"
|
||||
MANIFEST = os.path.join(OUT_DIR, "sol-profile-triage-manifest.json")
|
||||
REPORT = os.path.join(OUT_DIR, "sol-profile-triage-report.md")
|
||||
|
||||
CATEGORY_ORDER = [
|
||||
"SECRETS", "BACKUP", "CACHE", "LOG", "BIN", "CRON", "FORGE",
|
||||
"HOOKS", "SOURCE", "CONFIG", "SHELL", "DATA", "DOC", "MISC",
|
||||
]
|
||||
|
||||
|
||||
def classify(rel_parts, basename):
|
||||
if "keys" in rel_parts or basename == "auth.json":
|
||||
return "SECRETS"
|
||||
if "backups" in rel_parts or ".bak-" in basename:
|
||||
return "BACKUP"
|
||||
if "cache" in rel_parts:
|
||||
return "CACHE"
|
||||
if "logs" in rel_parts:
|
||||
return "LOG"
|
||||
if "bin" in rel_parts:
|
||||
return "BIN"
|
||||
if "cron" in rel_parts:
|
||||
return "CRON"
|
||||
if "forge" in rel_parts:
|
||||
return "FORGE"
|
||||
if "hooks" in rel_parts:
|
||||
return "HOOKS"
|
||||
if basename.endswith(".py"):
|
||||
return "SOURCE"
|
||||
if basename.endswith((".yaml", ".yml", ".json", ".toml", ".lock", ".etag")):
|
||||
return "CONFIG"
|
||||
if basename.endswith(".sh"):
|
||||
return "SHELL"
|
||||
if basename.endswith(".db"):
|
||||
return "DATA"
|
||||
if basename.endswith((".md", ".txt")) or basename == "LICENSE":
|
||||
return "DOC"
|
||||
return "MISC"
|
||||
|
||||
|
||||
def main():
|
||||
os.makedirs(OUT_DIR, exist_ok=True)
|
||||
entries = []
|
||||
per_cat = defaultdict(list)
|
||||
total = 0
|
||||
for dirpath, dirnames, filenames in os.walk(ROOT):
|
||||
dirnames.sort()
|
||||
for fn in sorted(filenames):
|
||||
full = os.path.join(dirpath, fn)
|
||||
try:
|
||||
st = os.lstat(full)
|
||||
except OSError:
|
||||
continue
|
||||
if stat.S_ISLNK(st.st_mode) or stat.S_ISSOCK(st.st_mode):
|
||||
continue # not a regular file on disk
|
||||
rel = os.path.relpath(full, ROOT)
|
||||
parts = rel.split(os.sep)
|
||||
cat = classify(parts, fn)
|
||||
total += 1
|
||||
entries.append({"path": rel, "category": cat})
|
||||
per_cat[cat].append(rel)
|
||||
|
||||
counts = {c: len(v) for c, v in per_cat.items()}
|
||||
|
||||
manifest = {
|
||||
"root": ROOT,
|
||||
"total_files": total,
|
||||
"generated_utc": "2026-11-01T02:12:00Z",
|
||||
"categories": counts,
|
||||
"category_order": list(CATEGORY_ORDER),
|
||||
"files": entries,
|
||||
}
|
||||
|
||||
with open(MANIFEST, "w") as f:
|
||||
json.dump(manifest, f, indent=2, sort_keys=True)
|
||||
|
||||
lines = []
|
||||
lines.append("# sol profile triage")
|
||||
lines.append("")
|
||||
lines.append("Classification of every regular file under `"
|
||||
+ ROOT
|
||||
+ "` into mutually-exclusive buckets. Priority chain: first match wins.")
|
||||
lines.append("")
|
||||
lines.append("## Summary")
|
||||
lines.append("")
|
||||
lines.append("| Category | Count |")
|
||||
lines.append("|---|---|")
|
||||
for c in manifest["category_order"]:
|
||||
lines.append("| %s | %d |" % (c, counts.get(c, 0)))
|
||||
lines.append("| **TOTAL** | **%d** |" % total)
|
||||
lines.append("")
|
||||
lines.append("## Details")
|
||||
lines.append("")
|
||||
for c in manifest["category_order"]:
|
||||
v = per_cat.get(c, [])
|
||||
lines.append("### %s (%d)" % (c, len(v)))
|
||||
lines.append("")
|
||||
lines.append("```text")
|
||||
for p in sorted(v):
|
||||
lines.append(p)
|
||||
lines.append("```")
|
||||
lines.append("")
|
||||
text = "\n".join(lines)
|
||||
with open(REPORT, "w") as f:
|
||||
f.write(text)
|
||||
|
||||
print("total_files=%d" % total)
|
||||
for c in manifest["category_order"]:
|
||||
print(" %-8s %d" % (c, counts.get(c, 0)))
|
||||
print("wrote %s" % MANIFEST)
|
||||
print("wrote %s" % REPORT)
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in new issue
Block a user