# Phase 167.1: Contradiction Runtime Surface And Proof Lane - Context

**Gathered:** 2026-04-13
**Status:** Ready for planning

<domain>
## Phase Boundary

This phase takes the richer contradiction-row contract from Phase `167` and
makes it visible across the runtime/read-path surfaces humans and agents
actually consume. It also leaves one bounded contradiction-aware intake proof
lane for the milestone. It does not reopen the underlying contradiction-row
derivation contract unless a narrow compatibility fix is required.

</domain>

<decisions>
## Implementation Decisions

### Runtime/read-path parity
- **D-01:** Keep `contradiction_candidates` as the public intake field name for
  this milestone. Phase `167.1` should improve the rendered contradiction
  surface, not rename the whole runtime contract.
- **D-02:** Runtime/read-path surfaces should render the richer contradiction
  basis explicitly, not just `detail + source ids`. At minimum, contradiction
  sections should expose comparison basis plus side-specific summaries in
  human-readable form.
- **D-03:** The contradiction surface must stay aligned across:
  - `research_question.contract.md`
  - `topic_dashboard.md`
  - `runtime_protocol.generated.md`
  - `intake/.../vault/wiki/source-intake.md`

### Proof boundary
- **D-04:** Leave one bounded contradiction-aware proof lane that exercises a
  fresh isolated topic intake path and proves the contradiction surface
  survives through the runtime read path. A dedicated acceptance script is
  preferred over silently overloading unrelated acceptance coverage.
- **D-05:** The proof lane should reuse the existing assumption/depth fixture
  style rather than inventing a new provider or heavy external dependency.

### Scope safety
- **D-06:** Do not widen into scientific adjudication or queue-level
  automation. This phase is about contradiction visibility and proof, not about
  deciding which source is correct.
- **D-07:** Keep the existing assumption/depth acceptance lane working; the new
  proof lane augments rather than replaces it.

### the agent's Discretion
- exact rendered wording for contradiction sections on each surface
- whether the new proof lane reuses helpers from
  `run_l1_assumption_depth_acceptance.py` directly or factors them into shared
  helper functions first
- whether to update README/runbook docs in this phase if a dedicated proof
  script is added

</decisions>

<canonical_refs>
## Canonical References

### Milestone scope and requirement routing
- `.planning/ROADMAP.md` — Phase `167.1` goal and dependency on Phase `167`
- `.planning/REQUIREMENTS.md` — `REQ-L1CON-03` and `REQ-VERIFY-01`
- `.planning/phases/167-l1-contradiction-intake-rows-and-comparison-basis/167-01-SUMMARY.md`
  — confirms the richer contradiction-row contract now exists

### Current runtime/read-path surfaces
- `research/knowledge-hub/knowledge_hub/runtime_read_path_support.py`
- `research/knowledge-hub/knowledge_hub/l1_vault_support.py`
- `research/knowledge-hub/knowledge_hub/l1_source_intake_support.py`
- `research/knowledge-hub/runtime/scripts/run_l1_assumption_depth_acceptance.py`

### Current tests and proof surfaces
- `research/knowledge-hub/tests/test_aitp_service.py`
- `research/knowledge-hub/tests/test_runtime_scripts.py`
- `research/knowledge-hub/tests/test_schema_contracts.py`

</canonical_refs>

<code_context>
## Existing Code Insights

### Reusable Assets
- `append_l1_source_intake_markdown(...)` in `runtime_read_path_support.py`
  already renders contradiction sections on runtime-facing notes.
- `_render_source_intake_markdown(...)` in `l1_vault_support.py` already
  renders assumptions, regimes, reading depth, and method specificity on the
  source-intake wiki page, but currently omits contradiction rows.
- `run_l1_assumption_depth_acceptance.py` already seeds a two-source
  contradiction case and verifies contradiction sections exist, so it is the
  natural upstream fixture source for a dedicated contradiction-surface proof.

### Established Patterns
- Runtime/read-path parity phases in this repo usually keep one shared payload
  and update multiple surfaces plus targeted tests in one slice.
- Dedicated bounded acceptance scripts are the normal way to close
  `REQ-VERIFY-01` style milestone proof requirements.

### Integration Points
- `research/knowledge-hub/knowledge_hub/runtime_read_path_support.py`
- `research/knowledge-hub/knowledge_hub/l1_vault_support.py`
- `research/knowledge-hub/runtime/scripts/run_l1_assumption_depth_acceptance.py`
- `research/knowledge-hub/tests/test_aitp_service.py`
- `research/knowledge-hub/tests/test_runtime_scripts.py`

</code_context>

<specifics>
## Specific Ideas

- Preferred contradiction rendering style: one compact summary line plus one
  indented explanation line naming the basis and compared summaries.
- Preferred proof shape: a dedicated `run_l1_contradiction_surface_acceptance.py`
  script that reuses the current two-source weak-vs-strong-coupling fixture and
  asserts the richer contradiction wording on all required surfaces.

</specifics>

<deferred>
## Deferred Ideas

- automatic contradiction adjudication checkpoints or route mutation
- contradiction clustering across many sources
- broad renaming away from `contradiction_candidates` in this milestone

</deferred>

---

*Phase: 167.1-contradiction-runtime-surface-and-proof-lane*
*Context gathered: 2026-04-13*
