{"id":19924,"date":"2025-10-16T16:45:31","date_gmt":"2025-10-16T16:45:31","guid":{"rendered":"https:\/\/www.ruoomsoftware.com\/?p=19924"},"modified":"2025-10-23T17:08:05","modified_gmt":"2025-10-23T17:08:05","slug":"code-review-evaluating-the-ai-generated-google-calendar-integration","status":"publish","type":"post","link":"https:\/\/www.ruoomsoftware.com\/ko\/code-review-evaluating-the-ai-generated-google-calendar-integration\/","title":{"rendered":"Code Review: Evaluating the AI-Generated Google Calendar Integration"},"content":{"rendered":"<p><a href=\"https:\/\/www.ruoomsoftware.com\/ko\/llm-prompting-experiment-integrating-a-google-calendar-into-ruooms-crm\/\" target=\"_blank\" rel=\"noreferrer noopener\">In the last post<\/a>, we did an LLM prompting experiment to build a Google Calendar integration inside Ruoom\u2019s open source CRM code.<br><br>It worked (!) but before we get too excited, we need to do a code review.<br><br>Why? \ud83e\udd14<br><br>Because in software development, \u201cit runs\u201d isn\u2019t the same as \u201cit\u2019s reliable.\u201d<\/p>\n\n\n\n<p>Code reviews are where performance, security, and maintainability get validated; the foundation of software quality assurance. They help catch architectural drift, logic errors, and inconsistencies that slip past even the most advanced AI. Without this step, it\u2019s easy for technical debt to accumulate. Functions overlap, naming conventions drift, and assumptions about data handling go unchecked.<\/p>\n\n\n\n<p>A proper review lets us:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Verify the code follows our internal style and design patterns.<br><\/li>\n\n\n\n<li>Check how it handles edge cases and failures.<br><\/li>\n\n\n\n<li>Confirm it integrates cleanly with the rest of the system.<br><\/li>\n\n\n\n<li>Identify where automated tests (if any) fall short.<\/li>\n<\/ul>\n\n\n\n<p>This is the step that turns \u201cAI-generated\u201d into \u201cproduction-ready.\u201d<\/p>\n\n\n\n<p>So here\u2019s our human team and our human brains using no robots to do a code review.<\/p>\n\n\n\n<p>No code review automation here.<\/p>\n\n\n\n<p>Anyway, let\u2019s get into it.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Reviewing the Code<\/strong><\/strong><\/h2>\n\n\n\n<p>You can follow along with this process by peeking at our public repository.<br><br>We\u2019ve created a branch specifically for the code from this blog series: <a href=\"https:\/\/github.com\/Ruoom\/ruoom-core\/tree\/llm_experiment\/gcal_import\">Ruoom\/ruoom-core at <\/a><a href=\"https:\/\/github.com\/Ruoom\/ruoom-core\/tree\/llm_experiment\/gcal_import\" target=\"_blank\" rel=\"noreferrer noopener\">llm_experiment<\/a><a href=\"https:\/\/github.com\/Ruoom\/ruoom-core\/tree\/llm_experiment\/gcal_import\">\/gcal_import<\/a><\/p>\n\n\n\n<p>Using Git, we can isolate only the changes made during our previous blog. We\u2019ve grouped them into a single commit labeled \u201cLLM-generated feature code\u201d: <a href=\"https:\/\/github.com\/Ruoom\/ruoom-core\/commit\/cc66f3ba9e5fba9dcaaaafa5ad881449376ee538\" target=\"_blank\" rel=\"noreferrer noopener\">LLM-generated feature code \u00b7 Ruoom\/ruoom-core@cc66f3b<\/a><\/p>\n\n\n\n<p>Let\u2019s start by reviewing the files that have changed:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"286\" height=\"505\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-12.png\" alt=\"\" class=\"wp-image-19926\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-12.png 286w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-12-170x300.png 170w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-12-7x12.png 7w\" sizes=\"auto, (max-width: 286px) 100vw, 286px\" \/><\/figure>\n\n\n\n<p>We can group the changes into 3 categories:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Files which the LLM edited to add its requisite functions:\n<ul class=\"wp-block-list\">\n<li>schedule.js<\/li>\n\n\n\n<li>schedule.html<\/li>\n\n\n\n<li>administration\/urls.py<\/li>\n\n\n\n<li>registration\/models.py<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Files which the LLM wrote from scratch:\n<ul class=\"wp-block-list\">\n<li>gcal.py<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Supporting files:\n<ul class=\"wp-block-list\">\n<li>Requirements.txt<\/li>\n\n\n\n<li>settings.py<\/li>\n\n\n\n<li>0004_profile_gcal_fields.py<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Directive #1 is to ensure that the existing code hasn\u2019t been disturbed.<\/p>\n\n\n\n<p>Reviewing the first 4 files should enable us to do so. If there is an existing test suite, this is where we would run it to confirm core code performance.<\/p>\n\n\n\n<p>gcal.py being a completely new file, we need to closely examine it for consistency with the rest of the repository.<\/p>\n\n\n\n<p>The supporting files will only require a short review as they reflect the changes made to the other files.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong><strong>schedule.js<\/strong><\/strong><\/strong><\/h3>\n\n\n\n<p>Let\u2019s start at the top with schedule.js &#8211; the javascript code which populates the front-end calendar with events:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"496\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-13-1024x496.png\" alt=\"\" class=\"wp-image-19927\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-13-1024x496.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-13-300x145.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-13-768x372.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-13-1536x744.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-13-18x9.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-13.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>There are only 2 significant changes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The LLM removed a number of lines which it didn\u2019t think were needed for this function\n<ul class=\"wp-block-list\">\n<li>These lines are here for compatibility with schedule plugins we offer. While the LLM wouldn\u2019t know this, it\u2019s strange it would simply delete code it doesn\u2019t think is needed. Every developer knows that deleting code without triple-checking its purpose is a recipe for disaster!<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"682\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-15-1024x682.png\" alt=\"\" class=\"wp-image-19929\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-15-1024x682.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-15-300x200.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-15-768x512.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-15-18x12.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-15.png 1364w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h6 class=\"wp-block-heading has-text-align-center\"><em>In the Kdrama, Startup, the main character Nam Do-San deletes code with no backup or version control (at least from what we can see on screen), and we have not stopped talking about this scene for years.<\/em> <em>He straight up does a select all, delete. Don\u2019t do this. Please.<\/em><\/h6>\n\n\n\n<ul class=\"wp-block-list\">\n<li>In fact, when testing the front end calendar, we discover that deleting this code has broken the alternate \u201cDay\u201d and \u201cWeek\u201d views of the calendar. Ugh.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The LLM added logic to insert Google calendar events onto the FullCalendar implementation (FullCalendar is an open source calendar solution we use)\n<ul class=\"wp-block-list\">\n<li>Our first observation is that the LLM is making use of a feature of the FullCalendar module called \u201ceventSources\u201d which our developers hadn\u2019t used before. It\u2019s interesting that the LLM has researched FullCalendar usage\/documentation (<a href=\"https:\/\/fullcalendar.io\/docs\/eventSources\" target=\"_blank\" rel=\"noreferrer noopener\">eventSources &#8211; Docs | FullCalendar<\/a>) to make an implementation decision.<\/li>\n\n\n\n<li>The feature implementation is elegant in its presentation, if perhaps too condensed. The LLM placed a function definition directly within an array. We don\u2019t hate it, but some developers might.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>schedule.html<\/strong><\/h3>\n\n\n\n<p>Reviewing schedule.html, the only change is the addition of the \u201cConnect\/Disconnect Google Calendar\u201d buttons. The implementation of which button appears is straightforward:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"578\" height=\"81\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-16-at-10.59.49\u202fAM.png\" alt=\"\" class=\"wp-image-19930\" style=\"width:620px;height:auto\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-16-at-10.59.49\u202fAM.png 578w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-16-at-10.59.49\u202fAM-300x42.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-16-at-10.59.49\u202fAM-18x3.png 18w\" sizes=\"auto, (max-width: 578px) 100vw, 578px\" \/><\/figure>\n\n\n\n<p>We have 3 comments about its implementation:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>It\u2019s good to see the LLM is using off-the-shelf button\/badge styles for these buttons. However neither the LLM nor we are UX designers and this needs to go through a UI\/UX review process (this sounds like another blog post \ud83d\udc40).\u00a0<\/li>\n\n\n\n<li>During our previous blog, we had an issue where clicking \u201cConnect Google Calendar\u201d didn\u2019t work because we hadn\u2019t properly configured credentials. Again, from a UX perspective, we had zero feedback regarding where the issue was. It could have been a server error, an issue with my Google Cloud Console, or a typo in my credentials. In a revision we would want feedback on the success or failure of the calendar sync presented to the user.<\/li>\n\n\n\n<li>We may need to expand the number of states or messages presented to the user. For instance, if the user has to re-authenticate with Google due an expiring login session.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>administration\/urls.py<\/strong><\/h3>\n\n\n\n<p>The changes to the urls handler are straightforward: the LLM added 4 endpoints for the front end to call. No comments on the urls.py file itself as we will review the back-end logic a little later.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"117\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-16-at-11.20.42\u202fAM.png\" alt=\"\" class=\"wp-image-19936\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-16-at-11.20.42\u202fAM.png 624w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-16-at-11.20.42\u202fAM-300x56.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-16-at-11.20.42\u202fAM-18x3.png 18w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>registration\/models.py<\/strong><\/h3>\n\n\n\n<p>The LLM\u2019s database implementation is a little more interesting:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"429\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-16-1024x429.png\" alt=\"\" class=\"wp-image-19932\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-16-1024x429.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-16-300x126.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-16-768x322.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-16-1536x643.png 1536w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-16-18x8.png 18w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-16.png 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>First, we observe that once again the LLM is deleting code. Why?!<\/p>\n\n\n\n<p>In fact, this time, the LLM deleted code that was <strong>very much necessary<\/strong>.&nbsp;<\/p>\n\n\n\n<p>The first_last_user() function which presents a user\u2019s name in as Firstname Lastname is called by the front-end and breaks the front end if deleted. We had to manually add this function back into the code to get it to work during the previous blog (which is why it\u2019s also reflected as added code on the right side of the screenshot).<\/p>\n\n\n\n<p>On the flip side, the decision the LLM made to associate the google sync\/credentials at the <strong>user level<\/strong> instead of the <strong>system level<\/strong> is a good one. Maybe this is obvious, but we or a developer might have assumed that the requirement was to link google calendar to the entire system. As implemented here, each user logging into the CRM will see their own calendar reflected on the page not only providing a tailored experience but also preventing privacy concerns whereby other users may spy on someone\u2019s Google calendar.<\/p>\n\n\n\n<p>Finally, you might notice the new \u201cgoogle_credentials_json\u201d property in the user profile object, which represents <strong>Google credentials that are not encrypted!!<\/strong>&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1022\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-17-1024x1022.png\" alt=\"\" class=\"wp-image-19933\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-17-1024x1022.png 1024w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-17-300x300.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-17-150x150.png 150w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-17-768x767.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-17-12x12.png 12w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-17.png 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h6 class=\"wp-block-heading has-text-align-center\"><em>We are absolutely judging the LLM right now.<\/em><\/h6>\n\n\n\n<p class=\"has-text-align-left\">We shouldn\u2019t have to explain to you, or to the LLM why this is dangerous but we will.&nbsp;<\/p>\n\n\n\n<p class=\"has-text-align-left\">Depending on the scope that we have set within the Google Console OAuth app, someone might be able to use these credentials to access Google applications beyond the Calendar (Access to your Gmail gives someone freedom to start resetting <strong>all of your passwords<\/strong>).&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"476\" height=\"334\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-18.png\" alt=\"\" class=\"wp-image-19934\" style=\"width:620px;height:auto\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-18.png 476w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-18-300x211.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-18-18x12.png 18w\" sizes=\"auto, (max-width: 476px) 100vw, 476px\" \/><\/figure>\n\n\n\n<h6 class=\"wp-block-heading has-text-align-center\"><em>Bishop Bullwinkle knows what\u2019s up.<\/em><\/h6>\n\n\n\n<p>A compromised database, SQL injection, or simply a bug in the code could all expose this data, and it certainly violates data security standards.&nbsp;<\/p>\n\n\n\n<p>These plaintext credentials <strong>must<\/strong> be encrypted at rest.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>gcal.py<\/strong><\/h3>\n\n\n\n<p>This entire file is a new creation, so we have to go through it carefully.<\/p>\n\n\n\n<p>Functions defined in this new file:<\/p>\n\n\n\n<p><em>Supporting Functions:<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>_get_google_client_config()<\/li>\n\n\n\n<li>_serialize_credentials()<\/li>\n\n\n\n<li>_credentials_from_json()<\/li>\n<\/ul>\n\n\n\n<p>These first 3 supporting functions are well-designed and structured with good conventions. No notes.<\/p>\n\n\n\n<p><em>OAuth Functions:<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>google_oauth_start()<\/li>\n\n\n\n<li>google_oauth_callback()<\/li>\n\n\n\n<li>google_oauth_disconnect()<\/li>\n<\/ul>\n\n\n\n<p>To start, there are maybe 2 comments in this entire file.&nbsp;<\/p>\n\n\n\n<p>We need significantly more comments, especially when the code is dense and not self-documenting. We don\u2019t even know what the purpose of each function is. If this code is to be maintained in the future, engineers need to quickly understand what it does &amp; how.<\/p>\n\n\n\n<p>There are also a few instances where the LLM throws \u201cimport\u201d statements into the middle of functions. Maybe this is personal preference, but imports should go at the top of the file unless there is a very good reason to handle them in-line.<\/p>\n\n\n\n<p>Error handling does seem to be sufficient, which is great to see. We don\u2019t have much concern over the scalability of the OAuth layer of these functions.<\/p>\n\n\n\n<p>With all this said, we might have liked to see these functions grouped as methods of a Google OAuth class instead of hanging around loosely as they are.<\/p>\n\n\n\n<p><em>Event Population<\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>google_events()<\/li>\n<\/ul>\n\n\n\n<p>This is the most complex function in the file, and yet is written very densely with almost no comments. Again! Remember, no human will be able to explain to you what\u2019s happening here when you need to update it in 6 months. Comment comment comment.<\/p>\n\n\n\n<p>It doesn\u2019t match all of the project conventions around structuring a GET endpoint function, but it\u2019s acceptable.<\/p>\n\n\n\n<p>It makes use of a \u201cwhile True\u201d loop as it queries for page after page of Google events. We are always suspicious of infinite loops like this &#8211; though in this implementation it seems okay as any REST API failure to Google would cause it to break. Still, there may be a safer way to implement this.<\/p>\n\n\n\n<p>The events are returned to the front end as one giant JSON response.&nbsp;<\/p>\n\n\n\n<p>Would this scale to handle thousands of events?&nbsp;<\/p>\n\n\n\n<p>We aren\u2019t sure that it will, but that level of scale hopefully isn\u2019t necessary for Google Calendar.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusions<\/strong><\/h2>\n\n\n\n<p>Overall, the LLM hasn\u2019t done a bad job. We would be happy with this as the output of a junior developer, though it definitely requires improvements. We didn\u2019t ask the LLM to create a test suite but that would absolutely be a next step here.<br><br><strong>NOTE<\/strong>: Having said this, we also believe it\u2019s <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-custom-mellow-melon-color\">vitally<\/mark><\/strong> important to continue to hire human junior developers in the age of AI so we can train the next generation.<\/p>\n\n\n\n<p>In our evaluation of the code, we\u2019re going to hit many tired refrains of developer reviewers around the world:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>More comments!<\/li>\n\n\n\n<li>Don\u2019t delete code you don\u2019t understand!<\/li>\n\n\n\n<li>Encrypt your credentials when they\u2019re at rest!<\/li>\n\n\n\n<li>Don\u2019t let engineers design our UX!<\/li>\n\n\n\n<li>Reinforce our coding conventions!<\/li>\n\n\n\n<li>Write tests!<\/li>\n<\/ul>\n\n\n\n<p>Many of these issues can probably be ironed out quickly with a few more iterations with the LLM. We hope this doesn\u2019t introduce even more issues of these kinds, but LLMs are famous for going in circles when asked to fix their own code\u2026<\/p>\n\n\n\n<p>To close this blog as we did the last one, we\u2019d like to reference a reddit post from user u\/TreeTopologyTroubado who describes how to \u201cvibe code\u201d at a major software engineering firm:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"923\" height=\"482\" src=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-19.png\" alt=\"\" class=\"wp-image-19935\" srcset=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-19.png 923w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-19-300x157.png 300w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-19-768x401.png 768w, https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/image-19-18x9.png 18w\" sizes=\"auto, (max-width: 923px) 100vw, 923px\" \/><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.reddit.com\/r\/vibecoding\/comments\/1myakhd\/how_we_vibe_code_at_a_faang\/\" target=\"_blank\" rel=\"noreferrer noopener\">How we vibe code at a FAANG. : r\/vibecoding<\/a><\/p>\n\n\n\n<p>You\u2019ll notice that the poster focuses much more on \u201cAI assistance for productivity\u201d than on handing over any sort of design authority or uncontrolled development to the LLM.<br><br>We wholeheartedly agree.<br><br>LLMs will increase production velocity, but only when placed inside a robust software development process to being with.<br>In the next blog we\u2019ll run another LLM prompting experiment where we\u2019ll export calendar events from Ruoom\u2019s CRM calendar into Google.<\/p>\n\n\n\n<p>Until then, keep using your brain and don\u2019t outsource all of it to AI.<\/p>\n\n\n\n<p>Talk to you later. \ud83d\udc4b<\/p>","protected":false},"excerpt":{"rendered":"<p>We ran an LLM prompting experiment to build a Google Calendar integration. It worked, but that doesn\u2019t mean it\u2019s ready for production. Here\u2019s what we found in the human code review.<\/p>","protected":false},"author":5,"featured_media":20005,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[23],"tags":[],"class_list":["post-19924","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Code Review: Evaluating the AI-Generated Google Calendar Integration | Ruoom<\/title>\n<meta name=\"description\" content=\"LLM-generated code meets human review. Inside Ruoom\u2019s open source CRM, we test what real software quality assurance looks like.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ruoomsoftware.com\/ko\/code-review-evaluating-the-ai-generated-google-calendar-integration\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Code Review: Evaluating the AI-Generated Google Calendar Integration | Ruoom\" \/>\n<meta property=\"og:description\" content=\"LLM-generated code meets human review. Inside Ruoom\u2019s open source CRM, we test what real software quality assurance looks like.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ruoomsoftware.com\/ko\/code-review-evaluating-the-ai-generated-google-calendar-integration\/\" \/>\n<meta property=\"og:site_name\" content=\"Ruoom\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ruoomsoftware\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-16T16:45:31+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-23T17:08:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png\" \/>\n\t<meta property=\"og:image:width\" content=\"946\" \/>\n\t<meta property=\"og:image:height\" content=\"952\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Kevin Morrissey\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/\"},\"author\":{\"name\":\"Kevin Morrissey\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/920db29c61fde2fdd472f380831c5731\"},\"headline\":\"Code Review: Evaluating the AI-Generated Google Calendar Integration\",\"datePublished\":\"2025-10-16T16:45:31+00:00\",\"dateModified\":\"2025-10-23T17:08:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/\"},\"wordCount\":1908,\"publisher\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png\",\"articleSection\":[\"Software\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/\",\"url\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/\",\"name\":\"Code Review: Evaluating the AI-Generated Google Calendar Integration | Ruoom\",\"isPartOf\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png\",\"datePublished\":\"2025-10-16T16:45:31+00:00\",\"dateModified\":\"2025-10-23T17:08:05+00:00\",\"description\":\"LLM-generated code meets human review. Inside Ruoom\u2019s open source CRM, we test what real software quality assurance looks like.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#primaryimage\",\"url\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png\",\"contentUrl\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png\",\"width\":946,\"height\":952},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.ruoomsoftware.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Code Review: Evaluating the AI-Generated Google Calendar Integration\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#website\",\"url\":\"https:\/\/www.ruoomsoftware.com\/\",\"name\":\"Ruoom\",\"description\":\"Designed to fit how your small business works.\",\"publisher\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/#organization\"},\"alternateName\":\"Ruoom\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.ruoomsoftware.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#organization\",\"name\":\"Ruoom\",\"alternateName\":\"Ruoom\",\"url\":\"https:\/\/www.ruoomsoftware.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2024\/11\/Ruoom-logo-svg.svg\",\"contentUrl\":\"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2024\/11\/Ruoom-logo-svg.svg\",\"width\":150,\"height\":122,\"caption\":\"Ruoom\"},\"image\":{\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/ruoomsoftware\",\"https:\/\/www.instagram.com\/ruoomsoftware\/\",\"https:\/\/www.youtube.com\/channel\/UC5LVZyGRCNlQEqQEItCYb3Q\",\"https:\/\/www.linkedin.com\/company\/ruoom-inc\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/920db29c61fde2fdd472f380831c5731\",\"name\":\"Kevin Morrissey\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e55fe9811e3194b318c957a3578a6b39bdcfb5d8d247bdec2cd1d30a98823d4e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e55fe9811e3194b318c957a3578a6b39bdcfb5d8d247bdec2cd1d30a98823d4e?s=96&d=mm&r=g\",\"caption\":\"Kevin Morrissey\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Code Review: Evaluating the AI-Generated Google Calendar Integration | Ruoom","description":"LLM-generated code meets human review. Inside Ruoom\u2019s open source CRM, we test what real software quality assurance looks like.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ruoomsoftware.com\/ko\/code-review-evaluating-the-ai-generated-google-calendar-integration\/","og_locale":"ko_KR","og_type":"article","og_title":"Code Review: Evaluating the AI-Generated Google Calendar Integration | Ruoom","og_description":"LLM-generated code meets human review. Inside Ruoom\u2019s open source CRM, we test what real software quality assurance looks like.","og_url":"https:\/\/www.ruoomsoftware.com\/ko\/code-review-evaluating-the-ai-generated-google-calendar-integration\/","og_site_name":"Ruoom","article_publisher":"https:\/\/www.facebook.com\/ruoomsoftware","article_published_time":"2025-10-16T16:45:31+00:00","article_modified_time":"2025-10-23T17:08:05+00:00","og_image":[{"width":946,"height":952,"url":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png","type":"image\/png"}],"author":"Kevin Morrissey","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#article","isPartOf":{"@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/"},"author":{"name":"Kevin Morrissey","@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/920db29c61fde2fdd472f380831c5731"},"headline":"Code Review: Evaluating the AI-Generated Google Calendar Integration","datePublished":"2025-10-16T16:45:31+00:00","dateModified":"2025-10-23T17:08:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/"},"wordCount":1908,"publisher":{"@id":"https:\/\/www.ruoomsoftware.com\/#organization"},"image":{"@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png","articleSection":["Software"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/","url":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/","name":"Code Review: Evaluating the AI-Generated Google Calendar Integration | Ruoom","isPartOf":{"@id":"https:\/\/www.ruoomsoftware.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#primaryimage"},"image":{"@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png","datePublished":"2025-10-16T16:45:31+00:00","dateModified":"2025-10-23T17:08:05+00:00","description":"LLM-generated code meets human review. Inside Ruoom\u2019s open source CRM, we test what real software quality assurance looks like.","breadcrumb":{"@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#primaryimage","url":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png","contentUrl":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2025\/10\/Screenshot-2025-10-23-at-12.03.28\u202fPM.png","width":946,"height":952},{"@type":"BreadcrumbList","@id":"https:\/\/www.ruoomsoftware.com\/code-review-evaluating-the-ai-generated-google-calendar-integration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ruoomsoftware.com\/"},{"@type":"ListItem","position":2,"name":"Code Review: Evaluating the AI-Generated Google Calendar Integration"}]},{"@type":"WebSite","@id":"https:\/\/www.ruoomsoftware.com\/#website","url":"https:\/\/www.ruoomsoftware.com\/","name":"Ruoom","description":"Designed to fit how your small business works.","publisher":{"@id":"https:\/\/www.ruoomsoftware.com\/#organization"},"alternateName":"Ruoom","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ruoomsoftware.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.ruoomsoftware.com\/#organization","name":"Ruoom","alternateName":"Ruoom","url":"https:\/\/www.ruoomsoftware.com\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2024\/11\/Ruoom-logo-svg.svg","contentUrl":"https:\/\/www.ruoomsoftware.com\/wp-content\/uploads\/2024\/11\/Ruoom-logo-svg.svg","width":150,"height":122,"caption":"Ruoom"},"image":{"@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ruoomsoftware","https:\/\/www.instagram.com\/ruoomsoftware\/","https:\/\/www.youtube.com\/channel\/UC5LVZyGRCNlQEqQEItCYb3Q","https:\/\/www.linkedin.com\/company\/ruoom-inc\/"]},{"@type":"Person","@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/920db29c61fde2fdd472f380831c5731","name":"Kevin Morrissey","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.ruoomsoftware.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e55fe9811e3194b318c957a3578a6b39bdcfb5d8d247bdec2cd1d30a98823d4e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e55fe9811e3194b318c957a3578a6b39bdcfb5d8d247bdec2cd1d30a98823d4e?s=96&d=mm&r=g","caption":"Kevin Morrissey"}}]}},"_links":{"self":[{"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/posts\/19924","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/comments?post=19924"}],"version-history":[{"count":8,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/posts\/19924\/revisions"}],"predecessor-version":[{"id":19964,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/posts\/19924\/revisions\/19964"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/media\/20005"}],"wp:attachment":[{"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/media?parent=19924"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/categories?post=19924"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ruoomsoftware.com\/ko\/wp-json\/wp\/v2\/tags?post=19924"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}