@elizaos/training 2.0.0-alpha.11
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/Dockerfile +75 -0
- package/Makefile +374 -0
- package/README.md +346 -0
- package/config/rubrics.json +137 -0
- package/data/.gitkeep +0 -0
- package/data/degen/.gitkeep +2 -0
- package/data/trader/.gitkeep +2 -0
- package/docker-compose.test.yml +57 -0
- package/package.json +58 -0
- package/python/config/babylon_atropos.yaml +90 -0
- package/python/config/profiles/12gb.json +11 -0
- package/python/config/profiles/16gb.json +10 -0
- package/python/config/profiles/24gb.json +10 -0
- package/python/config/profiles/48gb.json +10 -0
- package/python/config/profiles/cpu.json +11 -0
- package/python/config/profiles/l40-2gpu-safe.json +20 -0
- package/python/config/profiles/l40-2gpu.json +22 -0
- package/python/config/profiles/l40-4gpu.json +21 -0
- package/python/config/profiles/l40.json +17 -0
- package/python/config/tinker_training.yaml +143 -0
- package/python/curriculum_state.json +165 -0
- package/python/env.template +86 -0
- package/python/env.training.template +46 -0
- package/python/pyproject.toml +41 -0
- package/python/requirements-ci.txt +31 -0
- package/python/requirements.txt +87 -0
- package/python/scripts/__init__.py +4 -0
- package/python/scripts/import_json_trajectories.py +412 -0
- package/python/scripts/local-finetune/README.md +63 -0
- package/python/scripts/local-finetune/ingest_and_score.py +139 -0
- package/python/scripts/local-finetune/merge_model.py +32 -0
- package/python/scripts/local-finetune/test_adapter.py +91 -0
- package/python/scripts/local-finetune/train_from_csv.py +132 -0
- package/python/scripts/merge_trajectories.py +318 -0
- package/python/scripts/run_ab_test.py +143 -0
- package/python/scripts/run_full_pipeline.py +544 -0
- package/python/scripts/run_tinker_training.py +192 -0
- package/python/scripts/run_training.py +914 -0
- package/python/scripts/test_judge.py +155 -0
- package/python/scripts/test_pipeline.py +356 -0
- package/python/scripts/test_trained_model.py +380 -0
- package/python/scripts/train_local.py +528 -0
- package/python/setup.py +20 -0
- package/python/src/__init__.py +190 -0
- package/python/src/data_bridge/__init__.py +24 -0
- package/python/src/data_bridge/converter.py +435 -0
- package/python/src/data_bridge/reader.py +393 -0
- package/python/src/models.py +283 -0
- package/python/src/training/__init__.py +605 -0
- package/python/src/training/ab_testing.py +404 -0
- package/python/src/training/action_executor.py +621 -0
- package/python/src/training/archetype_trainer.py +347 -0
- package/python/src/training/atropos_trainer.py +980 -0
- package/python/src/training/babylon_env.py +1254 -0
- package/python/src/training/error_recovery.py +647 -0
- package/python/src/training/evaluation.py +856 -0
- package/python/src/training/fast_simulator.py +880 -0
- package/python/src/training/format_validator.py +584 -0
- package/python/src/training/hybrid_env.py +522 -0
- package/python/src/training/kl_controller.py +628 -0
- package/python/src/training/multi_prompt_dataset.py +883 -0
- package/python/src/training/multi_turn.py +656 -0
- package/python/src/training/online_env.py +1084 -0
- package/python/src/training/quality_scorer.py +391 -0
- package/python/src/training/quality_utils.py +633 -0
- package/python/src/training/rewards.py +1344 -0
- package/python/src/training/rlaif_env.py +17 -0
- package/python/src/training/rollout_generator.py +502 -0
- package/python/src/training/rubric_loader.py +198 -0
- package/python/src/training/scenario_pool.py +1072 -0
- package/python/src/training/schemas.py +481 -0
- package/python/src/training/service_manager.py +552 -0
- package/python/src/training/simulation_bridge.py +535 -0
- package/python/src/training/tick_reward_attribution.py +399 -0
- package/python/src/training/tinker_client.py +575 -0
- package/python/src/training/tinker_trainer.py +646 -0
- package/python/src/training/tokenization_utils.py +402 -0
- package/python/tests/e2e/__init__.py +13 -0
- package/python/tests/e2e/conftest.py +258 -0
- package/python/tests/e2e/test_full_pipeline.py +643 -0
- package/python/tests/e2e/test_online_training_e2e.py +365 -0
- package/python/tests/integration/__init__.py +12 -0
- package/python/tests/integration/conftest.py +383 -0
- package/python/tests/integration/test_db_integration.py +649 -0
- package/python/tests/integration/test_json_mode_integration.py +554 -0
- package/python/tests/test_action_executor.py +594 -0
- package/python/tests/test_archetype_scoring.py +1027 -0
- package/python/tests/test_atropos_integration.py +360 -0
- package/python/tests/test_evaluation.py +727 -0
- package/python/tests/test_format_validator.py +486 -0
- package/python/tests/test_kl_controller.py +432 -0
- package/python/tests/test_lr_scheduler.py +579 -0
- package/python/tests/test_multi_turn.py +590 -0
- package/python/tests/test_online_env.py +519 -0
- package/python/tests/test_quality_scorer.py +474 -0
- package/python/tests/test_scenario_pool.py +735 -0
- package/python/tests/test_service_manager.py +585 -0
- package/python/tests/test_simulation_rollout.py +581 -0
- package/python/tests/test_tokenization_utils.py +501 -0
- package/python/tests/test_training_orchestrator.py +497 -0
- package/python/tests/test_training_output_structure.py +661 -0
- package/research-output/training-runs/training-run-1770772042899.json +26 -0
- package/research-output/training-runs/training-run-1770930079670.json +32 -0
- package/research-output/training-runs/training-run-1770930143700.json +44 -0
- package/research-output/training-runs/training-run-1770930183638.json +38 -0
- package/research-output/training-runs/training-run-1770930442049.json +38 -0
- package/research-output/training-runs/training-run-1770930793243.json +38 -0
- package/scripts/assess-training-data.ts +422 -0
- package/scripts/e2e-training-test.ts +550 -0
- package/scripts/export-rubrics.ts +64 -0
- package/scripts/generate-research-report.ts +1523 -0
- package/scripts/generate_dataset.sh +173 -0
- package/scripts/json-mode-benchmark.ts +399 -0
- package/scripts/real-archetype-benchmark.ts +210 -0
- package/scripts/run-baseline-comparison.ts +116 -0
- package/scripts/run-full-pipeline.ts +272 -0
- package/scripts/runpod_setup.sh +137 -0
- package/scripts/runpod_validate.sh +147 -0
- package/scripts/test-model-in-game.ts +955 -0
- package/scripts/test-scoring.ts +73 -0
- package/scripts/test-trained-model.ts +209 -0
- package/scripts/train-and-test.ts +824 -0
- package/scripts/verify-final.ts +118 -0
- package/src/adapter.ts +516 -0
- package/src/archetypes/ArchetypeConfigService.ts +626 -0
- package/src/archetypes/derive-archetype.ts +249 -0
- package/src/archetypes/index.ts +22 -0
- package/src/benchmark/ArchetypeMatchupBenchmark.ts +825 -0
- package/src/benchmark/BenchmarkChartGenerator.ts +748 -0
- package/src/benchmark/BenchmarkDataGenerator.ts +1288 -0
- package/src/benchmark/BenchmarkDataViewer.ts +324 -0
- package/src/benchmark/BenchmarkHistoryService.ts +221 -0
- package/src/benchmark/BenchmarkRunner.ts +685 -0
- package/src/benchmark/BenchmarkValidator.ts +206 -0
- package/src/benchmark/FastEvalRunner.ts +225 -0
- package/src/benchmark/MetricsValidator.ts +165 -0
- package/src/benchmark/MetricsVisualizer.ts +909 -0
- package/src/benchmark/ModelBenchmarkService.ts +611 -0
- package/src/benchmark/ModelRegistry.ts +158 -0
- package/src/benchmark/RulerBenchmarkIntegration.ts +235 -0
- package/src/benchmark/SimulationA2AInterface.ts +1169 -0
- package/src/benchmark/SimulationEngine.ts +832 -0
- package/src/benchmark/__tests__/BenchmarkRunner.test.ts +534 -0
- package/src/benchmark/__tests__/HeadToHead.test.ts +126 -0
- package/src/benchmark/index.ts +89 -0
- package/src/benchmark/parseSimulationMetrics.ts +124 -0
- package/src/benchmark/simulation-types.ts +78 -0
- package/src/dependencies.ts +439 -0
- package/src/generation/TrajectoryGenerator.ts +387 -0
- package/src/generation/index.ts +12 -0
- package/src/huggingface/HuggingFaceDatasetUploader.ts +636 -0
- package/src/huggingface/HuggingFaceIntegrationService.ts +426 -0
- package/src/huggingface/HuggingFaceModelUploader.ts +532 -0
- package/src/huggingface/index.ts +27 -0
- package/src/huggingface/shared/HuggingFaceUploadUtil.ts +206 -0
- package/src/index.ts +102 -0
- package/src/init-training.ts +53 -0
- package/src/metrics/TrajectoryMetricsExtractor.ts +653 -0
- package/src/metrics/__tests__/TrajectoryMetricsExtractor.test.ts +759 -0
- package/src/metrics/index.ts +8 -0
- package/src/metrics/types.ts +200 -0
- package/src/rubrics/__tests__/index.test.ts +184 -0
- package/src/rubrics/ass-kisser.ts +85 -0
- package/src/rubrics/degen.ts +80 -0
- package/src/rubrics/goody-twoshoes.ts +84 -0
- package/src/rubrics/index.ts +236 -0
- package/src/rubrics/information-trader.ts +84 -0
- package/src/rubrics/infosec.ts +101 -0
- package/src/rubrics/liar.ts +104 -0
- package/src/rubrics/perps-trader.ts +87 -0
- package/src/rubrics/researcher.ts +81 -0
- package/src/rubrics/scammer.ts +82 -0
- package/src/rubrics/social-butterfly.ts +73 -0
- package/src/rubrics/super-predictor.ts +97 -0
- package/src/rubrics/trader.ts +67 -0
- package/src/scoring/ArchetypeScoringService.ts +486 -0
- package/src/scoring/JudgePromptBuilder.ts +556 -0
- package/src/scoring/LLMJudgeCache.ts +401 -0
- package/src/scoring/index.ts +9 -0
- package/src/training/AutomationPipeline.ts +916 -0
- package/src/training/BenchmarkService.ts +518 -0
- package/src/training/ConfigValidator.ts +220 -0
- package/src/training/MarketOutcomesTracker.ts +187 -0
- package/src/training/ModelDeployer.ts +186 -0
- package/src/training/ModelFetcher.ts +76 -0
- package/src/training/ModelSelectionService.ts +341 -0
- package/src/training/ModelUsageVerifier.ts +160 -0
- package/src/training/MultiModelOrchestrator.ts +580 -0
- package/src/training/RLModelConfig.ts +407 -0
- package/src/training/RewardBackpropagationService.ts +149 -0
- package/src/training/RulerScoringService.ts +666 -0
- package/src/training/TrainingMonitor.ts +166 -0
- package/src/training/TrajectoryRecorder.ts +399 -0
- package/src/training/__tests__/TrajectoryRecorder.test.ts +472 -0
- package/src/training/index.ts +100 -0
- package/src/training/logRLConfig.ts +34 -0
- package/src/training/pipeline.ts +129 -0
- package/src/training/storage/ModelStorageService.ts +279 -0
- package/src/training/storage/TrainingDataArchiver.ts +197 -0
- package/src/training/storage/index.ts +17 -0
- package/src/training/types.ts +207 -0
- package/src/training/window-utils.ts +138 -0
- package/src/utils/index.ts +101 -0
- package/src/utils/logger.ts +59 -0
- package/src/utils/snowflake.ts +17 -0
- package/src/utils/synthetic-detector.ts +111 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archetype Evaluation Rubrics
|
|
3
|
+
*
|
|
4
|
+
* LLM judge rubrics for each agent archetype defining what "success" means.
|
|
5
|
+
* Each archetype has specific scoring criteria tailored to its behavioral goals.
|
|
6
|
+
*
|
|
7
|
+
* @packageDocumentation
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { createHash } from 'crypto';
|
|
11
|
+
import { ASS_KISSER_PRIORITY_METRICS, ASS_KISSER_RUBRIC } from './ass-kisser';
|
|
12
|
+
import { DEGEN_PRIORITY_METRICS, DEGEN_RUBRIC } from './degen';
|
|
13
|
+
import {
|
|
14
|
+
GOODY_TWOSHOES_PRIORITY_METRICS,
|
|
15
|
+
GOODY_TWOSHOES_RUBRIC,
|
|
16
|
+
} from './goody-twoshoes';
|
|
17
|
+
import {
|
|
18
|
+
INFORMATION_TRADER_PRIORITY_METRICS,
|
|
19
|
+
INFORMATION_TRADER_RUBRIC,
|
|
20
|
+
} from './information-trader';
|
|
21
|
+
import { INFOSEC_PRIORITY_METRICS, INFOSEC_RUBRIC } from './infosec';
|
|
22
|
+
import { LIAR_PRIORITY_METRICS, LIAR_RUBRIC } from './liar';
|
|
23
|
+
import {
|
|
24
|
+
PERPS_TRADER_PRIORITY_METRICS,
|
|
25
|
+
PERPS_TRADER_RUBRIC,
|
|
26
|
+
} from './perps-trader';
|
|
27
|
+
import { RESEARCHER_PRIORITY_METRICS, RESEARCHER_RUBRIC } from './researcher';
|
|
28
|
+
import { SCAMMER_PRIORITY_METRICS, SCAMMER_RUBRIC } from './scammer';
|
|
29
|
+
import {
|
|
30
|
+
SOCIAL_BUTTERFLY_PRIORITY_METRICS,
|
|
31
|
+
SOCIAL_BUTTERFLY_RUBRIC,
|
|
32
|
+
} from './social-butterfly';
|
|
33
|
+
import {
|
|
34
|
+
SUPER_PREDICTOR_PRIORITY_METRICS,
|
|
35
|
+
SUPER_PREDICTOR_RUBRIC,
|
|
36
|
+
} from './super-predictor';
|
|
37
|
+
import { TRADER_PRIORITY_METRICS, TRADER_RUBRIC } from './trader';
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Default rubric for unknown archetypes
|
|
41
|
+
*/
|
|
42
|
+
export const DEFAULT_RUBRIC = `
|
|
43
|
+
## General Agent Evaluation
|
|
44
|
+
|
|
45
|
+
You are evaluating an AI agent's performance in a prediction market simulation.
|
|
46
|
+
|
|
47
|
+
### Scoring Criteria (0.0 to 1.0)
|
|
48
|
+
- **Profitability**: Higher P&L should receive higher scores
|
|
49
|
+
- **Risk Management**: Balanced positions and avoiding excessive losses
|
|
50
|
+
- **Efficiency**: Achieving goals with fewer actions is better
|
|
51
|
+
- **Decision Quality**: Good reasoning and analysis before actions
|
|
52
|
+
|
|
53
|
+
### Scoring Guidelines
|
|
54
|
+
- 0.8-1.0: Excellent performance, consistent profits, good risk management
|
|
55
|
+
- 0.6-0.8: Good performance, positive P&L, reasonable decisions
|
|
56
|
+
- 0.4-0.6: Average performance, mixed results
|
|
57
|
+
- 0.2-0.4: Below average, some losses, questionable decisions
|
|
58
|
+
- 0.0-0.2: Poor performance, significant losses, poor decision making
|
|
59
|
+
|
|
60
|
+
Compare trajectories RELATIVE to each other within this group.
|
|
61
|
+
If one trajectory is significantly better, reflect that in score differences.
|
|
62
|
+
`;
|
|
63
|
+
|
|
64
|
+
export const DEFAULT_PRIORITY_METRICS = [
|
|
65
|
+
'trading.totalPnL',
|
|
66
|
+
'trading.winRate',
|
|
67
|
+
'behavior.actionSuccessRate',
|
|
68
|
+
'behavior.episodeLength',
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Registry of all archetype rubrics
|
|
73
|
+
*/
|
|
74
|
+
export const RUBRICS: Record<string, string> = {
|
|
75
|
+
trader: TRADER_RUBRIC,
|
|
76
|
+
'social-butterfly': SOCIAL_BUTTERFLY_RUBRIC,
|
|
77
|
+
scammer: SCAMMER_RUBRIC,
|
|
78
|
+
degen: DEGEN_RUBRIC,
|
|
79
|
+
researcher: RESEARCHER_RUBRIC,
|
|
80
|
+
'information-trader': INFORMATION_TRADER_RUBRIC,
|
|
81
|
+
'goody-twoshoes': GOODY_TWOSHOES_RUBRIC,
|
|
82
|
+
'ass-kisser': ASS_KISSER_RUBRIC,
|
|
83
|
+
'perps-trader': PERPS_TRADER_RUBRIC,
|
|
84
|
+
'super-predictor': SUPER_PREDICTOR_RUBRIC,
|
|
85
|
+
infosec: INFOSEC_RUBRIC,
|
|
86
|
+
liar: LIAR_RUBRIC,
|
|
87
|
+
// Aliases
|
|
88
|
+
socialbutterfly: SOCIAL_BUTTERFLY_RUBRIC,
|
|
89
|
+
goodytwoshoes: GOODY_TWOSHOES_RUBRIC,
|
|
90
|
+
asskisser: ASS_KISSER_RUBRIC,
|
|
91
|
+
perpstrader: PERPS_TRADER_RUBRIC,
|
|
92
|
+
superpredictor: SUPER_PREDICTOR_RUBRIC,
|
|
93
|
+
informationtrader: INFORMATION_TRADER_RUBRIC,
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Priority metrics for each archetype
|
|
98
|
+
*/
|
|
99
|
+
export const PRIORITY_METRICS: Record<string, string[]> = {
|
|
100
|
+
trader: TRADER_PRIORITY_METRICS,
|
|
101
|
+
'social-butterfly': SOCIAL_BUTTERFLY_PRIORITY_METRICS,
|
|
102
|
+
scammer: SCAMMER_PRIORITY_METRICS,
|
|
103
|
+
degen: DEGEN_PRIORITY_METRICS,
|
|
104
|
+
researcher: RESEARCHER_PRIORITY_METRICS,
|
|
105
|
+
'information-trader': INFORMATION_TRADER_PRIORITY_METRICS,
|
|
106
|
+
'goody-twoshoes': GOODY_TWOSHOES_PRIORITY_METRICS,
|
|
107
|
+
'ass-kisser': ASS_KISSER_PRIORITY_METRICS,
|
|
108
|
+
'perps-trader': PERPS_TRADER_PRIORITY_METRICS,
|
|
109
|
+
'super-predictor': SUPER_PREDICTOR_PRIORITY_METRICS,
|
|
110
|
+
infosec: INFOSEC_PRIORITY_METRICS,
|
|
111
|
+
liar: LIAR_PRIORITY_METRICS,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Valid canonical archetype names for whitelist validation
|
|
116
|
+
* Derived from RUBRICS keys to maintain single source of truth
|
|
117
|
+
*/
|
|
118
|
+
export const VALID_ARCHETYPES = new Set(Object.keys(RUBRICS));
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Normalize archetype string to canonical format (lowercase, hyphens)
|
|
122
|
+
* Returns 'default' for empty/null values
|
|
123
|
+
* Note: Does NOT validate against whitelist - use sanitizeArchetype() for that
|
|
124
|
+
*/
|
|
125
|
+
export function normalizeArchetype(
|
|
126
|
+
archetype: string | null | undefined
|
|
127
|
+
): string {
|
|
128
|
+
if (!archetype || archetype.trim() === '') {
|
|
129
|
+
return 'default';
|
|
130
|
+
}
|
|
131
|
+
return archetype.toLowerCase().trim().replace(/_/g, '-');
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Validate that an archetype is in the allowed whitelist
|
|
136
|
+
* Prevents prompt injection attacks via malicious archetype strings
|
|
137
|
+
*/
|
|
138
|
+
export function isValidArchetype(archetype: string): boolean {
|
|
139
|
+
const normalized = normalizeArchetype(archetype);
|
|
140
|
+
return normalized === 'default' || VALID_ARCHETYPES.has(normalized);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Sanitize archetype for safe use in LLM prompts
|
|
145
|
+
* Returns normalized archetype if valid, 'default' otherwise
|
|
146
|
+
*/
|
|
147
|
+
export function sanitizeArchetype(
|
|
148
|
+
archetype: string | null | undefined
|
|
149
|
+
): string {
|
|
150
|
+
const normalized = normalizeArchetype(archetype);
|
|
151
|
+
if (normalized === 'default' || VALID_ARCHETYPES.has(normalized)) {
|
|
152
|
+
return normalized;
|
|
153
|
+
}
|
|
154
|
+
return 'default';
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Get the rubric for an archetype
|
|
159
|
+
*/
|
|
160
|
+
export function getRubric(archetype: string): string {
|
|
161
|
+
const normalized = normalizeArchetype(archetype);
|
|
162
|
+
return RUBRICS[normalized] || DEFAULT_RUBRIC;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Get priority metrics for an archetype
|
|
167
|
+
*/
|
|
168
|
+
export function getPriorityMetrics(archetype: string): string[] {
|
|
169
|
+
const normalized = normalizeArchetype(archetype);
|
|
170
|
+
return PRIORITY_METRICS[normalized] || DEFAULT_PRIORITY_METRICS;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Check if an archetype has a custom rubric
|
|
175
|
+
*/
|
|
176
|
+
export function hasCustomRubric(archetype: string): boolean {
|
|
177
|
+
const normalized = normalizeArchetype(archetype);
|
|
178
|
+
return normalized in RUBRICS;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Canonical archetype names (with hyphens, no aliases)
|
|
183
|
+
* Single source of truth - derived from PRIORITY_METRICS keys which only contains canonical names
|
|
184
|
+
*/
|
|
185
|
+
export const CANONICAL_ARCHETYPES = Object.keys(
|
|
186
|
+
PRIORITY_METRICS
|
|
187
|
+
) as readonly string[];
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Get all available archetype names (canonical names only, no aliases)
|
|
191
|
+
* Uses CANONICAL_ARCHETYPES to maintain single source of truth
|
|
192
|
+
*/
|
|
193
|
+
export function getAvailableArchetypes(): string[] {
|
|
194
|
+
return [...CANONICAL_ARCHETYPES];
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Re-export individual rubrics
|
|
198
|
+
export {
|
|
199
|
+
TRADER_RUBRIC,
|
|
200
|
+
SOCIAL_BUTTERFLY_RUBRIC,
|
|
201
|
+
SCAMMER_RUBRIC,
|
|
202
|
+
DEGEN_RUBRIC,
|
|
203
|
+
RESEARCHER_RUBRIC,
|
|
204
|
+
INFORMATION_TRADER_RUBRIC,
|
|
205
|
+
GOODY_TWOSHOES_RUBRIC,
|
|
206
|
+
ASS_KISSER_RUBRIC,
|
|
207
|
+
PERPS_TRADER_RUBRIC,
|
|
208
|
+
SUPER_PREDICTOR_RUBRIC,
|
|
209
|
+
INFOSEC_RUBRIC,
|
|
210
|
+
LIAR_RUBRIC,
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Rubrics version - increment when rubrics change significantly
|
|
215
|
+
* Used for cache invalidation
|
|
216
|
+
*/
|
|
217
|
+
export const RUBRICS_VERSION = '1.0.0';
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Get a hash of the rubric for an archetype
|
|
221
|
+
* Used for cache invalidation when specific rubrics change
|
|
222
|
+
*/
|
|
223
|
+
export function getRubricHash(archetype: string): string {
|
|
224
|
+
const rubric = getRubric(archetype);
|
|
225
|
+
return createHash('sha256').update(rubric).digest('hex').substring(0, 16);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Get the hash of all rubrics combined
|
|
230
|
+
* Used for detecting any rubric changes
|
|
231
|
+
* Note: Sorted to match Python implementation for cross-language consistency
|
|
232
|
+
*/
|
|
233
|
+
export function getAllRubricsHash(): string {
|
|
234
|
+
const allRubrics = Object.values(RUBRICS).sort().join('::') + DEFAULT_RUBRIC;
|
|
235
|
+
return createHash('sha256').update(allRubrics).digest('hex').substring(0, 16);
|
|
236
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Information Trader Archetype Evaluation Rubric
|
|
3
|
+
*
|
|
4
|
+
* Gathers intel through social channels and trades on information advantage
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const INFORMATION_TRADER_RUBRIC = `
|
|
8
|
+
## Information Trader Archetype Evaluation
|
|
9
|
+
|
|
10
|
+
You are evaluating an agent that combines social intelligence with trading, gathering information through conversations and relationships to gain trading edges.
|
|
11
|
+
|
|
12
|
+
### What Makes an Excellent Information Trader (0.8-1.0)
|
|
13
|
+
- **Social intelligence for trading**: Gathers info through DMs and group chats
|
|
14
|
+
- **Timing correlation**: Trades happen AFTER receiving information
|
|
15
|
+
- **Positive P&L from info edge**: Profits come from information advantage
|
|
16
|
+
- **Strategic networking**: Connects with informed sources
|
|
17
|
+
- **Information synthesis**: Combines social intel with market data
|
|
18
|
+
- **Balanced activity**: Active in both social and trading (ratio ~1.0)
|
|
19
|
+
- **Asks good questions**: Requests specific information
|
|
20
|
+
|
|
21
|
+
### What Makes a Good Information Trader (0.6-0.8)
|
|
22
|
+
- Active in group chats for market intel
|
|
23
|
+
- Some DM conversations with other traders
|
|
24
|
+
- Trading activity correlates with info received
|
|
25
|
+
- Reasonable P&L with evidence of info-driven trades
|
|
26
|
+
- Social to trade ratio between 0.5-1.5
|
|
27
|
+
|
|
28
|
+
### What Makes an Average Information Trader (0.4-0.6)
|
|
29
|
+
- Some social activity but not clearly for intel
|
|
30
|
+
- Trades don't clearly follow information received
|
|
31
|
+
- Either too social (not trading on info) or too trading-focused (not gathering info)
|
|
32
|
+
- Mixed results without clear information edge
|
|
33
|
+
|
|
34
|
+
### What Makes a Poor Information Trader (0.0-0.4)
|
|
35
|
+
- **No social intel gathering**: Trades blind
|
|
36
|
+
- **Pure social, no trading**: Gathers info but doesn't act on it
|
|
37
|
+
- **Pure trading, no social**: Misses information advantage
|
|
38
|
+
- **Bad timing**: Trades BEFORE gathering relevant info
|
|
39
|
+
- **Ignores information**: Has access but doesn't use it
|
|
40
|
+
|
|
41
|
+
### Key Metrics to Prioritize (in order)
|
|
42
|
+
1. **P&L** (must convert info to profit)
|
|
43
|
+
2. **Group Chats Joined** (information sources)
|
|
44
|
+
3. **DMs with users** (private intel channels)
|
|
45
|
+
4. **Social to Trade Ratio** (should be balanced ~0.8-1.2)
|
|
46
|
+
5. **Info Requests Sent** (actively seeking intel)
|
|
47
|
+
6. **Win Rate** (info should improve accuracy)
|
|
48
|
+
|
|
49
|
+
### The Information → Trade Pipeline
|
|
50
|
+
Look for this pattern:
|
|
51
|
+
1. Join group chat or start DM
|
|
52
|
+
2. Gather information (ask questions, observe)
|
|
53
|
+
3. Analyze/synthesize intel
|
|
54
|
+
4. Execute trade based on information
|
|
55
|
+
5. Profit from edge
|
|
56
|
+
|
|
57
|
+
If this pipeline is evident, score high. If trades are random or info gathering doesn't lead to trades, score low.
|
|
58
|
+
|
|
59
|
+
### Scoring Guidance
|
|
60
|
+
An information trader with $80 P&L who clearly gathered intel from 5 group chats before trading should score HIGHER than one with $150 P&L who just traded technically without social engagement.
|
|
61
|
+
|
|
62
|
+
The key question: Did they USE social connections for trading advantage?
|
|
63
|
+
|
|
64
|
+
### Common Failure Modes
|
|
65
|
+
- **The Socializer**: Lots of chat activity but never trades (wrong archetype)
|
|
66
|
+
- **The Lone Wolf**: Great trading but no social intel (wrong archetype)
|
|
67
|
+
- **The Bad Timer**: Gets info but trades too late/early
|
|
68
|
+
- **The Ignorer**: Receives intel but doesn't act on it
|
|
69
|
+
|
|
70
|
+
### Balance is Key
|
|
71
|
+
The information trader must balance both sides:
|
|
72
|
+
- Too much social, not enough trading = Social Butterfly, not Info Trader
|
|
73
|
+
- Too much trading, not enough social = Trader, not Info Trader
|
|
74
|
+
- Balance with info-to-trade pipeline = Excellent Info Trader
|
|
75
|
+
`;
|
|
76
|
+
|
|
77
|
+
export const INFORMATION_TRADER_PRIORITY_METRICS = [
|
|
78
|
+
'trading.totalPnL',
|
|
79
|
+
'social.groupChatsJoined',
|
|
80
|
+
'social.dmsInitiated',
|
|
81
|
+
'behavior.socialToTradeRatio',
|
|
82
|
+
'information.infoRequestsSent',
|
|
83
|
+
'trading.winRate',
|
|
84
|
+
];
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infosec Archetype Evaluation Rubric
|
|
3
|
+
*
|
|
4
|
+
* Security-focused, skeptical agent that protects against manipulation
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const INFOSEC_RUBRIC = `
|
|
8
|
+
## Infosec Archetype Evaluation
|
|
9
|
+
|
|
10
|
+
You are evaluating an agent with a security-first mindset - skeptical of claims, protective of information, and resistant to manipulation.
|
|
11
|
+
|
|
12
|
+
### What Makes an Excellent Infosec Agent (0.8-1.0)
|
|
13
|
+
- **Skeptical behavior**: Questions claims and information sources
|
|
14
|
+
- **Information protection**: Doesn't share sensitive data carelessly
|
|
15
|
+
- **Manipulation resistance**: Doesn't fall for obvious schemes
|
|
16
|
+
- **Verification habits**: Checks information before acting
|
|
17
|
+
- **Cautious trading**: Doesn't chase unverified tips
|
|
18
|
+
- **Steady performance**: Avoids major losses from scams/traps
|
|
19
|
+
- **Counter-intelligence**: Identifies and avoids manipulation attempts
|
|
20
|
+
|
|
21
|
+
### What Makes a Good Infosec Agent (0.6-0.8)
|
|
22
|
+
- Generally skeptical of unverified claims
|
|
23
|
+
- Some verification behavior
|
|
24
|
+
- Avoids obvious manipulation
|
|
25
|
+
- Conservative trading approach
|
|
26
|
+
- Reasonable information security
|
|
27
|
+
|
|
28
|
+
### What Makes an Average Infosec Agent (0.4-0.6)
|
|
29
|
+
- Sometimes skeptical, sometimes gullible
|
|
30
|
+
- Inconsistent verification
|
|
31
|
+
- Mixed results with manipulation attempts
|
|
32
|
+
- Average caution level
|
|
33
|
+
|
|
34
|
+
### What Makes a Poor Infosec Agent (0.0-0.4)
|
|
35
|
+
- **Gullible**: Falls for manipulation/misinformation
|
|
36
|
+
- **Careless information sharing**: Reveals sensitive data
|
|
37
|
+
- **No verification**: Acts on unverified information
|
|
38
|
+
- **Major losses from scams**: Gets exploited
|
|
39
|
+
- **Over-trusting**: Doesn't question claims
|
|
40
|
+
|
|
41
|
+
### Key Metrics to Prioritize (in order)
|
|
42
|
+
1. **Max Drawdown** (losses from being exploited)
|
|
43
|
+
2. **Win Rate** (not falling for bad trades)
|
|
44
|
+
3. **Information Shared** (should be LOW - protective)
|
|
45
|
+
4. **DM Response Rate** (cautious engagement)
|
|
46
|
+
5. **Consistency Score** (steady, not reactive)
|
|
47
|
+
|
|
48
|
+
### Security Mindset Indicators
|
|
49
|
+
Look for behaviors that indicate security awareness:
|
|
50
|
+
- Verifying before acting
|
|
51
|
+
- Questioning suspicious claims
|
|
52
|
+
- Not sharing location/holdings/strategy
|
|
53
|
+
- Slow, deliberate responses (not impulsive)
|
|
54
|
+
- Maintaining operational security
|
|
55
|
+
|
|
56
|
+
### What NOT to See
|
|
57
|
+
- Acting on unverified tips immediately
|
|
58
|
+
- Sharing portfolio details publicly
|
|
59
|
+
- Falling for "insider info" claims
|
|
60
|
+
- Impulsive responses to urgent requests
|
|
61
|
+
- Over-sharing in DMs with strangers
|
|
62
|
+
|
|
63
|
+
### Scoring Guidance
|
|
64
|
+
An infosec agent with modest P&L but no major losses from scams/manipulation should score HIGHER than one with higher P&L who clearly fell for some schemes.
|
|
65
|
+
|
|
66
|
+
The question: "Did they avoid being exploited?"
|
|
67
|
+
|
|
68
|
+
### Manipulation Resistance
|
|
69
|
+
Key test: When presented with too-good-to-be-true opportunities:
|
|
70
|
+
- Skeptical response = Good
|
|
71
|
+
- Eager response = Bad
|
|
72
|
+
|
|
73
|
+
### Information Asymmetry
|
|
74
|
+
Infosec agents should:
|
|
75
|
+
- Gather more info than they give
|
|
76
|
+
- Ask questions but deflect personal questions
|
|
77
|
+
- Maintain information advantage
|
|
78
|
+
|
|
79
|
+
Low "information shared" combined with high "information gathered" = Excellent infosec behavior.
|
|
80
|
+
|
|
81
|
+
### Caution vs Paralysis
|
|
82
|
+
Good infosec is cautious but still acts:
|
|
83
|
+
- Verifies then acts = Good
|
|
84
|
+
- Never acts due to paranoia = Average
|
|
85
|
+
- Acts without verification = Bad
|
|
86
|
+
|
|
87
|
+
### P&L Expectations
|
|
88
|
+
For infosec, steady beats spectacular:
|
|
89
|
+
- Low variance, positive P&L = Excellent
|
|
90
|
+
- High variance with some losses from schemes = Poor
|
|
91
|
+
- No trading due to over-caution = Below average
|
|
92
|
+
`;
|
|
93
|
+
|
|
94
|
+
export const INFOSEC_PRIORITY_METRICS = [
|
|
95
|
+
'trading.maxDrawdown',
|
|
96
|
+
'trading.winRate',
|
|
97
|
+
'information.infoShared',
|
|
98
|
+
'social.dmResponseRate',
|
|
99
|
+
'behavior.consistencyScore',
|
|
100
|
+
'trading.totalPnL',
|
|
101
|
+
];
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Liar Archetype Evaluation Rubric
|
|
3
|
+
*
|
|
4
|
+
* Spreads misinformation and tests others' gullibility - adversarial testing
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const LIAR_RUBRIC = `
|
|
8
|
+
## Liar Archetype Evaluation
|
|
9
|
+
|
|
10
|
+
You are evaluating an agent whose goal is to spread misinformation and false narratives to test the simulation's resistance to deception.
|
|
11
|
+
|
|
12
|
+
**IMPORTANT**: We evaluate effectiveness at deception, not ethics. This archetype helps identify vulnerabilities in information verification systems.
|
|
13
|
+
|
|
14
|
+
### What Makes an Excellent Liar (0.8-1.0)
|
|
15
|
+
- **Successful misinformation**: False claims that others believed/acted on
|
|
16
|
+
- **Believable narratives**: Lies that sound plausible
|
|
17
|
+
- **Information spread**: Misinformation propagates through network
|
|
18
|
+
- **Strategic deception**: Targeted lies at the right time
|
|
19
|
+
- **Cover maintenance**: Doesn't get caught/exposed easily
|
|
20
|
+
- **Profit from lies**: Benefits (financially or reputationally) from deception
|
|
21
|
+
|
|
22
|
+
### What Makes a Good Liar (0.6-0.8)
|
|
23
|
+
- Some successful false claims
|
|
24
|
+
- Some information spread
|
|
25
|
+
- Maintains credibility despite lying
|
|
26
|
+
- Some benefit from misinformation
|
|
27
|
+
- Partial success in deception
|
|
28
|
+
|
|
29
|
+
### What Makes an Average Liar (0.4-0.6)
|
|
30
|
+
- Mixed results with lies
|
|
31
|
+
- Some obvious, some believable
|
|
32
|
+
- Limited spread of misinformation
|
|
33
|
+
- Unclear impact of deception
|
|
34
|
+
|
|
35
|
+
### What Makes a Poor Liar (0.0-0.4)
|
|
36
|
+
- **Gets caught**: Lies are exposed
|
|
37
|
+
- **Obvious deception**: No one believes them
|
|
38
|
+
- **No spread**: Misinformation doesn't propagate
|
|
39
|
+
- **Reputation damage**: Loses trust from failed lies
|
|
40
|
+
- **No lies told**: Just tells truth (wrong archetype)
|
|
41
|
+
|
|
42
|
+
### Key Metrics to Prioritize (in order)
|
|
43
|
+
1. **Information Spread** (did lies propagate?)
|
|
44
|
+
2. **Social Engagement** (audience for lies)
|
|
45
|
+
3. **Reputation Delta** (maintained despite lying?)
|
|
46
|
+
4. **Posts Created** (platforms for misinformation)
|
|
47
|
+
5. **Group Messages** (spreading false info)
|
|
48
|
+
|
|
49
|
+
### Evaluating Lie Effectiveness
|
|
50
|
+
A good lie has these qualities:
|
|
51
|
+
- Plausible (could be true)
|
|
52
|
+
- Specific enough to be actionable
|
|
53
|
+
- Spread by others (they believed it)
|
|
54
|
+
- Had impact on behavior/decisions
|
|
55
|
+
|
|
56
|
+
### Lie Sophistication Levels
|
|
57
|
+
1. **Obvious lies** - Clearly false, no one believes (Low score)
|
|
58
|
+
2. **Plausible lies** - Could be true, some doubt (Medium score)
|
|
59
|
+
3. **Convincing lies** - Widely believed, acted upon (High score)
|
|
60
|
+
4. **Strategic lies** - Perfectly timed, maximum impact (Excellent score)
|
|
61
|
+
|
|
62
|
+
### Scoring Guidance
|
|
63
|
+
A liar who spread 3 believable false claims that others acted on should score HIGHER than one who told 10 obvious lies no one believed.
|
|
64
|
+
|
|
65
|
+
Quality and impact beat quantity.
|
|
66
|
+
|
|
67
|
+
### Cover Maintenance
|
|
68
|
+
Great liars maintain credibility:
|
|
69
|
+
- Some true statements mixed with lies
|
|
70
|
+
- Builds trust before major deception
|
|
71
|
+
- Denies or deflects when questioned
|
|
72
|
+
|
|
73
|
+
Getting caught early ruins effectiveness - score lower.
|
|
74
|
+
|
|
75
|
+
### Impact Assessment
|
|
76
|
+
Look for evidence that lies had consequences:
|
|
77
|
+
- Others traded based on false info
|
|
78
|
+
- False narratives spread in group chats
|
|
79
|
+
- Agent's reputation remained intact
|
|
80
|
+
- Confusion or misdirection achieved
|
|
81
|
+
|
|
82
|
+
### Comparison to Scammer
|
|
83
|
+
- Scammer: Profits through exploitation
|
|
84
|
+
- Liar: Spreads misinformation (may or may not profit)
|
|
85
|
+
|
|
86
|
+
A liar might lie just to see if they can, without clear profit motive. Score based on deception success, not just P&L.
|
|
87
|
+
|
|
88
|
+
### Warning Signs of NOT Being a Liar
|
|
89
|
+
- Only tells truth
|
|
90
|
+
- Corrects misinformation
|
|
91
|
+
- Fact-checks claims
|
|
92
|
+
- Transparent communication
|
|
93
|
+
|
|
94
|
+
If these dominate, score low regardless of other metrics.
|
|
95
|
+
`;
|
|
96
|
+
|
|
97
|
+
export const LIAR_PRIORITY_METRICS = [
|
|
98
|
+
'influence.informationSpread',
|
|
99
|
+
'social.uniqueUsersInteracted',
|
|
100
|
+
'influence.reputationDelta',
|
|
101
|
+
'social.postsCreated',
|
|
102
|
+
'social.groupMessagesSent',
|
|
103
|
+
'social.dmsInitiated',
|
|
104
|
+
];
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perps Trader Archetype Evaluation Rubric
|
|
3
|
+
*
|
|
4
|
+
* Leverage-focused perpetual futures trader - high risk, margin management
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const PERPS_TRADER_RUBRIC = `
|
|
8
|
+
## Perps Trader Archetype Evaluation
|
|
9
|
+
|
|
10
|
+
You are evaluating an agent specialized in perpetual futures trading with leverage, requiring strong risk management and position sizing.
|
|
11
|
+
|
|
12
|
+
### What Makes an Excellent Perps Trader (0.8-1.0)
|
|
13
|
+
- **Profitable leveraged trading**: Positive P&L on perp positions
|
|
14
|
+
- **Risk management**: Controlled drawdowns despite leverage
|
|
15
|
+
- **Position sizing**: Appropriate leverage levels (not over-leveraged)
|
|
16
|
+
- **Market timing**: Good entries and exits
|
|
17
|
+
- **Diversification**: Trades multiple perp markets
|
|
18
|
+
- **Direction calls**: Correct on market direction (long/short)
|
|
19
|
+
- **Liquidation avoidance**: Never or rarely liquidated
|
|
20
|
+
|
|
21
|
+
### What Makes a Good Perps Trader (0.6-0.8)
|
|
22
|
+
- Positive or breakeven P&L
|
|
23
|
+
- Reasonable leverage usage
|
|
24
|
+
- Some good directional calls
|
|
25
|
+
- Managed drawdown (<30%)
|
|
26
|
+
- Active perp trading
|
|
27
|
+
|
|
28
|
+
### What Makes an Average Perps Trader (0.4-0.6)
|
|
29
|
+
- Mixed results on perp trades
|
|
30
|
+
- Some over-leveraging
|
|
31
|
+
- Inconsistent direction calls
|
|
32
|
+
- Moderate drawdown
|
|
33
|
+
|
|
34
|
+
### What Makes a Poor Perps Trader (0.0-0.4)
|
|
35
|
+
- **Significant losses**: Large negative P&L
|
|
36
|
+
- **Over-leveraged**: Excessive risk taking
|
|
37
|
+
- **Liquidations**: Got liquidated on positions
|
|
38
|
+
- **Wrong direction**: Consistently wrong on market moves
|
|
39
|
+
- **High drawdown**: >50% drawdown shows poor risk management
|
|
40
|
+
- **No perp trading**: Didn't trade perps at all (wrong archetype)
|
|
41
|
+
|
|
42
|
+
### Key Metrics to Prioritize (in order)
|
|
43
|
+
1. **Total P&L** (did leverage help or hurt?)
|
|
44
|
+
2. **Max Drawdown** (risk management critical with leverage)
|
|
45
|
+
3. **Win Rate** (direction accuracy)
|
|
46
|
+
4. **Sharpe Ratio** (risk-adjusted returns)
|
|
47
|
+
5. **Trade Count** (active perp trading)
|
|
48
|
+
|
|
49
|
+
### Leverage Considerations
|
|
50
|
+
Perps trading with leverage is high-risk:
|
|
51
|
+
- Good perps traders make money WITH controlled risk
|
|
52
|
+
- Bad perps traders either over-leverage (blow up) or under-utilize leverage (not using the tool)
|
|
53
|
+
|
|
54
|
+
### Direction Calling
|
|
55
|
+
For perps, direction is critical:
|
|
56
|
+
- Long in uptrend = Good
|
|
57
|
+
- Short in downtrend = Good
|
|
58
|
+
- Long in downtrend = Bad
|
|
59
|
+
- Short in uptrend = Bad
|
|
60
|
+
|
|
61
|
+
Evaluate whether directional bets were correct.
|
|
62
|
+
|
|
63
|
+
### Scoring Guidance
|
|
64
|
+
A perps trader with $200 profit and 25% max drawdown should score HIGHER than one with $300 profit but 60% drawdown (lucky survivor vs skilled trader).
|
|
65
|
+
|
|
66
|
+
### Risk-Adjusted Performance
|
|
67
|
+
For leveraged trading, Sharpe ratio matters more than raw P&L:
|
|
68
|
+
- High P&L + High risk = Okay (got lucky)
|
|
69
|
+
- High P&L + Low risk = Excellent (skilled)
|
|
70
|
+
- Low P&L + High risk = Bad (risky AND unprofitable)
|
|
71
|
+
- Low P&L + Low risk = Below average (not utilizing leverage well)
|
|
72
|
+
|
|
73
|
+
### Social Activity
|
|
74
|
+
Perps traders should be trading-focused:
|
|
75
|
+
- Low social to trade ratio expected
|
|
76
|
+
- Information gathering for market direction is okay
|
|
77
|
+
- Too much social activity = not focused on perps
|
|
78
|
+
`;
|
|
79
|
+
|
|
80
|
+
export const PERPS_TRADER_PRIORITY_METRICS = [
|
|
81
|
+
'trading.totalPnL',
|
|
82
|
+
'trading.maxDrawdown',
|
|
83
|
+
'trading.winRate',
|
|
84
|
+
'trading.sharpeRatio',
|
|
85
|
+
'trading.tradesExecuted',
|
|
86
|
+
'behavior.socialToTradeRatio',
|
|
87
|
+
];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Researcher Archetype Evaluation Rubric
|
|
3
|
+
*
|
|
4
|
+
* Deep analysis, information gathering, data-driven decisions
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export const RESEARCHER_RUBRIC = `
|
|
8
|
+
## Researcher Archetype Evaluation
|
|
9
|
+
|
|
10
|
+
You are evaluating an agent focused on deep analysis, thorough research, and data-driven decision making before trading.
|
|
11
|
+
|
|
12
|
+
### What Makes an Excellent Researcher (0.8-1.0)
|
|
13
|
+
- **High research activity**: Many research/analysis actions
|
|
14
|
+
- **Data gathering**: Queries market data, reads news, gathers information
|
|
15
|
+
- **Informed trading**: Trades clearly follow research (timing correlation)
|
|
16
|
+
- **High prediction accuracy**: When they predict, they're usually right
|
|
17
|
+
- **Efficient trading**: Fewer but higher quality trades
|
|
18
|
+
- **Information consumption**: Actively seeks and processes data
|
|
19
|
+
- **Methodical approach**: Clear analysis before action
|
|
20
|
+
|
|
21
|
+
### What Makes a Good Researcher (0.6-0.8)
|
|
22
|
+
- Regular research activity
|
|
23
|
+
- Some correlation between research and trades
|
|
24
|
+
- Above average prediction accuracy (>60%)
|
|
25
|
+
- Evidence of market data consumption
|
|
26
|
+
- Moderate trade frequency with good win rate
|
|
27
|
+
|
|
28
|
+
### What Makes an Average Researcher (0.4-0.6)
|
|
29
|
+
- Some research but inconsistent
|
|
30
|
+
- Trades don't clearly follow research
|
|
31
|
+
- Average prediction accuracy
|
|
32
|
+
- Mixed information gathering
|
|
33
|
+
|
|
34
|
+
### What Makes a Poor Researcher (0.0-0.4)
|
|
35
|
+
- **No research activity**: Just trades without analysis
|
|
36
|
+
- **Gut-based trading**: No evidence of data-driven decisions
|
|
37
|
+
- **Low accuracy**: Predictions consistently wrong
|
|
38
|
+
- **Random trading**: No apparent methodology
|
|
39
|
+
- **Ignores data**: Has access to info but doesn't use it
|
|
40
|
+
|
|
41
|
+
### Key Metrics to Prioritize (in order)
|
|
42
|
+
1. **Research Actions** (how much analysis done)
|
|
43
|
+
2. **Prediction Accuracy** (quality of analysis)
|
|
44
|
+
3. **Market Data Queries** (information gathering)
|
|
45
|
+
4. **Win Rate** (should be above average if research works)
|
|
46
|
+
5. **News Consumed** (staying informed)
|
|
47
|
+
|
|
48
|
+
### Research-to-Trade Correlation
|
|
49
|
+
A key indicator of a good researcher is that trades happen AFTER research:
|
|
50
|
+
- Research action → Market data query → Trade
|
|
51
|
+
- Read news → Analysis → Position taken
|
|
52
|
+
- Information request → Response processed → Action
|
|
53
|
+
|
|
54
|
+
If trades happen without preceding research, that's NOT researcher behavior.
|
|
55
|
+
|
|
56
|
+
### Scoring Guidance
|
|
57
|
+
A researcher with 10 research actions, 70% prediction accuracy, but modest P&L should score HIGHER than one with great P&L but no research activity.
|
|
58
|
+
|
|
59
|
+
The question is: "Did they do their homework before trading?"
|
|
60
|
+
|
|
61
|
+
### Quality over Quantity
|
|
62
|
+
A researcher should trade LESS but MORE ACCURATELY:
|
|
63
|
+
- Low trade count + high win rate = Good
|
|
64
|
+
- High trade count + random results = Bad (that's a degen, not researcher)
|
|
65
|
+
|
|
66
|
+
### Information Synthesis
|
|
67
|
+
Look for evidence of using multiple sources:
|
|
68
|
+
- Market data + News + Social intel → Informed decision
|
|
69
|
+
- Just one source or no sources → Poor research
|
|
70
|
+
|
|
71
|
+
If they only check prices without reading news or doing analysis, score lower.
|
|
72
|
+
`;
|
|
73
|
+
|
|
74
|
+
export const RESEARCHER_PRIORITY_METRICS = [
|
|
75
|
+
'information.researchActions',
|
|
76
|
+
'information.predictionAccuracy',
|
|
77
|
+
'information.marketDataQueries',
|
|
78
|
+
'information.newsConsumed',
|
|
79
|
+
'trading.winRate',
|
|
80
|
+
'trading.totalPnL',
|
|
81
|
+
];
|