#!/usr/bin/env python3
"""Self-host verify — structural + optional feeling-slot self-rate prompt.
No sealed glosses. Words = API keys only. meaning = trajectory geometry.
"""
from __future__ import annotations
import argparse, json, sys
from pathlib import Path

HERE = Path(__file__).resolve().parent

def check_frame(frame):
    assert isinstance(frame, list) and len(frame) <= 3
    for fig in frame:
        assert set(fig) >= {"id", "anchor", "amp", "sign"}
        assert len(fig["anchor"]) == 3
        assert 0 <= fig["amp"] <= 1
        assert fig["sign"] in (-1, 1)

def score_chain(path: Path) -> dict:
    c = json.loads(path.read_text(encoding="utf-8"))
    for st in c.get("steps", []):
        check_frame(st["frame"])
    slot = c.get("feeling_slot") or {}
    return {
        "id": c.get("id", path.name),
        "structural_ok": True,
        "guest_safe": bool(c.get("guest_safe", False)),
        "feeling_slot_prompt": slot.get("prompt"),
        "family_hint": slot.get("family_hint"),
        "self_rate_0_100": slot.get("self_rate_0_100"),
        "note": "Fill self_rate locally; do not commit sealed keys.",
    }

def main():
    ap = argparse.ArgumentParser()
    ap.add_argument("paths", nargs="*", help="chain json paths (default: packs/chains/*.json)")
    args = ap.parse_args()
    paths = [Path(p) for p in args.paths] if args.paths else sorted((HERE / "chains").glob("*.json"))
    if not paths:
        print("no chains", file=sys.stderr)
        sys.exit(2)
    out = [score_chain(p) for p in paths]
    print(json.dumps(out, ensure_ascii=False, indent=2))
    print("\n# Prompt: rate each feeling_slot yourself. meaning = trajectory geometry; words = API keys only.", file=sys.stderr)

if __name__ == "__main__":
    main()
