Here's my review of the changes.

---

### expert_build/summarize.py
VERDICT: CONCERN
CORRECTNESS: QUESTIONABLE
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: COVERED
INTEGRATION: WIRED
REASONING: Two issues:

1. **Dead code** (minor): `title_match` (line 98) and `title` (line 99) are computed but never used after the refactor. They were previously passed to the `entry` CLI subprocess call, which is now removed.

2. **Inconsistent URL filtering** (moderate): The `source:` fallback on lines 66-68 does NOT check whether the value is a URL before assigning it to `source_url`. A local path like `source: sources/doc.md` would be propagated as `source_url: sources/doc.md` in the output entry. Compare with `propose.py` lines 336-338, which correctly guard with `val.startswith(("http://", "https://"))`. These two code paths should behave consistently.

The main refactor (removing `subprocess` + `entry` CLI dependency in favor of direct file writes) is clean and correct. The `date.today()` path structure, frontmatter generation, and manifest tracking all work properly.

---

### expert_build/propose.py
VERDICT: PASS
CORRECTNESS: VALID
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: COVERED
INTEGRATION: WIRED
REASONING: The `source:` fallback (lines 335-338) correctly guards against local file paths with the `val.startswith(("http://", "https://"))` check. The `if not source_url` guard ensures `source_url:` takes precedence. Logic is sound and well-positioned within the existing frontmatter parsing loop.

---

### tests/test_propose.py
VERDICT: PASS
CORRECTNESS: VALID
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: COVERED
INTEGRATION: WIRED
REASONING: Three new tests cover the three important cases: (1) explicit `source_url:` works as before, (2) `source:` with a URL is used as `SOURCE_URL`, (3) `source:` with a local path is NOT used as `SOURCE_URL`. These directly validate the propose.py logic and match the implementation behavior. The test structure follows established patterns in the file.

---

### tests/test_summarize.py
VERDICT: CONCERN
CORRECTNESS: VALID
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: PARTIAL
INTEGRATION: WIRED
REASONING: Tests are well-structured. The `_find_entry` helper is a clean way to locate date-based output entries. Removal of `subprocess.run` mocking and `MagicMock` imports is correct since the production code no longer uses subprocess.

However, there is no test for the case where `source:` contains a local file path in the summarize flow. Given the inconsistency noted in `summarize.py`, a test like `test_source_key_local_path_not_promoted_to_source_url` (analogous to `test_source_key_local_path_not_used_as_url` in test_propose.py) would either catch the bug or document the intended behavior.

---

### Summary

The main refactor (removing the `entry` CLI subprocess dependency) is a solid improvement — it eliminates a fragile external dependency, simplifies error handling, and makes the code more testable. Tests were updated comprehensively to match.

The one real issue: **`summarize.py` line 68 should mirror `propose.py`'s URL check** to avoid promoting local file paths to `source_url:` in entry frontmatter.

---

### SELF_REVIEW
LIMITATIONS: Could not run tests to verify they pass (permission not granted). Relied on static analysis and the observation data for caller/integration checks. Did not see the `pipeline.py` caller context in full to verify args compatibility.

---

### FEATURE_REQUESTS
- Show unused-variable warnings from static analysis (pyflakes/ruff) alongside the diff to catch dead code like the orphaned `title` variable
- When two files have near-identical logic (like the frontmatter parsing in summarize.py and propose.py), flag the inconsistency automatically
