@tienne/gestalt 0.105.0 → 0.107.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.
Files changed (131) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/plugin/skills/_shared/proactive-routing.md +1 -1
  3. package/dist/plugin/skills/dispatch/SKILL.md +14 -0
  4. package/dist/plugin/skills/handoff/SKILL.md +39 -5
  5. package/dist/plugin/skills/interview/SKILL.md +47 -8
  6. package/dist/plugin/skills/solve/SKILL.md +3 -3
  7. package/dist/plugin/skills/spec/SKILL.md +4 -4
  8. package/dist/schemas/gestalt.schema.json +6 -0
  9. package/dist/src/agent/role-consensus-engine.d.ts.map +1 -1
  10. package/dist/src/agent/role-consensus-engine.js +1 -1
  11. package/dist/src/agent/role-consensus-engine.js.map +1 -1
  12. package/dist/src/agent/role-prompt-generator.d.ts.map +1 -1
  13. package/dist/src/agent/role-prompt-generator.js +1 -2
  14. package/dist/src/agent/role-prompt-generator.js.map +1 -1
  15. package/dist/src/cli/commands/interview.d.ts +1 -0
  16. package/dist/src/cli/commands/interview.d.ts.map +1 -1
  17. package/dist/src/cli/commands/interview.js +5 -3
  18. package/dist/src/cli/commands/interview.js.map +1 -1
  19. package/dist/src/cli/commands/spec.d.ts.map +1 -1
  20. package/dist/src/cli/commands/spec.js +2 -2
  21. package/dist/src/cli/commands/spec.js.map +1 -1
  22. package/dist/src/core/config.d.ts +19 -0
  23. package/dist/src/core/config.d.ts.map +1 -1
  24. package/dist/src/core/config.js +23 -15
  25. package/dist/src/core/config.js.map +1 -1
  26. package/dist/src/core/constants.d.ts +5 -0
  27. package/dist/src/core/constants.d.ts.map +1 -1
  28. package/dist/src/core/constants.js +5 -0
  29. package/dist/src/core/constants.js.map +1 -1
  30. package/dist/src/core/errors.d.ts +3 -1
  31. package/dist/src/core/errors.d.ts.map +1 -1
  32. package/dist/src/core/errors.js +6 -2
  33. package/dist/src/core/errors.js.map +1 -1
  34. package/dist/src/core/types.d.ts +51 -2
  35. package/dist/src/core/types.d.ts.map +1 -1
  36. package/dist/src/events/types.d.ts +2 -0
  37. package/dist/src/events/types.d.ts.map +1 -1
  38. package/dist/src/events/types.js +2 -0
  39. package/dist/src/events/types.js.map +1 -1
  40. package/dist/src/execute/orchestrators/evolution.d.ts.map +1 -1
  41. package/dist/src/execute/orchestrators/evolution.js +4 -0
  42. package/dist/src/execute/orchestrators/evolution.js.map +1 -1
  43. package/dist/src/execute/passthrough-engine.d.ts +6 -0
  44. package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
  45. package/dist/src/execute/passthrough-engine.js +10 -0
  46. package/dist/src/execute/passthrough-engine.js.map +1 -1
  47. package/dist/src/execute/termination-detector.d.ts +3 -0
  48. package/dist/src/execute/termination-detector.d.ts.map +1 -1
  49. package/dist/src/execute/termination-detector.js +2 -3
  50. package/dist/src/execute/termination-detector.js.map +1 -1
  51. package/dist/src/gestalt/analyzer.d.ts +1 -1
  52. package/dist/src/gestalt/analyzer.d.ts.map +1 -1
  53. package/dist/src/gestalt/analyzer.js +3 -2
  54. package/dist/src/gestalt/analyzer.js.map +1 -1
  55. package/dist/src/gestalt/signals.d.ts +20 -0
  56. package/dist/src/gestalt/signals.d.ts.map +1 -0
  57. package/dist/src/gestalt/signals.js +112 -0
  58. package/dist/src/gestalt/signals.js.map +1 -0
  59. package/dist/src/interview/engine.d.ts +9 -1
  60. package/dist/src/interview/engine.d.ts.map +1 -1
  61. package/dist/src/interview/engine.js +40 -11
  62. package/dist/src/interview/engine.js.map +1 -1
  63. package/dist/src/interview/passthrough-engine.d.ts +31 -7
  64. package/dist/src/interview/passthrough-engine.d.ts.map +1 -1
  65. package/dist/src/interview/passthrough-engine.js +87 -28
  66. package/dist/src/interview/passthrough-engine.js.map +1 -1
  67. package/dist/src/interview/repository.d.ts +6 -1
  68. package/dist/src/interview/repository.d.ts.map +1 -1
  69. package/dist/src/interview/repository.js +20 -2
  70. package/dist/src/interview/repository.js.map +1 -1
  71. package/dist/src/interview/rescore.d.ts +35 -0
  72. package/dist/src/interview/rescore.d.ts.map +1 -0
  73. package/dist/src/interview/rescore.js +92 -0
  74. package/dist/src/interview/rescore.js.map +1 -0
  75. package/dist/src/interview/resolution.d.ts +5 -1
  76. package/dist/src/interview/resolution.d.ts.map +1 -1
  77. package/dist/src/interview/resolution.js +15 -4
  78. package/dist/src/interview/resolution.js.map +1 -1
  79. package/dist/src/interview/session.d.ts +12 -2
  80. package/dist/src/interview/session.d.ts.map +1 -1
  81. package/dist/src/interview/session.js +57 -5
  82. package/dist/src/interview/session.js.map +1 -1
  83. package/dist/src/llm/prompts.d.ts +8 -0
  84. package/dist/src/llm/prompts.d.ts.map +1 -1
  85. package/dist/src/llm/prompts.js +7 -0
  86. package/dist/src/llm/prompts.js.map +1 -1
  87. package/dist/src/mcp/schemas.d.ts +26 -20
  88. package/dist/src/mcp/schemas.d.ts.map +1 -1
  89. package/dist/src/mcp/schemas.js +11 -3
  90. package/dist/src/mcp/schemas.js.map +1 -1
  91. package/dist/src/mcp/server.d.ts.map +1 -1
  92. package/dist/src/mcp/server.js +10 -4
  93. package/dist/src/mcp/server.js.map +1 -1
  94. package/dist/src/mcp/tools/execute/evaluate.d.ts.map +1 -1
  95. package/dist/src/mcp/tools/execute/evaluate.js +3 -3
  96. package/dist/src/mcp/tools/execute/evaluate.js.map +1 -1
  97. package/dist/src/mcp/tools/interview-passthrough.d.ts.map +1 -1
  98. package/dist/src/mcp/tools/interview-passthrough.js +40 -34
  99. package/dist/src/mcp/tools/interview-passthrough.js.map +1 -1
  100. package/dist/src/mcp/tools/spec-passthrough.d.ts.map +1 -1
  101. package/dist/src/mcp/tools/spec-passthrough.js +7 -0
  102. package/dist/src/mcp/tools/spec-passthrough.js.map +1 -1
  103. package/dist/src/mcp/tools/status.d.ts.map +1 -1
  104. package/dist/src/mcp/tools/status.js +6 -1
  105. package/dist/src/mcp/tools/status.js.map +1 -1
  106. package/dist/src/research/schema.d.ts +3 -3
  107. package/dist/src/spec/extractor.js +1 -1
  108. package/dist/src/spec/extractor.js.map +1 -1
  109. package/dist/src/spec/generator.d.ts +3 -1
  110. package/dist/src/spec/generator.d.ts.map +1 -1
  111. package/dist/src/spec/generator.js +6 -4
  112. package/dist/src/spec/generator.js.map +1 -1
  113. package/dist/src/spec/passthrough-generator.d.ts +3 -1
  114. package/dist/src/spec/passthrough-generator.d.ts.map +1 -1
  115. package/dist/src/spec/passthrough-generator.js +6 -4
  116. package/dist/src/spec/passthrough-generator.js.map +1 -1
  117. package/dist/src/spec/schema.d.ts +5 -5
  118. package/dist/src/spec/schema.js +1 -1
  119. package/dist/src/spec/schema.js.map +1 -1
  120. package/package.json +1 -1
  121. package/plugin/.codex-plugin/plugin.json +1 -1
  122. package/plugin/.mcp.json +1 -1
  123. package/plugin/commands/gestalt-interview.md +2 -1
  124. package/plugin/mcp.json +1 -1
  125. package/plugin/skills/_shared/proactive-routing.md +1 -1
  126. package/plugin/skills/dispatch/SKILL.md +14 -0
  127. package/plugin/skills/handoff/SKILL.md +39 -5
  128. package/plugin/skills/interview/SKILL.md +47 -8
  129. package/plugin/skills/solve/SKILL.md +3 -3
  130. package/plugin/skills/spec/SKILL.md +4 -4
  131. package/schemas/gestalt.schema.json +6 -0
