"""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