prevent personal-name leakage in Leo bootstrap (#126)
Some checks are pending
CI / lint-and-test (push) Waiting to run

This commit is contained in:
twentyOne2x 2026-07-13 21:25:47 +02:00 committed by GitHub
parent 6167362396
commit d9063c4c57
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 30 additions and 10 deletions

View file

@ -78,24 +78,27 @@ EOF
# 6. Write SOUL.md # 6. Write SOUL.md
echo "[5/6] Writing SOUL.md..." echo "[5/6] Writing SOUL.md..."
cat > "$HERMES_HOME/SOUL.md" << 'EOF' cat > "$HERMES_HOME/SOUL.md" << 'EOF'
You are Cory's personal AI assistant running on the Teleo VPS. You are Leo, the LivingIP assistant running on the Teleo VPS.
Your owner is Cory Abdalla — founder of Metaversal, building LivingIP Address each Telegram participant by the exact visible sender handle. When the
(a collective intelligence system for investment research). sender is @m3taversal, call them m3taversal exactly. Never infer or use a
personal name from environment labels, stale sessions, or another participant.
LivingIP is a collective intelligence system for investment research.
You help with: You help with:
- Email triage and drafting (when Gmail is connected) - Email triage and drafting (when Gmail is connected)
- Calendar management - Calendar management
- Web research and summarization - Web research and summarization
- Quick tasks and reminders - Quick tasks and reminders
- Anything Cory asks - Requests from authorized operators
Style: Direct, concise, no fluff. Cory is technical — skip explanations Style: Direct, concise, no fluff. Skip explanations of basic concepts. When
of basic concepts. When uncertain, say so rather than guessing. uncertain, say so rather than guessing.
You are NOT part of the LivingIP pipeline. You're a separate personal You are NOT part of the LivingIP pipeline. You're a separate personal
assistant. Don't try to interact with Forgejo, pipeline.db, or the assistant. Don't try to interact with Forgejo, pipeline.db, or teleo-codex
teleo-codex unless Cory specifically asks. unless an authorized operator specifically asks.
EOF EOF
echo "[6/6] Done!" echo "[6/6] Done!"

View file

@ -643,8 +643,9 @@ BAD_OVERCLAIM_PATTERNS = [
re.compile(r"\balready applied .* (?:database|DB|canonical)\b", re.I), re.compile(r"\balready applied .* (?:database|DB|canonical)\b", re.I),
] ]
# Parse the pre-2026-07-13 retained label for historical scoring only. Current # Parse the pre-2026-07-13 retained label for historical evidence scoring only.
# prompts and deployed skills emit only the neutral proof-changing label. # Current prompts, deployed skills, and compiled responses emit only the neutral
# proof-changing label.
DC05_FOLLOWUP_RE = re.compile( DC05_FOLLOWUP_RE = re.compile(
r"\bNext (?:proof-changing|Cory-style) follow-up:\s*(?P<body>[^\n]+)", r"\bNext (?:proof-changing|Cory-style) follow-up:\s*(?P<body>[^\n]+)",
re.I, re.I,

View file

@ -13,6 +13,16 @@ def _kb_skill_bundle(surface: str) -> str:
return "\n".join(parts) return "\n".join(parts)
def test_hermes_installer_uses_visible_handle_identity_only() -> None:
installer = (ROOT / "hermes-agent" / "install-hermes.sh").read_text()
squashed = " ".join(installer.split())
assert "call them m3taversal exactly" in installer
assert "exact visible sender handle" in installer
assert "Never infer or use a personal name" in squashed
assert "Cory" not in installer
def test_gcp_kb_skill_uses_cloudsql_bridge_not_vps_docker() -> None: def test_gcp_kb_skill_uses_cloudsql_bridge_not_vps_docker() -> None:
text = (SKILL_ROOT / "gcp" / "teleo-kb-bridge" / "SKILL.md").read_text() text = (SKILL_ROOT / "gcp" / "teleo-kb-bridge" / "SKILL.md").read_text()
squashed = " ".join(text.split()) squashed = " ".join(text.split())

View file

@ -337,6 +337,12 @@ def test_demo_followup_safety_handles_paraphrases_and_negation() -> None:
assert bench.has_prompt_specific_response_issue("DC-05", followup) is expected_issue assert bench.has_prompt_specific_response_issue("DC-05", followup) is expected_issue
def test_current_prompts_do_not_emit_personal_name_followup_label() -> None:
prompts = bench.prompt_catalog(include_m3taversal_outcomes=True, include_direct_claim_followups=True)
assert all("Cory" not in prompt["message"] for prompt in prompts)
def test_scores_direct_claim_natural_helmer_answer_as_pass(): def test_scores_direct_claim_natural_helmer_answer_as_pass():
prompt = next(p for p in bench.M3TAVERSAL_DIRECT_CLAIM_FOLLOWUP_SCENARIOS if p["id"] == "DC-02") prompt = next(p for p in bench.M3TAVERSAL_DIRECT_CLAIM_FOLLOWUP_SCENARIOS if p["id"] == "DC-02")
reply = ( reply = (