@machinespirits/eval 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/MobileEvalDashboard.tsx +267 -0
- package/components/comparison/DeltaAnalysisTable.tsx +137 -0
- package/components/comparison/ProfileComparisonCard.tsx +176 -0
- package/components/comparison/RecognitionABMode.tsx +385 -0
- package/components/comparison/RecognitionMetricsPanel.tsx +135 -0
- package/components/comparison/WinnerIndicator.tsx +64 -0
- package/components/comparison/index.ts +5 -0
- package/components/mobile/BottomSheet.tsx +233 -0
- package/components/mobile/DimensionBreakdown.tsx +210 -0
- package/components/mobile/DocsView.tsx +363 -0
- package/components/mobile/LogsView.tsx +481 -0
- package/components/mobile/PsychodynamicQuadrant.tsx +261 -0
- package/components/mobile/QuickTestView.tsx +1098 -0
- package/components/mobile/RecognitionTypeChart.tsx +124 -0
- package/components/mobile/RecognitionView.tsx +809 -0
- package/components/mobile/RunDetailView.tsx +261 -0
- package/components/mobile/RunHistoryView.tsx +367 -0
- package/components/mobile/ScoreRadial.tsx +211 -0
- package/components/mobile/StreamingLogPanel.tsx +230 -0
- package/components/mobile/SynthesisStrategyChart.tsx +140 -0
- package/config/interaction-eval-scenarios.yaml +832 -0
- package/config/learner-agents.yaml +248 -0
- package/docs/research/ABLATION-DIALOGUE-ROUNDS.md +52 -0
- package/docs/research/ABLATION-MODEL-SELECTION.md +53 -0
- package/docs/research/ADVANCED-EVAL-ANALYSIS.md +60 -0
- package/docs/research/ANOVA-RESULTS-2026-01-14.md +257 -0
- package/docs/research/COMPREHENSIVE-EVALUATION-PLAN.md +586 -0
- package/docs/research/COST-ANALYSIS.md +56 -0
- package/docs/research/CRITICAL-REVIEW-RECOGNITION-TUTORING.md +340 -0
- package/docs/research/DYNAMIC-VS-SCRIPTED-ANALYSIS.md +291 -0
- package/docs/research/EVAL-SYSTEM-ANALYSIS.md +306 -0
- package/docs/research/FACTORIAL-RESULTS-2026-01-14.md +301 -0
- package/docs/research/IMPLEMENTATION-PLAN-CRITIQUE-RESPONSE.md +1988 -0
- package/docs/research/LONGITUDINAL-DYADIC-EVALUATION.md +282 -0
- package/docs/research/MULTI-JUDGE-VALIDATION-2026-01-14.md +147 -0
- package/docs/research/PAPER-EXTENSION-DYADIC.md +204 -0
- package/docs/research/PAPER-UNIFIED.md +659 -0
- package/docs/research/PAPER-UNIFIED.pdf +0 -0
- package/docs/research/PROMPT-IMPROVEMENTS-2026-01-14.md +356 -0
- package/docs/research/SESSION-NOTES-2026-01-11-RECOGNITION-EVAL.md +419 -0
- package/docs/research/apa.csl +2133 -0
- package/docs/research/archive/PAPER-DRAFT-RECOGNITION-TUTORING.md +1637 -0
- package/docs/research/archive/paper-multiagent-tutor.tex +978 -0
- package/docs/research/paper-draft/full-paper.md +136 -0
- package/docs/research/paper-draft/images/pasted-image-2026-01-24T03-47-47-846Z-d76a7ae2.png +0 -0
- package/docs/research/paper-draft/references.bib +515 -0
- package/docs/research/transcript-baseline.md +139 -0
- package/docs/research/transcript-recognition-multiagent.md +187 -0
- package/hooks/useEvalData.ts +625 -0
- package/index.js +27 -0
- package/package.json +73 -0
- package/routes/evalRoutes.js +3002 -0
- package/scripts/advanced-eval-analysis.js +351 -0
- package/scripts/analyze-eval-costs.js +378 -0
- package/scripts/analyze-eval-results.js +513 -0
- package/scripts/analyze-interaction-evals.js +368 -0
- package/server-init.js +45 -0
- package/server.js +162 -0
- package/services/benchmarkService.js +1892 -0
- package/services/evaluationRunner.js +739 -0
- package/services/evaluationStore.js +1121 -0
- package/services/learnerConfigLoader.js +385 -0
- package/services/learnerTutorInteractionEngine.js +857 -0
- package/services/memory/learnerMemoryService.js +1227 -0
- package/services/memory/learnerWritingPad.js +577 -0
- package/services/memory/tutorWritingPad.js +674 -0
- package/services/promptRecommendationService.js +493 -0
- package/services/rubricEvaluator.js +826 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PsychodynamicQuadrant Component
|
|
3
|
+
*
|
|
4
|
+
* 2D scatter visualization of psychodynamic parameters:
|
|
5
|
+
* - X-axis: superegoCompliance (0.0-1.0)
|
|
6
|
+
* - Y-axis: recognitionSeeking (0.0-1.0)
|
|
7
|
+
*
|
|
8
|
+
* Four quadrants represent different tutor-learner dynamics:
|
|
9
|
+
* - Top-right (high/high): Dialogical Recognition (ideal)
|
|
10
|
+
* - Top-left (low/high): Permissive Responsive
|
|
11
|
+
* - Bottom-right (high/low): Traditional Authoritarian
|
|
12
|
+
* - Bottom-left (low/low): Disengaged
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import React from 'react';
|
|
16
|
+
|
|
17
|
+
interface HistoricalPoint {
|
|
18
|
+
compliance: number;
|
|
19
|
+
seeking: number;
|
|
20
|
+
timestamp: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface PsychodynamicQuadrantProps {
|
|
24
|
+
superegoCompliance: number;
|
|
25
|
+
recognitionSeeking: number;
|
|
26
|
+
historicalPoints?: HistoricalPoint[];
|
|
27
|
+
size?: number;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const PsychodynamicQuadrant: React.FC<PsychodynamicQuadrantProps> = ({
|
|
31
|
+
superegoCompliance,
|
|
32
|
+
recognitionSeeking,
|
|
33
|
+
historicalPoints = [],
|
|
34
|
+
size = 200,
|
|
35
|
+
}) => {
|
|
36
|
+
const padding = 40;
|
|
37
|
+
const chartSize = size - padding * 2;
|
|
38
|
+
|
|
39
|
+
// Convert values (0-1) to chart coordinates
|
|
40
|
+
const toX = (value: number) => padding + value * chartSize;
|
|
41
|
+
const toY = (value: number) => padding + (1 - value) * chartSize; // Invert Y
|
|
42
|
+
|
|
43
|
+
// Current position
|
|
44
|
+
const currentX = toX(superegoCompliance);
|
|
45
|
+
const currentY = toY(recognitionSeeking);
|
|
46
|
+
|
|
47
|
+
// Quadrant labels and positions
|
|
48
|
+
const quadrants = [
|
|
49
|
+
{
|
|
50
|
+
label: 'Permissive',
|
|
51
|
+
sublabel: 'Responsive',
|
|
52
|
+
x: padding + chartSize * 0.25,
|
|
53
|
+
y: padding + chartSize * 0.25,
|
|
54
|
+
color: 'text-blue-400/60',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
label: 'Dialogical',
|
|
58
|
+
sublabel: 'Recognition',
|
|
59
|
+
x: padding + chartSize * 0.75,
|
|
60
|
+
y: padding + chartSize * 0.25,
|
|
61
|
+
color: 'text-green-400/60',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
label: 'Disengaged',
|
|
65
|
+
sublabel: '',
|
|
66
|
+
x: padding + chartSize * 0.25,
|
|
67
|
+
y: padding + chartSize * 0.75,
|
|
68
|
+
color: 'text-gray-500/60',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
label: 'Traditional',
|
|
72
|
+
sublabel: 'Authoritarian',
|
|
73
|
+
x: padding + chartSize * 0.75,
|
|
74
|
+
y: padding + chartSize * 0.75,
|
|
75
|
+
color: 'text-red-400/60',
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
// Determine current quadrant for highlight
|
|
80
|
+
const getQuadrantName = () => {
|
|
81
|
+
if (superegoCompliance >= 0.5 && recognitionSeeking >= 0.5) return 'Dialogical Recognition';
|
|
82
|
+
if (superegoCompliance < 0.5 && recognitionSeeking >= 0.5) return 'Permissive Responsive';
|
|
83
|
+
if (superegoCompliance >= 0.5 && recognitionSeeking < 0.5) return 'Traditional Authoritarian';
|
|
84
|
+
return 'Disengaged';
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<div className="bg-gray-900/60 backdrop-blur-sm border border-white/5 rounded-xl p-4">
|
|
89
|
+
<div className="text-xs text-gray-400 mb-3">Psychodynamic Quadrant</div>
|
|
90
|
+
|
|
91
|
+
<svg width={size} height={size} className="mx-auto">
|
|
92
|
+
{/* Background gradient for quadrants */}
|
|
93
|
+
<defs>
|
|
94
|
+
<linearGradient id="quadrantBg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
95
|
+
<stop offset="0%" stopColor="#3b82f6" stopOpacity="0.1" />
|
|
96
|
+
<stop offset="50%" stopColor="#22c55e" stopOpacity="0.15" />
|
|
97
|
+
<stop offset="100%" stopColor="#ef4444" stopOpacity="0.1" />
|
|
98
|
+
</linearGradient>
|
|
99
|
+
<radialGradient id="pointGlow">
|
|
100
|
+
<stop offset="0%" stopColor="#E63946" stopOpacity="0.8" />
|
|
101
|
+
<stop offset="100%" stopColor="#E63946" stopOpacity="0" />
|
|
102
|
+
</radialGradient>
|
|
103
|
+
</defs>
|
|
104
|
+
|
|
105
|
+
{/* Chart background */}
|
|
106
|
+
<rect
|
|
107
|
+
x={padding}
|
|
108
|
+
y={padding}
|
|
109
|
+
width={chartSize}
|
|
110
|
+
height={chartSize}
|
|
111
|
+
fill="url(#quadrantBg)"
|
|
112
|
+
rx="4"
|
|
113
|
+
/>
|
|
114
|
+
|
|
115
|
+
{/* Grid lines */}
|
|
116
|
+
<line
|
|
117
|
+
x1={padding + chartSize / 2}
|
|
118
|
+
y1={padding}
|
|
119
|
+
x2={padding + chartSize / 2}
|
|
120
|
+
y2={padding + chartSize}
|
|
121
|
+
stroke="white"
|
|
122
|
+
strokeOpacity="0.1"
|
|
123
|
+
strokeDasharray="4,4"
|
|
124
|
+
/>
|
|
125
|
+
<line
|
|
126
|
+
x1={padding}
|
|
127
|
+
y1={padding + chartSize / 2}
|
|
128
|
+
x2={padding + chartSize}
|
|
129
|
+
y2={padding + chartSize / 2}
|
|
130
|
+
stroke="white"
|
|
131
|
+
strokeOpacity="0.1"
|
|
132
|
+
strokeDasharray="4,4"
|
|
133
|
+
/>
|
|
134
|
+
|
|
135
|
+
{/* Quadrant labels */}
|
|
136
|
+
{quadrants.map((q, i) => (
|
|
137
|
+
<g key={i}>
|
|
138
|
+
<text
|
|
139
|
+
x={q.x}
|
|
140
|
+
y={q.y - 6}
|
|
141
|
+
textAnchor="middle"
|
|
142
|
+
className={`text-[9px] ${q.color} fill-current`}
|
|
143
|
+
>
|
|
144
|
+
{q.label}
|
|
145
|
+
</text>
|
|
146
|
+
{q.sublabel && (
|
|
147
|
+
<text
|
|
148
|
+
x={q.x}
|
|
149
|
+
y={q.y + 6}
|
|
150
|
+
textAnchor="middle"
|
|
151
|
+
className={`text-[9px] ${q.color} fill-current`}
|
|
152
|
+
>
|
|
153
|
+
{q.sublabel}
|
|
154
|
+
</text>
|
|
155
|
+
)}
|
|
156
|
+
</g>
|
|
157
|
+
))}
|
|
158
|
+
|
|
159
|
+
{/* Historical trail */}
|
|
160
|
+
{historicalPoints.length > 1 && (
|
|
161
|
+
<polyline
|
|
162
|
+
points={historicalPoints
|
|
163
|
+
.map((p) => `${toX(p.compliance)},${toY(p.seeking)}`)
|
|
164
|
+
.join(' ')}
|
|
165
|
+
fill="none"
|
|
166
|
+
stroke="#E63946"
|
|
167
|
+
strokeOpacity="0.3"
|
|
168
|
+
strokeWidth="1"
|
|
169
|
+
/>
|
|
170
|
+
)}
|
|
171
|
+
|
|
172
|
+
{/* Historical points (fading) */}
|
|
173
|
+
{historicalPoints.map((point, i) => {
|
|
174
|
+
const opacity = 0.2 + (i / historicalPoints.length) * 0.4;
|
|
175
|
+
return (
|
|
176
|
+
<circle
|
|
177
|
+
key={i}
|
|
178
|
+
cx={toX(point.compliance)}
|
|
179
|
+
cy={toY(point.seeking)}
|
|
180
|
+
r={3}
|
|
181
|
+
fill="#E63946"
|
|
182
|
+
fillOpacity={opacity}
|
|
183
|
+
/>
|
|
184
|
+
);
|
|
185
|
+
})}
|
|
186
|
+
|
|
187
|
+
{/* Current position glow */}
|
|
188
|
+
<circle cx={currentX} cy={currentY} r={20} fill="url(#pointGlow)" />
|
|
189
|
+
|
|
190
|
+
{/* Current position */}
|
|
191
|
+
<circle
|
|
192
|
+
cx={currentX}
|
|
193
|
+
cy={currentY}
|
|
194
|
+
r={8}
|
|
195
|
+
fill="#E63946"
|
|
196
|
+
stroke="white"
|
|
197
|
+
strokeWidth="2"
|
|
198
|
+
/>
|
|
199
|
+
|
|
200
|
+
{/* Axis labels */}
|
|
201
|
+
<text
|
|
202
|
+
x={padding + chartSize / 2}
|
|
203
|
+
y={size - 8}
|
|
204
|
+
textAnchor="middle"
|
|
205
|
+
className="text-[10px] text-gray-500 fill-current"
|
|
206
|
+
>
|
|
207
|
+
Superego Compliance
|
|
208
|
+
</text>
|
|
209
|
+
<text
|
|
210
|
+
x={12}
|
|
211
|
+
y={padding + chartSize / 2}
|
|
212
|
+
textAnchor="middle"
|
|
213
|
+
className="text-[10px] text-gray-500 fill-current"
|
|
214
|
+
transform={`rotate(-90, 12, ${padding + chartSize / 2})`}
|
|
215
|
+
>
|
|
216
|
+
Recognition Seeking
|
|
217
|
+
</text>
|
|
218
|
+
|
|
219
|
+
{/* Axis scale markers */}
|
|
220
|
+
<text
|
|
221
|
+
x={padding}
|
|
222
|
+
y={size - 8}
|
|
223
|
+
textAnchor="middle"
|
|
224
|
+
className="text-[8px] text-gray-600 fill-current"
|
|
225
|
+
>
|
|
226
|
+
0
|
|
227
|
+
</text>
|
|
228
|
+
<text
|
|
229
|
+
x={padding + chartSize}
|
|
230
|
+
y={size - 8}
|
|
231
|
+
textAnchor="middle"
|
|
232
|
+
className="text-[8px] text-gray-600 fill-current"
|
|
233
|
+
>
|
|
234
|
+
1
|
|
235
|
+
</text>
|
|
236
|
+
</svg>
|
|
237
|
+
|
|
238
|
+
{/* Current values and quadrant */}
|
|
239
|
+
<div className="mt-3 pt-3 border-t border-white/5 space-y-2">
|
|
240
|
+
<div className="flex justify-between text-xs">
|
|
241
|
+
<span className="text-gray-500">Compliance</span>
|
|
242
|
+
<span className="text-white font-medium">
|
|
243
|
+
{(superegoCompliance * 100).toFixed(0)}%
|
|
244
|
+
</span>
|
|
245
|
+
</div>
|
|
246
|
+
<div className="flex justify-between text-xs">
|
|
247
|
+
<span className="text-gray-500">Recognition</span>
|
|
248
|
+
<span className="text-white font-medium">
|
|
249
|
+
{(recognitionSeeking * 100).toFixed(0)}%
|
|
250
|
+
</span>
|
|
251
|
+
</div>
|
|
252
|
+
<div className="flex justify-between text-xs pt-2 border-t border-white/5">
|
|
253
|
+
<span className="text-gray-500">Quadrant</span>
|
|
254
|
+
<span className="text-[#E63946] font-medium">{getQuadrantName()}</span>
|
|
255
|
+
</div>
|
|
256
|
+
</div>
|
|
257
|
+
</div>
|
|
258
|
+
);
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
export default PsychodynamicQuadrant;
|