Problem
The novelty/viability/fit weights are hardcoded in `scoreIdeas` (src/engine.ts):
```ts
const total = r.novelty * 0.35 + r.viability * 0.4 + r.fit * 0.25;
```
This weighting is tuned for engineering problems. For other domains (writing, product strategy, research) the right tradeoff between novelty and viability is different, and there's no way to override it without forking.
Proposal
- Add `scoreWeights?: { novelty: number; viability: number; fit: number }` to `RunOptions`, defaulting to the current values.
- Add an optional `customScorePrompt?: string` to let callers replace `SCORE_SYSTEM` entirely (for domain-specific critic behavior) while keeping the JSON schema contract.
- Add an optional `trapDetector?: (idea: Idea) => string | undefined` hook that runs after LLM scoring for deterministic/rule-based trap flags (e.g. "mentions a discontinued API") without needing another model call.
- Document in README how to set this up for a non-engineering use case, since that's the "no-brainer skill for creative and interdisciplinary work" pitch.
Problem
The novelty/viability/fit weights are hardcoded in `scoreIdeas` (src/engine.ts):
```ts
const total = r.novelty * 0.35 + r.viability * 0.4 + r.fit * 0.25;
```
This weighting is tuned for engineering problems. For other domains (writing, product strategy, research) the right tradeoff between novelty and viability is different, and there's no way to override it without forking.
Proposal