@gridlock/orchestrator 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/LICENSE +21 -0
- package/dist/AgentRoute.d.ts +44 -0
- package/dist/AgentRoute.d.ts.map +1 -0
- package/dist/AgentRoute.js +54 -0
- package/dist/AgentRoute.js.map +1 -0
- package/dist/CommandRegistry.d.ts +68 -0
- package/dist/CommandRegistry.d.ts.map +1 -0
- package/dist/CommandRegistry.js +87 -0
- package/dist/CommandRegistry.js.map +1 -0
- package/dist/ContextFactory.d.ts +62 -0
- package/dist/ContextFactory.d.ts.map +1 -0
- package/dist/ContextFactory.js +59 -0
- package/dist/ContextFactory.js.map +1 -0
- package/dist/DialogueGate.d.ts +117 -0
- package/dist/DialogueGate.d.ts.map +1 -0
- package/dist/DialogueGate.js +101 -0
- package/dist/DialogueGate.js.map +1 -0
- package/dist/DisclosureEngine.d.ts +160 -0
- package/dist/DisclosureEngine.d.ts.map +1 -0
- package/dist/DisclosureEngine.js +241 -0
- package/dist/DisclosureEngine.js.map +1 -0
- package/dist/EvidenceGraph.d.ts +71 -0
- package/dist/EvidenceGraph.d.ts.map +1 -0
- package/dist/EvidenceGraph.js +177 -0
- package/dist/EvidenceGraph.js.map +1 -0
- package/dist/InteractionEvaluator.d.ts +50 -0
- package/dist/InteractionEvaluator.d.ts.map +1 -0
- package/dist/InteractionEvaluator.js +205 -0
- package/dist/InteractionEvaluator.js.map +1 -0
- package/dist/KnowledgeBoundary.d.ts +74 -0
- package/dist/KnowledgeBoundary.d.ts.map +1 -0
- package/dist/KnowledgeBoundary.js +76 -0
- package/dist/KnowledgeBoundary.js.map +1 -0
- package/dist/evaluation/EscalationClock.d.ts +65 -0
- package/dist/evaluation/EscalationClock.d.ts.map +1 -0
- package/dist/evaluation/EscalationClock.js +106 -0
- package/dist/evaluation/EscalationClock.js.map +1 -0
- package/dist/evaluation/PerformanceEvaluator.d.ts +54 -0
- package/dist/evaluation/PerformanceEvaluator.d.ts.map +1 -0
- package/dist/evaluation/PerformanceEvaluator.js +161 -0
- package/dist/evaluation/PerformanceEvaluator.js.map +1 -0
- package/dist/evaluation/WorldState.d.ts +30 -0
- package/dist/evaluation/WorldState.d.ts.map +1 -0
- package/dist/evaluation/WorldState.js +43 -0
- package/dist/evaluation/WorldState.js.map +1 -0
- package/dist/evaluation/index.d.ts +8 -0
- package/dist/evaluation/index.d.ts.map +1 -0
- package/dist/evaluation/index.js +4 -0
- package/dist/evaluation/index.js.map +1 -0
- package/dist/evaluation/types.d.ts +26 -0
- package/dist/evaluation/types.d.ts.map +1 -0
- package/dist/evaluation/types.js +9 -0
- package/dist/evaluation/types.js.map +1 -0
- package/dist/handlers/AssistantCommandRegistry.d.ts +55 -0
- package/dist/handlers/AssistantCommandRegistry.d.ts.map +1 -0
- package/dist/handlers/AssistantCommandRegistry.js +59 -0
- package/dist/handlers/AssistantCommandRegistry.js.map +1 -0
- package/dist/handlers/EvidenceIngestion.d.ts +64 -0
- package/dist/handlers/EvidenceIngestion.d.ts.map +1 -0
- package/dist/handlers/EvidenceIngestion.js +114 -0
- package/dist/handlers/EvidenceIngestion.js.map +1 -0
- package/dist/handlers/GameLifecycle.d.ts +71 -0
- package/dist/handlers/GameLifecycle.d.ts.map +1 -0
- package/dist/handlers/GameLifecycle.js +100 -0
- package/dist/handlers/GameLifecycle.js.map +1 -0
- package/dist/handlers/GraphPopulation.d.ts +24 -0
- package/dist/handlers/GraphPopulation.d.ts.map +1 -0
- package/dist/handlers/GraphPopulation.js +21 -0
- package/dist/handlers/GraphPopulation.js.map +1 -0
- package/dist/handlers/ResolutionGate.d.ts +60 -0
- package/dist/handlers/ResolutionGate.d.ts.map +1 -0
- package/dist/handlers/ResolutionGate.js +49 -0
- package/dist/handlers/ResolutionGate.js.map +1 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/investigation/Analyst.d.ts +80 -0
- package/dist/investigation/Analyst.d.ts.map +1 -0
- package/dist/investigation/Analyst.js +514 -0
- package/dist/investigation/Analyst.js.map +1 -0
- package/dist/investigation/AnalystWorkspace.d.ts +182 -0
- package/dist/investigation/AnalystWorkspace.d.ts.map +1 -0
- package/dist/investigation/AnalystWorkspace.js +405 -0
- package/dist/investigation/AnalystWorkspace.js.map +1 -0
- package/dist/investigation/CaseFile.d.ts +92 -0
- package/dist/investigation/CaseFile.d.ts.map +1 -0
- package/dist/investigation/CaseFile.js +117 -0
- package/dist/investigation/CaseFile.js.map +1 -0
- package/dist/investigation/DiscoveryLayer.d.ts +133 -0
- package/dist/investigation/DiscoveryLayer.d.ts.map +1 -0
- package/dist/investigation/DiscoveryLayer.js +176 -0
- package/dist/investigation/DiscoveryLayer.js.map +1 -0
- package/dist/investigation/FactLedger.d.ts +91 -0
- package/dist/investigation/FactLedger.d.ts.map +1 -0
- package/dist/investigation/FactLedger.js +185 -0
- package/dist/investigation/FactLedger.js.map +1 -0
- package/dist/investigation/InvestigationTimeline.d.ts +98 -0
- package/dist/investigation/InvestigationTimeline.d.ts.map +1 -0
- package/dist/investigation/InvestigationTimeline.js +178 -0
- package/dist/investigation/InvestigationTimeline.js.map +1 -0
- package/dist/investigation/ProfileEngine.d.ts +84 -0
- package/dist/investigation/ProfileEngine.d.ts.map +1 -0
- package/dist/investigation/ProfileEngine.js +170 -0
- package/dist/investigation/ProfileEngine.js.map +1 -0
- package/dist/investigation/WorkspaceProjections.d.ts +94 -0
- package/dist/investigation/WorkspaceProjections.d.ts.map +1 -0
- package/dist/investigation/WorkspaceProjections.js +92 -0
- package/dist/investigation/WorkspaceProjections.js.map +1 -0
- package/dist/investigation/index.d.ts +18 -0
- package/dist/investigation/index.d.ts.map +1 -0
- package/dist/investigation/index.js +10 -0
- package/dist/investigation/index.js.map +1 -0
- package/dist/investigation/types.d.ts +206 -0
- package/dist/investigation/types.d.ts.map +1 -0
- package/dist/investigation/types.js +20 -0
- package/dist/investigation/types.js.map +1 -0
- package/dist/types.d.ts +283 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +70 -0
- package/dist/types.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Investigation Layer — Analyst Workspace
|
|
3
|
+
*
|
|
4
|
+
* The Analyst Workspace provides structured, deterministic views over
|
|
5
|
+
* the Fact Ledger and game state. It is a read-only query layer that
|
|
6
|
+
* organizes investigation memory into useful perspectives.
|
|
7
|
+
*
|
|
8
|
+
* Architectural boundary:
|
|
9
|
+
* - The Evidence Layer produces truth (validators, findings).
|
|
10
|
+
* - The Fact Ledger records that truth as FactRecords.
|
|
11
|
+
* - The Analyst Workspace provides structured views over those records.
|
|
12
|
+
* - SAGE (or any future consumer) formats and presents workspace output.
|
|
13
|
+
*
|
|
14
|
+
* The workspace does not produce truth, modify state, or depend on SAGE.
|
|
15
|
+
* Contradictions surfaced here originate from validator findings and are
|
|
16
|
+
* reflected into the ledger — the workspace surfaces them, not produces them.
|
|
17
|
+
*
|
|
18
|
+
* Future: this layer will support graph-based queries (MS-3a Evidence Graph).
|
|
19
|
+
*/
|
|
20
|
+
import { FactLedger } from './FactLedger.js';
|
|
21
|
+
import type { FactRecord, FactStatus, EpistemicStatus, ContradictionGroup, SubjectFindings, SubjectSummary, CorrelationInsight, ResolutionAnalysis } from './types.js';
|
|
22
|
+
export interface EvidenceInventoryItem {
|
|
23
|
+
artifactId: string;
|
|
24
|
+
artifactName: string;
|
|
25
|
+
examined: boolean;
|
|
26
|
+
linkedFacts: FactRecord[];
|
|
27
|
+
}
|
|
28
|
+
export interface WorkspaceEntityProfile {
|
|
29
|
+
characterId: string;
|
|
30
|
+
characterName: string;
|
|
31
|
+
talked: boolean;
|
|
32
|
+
facts: FactRecord[];
|
|
33
|
+
claimedCount: number;
|
|
34
|
+
observedCount: number;
|
|
35
|
+
contradictedCount: number;
|
|
36
|
+
}
|
|
37
|
+
export interface InvestigationSummary {
|
|
38
|
+
totalFacts: number;
|
|
39
|
+
byStatus: Record<FactStatus, number>;
|
|
40
|
+
bySource: Record<string, number>;
|
|
41
|
+
artifactsExamined: number;
|
|
42
|
+
artifactsAvailable: number;
|
|
43
|
+
charactersTalked: number;
|
|
44
|
+
charactersAvailable: number;
|
|
45
|
+
contradictionsFound: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Minimal read-only interface the workspace needs from the game engine.
|
|
49
|
+
* This avoids coupling the workspace to the full GameState type.
|
|
50
|
+
*/
|
|
51
|
+
export interface WorkspaceGameView {
|
|
52
|
+
caseArtifacts: Array<{
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
}>;
|
|
56
|
+
caseCharacters: Array<{
|
|
57
|
+
id: string;
|
|
58
|
+
name: string;
|
|
59
|
+
}>;
|
|
60
|
+
examinedArtifactIds: Set<string>;
|
|
61
|
+
discoveredArtifactIds: Set<string>;
|
|
62
|
+
unlockedArtifactIds: Set<string>;
|
|
63
|
+
talkedCharacterIds: Set<string>;
|
|
64
|
+
unlockedCharacterIds: Set<string>;
|
|
65
|
+
/** Required validator IDs for successful accusation. */
|
|
66
|
+
requiredValidatorIds: string[];
|
|
67
|
+
/** IDs of validators that have produced findings. */
|
|
68
|
+
satisfiedValidatorIds: string[];
|
|
69
|
+
/** Player focus tracking map (#172/359). */
|
|
70
|
+
playerFocusMap?: Map<string, number>;
|
|
71
|
+
}
|
|
72
|
+
export declare class AnalystWorkspace {
|
|
73
|
+
private readonly ledger;
|
|
74
|
+
private readonly gameView;
|
|
75
|
+
constructor(ledger: FactLedger, gameView: WorkspaceGameView);
|
|
76
|
+
/**
|
|
77
|
+
* Evidence inventory: all discovered/unlocked artifacts with their linked facts.
|
|
78
|
+
*/
|
|
79
|
+
getEvidenceInventory(): EvidenceInventoryItem[];
|
|
80
|
+
/**
|
|
81
|
+
* Entity profile: all facts related to a character, grouped with metadata.
|
|
82
|
+
*/
|
|
83
|
+
getEntityProfile(characterId: string): WorkspaceEntityProfile | undefined;
|
|
84
|
+
/**
|
|
85
|
+
* All facts for a given subject.
|
|
86
|
+
*/
|
|
87
|
+
getFactsBySubject(subject: string): FactRecord[];
|
|
88
|
+
/**
|
|
89
|
+
* All facts with a given status.
|
|
90
|
+
*/
|
|
91
|
+
getFactsByStatus(status: FactStatus): FactRecord[];
|
|
92
|
+
/**
|
|
93
|
+
* All contradiction records from the Fact Ledger.
|
|
94
|
+
* These originate from validator findings and are reflected into the ledger.
|
|
95
|
+
* The workspace surfaces them — it does not produce them.
|
|
96
|
+
*/
|
|
97
|
+
getContradictions(): FactRecord[];
|
|
98
|
+
/**
|
|
99
|
+
* High-level investigation progress summary.
|
|
100
|
+
*/
|
|
101
|
+
getInvestigationSummary(): InvestigationSummary;
|
|
102
|
+
/**
|
|
103
|
+
* Contradiction groups: clusters of related facts around each validator finding.
|
|
104
|
+
*
|
|
105
|
+
* Each group contains:
|
|
106
|
+
* - the finding record itself
|
|
107
|
+
* - the claim it contradicts (dialogue-sourced)
|
|
108
|
+
* - the evidence that disproves it (artifact/validator-sourced)
|
|
109
|
+
*
|
|
110
|
+
* Groups are assembled from relatedFactIds links in the Fact Ledger.
|
|
111
|
+
* The workspace surfaces them — it does not produce findings.
|
|
112
|
+
*/
|
|
113
|
+
getContradictionGroups(): ContradictionGroup[];
|
|
114
|
+
/**
|
|
115
|
+
* Aggregate all findings by subject (#49 — Contradiction Detection Engine).
|
|
116
|
+
*
|
|
117
|
+
* Groups contradictions and correlations per subject, providing a
|
|
118
|
+
* structured analytical summary. This is an aggregation layer above
|
|
119
|
+
* raw findings — it does not produce truth.
|
|
120
|
+
*/
|
|
121
|
+
getSubjectFindings(): SubjectFindings[];
|
|
122
|
+
/**
|
|
123
|
+
* Per-subject priority summaries.
|
|
124
|
+
*
|
|
125
|
+
* Priority is deterministic:
|
|
126
|
+
* - high: ≥2 contradictions
|
|
127
|
+
* - medium: 1 contradiction
|
|
128
|
+
* - low: no contradictions
|
|
129
|
+
*
|
|
130
|
+
* Correlations are counted but do NOT increase priority.
|
|
131
|
+
*/
|
|
132
|
+
getSubjectSummaries(): SubjectSummary[];
|
|
133
|
+
/**
|
|
134
|
+
* Top contradictions sorted by linked fact count then recency.
|
|
135
|
+
* Limited to 5 for readability.
|
|
136
|
+
*/
|
|
137
|
+
getKeyContradictions(limit?: number): ContradictionGroup[];
|
|
138
|
+
/**
|
|
139
|
+
* Correlation insights: structured identity links.
|
|
140
|
+
* Describes linkage only — no suspicion or guilt inference.
|
|
141
|
+
*/
|
|
142
|
+
getCorrelationInsights(): CorrelationInsight[];
|
|
143
|
+
/**
|
|
144
|
+
* Resolution analysis: build an evidence chain for a specific subject.
|
|
145
|
+
* Helps the player organize reasoning before accusing.
|
|
146
|
+
* Does NOT identify the culprit or recommend a target.
|
|
147
|
+
*/
|
|
148
|
+
getResolutionAnalysis(subjectId: string): ResolutionAnalysis | undefined;
|
|
149
|
+
/**
|
|
150
|
+
* Determine the epistemic status of a fact (#172/361).
|
|
151
|
+
*/
|
|
152
|
+
getEpistemicStatus(factId: string): EpistemicStatus;
|
|
153
|
+
/**
|
|
154
|
+
* Assess credibility of a source (character or artifact) (#172/363).
|
|
155
|
+
*/
|
|
156
|
+
getSourceCredibility(sourceId: string): {
|
|
157
|
+
credibility: 'unreliable' | 'questionable' | 'neutral' | 'credible';
|
|
158
|
+
contradictionCount: number;
|
|
159
|
+
factCount: number;
|
|
160
|
+
rationale: string;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Assess investigation coverage and detect focus imbalance (#172/359).
|
|
164
|
+
*/
|
|
165
|
+
getInvestigationCoverage(): {
|
|
166
|
+
characterCoverage: Array<{
|
|
167
|
+
id: string;
|
|
168
|
+
name: string;
|
|
169
|
+
interactions: number;
|
|
170
|
+
}>;
|
|
171
|
+
artifactCoverage: Array<{
|
|
172
|
+
id: string;
|
|
173
|
+
name: string;
|
|
174
|
+
examined: boolean;
|
|
175
|
+
}>;
|
|
176
|
+
focusImbalance: {
|
|
177
|
+
overFocused: string[];
|
|
178
|
+
neglected: string[];
|
|
179
|
+
} | null;
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=AnalystWorkspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalystWorkspace.d.ts","sourceRoot":"","sources":["../../src/investigation/AnalystWorkspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Investigation Layer — Analyst Workspace
|
|
3
|
+
*
|
|
4
|
+
* The Analyst Workspace provides structured, deterministic views over
|
|
5
|
+
* the Fact Ledger and game state. It is a read-only query layer that
|
|
6
|
+
* organizes investigation memory into useful perspectives.
|
|
7
|
+
*
|
|
8
|
+
* Architectural boundary:
|
|
9
|
+
* - The Evidence Layer produces truth (validators, findings).
|
|
10
|
+
* - The Fact Ledger records that truth as FactRecords.
|
|
11
|
+
* - The Analyst Workspace provides structured views over those records.
|
|
12
|
+
* - SAGE (or any future consumer) formats and presents workspace output.
|
|
13
|
+
*
|
|
14
|
+
* The workspace does not produce truth, modify state, or depend on SAGE.
|
|
15
|
+
* Contradictions surfaced here originate from validator findings and are
|
|
16
|
+
* reflected into the ledger — the workspace surfaces them, not produces them.
|
|
17
|
+
*
|
|
18
|
+
* Future: this layer will support graph-based queries (MS-3a Evidence Graph).
|
|
19
|
+
*/
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// AnalystWorkspace
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
export class AnalystWorkspace {
|
|
24
|
+
ledger;
|
|
25
|
+
gameView;
|
|
26
|
+
constructor(ledger, gameView) {
|
|
27
|
+
this.ledger = ledger;
|
|
28
|
+
this.gameView = gameView;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Evidence inventory: all discovered/unlocked artifacts with their linked facts.
|
|
32
|
+
*/
|
|
33
|
+
getEvidenceInventory() {
|
|
34
|
+
const items = [];
|
|
35
|
+
for (const artifact of this.gameView.caseArtifacts) {
|
|
36
|
+
// Only show artifacts the player knows about
|
|
37
|
+
if (!this.gameView.discoveredArtifactIds.has(artifact.id) &&
|
|
38
|
+
!this.gameView.unlockedArtifactIds.has(artifact.id)) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const examined = this.gameView.examinedArtifactIds.has(artifact.id);
|
|
42
|
+
const linkedFacts = this.ledger
|
|
43
|
+
.getAll()
|
|
44
|
+
.filter(r => r.relatedArtifactIds.includes(artifact.id));
|
|
45
|
+
items.push({
|
|
46
|
+
artifactId: artifact.id,
|
|
47
|
+
artifactName: artifact.name,
|
|
48
|
+
examined,
|
|
49
|
+
linkedFacts,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return items;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Entity profile: all facts related to a character, grouped with metadata.
|
|
56
|
+
*/
|
|
57
|
+
getEntityProfile(characterId) {
|
|
58
|
+
const character = this.gameView.caseCharacters.find(c => c.id === characterId);
|
|
59
|
+
if (!character)
|
|
60
|
+
return undefined;
|
|
61
|
+
// Only show profiles for characters the player has access to
|
|
62
|
+
if (!this.gameView.unlockedCharacterIds.has(characterId) &&
|
|
63
|
+
!this.gameView.talkedCharacterIds.has(characterId)) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const facts = this.ledger.getBySubject(characterId);
|
|
67
|
+
// Also include facts that reference this character but have a different subject
|
|
68
|
+
const referencingFacts = this.ledger
|
|
69
|
+
.getAll()
|
|
70
|
+
.filter(r => r.relatedCharacterIds.includes(characterId) &&
|
|
71
|
+
r.subject !== characterId);
|
|
72
|
+
const allFacts = [...facts, ...referencingFacts];
|
|
73
|
+
return {
|
|
74
|
+
characterId,
|
|
75
|
+
characterName: character.name,
|
|
76
|
+
talked: this.gameView.talkedCharacterIds.has(characterId),
|
|
77
|
+
facts: allFacts,
|
|
78
|
+
claimedCount: allFacts.filter(f => f.status === 'claimed').length,
|
|
79
|
+
observedCount: allFacts.filter(f => f.status === 'observed').length,
|
|
80
|
+
contradictedCount: allFacts.filter(f => f.status === 'contradicted').length,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* All facts for a given subject.
|
|
85
|
+
*/
|
|
86
|
+
getFactsBySubject(subject) {
|
|
87
|
+
return this.ledger.getBySubject(subject);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* All facts with a given status.
|
|
91
|
+
*/
|
|
92
|
+
getFactsByStatus(status) {
|
|
93
|
+
return this.ledger.getByStatus(status);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* All contradiction records from the Fact Ledger.
|
|
97
|
+
* These originate from validator findings and are reflected into the ledger.
|
|
98
|
+
* The workspace surfaces them — it does not produce them.
|
|
99
|
+
*/
|
|
100
|
+
getContradictions() {
|
|
101
|
+
return this.ledger.getByStatus('contradicted');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* High-level investigation progress summary.
|
|
105
|
+
*/
|
|
106
|
+
getInvestigationSummary() {
|
|
107
|
+
const allFacts = this.ledger.getAll();
|
|
108
|
+
const byStatus = {
|
|
109
|
+
claimed: 0,
|
|
110
|
+
observed: 0,
|
|
111
|
+
contradicted: 0,
|
|
112
|
+
supported: 0,
|
|
113
|
+
};
|
|
114
|
+
const bySource = {
|
|
115
|
+
artifact: 0,
|
|
116
|
+
dialogue: 0,
|
|
117
|
+
validator: 0,
|
|
118
|
+
player: 0,
|
|
119
|
+
};
|
|
120
|
+
for (const fact of allFacts) {
|
|
121
|
+
byStatus[fact.status]++;
|
|
122
|
+
bySource[fact.sourceType]++;
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
totalFacts: allFacts.length,
|
|
126
|
+
byStatus,
|
|
127
|
+
bySource,
|
|
128
|
+
artifactsExamined: this.gameView.examinedArtifactIds.size,
|
|
129
|
+
artifactsAvailable: this.gameView.unlockedArtifactIds.size,
|
|
130
|
+
charactersTalked: this.gameView.talkedCharacterIds.size,
|
|
131
|
+
charactersAvailable: this.gameView.unlockedCharacterIds.size,
|
|
132
|
+
contradictionsFound: byStatus.contradicted,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Contradiction groups: clusters of related facts around each validator finding.
|
|
137
|
+
*
|
|
138
|
+
* Each group contains:
|
|
139
|
+
* - the finding record itself
|
|
140
|
+
* - the claim it contradicts (dialogue-sourced)
|
|
141
|
+
* - the evidence that disproves it (artifact/validator-sourced)
|
|
142
|
+
*
|
|
143
|
+
* Groups are assembled from relatedFactIds links in the Fact Ledger.
|
|
144
|
+
* The workspace surfaces them — it does not produce findings.
|
|
145
|
+
*/
|
|
146
|
+
getContradictionGroups() {
|
|
147
|
+
const groups = [];
|
|
148
|
+
// Find all validator-sourced records (these are the findings)
|
|
149
|
+
const findingRecords = this.ledger.getBySourceType('validator');
|
|
150
|
+
for (const findingRec of findingRecords) {
|
|
151
|
+
if (findingRec.status !== 'contradicted')
|
|
152
|
+
continue;
|
|
153
|
+
// Collect all linked records
|
|
154
|
+
const linkedRecords = [];
|
|
155
|
+
for (const relId of findingRec.relatedFactIds) {
|
|
156
|
+
const linked = this.ledger.getById(relId);
|
|
157
|
+
if (linked)
|
|
158
|
+
linkedRecords.push(linked);
|
|
159
|
+
}
|
|
160
|
+
// Separate into claim (dialogue) and evidence (artifact/validator)
|
|
161
|
+
const claimRecord = linkedRecords.find(r => r.sourceType === 'dialogue');
|
|
162
|
+
const evidenceRecords = linkedRecords.filter(r => r.sourceType !== 'dialogue');
|
|
163
|
+
groups.push({
|
|
164
|
+
id: `cg-${findingRec.sourceId}`,
|
|
165
|
+
findingId: findingRec.sourceId,
|
|
166
|
+
findingText: findingRec.statement,
|
|
167
|
+
subject: findingRec.subject,
|
|
168
|
+
claimRecord,
|
|
169
|
+
evidenceRecords,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return groups;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Aggregate all findings by subject (#49 — Contradiction Detection Engine).
|
|
176
|
+
*
|
|
177
|
+
* Groups contradictions and correlations per subject, providing a
|
|
178
|
+
* structured analytical summary. This is an aggregation layer above
|
|
179
|
+
* raw findings — it does not produce truth.
|
|
180
|
+
*/
|
|
181
|
+
getSubjectFindings() {
|
|
182
|
+
const contradictionGroups = this.getContradictionGroups();
|
|
183
|
+
const correlationRecords = this.ledger.getAll().filter(r => r.sourceType === 'validator' && r.status !== 'contradicted' && r.status !== 'observed' && r.statement.includes('correlation'));
|
|
184
|
+
// Collect all subjects that have any findings
|
|
185
|
+
const subjectSet = new Set();
|
|
186
|
+
for (const g of contradictionGroups)
|
|
187
|
+
subjectSet.add(g.subject);
|
|
188
|
+
for (const r of correlationRecords)
|
|
189
|
+
subjectSet.add(r.subject);
|
|
190
|
+
const results = [];
|
|
191
|
+
for (const subject of subjectSet) {
|
|
192
|
+
const subjectContradictions = contradictionGroups.filter(g => g.subject === subject);
|
|
193
|
+
const subjectCorrelations = correlationRecords.filter(r => r.subject === subject || r.relatedCharacterIds.includes(subject));
|
|
194
|
+
results.push({
|
|
195
|
+
subject,
|
|
196
|
+
contradictions: subjectContradictions,
|
|
197
|
+
correlations: subjectCorrelations,
|
|
198
|
+
totalFindings: subjectContradictions.length + subjectCorrelations.length,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
// Sort by total findings descending (most suspicious subjects first)
|
|
202
|
+
results.sort((a, b) => b.totalFindings - a.totalFindings);
|
|
203
|
+
return results;
|
|
204
|
+
}
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
// Analytical Explanation Methods (MS-4b)
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
208
|
+
/**
|
|
209
|
+
* Per-subject priority summaries.
|
|
210
|
+
*
|
|
211
|
+
* Priority is deterministic:
|
|
212
|
+
* - high: ≥2 contradictions
|
|
213
|
+
* - medium: 1 contradiction
|
|
214
|
+
* - low: no contradictions
|
|
215
|
+
*
|
|
216
|
+
* Correlations are counted but do NOT increase priority.
|
|
217
|
+
*/
|
|
218
|
+
getSubjectSummaries() {
|
|
219
|
+
const subjectFindings = this.getSubjectFindings();
|
|
220
|
+
const summaries = [];
|
|
221
|
+
for (const sf of subjectFindings) {
|
|
222
|
+
const contradictionCount = sf.contradictions.length;
|
|
223
|
+
const correlationCount = sf.correlations.length;
|
|
224
|
+
// Count supported records for this subject
|
|
225
|
+
const supportCount = this.ledger
|
|
226
|
+
.getBySubject(sf.subject)
|
|
227
|
+
.filter(r => r.status === 'supported' && r.sourceType === 'validator')
|
|
228
|
+
.length;
|
|
229
|
+
let priority = 'low';
|
|
230
|
+
if (contradictionCount >= 2)
|
|
231
|
+
priority = 'high';
|
|
232
|
+
else if (contradictionCount === 1)
|
|
233
|
+
priority = 'medium';
|
|
234
|
+
summaries.push({
|
|
235
|
+
subject: sf.subject,
|
|
236
|
+
contradictionCount,
|
|
237
|
+
correlationCount,
|
|
238
|
+
supportCount,
|
|
239
|
+
priority,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
// Also include subjects with only observed/claimed facts (no findings)
|
|
243
|
+
// that appear in the game view
|
|
244
|
+
for (const char of this.gameView.caseCharacters) {
|
|
245
|
+
if (summaries.some(s => s.subject === char.id))
|
|
246
|
+
continue;
|
|
247
|
+
if (!this.gameView.talkedCharacterIds.has(char.id) && !this.gameView.unlockedCharacterIds.has(char.id))
|
|
248
|
+
continue;
|
|
249
|
+
summaries.push({
|
|
250
|
+
subject: char.id,
|
|
251
|
+
contradictionCount: 0,
|
|
252
|
+
correlationCount: 0,
|
|
253
|
+
supportCount: 0,
|
|
254
|
+
priority: 'low',
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
// Sort: high first, then medium, then low
|
|
258
|
+
const priorityOrder = { high: 0, medium: 1, low: 2 };
|
|
259
|
+
summaries.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
|
|
260
|
+
return summaries;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Top contradictions sorted by linked fact count then recency.
|
|
264
|
+
* Limited to 5 for readability.
|
|
265
|
+
*/
|
|
266
|
+
getKeyContradictions(limit = 5) {
|
|
267
|
+
const groups = this.getContradictionGroups();
|
|
268
|
+
groups.sort((a, b) => {
|
|
269
|
+
// Sort by total linked facts (claim + evidence) descending
|
|
270
|
+
const aLinks = (a.claimRecord ? 1 : 0) + a.evidenceRecords.length;
|
|
271
|
+
const bLinks = (b.claimRecord ? 1 : 0) + b.evidenceRecords.length;
|
|
272
|
+
if (bLinks !== aLinks)
|
|
273
|
+
return bLinks - aLinks;
|
|
274
|
+
// Then by recency (most recent first) using finding record discoveredAt
|
|
275
|
+
const aTime = a.claimRecord?.discoveredAt ?? '';
|
|
276
|
+
const bTime = b.claimRecord?.discoveredAt ?? '';
|
|
277
|
+
return bTime.localeCompare(aTime);
|
|
278
|
+
});
|
|
279
|
+
return groups.slice(0, limit);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Correlation insights: structured identity links.
|
|
283
|
+
* Describes linkage only — no suspicion or guilt inference.
|
|
284
|
+
*/
|
|
285
|
+
getCorrelationInsights() {
|
|
286
|
+
const correlationRecords = this.ledger.getAll().filter(r => r.sourceType === 'validator' && r.statement.includes('correlation'));
|
|
287
|
+
return correlationRecords.map(r => ({
|
|
288
|
+
subject: r.subject,
|
|
289
|
+
description: r.statement,
|
|
290
|
+
}));
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Resolution analysis: build an evidence chain for a specific subject.
|
|
294
|
+
* Helps the player organize reasoning before accusing.
|
|
295
|
+
* Does NOT identify the culprit or recommend a target.
|
|
296
|
+
*/
|
|
297
|
+
getResolutionAnalysis(subjectId) {
|
|
298
|
+
const summaries = this.getSubjectSummaries();
|
|
299
|
+
const summary = summaries.find(s => s.subject === subjectId);
|
|
300
|
+
if (!summary)
|
|
301
|
+
return undefined;
|
|
302
|
+
const contradictions = this.getContradictionGroups().filter(g => g.subject === subjectId);
|
|
303
|
+
const allFacts = this.ledger.getBySubject(subjectId);
|
|
304
|
+
const supportingEvidence = allFacts.filter(f => f.status === 'observed' || f.status === 'supported');
|
|
305
|
+
const unresolvedClaims = allFacts.filter(f => f.status === 'claimed');
|
|
306
|
+
const correlations = this.getCorrelationInsights().filter(c => c.subject === subjectId);
|
|
307
|
+
// Readiness based on whether required validators are satisfied
|
|
308
|
+
const allSatisfied = this.gameView.requiredValidatorIds.length > 0 &&
|
|
309
|
+
this.gameView.requiredValidatorIds.every(id => this.gameView.satisfiedValidatorIds.includes(id));
|
|
310
|
+
let readiness = 'not_ready';
|
|
311
|
+
if (allSatisfied) {
|
|
312
|
+
readiness = 'ready';
|
|
313
|
+
}
|
|
314
|
+
else if (contradictions.length >= 1) {
|
|
315
|
+
readiness = 'partial';
|
|
316
|
+
}
|
|
317
|
+
return {
|
|
318
|
+
subject: subjectId,
|
|
319
|
+
priority: summary.priority,
|
|
320
|
+
contradictions,
|
|
321
|
+
supportingEvidence,
|
|
322
|
+
unresolvedClaims,
|
|
323
|
+
correlations,
|
|
324
|
+
readiness,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// ---------------------------------------------------------------------------
|
|
328
|
+
// Analytical realism primitives (#172)
|
|
329
|
+
// ---------------------------------------------------------------------------
|
|
330
|
+
/**
|
|
331
|
+
* Determine the epistemic status of a fact (#172/361).
|
|
332
|
+
*/
|
|
333
|
+
getEpistemicStatus(factId) {
|
|
334
|
+
const record = this.ledger.getById(factId);
|
|
335
|
+
if (!record)
|
|
336
|
+
return 'unknown';
|
|
337
|
+
if (record.status === 'contradicted')
|
|
338
|
+
return 'disputed';
|
|
339
|
+
if (record.status === 'supported' && record.confidence === 'high')
|
|
340
|
+
return 'confirmed';
|
|
341
|
+
// Check corroboration: multiple independent sources for the same subject+statement pattern
|
|
342
|
+
const related = this.ledger.getBySubject(record.subject);
|
|
343
|
+
const corroboratingCount = related.filter(r => r.id !== record.id && r.sourceId !== record.sourceId && r.status !== 'contradicted').length;
|
|
344
|
+
if (corroboratingCount >= 2)
|
|
345
|
+
return 'strongly_supported';
|
|
346
|
+
if (record.status === 'observed' && record.confidence === 'medium')
|
|
347
|
+
return 'weakly_supported';
|
|
348
|
+
if (record.status === 'claimed' && record.confidence === 'low')
|
|
349
|
+
return 'weakly_supported';
|
|
350
|
+
return 'weakly_supported';
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Assess credibility of a source (character or artifact) (#172/363).
|
|
354
|
+
*/
|
|
355
|
+
getSourceCredibility(sourceId) {
|
|
356
|
+
const facts = this.ledger.getAll().filter(r => r.sourceId === sourceId);
|
|
357
|
+
const contradictions = facts.filter(r => r.status === 'contradicted');
|
|
358
|
+
if (facts.length === 0) {
|
|
359
|
+
return { credibility: 'neutral', contradictionCount: 0, factCount: 0, rationale: 'No evidence from this source' };
|
|
360
|
+
}
|
|
361
|
+
if (contradictions.length >= 2) {
|
|
362
|
+
return { credibility: 'unreliable', contradictionCount: contradictions.length, factCount: facts.length, rationale: `Multiple contradictions detected (${contradictions.length})` };
|
|
363
|
+
}
|
|
364
|
+
if (contradictions.length === 1) {
|
|
365
|
+
return { credibility: 'questionable', contradictionCount: 1, factCount: facts.length, rationale: 'One contradiction detected in testimony' };
|
|
366
|
+
}
|
|
367
|
+
return { credibility: 'credible', contradictionCount: 0, factCount: facts.length, rationale: 'No contradictions in testimony' };
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Assess investigation coverage and detect focus imbalance (#172/359).
|
|
371
|
+
*/
|
|
372
|
+
getInvestigationCoverage() {
|
|
373
|
+
const focusMap = this.gameView.playerFocusMap ?? new Map();
|
|
374
|
+
const characterCoverage = this.gameView.caseCharacters
|
|
375
|
+
.filter(c => this.gameView.unlockedCharacterIds.has(c.id))
|
|
376
|
+
.map(c => ({
|
|
377
|
+
id: c.id,
|
|
378
|
+
name: c.name,
|
|
379
|
+
interactions: focusMap.get(c.id) ?? 0,
|
|
380
|
+
}));
|
|
381
|
+
const artifactCoverage = this.gameView.caseArtifacts
|
|
382
|
+
.filter(a => this.gameView.discoveredArtifactIds.has(a.id) || this.gameView.unlockedArtifactIds.has(a.id))
|
|
383
|
+
.map(a => ({
|
|
384
|
+
id: a.id,
|
|
385
|
+
name: a.name,
|
|
386
|
+
examined: this.gameView.examinedArtifactIds.has(a.id),
|
|
387
|
+
}));
|
|
388
|
+
// Detect imbalance: any character with 3x average, or any unlocked character with 0 interactions
|
|
389
|
+
const interactionCounts = characterCoverage.map(c => c.interactions);
|
|
390
|
+
const avgInteractions = interactionCounts.length > 0
|
|
391
|
+
? interactionCounts.reduce((a, b) => a + b, 0) / interactionCounts.length
|
|
392
|
+
: 0;
|
|
393
|
+
const overFocused = characterCoverage
|
|
394
|
+
.filter(c => avgInteractions > 0 && c.interactions >= avgInteractions * 3)
|
|
395
|
+
.map(c => c.id);
|
|
396
|
+
const neglected = characterCoverage
|
|
397
|
+
.filter(c => c.interactions === 0 && this.gameView.talkedCharacterIds.size > 0)
|
|
398
|
+
.map(c => c.id);
|
|
399
|
+
const focusImbalance = (overFocused.length > 0 || neglected.length > 0)
|
|
400
|
+
? { overFocused, neglected }
|
|
401
|
+
: null;
|
|
402
|
+
return { characterCoverage, artifactCoverage, focusImbalance };
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=AnalystWorkspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AnalystWorkspace.js","sourceRoot":"","sources":["../../src/investigation/AnalystWorkspace.ts"],"names":[],"mappings":"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"}
|