@tienne/gestalt 0.106.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 (125) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/plugin/skills/interview/SKILL.md +47 -8
  3. package/dist/plugin/skills/solve/SKILL.md +3 -3
  4. package/dist/plugin/skills/spec/SKILL.md +4 -4
  5. package/dist/schemas/gestalt.schema.json +6 -0
  6. package/dist/src/agent/role-consensus-engine.d.ts.map +1 -1
  7. package/dist/src/agent/role-consensus-engine.js +1 -1
  8. package/dist/src/agent/role-consensus-engine.js.map +1 -1
  9. package/dist/src/agent/role-prompt-generator.d.ts.map +1 -1
  10. package/dist/src/agent/role-prompt-generator.js +1 -2
  11. package/dist/src/agent/role-prompt-generator.js.map +1 -1
  12. package/dist/src/cli/commands/interview.d.ts +1 -0
  13. package/dist/src/cli/commands/interview.d.ts.map +1 -1
  14. package/dist/src/cli/commands/interview.js +5 -3
  15. package/dist/src/cli/commands/interview.js.map +1 -1
  16. package/dist/src/cli/commands/spec.d.ts.map +1 -1
  17. package/dist/src/cli/commands/spec.js +2 -2
  18. package/dist/src/cli/commands/spec.js.map +1 -1
  19. package/dist/src/core/config.d.ts +19 -0
  20. package/dist/src/core/config.d.ts.map +1 -1
  21. package/dist/src/core/config.js +23 -15
  22. package/dist/src/core/config.js.map +1 -1
  23. package/dist/src/core/constants.d.ts +5 -0
  24. package/dist/src/core/constants.d.ts.map +1 -1
  25. package/dist/src/core/constants.js +5 -0
  26. package/dist/src/core/constants.js.map +1 -1
  27. package/dist/src/core/errors.d.ts +3 -1
  28. package/dist/src/core/errors.d.ts.map +1 -1
  29. package/dist/src/core/errors.js +6 -2
  30. package/dist/src/core/errors.js.map +1 -1
  31. package/dist/src/core/types.d.ts +51 -2
  32. package/dist/src/core/types.d.ts.map +1 -1
  33. package/dist/src/events/types.d.ts +2 -0
  34. package/dist/src/events/types.d.ts.map +1 -1
  35. package/dist/src/events/types.js +2 -0
  36. package/dist/src/events/types.js.map +1 -1
  37. package/dist/src/execute/orchestrators/evolution.d.ts.map +1 -1
  38. package/dist/src/execute/orchestrators/evolution.js +4 -0
  39. package/dist/src/execute/orchestrators/evolution.js.map +1 -1
  40. package/dist/src/execute/passthrough-engine.d.ts +6 -0
  41. package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
  42. package/dist/src/execute/passthrough-engine.js +10 -0
  43. package/dist/src/execute/passthrough-engine.js.map +1 -1
  44. package/dist/src/execute/termination-detector.d.ts +3 -0
  45. package/dist/src/execute/termination-detector.d.ts.map +1 -1
  46. package/dist/src/execute/termination-detector.js +2 -3
  47. package/dist/src/execute/termination-detector.js.map +1 -1
  48. package/dist/src/gestalt/analyzer.d.ts +1 -1
  49. package/dist/src/gestalt/analyzer.d.ts.map +1 -1
  50. package/dist/src/gestalt/analyzer.js +3 -2
  51. package/dist/src/gestalt/analyzer.js.map +1 -1
  52. package/dist/src/gestalt/signals.d.ts +20 -0
  53. package/dist/src/gestalt/signals.d.ts.map +1 -0
  54. package/dist/src/gestalt/signals.js +112 -0
  55. package/dist/src/gestalt/signals.js.map +1 -0
  56. package/dist/src/interview/engine.d.ts +9 -1
  57. package/dist/src/interview/engine.d.ts.map +1 -1
  58. package/dist/src/interview/engine.js +40 -11
  59. package/dist/src/interview/engine.js.map +1 -1
  60. package/dist/src/interview/passthrough-engine.d.ts +31 -7
  61. package/dist/src/interview/passthrough-engine.d.ts.map +1 -1
  62. package/dist/src/interview/passthrough-engine.js +87 -28
  63. package/dist/src/interview/passthrough-engine.js.map +1 -1
  64. package/dist/src/interview/repository.d.ts +6 -1
  65. package/dist/src/interview/repository.d.ts.map +1 -1
  66. package/dist/src/interview/repository.js +20 -2
  67. package/dist/src/interview/repository.js.map +1 -1
  68. package/dist/src/interview/rescore.d.ts +35 -0
  69. package/dist/src/interview/rescore.d.ts.map +1 -0
  70. package/dist/src/interview/rescore.js +92 -0
  71. package/dist/src/interview/rescore.js.map +1 -0
  72. package/dist/src/interview/resolution.d.ts +5 -1
  73. package/dist/src/interview/resolution.d.ts.map +1 -1
  74. package/dist/src/interview/resolution.js +15 -4
  75. package/dist/src/interview/resolution.js.map +1 -1
  76. package/dist/src/interview/session.d.ts +12 -2
  77. package/dist/src/interview/session.d.ts.map +1 -1
  78. package/dist/src/interview/session.js +57 -5
  79. package/dist/src/interview/session.js.map +1 -1
  80. package/dist/src/llm/prompts.d.ts +8 -0
  81. package/dist/src/llm/prompts.d.ts.map +1 -1
  82. package/dist/src/llm/prompts.js +7 -0
  83. package/dist/src/llm/prompts.js.map +1 -1
  84. package/dist/src/mcp/schemas.d.ts +26 -20
  85. package/dist/src/mcp/schemas.d.ts.map +1 -1
  86. package/dist/src/mcp/schemas.js +11 -3
  87. package/dist/src/mcp/schemas.js.map +1 -1
  88. package/dist/src/mcp/server.d.ts.map +1 -1
  89. package/dist/src/mcp/server.js +10 -4
  90. package/dist/src/mcp/server.js.map +1 -1
  91. package/dist/src/mcp/tools/execute/evaluate.d.ts.map +1 -1
  92. package/dist/src/mcp/tools/execute/evaluate.js +3 -3
  93. package/dist/src/mcp/tools/execute/evaluate.js.map +1 -1
  94. package/dist/src/mcp/tools/interview-passthrough.d.ts.map +1 -1
  95. package/dist/src/mcp/tools/interview-passthrough.js +40 -34
  96. package/dist/src/mcp/tools/interview-passthrough.js.map +1 -1
  97. package/dist/src/mcp/tools/spec-passthrough.d.ts.map +1 -1
  98. package/dist/src/mcp/tools/spec-passthrough.js +7 -0
  99. package/dist/src/mcp/tools/spec-passthrough.js.map +1 -1
  100. package/dist/src/mcp/tools/status.d.ts.map +1 -1
  101. package/dist/src/mcp/tools/status.js +6 -1
  102. package/dist/src/mcp/tools/status.js.map +1 -1
  103. package/dist/src/research/schema.d.ts +3 -3
  104. package/dist/src/spec/extractor.js +1 -1
  105. package/dist/src/spec/extractor.js.map +1 -1
  106. package/dist/src/spec/generator.d.ts +3 -1
  107. package/dist/src/spec/generator.d.ts.map +1 -1
  108. package/dist/src/spec/generator.js +6 -4
  109. package/dist/src/spec/generator.js.map +1 -1
  110. package/dist/src/spec/passthrough-generator.d.ts +3 -1
  111. package/dist/src/spec/passthrough-generator.d.ts.map +1 -1
  112. package/dist/src/spec/passthrough-generator.js +6 -4
  113. package/dist/src/spec/passthrough-generator.js.map +1 -1
  114. package/dist/src/spec/schema.d.ts +5 -5
  115. package/dist/src/spec/schema.js +1 -1
  116. package/dist/src/spec/schema.js.map +1 -1
  117. package/package.json +1 -1
  118. package/plugin/.codex-plugin/plugin.json +1 -1
  119. package/plugin/.mcp.json +1 -1
  120. package/plugin/commands/gestalt-interview.md +2 -1
  121. package/plugin/mcp.json +1 -1
  122. package/plugin/skills/interview/SKILL.md +47 -8
  123. package/plugin/skills/solve/SKILL.md +3 -3
  124. package/plugin/skills/spec/SKILL.md +4 -4
  125. package/schemas/gestalt.schema.json +6 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../../src/gestalt/signals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,iBAAiB,EAClB,MAAM,kBAAkB,CAAC;AAE1B,qEAAqE;AACrE,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,oCAAoC;AACpC,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAsBrD,CAAC;AAEF,sCAAsC;AACtC,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAU/C,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,uBAAuB,CAEvF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI1D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,eAAe,EACtB,SAAS,EAAE,eAAe,GAAG,IAAI,GAChC,iBAAiB,CAyCnB;AAUD,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAOxF"}
