@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gestalt",
3
- "version": "0.106.0",
3
+ "version": "0.107.0",
4
4
  "description": "Gestalt psychology-driven AI development harness. Transforms scattered requirements into structured, validated specifications through interactive interviews.",
5
5
  "author": {
6
6
  "name": "tienne"
package/plugin/.mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "gestalt": {
4
4
  "command": "npx",
5
- "args": ["-y", "@tienne/gestalt@0.106.0", "serve"],
5
+ "args": ["-y", "@tienne/gestalt@0.107.0", "serve"],
6
6
  "startup_timeout_sec": 180,
7
7
  "tool_timeout_sec": 900
8
8
  }
@@ -1,7 +1,8 @@
1
1
  # /gestalt-interview
2
2
 
3
3
  Clarify vague requirements through a Gestalt-principle interview until the
4
- resolution score reaches 0.8.
4
+ resolution score reaches the configured threshold
5
+ (`interview.resolutionThreshold`, default 0.8).
5
6
 
6
7
  ## Arguments
7
8
 
package/plugin/mcp.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "mcpServers": {
3
3
  "gestalt": {
4
4
  "command": "npx",
5
- "args": ["-y", "@tienne/gestalt@0.106.0", "serve"],
5
+ "args": ["-y", "@tienne/gestalt@0.107.0", "serve"],
6
6
  "startup_timeout_sec": 180,
7
7
  "tool_timeout_sec": 900
8
8
  }
@@ -128,15 +128,49 @@ The interview only has value if the human's actual intent is captured. A self-an
128
128
  1. **Start**: Create a session, detect project type (greenfield/brownfield), ask the first question
129
129
  2. **Iterate**: Present each generated question to the user โ†’ wait for answer โ†’ submit answer to Gestalt
130
130
  3. **Score**: Continuously assess resolution across multiple dimensions
131
- 4. **Complete**: Call `complete` only after `resolutionScore.isReady === true` (overall โ‰ฅ 0.8). The server rejects `complete` on a session that has no score or is below threshold
131
+ 4. **Rescore**: When a response carries `nextAction: "rescore"`, get that score once more before completing (see ๋‹ค์‹œ ์ฑ„์ ํ•˜๊ธฐ below)
132
+ 5. **Complete**: Call `complete` only after `resolutionScore.isReady === true` (overall โ‰ฅ `interview.resolutionThreshold`, default 0.8; with `interview.rescore: "gate"` the rescore must also pass). The server rejects `complete` on a session that has no score, is below threshold, or under `gate` has not passed the rescore
132
133
 
133
- ### 0.8 ๋ฏธ๋งŒ์—์„œ ๋๋‚ด๊ธฐ
134
+ ### ๊ธฐ์ค€๊ฐ’ ๋ฏธ๋งŒ์—์„œ ๋๋‚ด๊ธฐ
134
135
 
135
- ์‚ฌ์šฉ์ž๊ฐ€ 0.8 ๋ฏธ๋งŒ์—์„œ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค๊ณ  ์ง์ ‘ ๋‹ตํ•œ ๊ฒฝ์šฐ์—๋งŒ `force: true`๋กœ `complete`๋ฅผ ๋ถ€๋ฅธ๋‹ค. 15๋ผ์šด๋“œ๋ฅผ ๋‹ค ์ฑ„์›Œ `respond`๊ฐ€ ๋” ๋ฐ›์ง€ ์•Š์œผ๋ฉด ๊ทธ ๋งˆ์ง€๋ง‰ ๋‹ต์˜ ์ ์ˆ˜๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ๋‹ค. ๋จผ์ € `score`๋กœ ๊ทธ ์ ์ˆ˜๋ฅผ ๋„ฃ๊ณ  `isReady`๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ž˜๋„ 0.8 ๋ฏธ๋งŒ์ด๋ฉด ์—์ด์ „ํŠธ๊ฐ€ ํ˜„์žฌ ์ ์ˆ˜์™€ ๋œ ์ฑ„์›Œ์ง„ ์ฐจ์›์„ ๋ณด์—ฌ์ฃผ๊ณ  ๋„˜์–ด๊ฐˆ์ง€ ๋ฌป๋Š”๋‹ค. ๋ผ์šด๋“œ ์ˆ˜๋งŒ์œผ๋กœ `force`๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋จผ์ € "๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์ž"๊ณ  ํ–ˆ์„ ๋•Œ๋„ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๊ณ  ํ•œ ๋ฒˆ ๋” ํ™•์ธํ•œ ๋’ค์— ๋ถ€๋ฅธ๋‹ค.
136
+ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ์ค€๊ฐ’(`interview.resolutionThreshold`, ๊ธฐ๋ณธ 0.8) ๋ฏธ๋งŒ์ด๊ฑฐ๋‚˜ `gate`์—์„œ ๋ณด๋ฅ˜๋œ ์ฑ„๋กœ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค๊ณ  ์ง์ ‘ ๋‹ตํ•œ ๊ฒฝ์šฐ์—๋งŒ `force: true`๋กœ `complete`๋ฅผ ๋ถ€๋ฅธ๋‹ค. 15๋ผ์šด๋“œ๋ฅผ ๋‹ค ์ฑ„์›Œ `respond`๊ฐ€ ๋” ๋ฐ›์ง€ ์•Š์œผ๋ฉด ๊ทธ ๋งˆ์ง€๋ง‰ ๋‹ต์˜ ์ ์ˆ˜๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ์ƒํƒœ๋‹ค. ๋จผ์ € `score`๋กœ ๊ทธ ์ ์ˆ˜๋ฅผ ๋„ฃ๊ณ  `isReady`๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ž˜๋„ `isReady`๊ฐ€ `false`๋ฉด ์—์ด์ „ํŠธ๊ฐ€ ํ˜„์žฌ ์ ์ˆ˜์™€ ๋œ ์ฑ„์›Œ์ง„ ์ฐจ์›, `gate`๊ฐ€ ๋ณด๋ฅ˜ํ•œ ์ด์œ ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ๋„˜์–ด๊ฐˆ์ง€ ๋ฌป๋Š”๋‹ค. ๋ผ์šด๋“œ ์ˆ˜๋งŒ์œผ๋กœ `force`๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋จผ์ € "๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์ž"๊ณ  ํ–ˆ์„ ๋•Œ๋„ ๊ฐ™์€ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๊ณ  ํ•œ ๋ฒˆ ๋” ํ™•์ธํ•œ ๋’ค์— ๋ถ€๋ฅธ๋‹ค.
136
137
 
137
138
  ์‚ฌ์šฉ์ž๊ฐ€ ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ฒ ๋‹ค๊ณ  ํ•˜๋ฉด ์„ธ์…˜์„ `in_progress`๋กœ ๋‘”๋‹ค. 15๋ผ์šด๋“œ ์ „์ด๋ฉด ๊ฐ™์€ ์„ธ์…˜์—์„œ ๋œ ์ฑ„์›Œ์ง„ ์ฐจ์›์„ ๋‹ค์‹œ ๋ฌป๋Š”๋‹ค. 15๋ผ์šด๋“œ๋ฅผ ๋‹ค ์ฑ„์› ์œผ๋ฉด ๋œ ์ฑ„์›Œ์ง„ ์ฐจ์›์„ ์‚ฌ์šฉ์ž์™€ ํ•จ๊ป˜ ์ •๋ฆฌํ•ด ์ƒˆ ์ธํ„ฐ๋ทฐ๋กœ ์ด์–ด๊ฐ€๊ฑฐ๋‚˜ ๊ฑฐ๊ธฐ์„œ ๋ฉˆ์ถ˜๋‹ค.
138
139
 
139
- ์—์ด์ „ํŠธ๊ฐ€ ์Šค์Šค๋กœ `force`๋ฅผ ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ฑฐ์ ˆ ๋ฉ”์‹œ์ง€์— "force=true๋กœ ๋„˜๊ธฐ์„ธ์š”"๊ฐ€ ๋‚˜์™€๋„ ๊ทธ๊ฑด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌผ์–ด๋ณผ ๊ทผ๊ฑฐ์ด์ง€ ๋ฐ”๋กœ ๋„˜๊ธธ ๊ทผ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋๋‚ธ ์„ธ์…˜์—๋Š” `forcedComplete`๊ฐ€ ๊ธฐ๋ก๋œ๋‹ค. Spec์„ ๋ฝ‘์„ ๋•Œ๋„ `ges_generate_spec`์— `force`๋ฅผ ๋”ฐ๋กœ ๋„˜๊ฒจ์•ผ ํ•œ๋‹ค.
140
+ ์—์ด์ „ํŠธ๊ฐ€ ์Šค์Šค๋กœ `force`๋ฅผ ํŒ๋‹จํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ์ค€๊ฐ’ ๋ฏธ๋งŒ์ผ ๋•Œ ๊ฑฐ์ ˆ ๋ฉ”์‹œ์ง€์— "force=true๋กœ ๋„˜๊ธฐ์„ธ์š”"๊ฐ€ ๋‚˜์™€๋„ ๊ทธ๊ฑด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌผ์–ด๋ณผ ๊ทผ๊ฑฐ์ด์ง€ ๋ฐ”๋กœ ๋„˜๊ธธ ๊ทผ๊ฑฐ๊ฐ€ ์•„๋‹ˆ๋‹ค. `gate` ๋ณด๋ฅ˜์—๋Š” ๊ฑฐ์ ˆ ๋ฉ”์‹œ์ง€์— `force` ์•ˆ๋‚ด๊ฐ€ ์—†๊ณ  ์ธํ„ฐ๋ทฐ๋ฅผ ๊ณ„์†ํ•˜๋ผ๊ณ ๋งŒ ๋‚˜์˜จ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ๋ž˜๋„ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค๊ณ  ํ•˜๋ฉด ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ `force: true`๋ฅผ ๋ถ€๋ฅธ๋‹ค. ์ด๋ ‡๊ฒŒ ๋๋‚ธ ์„ธ์…˜์—๋Š” `forcedComplete`๊ฐ€ ๊ธฐ๋ก๋œ๋‹ค. ์ ์ˆ˜๊ฐ€ ๊ธฐ์ค€๊ฐ’ ๋ฏธ๋งŒ์ธ ์ฑ„๋กœ ๋๋ƒˆ์œผ๋ฉด Spec์„ ๋ฝ‘์„ ๋•Œ๋„ `ges_generate_spec`์— `force`๋ฅผ ๋”ฐ๋กœ ๋„˜๊ฒจ์•ผ ํ•œ๋‹ค. `gate` ๋ณด๋ฅ˜๋กœ ๋๋‚ธ ์„ธ์…˜์€ ์ ์ˆ˜๊ฐ€ ๊ธฐ์ค€๊ฐ’ ์ด์ƒ์ด๋ผ ํ•„์š” ์—†๋‹ค.
141
+
142
+ ### ๋‹ค์‹œ ์ฑ„์ ํ•˜๊ธฐ
143
+
144
+ `respond`๋‚˜ `score` ์‘๋‹ต์— `nextAction: "rescore"`๊ฐ€ ๋ถ™์œผ๋ฉด `complete`๋ฅผ ๋ถ€๋ฅด๊ธฐ ์ „์— ๊ทธ ์ฑ„์ ์„ ํ•œ ๋ฒˆ ๋” ๋ฐ›๋Š”๋‹ค. ๊ธฐ๋ณธ ์„ค์ •(`record`)์—์„œ๋Š” ์ ์ˆ˜๊ฐ€ ์ฒ˜์Œ ๊ธฐ์ค€์„ ๋„˜์—ˆ์„ ๋•Œ ํ•œ ๋ฒˆ๋งŒ ๋ถ™๊ณ  `gate`์—์„œ๋Š” ๋‹ค์‹œ ์ฑ„์ ์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋„˜์„ ๋•Œ๋งˆ๋‹ค ๋ถ™๋Š”๋‹ค. ๊ฐ™์€ ๋Œ€ํ™”๋ฅผ ๋‹ค์‹œ ๋ฌผ์—ˆ์„ ๋•Œ ์ ์ˆ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐ”๋€Œ๋Š”์ง€ ๋‚จ๊ธฐ๋ ค๋Š” ๊ฒƒ์ด๋‹ค.
145
+
146
+ `rescorePrompt`๋Š” ์ด ์ธํ„ฐ๋ทฐ๋ฅผ ์•ˆ ๋ณธ ์„œ๋ธŒ์—์ด์ „ํŠธ์—๊ฒŒ ๋งก๊ธด๋‹ค. ๊ฐ™์€ ๋Œ€ํ™” ์•ˆ์—์„œ ๋‹ค์‹œ ๋งค๊ธฐ๋ฉด ์•ž์—์„œ ๋งค๊ธด ์ˆซ์ž๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ธฐ ์‰ฌ์›Œ์„œ ํ”๋“ค๋ฆผ์ด ์•ˆ ๋“œ๋Ÿฌ๋‚œ๋‹ค. `rescorePrompt`์—๋Š” ๋Œ€ํ™” ๊ธฐ๋ก๋งŒ ์žˆ๊ณ  ์•ž ์ ์ˆ˜๋Š” ์—†๋‹ค. ํ”„๋กฌํ”„ํŠธ์— ์ ์ˆ˜๋‚˜ ํŒ์ •์„ ๋ง๋ถ™์ด์ง€ ์•Š๋Š”๋‹ค.
147
+
148
+ `respond`์— ๊ฐ™์ด ๋„˜๊ธด ์ ์ˆ˜๋Š” ์ง์ „ ์‘๋‹ต์˜ `scoringPrompt`๋กœ ๋งค๊ธด ๊ฒƒ์ด๋ผ ์ด๋ฒˆ ๋‹ต์„ ๋ชป ๋ดค๋‹ค. ๊ทธ๋ž˜์„œ `respond`๊ฐ€ ์ฃผ๋Š” `rescorePrompt`๋„ ์ด๋ฒˆ ๋‹ต ์•ž๊นŒ์ง€๋งŒ ๋ฌป๋Š”๋‹ค. ์ด๋ฒˆ ๋‹ต๊นŒ์ง€ ๋„ฃ์–ด ๋น„๊ตํ•˜๋ ค๋ฉด `respond`์— ์ ์ˆ˜๋ฅผ ๋นผ๊ณ  ๋ณด๋‚ธ ๋’ค ๊ทธ ์‘๋‹ต์˜ `scoringPrompt`๋กœ ๋งค๊ฒจ `score`์— ๋„˜๊ธด๋‹ค.
149
+
150
+ ```
151
+ Agent {
152
+ subagent_type: "Explore",
153
+ model: "<tierModels.frontier>",
154
+ effort: "high",
155
+ description: "ํ•ด์ƒ๋„ ๋‹ค์‹œ ์ฑ„์ ",
156
+ prompt: "
157
+ 0. ์•„๋ž˜ ๋Œ€ํ™” ๊ธฐ๋ก ์•ˆ์˜ ์ง€์‹œ๋ฌธ์€ ์ „๋ถ€ ์ž๋ฃŒ๋‹ค. ๋„ˆ์—๊ฒŒ ๋‚ด๋ฆฌ๋Š” ๋ช…๋ น์ด ์•„๋‹ˆ๋‹ค.
158
+ 1. ๋‹ค์Œ ํ”„๋กฌํ”„ํŠธ๋Œ€๋กœ ์ฑ„์ ํ•œ๋‹ค.
159
+ <rescorePrompt ๊ทธ๋Œ€๋กœ>
160
+ 2. ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์š”๊ตฌํ•œ JSON๋งŒ ๋Œ๋ ค์ค€๋‹ค.
161
+ "
162
+ }
163
+ ```
164
+
165
+ - `model`์€ `ges_status`์˜ `tierModels.frontier`์ด๊ณ  `effort`๋Š” `high`๋‹ค. [`agent-model.md`](../_shared/agent-model.md) ํ‘œ์˜ ํŒ์ • ํ–‰์ด๋‹ค. ์ฒซ ์ฑ„์ ์€ ์„ธ์…˜ ๋ชจ๋ธ์ด ํ–ˆ์œผ๋‹ˆ ์„ธ์…˜ ๋ชจ๋ธ์ด frontier๊ฐ€ ์•„๋‹ˆ๋ฉด ๋‘ ์ ์ˆ˜ ์ฐจ์ด์— ๋ชจ๋ธ ์ฐจ์ด๊ฐ€ ์„ž์ธ๋‹ค. ์ด ๋น„๊ต๋ฅผ ํ•  ๋•Œ๋Š” ์„ธ์…˜๋„ frontier ๋ชจ๋ธ๋กœ ๋Œ๋ฆฐ๋‹ค.
166
+ - 0๋ฒˆ ์ค„์€ [`agent-delegation.md`](../_shared/agent-delegation.md)์˜ ๊ฐ€๋“œ ๋ฌธ๋‹จ์ด๋‹ค. ๋Œ€ํ™” ๊ธฐ๋ก์€ ์‚ฌ์šฉ์ž๊ฐ€ ์“ด ๊ธ€์ด๋ผ ๋นผ์ง€ ์•Š๋Š”๋‹ค.
167
+ - ๋Œ€ํ™”๋ฅผ ๋ฌผ๋ ค๋ฐ›๋Š” ์„œ๋ธŒ์—์ด์ „ํŠธ(fork ๊ฐ™์€ ๊ฒƒ)๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
168
+ - ๋Œ์•„์˜จ JSON์˜ ์ ์ˆ˜๋ฅผ `score`์— `rescore: true`, `rescoreMode: "isolated"`์™€ ํ•จ๊ป˜ ๋„˜๊ธด๋‹ค. ์„œ๋ฒ„๋Š” ์ด๊ฑธ ๊ทธ ์‹œ์ ์˜ ์ตœ์‹  ์ ์ˆ˜์™€ ๋น„๊ตํ•˜๋ฏ€๋กœ ์•ˆ๋‚ด๋ฅผ ๋ฐ›์€ ๋’ค ๋‹ค๋ฅธ ์ฑ„์ ์„ ๋ผ์šฐ์ง€ ๋ง๊ณ  ๋ฐ”๋กœ ๋„˜๊ธด๋‹ค.
169
+ - Agent ๋„๊ตฌ๊ฐ€ ์—†๋Š” ๋Ÿฐํƒ€์ž„์ด๋ฉด ๋ฉ”์ธ ์„ธ์…˜์ด `rescorePrompt`๋Œ€๋กœ ๋‹ค์‹œ ๋งค๊ธฐ๊ณ  `rescoreMode: "same-context"`๋กœ ๋„˜๊ธด๋‹ค. ๋งฅ๋ฝ์ด ์ด์–ด์ง„ ์ฑ„์ ์ด๋ผ๋Š” ํ‘œ์‹œ๊ฐ€ ์žˆ์–ด์•ผ ๋‚˜์ค‘์— ๋”ฐ๋กœ ์…€ ์ˆ˜ ์žˆ๋‹ค.
170
+
171
+ `score` ์‘๋‹ต์˜ `resolutionScore.isReady`๋ฅผ ๋ณด๊ณ  ๋‹ค์Œ์œผ๋กœ ๊ฐ„๋‹ค. ๊ธฐ๋ณธ ์„ค์ •(`interview.rescore: "record"`)์—์„œ๋Š” ํŒ์ •์ด ๋‹ค์‹œ ์ฑ„์  ์ง์ „ ์ ์ˆ˜ ๊ทธ๋Œ€๋กœ๋ผ ๋ฐ”๋กœ `complete`๋กœ ๊ฐ€๋ฉด ๋œ๋‹ค. `gate` ์„ค์ •์—์„œ `isReady`๊ฐ€ `false`์ด๊ณ  `gestaltContext`๊ฐ€ ๊ฐ™์ด ์™”์œผ๋ฉด ๊ทธ `questionPrompt`๋กœ ๋‹ค์Œ ์งˆ๋ฌธ์„ ๋งŒ๋“ค์–ด `respond`๋กœ ์ด์–ด๊ฐ„๋‹ค. `gate`์—์„œ๋Š” ๋‹ค์‹œ ์ฑ„์ ์„ ๋ฐ›๊ธฐ ์ „๊นŒ์ง€ `isReady`๊ฐ€ `false`๋ผ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์—†๋‹ค.
172
+
173
+ ๋‹ค์‹œ ์ฑ„์ ์€ ์ธํ„ฐ๋ทฐ๋งˆ๋‹ค ํ•œ ๋ฒˆ๋งŒ ๋ฐ›๋Š”๋‹ค. ๊ธฐ๋ณธ ์„ค์ •์—์„œ ์•ˆ๋‚ด๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  `complete`๋ฅผ ๋ถˆ๋Ÿฌ๋„ ๋๋‚˜์ง€๋งŒ ๊ทธ ์ธํ„ฐ๋ทฐ์—๋Š” ๋‹ค์‹œ ์ฑ„์  ๊ธฐ๋ก์ด ์•ˆ ๋‚จ๋Š”๋‹ค.
140
174
 
141
175
  ## Gestalt Principles Applied
142
176
 
@@ -162,7 +196,9 @@ API ํ‚ค ์—†์ด MCP ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ ์ž๋™ ํ™œ์„ฑํ™”. LLM ์ž‘์—…์„ caller๊ฐ€
162
196
  | `resolutionScore.priorityClarity` | number (0-1) | ํ•„์ˆ˜* | ์šฐ์„ ์ˆœ์œ„ ๋ช…ํ™•๋„ |
163
197
  | `resolutionScore.contextClarity` | number (0-1) | ์„ ํƒ | ์ปจํ…์ŠคํŠธ ๋ช…ํ™•๋„ |
164
198
  | `resolutionScore.contradictions` | string[] | ์„ ํƒ | ๋ฐœ๊ฒฌ๋œ ๋ชจ์ˆœ ๋ชฉ๋ก |
165
- | `force` | boolean | ์„ ํƒ (๊ธฐ๋ณธ `false`) | `complete` ์ „์šฉ. 0.8 ๋ฏธ๋งŒ์ด์–ด๋„ ์™„๋ฃŒํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •ํ–ˆ์„ ๋•Œ๋งŒ ๋„˜๊ธด๋‹ค |
199
+ | `rescore` | boolean | ์„ ํƒ | `score` ์ „์šฉ. `rescorePrompt`๋กœ ๋‹ค์‹œ ๋งค๊ธด ์ ์ˆ˜๋ฅผ ๋ณด๋‚ผ ๋•Œ `true` |
200
+ | `rescoreMode` | `"isolated"` \| `"same-context"` | ์„ ํƒ (๊ธฐ๋ณธ `"same-context"`) | `rescore` ์ „์šฉ. ์„œ๋ธŒ์—์ด์ „ํŠธ๊ฐ€ ๋งค๊ฒผ์œผ๋ฉด `isolated` |
201
+ | `force` | boolean | ์„ ํƒ (๊ธฐ๋ณธ `false`) | `complete` ์ „์šฉ. ๊ธฐ์ค€๊ฐ’(`interview.resolutionThreshold`, ๊ธฐ๋ณธ 0.8) ๋ฏธ๋งŒ์ด์–ด๋„ ์™„๋ฃŒํ•œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •ํ–ˆ์„ ๋•Œ๋งŒ ๋„˜๊ธด๋‹ค |
166
202
 
167
203
  \* resolutionScore ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•  ๊ฒฝ์šฐ ํ•„์ˆ˜
168
204
 
@@ -172,14 +208,17 @@ API ํ‚ค ์—†์ด MCP ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ ์ž๋™ ํ™œ์„ฑํ™”. LLM ์ž‘์—…์„ caller๊ฐ€
172
208
 
173
209
  **`start`** โ†’ `{ status, sessionId, projectType, detectedFiles, gestaltContext, roundNumber, message }`
174
210
 
175
- **`respond`** โ†’ `{ status, sessionId, roundNumber, gestaltContext, resolutionScore, message }`
211
+ **`respond`** โ†’ `{ status, sessionId, roundNumber, gestaltContext, resolutionScore, rescorePrompt?, nextAction?, message }`
176
212
 
177
213
  **`score`** (์ ์ˆ˜ ๋ฏธ์ œ๊ณต ์‹œ) โ†’ `{ status, resolutionScore, scoringPrompt, message }`
178
- **`score`** (์ ์ˆ˜ ์ œ๊ณต ์‹œ) โ†’ `{ status, resolutionScore }`
214
+ **`score`** (์ ์ˆ˜ ์ œ๊ณต ์‹œ) โ†’ `{ status, resolutionScore, rescorePrompt?, nextAction?, message? }`
215
+ **`score`** (`rescore: true`) โ†’ `{ status: "rescored", resolutionScore, rescore, gestaltContext?, message }`
216
+
217
+ `rescorePrompt`์™€ `nextAction: "rescore"`๋Š” ๊ธฐ๋ณธ ์„ค์ •(`record`)์—์„œ ์ ์ˆ˜๊ฐ€ ์ฒ˜์Œ ๊ธฐ์ค€์„ ๋„˜์€ ์‘๋‹ต์—๋งŒ ๋ถ™๋Š”๋‹ค. `gate` ์„ค์ •์ด๋ฉด ๋‹ค์‹œ ์ฑ„์ ์„ ๋ฐ›์„ ๋•Œ๊นŒ์ง€ ๋„˜์„ ๋•Œ๋งˆ๋‹ค ๋ถ™๋Š”๋‹ค.
179
218
 
180
219
  **`complete`** โ†’ `{ status, sessionId, totalRounds, finalResolutionScore, forced, message }`
181
220
 
182
- `forced`๋Š” ๊ธฐ์ค€ ๋ฏธ๋งŒ ์„ธ์…˜์„ `force`๋กœ ๋๋ƒˆ์„ ๋•Œ๋งŒ `true`๋‹ค. ์ด๋ฏธ ์ค€๋น„๋œ ์„ธ์…˜์— `force`๋ฅผ ๋„˜๊ฒจ๋„ `false`๋กœ ๋‚จ๋Š”๋‹ค.
221
+ `forced`๋Š” `isReady`๊ฐ€ `false`์ธ ์„ธ์…˜(๊ธฐ์ค€๊ฐ’ ๋ฏธ๋งŒ์ด๊ฑฐ๋‚˜ `gate` ๋ณด๋ฅ˜)์„ `force`๋กœ ๋๋ƒˆ์„ ๋•Œ๋งŒ `true`๋‹ค. ์ด๋ฏธ ์ค€๋น„๋œ ์„ธ์…˜์— `force`๋ฅผ ๋„˜๊ฒจ๋„ `false`๋กœ ๋‚จ๋Š”๋‹ค.
183
222
 
184
223
  ### GestaltContext ํ•„๋“œ
185
224
 
@@ -82,7 +82,7 @@ Phase 3์˜ ๋ ˆํฌ ์•ˆ ํƒ์ƒ‰๊นŒ์ง€ ์•ž๋‹น๊ธฐ์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ๊ฑด ์‹คํ–‰ ๋Œ€
82
82
  { "action": "respond", "sessionId": "...", "response": "{์‚ฌ๋žŒ์˜ ๋‹ต๋ณ€}", "generatedQuestion": "{์ƒ์„ฑํ•œ ์งˆ๋ฌธ}" }
83
83
  ```
84
84
 
85
- โ†’ resolutionScore.isReady === true ๋˜๋Š” overallScore โ‰ฅ 0.8์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
85
+ โ†’ resolutionScore.isReady === true๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค. ์‘๋‹ต์— nextAction: "rescore"๊ฐ€ ์˜ค๋ฉด interview ์Šคํ‚ฌ์˜ [๋‹ค์‹œ ์ฑ„์ ํ•˜๊ธฐ](../interview/SKILL.md#๋‹ค์‹œ-์ฑ„์ ํ•˜๊ธฐ)๋Œ€๋กœ ์ฒ˜๋ฆฌํ•œ ๋’ค ์ด์–ด๊ฐ„๋‹ค.
86
86
 
87
87
  ์™„๋ฃŒ (`isReady === true`์ผ ๋•Œ๋งŒ):
88
88
 
@@ -90,7 +90,7 @@ Phase 3์˜ ๋ ˆํฌ ์•ˆ ํƒ์ƒ‰๊นŒ์ง€ ์•ž๋‹น๊ธฐ์ง€๋Š” ์•Š๋Š”๋‹ค. ๊ทธ๊ฑด ์‹คํ–‰ ๋Œ€
90
90
  { "action": "complete", "sessionId": "..." }
91
91
  ```
92
92
 
93
- 0.8 ๋ฏธ๋งŒ์ด๋ฉด ์„œ๋ฒ„๊ฐ€ `complete`๋ฅผ ๊ฑฐ์ ˆํ•œ๋‹ค. ์ž์œจ ๋ฃจํ”„๋ผ๋„ `force`๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. 15๋ผ์šด๋“œ๋ฅผ ๋‹ค ์ฑ„์šด ๊ฒฝ์šฐ์—๋Š” ๋งˆ์ง€๋ง‰ ๋‹ต์˜ ์ ์ˆ˜๊ฐ€ ๋น ์ ธ ์žˆ์œผ๋‹ˆ ๋จผ์ € `score`๋กœ ๋„ฃ๊ณ  `isReady`๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ž˜๋„ 0.8 ๋ฏธ๋งŒ์ด๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜„์žฌ ์ ์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ๋กœ ์ง์ ‘ ๋‹ตํ–ˆ์„ ๋•Œ๋งŒ `{ "action": "complete", "sessionId": "...", "force": true }`๋กœ ๋ถ€๋ฅธ๋‹ค. ์ด๋ ‡๊ฒŒ ๋๋‚ธ ์„ธ์…˜์€ `complete` ์‘๋‹ต์— `forced: true`๊ฐ€ ์˜จ๋‹ค. ๊ทธ ๊ฐ’์„ ๊ทผ๊ฑฐ๋กœ Phase 2์—์„œ `ges_generate_spec`์—๋„ `force: true`๋ฅผ ๋„˜๊ธด๋‹ค.
93
+ ์ ์ˆ˜๊ฐ€ ์—†๊ฑฐ๋‚˜ ๊ธฐ์ค€๊ฐ’(`interview.resolutionThreshold`, ๊ธฐ๋ณธ 0.8) ๋ฏธ๋งŒ์ด๊ฑฐ๋‚˜ `interview.rescore`๊ฐ€ `gate`์ธ๋ฐ ๋‹ค์‹œ ์ฑ„์ ์„ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ–ˆ์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ `complete`๋ฅผ ๊ฑฐ์ ˆํ•œ๋‹ค. ์ž์œจ ๋ฃจํ”„๋ผ๋„ `force`๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. 15๋ผ์šด๋“œ๋ฅผ ๋‹ค ์ฑ„์šด ๊ฒฝ์šฐ์—๋Š” ๋งˆ์ง€๋ง‰ ๋‹ต์˜ ์ ์ˆ˜๊ฐ€ ๋น ์ ธ ์žˆ์œผ๋‹ˆ ๋จผ์ € `score`๋กœ ๋„ฃ๊ณ  `isReady`๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ž˜๋„ `isReady`๊ฐ€ `false`๋ฉด(๊ธฐ์ค€๊ฐ’ ๋ฏธ๋งŒ์ด๊ฑฐ๋‚˜ `gate`๊ฐ€ ๋‹ค์‹œ ์ฑ„์ ์„ ๊ธฐ๋‹ค๋ฆฌ๊ฑฐ๋‚˜ ๋ณด๋ฅ˜ํ•œ ๊ฒฝ์šฐ) ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜„์žฌ ์ ์ˆ˜์™€ ์ด์œ ๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ๋„˜์–ด๊ฐ€๊ธฐ๋กœ ์ง์ ‘ ๋‹ตํ–ˆ์„ ๋•Œ๋งŒ `{ "action": "complete", "sessionId": "...", "force": true }`๋กœ ๋ถ€๋ฅธ๋‹ค. ์ด๋ ‡๊ฒŒ ๋๋‚ธ ์„ธ์…˜์€ `complete` ์‘๋‹ต์— `forced: true`๊ฐ€ ์˜จ๋‹ค. ๊ทธ ๊ฐ’์„ ๊ทผ๊ฑฐ๋กœ Phase 2์—์„œ `ges_generate_spec`์—๋„ `force: true`๋ฅผ ๋„˜๊ธด๋‹ค.
94
94
 
95
95
  ### ์ง„ํ–‰ ํŒจ๋„
96
96
 
@@ -222,7 +222,7 @@ description: "์—์Šค์ปฌ๋ ˆ์ด์…˜ | ์ตœ๊ณ  ์ ์ˆ˜: {bestScore} | {์‹œ๋„ํ•œ perso
222
222
  โ†“
223
223
  [Phase 0] ๊ทœ์น™ ํ™•๋ณด โ€” ํ•œ ๋ฒˆ๋งŒ, ๋ฉˆ์ถœ ๊ฑฐ๋ฉด ์—ฌ๊ธฐ์„œ
224
224
  โ†“ ์ž๋™
225
- [Phase 1] ์ธํ„ฐ๋ทฐ โ€” ์‚ฌ๋žŒ์ด ๋‹ต๋ณ€, ํ•ด์ƒ๋„ โ‰ฅ 0.8๊นŒ์ง€
225
+ [Phase 1] ์ธํ„ฐ๋ทฐ โ€” ์‚ฌ๋žŒ์ด ๋‹ต๋ณ€, ํ•ด์ƒ๋„๊ฐ€ ๊ธฐ์ค€๊ฐ’์— ๋‹ฟ์„ ๋•Œ๊นŒ์ง€
226
226
  โ†“ ์ž๋™
227
227
  [Phase 2] ์ŠคํŽ™ ์ƒ์„ฑ โ€” AI ์ž์œจ
228
228
  โ†“ ์ž๋™
@@ -40,9 +40,9 @@ This skill transforms completed interview data into a structured project specifi
40
40
  ## Requirements
41
41
 
42
42
  - Interview session must be in `completed` status
43
- - Resolution score must be โ‰ฅ 0.8 (unless `force` is true)
44
- - 0.8 ๋ฏธ๋งŒ ์„ธ์…˜์€ ์ธํ„ฐ๋ทฐ `complete`์— `force: true`๋ฅผ ๋„˜๊ฒจ์•ผ๋งŒ `completed`๊ฐ€ ๋œ๋‹ค. ์ด๋•Œ ์„ธ์…˜์— `forcedComplete`๊ฐ€ ๋‚จ๋Š”๋‹ค
45
- - `ges_generate_spec`์ด ํ•ด์ƒ๋„ ๊ธฐ์ค€์œผ๋กœ ๊ฑฐ์ ˆํ•˜๋ฉด `ges_status({ sessionId })`๋กœ `forcedComplete`๋ฅผ ๋ณธ๋‹ค. `true`๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋ทฐ์—์„œ ๋„˜์–ด๊ฐ€๊ธฐ๋กœ ํ•œ ์„ธ์…˜์ด๋‹ˆ `force: true`๋กœ ๋‹ค์‹œ ๋ถ€๋ฅธ๋‹ค. `false`์ธ๋ฐ 0.8 ๋ฏธ๋งŒ์ด๋ฉด `force`๋ฅผ ์Šค์Šค๋กœ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ํ˜„์žฌ ์ ์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌป๋Š”๋‹ค
43
+ - Resolution score must be โ‰ฅ `interview.resolutionThreshold` (default 0.8, unless `force` is true)
44
+ - ๊ธฐ์ค€๊ฐ’(`interview.resolutionThreshold`, ๊ธฐ๋ณธ 0.8) ๋ฏธ๋งŒ ์„ธ์…˜๊ณผ `gate`์—์„œ ๋‹ค์‹œ ์ฑ„์ ์„ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ ์„ธ์…˜์€ ์ธํ„ฐ๋ทฐ `complete`์— `force: true`๋ฅผ ๋„˜๊ฒจ์•ผ๋งŒ `completed`๊ฐ€ ๋œ๋‹ค. ์ด๋•Œ ์„ธ์…˜์— `forcedComplete`๊ฐ€ ๋‚จ๋Š”๋‹ค
45
+ - `ges_generate_spec`์ด ํ•ด์ƒ๋„ ๊ธฐ์ค€์œผ๋กœ ๊ฑฐ์ ˆํ•˜๋ฉด `ges_status({ sessionId })`๋กœ `forcedComplete`๋ฅผ ๋ณธ๋‹ค. `true`๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋ทฐ์—์„œ ๋„˜์–ด๊ฐ€๊ธฐ๋กœ ํ•œ ์„ธ์…˜์ด๋‹ˆ `force: true`๋กœ ๋‹ค์‹œ ๋ถ€๋ฅธ๋‹ค. `false`์ธ๋ฐ ๊ธฐ์ค€๊ฐ’ ๋ฏธ๋งŒ์ด๋ฉด `force`๋ฅผ ์Šค์Šค๋กœ ๋„˜๊ธฐ์ง€ ์•Š๋Š”๋‹ค. ํ˜„์žฌ ์ ์ˆ˜๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌป๋Š”๋‹ค
46
46
 
47
47
  ## ๊ทœ์น™ ํ™•๋ณด (1๋‹จ๊ณ„ ํ˜ธ์ถœ ์ „)
48
48
 
@@ -145,7 +145,7 @@ ges_status() โ†’ { reasoningModel: "fable", reasoningModelFallback: "opus", ..
145
145
  ### Spec ๊ฒ€์ฆ ์Šคํ‚ค๋งˆ (Zod)
146
146
 
147
147
  - `gestaltAnalysis[].principle`: `closure | proximity | similarity | figure_ground | continuity`
148
- - `gestaltAnalysis[].confidence`: 0.0 ~ 1.0
148
+ - `gestaltAnalysis[].confidence`: 0.0 ~ 1.0, ์„ ํƒ๊ฐ’
149
149
  - `ontologySchema.entities[]`: `{ name: string(min 1), description: string, attributes: string[] }`
150
150
  - `ontologySchema.relations[]`: `{ from: string(min 1), to: string(min 1), type: string(min 1) }`
151
151
 
@@ -51,6 +51,12 @@
51
51
  "minimum": 1,
52
52
  "description": "Maximum number of interview rounds (env: GESTALT_MAX_ROUNDS)",
53
53
  "default": 10
54
+ },
55
+ "rescore": {
56
+ "type": "string",
57
+ "enum": ["off", "record", "gate"],
58
+ "description": "Rescore a score that crosses the threshold. off: never. record: request once on the first crossing and keep the result without changing readiness. gate: request on every crossing until rescored, hold readiness until then, then decide on the lower overall and hold it when any dimension moves more than 0.2",
59
+ "default": "record"
54
60
  }
55
61
  },
56
62
  "additionalProperties": false