# RetrieX Patch 43C - Generic Reference Anchor Extractor

## Goal

Continue the p43 reduction work with a small, low-risk PHP cleanup:

- move follow-up reference anchor extraction out of `AgentRunner`
- keep the behavior generic (`product_model` + `measurement_value`) instead of Testomat/hardness-specific naming
- remove legacy fallback accessors for `testomat_model_pattern` and `hardness_value_pattern`
- keep the current configured regex values unchanged

## Changed files

- `src/Agent/ReferenceAnchorExtractor.php` added
- `src/Agent/AgentRunner.php` delegates reference anchor extraction to the new extractor
- `src/Config/AgentRunnerConfig.php` now requires the generic keys directly:
  - `follow_up_context.reference_anchor.product_model_pattern`
  - `follow_up_context.reference_anchor.measurement_value_pattern`

## Not changed

- no YAML values changed
- no ranking logic changed
- no prompt rules changed
- no shop search scoring changed
- no new hardcoded product or phrase lists in PHP
- no admin UI

## Expected effect

Runtime behavior should remain the same. The patch only reduces responsibility inside `AgentRunner` and removes old Testomat/hardness-specific compatibility naming now that the generic YAML keys are already present and p43A2 is green.

## Required checks after applying

```bash
bin/console mto:agent:config:validate
bin/console mto:agent:regression:test
bin/console mto:agent:config:audit-source --details
bin/console mto:agent:config:audit-patterns --details
```

## Local checks performed while building this patch

```bash
php -l src/Agent/ReferenceAnchorExtractor.php
php -l src/Agent/AgentRunner.php
php -l src/Config/AgentRunnerConfig.php
php -l src/Commerce/ProductRoleResolver.php
php -l src/Commerce/ShopSearchService.php
php -l src/Agent/PromptBuilder.php
```

YAML parse check for all files in `config/retriex/*.yaml` also passed.