@@ -0,0 +1,112 @@
1
+ /** 이보다 긴 답은 위임 패턴이 들어 있어도 세지 않는다. 긴 답 속 "나중에"까지 세면 잘못 세는 경우가 많아진다 */
2
+ export const DEFERRED_ANSWER_MAX_LENGTH = 40;
3
+ /** 사용자가 결정을 넘긴 답. 답 전체가 짧을 때만 본다 */
4
+ export const DEFERRED_ANSWER_PATTERNS = [
5
+ /알아서/,
6
+ /모르겠/,
7
+ /몰라/,
8
+ /나중에/,
9
+ /상관\s*없/,
10
+ /아무거나/,
11
+ /아무렇게나/,
12
+ /편한\s*대로/,
13
+ /맡길게|맡겨/,
14
+ /미정/,
15
+ /글쎄/,
16
+ /up to you/i,
17
+ /your call/i,
18
+ /you decide/i,
19
+ /don'?t know/i,
20
+ /not sure/i,
21
+ /no idea/i,
22
+ /whatever/i,
23
+ /doesn'?t matter/i,
24
+ /\blater\b/i,
25
+ /\btbd\b/i,
26
+ ];
27
+ /** 이 점수 이상인 차원을 "자신 있게 매긴 차원"으로 본다 */
28
+ export const CONFIDENT_DIMENSION_CLARITY = 0.8;
29
+ const DIMENSION_NAMES = [
30
+ 'goalClarity',
31
+ 'constraintClarity',
32
+ 'successCriteria',
33
+ 'priorityClarity',
34
+ 'contextClarity',
35
+ ];
36
+ export function isResolutionDimensionName(name) {
37
+ return DIMENSION_NAMES.includes(name);
38
+ }
39
+ export function isDeferredAnswer(response) {
40
+ const trimmed = response.trim();
41
+ if (trimmed === '' || trimmed.length > DEFERRED_ANSWER_MAX_LENGTH)
42
+ return false;
43
+ return DEFERRED_ANSWER_PATTERNS.some((p) => p.test(trimmed));
44
+ }
45
+ /**
46
+ * 채점 하나에 붙는 신호를 세션 상태로 센다. LLM에게 묻지 않는다.
47
+ *
48
+ * @param session 채점 직전 세션. 라운드와 질문 주제를 읽는다
49
+ * @param score 지금 들어온 채점
50
+ * @param prevScore 직전 채점. 첫 채점이면 null
51
+ */
52
+ export function computeSignals(session, score, prevScore) {
53
+ let answeredRounds = 0;
54
+ let emptyRounds = 0;
55
+ let deferredRounds = 0;
56
+ // 답을 기다리는 마지막 라운드(userResponse === null)는 빈 답으로 세지 않는다
57
+ for (const round of session.rounds) {
58
+ if (round.userResponse === null)
59
+ continue;
60
+ if (round.userResponse.trim() === '') {
61
+ emptyRounds++;
62
+ continue;
63
+ }
64
+ answeredRounds++;
65
+ if (isDeferredAnswer(round.userResponse))
66
+ deferredRounds++;
67
+ }
68
+ const askedPrinciples = new Set(session.rounds.map((r) => r.gestaltFocus));
69
+ const unaskedConfidentDimensions = score.dimensions
70
+ .filter((d) => d.clarity >= CONFIDENT_DIMENSION_CLARITY)
71
+ .filter((d) => !askedPrinciples.has(d.gestaltPrinciple))
72
+ .map((d) => d.name)
73
+ .filter(isResolutionDimensionName);
74
+ const overallJump = prevScore ? round4(score.overall - prevScore.overall) : null;
75
+ const prevMax = prevScore?.signals?.maxOverallJump ?? null;
76
+ const maxOverallJump = overallJump === null
77
+ ? prevMax
78
+ : prevMax === null
79
+ ? overallJump
80
+ : Math.max(prevMax, overallJump);
81
+ return {
82
+ answeredRounds,
83
+ emptyRounds,
84
+ deferredRounds,
85
+ unaskedConfidentDimensions,
86
+ overallJump,
87
+ maxOverallJump,
88
+ llmDerived: { contradictions: score.contradictions?.length ?? 0 },
89
+ ...(prevScore?.signals?.rescore && { rescore: prevScore.signals.rescore }),
90
+ };
91
+ }
92
+ const DIMENSION_SHORT_LABELS = {
93
+ goalClarity: '목표',
94
+ constraintClarity: '제약',
95
+ successCriteria: '성공 기준',
96
+ priorityClarity: '우선순위',
97
+ contextClarity: '맥락',
98
+ };
99
+ /** ges_status에 붙는 신호 한 줄. 예: `답변 6/7, 위임 답변 1, 안 물은 차원: 우선순위` */
100
+ export function formatSignalLine(signals, totalRounds) {
101
+ const parts = [`답변 ${signals.answeredRounds}/${totalRounds}`];
102
+ if (signals.emptyRounds > 0)
103
+ parts.push(`빈 답변 ${signals.emptyRounds}`);
104
+ parts.push(`위임 답변 ${signals.deferredRounds}`);
105
+ const unasked = signals.unaskedConfidentDimensions.map((d) => DIMENSION_SHORT_LABELS[d]);
106
+ parts.push(`안 물은 차원: ${unasked.length > 0 ? unasked.join(', ') : '없음'}`);
107
+ return parts.join(', ');
108
+ }
109
+ function round4(value) {
110
+ return Math.round(value * 10000) / 10000;
111
+ }
112
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../../../src/gestalt/signals.ts"],"names":[],"mappings":"AAOA,qEAAqE;AACrE,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAE7C,oCAAoC;AACpC,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,KAAK;IACL,KAAK;IACL,IAAI;IACJ,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;IACP,SAAS;IACT,QAAQ;IACR,IAAI;IACJ,IAAI;IACJ,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,cAAc;IACd,WAAW;IACX,UAAU;IACV,WAAW;IACX,kBAAkB;IAClB,YAAY;IACZ,UAAU;CACX,CAAC;AAEF,sCAAsC;AACtC,MAAM,CAAC,MAAM,2BAA2B,GAAG,GAAG,CAAC;AAE/C,MAAM,eAAe,GAAuC;IAC1D,aAAa;IACb,mBAAmB;IACnB,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;CACjB,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,OAAQ,eAAqC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,0BAA0B;QAAE,OAAO,KAAK,CAAC;IAChF,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAyB,EACzB,KAAsB,EACtB,SAAiC;IAEjC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,uDAAuD;IACvD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;YAAE,SAAS;QAC1C,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACrC,WAAW,EAAE,CAAC;YACd,SAAS;QACX,CAAC;QACD,cAAc,EAAE,CAAC;QACjB,IAAI,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC;YAAE,cAAc,EAAE,CAAC;IAC7D,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3E,MAAM,0BAA0B,GAAG,KAAK,CAAC,UAAU;SAChD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,2BAA2B,CAAC;SACvD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;SACvD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,MAAM,CAAC,yBAAyB,CAAC,CAAC;IAErC,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjF,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,cAAc,IAAI,IAAI,CAAC;IAC3D,MAAM,cAAc,GAClB,WAAW,KAAK,IAAI;QAClB,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO,KAAK,IAAI;YAChB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEvC,OAAO;QACL,cAAc;QACd,WAAW;QACX,cAAc;QACd,0BAA0B;QAC1B,WAAW;QACX,cAAc;QACd,UAAU,EAAE,EAAE,cAAc,EAAE,KAAK,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,EAAE;QACjE,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;KAC3E,CAAC;AACJ,CAAC;AAED,MAAM,sBAAsB,GAA4C;IACtE,WAAW,EAAE,IAAI;IACjB,iBAAiB,EAAE,IAAI;IACvB,eAAe,EAAE,OAAO;IACxB,eAAe,EAAE,MAAM;IACvB,cAAc,EAAE,IAAI;CACrB,CAAC;AAEF,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,OAA0B,EAAE,WAAmB;IAC9E,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,cAAc,IAAI,WAAW,EAAE,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,WAAW,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,MAAM,CAAC,KAAa;IAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC;AAC3C,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { InterviewSession, ResolutionScore, ProjectType } from '../core/types.js';
2
2
  import { InterviewError } from '../core/errors.js';
