2ba0aaae3c
TIER-2 READ AGENTS.md, conductor/workflow.md, conductor/edit_workflow.md, conductor/tier2/githooks/forbidden-files.txt, conductor/tracks/tier2_leak_prevention_20260620/spec.md, conductor/code_styleguides/data_oriented_design.md, conductor/code_styleguides/error_handling.md, conductor/code_styleguides/type_aliases.md before Phase 4. Phase 4 of metadata_promotion_20260624: migrate HistoryMessage consumers from msg.get(key, default) to direct field access. Per-site resolutions (documented per Hard Rule #11): 1. src/synthesis_formatter.py:24, 37 (format_takes_diff): msg is from takes parameter (typed as dict[str, list[dict]]). Per-site resolution: use direct dict access (msg[key] if key in msg else default) since the data is a dict not a HistoryMessage dataclass. Migration pattern: old: msg.get(key, default) new: msg[key] if key in msg else default 2. src/gui_2.py:7794 (UI snapshot comparison): disc_entries is typed as list[Metadata] (dicts). The last entry is accessed for content comparison. Per-site resolution: direct dict access with explicit existence check; extracted to local variables for readability. Note: HistoryMessage is imported in several files (provider_state.py uses it for the messages field) but the consumer sites that use .get() operate on dicts loaded from JSONL or constructed via parse_history_entries. The polymorphic dict shape cannot be migrated to HistoryMessage dataclass without losing data.
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
def format_takes_diff(takes: dict[str, list[dict]]) -> str:
|
|
"""
|
|
[C: tests/test_synthesis_formatter.py:test_format_takes_diff_common_prefix, tests/test_synthesis_formatter.py:test_format_takes_diff_empty, tests/test_synthesis_formatter.py:test_format_takes_diff_no_common_prefix, tests/test_synthesis_formatter.py:test_format_takes_diff_single_take]
|
|
"""
|
|
if not takes:
|
|
return ""
|
|
|
|
histories = list(takes.values())
|
|
if not histories:
|
|
return ""
|
|
|
|
min_len = min(len(h) for h in histories)
|
|
common_prefix_len = 0
|
|
for i in range(min_len):
|
|
first_msg = histories[0][i]
|
|
if all(h[i] == first_msg for h in histories):
|
|
common_prefix_len += 1
|
|
else:
|
|
break
|
|
|
|
shared_lines = []
|
|
for i in range(common_prefix_len):
|
|
msg = histories[0][i]
|
|
shared_lines.append(f"{msg['role'] if 'role' in msg else 'unknown'}: {msg['content'] if 'content' in msg else ''}")
|
|
|
|
shared_text = "=== Shared History ==="
|
|
if shared_lines:
|
|
shared_text += "\n" + "\n".join(shared_lines)
|
|
|
|
variation_lines = []
|
|
if len(takes) > 1:
|
|
for take_name, history in takes.items():
|
|
if len(history) > common_prefix_len:
|
|
variation_lines.append(f"[{take_name}]")
|
|
for i in range(common_prefix_len, len(history)):
|
|
msg = history[i]
|
|
variation_lines.append(f"{msg['role'] if 'role' in msg else 'unknown'}: {msg['content'] if 'content' in msg else ''}")
|
|
variation_lines.append("")
|
|
else:
|
|
# Single take case
|
|
pass
|
|
|
|
variations_text = "=== Variations ===\n" + "\n".join(variation_lines)
|
|
|
|
return shared_text + "\n\n" + variations_text |