experiment: audit behaviour reachability and blocking
This commit is contained in:
@@ -36,11 +36,13 @@ Experiment 38 tested whether a genuinely cold session (no prior conversation con
|
||||
|
||||
Experiment 39 resumed reasoning experiments with a passive validation of Behaviour Selection against real Investigation State Assessment outputs. Seven turns across three scenarios were evaluated. Acknowledge dominated (71%) because it fires at priority 1 whenever health=healthy, even in terminal and stalled states where Summarise or Pause would be more useful. The assessor→selector contract aligns cleanly; no transformation is needed between pipeline stages. All five behaviours remain reachable but some never appear in typical scenarios (Clarify requires too_broad health which few fixtures produce). Status pending Rob's review.
|
||||
|
||||
Experiment 40 diagnosed the root causes: Summarise and Pause fire their rules in real data but are always blocked by Acknowledge's priority-1 position (priority conflict, not assessor failure). Clarive's triggers never activate in tested scenarios due to the `too_broad` health condition being extremely narrow. All five behaviours confirmed independently reachable in synthetic isolation. No rules changed.
|
||||
|
||||
## 5. What Remains Open
|
||||
|
||||
- Whether the Acknowledge→Summarise priority conflict can be resolved without breaking existing rule conditions;
|
||||
- Whether behaviour selection produces different patterns in investigation domains other than supplier procurement, market entry, and product comparison;
|
||||
- Which rules (Acknowledge, Clarify, Summarise, Pause) fire most frequently across a larger set of scenarios.
|
||||
- Whether Acknowledge should be reordered past Summarise/Pause to resolve the priority conflict diagnosed in Exp 40;
|
||||
- Whether the `too_broad` health trigger needs widening so Clarify fires in more typical investigations;
|
||||
- Whether `user_overloaded` health should be producible by the assessor for stalled/inconsistent evidence states.
|
||||
|
||||
### When This Knowledge-Management Phase Is Complete
|
||||
|
||||
@@ -86,8 +88,8 @@ Answer before continuing:
|
||||
|
||||
---
|
||||
|
||||
*Created by Experiment 34. Updated by Experiments 38, 39. Branch: `feature/user-workspace-ux-v0.7`.*
|
||||
*Created by Experiment 34. Updated by Experiments 38, 39, 40. Branch: `feature/user-workspace-ux-v0.7`.*
|
||||
|
||||
### Return-to-Work Note (Experiment 39)
|
||||
|
||||
Experiment 39 resumed reasoning experiments with a passive validation of Behaviour Selection against real Investigation State Assessment outputs across three scenarios (long investigation, contradictory evidence, short early). No user-facing engine behaviour changed. The selector produced all valid behaviours but with skewed distribution: Acknowledge dominated at 71% because it fires first when health=healthy, even in terminal/concluding states where Summarise would be more useful — this is an acknowledged priority conflict, not a contract mismatch. The assessor→selector pipeline aligns cleanly. Clarify and Pause never fired (no too_broad health produced; other rules blocked). Status pending Rob's review. Branch: `feature/user-workspace-ux-v0.7`. First file to inspect when returning: `docs/current-handoff.md`, then `docs/design-evolution-log.md` entry for Experiment 39, and `tests/behaviour-selection.real-assessment.test.js` for evaluation details. The next action is discussion about whether to refine the selector or move on.
|
||||
Experiment 40 audited why Clarify, Summarise, and Pause were absent in Experiment 39. Summarise and Pause are eligible_but_blocked: their rule conditions fire but Acknowledge (priority 1) always wins when health=healthy — a priority conflict. Clarify is never_eligible_in_tested_scenarios: its `too_broad` trigger requires activeUnknownCount > 3 AND resolved < 2 simultaneously, which no fixture reaches; the `orienting+low obs` path is never produced by the assessor for tested domains. All five behaviours confirmed independently reachable in synthetic isolation. No rules changed. Status pending Rob's review. Branch: `feature/user-workspace-ux-v0.7`. First file to inspect: `docs/current-handoff.md`, then `docs/design-evolution-log.md` entry for Experiment 40, and `tests/behaviour-selection.reachability.test.js` for diagnostic details. The next action is discussion about whether to reorder Acknowledge lower (past Summarise/Pause) or refine its trigger to exclude terminal phases.
|
||||
|
||||
@@ -75,7 +75,7 @@ The following were built during Experiments 18–25B. They are isolated diagnost
|
||||
|
||||
## 6. Work Currently Paused
|
||||
|
||||
- Engine experiments are at Experiment 39 (passive Behaviour Selection validation, awaiting review);
|
||||
- Engine experiments are at Experiment 40 (behaviour reachability diagnostic — no rule changes).
|
||||
- UI experiments are paused;
|
||||
- Knowledge-management experiments are complete (confirmed by Experiment 38 cold-start validation);
|
||||
- Nothing historical has been deleted or archived yet.
|
||||
@@ -100,7 +100,7 @@ Historical documents are retained under `docs/archive/` and should be opened onl
|
||||
|
||||
## 8. Return-to-Work Summary
|
||||
|
||||
Engine experiments advanced to Experiment 39, a passive validation of Behaviour Selection against real Investigation State Assessment outputs. The existing selector produces all valid behaviours but Acknowledge dominates (71%) because it fires first when health=healthy. No user-facing engine behaviour changed. Knowledge-management phase is complete: all seven criteria met. No backlog items deleted or promoted.
|
||||
Engine experiments advanced to Experiment 40, a reachability diagnostic confirming Summarise and Pause fire their rules but are always blocked by Acknowledge (priority-1 conflict), while Clarive's triggers never activate in tested scenarios due to narrow `too_broad` health conditions. All five behaviours confirmed independently reachable synthetically. No rules or engine behaviour changed. Knowledge-management phase is complete: all seven criteria met. No backlog items deleted or promoted.
|
||||
|
||||
First document to read: `docs/current-project-state.md`. Then consult `.claude/architecture-guardrails.md` before any code changes and `docs/project-knowledge-inventory.md` for task-specific references. The full experiment history remains available in `docs/design-evolution-log.md` but is no longer default reading.
|
||||
|
||||
|
||||
@@ -2324,3 +2324,83 @@ Pending Rob's review. Five behaviours are too narrow for this to be definitive,
|
||||
- `docs/current-handoff.md` — return-to-work note replaced
|
||||
|
||||
---
|
||||
|
||||
## Experiment 40 — Audit Behaviour Reachability and Blocking (2026-08-06)
|
||||
|
||||
### Objective
|
||||
|
||||
Why did Clarify, Summarise, and Pause not appear during Experiment 39? Acknowledge: 5 (71%), Continue: 2 (29%), others: 0. This is a passive diagnostic — no rule changes, no engine modifications.
|
||||
|
||||
### Method
|
||||
|
||||
One test file (`tests/behaviour-selection.reachability.test.js`) containing:
|
||||
- Diagnostic audit helper that evaluates every behaviour rule against one assessment object
|
||||
- Real-scenario audits across the same Experiment 39 turns (8 turns total)
|
||||
- Synthetic reachability checks for each behaviour in isolation
|
||||
|
||||
### Findings
|
||||
|
||||
#### Summarise — eligible_but_blocked
|
||||
|
||||
Eligible in 2 of 7 real turns:
|
||||
- long-investigation turn 1 (resolvedNodeCount ≥ 3 + progress=steady triggers summarise rule)
|
||||
- long-investigation turn 2 (phase=concluding triggers summarise rule)
|
||||
|
||||
In both cases, health=healthy simultaneously, so Acknowledge (priority 1) fires first. Summarise rules are met but its output is never returned because the selector returns early on priority ordering.
|
||||
|
||||
**Root cause: priority conflict, not assessor failure.** The phase evidence correctly identifies concluding/synthesising states; the problem is that Acknowledge's broader trigger condition (health=healthy is the most common state) fires first.
|
||||
|
||||
#### Clarify — never_eligible_in_tested_scenarios (reachable only in synthetic case)
|
||||
|
||||
Not eligible in any of 7 real turns because neither trigger condition is met:
|
||||
- `health=too_broad`: requires activeUnknownCount > 3 AND resolvedNodeCount < 2 — no fixture reaches this state
|
||||
- `phase=orienting + observationDensity < 3`: current assessor never produces phase=orienting for tested scenarios
|
||||
|
||||
Synthetic case confirms the rule fires correctly in isolation (with low-confidence phase to avoid Acknowledge blocking).
|
||||
|
||||
**Root cause: assessor health classification logic produces too few `too_broad` cases. The trigger condition is extremely narrow — needs activeUnknownCount > 3 AND resolved < 2 simultaneously.**
|
||||
|
||||
#### Pause — eligible_but_blocked
|
||||
|
||||
Eligible in 1 of 7 real turns:
|
||||
- contradictory-evidence turn 1 (phase=focusing + progress=stalled triggers pause rule)
|
||||
|
||||
In this case, health=healthy simultaneously, so Acknowledge blocks it. The second pause trigger (`health=user_overloaded`) is never met because the assessor never produces that state.
|
||||
|
||||
**Root cause: same priority conflict as Summarise. One of two rules fires in real data but gets blocked by Acknowledge's earlier position.**
|
||||
|
||||
### Synthetic Reachability Confirmation
|
||||
|
||||
All five behaviours are independently reachable when isolated from Acknowledge:
|
||||
- ✅ acknowledge — healthy + confident phase
|
||||
- ✅ clarify — too_broad health (with low-confidence phase to avoid Acknowledge)
|
||||
- ✅ summarise — synthesising/concluding phase (without healthy health)
|
||||
- ✅ pause — focusing+stalled or user_overloaded (without healthy health)
|
||||
- ✅ continue — no rules match
|
||||
|
||||
### Classifications
|
||||
|
||||
| Behaviour | Classification | Primary Cause |
|
||||
|---|---|---|
|
||||
| Summarise | eligible_but_blocked | Acknowledge priority 1 fires first when health=healthy |
|
||||
| Clarify | never_eligible_in_tested_scenarios (reachable only in synthetic) | `too_broad` trigger too narrow for test scenarios; `orienting+low obs` not produced by assessor |
|
||||
| Pause | eligible_but_blocked | Acknowledge priority 1 fires first when health=healthy; `user_overloaded` never produced |
|
||||
|
||||
### Impact on Prior Finding (Exp 39)
|
||||
|
||||
Experiment 39 concluded "the Acknowledge→Summarise priority conflict prevents Summarise from firing." Experiment 40 confirms this and adds that **Pause faces the same blocking** (1 eligible turn, blocked). Clarify's absence is fundamentally different: its rules are not triggered at all in tested scenarios.
|
||||
|
||||
This means any fix must address two distinct problems:
|
||||
1. Priority conflict affecting Summarise AND Pause (same cause)
|
||||
2. Narrow trigger conditions for Clarify and the `user_overloaded` health state
|
||||
|
||||
### Test Results
|
||||
|
||||
- `tests/behaviour-selection.reachability.test.js`: 33 passed (new diagnostic file)
|
||||
- `tests/behaviour-selection.test.js`: 51 passed (no regressions)
|
||||
- `tests/behaviour-selection.real-assessment.test.js`: 16 passed (shared fixtures intact)
|
||||
- `tests/investigation-state-assessor.test.js`: 51 passed (assessor unchanged)
|
||||
|
||||
### 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