Skip to content

Commit cd5dbb1

Browse files
authored
Fix: Add explicit error when delegate expert not found (#9)
* Fix: Add explicit error when delegate expert not found * Docs: Update CODE_REVIEW_REPORT.md for #34 fix * Chore: Add changeset for delegate expert error fix
1 parent e42ab22 commit cd5dbb1

File tree

3 files changed

+14
-22
lines changed

3 files changed

+14
-22
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@perstack/runtime": patch
3+
---
4+
5+
Add explicit error message when delegate expert is not found

CODE_REVIEW_REPORT.md

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Overall, the codebase is well-structured with strong architectural decisions. Th
1818
| ✅ Verified | 5 | Confirmed not an issue / working correctly |
1919
| 📝 Documented | 1 | Behavior documented, no code change needed |
2020
| ⏸️ Deferred | 8 | Low priority / E2E scope / future work |
21-
| 🔴 Open | 4 | Runtime package issues (2025-12-03) |
21+
| 🔴 Open | 3 | Runtime package issues (2025-12-03) |
2222
| 🟡 Low Prio | 4 | Runtime minor issues (2025-12-03) |
2323

2424
---
@@ -617,32 +617,16 @@ cd /project && perstack run expert "query"
617617
618618
### 34. Delegate Expert Not Found Causes Runtime Error
619619
620-
**Status**: 🔴 **Open**
620+
**Status**: **Fixed** — Commit `cc23849`
621621
622622
**Category**: Potential Bug
623623
**Severity**: Minor
624624
625625
**Location**: `packages/runtime/src/skill-manager/helpers.ts:69-74`
626626
627-
**Issue**: When creating DelegateSkillManagers, if a delegate expert is not found in `experts`, `experts[delegateExpertName]` returns `undefined`, causing `new DelegateSkillManager(undefined, ...)` to fail.
628-
629-
```typescript
630-
const delegateSkillManagers = expert.delegates.map((delegateExpertName) => {
631-
const delegate = experts[delegateExpertName] // May be undefined
632-
const manager = new DelegateSkillManager(delegate, runId, eventListener)
633-
// ...
634-
})
635-
```
627+
**Issue**: When creating DelegateSkillManagers, if a delegate expert is not found, error message was unclear.
636628
637-
**Impact**: Unclear error message when delegate expert is missing.
638-
639-
**Recommendation**: Add explicit check with descriptive error:
640-
```typescript
641-
const delegate = experts[delegateExpertName]
642-
if (!delegate) {
643-
throw new Error(`Delegate expert "${delegateExpertName}" not found in experts`)
644-
}
645-
```
629+
**Resolution**: Added explicit check with descriptive error message.
646630
647631
---
648632
@@ -899,7 +883,7 @@ const metaInstruction = dedent`
899883
| #31 | Skill lazy init for faster startup | ⏸️ Future |
900884
| #32 | maxSteps off-by-one error | ✅ Fixed |
901885
| #33 | Sandbox design flaw (workspace/chdir) | ✅ Fixed |
902-
| #34 | Delegate expert not found error | 🔴 Open |
886+
| #34 | Delegate expert not found error | ✅ Fixed |
903887
| #35 | Skill object mutation | 🔴 Open |
904888
| #36 | experts object mutation | 🔴 Open |
905889
| #37 | File operation error handling | ✅ Fixed |
@@ -928,7 +912,6 @@ const metaInstruction = dedent`
928912
### Runtime Package Open Issues (2025-12-03)
929913
930914
**Minor (Should Fix)**:
931-
- **#34**: Delegate expert not found — improve error message
932915
- **#35, #36**: Object mutation side effects — defensive copying recommended
933916
- **#38**: RunSetting not validated — use Zod schema
934917
@@ -957,3 +940,4 @@ const metaInstruction = dedent`
957940
| `ced1aa6` | Fix: maxSteps off-by-one error in finishing step |
958941
| `dac71b5` | Fix: Handle individual close failures in closeSkillManagers |
959942
| `796f981` | Fix: Handle file read errors gracefully in resolving file states |
943+
| `cc23849` | Fix: Add explicit error when delegate expert not found |

packages/runtime/src/skill-manager/helpers.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ export async function getSkillManagers(
6868
await initSkillManagersWithCleanup(interactiveSkillManagers, allManagers)
6969
const delegateSkillManagers = expert.delegates.map((delegateExpertName) => {
7070
const delegate = experts[delegateExpertName]
71+
if (!delegate) {
72+
throw new Error(`Delegate expert "${delegateExpertName}" not found in experts`)
73+
}
7174
const manager = new DelegateSkillManager(delegate, runId, eventListener)
7275
allManagers.push(manager)
7376
return manager

0 commit comments

Comments
 (0)