Code Workflows
1.006 Ergebnisse — ausschließlich quellenverknüpfte n8n-Referenzen
Publish scheduled LinkedIn posts from Twenty CRM via Unipile and SharePoint
Quick overview Automate your LinkedIn content calendar. This workflow fetches scheduled posts from a PostgreSQL database (Twenty CRM), downloads attached media from SharePoint, and publishes them seamlessly to LinkedIn using Unipile. How it works A Schedule Trigger (Cron) fires every 5 minutes to check for pending social media posts A PostgreSQL node queries the database to fetch posts marked as 'SCHEDULED' where the scheduled time has passed. A Split In Batches node loops through the fetched posts one by one to prevent API concurrency issues. An IF node checks if there is a SharePoint attachment URL included in the database record. If an attachment exists, Microsoft Graph API nodes resolve the SharePoint Drive Item and download the image as a binary file HTTP Request nodes send the text (and binary attachment, if any) to Unipile's API to natively publish the LinkedIn post. A final PostgreSQL node updates the CRM record to 'POSTED' and saves the live LinkedIn post URL back to the database. Setup Add your PostgreSQL credentials and verify that the SQL query matches your Twenty CRM table and schema names. Connect your Microsoft Entra ID (Azure AD) account to authenticate SharePoint a
Audit Google Drive backup freshness with Google Sheets and Slack
Quick overview This workflow runs nightly to audit a Google Drive backup folder against an SLA table in Google Sheets, logging a per-source scorecard and sending a Slack alert only when backups are missing, stale, or unexpectedly small. How it works Runs on a nightly schedule. Reads an SLA table from Google Sheets that defines expected backup sources, filename patterns, cadence, and freshness/size thresholds. Searches a specified Google Drive folder and retrieves metadata for all non-trashed files. Compares each SLA row to matching Drive files to classify the newest backup as OK, MISSING, STALE, or SHRUNK and builds an alert summary for any failures. Appends one scorecard row per source to a Google Sheets audit tab with the run time, verdict, newest file details, and size comparisons. Posts a single Slack message listing all failing sources when at least one source is not OK. Setup Add Google Sheets OAuth2 credentials, select the spreadsheet and the SLA and scorecard sheet tabs in the Google Sheets nodes. Add Google Drive OAuth2 credentials and replace the placeholder folder ID in the Drive search query to point at your backup folder. Add Slack credentials and choose the channel to
Reconcile daily Google Drive CSV exports into a master file and send a Slack recap
Quick overview This workflow runs daily to reconcile multiple CSV exports from a Google Drive folder into a deduplicated master CSV, quarantine invalid or duplicate rows into a reject CSV, and post a run summary to a Slack channel. How it works Runs every day at 06:00 (cron) on a schedule. Searches a Google Drive folder for CSV files whose names do not include the "reconciled-" prefix, then downloads each file. Parses each downloaded CSV into rows and records any files that cannot be parsed. Validates each row for required columns and basic data types, deduplicates by order_id (keeping the first), and routes invalid, duplicate, or unreadable inputs into a reject dataset with reasons. Builds and uploads a dated master CSV (reconciled-master-YYYY-MM-DD.csv) back to Google Drive when there are valid rows. Builds and uploads a dated reject CSV (reconciled-rejects-YYYY-MM-DD.csv) back to Google Drive when any rows are quarantined. Posts a recap message to Slack with counts for files read, rows processed, merged rows, quarantined rows, duplicates dropped, and unreadable files. Setup Add Google Drive OAuth2 credentials and select the input folder to search in the Google Drive search step.
Alert on API contract drift using Data Tables and Slack
Quick overview This workflow runs on a schedule, polls a JSON API endpoint, derives and stores a snapshot of the response schema in an n8n Data Table, and posts a Slack alert only when the response structure or field types change. How it works Runs every 6 hours on a schedule. Loads the configured API endpoint URL, an endpoint key used for snapshotting, and the target Slack channel. Fetches the endpoint with retries and skips the run if the response is not a valid JSON object or array. Derives a normalized schema (field paths, types, required/optional, and nullability) and compares it to the previous schema stored in an n8n Data Table. Upserts the latest schema snapshot back into the n8n Data Table under the same endpoint key. Posts a formatted drift report to Slack only when a high- or medium-severity contract change is detected. Setup Create an n8n Data Table (for example, “API Contract Snapshots”) with text columns named endpointKey and schema_object, and select its ID in both the read and upsert steps. Add a Slack API credential in n8n. Update the Settings values for endpointUrl, endpointKey, and slackChannel (Slack channel ID) to match your API and destination channel. Run the
Notify Slack about Figma library publishes, comments and deletions
Quick overview This workflow listens for Figma team events (library publishes, file comments, and file deletions), formats each event into a readable message, and posts the result to a chosen Slack channel. How it works Triggers when a Figma team library is published. Triggers when a new Figma file comment is added, replied to, or resolved. Triggers when a Figma file is deleted. Formats library publish events into a Slack message including the file name, a summary of changed components/styles/variables, a short preview of changed item names, author, timestamp, and a Figma link. Formats comment events into a Slack message by reconstructing the comment text (including resolving @mentions to handles), adding author, timestamp, and a direct reply link to the comment in Figma. Formats delete events into a Slack message including the file name, author, timestamp, and a note that the file is recoverable from Figma trash for 30 days. Posts the formatted message to the configured Slack channel. Setup Connect a Figma API credential that has access to the target team and set the correct Figma Team ID in each Figma trigger. Connect a Slack OAuth/bot credential and set the destination Slack cha
Review Jira ticket quality with OpenRouter GPT and coaching comments
Quick overview This workflow triggers on new Jira Cloud issues (Story, Bug, or Task), uses OpenRouter (OpenAI model) to score ticket quality across five criteria, and posts an automated coaching comment back to Jira only when the ticket falls below a configurable threshold. How it works Triggers when a new Jira issue is created that matches the selected issue types (Story, Bug, Task). Sets a configurable quality score threshold used to decide whether the ticket needs feedback. Sends the ticket’s type, title, description, and reporter details to an OpenRouter-hosted OpenAI chat model to generate a structured quality evaluation JSON. Parses and validates the model response as JSON and extracts the normalized score, missing criteria, and coaching comment. Checks whether the normalized score is below the configured threshold. If the score is below threshold, adds a formatted coaching comment to the Jira issue; otherwise, it takes no action. Setup Add Jira Software Cloud credentials in n8n and ensure the Jira Trigger can receive issue-created events for your Jira Cloud site. Add an OpenRouter API credential for the OpenRouter chat model used to evaluate ticket quality. Set the SCORE_THR
Generate English–Polish vocabulary quizzes with Google Sheets and Groq
Quick overview Tool useful for any language exams. It is a chat-based workflow that uses Google Sheets in Structure English|your language that using free Groq model (Llama 3.3) generate lists of 10 words that you need to provide answer based on your while model helps How it works Receives a chat message as the trigger input. Checks whether the message contains the word “generate” to decide if it should create a new quiz set or continue the current session. When “generate” is included, reads vocabulary rows (English and your language columns) from a specified Google Sheets range. Randomly shuffles the rows, selects 10 pairs, and formats them as a clean list of {english, your-language} objects. Sends the user message and the selected word pairs to a Groq Llama 3.3 chat model that runs the quiz conversation. Uses a buffer memory window to keep recent chat context so the agent can track which words are answered and which still need guesses. Setup Connect Google Sheets OAuth credentials and set the correct spreadsheet URL, sheet name, and range that contains “English word” and “your language words” columns. Add Groq API credentials and confirm the selected model (llama-3.3-70b-versatile
Track and de-duplicate email leads in Google Sheets from Gmail
Quick overview This workflow polls Gmail for new unread emails with a specific label, extracts lead details from each message, checks Google Sheets for duplicates by email or message ID, and appends only new leads to a designated spreadsheet. How it works Polls Gmail every minute for unread messages matching the search query (for example, emails labeled “Leads”). Extracts sender name and email, subject, message text, phone number (if found), received timestamp, and the Gmail message ID. Reads existing rows from the target Google Sheets tab to compare against previously captured leads. Flags the incoming lead as a duplicate if an existing row matches either the sender email address or the message ID. Appends the lead as a new row in Google Sheets only when it is not flagged as a duplicate. Setup Connect your Gmail OAuth2 credentials and adjust the Gmail trigger query/label and read status filter to match your intake process. Connect your Google Sheets OAuth2 credentials. Update the Google Sheet ID and sheet tab name in the extraction step, and ensure the sheet has columns for Email, Name, Subject, Phone, Message, Received At, and Message ID. Requirements n8n Cloud or self-hosted n8n
Score LinkedIn leads in Google Sheets with Bright Data and Claude
Quick overview This workflow watches a Google Sheets leads sheet, enriches each new lead with LinkedIn person and company data from Bright Data, then uses Anthropic Claude to generate a 0–100 lead score and reason and updates the sheet status to HOT or DONE. How it works Triggers when a new row is added to a Google Sheets worksheet. Reads the leads from the sheet and iterates through the rows that match the configured Status filter. For each lead, uses Bright Data to fetch structured data from the lead’s LinkedIn person profile, then waits briefly to respect rate limits. Uses Bright Data to fetch structured data from the lead’s current company LinkedIn page, then waits briefly to respect rate limits. Sends the person and company details to Anthropic Claude to return a JSON score (0–100) and a one-sentence reason. Parses the JSON response, flags leads with scores ≥ 70 as HOT 🔥 and others as DONE, and writes the enriched fields (title, company, size, location, connections, score, reason) back to Google Sheets. Setup Connect Google Sheets OAuth credentials (Trigger and Google Sheets) and replace YOUR_GOOGLE_SHEET_ID with your spreadsheet ID. Add a Bright Data API credential and ensur
Rank resumes by job description similarity using OpenRouter embeddings
Quick overview This workflow collects resume PDFs and a job description through an n8n form, extracts text (with OCR for scanned PDFs), generates embeddings via OpenRouter, and ranks the resumes by cosine similarity to the job description, returning a CSV-style list of ranked filenames. How it works Receives resume PDFs and a job description from an n8n form submission. Creates an embedding for the job description using OpenRouter’s embeddings endpoint with openai/text-embedding-3-large. Processes each uploaded resume one at a time, converting the PDF to text using built-in PDF extraction. If the extracted text is too short (likely scanned), sends the PDF to OpenRouter chat completions with the file-parser plugin (mistral-ocr) to OCR the document and return plain text. Creates an embedding for each resume’s extracted text (from direct extraction or OCR) using openai/text-embedding-3-large. Computes cosine similarity between each resume embedding and the job description embedding, then sorts resumes from most similar to least similar. Returns a completion page containing a CSV-style list of rank and filename. Setup Add an OpenRouter API credential in n8n and select it on the embeddi
Monitor n8n security advisories from GitHub, NVD, JPCERT and JVN with Claude and Slack
Quick overview This workflow runs hourly to monitor n8n-related security information from GitHub Advisories, NVD (NIST) CVE data, GitHub n8n security release notes, and JPCERT/JVN RSS feeds, then summarizes new findings with Anthropic Claude and posts an alert to Slack. How it works Runs every hour on a schedule. Fetches the latest items from the GitHub Advisory API, the NVD CVE API, the n8n GitHub Releases Atom feed, and the JPCERT and JVN RSS feeds. Parses the XML feeds, normalizes all sources into a single list of n8n-related security items, and removes duplicates and previously notified items using stored IDs. Checks whether any new items were found and stops if there are none. Sends the new items to Anthropic Claude to generate a concise Japanese summary including importance, affected product, and urgency. Formats a Slack Block Kit message and posts the alert to the configured Slack channel. Saves the notified item IDs to workflow static data to prevent repeat notifications in future runs. Setup Create an NVD API key and add it as an HTTP Header Auth credential named (or mapped to) NVD_API_Key with header name apiKey. Add an Anthropic API credential for the Claude model used i
Create blog drafts, images, and LinkedIn posts with Tavily, Gemini, and OpenAI
Quick overview This workflow receives a blog request via webhook, researches the topic with Tavily, generates a long-form HTML article using Google Gemini, creates two images via the kie.ai API, stores assets in Google Drive, updates a Google Sheets tracker, and notifies a Slack user with links. How it works Receives a POST webhook request containing a Google Sheets row payload with an “AI Blog Title” and related metadata. Searches the web for supporting sources using Tavily and passes the research plus the title to Google Gemini to generate the full article as HTML. Converts the generated content to HTML, creates a temporary HTML file in Google Drive, downloads it to set the correct text/html MIME type, re-uploads it as the final Drive file, and deletes the temporary file. Sends the finished article to OpenAI to generate a short LinkedIn post, then updates the matching row in Google Sheets with a Done flag, the article folder/link value, and the LinkedIn post text. Creates a cover image and an in-article infographic by submitting two text-to-image jobs to the kie.ai API, polling until each job succeeds, downloading each resulting image, and uploading both images to Google Drive. W
Send weekly curated news newsletters with Bright Data, Claude, and Gmail
Quick overview This workflow runs every Monday to scrape Google News with Bright Data, fetch and clean the full text of the top five unique stories, generate an HTML newsletter with Anthropic Claude, and send it via Gmail. How it works Runs every Monday on a scheduled trigger. Uses Bright Data to scrape a Google News search results page for the configured topic. Filters out YouTube results, deduplicates by title, and keeps the top five stories. Loops through the five stories and uses Bright Data to scrape each article’s full content as Markdown. Cleans and truncates each article’s text to remove navigation, ads, images, and link clutter. Aggregates the five cleaned articles and sends them to Anthropic Claude to generate a single clean HTML newsletter. Sends the generated HTML newsletter to the configured recipient using Gmail. Setup Add a Bright Data credential and ensure your Web Unlocker zone (for example, n8n_unlocker) is available in your Bright Data account. Add an Anthropic API credential and select the Claude model you want to use. Add a Gmail OAuth2 credential and set the recipient email address, subject, and any desired email options. Update the Google News search URL (the
Analyze Instagram profiles with Apify, Google Gemini, and Supabase
Quick overview This workflow receives an Instagram username via webhook, checks Supabase for a recent cached analysis, and if needed scrapes recent posts with Apify and generates niche, content, and engagement insights using Google Gemini before storing and returning the report. How it works Receives a POST webhook request containing an Instagram username. Queries the Supabase reports table for matching records updated within the last 24 hours and returns the cached analysis_report if found. If no fresh cache exists, runs the Apify Instagram Scraper actor to fetch the latest 5 posts for the requested profile. Cleans and bundles the scraped post data into a compact JSON payload for analysis. Sends the payload to Google Gemini to generate three sub-reports: niche/frequency, content strategy, and engagement/actions. Combines the three Gemini outputs into a single analysis_report object along with the scraped data. Upserts the report into Supabase (update if the username exists, otherwise insert) and returns the fresh analysis_report in the webhook response. Setup Create or select a Supabase project, add Supabase credentials in n8n, and ensure a reports table exists with at least usern
Qualify open house leads and send AI follow-ups with Google Sheets and Gmail
Quick overview When a visitor signs in at your open house, this workflow instantly scores their buying intent using Gemini AI, sends a personalized follow-up email via Gmail, logs every visitor to Google Sheets, and alerts the agent for hot leads only. How it works A visitor signs in via your Google Form at the open house. Their details — name, email, phone, budget, timeline, and buying intent — are captured automatically. AI (Gemini) scores them as Hot, Warm, or Cold based on their responses and drafts a personalized follow-up email in the same step. A tailored thank-you and next-step email sends immediately via Gmail. Every visitor is logged to Google Sheets with their score, reasoning, and message sent. If a lead scores Hot, the agent receives an instant notification email — and optionally a Slack alert — so they can prioritize personal outreach right away. Setup Connect credentials for Google Sheets (trigger and append), Google Gemini (PaLM API), and Gmail (to send visitor follow-ups and agent notifications). Set the Google Sheets Trigger document and sheet to your sign-in responses sheet, and map the expected column headers (Full Name, Email Address, Phone Number, property, bu
Generate digital product launch content with OpenAI GPT-4o-mini and Google Sheets
Quick overview This workflow generates a multi-channel digital product launch content pack from product details, using OpenAI to create a blog intro, LinkedIn post, X post, Instagram caption, and launch email, and can optionally append the results to Google Sheets. How it works Runs manually when you execute the workflow. Loads sample product details such as name, tagline, price, URL, target audience, and brand tone. Sends the product details to OpenAI (GPT-4o-mini) with instructions to return a JSON content pack for blog, LinkedIn, X, Instagram, and email. Normalizes and validates the returned JSON, ensuring all five content fields are present and formatted as plain text. Optionally appends the generated content fields as a new row in Google Sheets (when the Google Sheets step is enabled). Setup Add an OpenAI API credential and select it in the OpenAI Chat Model configuration. Replace the sample product fields (especially productURL and brandTone) with your own product data or connect a real data source. (Optional) Enable the Google Sheets step, add Google Sheets OAuth2 credentials, and set the target spreadsheet ID and sheet name. Requirements n8n instance (cloud or self-hosted)
Create restorable n8n Docker backups in Google Drive via SSH
Quick overview This workflow backs up n8n workflows and encrypted credentials from a self-hosted Docker instance via SSH, stores the exports as JSON files in structured Google Drive folders, and provides a Basic Auth–protected form to restore uploaded backups back into an n8n Docker container. How it works Runs on a cron schedule to start a backup and set the target n8n Docker container name and timestamp. Creates a timestamped backup folder in Google Drive with subfolders for workflows and credentials. Connects over SSH and runs the n8n CLI inside the Docker container to export all workflows and all credentials as JSON. Uploads a full workflows-all.json export and also uploads each workflow as its own JSON file into the Google Drive workflows folder. Uploads a full credentials-all.json export and also uploads each credential as its own JSON file into the Google Drive credentials folder. Builds a combined workflows-credentials.json package from both exports and uploads it to the root of the Google Drive backup folder. Accepts one or more uploaded .json files through a Basic Auth–protected n8n form, detects whether they contain workflows or credentials, then copies a generated impor
Monitor AI search visibility with Talordata SERP, OpenAI, and Google Sheets
Quick overview This workflow runs on demand to crawl Google SERP pages via Talordata, aggregates organic results and related searches, uses OpenAI to produce a structured AI Search Visibility report with GEO recommendations and a score, and appends or updates the results in Google Sheets. How it works Starts when you manually execute the workflow and sets the target query, search engine (Google), and initial page. Calls the Talordata MCP Search API to fetch the first SERP page, then extracts pagination metadata and builds a list of pages to crawl. Loops through each SERP page and requests additional results from Talordata using the corresponding page/start value. Normalizes each page into structured datasets for organic results and related searches, and aggregates all page data into a single consolidated SERP payload. Sends the consolidated SERP dataset to OpenAI to generate a structured AI Search Visibility report (metrics, domain categorization, opportunities, recommendations, executive summary, and score). Parses the model output into JSON and appends or updates a matching row in Google Sheets keyed by the SERP link. Setup Add a Talordata Bearer Auth credential and confirm acces
Notify on server restarts with Discord, Telegram, and Slack alerts
Quick overview This workflow triggers when the n8n instance starts, checks recent executions via the n8n API for unfinished runs, summarizes which workflows are affected, and posts a restart and incident summary to Discord and Telegram (with an optional Slack message). How it works Triggers when the n8n instance initializes (server restart/startup). Sets runtime variables (restart timestamp, lookback window, and maximum executions to fetch) and retrieves recent executions from the n8n API. Filters executions to those that are still unfinished and started within the configured lookback window. Groups the filtered executions by workflow ID, counts how many are affected per workflow, and sorts them by highest count. Builds formatted Discord, Slack, and Telegram messages that include the restart time, an estimated downtime/gap, and links to the affected workflows’ execution pages. Sends the message to a Discord channel via a Discord webhook and to a Telegram chat via the Telegram Bot API (Slack posting is present but disabled). Setup Create and add an n8n API credential with permission to read executions. Create a Discord incoming webhook for your target channel and add it as a Discord
Create social posts from RSS with OpenAI, LinkedIn, X, and Bluesky
Quick overview This workflow runs daily, reads the Hacker News frontpage RSS feed, uses OpenAI to extract key insights and ghostwrite social posts, then publishes the generated content to LinkedIn, X, and Bluesky. How it works Runs every day at 08:00 using a schedule trigger. Fetches the latest items from the Hacker News frontpage RSS feed and keeps only the first three articles. Prepares a clean title, content snippet, and link for each article. Sends each article to OpenAI Chat Completions (gpt-4o-mini) to extract three non-obvious insights. Sends the insights to OpenAI Chat Completions again to generate platform-specific posts (LinkedIn, X, and Bluesky) in a defined voice and JSON format. Parses and clamps the generated text to length limits and then posts to LinkedIn and X while also authenticating to Bluesky and creating a Bluesky post. Setup Add an OpenAI API credential for the two OpenAI Chat Completions HTTP requests. Add LinkedIn and X (Twitter) credentials and confirm the target posting identity/settings for each platform. Replace the Bluesky handle and app password in the Bluesky login request and ensure Bluesky app passwords are enabled for the account. (Optional) Updat
Scrape Tunisia IT job listings with Groq, Firecrawl, Airtable, and Resend
Quick overview This workflow runs daily or via chat to scrape Tunisia-focused IT job listings from predefined company career pages using Firecrawl, saves results into Airtable tables, and emails a daily digest through Resend, with job parsing and orchestration handled by a Groq-powered AI agent. How it works Triggers either on a daily 7AM schedule or when an n8n Chat message is received. On scheduled runs, rotates through a fixed list of companies, builds a prompt for the chosen company (including pagination rules), and sets the Airtable table name. Uses a Groq (Llama 3.3 70B) AI agent to decide which allowed career-page URLs to scrape and how to extract job listings into structured fields. Scrapes the requested career pages via the Firecrawl API and parses the returned main content into jobs with title, company, location, description, and URL. When saving is requested, uses Airtable’s API to check for the target table, create it if missing, and insert the job records. For scheduled runs, emails the AI-generated job digest to the configured recipient using the Resend API; otherwise it outputs the response for the chat session. Setup Add credentials and values for Firecrawl (API key
Create Google Tasks from Tactiq meeting transcripts using OpenAI and Telegram
Quick overview This workflow monitors a Google Drive folder for new Tactiq transcript files, uses OpenAI to extract explicit action items, creates matching Google Tasks, sends a Telegram notification, and logs each processed transcript in an n8n Data Table to prevent duplicate processing. How it works Triggers when a new file is created in a specified Google Drive folder (or on an optional 12-hour schedule). Loads previously processed transcript filenames from an n8n Data Table and lists files in the target Google Drive folder. Filters out files that have already been processed, then downloads each new transcript and converts it to plain text. Sends the transcript text to OpenAI to return strict JSON containing only explicit action items with an owner, optional due date, and an evidence quote. Creates a Google Task for each extracted action item, including source transcript details in the task notes, and sends a Telegram error message if task creation fails. Records the transcript as processed in the n8n Data Table (including zero-task transcripts) and sends a Telegram success message. Setup Add credentials for Google Drive, Google Tasks, OpenAI, and Telegram. Create or choose an n
Route human-in-the-loop approval requests with Slack and Postgres
Quick overview This workflow exposes a single webhook that either accepts new approval requests or handles Slack button callbacks, posting interactive Slack Block Kit messages and recording decisions in a PostgreSQL table. How it works Receives a POST request on a webhook endpoint that serves as both the intake API and the Slack interactivity callback URL. Validates the Slack request signature and timestamp when the request includes Slack signature headers. Routes the request by detecting whether it contains a URL-encoded Slack payload (callback) or a custom intake body (new request). For intake requests, builds a Slack Block Kit approval message with Approve/Reject/Flag buttons and posts it to Slack. Stores the request context, Slack channel ID, and message timestamp in PostgreSQL and returns a 200 response with the generated requestId. For Slack button callbacks, immediately returns a 200 response to Slack, looks up the request context in PostgreSQL, and merges it with the callback details. Updates the original Slack message to replace buttons with a static decision status and writes the decision (approved/rejected/flagged) back to PostgreSQL. Setup Create the approval_requests t
Run a multi-agent research and publishing pipeline with GPT-4o, Tavily and Notion
Quick overview Three specialized AI agents: Researcher, Writer, and Reviewer, collaborate autonomously to research a topic, draft content, and quality-check it through a self-correcting review loop with a circuit breaker. Approved content is published directly to Notion with full audit metadata. How it works A form submission captures the research topic, content format (blog post, exec summary, or LinkedIn post), target audience, and maximum revision cycles allowed before the circuit breaker fires. The Researcher Agent uses GPT-4o and Tavily Search to gather authoritative sources, extract key facts and contradictions, and produce a validated research brief. Search depth and result count are automatically scaled to the requested format. The Writer Agent receives the research brief and produces a structured draft in the correct format. On revision cycles it also receives the Reviewer's specific rejection notes and must address them directly. A Circuit Breaker sits between the Writer and Reviewer. If the number of Reviewer rejections reaches the user-defined maximum, the draft is force-approved and the pipeline proceeds to publishing without another LLM call. The Reviewer Agent evalua