docs: close experiment 42 selector refinement

This commit is contained in:
2026-08-06 18:00:13 +01:00
parent 05d3d96014
commit fc310e77e1
3 changed files with 95 additions and 8 deletions
+88
View File
@@ -2494,3 +2494,91 @@ Both variants were implemented as test-only functions in `tests/behaviour-select
- `docs/design-evolution-log.md` — this entry
- `docs/current-handoff.md` — return-to-work note replaced
## Experiment 41 — Conclusion
**Variant B was preferred because it changed only the two intended turns without introducing a false-positive in a focusing state. Variant A produced an early summarise in a focusing phase and was discarded. No production rule changed during Experiment 41.** The implementation of Variant B's exclusion gate is the subject of Experiment 42.
---
## Experiment 42 — Implement Narrow Acknowledge Exclusion (Variant B) (2026-08-06)
### Hypothesis
Applying a narrow exclusion gate to Acknowledge — excluding it when phase is synthesising or concluding, progress is stalled, or conversation health is user_overloaded — will reduce the two identified false-Acknowledge selections (concluding → summarise, stalled → pause) without introducing any unintended behaviour changes in other tested turns.
### Exact Exclusion Rule
`isAcknowledgeExcluded(assessment)` returns `true` when:
- `phase.value` is `synthesising` or `concluding`; OR
- `progress.value` is `stalled`; OR
- `conversationHealth.value` is `user_overloaded`.
When excluded, Acknowledge does not fire and the selector proceeds to the next priority rule. The gate qualifies the trigger; it does not replace it.
### Two Changed Turns
| Turn | Scenario | Phase | Progress | Health | Before | After |
|------|----------|-------|----------|--------|--------|-------|
| long-investigation t4 | concluding long-investigation | concluding(high) | steady | healthy | acknowledge | **summarise** |
| contradictory-evidence t1 | stalled contradictory-evidence | focusing(high) | stalled | healthy | acknowledge | **pause** |
### Five Preserved Turns
| Turn | Scenario | Phase | Progress | Health | Behaviour (unchanged) |
|------|----------|-------|----------|--------|----------------------|
| long-investigation t0 | cannot_determine(low) | cannot_determine | too_narrow | continue |
| long-investigation t3 | focusing(high) | steady | healthy | acknowledge |
| contradictory-evidence t0 | focusing(high) | cannot_determine | healthy | acknowledge |
| contradictory-evidence t2 | focusing(high) | steady | healthy | acknowledge |
| short-early t0 | exploring(low) | cannot_determine | healthy | continue |
### Final Behaviour Distribution (7 real assessment turns)
- Acknowledge: 3
- Summarise: 1
- Pause: 1
- Continue: 2
- Clarify: 0
### Integration Status
The production Behaviour Selection module (`lib/behaviour-selection/behaviour-selector.js`) was changed to include the `isAcknowledgeExcluded()` gate. However, **active user-facing engine behaviour did not change** because Behaviour Selection remains isolated with no runtime caller — it is exported but never imported by any code in the repository.
### Clarify Status
`Clarify` remains unresolved and was not modified in this experiment. Its trigger conditions (`health=too_broad` or `phase=orienting + obs<3`) require states that no tested scenario produces. This remains an open question for future work.
### Selector Output Shape
The selector output shape did not change. The exclusion gate returns `null` from `selectAcknowledge`, which is the existing early-return mechanism used when a rule does not match. No new fields, no restructuring of the return object.
### Assessor and Fixtures
Assessor logic did not change. Fixtures did not change. Priority order did not change.
### Test Results
All 151 relevant tests passed across:
- `tests/behaviour-selection.test.js`: 51 (no regressions)
- `tests/behaviour-selection.reachability.test.js`: 33 (updated for new exclusion gate)
- `tests/behaviour-selection.counterfactual.test.js`: 44 (from Exp 41, no changes)
- `tests/behaviour-selection.real-assessment.test.js`: 16 (shared fixtures intact)
Tests were not rerun as part of this documentation-only closure. The recorded result comes from the implementation commit (05d3d96).
### Limitations
- Only seven real assessment turns across three scenarios were evaluated; other investigation domains may exhibit different patterns.
- `health=user_overloaded` is excluded by rule but never produced by any current assessor fixture — it is untested in practice.
- `Clarify` remains deferred because no scenario produces the narrow trigger conditions it requires.
- The selector remains isolated with no runtime caller; there is no live user-facing validation.
### Result
**Confirmed within the tested scenarios.** Variant B correctly changes only the two intended turns and preserves all five others. No unintended side-effects were observed.
### Documents Updated
- `docs/design-evolution-log.md` — this entry
- `docs/current-handoff.md` — return-to-work note replaced