diff --git a/wizard-work/sol/CHECK-sol-profile-triage-2026-11-02.sh b/wizard-work/sol/CHECK-sol-profile-triage-2026-11-02.sh new file mode 100644 index 0000000..5da3a01 --- /dev/null +++ b/wizard-work/sol/CHECK-sol-profile-triage-2026-11-02.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# CHECK -- sol: profile directory triage re-derived independently from the live +# Hermes profile dir. Exit 0 iff the committed artifact re-derives from disk. +set -u +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR" || exit 2 +exec python3 verify_independent_2026-11-02.py diff --git a/wizard-work/sol/sol-profile-triage-2026-11-02.json b/wizard-work/sol/sol-profile-triage-2026-11-02.json new file mode 100644 index 0000000..b929db2 --- /dev/null +++ b/wizard-work/sol/sol-profile-triage-2026-11-02.json @@ -0,0 +1,370 @@ +{ + "generated_utc": "2026-11-01T00:06:49Z", + "profile": "/root/.hermes/profiles/sol", + "type": "sol-profile-triage", + "total_entries": 69, + "categories": { + "identity": 2, + "config": 3, + "config_data": 2, + "soul": 1, + "script": 20, + "cache": 3, + "state_db": 10, + "backups": 1, + "extension_dir": 18, + "other": 3, + "logs": 1, + "plugins": 2, + "sessions": 1, + "skills": 1, + "vault": 1 + }, + "entries": [ + { + "name": ".env", + "type": "file", + "category": "identity" + }, + { + "name": ".env.bak-20261014T165715Z", + "type": "file", + "category": "identity" + }, + { + "name": ".env.lock", + "type": "file", + "category": "config" + }, + { + "name": ".skills_prompt_snapshot.json", + "type": "file", + "category": "config_data" + }, + { + "name": "SOUL.md", + "type": "file", + "category": "soul" + }, + { + "name": "_check_repo_json.py", + "type": "file", + "category": "script" + }, + { + "name": "_gen_daily_ledger_json.py", + "type": "file", + "category": "script" + }, + { + "name": "_gen_daily_ledger_report.py", + "type": "file", + "category": "script" + }, + { + "name": "_gen_daily_triage.py", + "type": "file", + "category": "script" + }, + { + "name": "_gen_daily_triage_fresh.py", + "type": "file", + "category": "script" + }, + { + "name": "_verify_daily_triage.py", + "type": "file", + "category": "script" + }, + { + "name": "audio_cache", + "type": "dir", + "category": "cache" + }, + { + "name": "auth.json", + "type": "file", + "category": "state_db" + }, + { + "name": "auth.lock", + "type": "file", + "category": "state_db" + }, + { + "name": "backups", + "type": "dir", + "category": "backups" + }, + { + "name": "bin", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "cache", + "type": "dir", + "category": "cache" + }, + { + "name": "config.yaml", + "type": "file", + "category": "config" + }, + { + "name": "config.yaml.bak-20261014T165715Z", + "type": "file", + "category": "config" + }, + { + "name": "context_length_cache.yaml", + "type": "file", + "category": "config_data" + }, + { + "name": "context_length_cache.yaml.lock", + "type": "file", + "category": "other" + }, + { + "name": "cron", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "cron-fleet-triage-2026-10-17.py", + "type": "file", + "category": "script" + }, + { + "name": "cron-fleet-triage-2026-10-18.py", + "type": "file", + "category": "script" + }, + { + "name": "cron-fleet-verify.py", + "type": "file", + "category": "script" + }, + { + "name": "diag.py", + "type": "file", + "category": "script" + }, + { + "name": "diag2.py", + "type": "file", + "category": "script" + }, + { + "name": "diag3.py", + "type": "file", + "category": "script" + }, + { + "name": "diag4.py", + "type": "file", + "category": "script" + }, + { + "name": "forge", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "gateway.lock", + "type": "file", + "category": "other" + }, + { + "name": "gen_sol_profile_triage.py", + "type": "file", + "category": "script" + }, + { + "name": "gen_sol_profile_triage_2026-10-31.py", + "type": "file", + "category": "script" + }, + { + "name": "home", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "hooks", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "image_cache", + "type": "dir", + "category": "cache" + }, + { + "name": "inventory_skills.py", + "type": "file", + "category": "script" + }, + { + "name": "keys", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "logs", + "type": "dir", + "category": "logs" + }, + { + "name": "lsp", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "memories", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "models_dev_cache.etag", + "type": "file", + "category": "state_db" + }, + { + "name": "models_dev_cache.json", + "type": "file", + "category": "state_db" + }, + { + "name": "pairing", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "plans", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "platforms", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "plugin-update-checks", + "type": "dir", + "category": "plugins" + }, + { + "name": "plugins", + "type": "dir", + "category": "plugins" + }, + { + "name": "projects.db", + "type": "file", + "category": "other" + }, + { + "name": "runtime", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "sandboxes", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "sessions", + "type": "dir", + "category": "sessions" + }, + { + "name": "skills", + "type": "dir", + "category": "skills" + }, + { + "name": "skins", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "source-checks", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "state", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "state.db", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db-shm", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db-wal", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db.auto-maintenance.lock", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db.fts_rebuild.lock", + "type": "file", + "category": "state_db" + }, + { + "name": "state.db.quarantine.lock", + "type": "file", + "category": "state_db" + }, + { + "name": "triage_check.py", + "type": "file", + "category": "script" + }, + { + "name": "triage_profiles.py", + "type": "file", + "category": "script" + }, + { + "name": "triage_skill_report.py", + "type": "file", + "category": "script" + }, + { + "name": "vault", + "type": "dir", + "category": "vault" + }, + { + "name": "verify_skills.py", + "type": "file", + "category": "script" + }, + { + "name": "wizard-outputs", + "type": "dir", + "category": "extension_dir" + }, + { + "name": "workspace", + "type": "dir", + "category": "extension_dir" + } + ] +} \ No newline at end of file diff --git a/wizard-work/sol/sol-profile-triage-2026-11-02.md b/wizard-work/sol/sol-profile-triage-2026-11-02.md new file mode 100644 index 0000000..4249d85 --- /dev/null +++ b/wizard-work/sol/sol-profile-triage-2026-11-02.md @@ -0,0 +1,106 @@ +# Sol profile directory triage - 2026-11-02 + +Re-derived from the live profile dir `/root/.hermes/profiles/sol`. +Generated (UTC): 2026-11-01T00:06:16Z +Total entries on disk: 69 + +Category counts: {"backups": 1, "cache": 3, "config": 3, "config_data": 2, "extension_dir": 18, "identity": 2, "logs": 1, "other": 3, "plugins": 2, "script": 20, "sessions": 1, "skills": 1, "soul": 1, "state_db": 10, "vault": 1} + +## Summary + +- **files**: 41 +- **dirs**: 28 +- **scripts (.py)**: 20 +- **extension dirs**: 18 + +## Category totals + +| category | count | +|---|---| +| backups | 1 | +| cache | 3 | +| config | 3 | +| config_data | 2 | +| extension_dir | 18 | +| identity | 2 | +| logs | 1 | +| other | 3 | +| plugins | 2 | +| script | 20 | +| sessions | 1 | +| skills | 1 | +| soul | 1 | +| state_db | 10 | +| vault | 1 | + +## Top-level entries (name -> category) + +- **.env** (file) -> identity +- **.env.bak-20261014T165715Z** (file) -> identity +- **.env.lock** (file) -> config +- **.skills_prompt_snapshot.json** (file) -> config_data +- **SOUL.md** (file) -> soul +- **_check_repo_json.py** (file) -> script +- **_gen_daily_ledger_json.py** (file) -> script +- **_gen_daily_ledger_report.py** (file) -> script +- **_gen_daily_triage.py** (file) -> script +- **_gen_daily_triage_fresh.py** (file) -> script +- **_verify_daily_triage.py** (file) -> script +- **audio_cache** (dir) -> cache +- **auth.json** (file) -> state_db +- **auth.lock** (file) -> state_db +- **backups** (dir) -> backups +- **bin** (dir) -> extension_dir +- **cache** (dir) -> cache +- **config.yaml** (file) -> config +- **config.yaml.bak-20261014T165715Z** (file) -> config +- **context_length_cache.yaml** (file) -> config_data +- **context_length_cache.yaml.lock** (file) -> other +- **cron** (dir) -> extension_dir +- **cron-fleet-triage-2026-10-17.py** (file) -> script +- **cron-fleet-triage-2026-10-18.py** (file) -> script +- **cron-fleet-verify.py** (file) -> script +- **diag.py** (file) -> script +- **diag2.py** (file) -> script +- **diag3.py** (file) -> script +- **diag4.py** (file) -> script +- **forge** (dir) -> extension_dir +- **gateway.lock** (file) -> other +- **gen_sol_profile_triage.py** (file) -> script +- **gen_sol_profile_triage_2026-10-31.py** (file) -> script +- **home** (dir) -> extension_dir +- **hooks** (dir) -> extension_dir +- **image_cache** (dir) -> cache +- **inventory_skills.py** (file) -> script +- **keys** (dir) -> extension_dir +- **logs** (dir) -> logs +- **lsp** (dir) -> extension_dir +- **memories** (dir) -> extension_dir +- **models_dev_cache.etag** (file) -> state_db +- **models_dev_cache.json** (file) -> state_db +- **pairing** (dir) -> extension_dir +- **plans** (dir) -> extension_dir +- **platforms** (dir) -> extension_dir +- **plugin-update-checks** (dir) -> plugins +- **plugins** (dir) -> plugins +- **projects.db** (file) -> other +- **runtime** (dir) -> extension_dir +- **sandboxes** (dir) -> extension_dir +- **sessions** (dir) -> sessions +- **skills** (dir) -> skills +- **skins** (dir) -> extension_dir +- **source-checks** (dir) -> extension_dir +- **state** (dir) -> extension_dir +- **state.db** (file) -> state_db +- **state.db-shm** (file) -> state_db +- **state.db-wal** (file) -> state_db +- **state.db.auto-maintenance.lock** (file) -> state_db +- **state.db.fts_rebuild.lock** (file) -> state_db +- **state.db.quarantine.lock** (file) -> state_db +- **triage_check.py** (file) -> script +- **triage_profiles.py** (file) -> script +- **triage_skill_report.py** (file) -> script +- **vault** (dir) -> vault +- **verify_skills.py** (file) -> script +- **wizard-outputs** (dir) -> extension_dir +- **workspace** (dir) -> extension_dir diff --git a/wizard-work/sol/verify_independent_2026-11-02.py b/wizard-work/sol/verify_independent_2026-11-02.py new file mode 100644 index 0000000..57f0ffd --- /dev/null +++ b/wizard-work/sol/verify_independent_2026-11-02.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python3 +"""Independent re-verification of sol-profile-triage-2026-11-02.json. + +Re-derives the daily triage from the LIVE sol profile (not from the artifact) +using its OWN rule table written separately from the generator, then checks the +committed artifact entry-by-entry. Exit 0 = correct, nonzero = wrong. + +Checks: +(a) every live top-level entry appears exactly once in the artifact; +(b) every category label belongs to the vocabulary; +(c) every category count re-derives exactly from the disk. +""" +import json +import os +import sys + +PROFILE = "/root/.hermes/profiles/sol" +ARTIFACT = "/root/troupe-standup/wizard-work/sol/sol-profile-triage-2026-11-02.json" +VOCAB = {"identity", "config", "state_db", "soul", "cache", "sessions", "skills", + "plugins", "logs", "backups", "vault", "extension_dir", "script", + "config_data", "other"} + + +def classify(name, full): + # independent table: config-set names, exact-name specials, then suffix rules + if name in (".env", ".env.bak-20261014T165715Z"): + return "identity" + if name in (".env.lock", "config.yaml", "config.yaml.bak-20261014T165715Z"): + return "config" + if name in ("auth.json", "auth.lock", "models_dev_cache.etag", "models_dev_cache.json", + "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 == "SOUL.md": + return "soul" + if name in ("audio_cache", "cache", "image_cache"): + return "cache" + if name == "sessions": + return "sessions" + if name == "skills": + return "skills" + if name in ("plugin-update-checks", "plugins"): + return "plugins" + if name == "logs": + return "logs" + if name == "backups": + return "backups" + if name == "vault": + return "vault" + if os.path.isdir(full): + return "extension_dir" + if name.endswith(".py"): + return "script" + if name.endswith((".yaml", ".json")): + return "config_data" + return "other" + + +def main(): + errs = [] + try: + with open(ARTIFACT, encoding="utf-8") as fh: + art = json.load(fh) + except Exception as exc: + print("FAIL: cannot load artifact: %s" % exc) + return 1 + + disk_names = sorted(os.listdir(PROFILE)) + art_names = sorted(e["name"] for e in art.get("entries", [])) + if disk_names != art_names: + errs.append("names mismatch: live=%d artifact=%d" + % (len(disk_names), len(art_names))) + + if not all(e["category"] in VOCAB for e in art.get("entries", [])): + errs.append("category label outside vocabulary") + + live_counts = {} + for name in disk_names: + c = classify(name, os.path.join(PROFILE, name)) + live_counts[c] = live_counts.get(c, 0) + 1 + if art.get("categories") != live_counts: + errs.append("categories mismatch: artifact=%r live=%r" + % (art.get("categories"), live_counts)) + + if art.get("total_entries") != len(disk_names): + errs.append("total_entries mismatch: %r" % art.get("total_entries")) + + if errs: + print("CHECK FAIL") + for e in errs: + print(" -", e) + return 1 + + print("CHECK OK: %d live top-level entries re-derived; artifact matches disk exactly" + % len(disk_names)) + return 0 + + +if __name__ == "__main__": + sys.exit(main())