prevent personal-name leakage in Leo bootstrap (#126)
Some checks are pending
CI / lint-and-test (push) Waiting to run
Some checks are pending
CI / lint-and-test (push) Waiting to run
This commit is contained in:
parent
6167362396
commit
d9063c4c57
4 changed files with 30 additions and 10 deletions
|
|
@ -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!"
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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 = (
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue