"""Rule (c): the first real prompt fuzzy-matched to one note's text."""
from __future__ import annotations
from typing import TYPE_CHECKING
from python_pkg.token_audit import notes_backlog, notes_link, notes_scan
from python_pkg.token_audit.tests import test_notes_fixtures as fx
if TYPE_CHECKING:
from pathlib import Path
def _notes(tmp_path: Path) -> list[notes_backlog.Note]:
return notes_backlog.parse_backlog(fx.backlog(tmp_path / "B.md").read_text())
def _link(tmp_path: Path, *texts: str) -> notes_link.Link | None:
root = tmp_path / "projects"
fx.transcript(root, "s1", [fx.prompt(t) for t in texts])
return notes_link.link_all(notes_scan.scan_root(root), _notes(tmp_path)).get("s1")
def test_pasted_note_body_links(tmp_path: Path) -> None:
pasted = f'\n{fx.BODY_B}\n\nplease'
assert _link(tmp_path, pasted) == notes_link.Link((fx.NOTE_B,), "c")
def test_title_only_prompt_links_by_first_line(tmp_path: Path) -> None:
link = _link(tmp_path, "diet guard meal times picker")
assert link == notes_link.Link((fx.NOTE_A,), "c")
def test_unrelated_prompt_does_not_link(tmp_path: Path) -> None:
assert _link(tmp_path, "restart the steam backlog enforcer while game runs") is None
def test_only_first_prompt_is_matched(tmp_path: Path) -> None:
assert _link(tmp_path, "unrelated opening words here now", fx.BODY_A) is None
def test_short_prompt_is_never_matched(tmp_path: Path) -> None:
assert _link(tmp_path, "horror game") is None
def test_wrappers_and_caveats_are_skipped(tmp_path: Path) -> None:
link = _link(
tmp_path,
"/clear",
"Caveat: the messages below were generated by the user",
f"noise{fx.BODY_A}",
)
assert link == notes_link.Link((fx.NOTE_A,), "c")
def test_list_content_prompt_is_read(tmp_path: Path) -> None:
root = tmp_path / "projects"
record = fx.prompt("")
record["message"]["content"] = [{"type": "text", "text": fx.BODY_B}]
fx.transcript(root, "s1", [record])
links = notes_link.link_all(notes_scan.scan_root(root), _notes(tmp_path))
assert links["s1"].notes == (fx.NOTE_B,)
def test_score_is_symmetric_dice_or_title() -> None:
note = notes_backlog.Note("n", "alpha beta gamma delta", "x", "low", "todo", None)
assert notes_link.score("alpha beta gamma delta", note) == 1.0
assert notes_link.score("zeta eta theta iota", note) == 0.0