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:
2026-08-01 16:49:48 +02:00
parent 63075eaca9
commit 06f0e7e651
25 changed files with 1453 additions and 22 deletions
+38
View File
@@ -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)