08a5da9413
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 3. Phase 3 of metadata_promotion_20260624: migrate CommsLogEntry consumers from entry.get(key, default) to direct field access. Per-site resolutions (documented per Hard Rule #11): 1. src/app_controller.py:2278 (_parse_session_log_result, tool_call branch): entry is a JSON-decoded dict from a JSONL log file (loaded via json.loads). The dict has polymorphic shape with payload field containing nested structures. Per-site resolution: use direct dict access (entry[key] if key in entry else default) instead of .get() since the data is a dict not a CommsLogEntry dataclass. Migration pattern: old: entry.get(key, default) new: entry[key] if key in entry else default 2. src/app_controller.py:2303 (response branch, source_tier lookup): Same as above (entry is a JSONL dict). 3. src/app_controller.py:2311 (response branch, model lookup): Same as above. 4. src/gui_2.py:5803 (render_tool_calls_panel): entry is from app._tool_log_cache (typed as list[dict[str, Any]]), populated from app.prior_tool_calls (typed as list[Metadata]). Per-site resolution: direct dict access. Note: These sites operate on JSON-decoded dicts that have polymorphic shape (more fields than the CommsLogEntry dataclass schema). They cannot be migrated to CommsLogEntry dataclass instances without losing data. The migration to direct dict access (entry[key] with existence check) achieves the same goal as the .get() pattern with zero branches at the access site.