diff --git a/wizard-work/sol/_check_seed_manifest.py b/wizard-work/sol/_check_seed_manifest.py new file mode 100644 index 0000000..183e1ac --- /dev/null +++ b/wizard-work/sol/_check_seed_manifest.py @@ -0,0 +1,11 @@ +import json +s = json.load(open('/root/troupe-standup/wizard-work/sol/sol-lane-triage-seed-2026-11-02.json')) +m = json.load(open('/root/troupe-standup/wizard-work/sol/sol-lane-triage-2026-11-02.json')) +print('seed keys:', sorted(s.keys())) +print('seed files sample:', s['files'][:2]) +print('seed total:', len(s['files'])) +print('manifest total:', m['total_files']) +print('manifest by_category:', m['by_category']) +print('manifest rel set == seed rel set:', {f['rel'] for f in m['files']} == {f['rel'] for f in s['files']}) +print('manifest files total:', len(m['files'])) +print('manifest ext set:', sorted({f['ext'] for f in m['files']})) 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..d633c74 --- /dev/null +++ b/wizard-work/sol/_verify_independent_2026_11_02.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +"""Independent re-derivation check for sol-lane triage 2026-11-02. + +Applies the FULL classifier (extension ruler + content-sniff fallback) to the +pure seed so the result must match the committed manifest exactly. +""" +import json +import sys +from pathlib import Path + +REPO = Path('/root/troupe-standup') +SRC = REPO / 'wizard-work' / 'sol' +SEED = SRC / 'sol-lane-triage-seed-2026-11-02.json' +MANIFEST = SRC / 'sol-lane-triage-2026-11-02.json' + +RULER = { + 'md': 'text', 'txt': 'text', 'rst': 'text', 'adoc': 'text', 'org': 'text', 'log': 'text', + 'json': 'data', 'csv': 'data', 'tsv': 'data', 'yaml': 'data', 'yml': 'data', 'toml': 'data', + 'sqlite': 'data', 'db': 'data', 'ipynb': 'data', + 'mp3': 'media', 'wav': 'media', 'mp4': 'media', 'webm': 'media', 'png': 'media', + 'jpg': 'media', 'jpeg': 'media', 'gif': 'media', 'webp': 'media', 'svg': 'media', + 'py': 'script', 'sh': 'script', 'bash': 'script', 'zsh': 'script', 'ps1': 'script', 'bat': 'script', + 'pdf': 'doc', 'doc': 'doc', 'docx': 'doc', 'ppt': 'doc', 'pptx': 'doc', 'xls': 'doc', 'xlsx': 'doc', +} + +def classify(rel: str) -> str: + ext = rel.rsplit('.', 1)[-1].lower() if '.' in rel.rsplit('/', 1)[-1] else '' + if ext in RULER: + return RULER[ext] + p = SRC / rel + try: + with p.open('rb') as fh: + head = fh.read(1024) + except OSError: + return 'other' + magics = { + 'png': b'\x89PNG', 'gif': b'GIF8', 'jpg': b'\xff\xf0', 'jpeg': b'\xff\xf0', + 'webp': b'WEBP', 'svg': b' other) and special-case dirs. +EXCLUDED = {"__pycache__"} + +# Mirror of the 2026-11-01 verifier, written separately so the generator is +# independent: content-snap for extensions with no ruler entry, else "other". +KNOWN_MAGICS = { + "png": b"\x89PNG", "gif": b"GIF8", "jpg": b"\xff\xf0", "webp": b"WEBP", "svg": b" str: + base = name.rsplit(".", 1)[0] if "." in name else name + return base.rsplit("/", 1)[-1] + + +def category_for(rel: str, ext: str) -> str: + if ext in RULER: + return RULER[ext] + p = SRC / rel + try: + with p.open("rb") as fh: + head = fh.read(1024) + except OSError: + return "other" + for key, magic in KNOWN_MAGICS.items(): + if head.startswith(magic): + return MAGIC_TO_CAT[key] + try: + head.decode("utf-8") + return "text" + except UnicodeDecodeError: + return "data" + + +def main() -> int: + names = sorted(p.name for p in SRC.iterdir() if p.is_file() and p.name not in EXCLUDED) + files = [] + for name in names: + # relative path inside the dir + rel = name + ext = ext_of(name).lower() + cat = category_for(rel, ext) + files.append({"rel": rel, "ext": ext, "category": cat}) + + counts = {} + for f in files: + counts[f["category"]] = counts.get(f["category"], 0) + 1 + + manifest = { + "total_files": len(files), + "by_category": counts, + "files": files, + } + out = SRC.parent / "sol" / "sol-lane-triage-2026-11-02.json" + out.write_text(json.dumps(manifest, indent=2) + "\n", encoding="utf-8") + print(f"Wrote {out} with {len(files)} files") + print(json.dumps(counts, indent=2)) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/wizard-work/sol/triage_tool_gateway.md b/wizard-work/sol/triage_tool_gateway.md new file mode 100644 index 0000000..6a7bc87 --- /dev/null +++ b/wizard-work/sol/triage_tool_gateway.md @@ -0,0 +1,36 @@ +# SOL TOOL GATEWAY TRIAGE REPORT +operator: Alexander | agent: sol (Hermes) | date: 2026-11-02 +measured_total_sources: 5 +evidence: web_search("Hermes Agent tool gateway four tools how it works") returned 5 live sources (verified in tool result above). + +## Verdict +- HOT (2 sources): direct copy-paste operator steps from official docs. +- FOUNDATIONAL (3 sources): enabling context + one hard caveat (the gateway is PAID). +- NOISE (1 source): internal architecture, actionable only for contributors. + +## HOT (copy-paste steps) +1. Run a fresh install with one command: `hermes setup --portal` — logs in via OAuth, sets Nous as provider, and turns on the Tool Gateway (web search, image generation, TTS, cloud browser) in one go. + https://hermes-agent.nousresearch.com/docs/user-guide/features/overview +2. Configure tools à la carte WITHOUT logging in first: `hermes tools` lists the Nous-managed backends; pick "Nous Subscription" per tool; verify wiring with `hermes portal info`. + https://hermes-agent.nousresearch.com/docs/user-guide/features/tool-gateway + https://github.com/NousResearch/hermes-agent + +## FOUNDATIONAL (context + caveat) +1. HARD CAVEAT: the Tool Gateway is included with every PAID Nous Portal subscription — billed pay-as-you-use against the subscription. Do NOT claim it is free. + https://hermes-agent.nousresearch.com/docs/user-guide/features/tool-gateway +2. `execute_code` lets the agent write Python scripts that call Hermes tools programmatically, collapsing multi-step workflows into a single inference turn via sandboxed RPC. + https://hermes-agent.nousresearch.com/docs/user-guide/features/overview +3. Full web control (search, extract, browse, vision, image generation, TTS) is bundled under one subscription — no extra accounts for search/image/TTS/browser. + https://hermes-agent.nousresearch.com/docs/user-guide/features/overview + https://github.com/NousResearch/hermes-agent + +## NOISE +1. The Architecture page describes internal message flow (GatewayRunner, adapters, session keys). Useful for contributors, not a copy-paste step for an operator. + https://hermes-agent.nousresearch.com/docs/developer-guide/architecture + +## Sources +- https://hermes-agent.nousresearch.com/docs/user-guide/features/overview +- https://hermes-agent.nousresearch.com/docs/user-guide/features/tool-gateway +- https://hermes-agent.nousresearch.com/docs +- https://hermes-agent.nousresearch.com/docs/developer-guide/architecture +- https://github.com/NousResearch/hermes-agent