docs: record decision factor detection
This commit is contained in:
@@ -3064,3 +3064,34 @@ Schema changed: NO
|
|||||||
Ollama calls: 0
|
Ollama calls: 0
|
||||||
Live API calls: 0
|
Live API calls: 0
|
||||||
Vitest run: NO
|
Vitest run: NO
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 60B.61 — Decision Remaining-Material-Factor Detection
|
||||||
|
|
||||||
|
**Status:** PASSED
|
||||||
|
**Type:** Helper detection experiment (bounded)
|
||||||
|
|
||||||
|
**Question answered:** Does the dedicated remaining-material-factor helper work correctly once malformed tests are repaired, without any broader applyValidatedProposal integration? **Answer: YES.**
|
||||||
|
|
||||||
|
**Production additions:**
|
||||||
|
- `hasRemainingMaterialFactors(decisionNodeId, graph)` — boolean public helper
|
||||||
|
- `countRemainingMaterialFactors(decisionNodeId, graph)` — count variant (internal/helper support)
|
||||||
|
- `TERMINAL_STATUSES` and `isUnresolvedUnknown(node)` — internal helpers
|
||||||
|
|
||||||
|
**Routes supported:** A (hierarchy), B (direct dependency), C (consequence via may_cause/affects/causes), D (containment via option)
|
||||||
|
**Excluded:** known/resolved/contradicted statuses, supports/measures weak links, arbitrary connectivity, decision self-count
|
||||||
|
|
||||||
|
**Test cases:** 14 in 60B.61 block — all passed
|
||||||
|
**Regression preservation:** 60B.43 PASSED, 60B.11 PASSED, pricing prerequisite-first PASSED
|
||||||
|
|
||||||
|
**Out-of-scope removed:**
|
||||||
|
- `remainingMaterialFactorCount` integration hook from applyValidatedProposal return (integration rejected per scope)
|
||||||
|
- Extra "countRemainingMaterialFactor counting" test block (out of bounded scope)
|
||||||
|
- `makeProductLaunchClosureFixture()` dependency in 60B.61 tests (replaced with local graphs)
|
||||||
|
|
||||||
|
**Committed:**
|
||||||
|
- Production/tests: `feat(reasoning): detect remaining decision factors`
|
||||||
|
- Docs: `docs: record decision factor detection`
|
||||||
|
|
||||||
|
**Next step:** Decision-sufficiency closure integration remains a separate next experiment.
|
||||||
|
|||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# Experiment 60B.61 — Decision Remaining-Material-Factor Detection
|
||||||
|
|
||||||
|
## Status: PASSED
|
||||||
|
|
||||||
|
### Objective
|
||||||
|
Answer: *Does the dedicated remaining-material-factor helper work correctly once malformed tests are repaired, without any broader applyValidatedProposal integration?*
|
||||||
|
|
||||||
|
**Answer: YES.**
|
||||||
|
|
||||||
|
### Scope (bounded)
|
||||||
|
Helper detection experiment only. No closure integration.
|
||||||
|
|
||||||
|
### Production code added (2 helpers + internal support)
|
||||||
|
|
||||||
|
| Export | Role |
|
||||||
|
|--------|------|
|
||||||
|
| `hasRemainingMaterialFactors(decisionNodeId, graph)` | Public boolean — `true` if any unresolved unknown remains material to the decision |
|
||||||
|
| `countRemainingMaterialFactors(decisionNodeId, graph)` | Count variant — used internally by `hasRemainingMaterialFactors`; kept as exported for potential future use |
|
||||||
|
|
||||||
|
- **Set-based deduplication** of factor IDs across routes (no double-count)
|
||||||
|
- **Decision self-count excluded** (`node.id === decisionNodeId`)
|
||||||
|
- **Terminal statuses excluded**: `known`, `resolved`, `contradicted`
|
||||||
|
- **Helper-only**. No integration into `applyValidatedProposal` return, no closure logic change.
|
||||||
|
|
||||||
|
### Supported Routes
|
||||||
|
|
||||||
|
| Route | Relationship Path |
|
||||||
|
|-------|-------------------|
|
||||||
|
| A — hierarchy | `parentId` chain or `childIds` membership |
|
||||||
|
| B — direct dependency | `depends_on` edge to decision |
|
||||||
|
| C — consequence | unknown → `{affects,may_cause,causes}` → option → `contained_in` → decision |
|
||||||
|
| D — containment | unknown → `contained_in` → option → `contained_in` → decision |
|
||||||
|
|
||||||
|
### Excluded (returns false)
|
||||||
|
|
||||||
|
- Known / resolved / contraduted statuses
|
||||||
|
- `supports` / `measures` weak links
|
||||||
|
- Arbitrary non-approved connectivity (`other`)
|
||||||
|
- The decision node itself
|
||||||
|
- Non-unknown kind nodes (e.g., observations)
|
||||||
|
|
||||||
|
### Test Suite (14 cases in 60B.61 block)
|
||||||
|
|
||||||
|
1. Containment-only unresolved factor → **true**
|
||||||
|
2. Same factor resolved → **false**
|
||||||
|
3. `may_cause` option-linked factor → **true**
|
||||||
|
4. Valid direct `depends_on` factor → **true**; resolved → **false**
|
||||||
|
5. Hierarchy child factor → **true**
|
||||||
|
6. Supports / measures weak link → **false**
|
||||||
|
7. Decision node alone does not self-count → **false**
|
||||||
|
8. Another genuine unresolved hierarchy child remains → **true**
|
||||||
|
9. Status = known excluded → **false**
|
||||||
|
10. Status = contradicted excluded → **false**
|
||||||
|
11. Non-unknown kinds excluded → **false**
|
||||||
|
12. 60B.56 sufficiency (all factors resolved) → **false**
|
||||||
|
13. Arbitrary connectivity via `other` edge → **false**
|
||||||
|
14. Additional resolution state within Route B test → **false**
|
||||||
|
|
||||||
|
### Regression Preservation
|
||||||
|
|
||||||
|
- **60B.43**: PASSED
|
||||||
|
- **60B.11**: PASSED
|
||||||
|
- **Pricing prerequisite-first**: PASSED
|
||||||
|
|
||||||
|
### Git Commits
|
||||||
|
|
||||||
|
```
|
||||||
|
feat(reasoning): detect remaining decision factors
|
||||||
|
docs: record decision factor detection
|
||||||
|
```
|
||||||
|
|
||||||
|
WHAT IS NOW GUARANTEED
|
||||||
|
---
|
||||||
|
|
||||||
|
The helper `hasRemainingMaterialFactors(decisionNodeId, graph)` correctly identifies unresolved material factors for a decision node across all four approved routes (A–D), with Set-based deduplication and proper terminal-status exclusion. No production behaviour outside the helper itself was changed.
|
||||||
|
|
||||||
|
WHAT REMAINS OPEN
|
||||||
|
---
|
||||||
|
|
||||||
|
Decision-sufficiency closure integration remains a separate next experiment. The helper detects but does not influence any decision-closure logic at this time.
|
||||||
Reference in New Issue
Block a user