docs: close experiment 42 selector refinement
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user