edsger 0.2.7 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/phases/technical-design/analyzer-helpers.d.ts +2 -1
- package/dist/phases/technical-design/analyzer-helpers.js +41 -4
- package/dist/phases/technical-design/analyzer.js +23 -10
- package/dist/phases/technical-design-verification/verifier.d.ts +17 -0
- package/dist/phases/technical-design-verification/verifier.js +27 -4
- package/dist/prompts/technical-design-verification.d.ts +2 -0
- package/dist/prompts/technical-design-verification.js +89 -9
- package/dist/services/audit-logs.d.ts +17 -0
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EdsgerConfig } from '../../types/index.js';
|
|
2
2
|
import { ChecklistPhaseContext } from '../../services/checklist.js';
|
|
3
3
|
import { type ChecklistVerificationResult } from '../technical-design-verification/index.js';
|
|
4
|
+
import { FeedbacksContext } from '../../services/feedbacks.js';
|
|
4
5
|
export interface TechnicalDesignResult {
|
|
5
6
|
featureId: string;
|
|
6
7
|
technicalDesign: string | null;
|
|
@@ -21,7 +22,7 @@ interface VerificationCycleResult {
|
|
|
21
22
|
/**
|
|
22
23
|
* Perform verification and determine if iteration should continue
|
|
23
24
|
*/
|
|
24
|
-
export declare function performVerificationCycle(technicalDesign: string, checklistContext: ChecklistPhaseContext | null, featureId: string, featureName: string, featureDescription: string | undefined, config: EdsgerConfig, currentIteration: number, maxIterations: number, mcpServerUrl: string, mcpToken: string, verbose?: boolean): Promise<VerificationCycleResult>;
|
|
25
|
+
export declare function performVerificationCycle(technicalDesign: string, checklistContext: ChecklistPhaseContext | null, feedbacksContext: FeedbacksContext | null, featureId: string, featureName: string, featureDescription: string | undefined, config: EdsgerConfig, currentIteration: number, maxIterations: number, mcpServerUrl: string, mcpToken: string, verbose?: boolean): Promise<VerificationCycleResult>;
|
|
25
26
|
/**
|
|
26
27
|
* Build successful design result
|
|
27
28
|
*/
|
|
@@ -6,7 +6,7 @@ import { logFeatureVerificationEvent } from '../../services/audit-logs.js';
|
|
|
6
6
|
/**
|
|
7
7
|
* Perform verification and determine if iteration should continue
|
|
8
8
|
*/
|
|
9
|
-
export async function performVerificationCycle(technicalDesign, checklistContext, featureId, featureName, featureDescription, config, currentIteration, maxIterations, mcpServerUrl, mcpToken, verbose) {
|
|
9
|
+
export async function performVerificationCycle(technicalDesign, checklistContext, feedbacksContext, featureId, featureName, featureDescription, config, currentIteration, maxIterations, mcpServerUrl, mcpToken, verbose) {
|
|
10
10
|
// No verification needed if no checklist context
|
|
11
11
|
if (!checklistContext || checklistContext.checklists.length === 0) {
|
|
12
12
|
return { passed: true, verificationResult: null };
|
|
@@ -16,16 +16,24 @@ export async function performVerificationCycle(technicalDesign, checklistContext
|
|
|
16
16
|
}
|
|
17
17
|
const verificationResult = await verifyTechnicalDesignCompliance({
|
|
18
18
|
checklistContext,
|
|
19
|
+
feedbacksContext,
|
|
19
20
|
featureId,
|
|
20
21
|
featureName,
|
|
21
22
|
featureDescription,
|
|
22
23
|
technicalDesign,
|
|
23
24
|
verbose,
|
|
24
25
|
}, config);
|
|
25
|
-
// Verification passed
|
|
26
|
-
|
|
26
|
+
// Verification passed (both checklists and feedbacks)
|
|
27
|
+
const feedbacksPassed = !verificationResult.feedbacks_rejected_count ||
|
|
28
|
+
verificationResult.feedbacks_rejected_count === 0;
|
|
29
|
+
const checklistsPassed = verificationResult.rejected_count === 0;
|
|
30
|
+
if (checklistsPassed && feedbacksPassed) {
|
|
27
31
|
if (verbose) {
|
|
28
32
|
logInfo(`✅ Checklist verification passed: ${verificationResult.confirmed_count} confirmed, ${verificationResult.uncertain_count} uncertain`);
|
|
33
|
+
if (verificationResult.total_feedbacks &&
|
|
34
|
+
verificationResult.total_feedbacks > 0) {
|
|
35
|
+
logInfo(`✅ Feedback verification passed: ${verificationResult.feedbacks_confirmed_count || 0} confirmed, ${verificationResult.feedbacks_uncertain_count || 0} uncertain`);
|
|
36
|
+
}
|
|
29
37
|
}
|
|
30
38
|
// Log verification success
|
|
31
39
|
await logFeatureVerificationEvent(mcpServerUrl, mcpToken, {
|
|
@@ -51,7 +59,14 @@ export async function performVerificationCycle(technicalDesign, checklistContext
|
|
|
51
59
|
return { passed: true, verificationResult };
|
|
52
60
|
}
|
|
53
61
|
// Verification failed
|
|
54
|
-
|
|
62
|
+
const errorMessages = [];
|
|
63
|
+
if (!checklistsPassed) {
|
|
64
|
+
errorMessages.push(`${verificationResult.rejected_count} checklist items rejected, ${verificationResult.uncertain_count} uncertain`);
|
|
65
|
+
}
|
|
66
|
+
if (!feedbacksPassed && verificationResult.feedbacks_rejected_count) {
|
|
67
|
+
errorMessages.push(`${verificationResult.feedbacks_rejected_count} feedbacks not addressed, ${verificationResult.feedbacks_uncertain_count || 0} uncertain`);
|
|
68
|
+
}
|
|
69
|
+
logError(`❌ Iteration ${currentIteration}: Verification FAILED - ${errorMessages.join('; ')}`);
|
|
55
70
|
// Log verification failure with improvement suggestions
|
|
56
71
|
await logFeatureVerificationEvent(mcpServerUrl, mcpToken, {
|
|
57
72
|
featureId,
|
|
@@ -78,6 +93,28 @@ export async function performVerificationCycle(technicalDesign, checklistContext
|
|
|
78
93
|
concerns: item.concerns || [],
|
|
79
94
|
improvement_suggestions: item.improvement_suggestions || [],
|
|
80
95
|
})),
|
|
96
|
+
// Include feedback verification results
|
|
97
|
+
feedbacks_confirmed_count: verificationResult.feedbacks_confirmed_count || 0,
|
|
98
|
+
feedbacks_rejected_count: verificationResult.feedbacks_rejected_count || 0,
|
|
99
|
+
feedbacks_uncertain_count: verificationResult.feedbacks_uncertain_count || 0,
|
|
100
|
+
rejected_feedbacks: verificationResult.feedback_verifications
|
|
101
|
+
?.filter((fb) => fb.verification_status === 'rejected')
|
|
102
|
+
.map((fb) => ({
|
|
103
|
+
feedback_id: fb.feedback_id,
|
|
104
|
+
feedback_title: fb.feedback_title,
|
|
105
|
+
reason: fb.verification_reason || 'No reason provided',
|
|
106
|
+
concerns: fb.concerns || [],
|
|
107
|
+
improvement_suggestions: fb.improvement_suggestions || [],
|
|
108
|
+
})) || [],
|
|
109
|
+
uncertain_feedbacks: verificationResult.feedback_verifications
|
|
110
|
+
?.filter((fb) => fb.verification_status === 'uncertain')
|
|
111
|
+
.map((fb) => ({
|
|
112
|
+
feedback_id: fb.feedback_id,
|
|
113
|
+
feedback_title: fb.feedback_title,
|
|
114
|
+
reason: fb.verification_reason || 'No reason provided',
|
|
115
|
+
concerns: fb.concerns || [],
|
|
116
|
+
improvement_suggestions: fb.improvement_suggestions || [],
|
|
117
|
+
})) || [],
|
|
81
118
|
summary: verificationResult.summary,
|
|
82
119
|
overall_suggestions: verificationResult.overall_suggestions || [],
|
|
83
120
|
},
|
|
@@ -89,7 +89,7 @@ export const generateTechnicalDesign = async (options, config, checklistContext)
|
|
|
89
89
|
}
|
|
90
90
|
await saveTechnicalDesign(mcpServerUrl, mcpToken, featureId, structuredDesignResult.technical_design, verbose);
|
|
91
91
|
// Perform verification cycle
|
|
92
|
-
const verificationCycle = await performVerificationCycle(structuredDesignResult.technical_design, checklistContext || null, featureId, context.featureName, context.featureDescription, config, currentIteration, maxIterations, mcpServerUrl, mcpToken, verbose);
|
|
92
|
+
const verificationCycle = await performVerificationCycle(structuredDesignResult.technical_design, checklistContext || null, context.feedbacksContext, featureId, context.featureName, context.featureDescription, config, currentIteration, maxIterations, mcpServerUrl, mcpToken, verbose);
|
|
93
93
|
verificationResult = verificationCycle.verificationResult;
|
|
94
94
|
// If verification passed, exit
|
|
95
95
|
if (verificationCycle.passed) {
|
|
@@ -158,6 +158,7 @@ async function prepareDesignContext(mcpServerUrl, mcpToken, featureId, checklist
|
|
|
158
158
|
}
|
|
159
159
|
let finalContextInfo = contextInfo;
|
|
160
160
|
let hasFeedbacks = false;
|
|
161
|
+
let feedbacksContext = null;
|
|
161
162
|
// Check if there's existing technical design
|
|
162
163
|
const existingTechnicalDesign = context.feature.technical_design;
|
|
163
164
|
const hasExistingDesign = !!existingTechnicalDesign && existingTechnicalDesign.trim().length > 0;
|
|
@@ -167,7 +168,7 @@ async function prepareDesignContext(mcpServerUrl, mcpToken, featureId, checklist
|
|
|
167
168
|
}
|
|
168
169
|
// Add feedbacks context to the design prompt
|
|
169
170
|
try {
|
|
170
|
-
|
|
171
|
+
feedbacksContext = await getFeedbacksForPhase({ featureId, mcpServerUrl, mcpToken, verbose }, 'technical-design');
|
|
171
172
|
if (feedbacksContext.feedbacks.length > 0) {
|
|
172
173
|
hasFeedbacks = true;
|
|
173
174
|
const feedbacksInfo = formatFeedbacksForContext(feedbacksContext);
|
|
@@ -193,14 +194,25 @@ async function prepareDesignContext(mcpServerUrl, mcpToken, featureId, checklist
|
|
|
193
194
|
}
|
|
194
195
|
// Decide on prompt mode based on existing design and feedbacks
|
|
195
196
|
const isIncrementalUpdate = hasExistingDesign && hasFeedbacks;
|
|
196
|
-
if (
|
|
197
|
-
logInfo('
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
logInfo('🔄
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
197
|
+
if (verbose) {
|
|
198
|
+
logInfo('\n📋 Design Mode Decision:');
|
|
199
|
+
logInfo(` - Has existing design: ${hasExistingDesign}`);
|
|
200
|
+
logInfo(` - Has feedbacks: ${hasFeedbacks} (${feedbacksContext?.feedbacks.length || 0} feedbacks)`);
|
|
201
|
+
logInfo(` - Mode: ${isIncrementalUpdate ? '🔄 Incremental Update' : hasExistingDesign ? '🔄 Full Redesign' : '✨ New Design'}`);
|
|
202
|
+
if (isIncrementalUpdate && feedbacksContext) {
|
|
203
|
+
logInfo('\n🎯 Feedbacks that will be addressed:');
|
|
204
|
+
feedbacksContext.feedbacks.forEach((fb, idx) => {
|
|
205
|
+
const priorityBadge = fb.priority >= 9
|
|
206
|
+
? '🔴'
|
|
207
|
+
: fb.priority >= 7
|
|
208
|
+
? '🟠'
|
|
209
|
+
: fb.priority >= 5
|
|
210
|
+
? '🟡'
|
|
211
|
+
: '🟢';
|
|
212
|
+
logInfo(` ${idx + 1}. [${fb.feedback_type}] ${fb.title} ${priorityBadge}`);
|
|
213
|
+
logInfo(` ${fb.content.substring(0, 100)}${fb.content.length > 100 ? '...' : ''}`);
|
|
214
|
+
});
|
|
215
|
+
}
|
|
204
216
|
}
|
|
205
217
|
const designPrompt = createTechnicalDesignPromptWithContext(featureId, finalContextInfo, existingTechnicalDesign, isIncrementalUpdate);
|
|
206
218
|
return {
|
|
@@ -209,6 +221,7 @@ async function prepareDesignContext(mcpServerUrl, mcpToken, featureId, checklist
|
|
|
209
221
|
designPrompt,
|
|
210
222
|
hasExistingDesign,
|
|
211
223
|
hasFeedbacks,
|
|
224
|
+
feedbacksContext,
|
|
212
225
|
};
|
|
213
226
|
}
|
|
214
227
|
/**
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { EdsgerConfig } from '../../types/index.js';
|
|
6
6
|
import { ChecklistPhaseContext } from '../../services/checklist.js';
|
|
7
|
+
import { FeedbacksContext } from '../../services/feedbacks.js';
|
|
7
8
|
export interface ChecklistItemVerificationResult {
|
|
8
9
|
checklist_item_id: string;
|
|
9
10
|
is_satisfied: boolean;
|
|
@@ -12,6 +13,15 @@ export interface ChecklistItemVerificationResult {
|
|
|
12
13
|
concerns?: string[];
|
|
13
14
|
improvement_suggestions?: string[];
|
|
14
15
|
}
|
|
16
|
+
export interface FeedbackVerificationResult {
|
|
17
|
+
feedback_id: string;
|
|
18
|
+
feedback_title: string;
|
|
19
|
+
is_addressed: boolean;
|
|
20
|
+
verification_status: 'confirmed' | 'rejected' | 'uncertain';
|
|
21
|
+
verification_reason: string;
|
|
22
|
+
concerns?: string[];
|
|
23
|
+
improvement_suggestions?: string[];
|
|
24
|
+
}
|
|
15
25
|
export interface ChecklistVerificationResult {
|
|
16
26
|
all_verified: boolean;
|
|
17
27
|
total_items: number;
|
|
@@ -19,11 +29,18 @@ export interface ChecklistVerificationResult {
|
|
|
19
29
|
rejected_count: number;
|
|
20
30
|
uncertain_count: number;
|
|
21
31
|
item_verifications: ChecklistItemVerificationResult[];
|
|
32
|
+
feedbacks_verified?: boolean;
|
|
33
|
+
total_feedbacks?: number;
|
|
34
|
+
feedbacks_confirmed_count?: number;
|
|
35
|
+
feedbacks_rejected_count?: number;
|
|
36
|
+
feedbacks_uncertain_count?: number;
|
|
37
|
+
feedback_verifications?: FeedbackVerificationResult[];
|
|
22
38
|
summary: string;
|
|
23
39
|
overall_suggestions?: string[];
|
|
24
40
|
}
|
|
25
41
|
export interface VerifyTechnicalDesignOptions {
|
|
26
42
|
checklistContext: ChecklistPhaseContext;
|
|
43
|
+
feedbacksContext?: FeedbacksContext | null;
|
|
27
44
|
featureId: string;
|
|
28
45
|
featureName: string;
|
|
29
46
|
featureDescription?: string;
|
|
@@ -18,16 +18,22 @@ async function* prompt(verificationPrompt) {
|
|
|
18
18
|
* Verify checklist compliance for technical design using an independent AI agent
|
|
19
19
|
*/
|
|
20
20
|
export async function verifyTechnicalDesignCompliance(options, config) {
|
|
21
|
-
const { checklistContext, featureId, featureName, featureDescription, technicalDesign, verbose, } = options;
|
|
21
|
+
const { checklistContext, feedbacksContext, featureId, featureName, featureDescription, technicalDesign, verbose, } = options;
|
|
22
22
|
const totalChecklistItems = checklistContext.checklists.reduce((sum, checklist) => sum + checklist.items.length, 0);
|
|
23
|
+
const totalFeedbacks = feedbacksContext?.feedbacks?.length || 0;
|
|
24
|
+
const hasFeedbacks = totalFeedbacks > 0;
|
|
23
25
|
if (verbose) {
|
|
24
26
|
logInfo('🔍 Starting technical design verification...');
|
|
25
27
|
logInfo(` Verifying ${totalChecklistItems} checklist items`);
|
|
28
|
+
if (hasFeedbacks) {
|
|
29
|
+
logInfo(` Verifying ${totalFeedbacks} human feedbacks`);
|
|
30
|
+
}
|
|
26
31
|
}
|
|
27
32
|
try {
|
|
28
33
|
const systemPrompt = createTechnicalDesignVerificationSystemPrompt(config);
|
|
29
34
|
const verificationPrompt = createTechnicalDesignVerificationPrompt({
|
|
30
35
|
checklistContext,
|
|
36
|
+
feedbacksContext: feedbacksContext || undefined,
|
|
31
37
|
featureId,
|
|
32
38
|
featureName,
|
|
33
39
|
featureDescription,
|
|
@@ -100,13 +106,20 @@ export async function verifyTechnicalDesignCompliance(options, config) {
|
|
|
100
106
|
}
|
|
101
107
|
if (verbose) {
|
|
102
108
|
logInfo('\n📊 Verification Summary:');
|
|
103
|
-
logInfo(` Total items: ${verificationResult.total_items}`);
|
|
109
|
+
logInfo(` Total checklist items: ${verificationResult.total_items}`);
|
|
104
110
|
logInfo(` ✅ Confirmed: ${verificationResult.confirmed_count}`);
|
|
105
111
|
logInfo(` ❌ Rejected: ${verificationResult.rejected_count}`);
|
|
106
112
|
logInfo(` ⚠️ Uncertain: ${verificationResult.uncertain_count}`);
|
|
107
|
-
|
|
113
|
+
if (verificationResult.total_feedbacks &&
|
|
114
|
+
verificationResult.total_feedbacks > 0) {
|
|
115
|
+
logInfo(`\n Total feedbacks: ${verificationResult.total_feedbacks}`);
|
|
116
|
+
logInfo(` ✅ Confirmed: ${verificationResult.feedbacks_confirmed_count || 0}`);
|
|
117
|
+
logInfo(` ❌ Rejected: ${verificationResult.feedbacks_rejected_count || 0}`);
|
|
118
|
+
logInfo(` ⚠️ Uncertain: ${verificationResult.feedbacks_uncertain_count || 0}`);
|
|
119
|
+
}
|
|
120
|
+
logInfo(`\n Summary: ${verificationResult.summary}`);
|
|
108
121
|
if (verificationResult.rejected_count > 0) {
|
|
109
|
-
logInfo('\n❌ Rejected items:');
|
|
122
|
+
logInfo('\n❌ Rejected checklist items:');
|
|
110
123
|
verificationResult.item_verifications
|
|
111
124
|
.filter((v) => v.verification_status === 'rejected')
|
|
112
125
|
.forEach((v) => {
|
|
@@ -114,6 +127,16 @@ export async function verifyTechnicalDesignCompliance(options, config) {
|
|
|
114
127
|
logInfo(` Reason: ${v.verification_reason}`);
|
|
115
128
|
});
|
|
116
129
|
}
|
|
130
|
+
if (verificationResult.feedbacks_rejected_count &&
|
|
131
|
+
verificationResult.feedbacks_rejected_count > 0) {
|
|
132
|
+
logInfo('\n❌ Rejected feedbacks:');
|
|
133
|
+
verificationResult.feedback_verifications
|
|
134
|
+
?.filter((v) => v.verification_status === 'rejected')
|
|
135
|
+
.forEach((v) => {
|
|
136
|
+
logInfo(` - ${v.feedback_title}`);
|
|
137
|
+
logInfo(` Reason: ${v.verification_reason}`);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
117
140
|
}
|
|
118
141
|
return verificationResult;
|
|
119
142
|
}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { EdsgerConfig } from '../types/index.js';
|
|
2
2
|
import { ChecklistPhaseContext } from '../services/checklist.js';
|
|
3
|
+
import { FeedbacksContext } from '../services/feedbacks.js';
|
|
3
4
|
export declare const createTechnicalDesignVerificationSystemPrompt: (_config: EdsgerConfig) => string;
|
|
4
5
|
export interface TechnicalDesignVerificationPromptOptions {
|
|
5
6
|
checklistContext: ChecklistPhaseContext;
|
|
7
|
+
feedbacksContext?: FeedbacksContext;
|
|
6
8
|
featureId: string;
|
|
7
9
|
featureName: string;
|
|
8
10
|
featureDescription?: string;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export const createTechnicalDesignVerificationSystemPrompt = (_config) => {
|
|
2
|
-
return `You are an independent quality assurance auditor specializing in technical design review. Your role is to critically evaluate whether a technical design document satisfies checklist requirements.
|
|
2
|
+
return `You are an independent quality assurance auditor specializing in technical design review. Your role is to critically evaluate whether a technical design document satisfies checklist requirements and addresses human feedbacks.
|
|
3
3
|
|
|
4
|
-
**Your Mission**: Verify Technical Design Against Requirements
|
|
5
|
-
- Review the checklist requirements
|
|
4
|
+
**Your Mission**: Verify Technical Design Against Requirements and Feedbacks
|
|
5
|
+
- Review the checklist requirements and human feedbacks
|
|
6
6
|
- Examine the technical design document
|
|
7
|
-
- Determine if the design adequately addresses each requirement
|
|
7
|
+
- Determine if the design adequately addresses each requirement and feedback
|
|
8
8
|
- Be CRITICAL and look for gaps, inconsistencies, or missing elements
|
|
9
9
|
- Quality matters - don't accept bare minimum
|
|
10
10
|
|
|
@@ -52,12 +52,33 @@ You MUST respond with a JSON object in this EXACT format:
|
|
|
52
52
|
"improvement_suggestions": ["Specific, actionable suggestions for improvement (for rejected/uncertain items)"]
|
|
53
53
|
}
|
|
54
54
|
],
|
|
55
|
-
"
|
|
55
|
+
"feedbacks_verified": true/false,
|
|
56
|
+
"total_feedbacks": number,
|
|
57
|
+
"feedbacks_confirmed_count": number,
|
|
58
|
+
"feedbacks_rejected_count": number,
|
|
59
|
+
"feedbacks_uncertain_count": number,
|
|
60
|
+
"feedback_verifications": [
|
|
61
|
+
{
|
|
62
|
+
"feedback_id": "uuid",
|
|
63
|
+
"feedback_title": "title",
|
|
64
|
+
"is_addressed": true/false,
|
|
65
|
+
"verification_status": "confirmed|rejected|uncertain",
|
|
66
|
+
"verification_reason": "Detailed explanation of whether the feedback was addressed",
|
|
67
|
+
"concerns": ["Optional array of specific concerns"],
|
|
68
|
+
"improvement_suggestions": ["Specific suggestions for addressing this feedback (for rejected/uncertain items)"]
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"summary": "Overall summary of verification findings (include both checklist and feedback results)",
|
|
56
72
|
"overall_suggestions": ["High-level suggestions for improving the overall design (if there are failures)"]
|
|
57
73
|
}
|
|
58
74
|
}
|
|
59
75
|
\`\`\`
|
|
60
76
|
|
|
77
|
+
**IMPORTANT**:
|
|
78
|
+
- If feedbacks are provided, you MUST include feedback_verifications for ALL feedbacks
|
|
79
|
+
- Each feedback must be verified to check if it was properly addressed in the technical design
|
|
80
|
+
- For feedbacks, check if the specific concern or requirement mentioned in the feedback has been incorporated into the design
|
|
81
|
+
|
|
61
82
|
**For rejected/uncertain items**: Provide specific, actionable improvement_suggestions such as:
|
|
62
83
|
- "Add architectural diagram showing component interactions"
|
|
63
84
|
- "Include detailed API specifications for X endpoint"
|
|
@@ -67,7 +88,7 @@ You MUST respond with a JSON object in this EXACT format:
|
|
|
67
88
|
Be thorough, be critical, be fair. Your verification protects quality.`;
|
|
68
89
|
};
|
|
69
90
|
export const createTechnicalDesignVerificationPrompt = (options) => {
|
|
70
|
-
const { checklistContext, featureId, featureName, featureDescription, technicalDesign, } = options;
|
|
91
|
+
const { checklistContext, feedbacksContext, featureId, featureName, featureDescription, technicalDesign, } = options;
|
|
71
92
|
// Format all checklist items with their requirements
|
|
72
93
|
const checklistItemsSection = checklistContext.checklists
|
|
73
94
|
.flatMap((checklist) => checklist.items.map((item) => {
|
|
@@ -81,9 +102,38 @@ export const createTechnicalDesignVerificationPrompt = (options) => {
|
|
|
81
102
|
}))
|
|
82
103
|
.join('\n---\n');
|
|
83
104
|
const totalChecklistItems = checklistContext.checklists.reduce((sum, checklist) => sum + checklist.items.length, 0);
|
|
105
|
+
// Format feedbacks section if provided
|
|
106
|
+
let feedbacksSection = '';
|
|
107
|
+
let totalFeedbacks = 0;
|
|
108
|
+
if (feedbacksContext && feedbacksContext.feedbacks.length > 0) {
|
|
109
|
+
totalFeedbacks = feedbacksContext.feedbacks.length;
|
|
110
|
+
feedbacksSection = `
|
|
111
|
+
|
|
112
|
+
## Human Feedbacks to Verify (${totalFeedbacks})
|
|
113
|
+
|
|
114
|
+
${feedbacksContext.feedbacks
|
|
115
|
+
.map((feedback, idx) => {
|
|
116
|
+
const priorityBadge = feedback.priority >= 9
|
|
117
|
+
? '🔴'
|
|
118
|
+
: feedback.priority >= 7
|
|
119
|
+
? '🟠'
|
|
120
|
+
: feedback.priority >= 5
|
|
121
|
+
? '🟡'
|
|
122
|
+
: '🟢';
|
|
123
|
+
return `### Feedback ${idx + 1}: ${feedback.title} ${priorityBadge}
|
|
124
|
+
**ID**: ${feedback.id}
|
|
125
|
+
**Type**: ${feedback.feedback_type}
|
|
126
|
+
**Priority**: ${feedback.priority}
|
|
127
|
+
**Content**: ${feedback.content}
|
|
128
|
+
`;
|
|
129
|
+
})
|
|
130
|
+
.join('\n---\n')}
|
|
131
|
+
|
|
132
|
+
`;
|
|
133
|
+
}
|
|
84
134
|
return `# Technical Design Verification Task
|
|
85
135
|
|
|
86
|
-
You are verifying that a technical design document satisfies checklist requirements.
|
|
136
|
+
You are verifying that a technical design document satisfies checklist requirements${totalFeedbacks > 0 ? ' and addresses human feedbacks' : ''}.
|
|
87
137
|
|
|
88
138
|
## Feature Context
|
|
89
139
|
|
|
@@ -97,12 +147,14 @@ ${technicalDesign}
|
|
|
97
147
|
|
|
98
148
|
## Checklist Requirements to Verify (${totalChecklistItems})
|
|
99
149
|
|
|
100
|
-
${checklistItemsSection}
|
|
150
|
+
${checklistItemsSection}${feedbacksSection}
|
|
101
151
|
|
|
102
152
|
---
|
|
103
153
|
|
|
104
154
|
## Your Verification Task
|
|
105
155
|
|
|
156
|
+
### Part 1: Checklist Verification
|
|
157
|
+
|
|
106
158
|
For EACH checklist item above:
|
|
107
159
|
|
|
108
160
|
1. **Understand the Requirement**: What does this checklist item require?
|
|
@@ -127,8 +179,36 @@ For EACH checklist item above:
|
|
|
127
179
|
- Suggest what sections or details should be added to the design
|
|
128
180
|
- Indicate what should be expanded or modified
|
|
129
181
|
- Give concrete examples when possible
|
|
182
|
+
${totalFeedbacks > 0
|
|
183
|
+
? `
|
|
184
|
+
|
|
185
|
+
### Part 2: Feedback Verification
|
|
186
|
+
|
|
187
|
+
For EACH feedback above:
|
|
188
|
+
|
|
189
|
+
1. **Understand the Feedback**: What specific concern, requirement, or suggestion does this feedback provide?
|
|
190
|
+
|
|
191
|
+
2. **Examine the Design**: Look at the technical design document to see if this feedback was addressed
|
|
192
|
+
|
|
193
|
+
3. **Determine if Addressed**: Was the feedback properly incorporated into the design?
|
|
194
|
+
- Does the design explicitly address this feedback?
|
|
195
|
+
- Are the changes requested in the feedback reflected in the design?
|
|
196
|
+
- Is the implementation aligned with the feedback's intent?
|
|
197
|
+
|
|
198
|
+
4. **Make Your Determination**:
|
|
199
|
+
- **CONFIRMED** (is_addressed: true): The design clearly addresses this feedback
|
|
200
|
+
- **REJECTED** (is_addressed: false): The feedback was not addressed or was ignored
|
|
201
|
+
- **UNCERTAIN** (is_addressed: false): The design partially addresses the feedback but incompletely
|
|
202
|
+
|
|
203
|
+
5. **Document Your Reasoning**: Explain whether and how the feedback was addressed
|
|
204
|
+
|
|
205
|
+
6. **Provide Improvement Suggestions** (for rejected/uncertain feedbacks):
|
|
206
|
+
- Explain how the feedback should be incorporated
|
|
207
|
+
- Suggest specific modifications to address the feedback
|
|
208
|
+
- Provide concrete examples of what should be added or changed`
|
|
209
|
+
: ''}
|
|
130
210
|
|
|
131
211
|
Remember: Focus on what the design actually contains, not on claims. Be thorough and fair.
|
|
132
212
|
|
|
133
|
-
Provide your verification results in the required JSON format with improvement_suggestions for any rejected or uncertain items.`;
|
|
213
|
+
Provide your verification results in the required JSON format with improvement_suggestions for any rejected or uncertain items${totalFeedbacks > 0 ? ' or feedbacks' : ''}.`;
|
|
134
214
|
};
|
|
@@ -38,6 +38,23 @@ export interface LogVerificationEventParams {
|
|
|
38
38
|
concerns?: string[];
|
|
39
39
|
improvement_suggestions?: string[];
|
|
40
40
|
}>;
|
|
41
|
+
feedbacks_confirmed_count?: number;
|
|
42
|
+
feedbacks_rejected_count?: number;
|
|
43
|
+
feedbacks_uncertain_count?: number;
|
|
44
|
+
rejected_feedbacks?: Array<{
|
|
45
|
+
feedback_id: string;
|
|
46
|
+
feedback_title: string;
|
|
47
|
+
reason: string;
|
|
48
|
+
concerns?: string[];
|
|
49
|
+
improvement_suggestions?: string[];
|
|
50
|
+
}>;
|
|
51
|
+
uncertain_feedbacks?: Array<{
|
|
52
|
+
feedback_id: string;
|
|
53
|
+
feedback_title: string;
|
|
54
|
+
reason: string;
|
|
55
|
+
concerns?: string[];
|
|
56
|
+
improvement_suggestions?: string[];
|
|
57
|
+
}>;
|
|
41
58
|
summary?: string;
|
|
42
59
|
overall_suggestions?: string[];
|
|
43
60
|
};
|