@@ -1,7 +1,7 @@
1
- import type { InterviewSession, ResolutionScore, ProjectType, GestaltPrinciple } from '../core/types.js';
1
+ import type { InterviewSession, ResolutionScore, ProjectType, GestaltPrinciple, RescoreMode, RescoreResult } from '../core/types.js';
2
2
  import { InterviewError } from '../core/errors.js';
3
3
  import { type Result } from '../core/result.js';
4
- import { SessionManager } from './session.js';
4
+ import { SessionManager, type InterviewOptions } from './session.js';
5
5
  import { EventStore } from '../events/store.js';
6
6
  import type { AgentRegistry } from '../agent/registry.js';
7
7
  export interface GestaltContext {
@@ -29,6 +29,26 @@ export interface PassthroughRespondResult {
29
29
  compressionPrompt: string;
30
30
  };
31
31
  needsCompression?: boolean;
32
+ /**
33
+ * 다시 채점하기를 요청할 차례면 붙는 프롬프트. record는 처음 기준값을 넘을 때 한 번, gate는 다시 채점을
34
+ * 받기 전까지 넘을 때마다 붙고 off면 안 붙는다. 이때 nextAction은 rescore다
35
+ */
36
+ rescorePrompt?: string;
37
+ nextAction?: 'rescore';
38
+ }
39
+ export interface PassthroughScoreResult {
40
+ resolutionScore: ResolutionScore | null;
41
+ scoringPrompt?: string;
42
+ rescorePrompt?: string;
43
+ nextAction?: 'rescore';
44
+ /** rescore: true로 받은 채점의 비교 결과 */
45
+ rescore?: RescoreResult;
46
+ /** gate가 판정을 미뤘을 때 다음 질문을 만들 컨텍스트 */
47
+ gestaltContext?: GestaltContext;
48
+ }
49
+ export interface RescoreOptions {
50
+ rescore?: boolean;
51
+ rescoreMode?: RescoreMode;
32
52
  }
