Compact interpretation storage metadata without summarizing evidence
This commit is contained in:
1 parent
82238ed213
commit
2fb81ef4af
11 files changed
+331
-20
No files matched your search
@@ -81,7 +81,7 @@ class Model:
|
||||
document["resolutions"][0]["candidate_id"] = "K9999"
|
||||
else:
|
||||
document = payload()
|
||||
if version in {"case_interpretation_resolved_v3", "case_interpretation_resolved_v4", "case_interpretation_resolved_v5"}:
|
||||
if version in {"case_interpretation_resolved_v3", "case_interpretation_resolved_v4", "case_interpretation_resolved_v5", "case_interpretation_resolved_v6"}:
|
||||
document.update(described_behavior=[],provisional_behavior_gap=None)
|
||||
data = json.loads(request["messages"][1]["content"])["input"]
|
||||
selected = [(k,v) for k,v in data["sources"].items() if v["kind"] == "entity" and v["case_pointer"].startswith("/entity_resolution/")]
|
||||
@@ -95,7 +95,7 @@ class Model:
|
||||
if self.omit_resolved:
|
||||
self.omit_resolved -= 1
|
||||
document["relevant_entities"] = payload()["relevant_entities"]
|
||||
if version in {'case_interpretation_resolved_v4','case_interpretation_resolved_v5'}:
|
||||
if version in {'case_interpretation_resolved_v4','case_interpretation_resolved_v5','case_interpretation_resolved_v6'}:
|
||||
from viano_bug_analysis.analysis.quality import unnamed_entity_reasons
|
||||
reasons = unnamed_entity_reasons(data)
|
||||
for entity in document['relevant_entities']:
|
||||
@@ -132,7 +132,7 @@ def test_resolves_unrecorded_subject_preserves_case_and_portable_replay(built_ca
|
||||
model = Model(); service = service_for(store)
|
||||
result = run(store, model, service)
|
||||
assert result.status == "COMPLETED" and PackageValidator().validate(result.package).valid
|
||||
assert [r["prompt_version"] for r in model.requests] == ["entity_resolution_plan_v3","entity_resolution_assessment_v3","case_interpretation_resolved_v5"]
|
||||
assert [r["prompt_version"] for r in model.requests] == ["entity_resolution_plan_v3","entity_resolution_assessment_v3","case_interpretation_resolved_v6"]
|
||||
assert len(service.database.calls) == 1
|
||||
assert service.database.calls[0]["filters"] == [{"column":"name","operator":"contains","value":"switch"}]
|
||||
with PackageReader(result.package) as reader:
|
||||
@@ -247,7 +247,7 @@ def test_search_cannot_be_grounded_in_a_capture_filename(built_case):
|
||||
def test_empty_plan_still_supports_descriptive_quality_contract(built_case):
|
||||
store=built_case[0];model=Model(plan={'searches':[]});service=service_for(store)
|
||||
assert run(store,model,service).status=='COMPLETED'
|
||||
assert model.requests[-1]['prompt_version']=='case_interpretation_resolved_v5' and not service.database.calls
|
||||
assert model.requests[-1]['prompt_version']=='case_interpretation_resolved_v6' and not service.database.calls
|
||||
|
||||
|
||||
def test_trial_phase_stop_includes_resolution_and_is_idempotent(built_case):
|
||||
@@ -403,7 +403,7 @@ def test_third_assessment_can_use_lower_reasoning_without_resetting_history(buil
|
||||
assert len(service.database.calls) == 1
|
||||
assert model.efforts == [('entity_resolution_plan_v3','medium'),
|
||||
('entity_resolution_assessment_v3','medium'),('entity_resolution_assessment_v3','medium'),
|
||||
('entity_resolution_assessment_v3','low'),('case_interpretation_resolved_v5','medium')]
|
||||
('entity_resolution_assessment_v3','low'),('case_interpretation_resolved_v6','medium')]
|
||||
with PackageReader(result.package) as reader:
|
||||
saved = json.loads(reader.read_bytes('analysis/interpretations/0001/entity-resolution/assessment.json'))
|
||||
assert saved['payload']['attempt'] == 3
|
||||
@@ -411,7 +411,7 @@ def test_third_assessment_can_use_lower_reasoning_without_resetting_history(buil
|
||||
assert len(model.efforts) == 5
|
||||
|
||||
|
||||
@pytest.mark.parametrize("version", [3,4])
|
||||
@pytest.mark.parametrize("version", [3,4,5])
|
||||
def test_completed_interpretation_keeps_its_historical_contract(built_case, version):
|
||||
from viano_bug_analysis.analysis.entity_resolution import EntityResolver
|
||||
store=built_case[0]
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
import copy
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
from viano_bug_analysis.analysis.model_context import compact_context
|
||||
from viano_bug_analysis.analysis.prompt import InterpretationPromptBuilder
|
||||
from test_interpretation_quality import fixture
|
||||
|
||||
|
||||
def test_compaction_preserves_evidence_and_keeps_identifier_domains_distinct():
|
||||
path = 'original/' + 'a'*64 + '/report.json'
|
||||
origin = {'source_ref':path,'author':'Tester','observed_at':'2026-10-08T13:00:00Z',
|
||||
'snapshot_id':'backup:'+'d'*64,'time_scope':'snapshot_not_current_production'}
|
||||
context={'sources':{
|
||||
'O0001':{'kind':'observation','data':{'text':'No creatures despite goggles.', 'provenance':origin}},
|
||||
'C0001':{'kind':'tester_comment','data':{'text':'Horde works.', 'provenance':copy.deepcopy(origin)}},
|
||||
'F0001':{'kind':'fact','data':{'value':{'query':{'filters':[{'column':'entry','value':23487}]},
|
||||
'result':{'truncated':True,'coverage':'filtered_rows','next_offset':8,'items':[{'row':{
|
||||
'entry':23487,'path':path,'sha256':'e'*64,'name':'Wild Wolpertinger'}}]},'origin':origin}}},
|
||||
'X0001':{'kind':'unread_reference','data':{'path':path,'sha256':'a'*64,'size':100}},
|
||||
'X0002':{'kind':'unread_reference','data':{'path':'original/'+'b'*64+'/report.json','sha256':'b'*64,'size':200}}}}
|
||||
before=copy.deepcopy(context)
|
||||
result=compact_context(context)
|
||||
assert context==before
|
||||
assert set(result['sources'])==set(context['sources'])
|
||||
for sid in context['sources']: assert result['sources'][sid]['kind']==context['sources'][sid]['kind']
|
||||
assert result['sources']['O0001']['data']['text']==context['sources']['O0001']['data']['text']
|
||||
assert result['sources']['C0001']['data']['text']=='Horde works.'
|
||||
assert result['sources']['F0001']['data']['value']['result']==context['sources']['F0001']['data']['value']['result']
|
||||
assert result['sources']['F0001']['data']['value']['query']==context['sources']['F0001']['data']['value']['query']
|
||||
assert result['sources']['X0001']['data']['path']!=result['sources']['X0002']['data']['path']
|
||||
metadata=result['shared_metadata'][result['sources']['O0001']['data']['provenance']['metadata_ref']]
|
||||
assert metadata['author']=='Tester' and metadata['observed_at']==origin['observed_at']
|
||||
assert metadata['time_scope']==origin['time_scope']
|
||||
assert metadata['source_ref']==result['sources']['X0001']['data']['path']
|
||||
assert result==compact_context(before)
|
||||
|
||||
|
||||
def test_compact_prompt_keeps_all_readable_sources_and_previous_version_is_unchanged():
|
||||
context=fixture()['context']
|
||||
context['sources']['D0098']={'kind':'data_quality','case_pointer':'/interpretation_quality/names',
|
||||
'data':{'name_binding_policy':'typed_name_bindings_v1'}}
|
||||
builder=InterpretationPromptBuilder()
|
||||
previous=builder.build(context)
|
||||
before=copy.deepcopy(context)
|
||||
assert previous['prompt_version']=='case_interpretation_resolved_v5'
|
||||
context['sources']['D0099']={'kind':'data_quality','case_pointer':'/interpretation_quality/model_context',
|
||||
'data':{'model_context_policy':'compact_storage_v1'}}
|
||||
new=builder.build(context)
|
||||
projected=json.loads(new['messages'][1]['content'])['input']
|
||||
assert new['prompt_version']=='case_interpretation_resolved_v6'
|
||||
assert set(projected['sources'])==set(context['sources'])
|
||||
assert len(new['messages'][1]['content'])<len(previous['messages'][1]['content'])*0.8
|
||||
for sid,source in context['sources'].items():
|
||||
if source['kind'] in {'observation','report','tester_comment','tester_assumption','expectation'}:
|
||||
for key in ('text','title','summary'):
|
||||
assert projected['sources'][sid]['data'].get(key)==source['data'].get(key)
|
||||
assert builder.build(before)==previous
|
||||
assert before==json.loads(previous['messages'][1]['content'])['input']
|
||||
|
||||
|
||||
def test_meaningful_long_source_paths_and_human_text_are_not_shortened():
|
||||
path='src/very_long_but_meaningful_namespace/subsystem/another_component/visibility_handler.cpp'
|
||||
text='a'*100
|
||||
context={'sources':{'O0001':{'kind':'observation','data':{'text':text}},
|
||||
'X0001':{'kind':'unread_reference','data':{'path':path}}}}
|
||||
assert compact_context(context)==context
|
||||
@@ -93,7 +93,7 @@ def test_real_contextual_identity_resolution_with_fixture_llm(service, tmp_path)
|
||||
assert any(e['id']=='23486' for e in entities.values())
|
||||
resolved=next(k for k,e in entities.items() if e['id']=='23487')
|
||||
doc=missing_payload()
|
||||
if request["prompt_version"]in {"case_interpretation_resolved_v3","case_interpretation_resolved_v4","case_interpretation_resolved_v5"}:
|
||||
if request["prompt_version"]in {"case_interpretation_resolved_v3","case_interpretation_resolved_v4","case_interpretation_resolved_v5","case_interpretation_resolved_v6"}:
|
||||
doc.update(described_behavior=[{'text':'The quest describes catching wild creatures using a net while intoxicated or wearing goggles.',
|
||||
'source_ids':[self.mention],'basis':'local_description','verification':'not_independently_verified'}],
|
||||
provisional_behavior_gap={'text':'The tester does not see these creatures despite wearing goggles.',
|
||||
|
||||
Reference in new issue
Block a user