feat: improve readability of list fields in CIM review

- Add normalizeToMarkdown() that converts inline "1) ... 2) ..." patterns
  to properly spaced markdown numbered lists for existing documents
- Update Zod schema descriptions to instruct LLM to use newline-separated
  numbered items in list fields (keyAttractions, potentialRisks, etc.)
- Fixes wall-of-text rendering in investment thesis and next steps sections

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
admin
2026-02-25 11:37:25 -05:00
parent 69ece61750
commit 8f9c225ebc
2 changed files with 26 additions and 9 deletions

View File

@@ -93,18 +93,18 @@ export const cimReviewSchema = z.object({
}).describe("Management Team Overview section"),
preliminaryInvestmentThesis: z.object({
keyAttractions: z.string().describe("Key Attractions / Strengths (Why Invest?)"),
potentialRisks: z.string().describe("Potential Risks / Concerns (Why Not Invest?)"),
valueCreationLevers: z.string().describe("Initial Value Creation Levers (How PE Adds Value)"),
keyAttractions: z.string().describe("Key Attractions / Strengths (Why Invest?) — list each point on its own line, e.g. '1. Point one\\n2. Point two'"),
potentialRisks: z.string().describe("Potential Risks / Concerns (Why Not Invest?) — list each point on its own line, e.g. '1. Point one\\n2. Point two'"),
valueCreationLevers: z.string().describe("Initial Value Creation Levers (How PE Adds Value) — list each lever on its own line, e.g. '1. Lever one\\n2. Lever two'"),
alignmentWithFundStrategy: z.string().describe("Alignment with Fund Strategy"),
}).describe("Preliminary Investment Thesis section"),
keyQuestionsNextSteps: z.object({
criticalQuestions: z.string().describe("Critical Questions Arising from CIM Review"),
missingInformation: z.string().describe("Key Missing Information / Areas for Diligence Focus"),
preliminaryRecommendation: z.string().describe("Preliminary Recommendation"),
criticalQuestions: z.string().describe("Critical Questions Arising from CIM Review — list each question on its own line, e.g. '1. Question one\\n2. Question two'"),
missingInformation: z.string().describe("Key Missing Information / Areas for Diligence Focus — list each item on its own line"),
preliminaryRecommendation: z.string().describe("Preliminary Recommendation (Pass / Proceed with Caution / Proceed with Detailed Diligence)"),
rationaleForRecommendation: z.string().describe("Rationale for Recommendation (Brief)"),
proposedNextSteps: z.string().describe("Proposed Next Steps"),
proposedNextSteps: z.string().describe("Proposed Next Steps — list each step on its own line, e.g. '1. Step one\\n2. Step two'"),
}).describe("Key Questions & Next Steps section"),
});