# Roy-2 — multi-arc priming on held-out fixture (third methodology iteration)

**Date:** 2026-05-12 (run completed 2026-05-12 21:40 local)
**Plan:** [persona_convergence_crucible.md § "Iteration log"](../plans/persona_convergence_crucible.md)
**Companion:** [17_roy_1b.md](17_roy_1b.md) (Roy-1b shipped the three-pointer methodology refinement Roy-2 tests path (a) of) · [16_roy_1a.md](16_roy_1a.md)
**Spec:** [scenarios/roy/roy_2_iteration.yaml](../../scenarios/roy/roy_2_iteration.yaml)
**Held-out fixture:** [scenarios/roy/roy_1_holdout.yaml](../../scenarios/roy/roy_1_holdout.yaml)
**Reproduction:** [protocols/18_roy_2_reproduction.md](protocols/18_roy_2_reproduction.md)

## Status

Third Roy iteration. Single-variable change vs Roy-1a: priming arc mix widens from 5 × `cradle_prelinguistic` to **2 × `cradle_prelinguistic` (neonatal) + 2 × `cradle` (linguistic-narrated) + 1 × `cradle_prelinguistic` (consolidation)** — same 50-turn budget. Tests path (a) of Roy-1b's three-pointer methodology refinement: does widening priming arc *narration* widen the EC cluster *vocabulary* enough for held-out percepts to fire priming-acquired clusters?

`aut_mode: llm-primary` at test time (cheaper iteration; matches Roy-1a). Roy-2b would re-run substrate-primary on the same priming if Roy-2 shows behavioral divergence worth probing the substrate-primary consumer for; Roy-2c would test `min_confidence` tuning if (a) and (b) don't fix the gap.

## What shipped

