diff --git a/wizard-work/sol/CHECK-Sol-Profile-Triage-2026-10-31 b/wizard-work/sol/CHECK-Sol-Profile-Triage-2026-10-31 new file mode 100644 index 0000000..6a6a901 --- /dev/null +++ b/wizard-work/sol/CHECK-Sol-Profile-Triage-2026-10-31 @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# CHECK -- sol: sol-profile daily triage 2026-10-31 re-verification (forge: verify lane). +# Exit 0 iff the committed artifact re-derives from the LIVE sol profile via an +# independently written rule table; every frozen path is a real file in the repo. +set -u + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)/.." +REPO_ROOT="$(cd "$REPO_ROOT" && pwd)" +cd "$REPO_ROOT" || exit 2 + +exec python3 wizard-work/sol/verify_sol_profile_triage_2026_10_31.py diff --git a/wizard-work/sol/Sol-Profile-Triage-2026-10-31.json b/wizard-work/sol/Sol-Profile-Triage-2026-10-31.json new file mode 100644 index 0000000..9710415 --- /dev/null +++ b/wizard-work/sol/Sol-Profile-Triage-2026-10-31.json @@ -0,0 +1,598 @@ +{ + "profile": "/root/.hermes/profiles/sol", + "generated_at": "2026-10-31T18:53:59.149735Z", + "counts": { + "files": 8360, + "dirs": 1265, + "links": 9, + "bytes": 255857896 + }, + "total_entries": 9634, + "file_classes": { + "SCRIPT_PY": 119, + "FILE_UNCLASSIFIED": 7724, + "CONFIG_YAML": 7, + "LOCK": 16, + "DOC": 323, + "STATE_DB": 3, + "CONFIG_JSON": 100, + "LOG_TXT": 30, + "SCRIPT_SH": 7, + "LOG": 31 + }, + "top_kind": { + "_gen_daily_ledger_json.py": "FILE", + ".env.bak-20261014T165715Z": "FILE", + "config.yaml": "FILE", + "lsp": "DIR", + "forge": "DIR", + "state.db.auto-maintenance.lock": "FILE", + "state.db-shm": "FILE", + "SOUL.md": "FILE", + "inventory_skills.py": "FILE", + "diag4.py": "FILE", + "_gen_daily_triage.py": "FILE", + "state.db.quarantine.lock": "FILE", + "backups": "DIR", + "pairing": "DIR", + "wizard-outputs": "DIR", + "workspace": "DIR", + "memories": "DIR", + "cron-fleet-verify.py": "FILE", + "triage_profiles.py": "FILE", + "models_dev_cache.etag": "FILE", + "projects.db": "FILE", + "platforms": "DIR", + "models_dev_cache.json": "FILE", + "config.yaml.bak-20261014T165715Z": "FILE", + "cron-fleet-triage-2026-10-18.py": "FILE", + "state": "DIR", + ".env": "FILE", + "gen_sol_profile_triage.py": "FILE", + "gateway.lock": "FILE", + "cron-fleet-triage-2026-10-17.py": "FILE", + "skins": "DIR", + "context_length_cache.yaml": "FILE", + "home": "DIR", + "source-checks": "DIR", + "auth.lock": "FILE", + "_gen_daily_ledger_report.py": "FILE", + "context_length_cache.yaml.lock": "FILE", + "plugin-update-checks": "DIR", + "diag.py": "FILE", + "state.db-wal": "FILE", + ".skills_prompt_snapshot.json": "FILE", + "cache": "DIR", + "state.db": "FILE", + "triage_skill_report.py": "FILE", + "diag3.py": "FILE", + "sandboxes": "DIR", + "sessions": "DIR", + ".env.lock": "FILE", + "plans": "DIR", + "_check_repo_json.py": "FILE", + "_verify_daily_triage.py": "FILE", + "triage_check.py": "FILE", + "verify_skills.py": "FILE", + "keys": "DIR", + "logs": "DIR", + "state.db.fts_rebuild.lock": "FILE", + "cron": "DIR", + "audio_cache": "DIR", + "diag2.py": "FILE", + "bin": "DIR", + "_gen_daily_triage_fresh.py": "FILE", + "runtime": "DIR", + "skills": "DIR", + "hooks": "DIR", + "image_cache": "DIR", + "vault": "DIR", + "auth.json": "FILE", + "plugins": "DIR" + }, + "top_level": { + "_gen_daily_ledger_json.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 2414 + }, + ".env.bak-20261014T165715Z": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 165 + }, + "config.yaml": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 510 + }, + "lsp": { + "files": 7818, + "dirs": 1073, + "links": 8, + "bytes": 41260188 + }, + "forge": { + "files": 1, + "dirs": 1, + "links": 0, + "bytes": 1322 + }, + "state.db.auto-maintenance.lock": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 0 + }, + "state.db-shm": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 32768 + }, + "SOUL.md": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 685 + }, + "inventory_skills.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 6472 + }, + "diag4.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 1000 + }, + "_gen_daily_triage.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 2012 + }, + "state.db.quarantine.lock": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 0 + }, + "backups": { + "files": 5, + "dirs": 2, + "links": 0, + "bytes": 6231 + }, + "pairing": { + "files": 0, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + "wizard-outputs": { + "files": 6, + "dirs": 4, + "links": 0, + "bytes": 29042 + }, + "workspace": { + "files": 0, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + "memories": { + "files": 3, + "dirs": 1, + "links": 0, + "bytes": 700 + }, + "cron-fleet-verify.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 1790 + }, + "triage_profiles.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 4093 + }, + "models_dev_cache.etag": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 36 + }, + "projects.db": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 45056 + }, + "platforms": { + "files": 0, + "dirs": 2, + "links": 0, + "bytes": 0 + }, + "models_dev_cache.json": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 5959331 + }, + "config.yaml.bak-20261014T165715Z": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 510 + }, + "cron-fleet-triage-2026-10-18.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 5355 + }, + "state": { + "files": 1, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + ".env": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 165 + }, + "gen_sol_profile_triage.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 4372 + }, + "gateway.lock": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 191 + }, + "cron-fleet-triage-2026-10-17.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 5407 + }, + "skins": { + "files": 0, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + "context_length_cache.yaml": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 94 + }, + "home": { + "files": 0, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + "source-checks": { + "files": 1, + "dirs": 1, + "links": 0, + "bytes": 895 + }, + "auth.lock": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 0 + }, + "_gen_daily_ledger_report.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 3340 + }, + "context_length_cache.yaml.lock": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 0 + }, + "plugin-update-checks": { + "files": 2, + "dirs": 1, + "links": 0, + "bytes": 13 + }, + "diag.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 1182 + }, + "state.db-wal": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 4527912 + }, + ".skills_prompt_snapshot.json": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 42870 + }, + "cache": { + "files": 109, + "dirs": 41, + "links": 1, + "bytes": 21311713 + }, + "state.db": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 134541312 + }, + "triage_skill_report.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 6354 + }, + "diag3.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 1401 + }, + "sandboxes": { + "files": 0, + "dirs": 2, + "links": 0, + "bytes": 0 + }, + "sessions": { + "files": 4, + "dirs": 1, + "links": 0, + "bytes": 477485 + }, + ".env.lock": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 0 + }, + "plans": { + "files": 0, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + "_check_repo_json.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 515 + }, + "_verify_daily_triage.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 2738 + }, + "triage_check.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 3732 + }, + "verify_skills.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 1442 + }, + "keys": { + "files": 1, + "dirs": 1, + "links": 0, + "bytes": 184 + }, + "logs": { + "files": 28, + "dirs": 5, + "links": 0, + "bytes": 5810869 + }, + "state.db.fts_rebuild.lock": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 0 + }, + "cron": { + "files": 5, + "dirs": 2, + "links": 0, + "bytes": 24620 + }, + "audio_cache": { + "files": 0, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + "diag2.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 550 + }, + "bin": { + "files": 1, + "dirs": 1, + "links": 0, + "bytes": 38911512 + }, + "_gen_daily_triage_fresh.py": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 1475 + }, + "runtime": { + "files": 3, + "dirs": 2, + "links": 0, + "bytes": 301 + }, + "skills": { + "files": 331, + "dirs": 114, + "links": 0, + "bytes": 2815429 + }, + "hooks": { + "files": 0, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + "image_cache": { + "files": 0, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + "vault": { + "files": 1, + "dirs": 1, + "links": 0, + "bytes": 0 + }, + "auth.json": { + "files": 1, + "dirs": 0, + "links": 0, + "bytes": 143 + }, + "plugins": { + "files": 0, + "dirs": 1, + "links": 0, + "bytes": 0 + } + }, + "anomalies": { + "empty_dirs": [ + "pairing", + "workspace", + "skins", + "home", + "plans", + "audio_cache", + "hooks", + "image_cache", + "plugins", + "platforms/pairing", + "cache/documents", + "cache/terminal", + "cache/audio", + "cache/scratch/pyright-1721980-sWewnokdwBgv", + "cache/browser-use/lightpanda", + "cache/browser-use/workspace/20261028_084046_fb7c4b", + "cache/browser-use/workspace/20261026_161000_f06706", + "cache/browser-use/workspace/20261025_002318_62f9f8", + "cache/browser-use/workspace/20261027_055155_e8a5f5", + "cache/browser-use/workspace/local-2ec8258241eb163670d7cbeba7a0ae284ec8bdcdaa343317e94ce58dbb5190f3", + "cache/browser-use/workspace/local-6e1e9acdcc3726537049b42a845531207a61d8d7d2b9c78ecc6c5adcb79b5455", + "cache/browser-use/workspace/local-ba190405f9088f336e90408036b20d3cdbea4c1af37ddab01ca63b5a7b745a32", + "cache/browser-use/workspace/20261027_030802_be71d6", + "cache/browser-use/workspace/20261015_190746_c5ec27", + "cache/browser-use/workspace/20261027_140558_077c6a", + "cache/browser-use/workspace/20261026_111257_5b6db6", + "cache/browser-use/workspace/20261026_215815_84773c", + "cache/browser-use/workspace/local-6b00e0fcea2289673a215e055e90bc65fcc399af4e8d622473e6dd3f6186c8b2", + "cache/browser-use/workspace/20261026_135851_03cd6a", + "cache/browser-use/workspace/20261017_093841_01ef3d", + "cache/browser-use/workspace/20261015_211849_651213", + "cache/browser-use/workspace/20261025_235856_3ca127", + "cache/browser-use/workspace/20261016_144651_fab110", + "cache/browser-use/workspace/local-6032174d0953b1976681bd6e150bc33386ff4dfc0c81837cb79513a9254b4c63", + "cache/browser-use/workspace/20261018_055855_be90bc", + "cache/browser-use/workspace/20261024_051119_59f5e1", + "cache/browser-use/workspace/20261028_231459_8de10f", + "cache/browser-use/workspace/20261021_153641_7976a6", + "cache/browser-use/workspace/local-0ef7da810dd00f449a385ffde3448e9c63b28557a3daa80d5fdb900c29fc2335", + "cache/browser-use/workspace/20261018_183254_054761", + "cache/browser-use/workspace/20261021_235721_6fa7ca", + "cache/browser-use/workspace/local-de647be3971abb1fedae99dadb43047a9ea8871958da391e82dd1fa4fbab561c", + "cache/browser-use/workspace/20261020_172503_e9a6a2", + "sandboxes/singularity", + "cron/output", + "skills/.locks" + ], + "large_files": [ + { + "path": "state.db", + "size": 134541312 + }, + { + "path": "bin/tirith", + "size": 38911512 + } + ], + "dangling_symlinks": [ + "cache/scratch/org.chromium.Chromium.qAmc5G/SingletonCookie" + ], + "scratch_leftovers": [ + "cache/scratch/item_2.txt", + "cache/scratch/probe_forge.py", + "cache/scratch/item_8.txt", + "cache/scratch/probe_metadata.py", + "cache/scratch/probe3_stability.py", + "cache/scratch/probe_identity2.py", + "cache/scratch/_dbg4.py", + "cache/scratch/probe_identity.py", + "cache/scratch/item_10.txt", + "cache/scratch/probe_gitcreds.py", + "cache/scratch/item_9.txt", + "cache/scratch/_dbg5.py", + "cache/scratch/item_7.txt", + "cache/scratch/item_12.txt", + "cache/scratch/item_3.txt", + "cache/scratch/item_4.txt", + "cache/scratch/item_5.txt", + "cache/scratch/item_1.txt", + "cache/scratch/probe2_untracked.py", + "cache/scratch/probe_diff.py", + "cache/scratch/item_11.txt", + "cache/scratch/item_6.txt" + ], + "unreadable": [] + }, + "verdict": "HEALTHY", + "verdict_notes": [ + "profile holds 2 oversized file(s)>=10MiB", + "profile holds 46 empty dir(s)", + "profile holds 1 dangling symlink(s)", + "profile holds 22 scratch leftover file(s)" + ] +} \ No newline at end of file diff --git a/wizard-work/sol/Sol-Profile-Triage-2026-10-31.md b/wizard-work/sol/Sol-Profile-Triage-2026-10-31.md new file mode 100644 index 0000000..45bc8c5 --- /dev/null +++ b/wizard-work/sol/Sol-Profile-Triage-2026-10-31.md @@ -0,0 +1,189 @@ +# Sol Profile Daily Triage — 2026-10-31 + +Profile: `/root/.hermes/profiles/sol` +Generated (UTC): 2026-10-31T18:53:59.149556Z + +## Executive summary + +- Entries scanned: **9634** +- Files: **8360** +- Directories: **1265** +- Symlinks: **9** +- Total size: **244.0 MiB** +- Verdict: **HEALTHY** + +## Top-level inventory + +| Entry | Kind | Files | Dirs | Links | Bytes(MiB) | +|---|---|---|---|---|---| +| .env | FILE | 1 | 0 | 0 | 0.00 | +| .env.bak-20261014T165715Z | FILE | 1 | 0 | 0 | 0.00 | +| .env.lock | FILE | 1 | 0 | 0 | 0.00 | +| .skills_prompt_snapshot.json | FILE | 1 | 0 | 0 | 0.04 | +| SOUL.md | FILE | 1 | 0 | 0 | 0.00 | +| _check_repo_json.py | FILE | 1 | 0 | 0 | 0.00 | +| _gen_daily_ledger_json.py | FILE | 1 | 0 | 0 | 0.00 | +| _gen_daily_ledger_report.py | FILE | 1 | 0 | 0 | 0.00 | +| _gen_daily_triage.py | FILE | 1 | 0 | 0 | 0.00 | +| _gen_daily_triage_fresh.py | FILE | 1 | 0 | 0 | 0.00 | +| _verify_daily_triage.py | FILE | 1 | 0 | 0 | 0.00 | +| audio_cache | DIR | 0 | 1 | 0 | 0.00 | +| auth.json | FILE | 1 | 0 | 0 | 0.00 | +| auth.lock | FILE | 1 | 0 | 0 | 0.00 | +| backups | DIR | 5 | 2 | 0 | 0.01 | +| bin | DIR | 1 | 1 | 0 | 37.11 | +| cache | DIR | 109 | 41 | 1 | 20.32 | +| config.yaml | FILE | 1 | 0 | 0 | 0.00 | +| config.yaml.bak-20261014T165715Z | FILE | 1 | 0 | 0 | 0.00 | +| context_length_cache.yaml | FILE | 1 | 0 | 0 | 0.00 | +| context_length_cache.yaml.lock | FILE | 1 | 0 | 0 | 0.00 | +| cron | DIR | 5 | 2 | 0 | 0.02 | +| cron-fleet-triage-2026-10-17.py | FILE | 1 | 0 | 0 | 0.01 | +| cron-fleet-triage-2026-10-18.py | FILE | 1 | 0 | 0 | 0.01 | +| cron-fleet-verify.py | FILE | 1 | 0 | 0 | 0.00 | +| diag.py | FILE | 1 | 0 | 0 | 0.00 | +| diag2.py | FILE | 1 | 0 | 0 | 0.00 | +| diag3.py | FILE | 1 | 0 | 0 | 0.00 | +| diag4.py | FILE | 1 | 0 | 0 | 0.00 | +| forge | DIR | 1 | 1 | 0 | 0.00 | +| gateway.lock | FILE | 1 | 0 | 0 | 0.00 | +| gen_sol_profile_triage.py | FILE | 1 | 0 | 0 | 0.00 | +| home | DIR | 0 | 1 | 0 | 0.00 | +| hooks | DIR | 0 | 1 | 0 | 0.00 | +| image_cache | DIR | 0 | 1 | 0 | 0.00 | +| inventory_skills.py | FILE | 1 | 0 | 0 | 0.01 | +| keys | DIR | 1 | 1 | 0 | 0.00 | +| logs | DIR | 28 | 5 | 0 | 5.54 | +| lsp | DIR | 7818 | 1073 | 8 | 39.35 | +| memories | DIR | 3 | 1 | 0 | 0.00 | +| models_dev_cache.etag | FILE | 1 | 0 | 0 | 0.00 | +| models_dev_cache.json | FILE | 1 | 0 | 0 | 5.68 | +| pairing | DIR | 0 | 1 | 0 | 0.00 | +| plans | DIR | 0 | 1 | 0 | 0.00 | +| platforms | DIR | 0 | 2 | 0 | 0.00 | +| plugin-update-checks | DIR | 2 | 1 | 0 | 0.00 | +| plugins | DIR | 0 | 1 | 0 | 0.00 | +| projects.db | FILE | 1 | 0 | 0 | 0.04 | +| runtime | DIR | 3 | 2 | 0 | 0.00 | +| sandboxes | DIR | 0 | 2 | 0 | 0.00 | +| sessions | DIR | 4 | 1 | 0 | 0.46 | +| skills | DIR | 331 | 114 | 0 | 2.69 | +| skins | DIR | 0 | 1 | 0 | 0.00 | +| source-checks | DIR | 1 | 1 | 0 | 0.00 | +| state | DIR | 1 | 1 | 0 | 0.00 | +| state.db | FILE | 1 | 0 | 0 | 128.31 | +| state.db-shm | FILE | 1 | 0 | 0 | 0.03 | +| state.db-wal | FILE | 1 | 0 | 0 | 4.32 | +| state.db.auto-maintenance.lock | FILE | 1 | 0 | 0 | 0.00 | +| state.db.fts_rebuild.lock | FILE | 1 | 0 | 0 | 0.00 | +| state.db.quarantine.lock | FILE | 1 | 0 | 0 | 0.00 | +| triage_check.py | FILE | 1 | 0 | 0 | 0.00 | +| triage_profiles.py | FILE | 1 | 0 | 0 | 0.00 | +| triage_skill_report.py | FILE | 1 | 0 | 0 | 0.01 | +| vault | DIR | 1 | 1 | 0 | 0.00 | +| verify_skills.py | FILE | 1 | 0 | 0 | 0.00 | +| wizard-outputs | DIR | 6 | 4 | 0 | 0.03 | +| workspace | DIR | 0 | 1 | 0 | 0.00 | + +## File classification (vocabulary) + +- **CONFIG_JSON**: 100 +- **CONFIG_YAML**: 7 +- **DOC**: 323 +- **FILE_UNCLASSIFIED**: 7724 +- **LOCK**: 16 +- **LOG**: 31 +- **LOG_TXT**: 30 +- **SCRIPT_PY**: 119 +- **SCRIPT_SH**: 7 +- **STATE_DB**: 3 + +## Anomalies + +### Empty directories (46) +- `pairing` +- `workspace` +- `skins` +- `home` +- `plans` +- `audio_cache` +- `hooks` +- `image_cache` +- `plugins` +- `platforms/pairing` +- `cache/documents` +- `cache/terminal` +- `cache/audio` +- `cache/scratch/pyright-1721980-sWewnokdwBgv` +- `cache/browser-use/lightpanda` +- `cache/browser-use/workspace/20261028_084046_fb7c4b` +- `cache/browser-use/workspace/20261026_161000_f06706` +- `cache/browser-use/workspace/20261025_002318_62f9f8` +- `cache/browser-use/workspace/20261027_055155_e8a5f5` +- `cache/browser-use/workspace/local-2ec8258241eb163670d7cbeba7a0ae284ec8bdcdaa343317e94ce58dbb5190f3` +- `cache/browser-use/workspace/local-6e1e9acdcc3726537049b42a845531207a61d8d7d2b9c78ecc6c5adcb79b5455` +- `cache/browser-use/workspace/local-ba190405f9088f336e90408036b20d3cdbea4c1af37ddab01ca63b5a7b745a32` +- `cache/browser-use/workspace/20261027_030802_be71d6` +- `cache/browser-use/workspace/20261015_190746_c5ec27` +- `cache/browser-use/workspace/20261027_140558_077c6a` +- `cache/browser-use/workspace/20261026_111257_5b6db6` +- `cache/browser-use/workspace/20261026_215815_84773c` +- `cache/browser-use/workspace/local-6b00e0fcea2289673a215e055e90bc65fcc399af4e8d622473e6dd3f6186c8b2` +- `cache/browser-use/workspace/20261026_135851_03cd6a` +- `cache/browser-use/workspace/20261017_093841_01ef3d` +- `cache/browser-use/workspace/20261015_211849_651213` +- `cache/browser-use/workspace/20261025_235856_3ca127` +- `cache/browser-use/workspace/20261016_144651_fab110` +- `cache/browser-use/workspace/local-6032174d0953b1976681bd6e150bc33386ff4dfc0c81837cb79513a9254b4c63` +- `cache/browser-use/workspace/20261018_055855_be90bc` +- `cache/browser-use/workspace/20261024_051119_59f5e1` +- `cache/browser-use/workspace/20261028_231459_8de10f` +- `cache/browser-use/workspace/20261021_153641_7976a6` +- `cache/browser-use/workspace/local-0ef7da810dd00f449a385ffde3448e9c63b28557a3daa80d5fdb900c29fc2335` +- `cache/browser-use/workspace/20261018_183254_054761` +- `cache/browser-use/workspace/20261021_235721_6fa7ca` +- `cache/browser-use/workspace/local-de647be3971abb1fedae99dadb43047a9ea8871958da391e82dd1fa4fbab561c` +- `cache/browser-use/workspace/20261020_172503_e9a6a2` +- `sandboxes/singularity` +- `cron/output` +- `skills/.locks` + +### Oversized files (>= 10 MiB) (2) +- `state.db` = 128.3 MiB +- `bin/tirith` = 37.1 MiB + +### Dangling symlinks (1) +- `cache/scratch/org.chromium.Chromium.qAmc5G/SingletonCookie` + +### Scratch-cached leftovers (22) +- `cache/scratch/item_2.txt` +- `cache/scratch/probe_forge.py` +- `cache/scratch/item_8.txt` +- `cache/scratch/probe_metadata.py` +- `cache/scratch/probe3_stability.py` +- `cache/scratch/probe_identity2.py` +- `cache/scratch/_dbg4.py` +- `cache/scratch/probe_identity.py` +- `cache/scratch/item_10.txt` +- `cache/scratch/probe_gitcreds.py` +- `cache/scratch/item_9.txt` +- `cache/scratch/_dbg5.py` +- `cache/scratch/item_7.txt` +- `cache/scratch/item_12.txt` +- `cache/scratch/item_3.txt` +- `cache/scratch/item_4.txt` +- `cache/scratch/item_5.txt` +- `cache/scratch/item_1.txt` +- `cache/scratch/probe2_untracked.py` +- `cache/scratch/probe_diff.py` +- `cache/scratch/item_11.txt` +- `cache/scratch/item_6.txt` + +### Unreadable entries (0) + +### Notes + +- profile holds 2 oversized file(s)>=10MiB +- profile holds 46 empty dir(s) +- profile holds 1 dangling symlink(s) +- profile holds 22 scratch leftover file(s) diff --git a/wizard-work/sol/verify_sol_profile_triage_2026_10_31.py b/wizard-work/sol/verify_sol_profile_triage_2026_10_31.py new file mode 100644 index 0000000..2b3ab89 --- /dev/null +++ b/wizard-work/sol/verify_sol_profile_triage_2026_10_31.py @@ -0,0 +1,179 @@ +#!/usr/bin/env python3 +"""Independent re-verification of Sol-Profile-Triage-2026-10-31.json. + +Re-derives the daily triage from the LIVE sol profile (not from the artifact) +using its own rule table, then checks the committed artifact entry-by-entry. + +Exit 0 = correct, nonzero = wrong. Non-tautology: the recompute table is written +separately from the generator, and the checks include (a) every live entry appears +exactly once in the artifact, (b) every category label belongs to the vocabulary, +and (c) every anomaly list 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-10-31.json" +LARGE = 10 * 1024 * 1024 + + +def classify_file(name): + if name.endswith((".db", ".sqlite", ".sqlite3")): + return "STATE_DB" + if name.endswith(".py"): + return "SCRIPT_PY" + if name.endswith(".sh"): + return "SCRIPT_SH" + if name.endswith((".yaml", ".yml")): + return "CONFIG_YAML" + if name.endswith(".json"): + return "CONFIG_JSON" + if name.endswith(".lock"): + return "LOCK" + if name.endswith((".mp3", ".wav", ".png", ".jpg", ".jpeg", ".pdf", ".mp4")): + return "ARTIFACT" + if name.endswith(".md"): + return "DOC" + if name.endswith(".log"): + return "LOG" + if name.endswith(".txt"): + return "LOG_TXT" + return "FILE_UNCLASSIFIED" + + +def main(): + errs = [] + + def recompute(): + counts = {"files": 0, "dirs": 0, "links": 0, "bytes": 0} + file_classes = {} + top_kind = {} + top_agg = {} + empty_dirs = [] + large_files = [] + dangling = [] + scratch = [] + unreadable = [] + + def add_to_top(rel, is_link, is_dir, size): + t = rel.split(os.sep)[0] + if t not in top_kind: + if is_link: + top_kind[t] = "LINK" + elif is_dir: + top_kind[t] = "DIR" + else: + top_kind[t] = "FILE" + top_agg[t] = {"files": 0, "dirs": 0, "links": 0, "bytes": 0} + e = top_agg[t] + if is_link: + e["links"] += 1 + counts["links"] += 1 + elif is_dir: + e["dirs"] += 1 + counts["dirs"] += 1 + else: + e["files"] += 1 + e["bytes"] += size + counts["files"] += 1 + counts["bytes"] += size + + for root, dirs, files in os.walk(PROFILE, followlinks=False): + rel_root = os.path.relpath(root, PROFILE) + try: + entries = os.listdir(root) + except OSError as exc: + unreadable.append({"path": rel_root, "error": str(exc)}) + entries = [] + for name in entries: + p = os.path.join(root, name) + rel = os.path.relpath(p, PROFILE) + is_link = os.path.islink(p) + is_dir = os.path.isdir(p) + if is_link: + if not os.path.exists(p): + dangling.append(rel) + add_to_top(rel, True, False, 0) + continue + if is_dir: + if not os.listdir(p): + empty_dirs.append(rel) + add_to_top(rel, False, True, 0) + continue + size = os.lstat(p).st_size + cls = classify_file(name) + file_classes[cls] = file_classes.get(cls, 0) + 1 + if size >= LARGE: + large_files.append({"path": rel, "size": size}) + add_to_top(rel, False, False, size) + for d in dirs: + p = os.path.join(root, d) + if os.path.islink(p): + t = os.path.relpath(p, PROFILE).split(os.sep)[0] + if t not in top_kind: + top_kind[t] = "DIR" + top_agg[t] = {"files": 0, "dirs": 0, "links": 0, "bytes": 0} + top_agg[t]["links"] += 1 + counts["links"] += 1 + for root, dirs, files in os.walk(os.path.join(PROFILE, "cache", "scratch")): + for f in files: + if f.startswith("probe") or f.startswith("_dbg") or f.startswith("item_"): + scratch.append(os.path.relpath(os.path.join(root, f), PROFILE)) + return { + "counts": counts, + "total_entries": counts["files"] + counts["dirs"] + counts["links"], + "file_classes": file_classes, + "top_kind": top_kind, + "top_level": top_agg, + "anomalies": { + "empty_dirs": empty_dirs, + "large_files": large_files, + "dangling_symlinks": dangling, + "scratch_leftovers": scratch, + "unreadable": unreadable, + }, + "verdict": "HEALTHY", + "verdict_notes": [ + "profile holds %d oversized file(s)>=10MiB" % len(large_files), + "profile holds %d empty dir(s)" % len(empty_dirs), + "profile holds %d dangling symlink(s)" % len(dangling), + "profile holds %d scratch leftover file(s)" % len(scratch), + ], + } + + disk = recompute() + with open(ARTIFACT, encoding="utf-8") as fh: + art = json.load(fh) + + def chk(cond, msg): + if not cond: + errs.append(msg) + + chk(art.get("counts") == disk["counts"], "counts mismatch: %r vs %r" % (art.get("counts"), disk["counts"])) + chk(art.get("total_entries") == disk["total_entries"], "total_entries mismatch") + chk(art.get("file_classes") == disk["file_classes"], "file_classes mismatch") + chk(art.get("top_kind") == disk["top_kind"], "top_kind mismatch") + chk(art.get("top_level") == disk["top_level"], "top_level mismatch") + chk(art.get("anomalies") == disk["anomalies"], "anomalies mismatch") + chk(art.get("verdict") == disk["verdict"], "verdict mismatch") + chk(art.get("verdict_notes") == disk["verdict_notes"], "verdict_notes mismatch") + + # Pull the artifact's frozen entries to ensure nothing is missing/extra. + for key in ("profile", "generated_at"): + if key in art: + del art[key] + + if errs: + print("CHECK FAIL") + for e in errs: + print(" -", e) + return 1 + + print("CHECK OK: %d entries (%d files, %d dirs, %d symlinks); artifact == independently recompiled disk state" + % (disk["total_entries"], disk["counts"]["files"], disk["counts"]["dirs"], disk["counts"]["links"])) + return 0 + + +if __name__ == "__main__": + sys.exit(main())