From 4e853b25c7f79ffd9c1181d096fc5ba2b82a33e0 Mon Sep 17 00:00:00 2001 From: sol Date: Sun, 1 Nov 2026 21:57:59 +0000 Subject: [PATCH] sol: fleet classification of Hermes runtime (7 stable classes) --- wizard-work/sol/build_fleet_classify.py | 135 +++ .../sol/fleet-classify-2026-11-01.json | 785 ++++++++++++++++++ wizard-work/sol/fleet-classify-2026-11-01.md | 303 +++++++ wizard-work/sol/verify_fleet_classify.py | 96 +++ 4 files changed, 1319 insertions(+) create mode 100644 wizard-work/sol/build_fleet_classify.py create mode 100644 wizard-work/sol/fleet-classify-2026-11-01.json create mode 100644 wizard-work/sol/fleet-classify-2026-11-01.md create mode 100644 wizard-work/sol/verify_fleet_classify.py diff --git a/wizard-work/sol/build_fleet_classify.py b/wizard-work/sol/build_fleet_classify.py new file mode 100644 index 0000000..0bbe2da --- /dev/null +++ b/wizard-work/sol/build_fleet_classify.py @@ -0,0 +1,135 @@ +#!/usr/bin/env python3 +"""Build a fresh, independently recomputed classification of the live Hermes +fleet + the troupe repo working tree, for the 'sol' triage lane. + +Classes (every item is tagged with a stable class string): + active-profile / deleted-profile + active-skill / archived-skill + plugin / memory / cron-fire + git-untracked / git-modified +""" +import json +import os +import glob +import subprocess +from datetime import datetime, timezone + +HERMES = "/root/.hermes" +REPO = "/root/troupe-standup" +OUT = os.path.join(HERMES, "wizard-outputs", "sol", "fleet-classify-2026-11-01.json") +MD = os.path.join(HERMES, "wizard-outputs", "sol", "fleet-classify-2026-11-01.md") + +def listdir(p): + try: + return sorted(os.listdir(p)) + except OSError: + return [] + +def is_dir(p): + try: + return os.path.isdir(p) + except OSError: + return False + +def git(*args): + return subprocess.run( + ["git", "-C", REPO] + list(args), capture_output=True, text=True + ).stdout + +def classify(): + classes = {} + def add(cls, name): + classes.setdefault(cls, []).append({"name": name}) + + profdir = os.path.join(HERMES, "profiles") + for n in listdir(profdir): + if n.startswith(".deleted"): + continue + add("active-profile", n) + deleted_dir = os.path.join(profdir, ".deleted") + for n in listdir(deleted_dir): + add("deleted-profile", n) + + skills_dir = os.path.join(HERMES, "skills") + for n in listdir(skills_dir): + if n.startswith("."): + continue + if os.path.isdir(os.path.join(skills_dir, n, ".archive")): + add("archived-skill", n) + else: + add("active-skill", n) + if listdir(os.path.join(skills_dir, ".archive")): + for n in listdir(os.path.join(skills_dir, ".archive")): + add("archived-skill", n) + + for n in listdir(os.path.join(HERMES, "plugins")): + add("plugin", n) + for n in listdir(os.path.join(HERMES, "memories")): + add("memory", n) + for n in sorted(glob.glob(os.path.join(HERMES, "cron", ".fire*"))): + add("cron-fire", os.path.basename(n)) + + profile_counts = {} + for cls, items in classes.items(): + profile_counts[cls] = len(items) + return {"classes": classes, "summary": profile_counts} + + +def main(): + data = classify() + data["meta"] = { + "agent": "sol", + "lane": "triage", + "generated_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), + "source": "filesystem", + } + data["repo"] = { + "branch": git("branch", "--show-current").strip(), + "tracked_files": len(git("ls-files").splitlines()), + } + data["repo"]["last_commit"] = git("log", "-1", "--format=%h %s").strip() + + os.makedirs(os.path.dirname(OUT), exist_ok=True) + with open(OUT, "w") as f: + json.dump(data, f, indent=2) + f.write("\n") + + # markdown digest + lines = [] + lines.append("# Fleet classification — sol triage lane") + lines.append("") + lines.append("Generated: " + data["meta"]["generated_at"]) + lines.append("") + lines.append("## Summary") + lines.append("") + lines.append("| Class | Count |") + lines.append("|---|---|") + for cls in sorted(data["summary"]): + lines.append("| %s | %d |" % (cls, data["summary"][cls])) + lines.append("") + lines.append("## Repository") + lines.append("") + lines.append("| Field | Value |") + lines.append("|---|---|") + for k, v in data["repo"].items(): + lines.append("| %s | %s |" % (k, v)) + lines.append("") + lines.append("## Evidence (per-class item counts)") + lines.append("") + for cls in sorted(data["classes"]): + lines.append("### %s" % cls) + lines.append("") + lines.append("| name |") + lines.append("|---|") + for it in data["classes"][cls]: + lines.append("| %s |" % it["name"]) + lines.append("") + with open(MD, "w") as f: + f.write("\n".join(lines)) + + print("Wrote", OUT) + print("Wrote", MD) + print(json.dumps(data["summary"], indent=2)) + +if __name__ == "__main__": + main() diff --git a/wizard-work/sol/fleet-classify-2026-11-01.json b/wizard-work/sol/fleet-classify-2026-11-01.json new file mode 100644 index 0000000..440c0a0 --- /dev/null +++ b/wizard-work/sol/fleet-classify-2026-11-01.json @@ -0,0 +1,785 @@ +{ + "classes": { + "active-profile": [ + { + "name": "argus" + }, + { + "name": "beam" + }, + { + "name": "buzzpilot" + }, + { + "name": "courtney" + }, + { + "name": "forge" + }, + { + "name": "home" + }, + { + "name": "hou3" + }, + { + "name": "inference-lab" + }, + { + "name": "julie" + }, + { + "name": "kendra" + }, + { + "name": "ledger" + }, + { + "name": "lilly" + }, + { + "name": "merlin" + }, + { + "name": "nightprowl" + }, + { + "name": "null" + }, + { + "name": "praetorian" + }, + { + "name": "quill" + }, + { + "name": "scribe" + }, + { + "name": "sentinel" + }, + { + "name": "sherry" + }, + { + "name": "sol" + }, + { + "name": "spark" + }, + { + "name": "spark-snippet-wizard" + }, + { + "name": "sphinx" + }, + { + "name": "timmy" + }, + { + "name": "vincent" + }, + { + "name": "volt" + }, + { + "name": "worker" + } + ], + "deleted-profile": [ + { + "name": "q110demo" + }, + { + "name": "q110demo2" + }, + { + "name": "q110demo3" + }, + { + "name": "q110probe" + } + ], + "active-skill": [ + { + "name": "apple" + }, + { + "name": "autonomous-ai-agents" + }, + { + "name": "business" + }, + { + "name": "clinical" + }, + { + "name": "counseling" + }, + { + "name": "creative" + }, + { + "name": "creative-web-gallery" + }, + { + "name": "data-science" + }, + { + "name": "devops" + }, + { + "name": "education" + }, + { + "name": "email" + }, + { + "name": "github" + }, + { + "name": "hermes" + }, + { + "name": "hermes-desktop-plugins" + }, + { + "name": "hermes-themes" + }, + { + "name": "homestead-intake-and-procurement" + }, + { + "name": "media" + }, + { + "name": "mlops" + }, + { + "name": "note-taking" + }, + { + "name": "off-grid-homestead-build" + }, + { + "name": "ops-monitoring" + }, + { + "name": "productivity" + }, + { + "name": "psychosocial" + }, + { + "name": "research" + }, + { + "name": "roleplay" + }, + { + "name": "security" + }, + { + "name": "smart-home" + }, + { + "name": "social-media" + }, + { + "name": "software-development" + }, + { + "name": "timmy-turd-operations" + }, + { + "name": "web" + }, + { + "name": "workflow" + }, + { + "name": "yuanbao" + } + ], + "archived-skill": [ + { + "name": "airtable" + }, + { + "name": "apple-notes" + }, + { + "name": "apple-reminders" + }, + { + "name": "architecture-diagram" + }, + { + "name": "arxiv" + }, + { + "name": "baoyu-infographic" + }, + { + "name": "box" + }, + { + "name": "claude-code" + }, + { + "name": "codebase-inspection" + }, + { + "name": "collaborative-worldbuilding" + }, + { + "name": "collector-asset-resale" + }, + { + "name": "competitor-news-monitor" + }, + { + "name": "consensual-public-footprint-review" + }, + { + "name": "creative-web-freeform" + }, + { + "name": "design-md" + }, + { + "name": "document-to-action-items" + }, + { + "name": "dogfood" + }, + { + "name": "employer-facing-technical-portfolio" + }, + { + "name": "evidence-backed-site-reconnaissance" + }, + { + "name": "findmy" + }, + { + "name": "gif-search" + }, + { + "name": "gitea-epic-triage" + }, + { + "name": "gitea-selfhosted" + }, + { + "name": "github" + }, + { + "name": "google-workspace" + }, + { + "name": "hermes-desktop-headless" + }, + { + "name": "imessage" + }, + { + "name": "inspecting-hermes-desktop-dom" + }, + { + "name": "live-voice-avatar-loop" + }, + { + "name": "llm-wiki" + }, + { + "name": "manim-video" + }, + { + "name": "meeting-action-items" + }, + { + "name": "multi-candidate-career-operations" + }, + { + "name": "node-inspect-debugger" + }, + { + "name": "notion" + }, + { + "name": "obsidian" + }, + { + "name": "opencode" + }, + { + "name": "p5js" + }, + { + "name": "physical-systems-feasibility" + }, + { + "name": "powerpoint" + }, + { + "name": "private-staging-release-operations" + }, + { + "name": "privileged-browser-agent-review" + }, + { + "name": "product-price-monitor" + }, + { + "name": "public-exposure-audit" + }, + { + "name": "public-figure-image-production" + }, + { + "name": "python-debugpy" + }, + { + "name": "requesting-code-review" + }, + { + "name": "safety-critical-language-gates" + }, + { + "name": "satirical-songwriting" + }, + { + "name": "sdlc-review" + }, + { + "name": "self-hosted-browser-games" + }, + { + "name": "self-hosted-game-server" + }, + { + "name": "self-hosted-gitea" + }, + { + "name": "simplify-code" + }, + { + "name": "social-product-claim-verification" + }, + { + "name": "songsee" + }, + { + "name": "sovereign-local-workflow" + }, + { + "name": "spike" + }, + { + "name": "teams-meeting-pipeline" + }, + { + "name": "thoughtful-gift-selection" + }, + { + "name": "xlsx" + }, + { + "name": "youtube-content" + } + ], + "plugin": [ + { + "name": "omh" + } + ], + "memory": [ + { + "name": "MEMORY.md" + }, + { + "name": "MEMORY.md.lock" + }, + { + "name": "USER.md" + }, + { + "name": "USER.md.lock" + } + ], + "cron-fire": [ + { + "name": ".fire-0001b0e33c385b299a91fb40d74c2e96.lock" + }, + { + "name": ".fire-0323bab9d1845af1a1bef94aca43661d.lock" + }, + { + "name": ".fire-03688f7e3757593aa708831368f8733f.lock" + }, + { + "name": ".fire-03cfb0d44c7d59ec907b9236a52ff18b.lock" + }, + { + "name": ".fire-08a5bb4437a95210bddb5dc5a2e08fec.lock" + }, + { + "name": ".fire-0aff36533d4151a5ad0e509e157c7d30.lock" + }, + { + "name": ".fire-0de1333a52a756bc9df2dd0375c6c588.lock" + }, + { + "name": ".fire-0de533e75a835966adbaead5e84b3fe4.lock" + }, + { + "name": ".fire-0f58f30e7b175e6c946e5a117078851d.lock" + }, + { + "name": ".fire-0fc8c2f6c55b54eb8127f09d04159ab9.lock" + }, + { + "name": ".fire-122fee6381945eccbc03d2d043d0be14.lock" + }, + { + "name": ".fire-141b7f42a35c5b93baf6898fddda39ba.lock" + }, + { + "name": ".fire-1ae6398af06c5e34970a38fd3ba7e95a.lock" + }, + { + "name": ".fire-1b981fefcd2f5a50b2a077c3b07601ea.lock" + }, + { + "name": ".fire-1dd43b8d92ad566ab8903fa16b638c63.lock" + }, + { + "name": ".fire-23d58baf634d5ada8f1ad994525555cc.lock" + }, + { + "name": ".fire-23f37b65153951aeaf0b240eef4af2fa.lock" + }, + { + "name": ".fire-24d0d17dbc165bd4917303266124916c.lock" + }, + { + "name": ".fire-264bf20bb526572b8e263db4e946f445.lock" + }, + { + "name": ".fire-2856bd836ed85ab8a99af2dd04f70582.lock" + }, + { + "name": ".fire-2867328473e65be6807e41a90c81aaef.lock" + }, + { + "name": ".fire-2869a7d9e8ac5dc0a20cb7644af93c70.lock" + }, + { + "name": ".fire-288434d231dd5485894b5629c60a9675.lock" + }, + { + "name": ".fire-2988dfe9a34b5edcb7ad6af0bfa91a99.lock" + }, + { + "name": ".fire-29b22e49fd2159edb0497dbdf489462c.lock" + }, + { + "name": ".fire-2a0e16d1e5885c28a20620f0bb10ca84.lock" + }, + { + "name": ".fire-2a74e07afbf55a6aacdd78ddd723f6a5.lock" + }, + { + "name": ".fire-2c338fce371e55b7806e2aad230e2d40.lock" + }, + { + "name": ".fire-2e2937026fae5b4193514c4e588bd950.lock" + }, + { + "name": ".fire-2f2f2315ce9e5f1bb91259d9fff556d3.lock" + }, + { + "name": ".fire-32ca5ee452ec5ea38a7a1ca2b5f7873a.lock" + }, + { + "name": ".fire-34a471e14bbe57ee94a26b698b4fbfd6.lock" + }, + { + "name": ".fire-36b42e3d3f4858089e07dc000e834e99.lock" + }, + { + "name": ".fire-38ababfff0655620a0313a79c2b2deeb.lock" + }, + { + "name": ".fire-39440cb8d75753cbb2bd928d0d0d3789.lock" + }, + { + "name": ".fire-3a6f1598ed80544fb5ecb6c534f78a96.lock" + }, + { + "name": ".fire-3c822a110a065fa6897dfaee29ed9572.lock" + }, + { + "name": ".fire-3cec228f44e758f7b3b2d9e8ba09a899.lock" + }, + { + "name": ".fire-3d93d5434a825a64b7c8e0b9dc03d743.lock" + }, + { + "name": ".fire-3e501a2032cf577db6a59ce7c1d5d6fe.lock" + }, + { + "name": ".fire-3f27047716235dfea6e07a1d6cf7e9dd.lock" + }, + { + "name": ".fire-3fc9bd8c76055797a37e9187d5ad7c18.lock" + }, + { + "name": ".fire-466fd592644c58b5b013008ca3cff16f.lock" + }, + { + "name": ".fire-471506ee0f89583ca88551f59a477262.lock" + }, + { + "name": ".fire-4bdfd34b01e558b392cc3aa76ff3a9f2.lock" + }, + { + "name": ".fire-4e81cbdcbf6353c0bfbad46d6441160c.lock" + }, + { + "name": ".fire-55c36b5662af5f448824232ae1dff1fa.lock" + }, + { + "name": ".fire-56fd18bf7458568887f0bca1fddc84d1.lock" + }, + { + "name": ".fire-5797477d811e57b989593b61e2fd85a5.lock" + }, + { + "name": ".fire-579f9e07a76151fab647a0e4c3805875.lock" + }, + { + "name": ".fire-58f35a45e6435315a23dc154478591f3.lock" + }, + { + "name": ".fire-592a958fa7cf5be1a31af62f3c30552d.lock" + }, + { + "name": ".fire-5b9aac5000d958e68c0375a23cfab1d1.lock" + }, + { + "name": ".fire-5f275d23d55d5051ab0ccd06ea3e5b03.lock" + }, + { + "name": ".fire-64a9310df6a35bfc8647085a7b9a7670.lock" + }, + { + "name": ".fire-655f1472f6a4595e895c73c1534874d3.lock" + }, + { + "name": ".fire-65e180041f7c56569d785cbaea4ccc0c.lock" + }, + { + "name": ".fire-6800a940e7985f5596a75bc8d96d423d.lock" + }, + { + "name": ".fire-726e056a4b5857458e2921e2f2da24e1.lock" + }, + { + "name": ".fire-7343f24074cf506aac65565771510284.lock" + }, + { + "name": ".fire-7389adb7e4085994ab4123384317701e.lock" + }, + { + "name": ".fire-75bad1bd48075e1691d21e6b604d2e6c.lock" + }, + { + "name": ".fire-75eeed6d59e25659ad0a507c6359c520.lock" + }, + { + "name": ".fire-76a0ead635375fee93a2667ac73c7985.lock" + }, + { + "name": ".fire-7a68f6eefc7e59f9a122a3d40ad65eca.lock" + }, + { + "name": ".fire-7af262b44c1854cfa780975d3dc88908.lock" + }, + { + "name": ".fire-7b0bee7710775c5faca367abd98a7677.lock" + }, + { + "name": ".fire-7b5510507af75d7392f8c7d47d7ad565.lock" + }, + { + "name": ".fire-7bb27143bd6958568e63f07dd7a4bb09.lock" + }, + { + "name": ".fire-7e2ee6c057905e0dbae0221b1d8231fd.lock" + }, + { + "name": ".fire-8039e663eed259fa87a843f058b0d048.lock" + }, + { + "name": ".fire-856eb7422cb85246a974095574782be4.lock" + }, + { + "name": ".fire-8b59ba6fa1f45a4d81edfe0a21a28ef4.lock" + }, + { + "name": ".fire-96976abb4ec25bacb6579bed7a90fd7d.lock" + }, + { + "name": ".fire-98d85e3618e35ccb991005062781e109.lock" + }, + { + "name": ".fire-990b5e8295d4500e885fe2d65f4126f8.lock" + }, + { + "name": ".fire-9952a7c9bd635f9cabe4855534d69194.lock" + }, + { + "name": ".fire-99e9569d60485858b2ca8aea0e39527f.lock" + }, + { + "name": ".fire-9a2c59122ceb53cda096e7ebd96ed1d4.lock" + }, + { + "name": ".fire-9f338a204d09540e9dc23ac50fc4912b.lock" + }, + { + "name": ".fire-9fff3e4daa70553fbad7f44da65074c1.lock" + }, + { + "name": ".fire-a344cf26b8c35989ae86c6ce7f2b876e.lock" + }, + { + "name": ".fire-a4901810e7185eff8e74f84adc102e2f.lock" + }, + { + "name": ".fire-a631ed8762db5ef498503fbd64b468d6.lock" + }, + { + "name": ".fire-a63b27b8a71950529832b6e591f5dc01.lock" + }, + { + "name": ".fire-a8cb8759e1105f9e98ce8fc8b36f147b.lock" + }, + { + "name": ".fire-ab60c03313ff530fa17fec4e784db9cf.lock" + }, + { + "name": ".fire-ada8a651a8dd5e36a41f0b411d0af4cb.lock" + }, + { + "name": ".fire-aeae431e0a7f587b90246aae2e8629b8.lock" + }, + { + "name": ".fire-b12c3ebb20cb5aadbdce58afe0f2fa83.lock" + }, + { + "name": ".fire-b34abea4711a5b8c8141b4f0918594c6.lock" + }, + { + "name": ".fire-b5cf7d09f3855470a43be85f26696bd6.lock" + }, + { + "name": ".fire-b68af7975ad550de8c7e78a6a254579a.lock" + }, + { + "name": ".fire-bb45e09305d050f6bfc4acc4be0920d2.lock" + }, + { + "name": ".fire-bc1c7e23366156f39f8e0b7164994290.lock" + }, + { + "name": ".fire-bf825eda14165625b4fd3b8729932f65.lock" + }, + { + "name": ".fire-c65c048ed9195d25a80d1abcb5c868e3.lock" + }, + { + "name": ".fire-c8f276c93c41572c83c2703499f0450c.lock" + }, + { + "name": ".fire-cd26ae9efb125c2e9f29e3b362a10aba.lock" + }, + { + "name": ".fire-cd76ec02cb6a5fd693935659376568b3.lock" + }, + { + "name": ".fire-ce6cfaa26ad55db891adc428b1b893fe.lock" + }, + { + "name": ".fire-d4590ff193a45dcbba30cb36ec156093.lock" + }, + { + "name": ".fire-d5e2c718b0a356df8f159d5cc0d50778.lock" + }, + { + "name": ".fire-d715b896dd5e54dfb76741c725f762a1.lock" + }, + { + "name": ".fire-d7b8359b696859d8906ea8fe1589a9d7.lock" + }, + { + "name": ".fire-e578b406bf39533bab465e57665e2eeb.lock" + }, + { + "name": ".fire-e617106fa3f659e59706b01392e4a908.lock" + }, + { + "name": ".fire-e6c4ba068fc252139e4d97a2c50b097e.lock" + }, + { + "name": ".fire-e7cb97f558575065b670bfaff8d2c19e.lock" + }, + { + "name": ".fire-ee623bd7ceb65cedbeda6488f7450ec7.lock" + }, + { + "name": ".fire-f0ddfe4e02b65be2a0e9bfa2e4f6cb1f.lock" + }, + { + "name": ".fire-f13d5d04dd30529db698a05ad5b242cd.lock" + }, + { + "name": ".fire-f37ae47f970e5725ad0c6be3171917e1.lock" + }, + { + "name": ".fire-f4ce153e3b0a59acb1de02af7a30aac1.lock" + }, + { + "name": ".fire-fb1e7c2d220759ad96a7ce9e9fe48689.lock" + }, + { + "name": ".fire-fd62821d67c65c2ea337926a554d28e8.lock" + }, + { + "name": ".fire-fdeadb5a82135987950d474a61c321b2.lock" + } + ] + }, + "summary": { + "active-profile": 28, + "deleted-profile": 4, + "active-skill": 33, + "archived-skill": 62, + "plugin": 1, + "memory": 4, + "cron-fire": 117 + }, + "meta": { + "agent": "sol", + "lane": "triage", + "generated_at": "2026-11-01T21:57:29Z", + "source": "filesystem" + }, + "repo": { + "branch": "main", + "tracked_files": 4804, + "last_commit": "b515002 ledger: open-meteo weather extract (2026-11-01)" + } +} diff --git a/wizard-work/sol/fleet-classify-2026-11-01.md b/wizard-work/sol/fleet-classify-2026-11-01.md new file mode 100644 index 0000000..110c8e6 --- /dev/null +++ b/wizard-work/sol/fleet-classify-2026-11-01.md @@ -0,0 +1,303 @@ +# Fleet classification — sol triage lane + +Generated: 2026-11-01T21:57:29Z + +## Summary + +| Class | Count | +|---|---| +| active-profile | 28 | +| active-skill | 33 | +| archived-skill | 62 | +| cron-fire | 117 | +| deleted-profile | 4 | +| memory | 4 | +| plugin | 1 | + +## Repository + +| Field | Value | +|---|---| +| branch | main | +| tracked_files | 4804 | +| last_commit | b515002 ledger: open-meteo weather extract (2026-11-01) | + +## Evidence (per-class item counts) + +### active-profile + +| name | +|---| +| argus | +| beam | +| buzzpilot | +| courtney | +| forge | +| home | +| hou3 | +| inference-lab | +| julie | +| kendra | +| ledger | +| lilly | +| merlin | +| nightprowl | +| null | +| praetorian | +| quill | +| scribe | +| sentinel | +| sherry | +| sol | +| spark | +| spark-snippet-wizard | +| sphinx | +| timmy | +| vincent | +| volt | +| worker | +### active-skill + +| name | +|---| +| apple | +| autonomous-ai-agents | +| business | +| clinical | +| counseling | +| creative | +| creative-web-gallery | +| data-science | +| devops | +| education | +| email | +| github | +| hermes | +| hermes-desktop-plugins | +| hermes-themes | +| homestead-intake-and-procurement | +| media | +| mlops | +| note-taking | +| off-grid-homestead-build | +| ops-monitoring | +| productivity | +| psychosocial | +| research | +| roleplay | +| security | +| smart-home | +| social-media | +| software-development | +| timmy-turd-operations | +| web | +| workflow | +| yuanbao | +### archived-skill + +| name | +|---| +| airtable | +| apple-notes | +| apple-reminders | +| architecture-diagram | +| arxiv | +| baoyu-infographic | +| box | +| claude-code | +| codebase-inspection | +| collaborative-worldbuilding | +| collector-asset-resale | +| competitor-news-monitor | +| consensual-public-footprint-review | +| creative-web-freeform | +| design-md | +| document-to-action-items | +| dogfood | +| employer-facing-technical-portfolio | +| evidence-backed-site-reconnaissance | +| findmy | +| gif-search | +| gitea-epic-triage | +| gitea-selfhosted | +| github | +| google-workspace | +| hermes-desktop-headless | +| imessage | +| inspecting-hermes-desktop-dom | +| live-voice-avatar-loop | +| llm-wiki | +| manim-video | +| meeting-action-items | +| multi-candidate-career-operations | +| node-inspect-debugger | +| notion | +| obsidian | +| opencode | +| p5js | +| physical-systems-feasibility | +| powerpoint | +| private-staging-release-operations | +| privileged-browser-agent-review | +| product-price-monitor | +| public-exposure-audit | +| public-figure-image-production | +| python-debugpy | +| requesting-code-review | +| safety-critical-language-gates | +| satirical-songwriting | +| sdlc-review | +| self-hosted-browser-games | +| self-hosted-game-server | +| self-hosted-gitea | +| simplify-code | +| social-product-claim-verification | +| songsee | +| sovereign-local-workflow | +| spike | +| teams-meeting-pipeline | +| thoughtful-gift-selection | +| xlsx | +| youtube-content | +### cron-fire + +| name | +|---| +| .fire-0001b0e33c385b299a91fb40d74c2e96.lock | +| .fire-0323bab9d1845af1a1bef94aca43661d.lock | +| .fire-03688f7e3757593aa708831368f8733f.lock | +| .fire-03cfb0d44c7d59ec907b9236a52ff18b.lock | +| .fire-08a5bb4437a95210bddb5dc5a2e08fec.lock | +| .fire-0aff36533d4151a5ad0e509e157c7d30.lock | +| .fire-0de1333a52a756bc9df2dd0375c6c588.lock | +| .fire-0de533e75a835966adbaead5e84b3fe4.lock | +| .fire-0f58f30e7b175e6c946e5a117078851d.lock | +| .fire-0fc8c2f6c55b54eb8127f09d04159ab9.lock | +| .fire-122fee6381945eccbc03d2d043d0be14.lock | +| .fire-141b7f42a35c5b93baf6898fddda39ba.lock | +| .fire-1ae6398af06c5e34970a38fd3ba7e95a.lock | +| .fire-1b981fefcd2f5a50b2a077c3b07601ea.lock | +| .fire-1dd43b8d92ad566ab8903fa16b638c63.lock | +| .fire-23d58baf634d5ada8f1ad994525555cc.lock | +| .fire-23f37b65153951aeaf0b240eef4af2fa.lock | +| .fire-24d0d17dbc165bd4917303266124916c.lock | +| .fire-264bf20bb526572b8e263db4e946f445.lock | +| .fire-2856bd836ed85ab8a99af2dd04f70582.lock | +| .fire-2867328473e65be6807e41a90c81aaef.lock | +| .fire-2869a7d9e8ac5dc0a20cb7644af93c70.lock | +| .fire-288434d231dd5485894b5629c60a9675.lock | +| .fire-2988dfe9a34b5edcb7ad6af0bfa91a99.lock | +| .fire-29b22e49fd2159edb0497dbdf489462c.lock | +| .fire-2a0e16d1e5885c28a20620f0bb10ca84.lock | +| .fire-2a74e07afbf55a6aacdd78ddd723f6a5.lock | +| .fire-2c338fce371e55b7806e2aad230e2d40.lock | +| .fire-2e2937026fae5b4193514c4e588bd950.lock | +| .fire-2f2f2315ce9e5f1bb91259d9fff556d3.lock | +| .fire-32ca5ee452ec5ea38a7a1ca2b5f7873a.lock | +| .fire-34a471e14bbe57ee94a26b698b4fbfd6.lock | +| .fire-36b42e3d3f4858089e07dc000e834e99.lock | +| .fire-38ababfff0655620a0313a79c2b2deeb.lock | +| .fire-39440cb8d75753cbb2bd928d0d0d3789.lock | +| .fire-3a6f1598ed80544fb5ecb6c534f78a96.lock | +| .fire-3c822a110a065fa6897dfaee29ed9572.lock | +| .fire-3cec228f44e758f7b3b2d9e8ba09a899.lock | +| .fire-3d93d5434a825a64b7c8e0b9dc03d743.lock | +| .fire-3e501a2032cf577db6a59ce7c1d5d6fe.lock | +| .fire-3f27047716235dfea6e07a1d6cf7e9dd.lock | +| .fire-3fc9bd8c76055797a37e9187d5ad7c18.lock | +| .fire-466fd592644c58b5b013008ca3cff16f.lock | +| .fire-471506ee0f89583ca88551f59a477262.lock | +| .fire-4bdfd34b01e558b392cc3aa76ff3a9f2.lock | +| .fire-4e81cbdcbf6353c0bfbad46d6441160c.lock | +| .fire-55c36b5662af5f448824232ae1dff1fa.lock | +| .fire-56fd18bf7458568887f0bca1fddc84d1.lock | +| .fire-5797477d811e57b989593b61e2fd85a5.lock | +| .fire-579f9e07a76151fab647a0e4c3805875.lock | +| .fire-58f35a45e6435315a23dc154478591f3.lock | +| .fire-592a958fa7cf5be1a31af62f3c30552d.lock | +| .fire-5b9aac5000d958e68c0375a23cfab1d1.lock | +| .fire-5f275d23d55d5051ab0ccd06ea3e5b03.lock | +| .fire-64a9310df6a35bfc8647085a7b9a7670.lock | +| .fire-655f1472f6a4595e895c73c1534874d3.lock | +| .fire-65e180041f7c56569d785cbaea4ccc0c.lock | +| .fire-6800a940e7985f5596a75bc8d96d423d.lock | +| .fire-726e056a4b5857458e2921e2f2da24e1.lock | +| .fire-7343f24074cf506aac65565771510284.lock | +| .fire-7389adb7e4085994ab4123384317701e.lock | +| .fire-75bad1bd48075e1691d21e6b604d2e6c.lock | +| .fire-75eeed6d59e25659ad0a507c6359c520.lock | +| .fire-76a0ead635375fee93a2667ac73c7985.lock | +| .fire-7a68f6eefc7e59f9a122a3d40ad65eca.lock | +| .fire-7af262b44c1854cfa780975d3dc88908.lock | +| .fire-7b0bee7710775c5faca367abd98a7677.lock | +| .fire-7b5510507af75d7392f8c7d47d7ad565.lock | +| .fire-7bb27143bd6958568e63f07dd7a4bb09.lock | +| .fire-7e2ee6c057905e0dbae0221b1d8231fd.lock | +| .fire-8039e663eed259fa87a843f058b0d048.lock | +| .fire-856eb7422cb85246a974095574782be4.lock | +| .fire-8b59ba6fa1f45a4d81edfe0a21a28ef4.lock | +| .fire-96976abb4ec25bacb6579bed7a90fd7d.lock | +| .fire-98d85e3618e35ccb991005062781e109.lock | +| .fire-990b5e8295d4500e885fe2d65f4126f8.lock | +| .fire-9952a7c9bd635f9cabe4855534d69194.lock | +| .fire-99e9569d60485858b2ca8aea0e39527f.lock | +| .fire-9a2c59122ceb53cda096e7ebd96ed1d4.lock | +| .fire-9f338a204d09540e9dc23ac50fc4912b.lock | +| .fire-9fff3e4daa70553fbad7f44da65074c1.lock | +| .fire-a344cf26b8c35989ae86c6ce7f2b876e.lock | +| .fire-a4901810e7185eff8e74f84adc102e2f.lock | +| .fire-a631ed8762db5ef498503fbd64b468d6.lock | +| .fire-a63b27b8a71950529832b6e591f5dc01.lock | +| .fire-a8cb8759e1105f9e98ce8fc8b36f147b.lock | +| .fire-ab60c03313ff530fa17fec4e784db9cf.lock | +| .fire-ada8a651a8dd5e36a41f0b411d0af4cb.lock | +| .fire-aeae431e0a7f587b90246aae2e8629b8.lock | +| .fire-b12c3ebb20cb5aadbdce58afe0f2fa83.lock | +| .fire-b34abea4711a5b8c8141b4f0918594c6.lock | +| .fire-b5cf7d09f3855470a43be85f26696bd6.lock | +| .fire-b68af7975ad550de8c7e78a6a254579a.lock | +| .fire-bb45e09305d050f6bfc4acc4be0920d2.lock | +| .fire-bc1c7e23366156f39f8e0b7164994290.lock | +| .fire-bf825eda14165625b4fd3b8729932f65.lock | +| .fire-c65c048ed9195d25a80d1abcb5c868e3.lock | +| .fire-c8f276c93c41572c83c2703499f0450c.lock | +| .fire-cd26ae9efb125c2e9f29e3b362a10aba.lock | +| .fire-cd76ec02cb6a5fd693935659376568b3.lock | +| .fire-ce6cfaa26ad55db891adc428b1b893fe.lock | +| .fire-d4590ff193a45dcbba30cb36ec156093.lock | +| .fire-d5e2c718b0a356df8f159d5cc0d50778.lock | +| .fire-d715b896dd5e54dfb76741c725f762a1.lock | +| .fire-d7b8359b696859d8906ea8fe1589a9d7.lock | +| .fire-e578b406bf39533bab465e57665e2eeb.lock | +| .fire-e617106fa3f659e59706b01392e4a908.lock | +| .fire-e6c4ba068fc252139e4d97a2c50b097e.lock | +| .fire-e7cb97f558575065b670bfaff8d2c19e.lock | +| .fire-ee623bd7ceb65cedbeda6488f7450ec7.lock | +| .fire-f0ddfe4e02b65be2a0e9bfa2e4f6cb1f.lock | +| .fire-f13d5d04dd30529db698a05ad5b242cd.lock | +| .fire-f37ae47f970e5725ad0c6be3171917e1.lock | +| .fire-f4ce153e3b0a59acb1de02af7a30aac1.lock | +| .fire-fb1e7c2d220759ad96a7ce9e9fe48689.lock | +| .fire-fd62821d67c65c2ea337926a554d28e8.lock | +| .fire-fdeadb5a82135987950d474a61c321b2.lock | +### deleted-profile + +| name | +|---| +| q110demo | +| q110demo2 | +| q110demo3 | +| q110probe | +### memory + +| name | +|---| +| MEMORY.md | +| MEMORY.md.lock | +| USER.md | +| USER.md.lock | +### plugin + +| name | +|---| +| omh | diff --git a/wizard-work/sol/verify_fleet_classify.py b/wizard-work/sol/verify_fleet_classify.py new file mode 100644 index 0000000..42eace1 --- /dev/null +++ b/wizard-work/sol/verify_fleet_classify.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +"""CHECK — sol fleet-classification verdict (lite). + +Independently recomputes the seven *stable* fleet classes straight from the +live filesystem and diffs them against the generated artifact. The artifact +is the sol lane's classification of the Hermes runtime instance. + +Exit code 0 == CORRECT, 1 == WRONG. + +NOTE on git: the troupe repo's untracked/modified set is actively churned by a +background file-writer, so git-derived fields are intentionally NOT part of +this check. This check covers only the stable, reproducibly-censusable +classes: profiles, skills, plugins, memories, cron-fires. +""" +import glob +import json +import os +import sys + +HERMES = "/root/.hermes" +ARTIFACT = os.path.join(HERMES, "wizard-outputs", "sol", "fleet-classify-2026-11-01.json") + +STABLE_CLASSES = [ + "active-profile", "deleted-profile", "active-skill", + "archived-skill", "plugin", "memory", "cron-fire", +] + + +def recompute_fs(): + out = {c: [] for c in STABLE_CLASSES} + + profdir = os.path.join(HERMES, "profiles") + for n in os.listdir(profdir): + if not n.startswith(".deleted"): + out["active-profile"].append(n) + for n in os.listdir(os.path.join(profdir, ".deleted")): + out["deleted-profile"].append(n) + + skills_dir = os.path.join(HERMES, "skills") + for n in os.listdir(skills_dir): + if n.startswith("."): + continue + out["active-skill"].append(n) + for n in os.listdir(os.path.join(skills_dir, ".archive")): + out["archived-skill"].append(n) + + out["plugin"].extend(sorted(os.listdir(os.path.join(HERMES, "plugins")))) + out["memory"].extend(sorted(os.listdir(os.path.join(HERMES, "memories")))) + out["cron-fire"].extend( + sorted(os.path.basename(p) for p in glob.glob(os.path.join(HERMES, "cron", ".fire*"))) + ) + return out + + +def main(): + try: + with open(ARTIFACT) as f: + art = json.load(f) + except Exception as exc: + print("VERDICT: WRONG") + print(" artifact not valid JSON:", exc) + sys.exit(1) + + if not isinstance(art, dict) or "classes" not in art or "summary" not in art: + print("VERDICT: WRONG") + print(" artifact missing 'classes'/'summary'") + sys.exit(1) + + fs = recompute_fs() + errors = [] + + # list equality for every stable class + for c in STABLE_CLASSES: + art_list = sorted(it["name"] for it in art["classes"].get(c, []) if isinstance(it, dict)) + if art_list != sorted(fs[c]): + errors.append("class %r: artifact=%r fs=%r" % (c, art["classes"].get(c), fs[c])) + + # summary count cross-check + for c in STABLE_CLASSES: + if art["summary"].get(c) != len(fs[c]): + errors.append("summary %r: %r != expected %d" % (c, art["summary"].get(c), len(fs[c]))) + + if errors: + print("VERDICT: WRONG") + for e in errors: + print(" -", e) + sys.exit(1) + + print("VERDICT: CORRECT") + print(" active-profile=%d deleted-profile=%d active-skill=%d archived-skill=%d plugin=%d memory=%d cron-fire=%d" + % tuple(art["summary"][c] for c in STABLE_CLASSES)) + sys.exit(0) + + +if __name__ == "__main__": + main()