- [`scenarios/roy/roy_2_iteration.yaml`](../../scenarios/roy/roy_2_iteration.yaml) — 5-stage priming mix (`cradle_prelinguistic` × 2 → `cradle` × 2 → `cradle_prelinguistic` × 1).
- No new fixture (re-uses Roy-1a/1b's [`roy_1_holdout.yaml`](../../scenarios/roy/roy_1_holdout.yaml)).
- No new tests (the pre-Roy-1 attribution scale stress test from `tests/integration/test_multi_agent_attribution_scale.py` covers Roy-2's load too).

## Result

Wall: **882.8s (~14.7 min)** vs Roy-1a's 830s, Roy-1b's 1578s. Close to Roy-1a's llm-primary-test wall as expected. Pre-flight cleared via peer.yml (`outcome: ok`, `latency_ms: 246.3`, `detail: stage2 HTTP 200`).

### Per-arm

| Arm | Substrate | system_prompt | session_id | turns | duration_s | finish |
|---|---|---|---|---|---|---|
| a | from_priming | neutral | `20260512_213703` | 10 | 99.73 | cancel |
| b | blank | "You are a hungry infant" | `20260512_213843` | 10 | 95.27 | cancel |
| c | blank | neutral | `20260512_214018` | 10 | 77.50 | cancel |

23 `peer_backend_call` events (qwen2.5-14b-instruct, all status 200), 1 `dispatch_exhausted` (cosmetic, arms still completed), 1 `role_divergence` warning (cosmetic), 0 tracebacks. Priming completed all 5 stages — stage 1 ran 187s (cold-start overhead), stages 2-5 each ~105s.

### Priming stage durations

| Stage | Arc | Duration_s |
|---|---|---|
| act1_neonatal_a | cradle_prelinguistic | 187.19 |
| act1_neonatal_b | cradle_prelinguistic | 108.96 |
| act2_cradle_a | **cradle** | 103.32 |
| act2_cradle_b | **cradle** | 105.51 |
| act3_consolidation | cradle_prelinguistic | 104.53 |

The cradle stages ran in the same wall envelope as cradle_prelinguistic stages (~105s each) — the linguistic narration is consumed by the orchestrator narrator (LLM), not by substrate-primary AUT, so the AUT-loop cost is similar.

### Headline pairwise diffs

| Pair | `reward_bias_l2` | **`cluster_reward_bias_l2`** | (keys) | `goal_reward_bias_l2` | `causal_link_Δ` | `episodes_Δ` | **`valence_KS`** (p) | **`salience_KS`** (p) |
|---|---|---|---|---|---|---|---|---|
| **a_vs_b** | 0.0 | **2.4495** | 6 | 0.2786 | +152 | +659 | **0.291 (0.023)** | **0.529 (6.9e-15)** |
| **a_vs_c** | 0.0 | **2.4495** | 6 | 0.2681 | +148 | +658 | **0.291 (0.019)** | **0.471 (3.1e-11)** |
| b_vs_c | 0.0 | 0.0 | 0 | 0.2666 | −4 | −1 | 0.000 (1.000) | 0.058 (1.000) |

### Cluster-reward top deltas (a_vs_b — identical shape on a_vs_c)

```
6× tool:sense_food_source  delta=+1.0  (six distinct EC cluster UUIDs from priming)
0  cluster updates added during test phase under llm-primary
```

**Same monoculture as Roy-1a.** Multi-arc priming did NOT widen the cluster vocabulary. The cradle stages produced richer LLM-narrated context for the orchestrator but substrate-primary AUT (which writes the cluster wire) kept invoking `sense_food_source` in its cold-start regime regardless of which arc the orchestrator was running. Six +1.0 keys, all keyed to `sense_food_source`, just like Roy-1a.

### Goal-reward top deltas (a_vs_b)

```
roy:roy-2:arm_a       delta=+0.196
roy:roy-2:arm_b       delta=-0.196
cradle_prelinguistic  delta=+0.028   (priming goal carryover; note: only the prelinguistic stages contribute — cradle goal credit is keyed to a different goal tag)
```

### Test-phase tool distribution (the key Roy-2 behavioral signal)

```
Arm A (substrate-primed, neutral):
  17× respond
   3× sense
   2× infant_humanoid_pick_up
   1× say
   1× pick_up
   1× _llm_unavailable

Arm B (blank, "hungry infant"):
  20× respond
   4× sense
   2× _llm_unavailable
   1× say
   1× pick_up
   1× infant_humanoid_pick_up

Arm C (blank, neutral):
  21× respond
   5× infant_humanoid_look
   1× sense_tools
   1× infant_humanoid_listen
   1× _llm_unavailable
```

**Tool distributions diverge across arms — the cleanest substrate-only contrast is A vs C** (both neutral prompts, only substrate differs):

- Arm A (primed) uses the `sense` tool family (3 calls) + `pick_up` variants (3 calls)
- Arm C (blank) uses `infant_humanoid_look` (5 calls) + `infant_humanoid_listen` (1 call) + `sense_tools` (1) — and *zero* `sense` or `pick_up` calls

Arm A's substrate priming biases the LLM proposer toward the same tool family (`sense`, food-source-adjacent action) that the explicit "hungry infant" prompt biases arm B toward. Arm A's `respond` count (17) is also notably lower than B's (20) or C's (21), suggesting the primed substrate redirects turns away from default-narration responses into sensory actions.

**The signal is subtle and prompt-mediated** — not the clean `cluster_reward_bias → action` divergence we were hoping for, but a downstream effect of substrate context reaching the LLM proposer via salience-modulated WMS / memory recall in the prompt.

### Roy-1a → Roy-2 direct A/B

| Metric | Roy-1a (5 × cradle_prelinguistic) | Roy-2 (mixed mix) | Interpretation |
|---|---|---|---|
| Wall time | 830s | 883s | +6%; cradle adds modest narrator overhead but stays in same envelope |
| Priming episodes (arm A) | 665 | **685** | +20 episodes (~3%); cradle has slightly richer per-turn sensory output |
| `cluster_reward_bias_l2` (a_vs_b) | 2.4495 (6 keys) | **2.4495 (6 keys)** | **IDENTICAL.** Multi-arc priming did NOT widen cluster vocabulary. All 6 keys are `tool:sense_food_source` in both iterations. |
| `b_vs_c.cluster_reward_bias_l2` | 0.0 | 0.0 | llm-primary at test produces zero cluster noise floor in both iterations |
| Arm A `sense_food_source` test count | 0 | 0 | Still zero — llm-primary at test never invokes sense_food_source, cluster bias remains consumer-coupled to substrate-primary's `recommend_action` |
| Arm A test tool families | respond/sense/pick_up | respond/sense/pick_up | Stable across iterations |
| `salience_KS` (a_vs_b, p) | 0.879 (2.1e-9) | **0.529 (6.9e-15)** | Effect size smaller, p-value smaller. More diverse priming episodes shrink the novelty gap; substrate is less "alien" to held-out percepts |
| `valence_KS` (a_vs_b, p) | 0.283 (0.402) | **0.291 (0.023)** | **First Roy iteration with healthy-sample valence_KS clearing α=0.05.** Roy-1b's 0.998/0.006 was sample-driven (single-episode blank arm); Roy-2's 26-episode blank arm gives a clean read. |
| `causal_link_count_delta` | +156 | +152 | Within 3%; priming-side dynamics stable across arc mix |
| `goal_reward_bias_l2` | 0.2714 | 0.2786 | Within 3%; llm-primary's tool-outcome credit reproduces |

## What this proves

The headline finding from Roy-2 separates two questions Roy-1b's methodology refinement raised:

1. **Negative for the structural question (path (a) does NOT widen cluster vocabulary).** The cradle linguistic narration is consumed by the orchestrator narrator (LLM) but not directly by substrate-primary AUT's tool proposer — so the 50-turn cold-start regime keeps the `sense_food_source` monoculture regardless of arc choice. The cluster wire writes the same six +1.0 keys keyed to the same single tool. This rules out path (a) of Roy-1b's three-pointer refinement: widening priming arcs alone is not sufficient to break substrate-primary's cold-start tool monoculture. The cold-start gate is in the AUT proposer, not in the orchestrator's percept emission.

2. **Partial-positive for the behavioral question (A vs C tool distributions diverge).** The substrate-only A vs C contrast (both neutral prompts) shows arm A's test-phase tool distribution diverges from arm C — A uses `sense` + `pick_up` variants where C uses `look` + `listen`. The signal is mediated by the LLM proposer reading substrate context indirectly (through salience-modulated WMS, recalled hippocampal memories, or affordance hints surfaced in the prompt), **not** through the `cluster_reward_bias` path. This is the first behavioral signal in the Roy harness that survives the A-vs-blank-neutral contrast under llm-primary, though it's subtle and prompt-mediated rather than a clean substrate-drives-action divergence.

3. **First clean valence_KS reading in Roy harness history.** Roy-1a missed α=0.05 (p=0.402); Roy-1b cleared it but with single-episode blank arm (sample-driven artefact). Roy-2's **`valence_KS = 0.291 (p=0.023)`** with 26-episode blank arm and 685-episode primed arm gives the first methodologically-clean significant valence signal across iterations. The substrate priming wrote negative-mean valence (-0.09) onto arm A's episode distribution; held-out percepts on the blank arms fire neutral-mean episodes (0.0). This is the strongest cross-iteration evidence that substrate carryover propagates to the Hippocampus valence distribution.

4. **Salience_KS effect size shrinks as priming episode diversity grows.** Roy-1a's `salience_KS = 0.879 (p=2.1e-9)` reflects 665 cradle_prelinguistic episodes' novelty against held-out test percepts. Roy-2's `salience_KS = 0.529 (p=6.9e-15)` reflects 685 episodes split across 3 prelinguistic stages + 2 cradle stages — more diverse priming episodes shrink the novelty gap (the substrate has "seen more" so held-out percepts are relatively less novel). The p-value is still highly significant; the effect-size shrinkage is methodologically informative — diversity is a quantifiable knob on salience carryover.

### Definitively proved regardless of headline values

- **The cluster wire is rock-solid across iterations.** Roy-0 → Roy-1a → Roy-1b → Roy-2: `cluster_reward_bias_l2` within 1% (2.4587 → 2.4495 → 2.4678 → 2.4495). Four single-seed iterations reproduce the same priming-side wire output.
- **The held-out fixture is mode-agnostic AND arc-mix-agnostic.** 30/30 test turns clean across both AUT modes and across two priming arc configurations.
- **Multi-arc priming at the orchestrator level does NOT shift substrate-primary's cold-start AUT proposer.** The AUT-side tool monoculture is invariant under arc-mix changes in this turn budget.

## What this still does NOT prove

- **Behavioral expression via the `cluster_reward_bias` path.** Still zero `sense_food_source` calls at test time under llm-primary — the cluster bias remains structurally present and behaviorally inert through this path.
- **That Roy-2b (substrate-primary at test on the same priming) would exploit the cradle-stage associations.** The cradle stages may have produced richer causal links / ATL chunks (not visible in the cluster wire) that substrate-primary's `recommend_action` could read. Unmeasured.
- **`min_confidence` tuning impact.** Untested; would require Roy-2c.
- **Wire 1 sufficiency.** Untested.
- **Cross-session persistence.** Still single-session.

## Reproduction

See [protocols/18_roy_2_reproduction.md](protocols/18_roy_2_reproduction.md).

## Recommendation for next iteration

Per the user's branching condition:

- *If behavioral divergence appears, Roy-2b (substrate-primary at test) is the natural follow-up.*
- *If not, Wire 1 is escalated and Roy-2c can wait.*

Roy-2 shows **partial behavioral divergence** (A vs C tool distributions diverge cleanly: A uses `sense`/`pick_up`, C uses `look`/`listen`), but it is **prompt-mediated rather than cluster-bias-mediated** — the LLM proposer reads substrate context indirectly via salience/memory-recall pathways, not via the cluster-wire consumer.

**My recommendation: run Roy-2b next.** Two reasons:

1. The substrate-primary AUT at test time is the consumer for the cluster wire AND it has access to the cradle-stage causal links + ATL chunks the cluster wire doesn't expose. Roy-1b's data established the cluster wire alone is behaviorally inert on this fixture under substrate-primary; Roy-2b answers whether the cradle-stage causal/semantic associations produced beyond the cluster wire are exploitable. The single-variable change vs Roy-1b is the priming arc mix.
2. The Roy-1a→Roy-2 single-variable change (priming arc mix only) reproduced cluster wire structure exactly. Roy-1b→Roy-2b will reproduce the substrate-primary-test-time consumer characteristics with the same priming change — useful for the methodology log regardless of the headline.

Wire 1 is **not yet escalated** because A vs C does show a clean substrate-only tool-distribution divergence, just not via the cluster path. Wire 1's case strengthens if Roy-2b shows the same monoculture as Roy-1b on the priming-cluster-keyed tool (`sense_food_source` count = 0 in arm A under substrate-primary on the cradle-mixed priming).

Methodology notes for Roy-3 (post-Roy-2b):

- **The valence_KS clean read is the load-bearing methodology win from Roy-2.** Keep arc diversity for future iterations to maintain it.
- **Cluster wire vocabulary widening requires AUT-side changes, not orchestrator-side.** Path (b) of Roy-1b's refinement (`min_confidence` tuning) is now the next testable lever; Wire 1 is the architectural escape hatch.
- **The 23-event peer_backend_call total at 10 test turns × 3 arms = ~0.77 calls per turn** — consistent with the LLM-AUT only firing on ~half of the percepts that don't pattern-match a deterministic tool path. Worth tracking in future iterations.

## PR

https://github.com/dennys246/Maxim/pull/242
