- 8-agent OpenClaw cluster (Manager, Tech-Lead, Secretary, Auditor, Optimizer, Study-Builder, NX-Expert, Webster) - Orchestration engine: orchestrate.py (sync delegation + handoffs) - Workflow engine: YAML-defined multi-step pipelines - Agent workspaces: SOUL.md, AGENTS.md, MEMORY.md per agent - Shared skills: delegate, orchestrate, atomizer-protocols - Capability registry (AGENTS_REGISTRY.json) - Cluster management: cluster.sh, systemd template - All secrets replaced with env var references
60 lines
1.7 KiB
Python
60 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
Backfill mass_kg in results.json for all DOE iterations.
|
|
Reads _temp_mass.txt (key=value format) and patches results.json.
|
|
"""
|
|
import json
|
|
from pathlib import Path
|
|
|
|
ITER_DIR = Path("/home/papa/atomizer/projects/hydrotech-beam/studies/01_doe_landscape/iterations")
|
|
|
|
fixed = 0
|
|
skipped = 0
|
|
errors = []
|
|
|
|
for iter_path in sorted(ITER_DIR.iterdir()):
|
|
if not iter_path.is_dir() or not iter_path.name.startswith("iter"):
|
|
continue
|
|
|
|
mass_file = iter_path / "_temp_mass.txt"
|
|
results_file = iter_path / "results.json"
|
|
|
|
if not mass_file.exists():
|
|
errors.append(f"{iter_path.name}: no _temp_mass.txt")
|
|
continue
|
|
if not results_file.exists():
|
|
errors.append(f"{iter_path.name}: no results.json")
|
|
continue
|
|
|
|
# Parse mass
|
|
content = mass_file.read_text().strip()
|
|
if '=' in content:
|
|
content = content.split('=', 1)[1]
|
|
try:
|
|
mass_kg = float(content)
|
|
except ValueError:
|
|
errors.append(f"{iter_path.name}: unparseable mass: {content!r}")
|
|
continue
|
|
|
|
# Patch results.json
|
|
with open(results_file) as f:
|
|
results = json.load(f)
|
|
|
|
old_mass = results.get("mass_kg")
|
|
results["mass_kg"] = mass_kg
|
|
|
|
with open(results_file, 'w') as f:
|
|
json.dump(results, f, indent=2)
|
|
|
|
status = "NaN→fixed" if (old_mass is None or old_mass != old_mass) else f"{old_mass}→{mass_kg}"
|
|
print(f" {iter_path.name}: mass_kg = {mass_kg:.4f} kg ({status})")
|
|
fixed += 1
|
|
|
|
print(f"\n✅ Backfilled {fixed} iterations")
|
|
if skipped:
|
|
print(f"⏭️ Skipped {skipped}")
|
|
if errors:
|
|
print(f"❌ Errors: {len(errors)}")
|
|
for e in errors:
|
|
print(f" {e}")
|