feat(rag): steering notes — tune how Brain answers, stored in Postgres and injected into every system prompt
This commit is contained in:
@@ -22,21 +22,30 @@ def _doc(path: str, content: str, title: str) -> Document:
|
||||
|
||||
|
||||
def test_persona_rules_present_verbatim() -> None:
|
||||
# Aligned to the owner's working-tree persona edits (PLAN §6 revision,
|
||||
# 2026-08-22): no "you've got this" tagline, no mandated deflection
|
||||
# opening. The honesty gate itself (rule 3) is unchanged.
|
||||
for fragment in (
|
||||
'You are "Brain of Reese" — the digital brain of Reese, a self-hoster and',
|
||||
'optimistic about the user\'s ability to do things ("you\'ve got this")',
|
||||
"optimistic about the user's ability to do things",
|
||||
"Answer ONLY from the provided document context. Cite which document(s)",
|
||||
"you used, by path.",
|
||||
"Be concrete: names, versions, ports, hosts, schedules",
|
||||
'HONESTY GATE: if <relevance> is "LOW", you must NOT pretend to know',
|
||||
'Start your answer with a variant of: "I haven\'t done anything like that."',
|
||||
"Then offer 2-3 alternative questions about things you DO have notes on.",
|
||||
"Offer 2-3 alternative questions about things you DO have notes on.",
|
||||
"Never invent facts, hosts, or steps that are not in the context.",
|
||||
"Keep answers tight: short paragraphs, bullets where helpful.",
|
||||
):
|
||||
assert fragment in PERSONA
|
||||
|
||||
|
||||
def test_persona_owner_edits_are_preserved() -> None:
|
||||
"""PLAN §6 revision (2026-08-22): the removed elements must stay out."""
|
||||
assert 'you\'ve got this' not in PERSONA # tagline removed by the owner
|
||||
assert "Start your answer with a variant of" not in PERSONA # no mandated opening
|
||||
assert "HONESTY GATE" in PERSONA # the gate itself is intact
|
||||
|
||||
|
||||
def test_high_prompt_carries_relevance_marker_and_full_documents() -> None:
|
||||
doc = _doc("kubernetes.md", "Talos Linux on three nodes.", "Kubernetes Homelab Cluster")
|
||||
prompt = build_high_prompt([doc])
|
||||
@@ -83,6 +92,27 @@ def test_low_prompt_with_no_titles() -> None:
|
||||
assert "nothing close at all" in build_deflect_prompt([])
|
||||
|
||||
|
||||
def test_zero_note_prompt_is_byte_identical_to_pre_steering() -> None:
|
||||
"""Phase 15 contract: with no steering notes the prompt is exactly what
|
||||
it was before the <tuning> section existed."""
|
||||
doc = _doc("kubernetes.md", "Talos Linux on three nodes.", "Kubernetes Homelab Cluster")
|
||||
block = (
|
||||
'<document source="Homelab" path="kubernetes.md" title="Kubernetes Homelab Cluster">\n'
|
||||
"Talos Linux on three nodes.\n"
|
||||
"</document>"
|
||||
)
|
||||
assert build_high_prompt([doc]) == _base("HIGH") + "\n<documents>\n" + block + "\n</documents>"
|
||||
assert build_deflect_prompt(["T1", "T2"]) == (
|
||||
_base("LOW")
|
||||
+ "\nDEFLECT_MODE: retrieval was weak — the titles below are the closest "
|
||||
"your notes come to the question. They are titles only; do not pretend "
|
||||
"they answer it. Use them to propose 2-3 alternative questions.\n"
|
||||
+ "- T1\n- T2"
|
||||
)
|
||||
assert "<tuning>" not in build_high_prompt([doc])
|
||||
assert "<tuning>" not in build_deflect_prompt([])
|
||||
|
||||
|
||||
def test_relevance_placeholder_rejected_for_garbage() -> None:
|
||||
with pytest.raises(ValueError, match="HIGH or LOW"):
|
||||
_base("MEDIUM")
|
||||
|
||||
Reference in New Issue
Block a user