training_case_v2 ist das kanonische Exportformat aus dem Case-Review.
Es ist die einzige Quelle fuer:
- ContextStage-Training
- Kalibrierung der festen Stages (Rule, Similarity, Behavior, Trend, Funnel)
Training selbst passiert nicht im Mod und nicht beim Spieler, sondern beim Dev im IDE.
- Spieler:
- markiert Cases im Review
- exportiert eine JSONL-Datei
- laedt die Datei im Training Hub hoch (
server/)
- Dev:
- greift im Training Hub auf Uploads zu
- trainiert/tuned ContextStage und feste Stage-Gewichte
- baut neue Mod-Versionen
Alle Exporte landen unter config/scamscreener/.
training-cases-v2.jsonl- kanonischer Voll-Case inkl. Context-Targets und Fixed-Stage-Kalibrierungen
Nur Cases mit Verdict RISK oder SAFE werden exportiert.
PENDING und IGNORED werden uebersprungen.
Jede Zeile ist genau ein JSON-Objekt. Keine Arrays ueber mehrere Zeilen.
{
"format": "training_case_v2",
"schemaVersion": 2,
"caseId": "case_000001",
"caseData": {
"label": "risk",
"messages": [
{
"index": 0,
"text": "add me on discord",
"sourceType": "player",
"speakerRole": "other",
"trigger": true,
"caseRole": "signal",
"signalTagIds": ["external_platform"],
"mappingIds": ["stage.rule::rule.external_platform"]
}
],
"caseSignalTagIds": ["external_platform"]
},
"observedPipeline": {
"scoreAtCapture": 25,
"outcomeAtCapture": "review",
"decidedByStageId": "stage.rule",
"stageResults": [
{
"stageId": "stage.rule",
"decision": "pass",
"scoreDelta": 20,
"reasonIds": ["rule.external_platform"]
}
]
},
"supervision": {
"contextStage": {
"targetLabel": "risk",
"signalMessageIndices": [0],
"contextMessageIndices": [],
"excludedMessageIndices": [],
"targetSignalTagIds": ["external_platform"]
},
"fixedStageCalibrations": [
{
"mappingId": "stage.rule::rule.external_platform",
"stageId": "stage.rule",
"reasonId": "rule.external_platform",
"action": "increase",
"strength": "strong",
"weightDeltaHint": 2,
"becauseMessageIndices": [0]
}
]
}
}caseId- neutral, stabil, export-sequenziell (
case_000001, ...)
- neutral, stabil, export-sequenziell (
caseData.messages[].mappingIds- stabile IDs fuer feste Stage-Hinweise (
stage.*::reason.*)
- stabile IDs fuer feste Stage-Hinweise (
observedPipeline.stageResults[].reasonIds- stabile maschinenlesbare Rule/Signal-IDs
supervision.contextStage- Ziel-Labels und Message-Rollen fuer spaeteres ContextStage-Training
supervision.fixedStageCalibrations- direkte Kalibrier-Hinweise fuer feste Stages
fixedStageCalibrations enthaelt:
actionincrease,decrease,keep
strengthnone,normal,strong
weightDeltaHint- numerischer Hint (
+2,-1, ...)
- numerischer Hint (
becauseMessageIndices- welche Messages den Hint begruenden
Damit kann der Dev im IDE Stage-Gewichte gezielt nachziehen, ohne freie Textauswertung.
Mapping basiert auf stabilen IDs statt Anzeige-Text.
- Stage-ID:
stage.rule,stage.behavior,stage.context, ... - Reason-ID:
rule.external_platform,behavior.repeated_message, ... - Mapping-ID:
stage.rule::rule.external_platform
Legacy-Strings werden beim Laden normalisiert, damit alte Reviews weiter nutzbar bleiben.
- UUIDs:
- nicht in persistierten Review-/Trainingsexporten
- UUID bleibt absichtlich nur in
whitelist.jsonundblacklist.json
- Spielernamen:
- duerfen in Message-Texten vorkommen
- keine teure nachtraegliche Entschluesselung/Resolver-Pflicht
- Spieler exportiert Cases (
Export for Devoder/scamscreener review export). - Spieler meldet sich im Training Hub an und laedt
training-cases-v2.jsonlhoch. - Dev legt die final geprueften Exporte in
trainingdata/(rekursiv, beliebige Unterordner). - Dev startet den Autotuner:
- Dry run:
.\scripts\auto_tune_pipeline.ps1 -TrainingDataDir trainingdata -RulesFile run/config/scamscreener/rules.json
- Apply:
.\scripts\auto_tune_pipeline.ps1 -TrainingDataDir trainingdata -RulesFile run/config/scamscreener/rules.json -Apply
- Dry run:
- Dev validiert das Ergebnis in Tests und Ingame.
- Dev trainiert/entwickelt ContextStage optional weiter direkt aus
training-cases-v2.jsonl. - Dev liefert neue Mod-Version.
- Aggregiert alle
weightDeltaHintWerte promappingId. - Rechnet daraus begrenzte Schrittweiten (
MaxStep) mit Konflikt-Daempfung. - Schreibt neue Score-/Threshold-Werte in
rules.autotuned.json(oder direkt inrules.jsonmit-Apply). - Nutzt stabile IDs (
stage.*::reason.*), keine UI-Texte.