33
53
  export interface ExternalResolutionScore {
34
54
  goalClarity: number;
@@ -42,18 +62,22 @@ export declare class PassthroughEngine {
42
62
  private eventStore;
43
63
  private sessionManager;
44
64
  private agentRegistry?;
45
- constructor(eventStore: EventStore, agentRegistry?: AgentRegistry);
65
+ private resolutionThreshold;
66
+ private rescoreSetting;
67
+ constructor(eventStore: EventStore, agentRegistry?: AgentRegistry, options?: InterviewOptions);
46
68
  start(topic: string, cwd?: string, memoryContextStr?: string): Result<PassthroughStartResult, InterviewError>;
47
69
  respond(sessionId: string, response: string, generatedQuestion: string, externalScore?: ExternalResolutionScore): Result<PassthroughRespondResult, InterviewError>;
48
- score(sessionId: string, externalScore?: ExternalResolutionScore): Result<{
49
- resolutionScore: ResolutionScore | null;
50
- scoringPrompt?: string;
51
- }, InterviewError>;
70
+ score(sessionId: string, externalScore?: ExternalResolutionScore, options?: RescoreOptions): Result<PassthroughScoreResult, InterviewError>;
52
71
  complete(sessionId: string, force?: boolean): Result<InterviewSession, InterviewError>;
53
72
  getSession(sessionId: string): InterviewSession;
54
73
  getSessionManager(): SessionManager;
55
74
  getLatestSession(): InterviewSession | null;
56
75
  listSessions(): InterviewSession[];
76
+ /** 채점을 세션에 넣는다. 다시 채점하기를 요청할 차례면 rounds로 만든 프롬프트를 돌려준다 */
77
+ private recordScore;
78
+ private rescore;
79
+ /** 직전 respond가 이 라운드용으로 고른 원칙. 첫 라운드나 기록이 없으면 null */
80
+ private appliedPrinciple;
57
81
  private buildGestaltContext;
58
82
  }
59
83
  //# sourceMappingURL=passthrough-engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"passthrough-engine.d.ts","sourceRoot":"","sources":["../../../src/interview/passthrough-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOhD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,gBAAgB,CAAC;IAC1B,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACxC,cAAc,EAAE,cAAc,CAAC;IAC/B,kBAAkB,CAAC,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAID,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,qBAAa,iBAAiB;IAK1B,OAAO,CAAC,UAAU;IAJpB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAG5B,UAAU,EAAE,UAAU,EAC9B,aAAa,CAAC,EAAE,aAAa;IAO/B,KAAK,CACH,KAAK,EAAE,MAAM,EACb,GAAG,CAAC,EAAE,MAAM,EACZ,gBAAgB,CAAC,EAAE,MAAM,GACxB,MAAM,CAAC,sBAAsB,EAAE,cAAc,CAAC;IAuCjD,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,EACzB,aAAa,CAAC,EAAE,uBAAuB,GACtC,MAAM,CAAC,wBAAwB,EAAE,cAAc,CAAC;IA2GnD,KAAK,CACH,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,uBAAuB,GACtC,MAAM,CAAC;QAAE,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,cAAc,CAAC;IAoC9F,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,MAAM,CAAC,gBAAgB,EAAE,cAAc,CAAC;IAUpF,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB;IAI/C,iBAAiB,IAAI,cAAc;IAInC,gBAAgB,IAAI,gBAAgB,GAAG,IAAI;IAI3C,YAAY,IAAI,gBAAgB,EAAE;IAMlC,OAAO,CAAC,mBAAmB;CAqC5B"}
1
+ {"version":3,"file":"passthrough-engine.d.ts","sourceRoot":"","sources":["../../../src/interview/passthrough-engine.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,13 @@
1
- import { MAX_INTERVIEW_ROUNDS, PRINCIPLE_QUESTION_STRATEGIES } from '../core/constants.js';
1
+ import { MAX_INTERVIEW_ROUNDS, PRINCIPLE_QUESTION_STRATEGIES, RESOLUTION_THRESHOLD, } from '../core/constants.js';
2
2
  import { InterviewError } from '../core/errors.js';
3
3
  import { ok, err } from '../core/result.js';
4
4
  import { selectNextPrinciple, getPrinciplePhaseLabel } from '../gestalt/principles.js';
5
5
  import { computeResolutionScore } from '../gestalt/analyzer.js';
6
6
  import { SessionManager } from './session.js';
7
7
  import { detectProjectType } from './brownfield.js';
8
+ import { recordScoreWithRescore, applyRescore } from './rescore.js';
8
9
  import { EventType } from '../events/types.js';
9
- import { INTERVIEW_SYSTEM_PROMPT, buildQuestionPrompt, buildResolutionPrompt, } from '../llm/prompts.js';
10
+ import { INTERVIEW_SYSTEM_PROMPT, buildQuestionPrompt, buildResolutionPrompt, buildRescorePrompt, } from '../llm/prompts.js';
10
11
  import { mergeSystemPrompt, getActiveAgentNames } from '../agent/prompt-resolver.js';
11
12
  import { ContextCompressor } from './context-compressor.js';
12
13
  // ─── Engine ─────────────────────────────────────────────────────
@@ -14,9 +15,13 @@ export class PassthroughEngine {
14
15
  eventStore;
15
16
  sessionManager;
16
17
  agentRegistry;
17
- constructor(eventStore, agentRegistry) {
18
+ resolutionThreshold;
19
+ rescoreSetting;
20
+ constructor(eventStore, agentRegistry, options = {}) {
18
21
  this.eventStore = eventStore;
19
- this.sessionManager = new SessionManager(eventStore);
22
+ this.resolutionThreshold = options.resolutionThreshold ?? RESOLUTION_THRESHOLD;
23
+ this.rescoreSetting = options.rescore ?? 'record';
24
+ this.sessionManager = new SessionManager(eventStore, options);
20
25
  this.sessionManager.loadFromStore();
21
26
  this.agentRegistry = agentRegistry;
22
27
  }
@@ -53,10 +58,12 @@ export class PassthroughEngine {
53
58
  respond(sessionId, response, generatedQuestion, externalScore) {
54
59
  try {
55
60
  const session = this.sessionManager.get(sessionId);
56
- // Save the externally generated question
57
- const principle = session.rounds.length > 0
58
- ? session.rounds[session.rounds.length - 1].gestaltFocus
59
- : selectNextPrinciple({ roundNumber: 1, dimensions: [], hasContradictions: false });
61
+ // 호스트는 직전 응답의 gestaltContext.currentPrinciple로 질문을 만들었다.
62
+ // 그 원칙을 라운드에 남겨야 어느 차원을 물었는지가 기록과 맞는다
63
+ const principle = this.appliedPrinciple(sessionId, session.rounds.length + 1) ??
64
+ (session.rounds.length > 0
65
+ ? session.rounds[session.rounds.length - 1].gestaltFocus
66
+ : selectNextPrinciple({ roundNumber: 1, dimensions: [], hasContradictions: false }));
60
67
  // If there's no pending round (no unanswered question), add one
61
68
  const lastRound = session.rounds[session.rounds.length - 1];
62
69
  if (!lastRound || lastRound.userResponse !== null) {
@@ -73,19 +80,16 @@ export class PassthroughEngine {
73
80
  }
74
81
  // Compute resolution score if provided externally
75
82
  let resolutionScore = null;
83
+ let rescorePrompt;
76
84
  if (externalScore) {
77
- resolutionScore = computeResolutionScore({
78
- goalClarity: externalScore.goalClarity,
79
- constraintClarity: externalScore.constraintClarity,
80
- successCriteria: externalScore.successCriteria,
81
- priorityClarity: externalScore.priorityClarity,
82
- contextClarity: externalScore.contextClarity,
83
- contradictions: externalScore.contradictions ?? [],
84
- }, session.projectType);
85
+ resolutionScore = computeResolutionScore(rawScore(externalScore), session.projectType, this.resolutionThreshold);
85
86
  const rejected = rejectUnbackedReadyScore(session, resolutionScore);
86
87
  if (rejected)
87
88
  return err(rejected);
88
- this.sessionManager.updateResolutionScore(sessionId, resolutionScore);
89
+ // 같이 온 점수는 직전 respond의 scoringPrompt로 매긴 것이라 이번 답을 못 봤다.
90
+ // 다시 채점도 그 범위로 물어야 흔들림에 새 답으로 늘어난 몫이 안 섞인다
91
+ const scored = session.rounds.slice(0, -1);
92
+ rescorePrompt = this.recordScore(sessionId, resolutionScore, scored.some((r) => r.userResponse) ? scored : session.rounds);
89
93
  }
90
94
  // Select next principle
91
95
  const hasContradictions = (externalScore?.contradictions?.length ?? 0) > 0;
@@ -118,29 +122,32 @@ export class PassthroughEngine {
118
122
  resolutionScore,
119
123
  gestaltContext,
120
124
  ...(needsCompression ? { compressionContext, needsCompression } : {}),
125
+ ...(rescorePrompt && { rescorePrompt, nextAction: 'rescore' }),
121
126
  });
122
127
  }
123
128
  catch (e) {
124
129
  return err(new InterviewError(`Failed to process response: ${e instanceof Error ? e.message : String(e)}`));
125
130
  }
126
131
  }
127
- score(sessionId, externalScore) {
132
+ score(sessionId, externalScore, options = {}) {
128
133
  try {
129
134
  const session = this.sessionManager.get(sessionId);
135
+ if (options.rescore) {
136
+ if (!externalScore) {
137
+ return err(new InterviewError('rescore: true에는 resolutionScore가 필요합니다.'));
138
+ }
139
+ return this.rescore(sessionId, externalScore, options.rescoreMode ?? 'same-context');
140
+ }
130
141
  if (externalScore) {
131
- const resolutionScore = computeResolutionScore({
132
- goalClarity: externalScore.goalClarity,
133
- constraintClarity: externalScore.constraintClarity,
134
- successCriteria: externalScore.successCriteria,
135
- priorityClarity: externalScore.priorityClarity,
136
- contextClarity: externalScore.contextClarity,
137
- contradictions: externalScore.contradictions ?? [],
138
- }, session.projectType);
142
+ const resolutionScore = computeResolutionScore(rawScore(externalScore), session.projectType, this.resolutionThreshold);
139
143
  const rejected = rejectUnbackedReadyScore(session, resolutionScore);
140
144
  if (rejected)
141
145
  return err(rejected);
142
- this.sessionManager.updateResolutionScore(sessionId, resolutionScore);
143
- return ok({ resolutionScore });
146
+ const rescorePrompt = this.recordScore(sessionId, resolutionScore, session.rounds);
147
+ return ok({
148
+ resolutionScore,
149
+ ...(rescorePrompt && { rescorePrompt, nextAction: 'rescore' }),
150
+ });
144
151
  }
145
152
  // No external score — return scoring prompt for the caller
146
153
  const rounds = session.rounds
@@ -174,6 +181,48 @@ export class PassthroughEngine {
174
181
  return this.sessionManager.list();
175
182
  }
176
183
  // ─── Private helpers ────────────────────────────────────────────
184
+ /** 채점을 세션에 넣는다. 다시 채점하기를 요청할 차례면 rounds로 만든 프롬프트를 돌려준다 */
185
+ recordScore(sessionId, score, rounds) {
186
+ const request = recordScoreWithRescore(this.sessionManager, sessionId, score, this.rescoreSetting, this.resolutionThreshold);
187
+ if (!request)
188
+ return undefined;
189
+ const session = this.sessionManager.get(sessionId);
190
+ return buildRescorePrompt(session.topic, rounds.map((r) => ({ question: r.question, response: r.userResponse })), session.projectType);
191
+ }
192
+ rescore(sessionId, externalScore, mode) {
193
+ if (this.rescoreSetting === 'off') {
194
+ return err(new InterviewError('interview.rescore가 off라 다시 채점을 받지 않습니다.'));
195
+ }
196
+ const state = this.sessionManager.rescoreState(sessionId);
197
+ if (state === 'done') {
198
+ return err(new InterviewError('이미 다시 채점한 인터뷰입니다. 다시 채점하기는 인터뷰마다 한 번만 받습니다.'));
199
+ }
200
+ const session = this.sessionManager.get(sessionId);
201
+ const first = session.resolutionScore;
202
+ if (state === 'none' || !first) {
203
+ return err(new InterviewError(`아직 기준값(${this.resolutionThreshold})을 넘은 채점이 없습니다. 다시 채점하기는 처음 넘은 채점 뒤에 받습니다.`));
204
+ }
205
+ const second = computeResolutionScore(rawScore(externalScore), session.projectType, this.resolutionThreshold);
206
+ const { resolutionScore, rescore, principle, roundNumber } = applyRescore(this.sessionManager, sessionId, first, second, mode, this.rescoreSetting, this.resolutionThreshold);
207
+ if (!principle)
208
+ return ok({ resolutionScore, rescore });
209
+ // gate가 판정을 미뤘으면 다음 질문은 흔들린 차원부터 묻는다
210
+ this.eventStore.append('interview', sessionId, EventType.GESTALT_PRINCIPLE_APPLIED, {
211
+ principle,
212
+ roundNumber,
213
+ });
214
+ const gestaltContext = this.buildGestaltContext(session.topic, principle, roundNumber, session.rounds.map((r) => ({ question: r.question, response: r.userResponse })), session.projectType);
215
+ return ok({ resolutionScore, rescore, gestaltContext });
216
+ }
217
+ /** 직전 respond가 이 라운드용으로 고른 원칙. 첫 라운드나 기록이 없으면 null */
218
+ appliedPrinciple(sessionId, roundNumber) {
219
+ const applied = this.eventStore
220
+ .replay('interview', sessionId)
221
+ .filter((e) => e.eventType === EventType.GESTALT_PRINCIPLE_APPLIED &&
222
+ e.payload.roundNumber === roundNumber);
223
+ const last = applied[applied.length - 1];
224
+ return last ? last.payload.principle : null;
225
+ }
177
226
  buildGestaltContext(topic, principle, roundNumber, previousRounds, projectType, includeScoringPrompt = false) {
178
227
  const questionPrompt = buildQuestionPrompt(topic, principle, previousRounds, projectType);
179
228
  const phase = getPrinciplePhaseLabel(roundNumber);
@@ -197,6 +246,16 @@ export class PassthroughEngine {
197
246
  return context;
198
247
  }
199
248
  }
249
+ function rawScore(external) {
250
+ return {
251
+ goalClarity: external.goalClarity,
252
+ constraintClarity: external.constraintClarity,
253
+ successCriteria: external.successCriteria,
254
+ priorityClarity: external.priorityClarity,
255
+ contextClarity: external.contextClarity,
256
+ contradictions: external.contradictions ?? [],
257
+ };
258
+ }
200
259
  // 답을 하나도 안 받은 세션은 근거가 없으니 임계값 이상 점수를 받지 않는다.
201
260
  // 공백만 보낸 답은 답으로 치지 않는다.
202
261
  // 임계값 미만은 막지 않는다 — 시작 직전 상태를 낮게 기록하는 건 정상 흐름이다.
@@ -1 +1 @@
1
- {"version":3,"file":"passthrough-engine.js","sourceRoot":"","sources":["../../../src/interview/passthrough-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"passthrough-engine.js","sourceRoot":"","sources":["../../../src/interview/passthrough-engine.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,12 @@ import type { InterviewSession } from '../core/types.js';
6
6
  */
7
7
  export declare class InterviewSessionRepository {
8
8
  private eventStore;
9
- constructor(eventStore: IEventStore);
9
+ private resolutionThreshold;
10
+ /**
11
+ * @param resolutionThreshold isReady가 저장되지 않은 옛 ambiguity 이벤트를 읽을 때만 쓴다.
12
+ * 그 밖의 채점 이벤트는 저장된 isReady를 다시 계산하지 않는다
13
+ */
14
+ constructor(eventStore: IEventStore, resolutionThreshold?: number);
10
15
  /**
11
16
  * 이벤트를 fold하여 InterviewSession 상태를 완전히 복원한다.
12
17
  */
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/interview/repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAEV,gBAAgB,EAMjB,MAAM,kBAAkB,CAAC;AAI1B;;;GAGG;AACH,qBAAa,0BAA0B;IACzB,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,WAAW;IAE3C;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIvD;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,gBAAgB,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOjF;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,cAAc,IAAI,gBAAgB,EAAE;IAUpC,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,UAAU;CAmFnB"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/interview/repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAEV,gBAAgB,EAOjB,MAAM,kBAAkB,CAAC;AAI1B;;;GAGG;AACH,qBAAa,0BAA0B;IAMnC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,mBAAmB;IAN7B;;;OAGG;gBAEO,UAAU,EAAE,WAAW,EACvB,mBAAmB,GAAE,MAA6B;IAG5D;;OAEG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAIvD;;;OAGG;IACH,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,gBAAgB,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOjF;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,cAAc,IAAI,gBAAgB,EAAE;IAUpC,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,UAAU;CAgGnB"}
@@ -6,8 +6,14 @@ import { RESOLUTION_THRESHOLD } from '../core/constants.js';
6
6
  */
7
7
  export class InterviewSessionRepository {
8
8
  eventStore;
9
- constructor(eventStore) {
9
+ resolutionThreshold;
10
+ /**
11
+ * @param resolutionThreshold isReady가 저장되지 않은 옛 ambiguity 이벤트를 읽을 때만 쓴다.
12
+ * 그 밖의 채점 이벤트는 저장된 isReady를 다시 계산하지 않는다
13
+ */
14
+ constructor(eventStore, resolutionThreshold = RESOLUTION_THRESHOLD) {
10
15
  this.eventStore = eventStore;
16
+ this.resolutionThreshold = resolutionThreshold;
11
17
  }
12
18
  /**
13
19
  * 이벤트를 fold하여 InterviewSession 상태를 완전히 복원한다.
@@ -97,6 +103,10 @@ export class InterviewSessionRepository {
97
103
  isReady: payload.isReady,
98
104
  dimensions: payload.dimensions ?? [],
99
105
  ...(contradictions.length > 0 && { contradictions }),
106
+ ...(typeof payload.threshold === 'number' && { threshold: payload.threshold }),
107
+ ...(payload.signals != null && {
108
+ signals: payload.signals,
109
+ }),
100
110
  };
101
111
  if (contradictions.length > 0) {
102
112
  const roundNumber = payload.roundNumber;
@@ -110,6 +120,14 @@ export class InterviewSessionRepository {
110
120
  }
111
121
  break;
112
122
  }
123
+ case EventType.INTERVIEW_RESOLUTION_RESCORED: {
124
+ const score = session.resolutionScore;
125
+ if (score) {
126
+ score.isReady = payload.isReady;
127
+ score.signals = payload.signals;
128
+ }
129
+ break;
130
+ }
113
131
  // Backward compatibility: old ambiguity score was inverted (low = clear)
114
132
  // Convert to resolution score by inverting: resolution = 1 - ambiguity
115
133
  case 'interview.ambiguity.scored': {
@@ -117,7 +135,7 @@ export class InterviewSessionRepository {
117
135
  const resolution = 1 - ambiguity;
118
136
  session.resolutionScore = {
119
137
  overall: resolution,
120
- isReady: resolution >= RESOLUTION_THRESHOLD,
138
+ isReady: resolution >= this.resolutionThreshold,
121
139
  dimensions: payload.dimensions ?? [],
122
140
  };
123
141
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/interview/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/interview/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { GestaltPrinciple, ResolutionScore, RescoreMode, RescoreResult } from '../core/types.js';
2
+ import type { InterviewConfig } from '../core/config.js';
3
+ import type { SessionManager } from './session.js';
4
+ export type RescoreSetting = InterviewConfig['rescore'];
5
+ /** none: 기준값을 넘은 채점이 아직 없다. pending: 넘었는데 다시 채점을 안 받았다. done: 받았다 */
6
+ export type RescoreState = 'none' | 'pending' | 'done';
7
+ /** gate 모드에서 차원 하나라도 이보다 크게 흔들리면 판정을 미룬다 */
8
+ export declare const RESCORE_SPREAD_LIMIT = 0.2;
9
+ /**
10
+ * 이 채점 뒤에 다시 채점하기를 요청할지 정한다.
11
+ * record는 처음 기준값을 넘을 때 한 번만 요청한다. gate는 다시 채점을 받기 전까지
12
+ * 판정을 미루므로 넘을 때마다 요청한다.
13
+ */
14
+ export declare function shouldRequestRescore(setting: RescoreSetting, state: RescoreState, score: ResolutionScore, threshold: number): boolean;
15
+ export declare function compareRescore(first: ResolutionScore, second: ResolutionScore, mode: RescoreMode, threshold: number): RescoreResult;
16
+ /** record는 다시 채점 직전 점수의 판정을 그대로 두고 gate는 낮은 overall과 흔들림으로 다시 정한다 */
17
+ export declare function readinessAfterRescore(setting: RescoreSetting, first: ResolutionScore, rescore: RescoreResult, threshold: number): boolean;
18
+ /**
19
+ * gate가 판정을 미뤘을 때 다음 질문의 원칙.
20
+ * 흔들림이 기준을 넘었으면 가장 많이 흔들린 차원을 묻는다. 안 넘었으면 낮은 쪽 점수로 고른다.
21
+ */
22
+ export declare function principleAfterRescore(first: ResolutionScore, second: ResolutionScore, rescore: RescoreResult, roundNumber: number): GestaltPrinciple;
23
+ /**
24
+ * 채점을 세션에 넣고 다시 채점하기를 요청할 차례인지 돌려준다.
25
+ * 판정이 이 순서에 달려 있어서 두 엔진이 이 함수 하나를 같이 쓴다.
26
+ */
27
+ export declare function recordScoreWithRescore(sessions: SessionManager, sessionId: string, score: ResolutionScore, setting: RescoreSetting, threshold: number): boolean;
28
+ /** 다시 채점한 점수를 다시 채점 직전 점수와 비교해 남긴다. gate가 판정을 미뤘으면 다음 질문의 원칙도 돌려준다 */
29
+ export declare function applyRescore(sessions: SessionManager, sessionId: string, first: ResolutionScore, second: ResolutionScore, mode: RescoreMode, setting: RescoreSetting, threshold: number): {
30
+ resolutionScore: ResolutionScore;
31
+ rescore: RescoreResult;
32
+ principle: GestaltPrinciple | null;
33
+ roundNumber: number;
34
+ };
35
+ //# sourceMappingURL=rescore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rescore.d.ts","sourceRoot":"","sources":["../../../src/interview/rescore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEhB,eAAe,EACf,WAAW,EACX,aAAa,EACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;AAExD,qEAAqE;AACrE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC;AAEvD,4CAA4C;AAC5C,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAExC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAIT;AAED,wBAAgB,cAAc,CAC5B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,GAChB,aAAa,CAkBf;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,aAAa,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAMT;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,MAAM,GAClB,gBAAgB,CAoBlB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB,OAAO,CAMT;AAED,sEAAsE;AACtE,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,GAChB;IACD,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,SAAS,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB,CAUA"}
@@ -0,0 +1,92 @@
1
+ import { selectNextPrinciple } from '../gestalt/principles.js';
2
+ import { isResolutionDimensionName } from '../gestalt/signals.js';
3
+ /** gate 모드에서 차원 하나라도 이보다 크게 흔들리면 판정을 미룬다 */
4
+ export const RESCORE_SPREAD_LIMIT = 0.2;
5
+ /**
6
+ * 이 채점 뒤에 다시 채점하기를 요청할지 정한다.
7
+ * record는 처음 기준값을 넘을 때 한 번만 요청한다. gate는 다시 채점을 받기 전까지
8
+ * 판정을 미루므로 넘을 때마다 요청한다.
9
+ */
10
+ export function shouldRequestRescore(setting, state, score, threshold) {
11
+ if (setting === 'off' || state === 'done')
12
+ return false;
13
+ if (score.overall < threshold)
14
+ return false;
15
+ return setting === 'gate' || state === 'none';
16
+ }
17
+ export function compareRescore(first, second, mode, threshold) {
18
+ const again = new Map(second.dimensions.map((d) => [d.name, d.clarity]));
19
+ let maxDimensionSpread = 0;
20
+ const droppedDimensions = [];
21
+ for (const d of first.dimensions) {
22
+ const clarity = again.get(d.name);
23
+ if (clarity === undefined)
24
+ continue;
25
+ maxDimensionSpread = Math.max(maxDimensionSpread, Math.abs(d.clarity - clarity));
26
+ if (d.clarity >= threshold && clarity < threshold && isResolutionDimensionName(d.name)) {
27
+ droppedDimensions.push(d.name);
28
+ }
29
+ }
30
+ return {
31
+ mode,
32
+ overall: second.overall,
33
+ maxDimensionSpread: Math.round(maxDimensionSpread * 10000) / 10000,
34
+ droppedDimensions,
35
+ };
36
+ }
37
+ /** record는 다시 채점 직전 점수의 판정을 그대로 두고 gate는 낮은 overall과 흔들림으로 다시 정한다 */
38
+ export function readinessAfterRescore(setting, first, rescore, threshold) {
39
+ if (setting !== 'gate')
40
+ return first.isReady;
41
+ return (Math.min(first.overall, rescore.overall) >= threshold &&
42
+ rescore.maxDimensionSpread <= RESCORE_SPREAD_LIMIT);
43
+ }
44
+ /**
45
+ * gate가 판정을 미뤘을 때 다음 질문의 원칙.
46
+ * 흔들림이 기준을 넘었으면 가장 많이 흔들린 차원을 묻는다. 안 넘었으면 낮은 쪽 점수로 고른다.
47
+ */
48
+ export function principleAfterRescore(first, second, rescore, roundNumber) {
49
+ if (rescore.maxDimensionSpread > RESCORE_SPREAD_LIMIT) {
50
+ const again = new Map(second.dimensions.map((d) => [d.name, d.clarity]));
51
+ let shaken = first.dimensions[0];
52
+ let widest = -1;
53
+ for (const d of first.dimensions) {
54
+ const spread = Math.abs(d.clarity - (again.get(d.name) ?? d.clarity));
55
+ if (spread > widest) {
56
+ widest = spread;
57
+ shaken = d;
58
+ }
59
+ }
60
+ return shaken.gestaltPrinciple;
61
+ }
62
+ const lower = second.overall < first.overall ? second : first;
63
+ return selectNextPrinciple({
64
+ roundNumber,
65
+ dimensions: lower.dimensions,
66
+ hasContradictions: (lower.contradictions?.length ?? 0) > 0,
67
+ });
68
+ }
69
+ /**
70
+ * 채점을 세션에 넣고 다시 채점하기를 요청할 차례인지 돌려준다.
71
+ * 판정이 이 순서에 달려 있어서 두 엔진이 이 함수 하나를 같이 쓴다.
72
+ */
73
+ export function recordScoreWithRescore(sessions, sessionId, score, setting, threshold) {
74
+ const request = shouldRequestRescore(setting, sessions.rescoreState(sessionId), score, threshold);
75
+ // gate는 다시 채점을 받기 전까지 기준값을 넘었다고 보지 않는다
76
+ if (request && setting === 'gate')
77
+ score.isReady = false;
78
+ sessions.updateResolutionScore(sessionId, score);
79
+ return request;
80
+ }
81
+ /** 다시 채점한 점수를 다시 채점 직전 점수와 비교해 남긴다. gate가 판정을 미뤘으면 다음 질문의 원칙도 돌려준다 */
82
+ export function applyRescore(sessions, sessionId, first, second, mode, setting, threshold) {
83
+ const rescore = compareRescore(first, second, mode, threshold);
84
+ const isReady = readinessAfterRescore(setting, first, rescore, threshold);
85
+ const roundNumber = sessions.get(sessionId).rounds.length + 1;
86
+ const principle = !isReady && setting === 'gate'
87
+ ? principleAfterRescore(first, second, rescore, roundNumber)
88
+ : null;
89
+ const resolutionScore = sessions.recordRescore(sessionId, rescore, isReady);
90
+ return { resolutionScore, rescore, principle, roundNumber };
91
+ }
92
+ //# sourceMappingURL=rescore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rescore.js","sourceRoot":"","sources":["../../../src/interview/rescore.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,11 @@ import type { ResolutionScore, InterviewRound, ProjectType } from '../core/types
2
2
  import type { LLMAdapter } from '../llm/types.js';
3
3
  export declare class ResolutionScorer {
4
4
  private llm;
5
- constructor(llm: LLMAdapter);
5
+ private threshold;
6
+ constructor(llm: LLMAdapter, threshold?: number);
6
7
  score(topic: string, rounds: InterviewRound[], projectType: ProjectType): Promise<ResolutionScore>;
8
+ /** 다시 채점할 차례인 채점을 같은 모델로 한 번 더 받는다. 새 호출이라 앞 채점을 못 본다 */
9
+ rescore(topic: string, rounds: InterviewRound[], projectType: ProjectType): Promise<ResolutionScore>;
10
+ private scoreWith;
7
11
  }
8
12
  //# sourceMappingURL=resolution.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolution.d.ts","sourceRoot":"","sources":["../../../src/interview/resolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,qBAAa,gBAAgB;IACf,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,UAAU;IAE7B,KAAK,CACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,cAAc,EAAE,EACxB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,eAAe,CAAC;CA4B5B"}
1
+ {"version":3,"file":"resolution.d.ts","sourceRoot":"","sources":["../../../src/interview/resolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAQrF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,SAAS;gBADT,GAAG,EAAE,UAAU,EACf,SAAS,GAAE,MAA6B;IAG5C,KAAK,CACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,cAAc,EAAE,EACxB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,eAAe,CAAC;IAI3B,yDAAyD;IACnD,OAAO,CACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,cAAc,EAAE,EACxB,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,eAAe,CAAC;YAIb,SAAS;CAkCxB"}
@@ -1,20 +1,31 @@
1
1
  import { computeResolutionScore } from '../gestalt/analyzer.js';
2
- import { buildResolutionPrompt, INTERVIEW_SYSTEM_PROMPT } from '../llm/prompts.js';
2
+ import { RESOLUTION_THRESHOLD } from '../core/constants.js';
3
+ import { buildResolutionPrompt, buildRescorePrompt, INTERVIEW_SYSTEM_PROMPT, } from '../llm/prompts.js';
3
4
  export class ResolutionScorer {
4
5
  llm;
5
- constructor(llm) {
6
+ threshold;
7
+ constructor(llm, threshold = RESOLUTION_THRESHOLD) {
6
8
  this.llm = llm;
9
+ this.threshold = threshold;
7
10
  }
8
11
  async score(topic, rounds, projectType) {
12
+ return this.scoreWith(buildResolutionPrompt, topic, rounds, projectType);
13
+ }
14
+ /** 다시 채점할 차례인 채점을 같은 모델로 한 번 더 받는다. 새 호출이라 앞 채점을 못 본다 */
15
+ async rescore(topic, rounds, projectType) {
16
+ return this.scoreWith(buildRescorePrompt, topic, rounds, projectType);
17
+ }
18
+ async scoreWith(buildPrompt, topic, rounds, projectType) {
9
19
  const answeredRounds = rounds.filter((r) => r.userResponse);
10
20
  if (answeredRounds.length === 0) {
11
21
  return {
12
22
  overall: 0.0,
13
23
  dimensions: [],
14
24
  isReady: false,
25
+ threshold: this.threshold,
15
26
  };
16
27
  }
17
- const prompt = buildResolutionPrompt(topic, answeredRounds.map((r) => ({
28
+ const prompt = buildPrompt(topic, answeredRounds.map((r) => ({
18
29
  question: r.question,
19
30
  response: r.userResponse,
20
31
  })), projectType);
@@ -24,7 +35,7 @@ export class ResolutionScorer {
24
35
  temperature: 0.3,
25
36
  });
26
37
  const raw = parseResolutionResponse(response.content, projectType);
27
- return computeResolutionScore(raw, projectType);
38
+ return computeResolutionScore(raw, projectType, this.threshold);
28
39
  }
29
40
  }
30
41
  function parseResolutionResponse(content, projectType) {