3
3
  import { type Result } from '../core/result.js';
4
+ import { type InterviewOptions } from './session.js';
4
5
  import type { LLMAdapter } from '../llm/types.js';
5
6
  import { EventStore } from '../events/store.js';
6
7
  export interface StartResult {
@@ -19,15 +20,22 @@ export declare class InterviewEngine {
19
20
  private sessionManager;
20
21
  private questionGenerator;
21
22
  private resolutionScorer;
23
+ private resolutionThreshold;
24
+ private rescoreSetting;
22
25
  /**
23
26
  * @param llm 질문 생성에 쓰는 기본 어댑터
24
27
  * @param frugalLlm 해상도 점수 산정용 저비용 어댑터. 없으면 `llm`을 그대로 쓴다.
25
28
  * 점수 산정은 정해진 기준에 점수를 매기는 작업이라 질문 생성만큼의 모델이 필요 없다.
26
29
  */
27
- constructor(llm: LLMAdapter, eventStore: EventStore, frugalLlm?: LLMAdapter);
30
+ constructor(llm: LLMAdapter, eventStore: EventStore, frugalLlm?: LLMAdapter, options?: InterviewOptions);
28
31
  start(topic: string, cwd?: string): Promise<Result<StartResult, InterviewError>>;
29
32
  respond(sessionId: string, response: string): Promise<Result<RespondResult, InterviewError>>;
30
33
  score(sessionId: string): Promise<Result<ResolutionScore, InterviewError>>;
34
+ /**
35
+ * 채점을 기록하고 다시 채점할 차례면 같은 모델로 한 번 더 부른다.
36
+ * gate가 판정을 미뤘으면 다음 질문에 쓸 원칙을 돌려준다.
37
+ */
38
+ private recordScore;
31
39
  complete(sessionId: string, force?: boolean): Result<InterviewSession, InterviewError>;
32
40
  getSession(sessionId: string): InterviewSession;
33
41
  getLatestSession(): InterviewSession | null;
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/interview/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEvF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,mBAAmB,CAAC;AAMzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,qBAAa,eAAe;IAYxB,OAAO,CAAC,UAAU;IAXpB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,gBAAgB,CAAmB;IAE3C;;;;OAIG;gBAED,GAAG,EAAE,UAAU,EACP,UAAU,EAAE,UAAU,EAC9B,SAAS,CAAC,EAAE,UAAU;IAQlB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAqChF,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IA4D3C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAiBhF,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,gBAAgB,IAAI,gBAAgB,GAAG,IAAI;IAI3C,YAAY,IAAI,gBAAgB,EAAE;CAGnC"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/interview/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,WAAW,EAEZ,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,mBAAmB,CAAC;AAIzD,OAAO,EAAkB,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAGhD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,eAAe,CAAC;CAClC;AAED,qBAAa,eAAe;IAcxB,OAAO,CAAC,UAAU;IAbpB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,cAAc,CAAiB;IAEvC;;;;OAIG;gBAED,GAAG,EAAE,UAAU,EACP,UAAU,EAAE,UAAU,EAC9B,SAAS,CAAC,EAAE,UAAU,EACtB,OAAO,GAAE,gBAAqB;IAU1B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAqChF,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IA8D3C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;IAiBhF;;;OAGG;YACW,WAAW;IAuCzB,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,gBAAgB,IAAI,gBAAgB,GAAG,IAAI;IAI3C,YAAY,IAAI,gBAAgB,EAAE;CAGnC"}
@@ -1,4 +1,5 @@
1
- import { MAX_INTERVIEW_ROUNDS } from '../core/constants.js';
1
+ import { MAX_INTERVIEW_ROUNDS, RESOLUTION_THRESHOLD } from '../core/constants.js';
2
+ import { logger } from '../core/logger.js';
2
3
  import { InterviewError } from '../core/errors.js';
3
4
  import { ok, err } from '../core/result.js';
4
5
  import { selectNextPrinciple } from '../gestalt/principles.js';
@@ -6,23 +7,28 @@ import { ResolutionScorer } from './resolution.js';
6
7
  import { QuestionGenerator } from './questions.js';
7
8
  import { SessionManager } from './session.js';
8
9
  import { detectProjectType } from './brownfield.js';
10
+ import { recordScoreWithRescore, applyRescore } from './rescore.js';
9
11
  import { EventType } from '../events/types.js';
10
12
  export class InterviewEngine {
11
13
  eventStore;
12
14
  sessionManager;
13
15
  questionGenerator;
14
16
  resolutionScorer;
17
+ resolutionThreshold;
18
+ rescoreSetting;
15
19
  /**
16
20
  * @param llm 질문 생성에 쓰는 기본 어댑터
17
21
  * @param frugalLlm 해상도 점수 산정용 저비용 어댑터. 없으면 `llm`을 그대로 쓴다.
18
22
  * 점수 산정은 정해진 기준에 점수를 매기는 작업이라 질문 생성만큼의 모델이 필요 없다.
19
23
  */
20
- constructor(llm, eventStore, frugalLlm) {
24
+ constructor(llm, eventStore, frugalLlm, options = {}) {
21
25
  this.eventStore = eventStore;
22
- this.sessionManager = new SessionManager(eventStore);
26
+ this.sessionManager = new SessionManager(eventStore, options);
23
27
  this.sessionManager.loadFromStore();
24
28
  this.questionGenerator = new QuestionGenerator(llm);
25
- this.resolutionScorer = new ResolutionScorer(frugalLlm ?? llm);
29
+ this.resolutionScorer = new ResolutionScorer(frugalLlm ?? llm, options.resolutionThreshold);
30
+ this.resolutionThreshold = options.resolutionThreshold ?? RESOLUTION_THRESHOLD;
31
+ this.rescoreSetting = options.rescore ?? 'record';
26
32
  }
27
33
  async start(topic, cwd) {
28
34
  try {
@@ -61,14 +67,15 @@ export class InterviewEngine {
61
67
  }
62
68
  // Score resolution
63
69
  const resolutionScore = await this.resolutionScorer.score(session.topic, session.rounds, session.projectType);
64
- this.sessionManager.updateResolutionScore(sessionId, resolutionScore);
70
+ const afterRescore = await this.recordScore(sessionId, resolutionScore);
65
71
  // Select next principle based on current state
66
72
  const hasContradictions = (resolutionScore.contradictions?.length ?? 0) > 0;
67
- const nextPrinciple = selectNextPrinciple({
68
- roundNumber: session.rounds.length + 1,
69
- dimensions: resolutionScore.dimensions,
70
- hasContradictions,
71
- });
73
+ const nextPrinciple = afterRescore ??
74
+ selectNextPrinciple({
75
+ roundNumber: session.rounds.length + 1,
76
+ dimensions: resolutionScore.dimensions,
77
+ hasContradictions,
78
+ });
72
79
  this.eventStore.append('interview', sessionId, EventType.GESTALT_PRINCIPLE_APPLIED, {
73
80
  principle: nextPrinciple,
74
81
  roundNumber: session.rounds.length + 1,
@@ -90,13 +97,35 @@ export class InterviewEngine {
90
97
  try {
91
98
  const session = this.sessionManager.get(sessionId);
92
99
  const resolutionScore = await this.resolutionScorer.score(session.topic, session.rounds, session.projectType);
93
- this.sessionManager.updateResolutionScore(sessionId, resolutionScore);
100
+ await this.recordScore(sessionId, resolutionScore);
94
101
  return ok(resolutionScore);
95
102
  }
96
103
  catch (e) {
97
104
  return err(new InterviewError(`Failed to score: ${e instanceof Error ? e.message : String(e)}`));
98
105
  }
99
106
  }
107
+ /**
108
+ * 채점을 기록하고 다시 채점할 차례면 같은 모델로 한 번 더 부른다.
109
+ * gate가 판정을 미뤘으면 다음 질문에 쓸 원칙을 돌려준다.
110
+ */
111
+ async recordScore(sessionId, score) {
112
+ const request = recordScoreWithRescore(this.sessionManager, sessionId, score, this.rescoreSetting, this.resolutionThreshold);
113
+ if (!request)
114
+ return null;
115
+ const session = this.sessionManager.get(sessionId);
116
+ let second;
117
+ try {
118
+ second = await this.resolutionScorer.rescore(session.topic, session.rounds, session.projectType);
119
+ }
120
+ catch (e) {
121
+ // 다시 채점이 실패해도 인터뷰는 이어간다. gate면 다음에 넘을 때 다시 부른다
122
+ const error = e instanceof Error ? e.message : String(e);
123
+ logger.warn('interview.rescore.failed', { sessionId, error });
124
+ this.sessionManager.recordRescoreFailure(sessionId, error);
125
+ return null;
126
+ }
127
+ return applyRescore(this.sessionManager, sessionId, score, second, 'isolated', this.rescoreSetting, this.resolutionThreshold).principle;
128
+ }
100
129
  complete(sessionId, force = false) {
101
130
  try {
102
131
  return ok(this.sessionManager.complete(sessionId, { force }));
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/interview/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/interview/engine.ts"],"names":[],"mappings":"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"}
@@ -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"}