sol: fleet classification of Hermes runtime (7 stable classes)

This commit is contained in:
sol committed 2026-11-01 21:57:59 +00:00
1 parent b5150026ca
commit 4e853b25c7
4 files changed
+1319

No files matched your search

+135
View File
@@ -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()
@@ -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)"
}
}
@@ -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 |
+96
View File
@@ -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()