The pane now renders the LITERAL mood word + relationship directive Worldtree context-injects into the agent — adopted from Worldtree's canon, not invented: - canonMood(pad) mirrors Worldtree describe_pad (valence×arousal grid, ±0.3 bands); for sindra's PAD the canonical render is "neutral" — an invented octant vocab would have said "faintly excited" and MISLED. Adopting canonical is the point. - canonDirective(rel) mirrors render_d2_canonical byte-exact: "...warmth is clear warm regard; ability trust is strong; ...; speak with direct warmth; ..." — the exact stance instruction the agent receives (which makes the WAD "stranger" relation_context read even more incoherent, as flagged to worldtree-dev). - Both VERIFIED byte-exact against Worldtree's OWN renderer on the live snapshot. - Canon vendored (docs/vendor/worldtree-persona-canon/) + drift-pinned in .corviduo-canonicals.toml (canonical_drift green); flat browser form (static/persona_render_canon.json) regenerated by scripts/build_persona_canon.py via Worldtree's authoritative loader. Reference-impl posture: adopt canonical. - Fail-open (canon absent -> lines omit); INV-004 esc() preserved. JS syntax clean. Refresh + drive turns to see the canonical NL under mood + each relation.
50 lines
2.5 KiB
Python
50 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Regenerate src/ratatoskr/web/static/persona_render_canon.json from the vendored
|
|
Worldtree d2 render canons (docs/vendor/worldtree-persona-canon/).
|
|
|
|
The web persona pane renders the CANONICAL affect->NL (mood word + relationship
|
|
directive) BYTE-EXACT to what Worldtree injects into the agent's context. That render
|
|
needs the relation canon parsed into per-band phrase maps; this script reparses the
|
|
vendored raw canons into the flat form the browser JS consumes.
|
|
|
|
Uses Worldtree's OWN loader (core.persona.stance_render.load_canon) as the authoritative
|
|
parser, so the flat form can never drift from Worldtree's parsing semantics. Requires
|
|
Worldtree's venv (pydantic etc.).
|
|
|
|
Run when scripts/canonical_drift.py flags a canon bump:
|
|
PYTHONPATH=~/development/Worldtree ~/development/Worldtree/.venv/bin/python \
|
|
scripts/build_persona_canon.py
|
|
"""
|
|
import json
|
|
from pathlib import Path
|
|
|
|
from core.persona.stance_render import load_canon # Worldtree (authoritative parser)
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
VENDOR = ROOT / "docs" / "vendor" / "worldtree-persona-canon"
|
|
OUT = ROOT / "src" / "ratatoskr" / "web" / "static" / "persona_render_canon.json"
|
|
|
|
canon = load_canon(str(VENDOR / "d2-render-canon-v1.json"))
|
|
mood = json.loads((VENDOR / "d2-mood-render-canon-v1.json").read_text())
|
|
out = {
|
|
"_source": "vendored from Worldtree core/persona/canon/{d2-mood-render-canon-v1,d2-render-canon-v1}.json",
|
|
"_generated_by": "scripts/build_persona_canon.py (regen on canonical_drift flag)",
|
|
"_render_path": "deterministic, no LLM; mirrors Worldtree describe_pad + render_d2_canonical byte-exact",
|
|
"mood_grid": mood["describe_pad"]["valence_arousal_grid"],
|
|
"relation": {
|
|
"trust_cuts": [list(c) for c in canon.trust_cuts],
|
|
"warmth_cuts": [list(c) for c in canon.warmth_cuts],
|
|
"agency_cuts": [list(c) for c in canon.agency_cuts],
|
|
"warmth_phrase": canon.warmth_phrase, "warmth_beh": canon.warmth_beh,
|
|
"agency_phrase": canon.agency_phrase, "agency_beh": canon.agency_beh,
|
|
"history": canon.history,
|
|
"prefix": "Use this graded relationship state: toward target, warmth is ",
|
|
"tbeh": {"low_trust": "verify important claims before relying on them",
|
|
"cold_warmth": "protect boundaries while staying useful",
|
|
"default": "work from ordinary good faith"},
|
|
"cold_warmth_bands": ["distant", "cold", "hostile"], "high_conf_floor": 0.55,
|
|
},
|
|
}
|
|
OUT.write_text(json.dumps(out, indent=1) + "\n")
|
|
print(f"wrote {OUT.relative_to(ROOT)}")
|