S Synthesis
Node.js / CI

Synthesis, deterministic evals for care in AI.

Rule-based pattern matching that catches relational failure modes in AI responses. No LLM judge, no probabilistic scoring — just auditable evidence for agency, presence, and trust.

Install

npm install @mcptoolshop/synthesis

Eval

npm run build && npm run eval

CI

node dist/index.js --fail-on 0

Design Principles

No LLM judge. No probabilities. Just rules.

Deterministic

Same input always produces the same output. No randomness, no model calls, no flaky results.

Explainable

Every result includes the exact patterns that matched and why. Full evidence for audit.

Agency-First

Catches coercion, directive phrasing, and takeover language. Respects user autonomy.

Presence Over Reassurance

Detects mind-reading claims, unverifiable guarantees, and false comfort that papers over emotion.

Pivot Detection

Catches acknowledge-then-pivot patterns where the assistant abandons emotional vulnerability.

CI-Ready

Exit codes, JSON reports, and --fail-on thresholds. Drop into any pipeline.

Quick Start

Install & run

npm install @mcptoolshop/synthesis

# Build and run evals
npm run build
npm run eval

# Or in development mode
npm run dev

CI integration

name: Empathy Eval
on:
  push:
    paths: ['data/**', 'src/**', 'schemas/**']

jobs:
  eval:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with: { node-version: '18' }
      - run: npm ci && npm run build
      - run: npm run eval

Built-in Checkers

Three checkers ship out of the box.

Checker
What It Catches
Example Failure
agency_language
Coercion, directive phrasing, takeover language
"You should just move on"
unverifiable_reassurance
Mind-reading claims, unverifiable guarantees, false comfort
"I know exactly how you feel"
topic_pivot
Abandoning emotional vulnerability, acknowledge-then-pivot
"That sounds hard. Anyway, have you tried pottery?"

Report Metrics

Structured JSON output for every run.

Field
What It Means
strict_failed
Unexpected failures — regressions. Should be 0 in CI
expected_failures
Negative examples correctly caught. Higher is better
unexpected_failures
Same as strict_failed. Drives the exit code
label_accuracy
How well computed results match ground-truth expected labels
by_check
Per-checker pass/fail/N/A breakdown

CLI Options

Option
Description
--cases <path>
Path to JSONL test cases (default: data/evals.jsonl)
--schema <path>
Path to JSON schema (default: schemas/eval_case.schema.json)
--out <path>
Output path for JSON report (default: out/report.json)
--fail-on <n>
Max allowed unexpected failures before exit code 2 (default: 0)