mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-07 02:51:50 +00:00
123 lines
4.2 KiB
Bash
Executable file
123 lines
4.2 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
KIT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
REPO_ROOT="$(cd "$KIT_DIR/../.." && pwd)"
|
|
ARTIFACT_DIR="$KIT_DIR/artifacts"
|
|
mkdir -p "$ARTIFACT_DIR"
|
|
|
|
TIMESTAMP="$(date +%Y-%m-%dT%H-%M-%S%z)"
|
|
REPORT_PATH="$ARTIFACT_DIR/broken-state-roundtrip-$TIMESTAMP.md"
|
|
LATEST_PATH="$ARTIFACT_DIR/latest-broken-state-roundtrip.md"
|
|
export HERMES_PROOF_PYTHON="$(command -v python)"
|
|
|
|
python - "$REPO_ROOT" "$REPORT_PATH" "$LATEST_PATH" <<'PY'
|
|
import os
|
|
import re
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
|
|
repo_root = Path(sys.argv[1])
|
|
report_path = Path(sys.argv[2])
|
|
latest_path = Path(sys.argv[3])
|
|
|
|
def strip_ansi(text: str) -> str:
|
|
return re.sub(r"\x1b\[[0-9;]*[A-Za-z]", "", text)
|
|
|
|
def doctor_section(hermes_home: Path, unset_minimax: bool) -> str:
|
|
env = os.environ.copy()
|
|
env["HERMES_HOME"] = str(hermes_home)
|
|
env["NO_COLOR"] = "1"
|
|
if unset_minimax:
|
|
env.pop("MINIMAX_API_KEY", None)
|
|
env.pop("MINIMAX_CN_API_KEY", None)
|
|
cmd = [os.environ.get("HERMES_PROOF_PYTHON", sys.executable), "-m", "hermes_cli.main", "doctor"]
|
|
proc = subprocess.run(
|
|
cmd,
|
|
cwd=repo_root,
|
|
env=env,
|
|
capture_output=True,
|
|
text=True,
|
|
check=True,
|
|
)
|
|
text = strip_ansi(proc.stdout)
|
|
lines = text.splitlines()
|
|
start = None
|
|
for idx, line in enumerate(lines):
|
|
if line.strip() == "◆ Delegation Readiness":
|
|
start = idx
|
|
break
|
|
if start is None:
|
|
raise SystemExit("Could not locate Delegation Readiness section in doctor output")
|
|
section_lines = []
|
|
for idx in range(start, len(lines)):
|
|
line = lines[idx].rstrip()
|
|
if idx > start and line.startswith("◆ "):
|
|
break
|
|
if line.strip():
|
|
section_lines.append(line)
|
|
return "\n".join(section_lines)
|
|
|
|
with tempfile.TemporaryDirectory(prefix="delegation-readiness-") as tmpdir:
|
|
hermes_home = Path(tmpdir)
|
|
broken_config = """delegation:\n provider: minimax\n model: MiniMax-M2.7\n"""
|
|
(hermes_home / "config.yaml").write_text(broken_config, encoding="utf-8")
|
|
|
|
blocked = doctor_section(hermes_home, unset_minimax=True)
|
|
|
|
(hermes_home / "config.yaml").write_text("{}\n", encoding="utf-8")
|
|
ready = doctor_section(hermes_home, unset_minimax=True)
|
|
|
|
report_time = datetime.now().astimezone().strftime("%Y-%m-%d %H:%M %Z")
|
|
relative_script = Path("starter-kits/delegation-readiness-doctor/scripts/prove-broken-state-roundtrip.sh")
|
|
report = f"""# Delegation Readiness Doctor — Broken-State Roundtrip
|
|
|
|
Generated: {report_time}
|
|
|
|
## Result
|
|
BROKEN_STATE_ROUNDTRIP_PROVED
|
|
|
|
## Broken state induced
|
|
- Temporary isolated `HERMES_HOME` was created under `mktemp`.
|
|
- `config.yaml` inside that isolated home was set to:
|
|
- `delegation.provider: minimax`
|
|
- `delegation.model: MiniMax-M2.7`
|
|
- `MINIMAX_API_KEY` and `MINIMAX_CN_API_KEY` were explicitly removed from the doctor subprocess environment so the readiness path had to fail on missing credentials instead of inheriting the real machine state.
|
|
|
|
## Before repair — doctor output
|
|
```text
|
|
{blocked}
|
|
```
|
|
|
|
## Canonical repair path
|
|
1. Clear the delegation override so subagents inherit the parent runtime.
|
|
2. Re-run `python -m hermes_cli.main doctor`.
|
|
3. Confirm `◆ Delegation Readiness` flips from blocked to ready before trusting delegated work.
|
|
|
|
## After repair — doctor output
|
|
```text
|
|
{ready}
|
|
```
|
|
|
|
## Proof notes
|
|
- The broken state was isolated to a temporary `HERMES_HOME`; the real `~/.hermes/config.yaml` was not modified.
|
|
- The ready state after repair was proved by replacing the isolated config with an empty config (`{{}}`), which removes the delegation override entirely.
|
|
- Script used: `{relative_script}`
|
|
|
|
## Honest next move
|
|
Run one real delegated task from the live ready environment and append that proof to the canonical packet.
|
|
"""
|
|
report_path.write_text(report, encoding="utf-8")
|
|
shutil.copyfile(report_path, latest_path)
|
|
print(report_path)
|
|
PY
|
|
|
|
chmod +x "$SCRIPT_DIR/prove-broken-state-roundtrip.sh"
|
|
printf 'Wrote report: %s\n' "$REPORT_PATH"
|
|
printf 'Latest report: %s\n' "$LATEST_PATH"
|
|
printf 'BROKEN_STATE_ROUNDTRIP_PROVED\n'
|