Implement Meeting Context V1 and extraction improvements
Introduce Meeting Context V1 with YAML schema, validation and template. Support optional --meeting-context during chunk extraction. Inject authoritative Meeting Context into extraction prompts. Record Meeting Context provenance in extraction output. Activate todos.md in shared prompt assembly. Strengthen responsibility attribution and decision/todo boundaries. Add focused Gold scenarios and validation tests. Update architecture and pipeline documentation.
This commit is contained in:
@@ -5,12 +5,15 @@ from pathlib import Path
|
||||
|
||||
from src.meeting_lab.extraction.extract_chunks import (
|
||||
EXTRACTION_CATEGORIES,
|
||||
EXTRACTION_TASK_PROMPT_NAMES,
|
||||
build_prompt,
|
||||
extraction_path_for_chunk,
|
||||
normalize_current_schema,
|
||||
parse_json_response,
|
||||
)
|
||||
from src.meeting_lab.models.meeting_context import load_meeting_context
|
||||
from src.meeting_lab.protocol.build_protocol import build_protocol
|
||||
from scripts import run_gold_test
|
||||
|
||||
|
||||
class ExtractionProtocolTests(unittest.TestCase):
|
||||
@@ -102,6 +105,41 @@ Final answer:
|
||||
self.assertIn("Extract each decision as one atomic commitment.", prompt)
|
||||
self.assertIn("Anna: Agreed.", prompt)
|
||||
|
||||
def test_build_prompt_includes_todo_prompt_file(self) -> None:
|
||||
prompt = build_prompt("transcript.txt", "Nina: I will update it.")
|
||||
|
||||
self.assertEqual(EXTRACTION_TASK_PROMPT_NAMES, ("decisions.md", "todos.md"))
|
||||
self.assertIn("Action-item responsibility rule:", prompt)
|
||||
self.assertIn(
|
||||
"A named responsible person may be extracted only when the transcript contains",
|
||||
prompt,
|
||||
)
|
||||
|
||||
def test_gold_runner_uses_shared_production_prompt_assembly(self) -> None:
|
||||
self.assertIs(run_gold_test.build_prompt, build_prompt)
|
||||
|
||||
def test_no_context_and_meeting_context_prompts_use_same_task_prompt_set(self) -> None:
|
||||
context = load_meeting_context(
|
||||
Path("samples/real_live/project_process_meeting/meeting_context.yaml")
|
||||
)
|
||||
|
||||
no_context_prompt = build_prompt("chunk_01_normalized.txt", "Anna: Agreed.")
|
||||
context_prompt = build_prompt(
|
||||
"chunk_01_normalized.txt",
|
||||
"Anna: Agreed.",
|
||||
meeting_context=context,
|
||||
)
|
||||
|
||||
for prompt in (no_context_prompt, context_prompt):
|
||||
self.assertIn("You extract decisions from meeting transcript text.", prompt)
|
||||
self.assertIn("Action-item responsibility rule:", prompt)
|
||||
|
||||
def test_prompt_assembly_is_deterministic(self) -> None:
|
||||
first = build_prompt("transcript.txt", "Nina: I will update it.")
|
||||
second = build_prompt("transcript.txt", "Nina: I will update it.")
|
||||
|
||||
self.assertEqual(first, second)
|
||||
|
||||
def test_build_protocol_groups_extraction_items(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as directory:
|
||||
input_dir = Path(directory)
|
||||
|
||||
Reference in New Issue
Block a user