Here is my review of the parallel exploration and issue scanning changes.

### ftl_project_expert/llm.py:invoke_concurrent
VERDICT: PASS
CORRECTNESS: VALID
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: UNTESTED
INTEGRATION: WIRED
REASONING: Implements a clean concurrency pool with `asyncio.Semaphore(max_concurrent)` and handles individual prompt exceptions elegantly using `asyncio.gather(..., return_exceptions=True)`. Calling `invoke_concurrent_sync` via `asyncio.run` is standard for CLI-wrapped code where an event loop is not already running.
---

### ftl_project_expert/cli.py:_cache_issues
VERDICT: CONCERN
CORRECTNESS: QUESTIONABLE
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: UNTESTED
INTEGRATION: WIRED
REASONING: Correctly preserves previous cached items by loading the existing file before updating it, fixing a critical bug where subsequent pages would overwrite the cache. However, if `issues-cache.json` exists but is empty (0 bytes) or contains malformed JSON, `json.load(f)` will raise a `json.JSONDecodeError` and crash the execution of the `scan` and `update` commands.
*Recommendation:* Wrap `json.load(f)` in a `try...except json.JSONDecodeError` block to fall back to `data = {}`.
---

### ftl_project_expert/cli.py:_scan_page
VERDICT: PASS
CORRECTNESS: VALID
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: UNTESTED
INTEGRATION: WIRED
REASONING: Correctly implements the `--per-issue` bypass logic, enqueuing fetched issues as individual explore topics and returning early to prevent unnecessary LLM prompt builds and invocation.
*Note:* The inline import `from .topics import Topic, add_topics` on line 359 is redundant as they are already imported at the module level on line 17.
---

### ftl_project_expert/cli.py:_explore_loop_parallel
VERDICT: PASS
CORRECTNESS: VALID
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: UNTESTED
INTEGRATION: WIRED
REASONING: Accurately batches enqueued topics and invokes the LLM concurrently via `invoke_concurrent_sync`. The resulting entries are safely created and enqueued sequentially in the main thread, which avoids any file write or lock contention on `topics.json` and the `entries/` directory.
*Note:* If an LLM call fails, the topic is still left as `"done"` in the queue (since it was popped prior to invocation), meaning it will not be automatically retried. This is consistent with the synchronous `_run_topic` behavior in the existing codebase.
---

### ftl_project_expert/cli.py:propose_beliefs
VERDICT: PASS
CORRECTNESS: VALID
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: UNTESTED
INTEGRATION: WIRED
REASONING: Smoothly integrates the `--parallel` option and leverages `invoke_concurrent_sync` to batch process proposal extraction. Correctly handles individual batch errors and cleanly falls back to sequential loop calling when concurrent mode is not requested or unnecessary.
---

### ftl_project_expert/cli.py:review_proposals
VERDICT: PASS
CORRECTNESS: VALID
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: UNTESTED
INTEGRATION: WIRED
REASONING: Parallelizes filtering of proposal batches with a fully backward-compatible sequential fallback. Keeps state mutations (writing file replacements and terminal logging) strictly sequential, preventing race conditions or corrupted output in the proposals markdown file.
---

### ftl_project_expert/cli.py:update
VERDICT: PASS
CORRECTNESS: VALID
SPEC_COMPLIANCE: N/A
ISSUE_COMPLIANCE: N/A
BELIEF_COMPLIANCE: N/A
TEST_COVERAGE: UNTESTED
INTEGRATION: WIRED
REASONING: Successfully exposes the `--parallel` option in the pipeline interface and forwards it to all pipeline sub-steps. Since Click's `ctx.invoke` automatically merges parameter default values for omitted options, invoking sub-commands while passing only `--parallel` is safe.
---

### SELF_REVIEW
LIMITATIONS: 
- There are no tests in the codebase, preventing validation of the changes against an automated test suite.
- The external `entry` CLI tool's behavior and concurrency handling were not reviewable. However, since entry creation is serialized in the main loop after concurrent LLM invocations, file collisions are inherently avoided.
---

### FEATURE_REQUESTS
- Provide test framework configuration or dummy test structures to allow verifying concurrency logic under unit and integration tests.
- Integrate automated lint and type check commands (such as `ruff` or `mypy`) to flag redundant imports and type consistency automatically before the review.
---
