Skip to content

Pluggable scorers — custom weights and trap detectors #47

Description

@UditAkhourii

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions