[{"data":1,"prerenderedAt":1371},["ShallowReactive",2],{"work-\u002Fwork\u002Fconditional-form-builder-automation":3},{"id":4,"title":5,"body":6,"date":1355,"description":1356,"extension":1357,"externalUrl":1358,"featured":1359,"kind":1360,"meta":1361,"navigation":202,"path":1363,"seo":1364,"stem":1365,"tags":1366,"__hash__":1370},"work\u002Fwork\u002Fconditional-form-builder-automation.md","LLM-powered form builder for defense suppliers",{"type":7,"value":8,"toc":1344},"minimark",[9,14,19,23,32,36,39,55,58,62,67,95,99,106,402,405,416,423,925,928,942,949,1160,1163,1177,1181,1188,1191,1205,1212,1215,1229,1236,1239,1253,1257,1316,1320,1326,1329,1332,1335,1340],[10,11,13],"h1",{"id":12},"building-complex-conditional-forms-using-llms-for-type-analysis","Building complex conditional forms + using LLM's for type analysis",[15,16,18],"h2",{"id":17},"context","Context",[20,21,22],"p",{},"Our platform needed to publish a Defense Supplier Checklist as a marketplace offering. The challenge? Building a complex form with 26 interdependent questions, each requiring specific conditional logic based on previous answers. The kicker: it needed to be done under significant time pressure.",[24,25,26],"blockquote",{},[20,27,28],{},[29,30,31],"em",{},"Note: While specific implementation details have been anonymized, this case study focuses on the technical approach to solving a common challenge in form builders: managing complex conditional logic while maintaining type safety and user experience.",[15,33,35],{"id":34},"what-i-built","What I Built",[20,37,38],{},"I developed an automated form generation system that could:",[40,41,42,46,49,52],"ol",{},[43,44,45],"li",{},"Create hierarchical form structures with complex conditional logic",[43,47,48],{},"Handle recursive dependencies between form fields",[43,50,51],{},"Maintain type safety across the entire form structure",[43,53,54],{},"Generate proper GraphQL mutations for form creation",[20,56,57],{},"The end result was a fully functional, conditional form workflow that guides users through a complex compliance checklist.",[15,59,61],{"id":60},"technical-breakdown","Technical Breakdown",[63,64,66],"h3",{"id":65},"stack-tools","Stack & Tools",[68,69,70,77,83,89],"ul",{},[43,71,72,76],{},[73,74,75],"strong",{},"TypeScript\u002FNode.js",": Core implementation",[43,78,79,82],{},[73,80,81],{},"GraphQL",": Platform API integration",[43,84,85,88],{},[73,86,87],{},"LLM",": Type analysis and condition generation",[43,90,91,94],{},[73,92,93],{},"Form Builder API",": Custom platform form creation",[63,96,98],{"id":97},"key-architecture-decisions","Key Architecture Decisions",[40,100,101],{},[43,102,103],{},[73,104,105],{},"Field ID Management System",[107,108,113],"pre",{"className":109,"code":110,"language":111,"meta":112,"style":112},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark","interface FieldIds {\n  [key: string]: {\n    id: string;\n    slug: string;\n  };\n}\n\n\u002F\u002F Store and track field IDs for conditions\nconst fieldIds: FieldIds = {};\n\n\u002F\u002F Create fields and store references\nconst choiceField = await createSingleChoiceField(\n  tenantId,\n  section.id,\n  `q${questionNumber}`,\n  label,\n  conditions,\n);\n\nfieldIds[`q${questionNumber}`] = {\n  id: choiceField.id,\n  slug: choiceField.slug,\n};\n","typescript","",[114,115,116,133,159,173,185,191,197,204,211,231,236,242,263,272,286,308,316,324,332,337,362,379,396],"code",{"__ignoreMap":112},[117,118,121,125,129],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"sbsja","interface",[117,126,128],{"class":127},"sbgvK"," FieldIds",[117,130,132],{"class":131},"sP7_E"," {\n",[117,134,136,140,144,148,152,155,157],{"class":119,"line":135},2,[117,137,139],{"class":138},"su5hD","  [",[117,141,143],{"class":142},"s99_P","key",[117,145,147],{"class":146},"smGrS",":",[117,149,151],{"class":150},"sZMiF"," string",[117,153,154],{"class":138},"]",[117,156,147],{"class":146},[117,158,132],{"class":131},[117,160,162,166,168,170],{"class":119,"line":161},3,[117,163,165],{"class":164},"sucvu","    id",[117,167,147],{"class":146},[117,169,151],{"class":150},[117,171,172],{"class":131},";\n",[117,174,176,179,181,183],{"class":119,"line":175},4,[117,177,178],{"class":164},"    slug",[117,180,147],{"class":146},[117,182,151],{"class":150},[117,184,172],{"class":131},[117,186,188],{"class":119,"line":187},5,[117,189,190],{"class":131},"  };\n",[117,192,194],{"class":119,"line":193},6,[117,195,196],{"class":131},"}\n",[117,198,200],{"class":119,"line":199},7,[117,201,203],{"emptyLinePlaceholder":202},true,"\n",[117,205,207],{"class":119,"line":206},8,[117,208,210],{"class":209},"sutJx","\u002F\u002F Store and track field IDs for conditions\n",[117,212,214,217,221,223,225,228],{"class":119,"line":213},9,[117,215,216],{"class":123},"const",[117,218,220],{"class":219},"s_hVV"," fieldIds",[117,222,147],{"class":146},[117,224,128],{"class":127},[117,226,227],{"class":146}," =",[117,229,230],{"class":131}," {};\n",[117,232,234],{"class":119,"line":233},10,[117,235,203],{"emptyLinePlaceholder":202},[117,237,239],{"class":119,"line":238},11,[117,240,241],{"class":209},"\u002F\u002F Create fields and store references\n",[117,243,245,247,250,252,256,260],{"class":119,"line":244},12,[117,246,216],{"class":123},[117,248,249],{"class":219}," choiceField",[117,251,227],{"class":146},[117,253,255],{"class":254},"sVHd0"," await",[117,257,259],{"class":258},"sGLFI"," createSingleChoiceField",[117,261,262],{"class":138},"(\n",[117,264,266,269],{"class":119,"line":265},13,[117,267,268],{"class":138},"  tenantId",[117,270,271],{"class":131},",\n",[117,273,275,278,281,284],{"class":119,"line":274},14,[117,276,277],{"class":138},"  section",[117,279,280],{"class":131},".",[117,282,283],{"class":138},"id",[117,285,271],{"class":131},[117,287,289,293,297,300,303,306],{"class":119,"line":288},15,[117,290,292],{"class":291},"sjJ54","  `",[117,294,296],{"class":295},"s_sjI","q",[117,298,299],{"class":291},"${",[117,301,302],{"class":138},"questionNumber",[117,304,305],{"class":291},"}`",[117,307,271],{"class":131},[117,309,311,314],{"class":119,"line":310},16,[117,312,313],{"class":138},"  label",[117,315,271],{"class":131},[117,317,319,322],{"class":119,"line":318},17,[117,320,321],{"class":138},"  conditions",[117,323,271],{"class":131},[117,325,327,330],{"class":119,"line":326},18,[117,328,329],{"class":138},")",[117,331,172],{"class":131},[117,333,335],{"class":119,"line":334},19,[117,336,203],{"emptyLinePlaceholder":202},[117,338,340,343,346,348,350,352,354,357,360],{"class":119,"line":339},20,[117,341,342],{"class":138},"fieldIds[",[117,344,345],{"class":291},"`",[117,347,296],{"class":295},[117,349,299],{"class":291},[117,351,302],{"class":138},[117,353,305],{"class":291},[117,355,356],{"class":138},"] ",[117,358,359],{"class":146},"=",[117,361,132],{"class":131},[117,363,365,369,371,373,375,377],{"class":119,"line":364},21,[117,366,368],{"class":367},"skxfh","  id",[117,370,147],{"class":131},[117,372,249],{"class":138},[117,374,280],{"class":131},[117,376,283],{"class":138},[117,378,271],{"class":131},[117,380,382,385,387,389,391,394],{"class":119,"line":381},22,[117,383,384],{"class":367},"  slug",[117,386,147],{"class":131},[117,388,249],{"class":138},[117,390,280],{"class":131},[117,392,393],{"class":138},"slug",[117,395,271],{"class":131},[117,397,399],{"class":119,"line":398},23,[117,400,401],{"class":131},"};\n",[20,403,404],{},"This system:",[68,406,407,410,413],{},[43,408,409],{},"Tracks all created field IDs and slugs",[43,411,412],{},"Enables reference to previous fields in conditions",[43,414,415],{},"Maintains type safety for field references",[40,417,418],{"start":135},[43,419,420],{},[73,421,422],{},"Complex Conditional Logic",[107,424,426],{"className":109,"code":425,"language":111,"meta":112,"style":112},"\u002F\u002F Example of nested conditional logic\nconst conditions = {\n  query: {\n    expression: {\n      condition: \"AND\",\n      rules: Array.from({ length: 25 }, (_, idx) => ({\n        id: fieldIds[`q${(idx + 1).toString().padStart(2, \"0\")}`].id,\n        operator: \"EQUALS_TO_OPTION\",\n        value: \"1\",\n        slug: fieldIds[`q${(idx + 1).toString().padStart(2, \"0\")}`].slug,\n      })),\n    },\n  },\n};\n\n\u002F\u002F Field creation with conditions\nawait updateFormField(tenantId, field.id, {\n  richTitle: label,\n  metadata: {\n    type: \"SELECT\",\n    options: [\n      { label: \"Ja\u002FYes\", value: \"1\" },\n      { label: \"Onderhanden\u002FWIP\", value: \"2\" },\n      { label: \"Nee\u002FNo\", value: \"0\" },\n    ],\n    visible: conditions,\n  },\n});\n",[114,427,428,433,444,453,462,480,535,604,620,636,695,705,710,715,719,723,728,752,764,773,789,799,831,860,890,898,910,915],{"__ignoreMap":112},[117,429,430],{"class":119,"line":120},[117,431,432],{"class":209},"\u002F\u002F Example of nested conditional logic\n",[117,434,435,437,440,442],{"class":119,"line":135},[117,436,216],{"class":123},[117,438,439],{"class":219}," conditions",[117,441,227],{"class":146},[117,443,132],{"class":131},[117,445,446,449,451],{"class":119,"line":161},[117,447,448],{"class":367},"  query",[117,450,147],{"class":131},[117,452,132],{"class":131},[117,454,455,458,460],{"class":119,"line":175},[117,456,457],{"class":367},"    expression",[117,459,147],{"class":131},[117,461,132],{"class":131},[117,463,464,467,469,472,475,478],{"class":119,"line":187},[117,465,466],{"class":367},"      condition",[117,468,147],{"class":131},[117,470,471],{"class":291}," \"",[117,473,474],{"class":295},"AND",[117,476,477],{"class":291},"\"",[117,479,271],{"class":131},[117,481,482,485,487,490,492,495,498,501,504,506,510,513,516,519,522,525,527,530,532],{"class":119,"line":193},[117,483,484],{"class":367},"      rules",[117,486,147],{"class":131},[117,488,489],{"class":138}," Array",[117,491,280],{"class":131},[117,493,494],{"class":258},"from",[117,496,497],{"class":138},"(",[117,499,500],{"class":131},"{",[117,502,503],{"class":367}," length",[117,505,147],{"class":131},[117,507,509],{"class":508},"srdBf"," 25",[117,511,512],{"class":131}," },",[117,514,515],{"class":131}," (",[117,517,518],{"class":142},"_",[117,520,521],{"class":131},",",[117,523,524],{"class":142}," idx",[117,526,329],{"class":131},[117,528,529],{"class":123}," =>",[117,531,515],{"class":138},[117,533,534],{"class":131},"{\n",[117,536,537,540,542,545,547,549,551,554,557,560,563,565,567,570,573,575,578,580,583,585,587,590,592,594,596,598,600,602],{"class":119,"line":199},[117,538,539],{"class":367},"        id",[117,541,147],{"class":131},[117,543,544],{"class":138}," fieldIds[",[117,546,345],{"class":291},[117,548,296],{"class":295},[117,550,299],{"class":291},[117,552,497],{"class":553},"sfo-9",[117,555,556],{"class":138},"idx",[117,558,559],{"class":146}," +",[117,561,562],{"class":508}," 1",[117,564,329],{"class":553},[117,566,280],{"class":291},[117,568,569],{"class":258},"toString",[117,571,572],{"class":553},"()",[117,574,280],{"class":291},[117,576,577],{"class":258},"padStart",[117,579,497],{"class":553},[117,581,582],{"class":508},"2",[117,584,521],{"class":291},[117,586,471],{"class":291},[117,588,589],{"class":295},"0",[117,591,477],{"class":291},[117,593,329],{"class":553},[117,595,305],{"class":291},[117,597,154],{"class":138},[117,599,280],{"class":131},[117,601,283],{"class":138},[117,603,271],{"class":131},[117,605,606,609,611,613,616,618],{"class":119,"line":206},[117,607,608],{"class":367},"        operator",[117,610,147],{"class":131},[117,612,471],{"class":291},[117,614,615],{"class":295},"EQUALS_TO_OPTION",[117,617,477],{"class":291},[117,619,271],{"class":131},[117,621,622,625,627,629,632,634],{"class":119,"line":213},[117,623,624],{"class":367},"        value",[117,626,147],{"class":131},[117,628,471],{"class":291},[117,630,631],{"class":295},"1",[117,633,477],{"class":291},[117,635,271],{"class":131},[117,637,638,641,643,645,647,649,651,653,655,657,659,661,663,665,667,669,671,673,675,677,679,681,683,685,687,689,691,693],{"class":119,"line":233},[117,639,640],{"class":367},"        slug",[117,642,147],{"class":131},[117,644,544],{"class":138},[117,646,345],{"class":291},[117,648,296],{"class":295},[117,650,299],{"class":291},[117,652,497],{"class":553},[117,654,556],{"class":138},[117,656,559],{"class":146},[117,658,562],{"class":508},[117,660,329],{"class":553},[117,662,280],{"class":291},[117,664,569],{"class":258},[117,666,572],{"class":553},[117,668,280],{"class":291},[117,670,577],{"class":258},[117,672,497],{"class":553},[117,674,582],{"class":508},[117,676,521],{"class":291},[117,678,471],{"class":291},[117,680,589],{"class":295},[117,682,477],{"class":291},[117,684,329],{"class":553},[117,686,305],{"class":291},[117,688,154],{"class":138},[117,690,280],{"class":131},[117,692,393],{"class":138},[117,694,271],{"class":131},[117,696,697,700,703],{"class":119,"line":238},[117,698,699],{"class":131},"      }",[117,701,702],{"class":138},"))",[117,704,271],{"class":131},[117,706,707],{"class":119,"line":244},[117,708,709],{"class":131},"    },\n",[117,711,712],{"class":119,"line":265},[117,713,714],{"class":131},"  },\n",[117,716,717],{"class":119,"line":274},[117,718,401],{"class":131},[117,720,721],{"class":119,"line":288},[117,722,203],{"emptyLinePlaceholder":202},[117,724,725],{"class":119,"line":310},[117,726,727],{"class":209},"\u002F\u002F Field creation with conditions\n",[117,729,730,733,736,739,741,744,746,748,750],{"class":119,"line":318},[117,731,732],{"class":254},"await",[117,734,735],{"class":258}," updateFormField",[117,737,738],{"class":138},"(tenantId",[117,740,521],{"class":131},[117,742,743],{"class":138}," field",[117,745,280],{"class":131},[117,747,283],{"class":138},[117,749,521],{"class":131},[117,751,132],{"class":131},[117,753,754,757,759,762],{"class":119,"line":326},[117,755,756],{"class":367},"  richTitle",[117,758,147],{"class":131},[117,760,761],{"class":138}," label",[117,763,271],{"class":131},[117,765,766,769,771],{"class":119,"line":334},[117,767,768],{"class":367},"  metadata",[117,770,147],{"class":131},[117,772,132],{"class":131},[117,774,775,778,780,782,785,787],{"class":119,"line":339},[117,776,777],{"class":367},"    type",[117,779,147],{"class":131},[117,781,471],{"class":291},[117,783,784],{"class":295},"SELECT",[117,786,477],{"class":291},[117,788,271],{"class":131},[117,790,791,794,796],{"class":119,"line":364},[117,792,793],{"class":367},"    options",[117,795,147],{"class":131},[117,797,798],{"class":138}," [\n",[117,800,801,804,806,808,810,813,815,817,820,822,824,826,828],{"class":119,"line":381},[117,802,803],{"class":131},"      {",[117,805,761],{"class":367},[117,807,147],{"class":131},[117,809,471],{"class":291},[117,811,812],{"class":295},"Ja\u002FYes",[117,814,477],{"class":291},[117,816,521],{"class":131},[117,818,819],{"class":367}," value",[117,821,147],{"class":131},[117,823,471],{"class":291},[117,825,631],{"class":295},[117,827,477],{"class":291},[117,829,830],{"class":131}," },\n",[117,832,833,835,837,839,841,844,846,848,850,852,854,856,858],{"class":119,"line":398},[117,834,803],{"class":131},[117,836,761],{"class":367},[117,838,147],{"class":131},[117,840,471],{"class":291},[117,842,843],{"class":295},"Onderhanden\u002FWIP",[117,845,477],{"class":291},[117,847,521],{"class":131},[117,849,819],{"class":367},[117,851,147],{"class":131},[117,853,471],{"class":291},[117,855,582],{"class":295},[117,857,477],{"class":291},[117,859,830],{"class":131},[117,861,863,865,867,869,871,874,876,878,880,882,884,886,888],{"class":119,"line":862},24,[117,864,803],{"class":131},[117,866,761],{"class":367},[117,868,147],{"class":131},[117,870,471],{"class":291},[117,872,873],{"class":295},"Nee\u002FNo",[117,875,477],{"class":291},[117,877,521],{"class":131},[117,879,819],{"class":367},[117,881,147],{"class":131},[117,883,471],{"class":291},[117,885,589],{"class":295},[117,887,477],{"class":291},[117,889,830],{"class":131},[117,891,893,896],{"class":119,"line":892},25,[117,894,895],{"class":138},"    ]",[117,897,271],{"class":131},[117,899,901,904,906,908],{"class":119,"line":900},26,[117,902,903],{"class":367},"    visible",[117,905,147],{"class":131},[117,907,439],{"class":138},[117,909,271],{"class":131},[117,911,913],{"class":119,"line":912},27,[117,914,714],{"class":131},[117,916,918,921,923],{"class":119,"line":917},28,[117,919,920],{"class":131},"}",[117,922,329],{"class":138},[117,924,172],{"class":131},[20,926,927],{},"The conditional system handles:",[68,929,930,933,936,939],{},[43,931,932],{},"Multi-level dependencies",[43,934,935],{},"Complex AND\u002FOR logic",[43,937,938],{},"Dynamic visibility rules",[43,940,941],{},"Type-safe condition generation",[40,943,944],{"start":161},[43,945,946],{},[73,947,948],{},"LLM-Assisted Type Analysis",[107,950,952],{"className":109,"code":951,"language":111,"meta":112,"style":112},"\u002F\u002F Example of type structure fed to LLM\ninterface FormFieldMetadata {\n  type: \"SELECT\" | \"TEXTAREA\" | \"FILE_INPUT\";\n  visible?: {\n    query: {\n      expression: {\n        condition: \"AND\" | \"OR\" | \"NOT\";\n        rules: Array\u003C{\n          fieldId: string;\n          operator: \"EQUALS_TO_OPTION\" | \"NOT_EQUALS_TO_OPTION\";\n          value: string;\n          slug: string;\n        }>;\n      };\n    };\n  };\n  \u002F\u002F ... other type definitions\n}\n",[114,953,954,959,968,1002,1012,1021,1030,1063,1075,1086,1110,1121,1132,1137,1142,1147,1151,1156],{"__ignoreMap":112},[117,955,956],{"class":119,"line":120},[117,957,958],{"class":209},"\u002F\u002F Example of type structure fed to LLM\n",[117,960,961,963,966],{"class":119,"line":135},[117,962,124],{"class":123},[117,964,965],{"class":127}," FormFieldMetadata",[117,967,132],{"class":131},[117,969,970,973,975,977,979,981,984,986,989,991,993,995,998,1000],{"class":119,"line":161},[117,971,972],{"class":164},"  type",[117,974,147],{"class":146},[117,976,471],{"class":291},[117,978,784],{"class":295},[117,980,477],{"class":291},[117,982,983],{"class":146}," |",[117,985,471],{"class":291},[117,987,988],{"class":295},"TEXTAREA",[117,990,477],{"class":291},[117,992,983],{"class":146},[117,994,471],{"class":291},[117,996,997],{"class":295},"FILE_INPUT",[117,999,477],{"class":291},[117,1001,172],{"class":131},[117,1003,1004,1007,1010],{"class":119,"line":175},[117,1005,1006],{"class":164},"  visible",[117,1008,1009],{"class":146},"?:",[117,1011,132],{"class":131},[117,1013,1014,1017,1019],{"class":119,"line":187},[117,1015,1016],{"class":164},"    query",[117,1018,147],{"class":146},[117,1020,132],{"class":131},[117,1022,1023,1026,1028],{"class":119,"line":193},[117,1024,1025],{"class":164},"      expression",[117,1027,147],{"class":146},[117,1029,132],{"class":131},[117,1031,1032,1035,1037,1039,1041,1043,1045,1047,1050,1052,1054,1056,1059,1061],{"class":119,"line":199},[117,1033,1034],{"class":164},"        condition",[117,1036,147],{"class":146},[117,1038,471],{"class":291},[117,1040,474],{"class":295},[117,1042,477],{"class":291},[117,1044,983],{"class":146},[117,1046,471],{"class":291},[117,1048,1049],{"class":295},"OR",[117,1051,477],{"class":291},[117,1053,983],{"class":146},[117,1055,471],{"class":291},[117,1057,1058],{"class":295},"NOT",[117,1060,477],{"class":291},[117,1062,172],{"class":131},[117,1064,1065,1068,1070,1072],{"class":119,"line":206},[117,1066,1067],{"class":164},"        rules",[117,1069,147],{"class":146},[117,1071,489],{"class":127},[117,1073,1074],{"class":131},"\u003C{\n",[117,1076,1077,1080,1082,1084],{"class":119,"line":213},[117,1078,1079],{"class":164},"          fieldId",[117,1081,147],{"class":146},[117,1083,151],{"class":150},[117,1085,172],{"class":131},[117,1087,1088,1091,1093,1095,1097,1099,1101,1103,1106,1108],{"class":119,"line":233},[117,1089,1090],{"class":164},"          operator",[117,1092,147],{"class":146},[117,1094,471],{"class":291},[117,1096,615],{"class":295},[117,1098,477],{"class":291},[117,1100,983],{"class":146},[117,1102,471],{"class":291},[117,1104,1105],{"class":295},"NOT_EQUALS_TO_OPTION",[117,1107,477],{"class":291},[117,1109,172],{"class":131},[117,1111,1112,1115,1117,1119],{"class":119,"line":238},[117,1113,1114],{"class":164},"          value",[117,1116,147],{"class":146},[117,1118,151],{"class":150},[117,1120,172],{"class":131},[117,1122,1123,1126,1128,1130],{"class":119,"line":244},[117,1124,1125],{"class":164},"          slug",[117,1127,147],{"class":146},[117,1129,151],{"class":150},[117,1131,172],{"class":131},[117,1133,1134],{"class":119,"line":265},[117,1135,1136],{"class":131},"        }>;\n",[117,1138,1139],{"class":119,"line":274},[117,1140,1141],{"class":131},"      };\n",[117,1143,1144],{"class":119,"line":288},[117,1145,1146],{"class":131},"    };\n",[117,1148,1149],{"class":119,"line":310},[117,1150,190],{"class":131},[117,1152,1153],{"class":119,"line":318},[117,1154,1155],{"class":209},"  \u002F\u002F ... other type definitions\n",[117,1157,1158],{"class":119,"line":326},[117,1159,196],{"class":131},[20,1161,1162],{},"Used LLM to:",[68,1164,1165,1168,1171,1174],{},[43,1166,1167],{},"Analyze complex type definitions",[43,1169,1170],{},"Generate correct condition structures",[43,1172,1173],{},"Validate conditional logic",[43,1175,1176],{},"Suggest proper field configurations",[15,1178,1180],{"id":1179},"what-i-learned","What I Learned",[40,1182,1183],{},[43,1184,1185],{},[73,1186,1187],{},"Time-Constrained Development",[20,1189,1190],{},"When faced with tight deadlines, I learned to:",[68,1192,1193,1196,1199,1202],{},[43,1194,1195],{},"Prioritize working solutions over perfect implementations",[43,1197,1198],{},"Leverage AI tools for rapid development",[43,1200,1201],{},"Focus on core functionality first",[43,1203,1204],{},"Use existing patterns where possible",[40,1206,1207],{"start":135},[43,1208,1209],{},[73,1210,1211],{},"Type System Analysis",[20,1213,1214],{},"The approach of feeding type definitions to LLMs proved valuable:",[68,1216,1217,1220,1223,1226],{},[43,1218,1219],{},"Quick understanding of complex type systems",[43,1221,1222],{},"Accurate condition generation",[43,1224,1225],{},"Reduced trial and error",[43,1227,1228],{},"Faster development cycle",[40,1230,1231],{"start":161},[43,1232,1233],{},[73,1234,1235],{},"Conditional Form Architecture",[20,1237,1238],{},"Key insights about building conditional forms:",[68,1240,1241,1244,1247,1250],{},[43,1242,1243],{},"Store field references immediately after creation",[43,1245,1246],{},"Build conditions incrementally",[43,1248,1249],{},"Validate condition types early",[43,1251,1252],{},"Test edge cases in dependencies",[15,1254,1256],{"id":1255},"whats-next","What's Next?",[40,1258,1259,1278,1297],{},[43,1260,1261,1264],{},[73,1262,1263],{},"Robustness Improvements",[68,1265,1266,1269,1272,1275],{},[43,1267,1268],{},"Build type validation system",[43,1270,1271],{},"Add condition testing framework",[43,1273,1274],{},"Implement condition visualization",[43,1276,1277],{},"Create condition templates",[43,1279,1280,1283],{},[73,1281,1282],{},"Developer Experience",[68,1284,1285,1288,1291,1294],{},[43,1286,1287],{},"Build condition builder UI",[43,1289,1290],{},"Add type generation tools",[43,1292,1293],{},"Improve error messages",[43,1295,1296],{},"Create debugging tools",[43,1298,1299,1302],{},[73,1300,1301],{},"Performance Optimization",[68,1303,1304,1307,1310,1313],{},[43,1305,1306],{},"Cache field references",[43,1308,1309],{},"Batch condition updates",[43,1311,1312],{},"Optimize condition evaluation",[43,1314,1315],{},"Implement change tracking",[15,1317,1319],{"id":1318},"key-takeaways","Key Takeaways",[20,1321,1322,1323,280],{},"In this project what I took away is the importance of balancing technical debt with delivery speed. By leveraging LLMs for type analysis and focusing on core functionality, I was able to deliever a complex form build under tight time constraints ",[29,1324,1325],{},"(quicker than our CSM team could have done it manually)",[20,1327,1328],{},"Hey, sometimes the \"perfect\" solution isn't the right solution. In this case, using AI to understand and generate complex type structures was more efficient than building a comprehensive type system from scratch.",[20,1330,1331],{},"I think it demonstrated how modern development tools (like LLMs) can be creatively applied to solve traditional development challenges, especially when time is a critical factor.",[1333,1334],"hr",{},[20,1336,1337],{},[29,1338,1339],{},"Note: This case study focuses on the technical implementation while respecting confidentiality around specific requirements and implementations.",[1341,1342,1343],"style",{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sucvu, html code.shiki .sucvu{--shiki-light:#E53935;--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sfo-9, html code.shiki .sfo-9{--shiki-light:#90A4AE;--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":112,"searchDepth":135,"depth":135,"links":1345},[1346,1347,1348,1352,1353,1354],{"id":17,"depth":135,"text":18},{"id":34,"depth":135,"text":35},{"id":60,"depth":135,"text":61,"children":1349},[1350,1351],{"id":65,"depth":161,"text":66},{"id":97,"depth":161,"text":98},{"id":1179,"depth":135,"text":1180},{"id":1255,"depth":135,"text":1256},{"id":1318,"depth":135,"text":1319},"2025-05-25","Developed an automated system to generate complex conditional form workflows for a Defense Supplier Checklist, leveraging LLMs for type analysis and rapid development.","md",null,false,"case-study",{"slug":1362},"conditional-form-builder-automation","\u002Fwork\u002Fconditional-form-builder-automation",{"title":5,"description":1356},"work\u002Fconditional-form-builder-automation",[1367,81,1368,87,1369],"TypeScript","Form Builder","Automation","gn8LW4xk0hB8FrCK63n4atO6cejqRgbDoTeCANiXd6Y",1780955296664]