# Prompt log — 24h 2026-08-10 ======================================================================== ## [1] summariseModule:ai:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI (Artificial Intelligence) (machine name: ai) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ann Mary Sruthy (annmarysruthy), Rob Loach (robloach), Scott Euser (scotteuser), Shivam Sen (shivamsen_12579)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

AI (Artificial Intelligence)

then use

,

,

    /
  • , and as needed. Output only the HTML fragment with no surrounding , , or
    tags. After the project summary prose, add a single subsection titled "

    How can I help on this project?

    " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Add AIDmi to Other modules/recipes that work with the AI module](https://git.drupalcode.org/project/ai/-/work_items/3586566) State: opened | Updated: 2026-08-10 | Author: Mike Feranda (mferanda) | Assigned: unassigned | Labels: category::task, priority::minor, state::accepted Description: Please add AIDmi to your list of Drupal AI other modules. [AIDmi](https://www.drupal.org/project/aidmi) - AI, describe my image! - CKEditor image accessibility plugin for Alt/Caption text generation https://www.drupal.org/project/aidmi ### [Drupal AI Contribution meeting 2026-08-10](https://git.drupalcode.org/project/ai/-/work_items/3586662) State: opened | Updated: 2026-08-10 | Author: Valery Lourie (valthebald) | Assigned: unassigned | Labels: No Estimation Available Description: Drupal AI Contribution meeting from August 10 at 18:00 to August 11, 2026 19:00 (Central European time, check your local time at https://www.timebie.com/std/berlin.php?q=18) Previous meeting https://git.drupalcode.org/project/ai/-/work_items/3586618 ## Where #ai-contrib channel in [Drupal Slack](https://www.drupal.org/slack/) ## Agenda ### Attendees self-intro and interests ### Follow-up to topics of previous meeting ### Suggest your topic in comments ### Add the issue you want to discuss as a comment or related issue to this meeting ## Transcript ### [Drupal AI Contribution meeting 2026-07-27](https://git.drupalcode.org/project/ai/-/work_items/3586618) State: opened | Updated: 2026-08-10 | Author: Valery Lourie (valthebald) | Assigned: Valery Lourie (valthebald) | Labels: No Estimation Available, meetings Description: Drupal AI Contribution meeting from July 27 at 18:00 to July 28, 2026 19:00 (Central European time, check your local time at https://www.timebie.com/std/berlin.php?q=18) Previous meeting https://git.drupalcode.org/project/ai/-/work_items/3586591 Next meeting https://git.drupalcode.org/project/ai/-/work_items/3586662 ## Where #ai-contrib channel in [Drupal Slack](https://www.drupal.org/slack/) ## Agenda ### Attendees self-intro and interests ### Follow-up to topics of previous meeting ### Suggest your topic in comments ### Add the issue you want to discuss as a comment or related issue… ### [Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{ context }} and {{ raw_context }} before they reach the provider](https://git.drupalcode.org/project/ai/-/work_items/3586661) State: opened | Updated: 2026-08-10 | Author: Ann Mary Sruthy (annmarysruthy) | Assigned: unassigned | Labels: category::bug, priority::normal, state::needs review Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1924 [bug: #3586661 Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{...](https://git.drupalcode.org/project/ai/-/merge_requests/1924) | State: opened | Author: Ann Mary Sruthy (annmarysruthy), 324 diff lines Description: Problem/Motivation AiPromptHelper::renderPrompt() builds the prompt with this-\>twig-\>createTemplate(htmlspecialchars_decode(prompt)), using Drupal's Twig environment with HTML autoescaping enabled. Every token value is HTML-escaped on its way into the string sent to the provider. {{ raw_context }}, documented as "The raw text from the base field. Can include HTML", cannot pass HTML at all — tags arrive as \. {{ context }} can arrive double-escaped: generateTokens() uses strip_tags(), which removes tags but leaves entities like & intact, and Twig escapes that again into &. Given a Body valu… ### [If only one tool, cannot delete it, gives an error: Undefined array key 1 in Drupal\ai\Element\ToolsLibrary::processToolsLibrary() (line 89 of modules/contrib/ai/src/Element/ToolsLibrary.php) & more](https://git.drupalcode.org/project/ai/-/work_items/3586652) State: opened | Updated: 2026-08-10 | Author: Prabhavathi Vanipenta (prabha1997) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::rtbc Description: Am on Drupal 11.3.16, PHP 8.4, ai 1.4.5, ai_agents 1.3.2 If my AI Agent has one tool, and I try to delete it using its trashcan icon at the upper right, the tool still remains... If I then Save the AI Agent, and go back into it, the following errors/warnings appear at the top: ``` Warning: Undefined array key 1 in Drupal\ai\Element\ToolsLibrary::processToolsLibrary() (line 89 of modules/contrib/ai/src/Element/ToolsLibrary.php). Warning: Trying to access array offset on null in Drupal\ai\Element\ToolsLibrary::processToolsLibrary() (line 89 of modules/contrib/ai/src/Element/ToolsLibra… ### [Chatbot closes itself when adding a modal](https://git.drupalcode.org/project/ai/-/work_items/3499451) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, Has Testing Steps, ai::inside Description: >>> [!note] Migrated issue Reported by: [heyyo](https://www.drupal.org/user/474388) Related to !1277 >>> Problem/Motivation ChatBot closes itself, and impossible to reopen-it, without refreshing the page Steps to reproduce 1. Create new content with CKEditor, for example basic page 2. Open ChatBot 3. Add Media into Ckeditor, we can see ChatBot closes 4. Include the Media 5. It's impossible to reopen the ChatBot ### [Document FunctionalJavascript test conventions and add CI check for ungrouped/unrecorded tests](https://git.drupalcode.org/project/ai/-/work_items/3582633) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Abhisek Mazumdar (abhisekmazumdar) | Labels: 2026Sprint14, 2026Sprint15, 2026Sprint16, AI Initiative Sprint Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1432 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: Document FunctionalJavascript test conventions and add CI check for ungrouped/unrecorded tests Check-in Date: MM/DD/YYYY [/Tracker] Problem/Motivation The AI module has a system for running FunctionalJavascript tests in CI that relies on two conventions: Every new FJS test class must have a @group annotation with the issue number it belongs to, so the filter script (scripts/filter-functio… ### [`AiReranker::extractItemText()` should prefer chunk text over configured indexed fields](https://git.drupalcode.org/project/ai/-/work_items/3586637) State: opened | Updated: 2026-08-10 | Author: Abhisek Mazumdar (abhisekmazumdar) | Assigned: Abhisek Mazumdar (abhisekmazumdar) | Labels: ai::inside, category::bug, priority::normal, sprint candidate Description: ## Problem/Motivation `ai_search`'s chunk-mode retrieval (used by `RagTool` and any other consumer querying with `search_api_ai_get_chunks_result`) carries the actual chunk text in `$item->getExtraData('content')`, not in the item's configured indexed source fields. `AiReranker::extractItemText()` only reads the processor's configured `source_fields` off each result item. For chunk-mode results this means every chunk belonging to the same entity reranks against the same text: the entity's full configured field content, not the individual chunk. Chunk-level rerank quality regresses to entity-… ### [Add thumbs-up and thumbs-down icons to the shared AI icon set](https://git.drupalcode.org/project/ai/-/work_items/3586660) State: opened | Updated: 2026-08-10 | Author: Aidan Foster (aidanfoster) | Assigned: Eric Homanchuk (erichomanchuk) | Labels: Quick Win, category::feature, priority::minor, state::accepted Description: The shared AI icon set added in #3571220 does not include thumbs-up or thumbs-down. Feedback controls are appearing across the AI ecosystem (AI Answers, AI Content Review) and each one is currently rolling its own, mostly as raw emoji, so the glyph varies by operating system and browser and does not match the rest of the AI admin UI. ## Proposed resolution Add `ai-icon--thumbs-up` and `ai-icon--thumbs-down` variations to `ai_global.css`, sourced from Phosphor per the icon source hierarchy agreed in #3567389. Use these specific icons: - Thumbs up: https://phosphoricons.com/?q=ThumbsUp - Thu… ### [ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models](https://git.drupalcode.org/project/ai/-/work_items/3586425) State: opened | Updated: 2026-08-10 | Author: josecarlosmedero | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint15, 2026Sprint16, AI Initiative Sprint Description: **Problem / Motivation** `AiRequest.php` calls `setStreamedOutput(TRUE)` for all providers. The PHP client `gemini-api-php` sends a malformed request body when calling `streamGenerateContent` against Gemini 2.x models, resulting in `400 Bad Request`. The non-streaming endpoint `generateContent` works correctly with the same payload. The error in logs: `Error invoking model response: Client error: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent resulted in a 400 Bad Request response` Confirmed: the identical payload sent to `generateConten… ### [LLM: Text / LLM: Text (simple) automators silently drop Base Field content when Base Field and Target Field are both long-text types (Basic input mode)](https://git.drupalcode.org/project/ai/-/work_items/3586659) State: opened | Updated: 2026-08-10 | Author: Adrian McKee (Adrianm6254) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Description: Problem/Motivation When configuring an LLM: Text (llm_text_long) or LLM: Text (simple) (llm_simple_text_long) automator in Basic input mode, with Automator Base Field set to another long-text field on the same entity (e.g. Body → a new summary field, both text_long/string_long type), the Base Field's content is not included in the request sent to the AI provider. The model consistently responds as though no source content was provided at all, e.g.: "I don't see an article provided in your message. Please share the article you'd like me to summarize..." This happens regardless of whether the… ### [[PLAN] Propagate and enforce an explicit executor for sessionless, queued, and outside-in AI runs](https://git.drupalcode.org/project/ai/-/work_items/3573899) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::outside Description: **Problem/Motivation** The AI subsystem largely assumes tool execution and access checks rely on the active web session (`\Drupal::currentUser()`). For background agents, cron, queue workers (Symfony Messenger), and outside-in entry points (MCP, orchestration APIs), that assumption breaks down: queued work loses the account it was initiated under, cron paths run as anonymous, and helpers read ambient `currentUser()` state. The result is incorrect access checks and incorrect authorship. Attempts to fill the gap with synthetic users or temporary role mutation (e.g. [#3518167](https://git.drupa… --- MERGE REQUESTS (24h) --- ### [Issue #3586475: Rename the RegExp Guardrail labels to RegEx](https://git.drupalcode.org/project/ai/-/merge_requests/1689) State: opened | Author: Rob Loach (robloach) | Branch: 3586475-guardrails-regex-plugin-name | 205 diff lines Description: ## Description This renames the regexp guardrail labels to "RegEx" for consistency within the UI. It doesn't change the machine IDs, or class names, just the labels. ## Testing instructions 1. Visit the Guardrails administration screen 2. Expect to see RegEx, instead of regexp Closes #3586475 ## Checklist - [x] I have linked the related issue in the MR title or description - [x] I have performed a self-review of my own code - [x] I have added or updated tests, or explained in the description why this change is not covered by tests - [x] I have updated documentation for any new or chan… ### [#3582633: Add Functional JavaScript testing conventions and validation script](https://git.drupalcode.org/project/ai/-/merge_requests/1432) State: opened | Author: Shivam Sen (shivamsen_12579) | Branch: 3582633-document-functionaljavascript-test | 237 diff lines Description: (cherry picked from commit 20c8ac18d15a25ffd0db807b6e427e8b41d34cf7) Closes #3582633 ### [Resolve #3586495 "Add support embeddings via symfony/ai"](https://git.drupalcode.org/project/ai/-/merge_requests/1856) State: opened | Author: Scott Euser (scotteuser) | Branch: 3586495-add-support-embedings-via-symfonyai | 348 diff lines Description: Closes #3586495 --- COMMITS (24h) --- (none) ======================================================================== ## [2] summariseModule:ai_initiative:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Drupal AI Initiative (machine name: ai_initiative) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. Do not name any individual people in this section. No one was active enough this period to list. Format your response as an HTML fragment. Start with

    Drupal AI Initiative

    then use

    ,

    ,

      /
    • , and as needed. Output only the HTML fragment with no surrounding , , or
      tags. After the project summary prose, add a single subsection titled "

      How can I help on this project?

      " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Drupal AI UX meeting 10 August 2026](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586608) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: category::task, meetings, priority::normal, state::accepted Description: **Date:** Monday, August 10, 2026 **Attendees:** Aidan, Emma, Bruno, Darren, Ángela, Christoph #### Roadmap to Rotterdam — #3586657+s - Reviewed as the demo's organizing structure; sub-leads per area still being filled. #### EU AI Act Article 50 disclosure — #3586640+s - Read as approved; demoted to a backup task and offered to new contributors as a labels and padding review. #### Demo content, structure and theme - Content and structure first, theme applied after; Emma's CCC content as the starting point but far more volume needed - Tone and voice guidelines must load before content is… ### [Update AI partner badges to use Partner instead of Sponsor](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586636) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: Tanisha Kalia (tanishakalia), Ryan Witcombe (ryan_witcombe), Molly Shenberger (mollyshenberger) | Labels: category::task, daRequest, design, priority::normal Description: ## Problem The AI initiative badges were created before we settled on the "Partner" naming (used to "Maker"). They show Sponsor now which doesn't capture the collaborative nature of the involvement with the initiative. ## Solution Update the badges to use "Partner" rather than "Sponsor": https://new.drupal.org/themes/contrib/bluecheese/images/badges/drupal_ai_founding_sponsor_badge.svg https://new.drupal.org/themes/contrib/bluecheese/images/badges/drupal_ai_gold_sponsor_badge.svg https://new.drupal.org/themes/contrib/bluecheese/images/badges/drupal_ai_silver_sponsor_badge.svg ### [Communication Binarywork to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586718) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Genero inc to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586720) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Smile to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586719) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Evolvingweb to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586717) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Digital polygon to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586716) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Sparkfabrik to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586715) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Promet source to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586714) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Redhat to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586713) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Omedia to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586712) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join, work through pantheon ### [Communication Faktorial to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586711) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication NTTdata to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586710) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: Didnt join ### [Communication Swis to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586709) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Hintogroup to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586708) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: Considering ### [Communication Mobomo to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586707) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: didnt join ### [Communication Kadabra IT to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586706) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: They think about it ### [Communication EPAM joining](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586705) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: they joined ### [Communication iTech4Web](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586704) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call Pronovix to join](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586703) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call Zivtech to join Initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586702) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Communication Joshi consulting](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586701) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Joined but removed later ### [Communication Civiactions](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586700) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: Considering to join ### [Call IOgroup CEO](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586699) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they think about it, eventually didnt join. ### [Call 2 calibrate](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586698) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: They joined ### [Call 1 calibrate](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586697) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: They think about it ### [Call with Oomph](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586696) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Communication with Specbee](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586695) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with Cambridge press](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586694) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with Reading room to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586693) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: result they joined ### [Went to see Vesa from Wunder in Cascais to join AI initaitive](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586691) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: he said he'd join ### [Met with team Mearra in Athens](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586692) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result they joined ### [Call 2 with Drupalforge](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586690) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call 1 with drupalforge](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586689) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Proposed special deal for non profit ### [Call/mail with Yorgos E-sepia](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586688) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Restuls: they joined ### [Call with integral vision](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586687) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result they joined ### [Call with Brainsum](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586686) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with Optasy](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586685) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with wolfgang Drunomics](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586684) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with Kalamuna](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586683) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call 2 with Josh from Pantheon](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586682) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call 1 with Josh from Pantheon](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586681) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they think about it ### [Call with Esinergia](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586680) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: They joined! ### [Call with Aidan Foster interactive](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586679) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: they joined ### [[META] 2026 AI Inside Roadmap to DrupalCon Rotterdam 2026](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586657) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Christoph Breidert (breidert) | Labels: AI Initiative, ai::inside, roadmap Description: ## Why this roadmap exists At DrupalCon Rotterdam at the end of September we want to show a single Drupal site where AI Search, AI content review, AI translation, an editor-facing chat, observability and guardrails all work together on real, multilingual content. Rather than describing these features one by one, we let people see them working together on one site, and we let anyone launch that site for themselves in a few seconds on Drupal Forge. Most of these features already work today. The gap is almost never the core capability. The gap is that we have not yet shipped the recipes and dem… ### [Create a skill for manual before/after testing of any issue, with optional glab upload](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586629) State: opened | Updated: 2026-08-10 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: Marcus Johansson (Marcus_Johansson) | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, DX (Developer Experience) Description: ## Problem/Motivation Reviewing an issue manually is repetitive and easy to do inconsistently. To judge whether a merge request actually fixes what it claims, a reviewer has to set up the site, reproduce the original behaviour, apply the change, and then walk the exact same path again. In practice the "before" step is often skipped, so the review says "it works" without ever showing that it was broken to begin with. There is no shared, repeatable way to do this, and nothing that produces evidence a maintainer can look at without rebuilding the environment themselves. ## Proposed resolution … --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [3] summariseModule:mcp:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Model Context Protocol (machine name: mcp) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. Do not name any individual people in this section. No one was active enough this period to list. Format your response as an HTML fragment. Start with

      Model Context Protocol

      then use

      ,

      ,

        /
      • , and as needed. Output only the HTML fragment with no surrounding , , or
        tags. After the project summary prose, add a single subsection titled "

        How can I help on this project?

        " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Token Auth is not working](https://git.drupalcode.org/project/mcp/-/work_items/3584901) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Giorgi Jibladze (jibla) | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::outside Description: >>> [!note] Migrated issue Reported by: [aalin](https://www.drupal.org/user/2941961) >>> Problem/Motivation There are actually 2 issues here: 1. Inside /admin/config/mcp , when you click on "Enable Token Auth" checkbox nothing happens. This is because #states selector on token_with_generation is not correctly set: 'visible' => [   ':input[name="enable_token_auth"]' => ['checked' => TRUE],], instead of 'visible' => [  ':input[name="auth_settings[enable_token_auth]"]' => ['checked' => TRUE],],2. Even when configured manually via config export/import, the … ### [Add OAuth Scope Validation for MCP Authentication](https://git.drupalcode.org/project/mcp/-/work_items/3569845) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Shubham Goel (shubhamgoel) | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::outside Description: >>> [!note] Migrated issue Reported by: [shubhamgoel](https://www.drupal.org/user/3682434) Related to !44 >>> When authenticating from the MCP client to the server, the authentication succeeds with all the dynamic scopes requested. There should be an option to enable or configure only the supported OAuth fields/scopes. --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [4] summariseModule:ai_agents:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI Agents (machine name: ai_agents) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ahmad Khader (Ahmad-Khader), Bharat Kelotra (bharatkelotra), Joshua Fernandes (joshua1234511), Prabhavathi Vanipenta (prabha1997)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

        AI Agents

        then use

        ,

        ,

          /
        • , and as needed. Output only the HTML fragment with no surrounding , , or
          tags. After the project summary prose, add a single subsection titled "

          How can I help on this project?

          " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [MCP Server: Entity Seeder uses wrong type for content](https://git.drupalcode.org/project/ai_agents/-/work_items/3586031) State: opened | Updated: 2026-08-10 | Author: Kelly Ferrone (burbular) | Assigned: unassigned | Labels: automation::suggestionExists, category::bug, priority::major, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !345 [ContentEntitySeeder stores multi-property field values as Array](https://git.drupalcode.org/project/ai_agents/-/merge_requests/345) | State: opened | Author: Prabhavathi Vanipenta (prabha1997), 270 diff lines Description: **Project:** AI Agents (`ai_agents`) **Version:** 1.3.0 **Component:** Code — `Drupal\ai_agents\Plugin\AiFunctionCall\ContentEntitySeeder` (`ai_agent:content_entity_seeder`) I was using the mcp server on a brand new install. I tried getting Claude to make an article with some example text but it didn't work out. ContentEntitySeeder stores multi-property field values as literal "Array" (one nesting level dropped) **Problem** When the `content_entity_seeder` tool writes a field whose value goes through the `field_values` → `values` structure, it unwraps only **one** level of the nesting the… ### [Make it possible to restrict the order of tools during agent executions](https://git.drupalcode.org/project/ai_agents/-/work_items/3560681) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::inside Description: >>> [!note] Migrated issue Reported by: [shashikanth171](https://www.drupal.org/user/3516867) Related to !252 >>> Problem/Motivation AI Agent can sometimes execute tools in an order that doesn't make any sense. We can avoid this by improving the prompt template, making it more verbose with trial and error. Need to somehow allow configuration of each tool, to set which tool should be run prior to it. We can also expand it by including conditions like should be executed 1. only once, 2. first, 3. last etc. Depending on the tool and use case, configuring the agent with such restrictions will… ### [Use the `ai_json_schema` editor for the AI Agent structured-output schema field](https://git.drupalcode.org/project/ai_agents/-/work_items/3586042) State: opened | Updated: 2026-08-10 | Author: Ahmad Khader (Ahmad-Khader) | Assigned: Joshua Fernandes (joshua1234511) | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !284 [Issue #3586042 Use the `ai_json_schema` editor for the AI Agent structured-output schema field](https://git.drupalcode.org/project/ai_agents/-/merge_requests/284) | State: opened | Author: Ahmad Khader (Ahmad-Khader), 91 diff lines Description: ## Description The AI Agent form renders the **structured output** JSON schema as a plain `textarea` (`AiAgentForm::buildFormMetadata()`, `$form['prompt_detail']['structured_output_detail']['structured_output_schema']`). That makes a schema cumbersome to add (no validation or editor affordances, easy to ship malformed JSON) and hard to read once saved (a wall of escaped JSON). Switch it to the AI module's dedicated `'#type' => 'ai_json_schema'` element (`Drupal\ai\Element\AiJsonSchema`), so adding a schema uses a purpose-built CodeMirror editor (syntax highlighting, JSON linting) and a saved… ### [Explore export/sync plugin system for AI Agents to external agent platforms (Claude Code, VAPI, etc.)](https://git.drupalcode.org/project/ai_agents/-/work_items/3577241) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, AI Product Development Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !249 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: Explore export/sync plugin system for AI Agents to external agent platforms (Claude Code, VAPI, etc.) Check-in Date: MM/DD/YYYY [/Tracker] Problem/Motivation The AI Agents module currently allows defining and configuring agents inside Drupal. However, many modern AI ecosystems expect agents to exist inside external platforms such as Claude Code or services like VAPI. In many cases Drupal sh… --- MERGE REQUESTS (24h) --- ### [Issue#3586025:GetEntityFieldInformation-Leaks-Target_entity_type-Target_bundle...](https://git.drupalcode.org/project/ai_agents/-/merge_requests/344) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3586025-GetEntityFieldInformation-Leaks-Target_entity_type-Target_bundle_type-Across-Fields | 1759 diff lines Description: Issue#3586025:GetEntityFieldInformation-Leaks-Target_entity_type-Target_bundle_type-Across-Fields fixes. Closes #3586025 ### [Issue](https://git.drupalcode.org/project/ai_agents/-/merge_requests/343) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3585983-Ai_agents-Status-Subscriber-Fatals-When-Tool-Status-Output-Function-Name | 2111 diff lines Description: Closes #3585983 ### [Issue3569280:AI-Agents-Explorer-Chat-Generation-Does-Not-Support-Series-Models fixes](https://git.drupalcode.org/project/ai_agents/-/merge_requests/342) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3569280-AI-Agents-Explorer-Chat-Generation-Does-Not-Support-Series-Models | 1654 diff lines Description: Closes #3569280 ### [Issue#3566126:Force-Value-Dropped-Tool-Property-Restrictions fixes.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/341) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3566126-Force-Value-Dropped-Tool-Property-Restrictions | 1822 diff lines Description: Closes #3566126 ### [Issue #3560681: Add per-tool execution ordering constraints for agent loops.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/252) State: opened | Author: Joshua Fernandes (joshua1234511) | Branch: 3560681-make-it-possible | 3477 diff lines Description: Closes #3560681 ### [Issue#3565169:Schema-Error-AI-Agents-CKEditor-Plugin fixes.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/340) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3565169-Schema-Error-AI-Agents-CKEditor-Plugin | 3077 diff lines Description: Closes #3565169 ### [#3586042: Use the ai_json_schema editor for the structured output schema field.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/298) State: opened | Author: Joshua Fernandes (joshua1234511) | Branch: 3586042-use-the-ai-json-schema-editor-for-the-ai-agent-structured-output-schema-field-4x | 91 diff lines Description: Closes #3586042 Completes the wiring for the `ai_json_schema` (CodeMirror) editor on the AI Agent **Structured Output Schema** field: adds config-level JSON validation, lets the modeller resolve the field's schema, and fixes visibility toggling. ## Changes * **`config/schema/ai_agents.schema.yml`** — `structured_output_schema`: `string` → `text`, plus a `ValidJsonSchemaStructure` constraint (`checkAiConstraints: false` = plain valid-JSON, matching the form). * **`Agent.php`** — added `getPluginSchemaKey()` mapping the START component to `ai_agents.ai_agent.*` so the modeller (BPMN/off-canva… ### [test: #3586021 Add regression test for ai_agent plugin cache invalidation](https://git.drupalcode.org/project/ai_agents/-/merge_requests/337) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3564033-connecting-an-agent-to-an-assistant-doesnt-work-until-cache-clear-and-tool-api | 1407 diff lines Description: Adds a kernel test covering the fix in ai_agents_ai_agent_insert()/ _update()/_delete() that clears the plugin.manager.ai_agents and plugin.manager.ai.function_calls caches when an ai_agent config entity is saved or deleted. Reproduces the reported scenario (create an Agent, do not clear caches, explore/attach it) and asserts the agent is immediately usable without a manual cache clear. Co-Authored-By: Claude Sonnet 5 Closes #3564033 --- COMMITS (24h) --- (none) ======================================================================== ## [5] stripNameAttribution:ai_agents ======================================================================== You are correcting a project digest section. The prose wrongly attributes work to specific people. Rewrite only the sentences that name any of these people so they describe the work in the passive voice without naming anyone: bharatkelotra Rules: - Do not name any of those people anywhere except a trailing "Contributors:" line. - Keep the trailing "Contributors: Ahmad Khader (Ahmad-Khader), Bharat Kelotra (bharatkelotra), Joshua Fernandes (joshua1234511), Prabhavathi Vanipenta (prabha1997)" line exactly as-is (add it if missing). - Leave every other sentence, HTML tag, link, and citation exactly as-is. - Output the full corrected fragment and nothing else. --- SECTION ---

          AI Agents

          The module saw no commits merged during this period, but several merge requests advanced. Work continued on cleaning up field-value handling bugs: ContentEntitySeeder stores multi-property field values as Array (MR !345) addresses an issue where the content entity seeder tool drops one level of nesting when storing multi-property field values, causing literal "Array" strings to be written instead of the intended data structure. This affects the MCP server's ability to create content.

          Improvements to the AI Agent configuration UI also progressed. #3586042: Use the ai_json_schema editor for the structured output schema field (MR !298) replaces the plain textarea for structured-output JSON schemas with the dedicated ai_json_schema CodeMirror element, adding syntax highlighting and JSON linting. The MR wires up config-level validation, modeller schema resolution via getPluginSchemaKey(), and fixes visibility toggling.

          Six additional merge requests opened by bharatkelotra address tool output bugs, model compatibility, and plugin cache invalidation. One issue closed during the period: Explore export/sync plugin system for AI Agents to external agent platforms.

          How can I help on this project?

          Review MR !345 (ContentEntitySeeder field values) or MR !298 (JSON schema editor) for correctness and test coverage. Help define tool-ordering constraints in MR !252 by testing with real agent workflows.

          Contributors: Ahmad Khader (Ahmad-Khader), Bharat Kelotra (bharatkelotra), Joshua Fernandes (joshua1234511), Prabhavathi Vanipenta (prabha1997) ======================================================================== ## [6] summariseModule:tool:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Tool API (machine name: tool) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ajit Shinde (ajits), Alex Urevick-Ackelsberg (alexua) [2], Michael Lander (michaellander) [15]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

          Tool API

          then use

          ,

          ,

            /
          • , and as needed. Output only the HTML fragment with no surrounding , , or
            tags. After the project summary prose, add a single subsection titled "

            How can I help on this project?

            " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Bare regex patterns are dropped from emitted JSON Schemas](https://git.drupalcode.org/project/tool/-/work_items/3582987) State: opened | Updated: 2026-08-11 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Description: ## Problem/Motivation `ContextDefinitionNormalizer::convertPcreToEcma()` (#3582972) assumes every Regex constraint pattern is a delimited PCRE. A pattern authored bare — `'^[a-z]+(-[a-z]+)*$'`, the form JSON Schema itself expects — has its first character read as a PCRE delimiter; the parse fails and no `pattern` is emitted at all. Surfaced by mcp_server_tool_bridge's `ToolApiRegistrationTest` under 1.0.0-beta4: its fixture deliberately covers the bare authoring style (which the bridge's pre-integration converter passed through), and the schema now emits `pattern: null` for it. Tool authors … ### [Define checkRequirements() as a configuration-time signal (indicator + add-prevention), not a runtime gate](https://git.drupalcode.org/project/tool/-/work_items/3582975) State: closed | Updated: 2026-08-11 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !124 [Enforce checkRequirements() in execute() and exclude unmet tools from the AI function list.](https://git.drupalcode.org/project/tool/-/merge_requests/124) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 64 diff lines Description: ## Problem/Motivation `checkRequirements()` is declared on the frozen interface but called by nothing, which this issue originally read as "wire it into execution." On reflection that was the wrong direction: the method was always intended to be **configuration-facing** — surface a visual indicator when a tool's requirements are unmet, and allow curation surfaces to prevent such a tool from being _added_ to something — while deliberately **not** blocking runtime. The reason the non-enforcement is deliberate: if `execute()`/`access()` enforced requirements, tool authors would be incentivized … ### [ToolBase's promoted $logger property conflicts with subclasses declaring their own logger](https://git.drupalcode.org/project/tool/-/work_items/3582986) State: closed | Updated: 2026-08-11 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !128 [fix: #3582986 require the logger channel and document the subclass redeclaration contract](https://git.drupalcode.org/project/tool/-/merge_requests/128) | State: merged 2026-08-11 | Author: Michael Lander (michaellander), 37 diff lines Description: ## Problem/Motivation #3582971 added a logger to `ToolBase` as a promoted constructor property named `$logger`, typed `?LoggerChannelInterface`. Because `ToolBase::__construct()` is `final`, subclasses inject their own services by declaring a property and overriding `create()` — and the conventional name for a logger property in that pattern is exactly `$logger`. A subclass declaring the property with any _other_ type hits a compile-time PHP fatal (property redeclaration with a mismatched type). Confirmed casualties in tool_belt: `LogMessage` (`protected LoggerInterface $logger` + `create()`… ### [SchemaToolsPropertyConverter fatals on empty-map schemas: \ArrayObject reaches ToolsPropertyInput's array-typed setters](https://git.drupalcode.org/project/tool/-/work_items/3582985) State: closed | Updated: 2026-08-11 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !127 [fix: #3582985 cast ArrayObject schema values to arrays before building AI tool properties](https://git.drupalcode.org/project/tool/-/merge_requests/127) | State: merged 2026-08-11 | Author: Michael Lander (michaellander), 80 diff lines Description: ## Problem/Motivation Opening the AI agent form (`AiAgentForm`) with a tool that has an empty map input crashes with a PHP `TypeError`. Since #3582972, the Tool module's serializer intentionally emits empty schema objects (e.g. a map input with no declared properties) as `\ArrayObject` instead of `[]`, so JSON encoding produces `{}` rather than `[]` — strict providers such as Anthropic reject an array where a JSON Schema object is expected. `SchemaToolsPropertyConverter::convert()` in tool_ai_connector passed that normalized schema straight into the AI module's `ToolsPropertyInput`, whose co… ### [tool_ai_connector: ToolPluginBase::getReadableOutput() fatals when wrapped tool has no result object](https://git.drupalcode.org/project/tool/-/work_items/3582941) State: closed | Updated: 2026-08-10 | Author: Sven Decabooter (svendecabooter) | Assigned: unassigned | Labels: Has Testing Steps, category::bug, state::fixed, why::outdated Description: ### Steps to reproduce 1. Enable `tool` and `tool_ai_connector`. 2. Use a Tool API plugin through `tool_ai_connector` in a flow where `ToolPluginBase::getReadableOutput()` is called. 3. Ensure the wrapped tool plugin does not have a result object set when `getReadableOutput()` runs. Examples: - access denied - execution exits early - execution failed before a result was stored - wrapper-level error path still reaches `getReadableOutput()` ### Expected behavior `ToolPluginBase::getReadableOutput()` should handle the missing-result state gracefully and return a safe fallback mess… ### [fromDataDefinition() breaks on plain typed-data lists and unlabeled definitions](https://git.drupalcode.org/project/tool/-/work_items/3582984) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !126 [Fix fromDataDefinition: fall back for missing labels and toArray type keys.](https://git.drupalcode.org/project/tool/-/merge_requests/126) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 110 diff lines Description: ## Problem/Motivation Found by the #3582974 coverage sweep. `InputDefinition::fromDataDefinition()` mishandles plain (non-config) typed-data definitions in two ways: 1. **Unlabeled definitions crash.** Typed-data labels are optional, but the factory passes `$definition->getLabel()` (NULL) straight into the `InputDefinition` constructor, whose `$label` parameter is `string|TranslatableMarkup` — a `TypeError`. 2. **List item definitions lose their type.** For a plain `ListDataDefinition`, the recursive item conversion reads `$definition->toArray()['type']`, which is not set on item definitions… ### [Coerce JSON numbers to strings for decimal inputs](https://git.drupalcode.org/project/tool/-/work_items/3582983) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !125 [Resolve "Coerce JSON numbers to strings for decimal inputs"](https://git.drupalcode.org/project/tool/-/merge_requests/125) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 137 diff lines Description: ## Problem/Motivation Decimal inputs travel as strings to preserve precision (#3582972 emits `type: string` + pattern), but the schema's numeric look invites models to send bare JSON numbers (`19.99`). Nothing coerces those to their string form, so validation rejects an unambiguous value and costs a correction round-trip — exactly the class of recoverable shape #3582973 exists for; decimal was simply missing from its list. ## Proposed resolution In `InputTypeCoercionSubscriber`, coerce `int`/`float` values for `decimal` inputs to their canonical string form (`19.99` → `"19.99"`, `5` → `"5"`… ### [Complete kernel coverage of the typed input/output traits and definition pipeline](https://git.drupalcode.org/project/tool/-/work_items/3582974) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::task, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !123 [Add kernel coverage: locked/configuration inputs, refiner flow, definition...](https://git.drupalcode.org/project/tool/-/merge_requests/123) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 752 diff lines Description: ### Problem/Motivation Every serious bug found this release cycle — the `getOutputValue()` throw on optional outputs (#3582954), the multi-value validation early-return, the configuration-source fatal, the coercion regressions — lived in `TypedInputsTrait`/`TypedOutputsTrait`, in paths with no test coverage. These traits are the API being frozen at RC1; untested frozen behavior is behavior we cannot safely refactor later. **Scope note:** the RC1 fix issues each carry their own tests — config-source precedence (config-value issue), multi-value item validation (validation issue), access-on-inv… ### [Rework the tool execution contract: result naming, concrete typing, and decoupling from core ExecutableInterface](https://git.drupalcode.org/project/tool/-/work_items/3582964) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::task, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !122 [fix: #3582964 own execution contract: result value interfaces, accessors on...](https://git.drupalcode.org/project/tool/-/merge_requests/122) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 309 diff lines Description: ### Problem/Motivation Three related contract problems that freeze at RC1: 1. **`ExecutableResultInterface` is misnamed.** It is implemented by the _tool plugin_ (`ToolInterface extends ExecutableResultInterface`) — it describes "a thing that carries an execution result" (`getResult()`, `getResultMessage()`, `getResultStatus()`, now `hasResult()`), not the result itself. Meanwhile `ExecutableResult` — the actual result — is a `final readonly` class implementing no interface. 2. **Concrete final classes are hard-typed into the frozen interface.** `getResult(): ExecutableResult` and (new since… ### [Correct API signatures before the RC1 freeze (batch)](https://git.drupalcode.org/project/tool/-/work_items/3582962) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !121 [fix: #3582962 correct API signatures: factory overrides, null context values,...](https://git.drupalcode.org/project/tool/-/merge_requests/121) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 461 diff lines Description: ### Problem/Motivation Five small signature/semantic mistakes that are one-to-five-line fixes today and BC breaks after RC1. Batched because none warrants its own issue. 1. **`getInputDefinition(): InputDefinitionInterface|InputException`** (src/TypedInputsInterface.php:55 and the trait): the exception is thrown, never returned. The union forces consumers to handle an impossible return. Fix: `: InputDefinitionInterface` + `@throws`. 2. **`ExecutableResult` nullable context values**: constructor and `success()`/`failure()` accept `?array $contextValues` but `getContextValues(): array` returns… ### [Implement getCacheContexts() or drop CacheableDependencyInterface from ToolInterface](https://git.drupalcode.org/project/tool/-/work_items/3582965) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !120 [fix: #3582965 drop the unimplemented cacheability contract from ToolInterface](https://git.drupalcode.org/project/tool/-/merge_requests/120) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 112 diff lines Description: ### Problem/Motivation `ToolInterface` extends `CacheableDependencyInterface`, but `ToolBase::getCacheContexts()` is a stub: ```php public function getCacheContexts() { // @todo Implement getCacheContexts() method. return []; } ``` Shipping a knowingly-unimplemented contract is worse than not implementing the interface — consumers caching tool results (render caching in explorers, AI response caching) will silently under-vary. Notably, a complete implementation already exists under the wrong name: `TypedInputsTrait::getCacheInputs()` (\~line 379) aggregates cache contexts from input de… ### [Prefix module-owned identifiers: alter hook, cache key, and 'text' data type ID](https://git.drupalcode.org/project/tool/-/work_items/3582963) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !119 [fix: #3582963 prefix the adapter alter hook and cache key; keep the generic...](https://git.drupalcode.org/project/tool/-/merge_requests/119) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 134 diff lines Description: ### Problem/Motivation Three globally-namespaced identifiers are unprefixed. Identifier renames after RC1 break other modules, so this is a freeze item. 1. **Alter hook**: `TypedDataAdapterManager` (src/TypedData/Adapter/TypedDataAdapterManager.php:24) calls `$this->alterInfo('data_type_adapter_info')`, creating `hook_data_type_adapter_info_alter()`. Drupal convention requires module-prefixed alter hooks; a collision with another module implementing a generic "data type adapter" concept is plausible. 2. **Cache key**: same class, `setCacheBackend($cache_backend, 'data_type_adapter_plugins')`… ### [Move orphaned "FieldExistConstraint' and 'FieldExistsConstraintValidator' to Tool Belt.](https://git.drupalcode.org/project/tool/-/work_items/3582951) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::task, priority::minor, state::closed, why::wontFix Description: ### Problem/Motivation The `FieldExistsConstraint` and `FieldExistsConstraintValidator` classes in `src/Plugin/Validation/Constraint/` are entity-specific validation logic that doesn't belong in the base Tool API module. A "field exists on an entity type and bundle" constraint is specific to tools that operate on entities — it's not a general-purpose tool concern. The Tool API module should remain focused on the tool plugin system, typed inputs/outputs, and execution lifecycle. Additionally, the constraint was using the deprecated `@Constraint` annotation (triggering a deprecation notice on… ### [ListInputDefinition item values are never validated](https://git.drupalcode.org/project/tool/-/work_items/3582982) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !118 [fix: #3582982 validate list definition items and name failing positions](https://git.drupalcode.org/project/tool/-/merge_requests/118) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 219 diff lines Description: ## Problem/Motivation Items inside a `ListInputDefinition` input bypass constraint validation entirely, so tools receive type-invalid item values and the invoker correction loop never fires. This is the companion gap to #3582960 (multiple inputs validating only their first item) and is **not** fixed by that issue's MR: `validateInputValue()` branches on `$definition->isMultiple()`, but a `ListInputDefinition` has `isMultiple()` FALSE with data type `list`, so it falls to the `Context::validate()` path, which does not surface item-level violations. Reproduction (kernel, verified on the #3582… ### [Make violation messages translatable and stop surfacing raw exception text](https://git.drupalcode.org/project/tool/-/work_items/3582971) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !117 [Make input violation messages translatable; log unexpected exceptions instead...](https://git.drupalcode.org/project/tool/-/merge_requests/117) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 179 diff lines Description: ### Problem/Motivation `src/TypedInputsTrait.php` builds user-surfaced text with `sprintf()`, bypassing translation: - \~line 205: `"The %s context is not a valid context."` - \~line 268: locked-input exception message - \~line 310: `'Input %s: %s'` violation prefix - \~line 349: `'The %s input must be an entity.'` - \~line 364: `'The %s input is invalid: %s'` These surface to end users via form errors, result messages, Drush output, and AI responses. Additionally, \~line 364 concatenates raw `$e->getMessage()` into the violation, and `ToolBase::execute()`'s catch-all does the same into fa… ### [ToolBase::access() throws on invalid/missing input instead of returning forbidden](https://git.drupalcode.org/project/tool/-/work_items/3582961) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !113 [fix: #3582961 fail closed when tool input is invalid or missing](https://git.drupalcode.org/project/tool/-/merge_requests/113) | State: merged 2026-08-10 | Author: Alex Urevick-Ackelsberg (alexua), 225 diff lines Description: ### Problem/Motivation `ToolBase::access()` (src/Tool/ToolBase.php, \~line 201) calls `$this->getExecutableValues()`, which throws `\InvalidArgumentException` when validation fails. So checking access on a tool whose inputs are not yet valid produces an uncaught exception rather than an access result. `execute()` catches this exception; `access()` does not. Consequences: - Any consumer that checks access _before_ prompting for or validating values (the natural order) gets an exception where it expects an `AccessResult`. - Access checks should never throw on bad user input — a WSOD/stack tra… ### [Non-array value for a map input throws instead of failing validation](https://git.drupalcode.org/project/tool/-/work_items/3582981) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !116 [Rethrow un-storable input values as InputException naming the input.](https://git.drupalcode.org/project/tool/-/merge_requests/116) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 90 diff lines Description: ## Problem/Motivation Setting a non-array value on a map input throws an uncaught `InvalidArgumentException` from `Map::setValue()` ("Invalid values given. Values must be represented as an associative array.") during `ToolBase::setInputValue()` — before validation ever runs. The exception carries no input name and no `input_schema` echo, so an LLM invoker surfaces a generic execution error instead of the structured validation-failure correction loop. The asymmetry: `validateInputValue()` already converts typed-data exceptions into named violations ("The X input is invalid: …"), but value _st… ### [validateInputValue() only validates the first item of a multiple input](https://git.drupalcode.org/project/tool/-/work_items/3582960) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !112 [fix: #3582960 validate every multiple input item](https://git.drupalcode.org/project/tool/-/merge_requests/112) | State: merged 2026-08-10 | Author: Alex Urevick-Ackelsberg (alexua), 137 diff lines Description: ### Problem/Motivation `src/TypedInputsTrait.php` (\~lines 337-341), inside `validateInputValue()`: ```php if ($definition->isMultiple() && is_array($value)) { foreach ($value as $item) { $item_definition = clone $definition; $item_definition->setMultiple(FALSE); return $this->validateInputValue($item_definition, $item); } } ``` The `return` inside the first loop iteration means items 2..n of a multiple input are never validated — invalid values in later positions pass validation and reach `doExecute()`. This is a validation bypass, which matters doubly now that the AI conne… ### [Extend input coercion for unambiguous LLM value shapes](https://git.drupalcode.org/project/tool/-/work_items/3582973) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::feature, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !115 [Extend input coercion: JSON-string structures, enum near-misses, datetime...](https://git.drupalcode.org/project/tool/-/merge_requests/115) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 635 diff lines Description: ### Problem/Motivation `InputTypeCoercionSubscriber` (priority 50) currently handles list-wrapping, boolean strings, and numeric strings. Real LLM traffic produces more recoverable shapes; each currently costs a validation-failure round-trip (failure message + `input_schema` echo → model retry). Principle: **coerce only when unambiguous** — anything doubtful stays for validation, whose correction loop already works. Nested coverage is free via the recursive subscriber's child dispatch. ### Proposed resolution (priority order) | \# | Gap | Fix | |----|-----|-----| | B1 | JSON _string_ for ma… ### [Emit richer JSON Schema: map remaining constraints and type formats](https://git.drupalcode.org/project/tool/-/work_items/3582972) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::feature, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !114 [Resolve "Emit richer JSON Schema: map remaining constraints and type formats"](https://git.drupalcode.org/project/tool/-/merge_requests/114) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 1190 diff lines Description: ### Problem/Motivation The emitted input schemas omit several constraints and formats that tools already declare, so LLM/MCP consumers get weaker contracts than the typed-data layer enforces — costing correction round-trips. Constraint mapping is centralized in `ContextDefinitionNormalizer::getNormalizationSchema()` (currently: FixedValue, Choice, AllowedValues, PluginExists, Length, Range) and applies on both scalar paths (10.5 legacy normalizer / 11.1+ core normalizers — the selection bug was fixed in the beta3 cycle, and previous-major CI now tests both). Overlaps with #3582943 "Deliverab… ### [Write documentation and enable project pages](https://git.drupalcode.org/project/tool/-/work_items/3582955) State: opened | Updated: 2026-08-10 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::outside Description: There is project pages documentation that can autocreated on main merges. We should enable that. I have a skill that can do this automatically. ### [Create a skill for generating Tool plugins (best practices, how-to, placement)](https://git.drupalcode.org/project/tool/-/work_items/3582945) State: opened | Updated: 2026-08-10 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::outside Description: ### Problem/Motivation The Tool API lets modules expose well-defined, typed actions as `#[Tool]` plugins, and the `tool_ai_connector` submodule automatically surfaces those same tools to AI agents as `AiFunctionCall`s. Authoring a *correct* tool, though, means getting several moving parts right at once: - the `#[Tool]` attribute — `id`, `label`, `description`, the `ToolOperation` enum (`Explain` / `Read` / `Transform` / `Trigger` / `Write`) and the `destructive` flag; - typed `input_definitions` / `output_definitions` (`InputDefinition`, the list/map variants, `constraints`, `default_value`,… ### [[META] Tool API - Path to Beta and Inclusion in AI](https://git.drupalcode.org/project/tool/-/work_items/3558327) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::outside Description: >>> [!note] Migrated issue Reported by: [michaellander](https://www.drupal.org/user/636494) >>> Problem/Motivation In this issue we'll outline beta blockers and can record any higher level conversation around a path to Tool API beta. Remaining tasks As of now, these are the issues I'd like to sort out prior to beta. #3557721: Move tools out of Tool API #3555051: Add isAvailable method to the ToolInterface and ToolBase Finish config schema in InputAdapters Finish 'configure' form #3554069: Add an 'operation' property to tool definitions #3558039: [Discuss] Make 'Label' and 'Description' re… ### [Proposal: make Tool's declarations introspectable over the CLI, and enrich input schema](https://git.drupalcode.org/project/tool/-/work_items/3582943) State: opened | Updated: 2026-08-10 | Author: Matt Glaman (mglaman) | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, AI Innovation Description: ## Goal Tool stays consumer-agnostic. Give consumers — the Drush CLI, `mcp_server`, a future planner — enough *introspectable* metadata to understand and present a tool they didn't author, **before** invoking it. Most of what's needed already exists in the Tool API model; the work is mostly **surfacing** it over the CLI, plus **one genuinely additive** piece (richer input schema). Two deliverables (A additive, B surfacing); each can ship as its own MR. This issue is the umbrella proposal for a shared discussion. ## Background This comes out of building [`canvas_tools`](https://www.drupal.o… ### [Introduce support for Discovery, Planning and Execute calls for MCP and Agents](https://git.drupalcode.org/project/tool/-/work_items/3546292) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, AI Innovation Description: >>> [!note] Migrated issue Reported by: [michaellander](https://www.drupal.org/user/636494) >>> Problem/Motivation The challenge with MCP right now is there seems to be a soft cap around 40 tools, and because all tools are sent on every request, more noise = more hallucinations and more failures. AI Agents on the other hand have similar degradation with tool counts, but are also currently lacking a reliable short term memory layer for better context management, meaning chaining many tool calls together quickly hits caps for requests/tokens. Proposed resolution We can reduce some of the to… --- MERGE REQUESTS (24h) --- ### [fix: #3582947 tool_ai_connector does not handle tools returning list of entities](https://git.drupalcode.org/project/tool/-/merge_requests/96) State: closed | Author: Ajit Shinde (ajits) | Branch: 3582947-issue-branch | 87 diff lines Description: Closes #3582947 --- COMMITS (24h) --- - [f9fc6353](https://git.drupalcode.org/project/tool/-/commit/f9fc6353c1bddbd4e73df282241d0f1e622c6f8f) fix: #3582986 require the logger channel and document the subclass redeclaration contract — Michael Lander (2026-08-11T03:22:20.000+00:00) - [c62aa6f8](https://git.drupalcode.org/project/tool/-/commit/c62aa6f8986dec160828b44457b34ba2124bfa3e) fix: #3582985 cast ArrayObject schema values to arrays before building AI tool properties — Michael Lander (2026-08-10T20:30:47.000-06:00) - [a7001a31](https://git.drupalcode.org/project/tool/-/commit/a7001a3118e302606d8f92e647cf747645e60394) Fix fromDataDefinition: fall back for missing labels and toArray type keys. — Michael Lander (2026-08-10T16:25:32.000-06:00) - [6f40d777](https://git.drupalcode.org/project/tool/-/commit/6f40d777f9ac75198bcd89cdf474d08d9bfe2a13) Resolve "Coerce JSON numbers to strings for decimal inputs" — Michael Lander (2026-08-10T22:48:09.000+00:00) - [c8d44c33](https://git.drupalcode.org/project/tool/-/commit/c8d44c33904f0538174203bfcdb90abdb8a9a5d4) Enforce checkRequirements() in execute() and exclude unmet tools from the AI function list. — Michael Lander (2026-08-10T22:21:05.000+00:00) - [a52c5712](https://git.drupalcode.org/project/tool/-/commit/a52c571295fca44de59fe1f97ad0888eb24858b3) Add kernel coverage: locked/configuration inputs, refiner flow, definition... — Michael Lander (2026-08-10T21:56:59.000+00:00) - [46ca7054](https://git.drupalcode.org/project/tool/-/commit/46ca7054deea0da5710a18f844340aac54264ae9) fix: #3582964 own execution contract: result value interfaces, accessors on... — Michael Lander (2026-08-10T21:04:41.000+00:00) - [87a448f3](https://git.drupalcode.org/project/tool/-/commit/87a448f3a562546dd7f98ec457f1783546c82b6b) fix: #3582962 correct API signatures: factory overrides, null context values,... — Michael Lander (2026-08-10T20:44:43.000+00:00) - [c4729a51](https://git.drupalcode.org/project/tool/-/commit/c4729a512f7f76b2f752fe0062a8740be7ec0bd6) fix: #3582965 drop the unimplemented cacheability contract from ToolInterface — Michael Lander (2026-08-10T14:07:27.000-06:00) - [8facc7b2](https://git.drupalcode.org/project/tool/-/commit/8facc7b243b00984978ee230ad1354156c00b732) fix: #3582963 prefix the adapter alter hook and cache key; keep the generic... — Michael Lander (2026-08-10T19:55:09.000+00:00) - [d35b29d1](https://git.drupalcode.org/project/tool/-/commit/d35b29d170f65088c1cf321fe34da48736502a88) fix: #3582982 validate list definition items and name failing positions — Michael Lander (2026-08-10T13:22:39.000-06:00) - [9b6ed79b](https://git.drupalcode.org/project/tool/-/commit/9b6ed79bec9b441ab549c9a79ef5d2f66bc53097) Make input violation messages translatable; log unexpected exceptions instead... — Michael Lander (2026-08-10T19:15:06.000+00:00) - [8c36e7d4](https://git.drupalcode.org/project/tool/-/commit/8c36e7d45a0b1923468b342485725479131985b8) fix: #3582961 fail closed when tool input is invalid or missing — Alex Urevick-Ackelsberg (2026-08-10T18:44:19.000+00:00) - [e90e3c7e](https://git.drupalcode.org/project/tool/-/commit/e90e3c7eff1c200aa6689d7d34196aca5ec5e92e) Rethrow un-storable input values as InputException naming the input. — Michael Lander (2026-08-10T18:17:21.000+00:00) - [c9989e57](https://git.drupalcode.org/project/tool/-/commit/c9989e57112b34f83d6769556fcf5c1b0b4c68a8) fix: #3582960 validate every multiple input item — Alex Urevick-Ackelsberg (2026-08-10T18:00:18.000+00:00) - [7cee117c](https://git.drupalcode.org/project/tool/-/commit/7cee117cc1860dd418fe1ea2209bf3cf33d81fb6) Extend input coercion: JSON-string structures, enum near-misses, datetime... — Michael Lander (2026-08-10T17:47:05.000+00:00) - [9cf12485](https://git.drupalcode.org/project/tool/-/commit/9cf12485966600d2baf3132924dffe3a5c2752b9) Resolve "Emit richer JSON Schema: map remaining constraints and type formats" — Michael Lander (2026-08-10T17:07:47.000+00:00) ======================================================================== ## [7] summariseModule:canvas:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Drupal Canvas (machine name: canvas) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Adam G-H (phenaproxima), Alamgir Hossain (alamgir.hossain.cse), Ben Mullins (bnjmnm), Christian López Espínola (penyaskito) [1], Dave Long (longwave), Feliksas Mazeikis (f.mazeikis), Fons Vandamme (f0ns), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Nodar Davituri (Davituri), Rajab Natshah (RajabNatshah), Ted Bowman (tedbow), Tim Plunkett (tim.plunkett) [1], Wim Leers (wimleers)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

            Drupal Canvas

            then use

            ,

            ,

              /
            • , and as needed. Output only the HTML fragment with no surrounding , , or
              tags. After the project summary prose, add a single subsection titled "

              How can I help on this project?

              " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Canvas AI: Add a dev page builder agent and wire the placement tools](https://git.drupalcode.org/project/canvas/-/work_items/3591921) State: opened | Updated: 2026-08-11 | Author: AKHIL BABU (AkhilBabu) | Assigned: AKHIL BABU (AkhilBabu) | Labels: 2026Sprint16, AI Initiative Sprint, ai, ai::inside Description: ## Summary Add an `ai_agent` config entity to `canvas_dev_ai` that builds a page by placing one component row per hop, and wire the four placement tools that currently ship inert. Part of https://git.drupalcode.org/project/canvas/-/work_items/3591777. ## Current behavior `canvas_dev_ai` runs one agent per chat turn as a client-side hop loop, and only `canvas_component_agent` is wired to it — so the dev flow can build JS code components but cannot build a page. `canvas_ai:place_components`, `canvas_ai:edit_components`, `canvas_ai:set_page_value` and `canvas_ai:get_component_details` are all … ### [Canvas AI: Expose Props of Blocks to the Agent](https://git.drupalcode.org/project/canvas/-/work_items/3569120) State: closed | Updated: 2026-08-11 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative, AI Initiative Sprint Description: >>> [!note] Migrated issue Reported by: [akhil babu](https://www.drupal.org/user/3632866) Related to !498 >>> Overview Currently CanvasAiPageBuilderHelper::getAllComponentsKeyedBySource() does this <?php      if ($source === SingleDirectoryComponent::SOURCE_PLUGIN_ID) {        $this->processSdc($component, $sdc_definitions, $output);      }      elseif ($source === JsComponent::SOURCE_PLUGIN_ID) {        $this->processCodeComponents($co… ### [Canvas AI: page builder discards the whole build when the LLM names a region that does not exist](https://git.drupalcode.org/project/canvas/-/work_items/3591876) State: opened | Updated: 2026-08-11 | Author: Rajab Natshah (RajabNatshah) | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1423 [fix: #3591876 Validate the target region before placing components](https://git.drupalcode.org/project/canvas/-/merge_requests/1423) | State: opened | Author: Rajab Natshah (RajabNatshah), 544 diff lines Description: ## Problem/Motivation `CanvasAiPageBuilderHelper` throws when the AI names a target region that is not present in the current layout: ``` Region "%s" not found in layout ``` The LLM commonly guesses a generic region name that does not exist on the entity's actual layout (for example `content` capitalized, `0`, or `header` on a single-region layout). The exception aborts the entire page-build operation, so the whole AI response is discarded instead of degrading gracefully into a usable page. ## Steps to reproduce 1. Use the Canvas AI page builder to add components on a page whose layout do… ### [Header region height is calculated incorrectly in Canvas editor](https://git.drupalcode.org/project/canvas/-/work_items/3591935) State: opened | Updated: 2026-08-11 | Author: Pamela Barone (pameeela) | Assigned: unassigned | Labels: Description: Since the 1.9.0 release, the height of the header region in the Canvas editor is calculated incorrectly, it is too large, and covers the content section below. On some sites it's massive and blocks components at the top of the page from being selected, you have to use the tree to click on them. Reproduced using the Blank site template with Drupal CMS. Before (1.8.0) After (1.9.0+) ### [Dependency Dashboard](https://git.drupalcode.org/project/canvas/-/work_items/3591657) State: opened | Updated: 2026-08-11 | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Assigned: unassigned | Labels: projectManagement Description: This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. ## Repository Problems Renovate tried to run on this repository, but found these problems. - ⚠️ WARN: Failed to set branch status - ⚠️ WARN: No github.com token has been configured. Skipping release notes retrieval - ⚠️ WARN: Rate limit exceeded for api.github.com, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN - ⚠️ WARN: No tool releases found. ## Deprecations / Replacements > ⚠️ **Warning** > The foll… ### [Add component label to settings form](https://git.drupalcode.org/project/canvas/-/work_items/3591934) State: opened | Updated: 2026-08-11 | Author: Andrew Morton (mortona2k) | Assigned: Lauri Timmanee (lauriii) | Labels: Needs design Description: Sometimes the context of what you're editing can get lost. For example, if the selected component is scrolled out of view or the UI has glitched from a recent action, or delayed update. I've seen this happen when doing things quickly. A simple fix that would help is adding the component label to the top of the settings form. ### [Fix cache contexts being added as cache tags in ContentTemplate::normalizeForClientSide()](https://git.drupalcode.org/project/canvas/-/work_items/3591933) State: opened | Updated: 2026-08-10 | Author: Lauri Timmanee (lauriii) | Assigned: unassigned | Labels: Description: ### Overview `ContentTemplate::normalizeForClientSide()` passes the result of `EntityTypeInterface::getListCacheContexts()` to `addCacheTags()`. Cache contexts are registered as cache tags. For nodes this emits `user.node_grants:view` as a cache tag, which is not a valid tag and never gets invalidated. The existing expectations in `CanvasConfigEntityHttpApiTest` assert this value in the cache tags list, so the bug is currently locked in by tests. To reproduce, request `/canvas/api/v0/config/content_template` or a single content template and inspect the `X-Drupal-Cache-Tags` header. It conta… ### [Canvas AI: Client-side orchestration loop for Canvas AI(POC)](https://git.drupalcode.org/project/canvas/-/work_items/3591615) State: opened | Updated: 2026-08-10 | Author: AKHIL BABU (AkhilBabu) | Assigned: Ricardo Castañeda (cadence96) | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai Description: ## Problem Every Canvas AI request is a single synchronous PHP call. The full chain — orchestrator → sub-agent → tool calls → validation — must complete before the server responds. This causes two concrete failures: - **Timeouts on hosted platforms (e.g. DrupalForge).** A full page build exceeds the request time limit. The user gets nothing. - **Full regeneration on any error.** If one component in a large response fails validation, the entire response is regenerated — wasting time and tokens. There is no streaming and no partial feedback. ## How `ai_chatbot` already solves this The `ai_c… ### [canvas_test_code_components_content_entity_ref config/install fields conflict on the standard profile](https://git.drupalcode.org/project/canvas/-/work_items/3591869) State: closed | Updated: 2026-08-10 | Author: Christian López Espínola (penyaskito) | Assigned: unassigned | Labels: DX (Developer Experience), category::task, priority::normal, state::fixed Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1414 [#3591869: Provide the code-components content-entity-ref test module's shared fields via a recipe so it installs on any profile](https://git.drupalcode.org/project/canvas/-/merge_requests/1414) | State: merged 2026-08-10 | Author: Christian López Espínola (penyaskito), 85 diff lines Description: ### Overview The `canvas_test_code_components_content_entity_ref` test module ships three field config objects in `config/install`: - `field.field.user.user.user_picture.yml` - `field.storage.user.user_picture.yml` - `field.storage.node.body.yml` Tests run on the `testing` profile, where those objects do not exist, so installing the module there works. But the standard profile already provides `user.user_picture` and `node.body`. Installing the module on a standard-profile site — for example to manually test the content-entity-reference picker — fails with a config-install conflict: the con… ### [Enforce "Delete Translations" permission on the Canvas API translation delete route](https://git.drupalcode.org/project/canvas/-/work_items/3591784) State: opened | Updated: 2026-08-10 | Author: Kunal Sachdev (kunal.sachdev) | Assigned: Narendra Singh Rathore (NarendraR) | Labels: category::task, priority::normal, state::toBePorted, translation Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1398 [#3591784: Revert MR !1342 "delete content translations" permission requirement](https://git.drupalcode.org/project/canvas/-/merge_requests/1398) | State: merged 2026-07-23 | Author: Ted Bowman (tedbow), 108 diff lines Description: **Overview** The `delete content translations` permission (provided by the `content_translation` module) is intended to control whether a user can delete translations for content entities. However, the Canvas API route responsible for deleting content (canvas_page) translations does not currently require this permission. The route `canvas.api.content.translation.delete `(`/canvas/api/v0/content/canvas_page/{canvas_page}/translations`) only checks `_entity_access: 'canvas_page.update'`. A user who has the canvas_page update permission but not the delete content translations permission can curr… ### [Align Canvas UI translation operations and access with content_translation/TMGMT](https://git.drupalcode.org/project/canvas/-/work_items/3591932) State: opened | Updated: 2026-08-10 | Author: Ted Bowman (tedbow) | Assigned: unassigned | Labels: category::task, priority::normal, translation, v1.x-dev Description: **Overview** Follow-up to https://git.drupalcode.org/project/canvas/-/work_items/3591784, which reverted !1342 in !1398. That issue's scope was narrowed to the revert only; the underlying problems are broader than which route requires which permission. The Canvas editor's language dropdown offers a single translation operation — "Delete translation" — gated on `_entity_access: 'canvas_page.update'` (route `canvas.api.content.translation.delete`, `canvas.routing.yml`). Core gates translation operations through `content_translation_translate_access()`, where a "Create|Update|Delete translation… ### [Apply saved config language override to auto-saved versions in layout](https://git.drupalcode.org/project/canvas/-/work_items/3583043) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: autoSave, category::task, priority::normal, state::postponed Description: >>> [!note] Migrated issue Reported by: [tedbow](https://www.drupal.org/user/240860) Related to !864 >>> Overview Experiment with applying Config Language Config override on API layout routes Proposed resolution User interface changes ### [Stage Canvas autosaves in a dedicated Workspace](https://git.drupalcode.org/project/canvas/-/work_items/3588540) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: autoSave, category::task, priority::normal, state::accepted Description: >>> [!note] Migrated issue Reported by: [lauriii](https://www.drupal.org/user/1078742) Related to !1056 >>> Overview Autosave relies on key-value storage today and bypass the entity system. That means the current autosave solution is completely out of normal entity save flows. The goal for a long time has been to replace that by staging pending edits in Drupal Workspaces. Proposed resolution Make Workspaces the primary autosave staging layer so autosave no longer depends on key-value store as the main store: migrate existing key-value rows to revisions in a Workspace, persist new autosave… ### [Multi-bundle content-entity-reference picks reading multiple fields per bundle coalesce into an unrenderable object](https://git.drupalcode.org/project/canvas/-/work_items/3591873) State: opened | Updated: 2026-08-10 | Author: Christian López Espínola (penyaskito) | Assigned: Christian López Espínola (penyaskito), Wim Leers (wimleers) | Labels: category::bug, data integrity, dataModel, priority::major Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1431 [Resolve multi-bundle CER picks reading several fields per bundle](https://git.drupalcode.org/project/canvas/-/merge_requests/1431) | State: opened | Author: Christian López Espínola (penyaskito), 1821 diff lines Description: ## Overview When a multi-target-bundle `content-entity-reference` prop reads **more than one field from a bundle**, the Coalescer folds the picks into a single `FieldObjectPropsExpression` on the referencer field, with one object property per field read (`Coalescer::coalesceReferencerFieldGroup()`, documented at its docblock). That object descends the multi-bundle reference and holds **bundle-specific properties**. Such an object is **unrenderable**. At render, `Evaluator::evaluate()` evaluates every object property against the one resolved referenced entity, and `Evaluator::shouldOmitUnmatc… ### [Expand conflict detection and resolution entity types other than Page](https://git.drupalcode.org/project/canvas/-/work_items/3591544) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Feliksas Mazeikis (f.mazeikis) | Labels: Conflict resolution, auto-save, autoSave, backend Description: >>> [!note] Migrated issue Reported by: [f.mazeikis](https://www.drupal.org/user/3513671) >>> Overview Initial implementation of #3587587 will expand current conflict detection and will add new "review of changes" and "conflict resolution UI". To limit the scope of work, new functionality will be added only to Page entities. This issue describes how this new functionality will be expanded to additional Canvas entity types. Specifically, this is a placeholder issue that will be used in BE child issues of #3587587 to document planned changes and link various @todo sections as the work progre… ### [Missing upgrade path: stored `default-relative-url` prop sources written before 1.8 contain `$id` and fail `DefaultRelativeUrlPropSource::parse()`](https://git.drupalcode.org/project/canvas/-/work_items/3591904) State: opened | Updated: 2026-08-10 | Author: Marco (marco.nett) | Assigned: unassigned | Labels: AI-accelerated, Regression, category::bug, data integrity Description: ## Problem / Motivation After updating Canvas 1.4.1 → 1.8.0, opening the editor for any page whose component tree contains a `default-relative-url` prop source returns a 500 from `/canvas/api/v0/layout/{entity_type}/{id}`: ``` LogicException: Extraneous JSON Schema information detected: { "$id": "json-schema-definitions://canvas.module/image", ... } should have been just { ... } ``` ## Root cause - Canvas ≤ 1.4 stored the resolved JSON schema of `default-relative-url` prop sources including the `$id` keys the schema resolver emits (e.g. `json-schema-definitions://canvas.module/imag… ### [Array prop shapes don't inherit their item shape's cache tags, so prop-shape invalidation misses them](https://git.drupalcode.org/project/canvas/-/work_items/3591917) State: closed | Updated: 2026-08-10 | Author: Christian López Espínola (penyaskito) | Assigned: Christian López Espínola (penyaskito) | Labels: category::bug, priority::normal, shapeMatching, state::fixed Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1475 [#3591917 Array prop shapes inherit their item shape's cache tags](https://git.drupalcode.org/project/canvas/-/merge_requests/1475) | State: merged 2026-08-07 | Author: Christian López Espínola (penyaskito), 284 diff lines Description: ### Overview Components with an array prop (e.g. an array-of-images prop, mapped to a multi-value field) do not get a new version when config changes the storable prop shape of the array's *items* — even in situations where components using the same item shape directly *do* get one. Cause: when an array shape's storable prop shape is computed, the item shape is resolved through the prop shape repository and its field type, widget, and settings are copied into the array's `StorablePropShape` — but the cache tags that alter hooks attach to the *item* candidate (e.g. `config:media_type_list` fr… ### [Automatically create components when themes are installed](https://git.drupalcode.org/project/canvas/-/work_items/3591898) State: opened | Updated: 2026-08-10 | Author: Adam G-H (phenaproxima) | Assigned: unassigned | Labels: Recipes initiative, configManagement, priority::major Description: With certain narrow exceptions, site templates -- and recipes more broadly -- should not be in the business of shipping `component` config entities. Component entities are ill-suited to be included in recipes because they are, fundamentally, **non-transferable**. They are the version history of a component as it has existed _in a particular site_. But a recipe is not a snapshot of a particular site; it is a generic package of configuration and setup steps. Up until now, Drupal CMS has worked around this by including the component entities in recipes' configuration. This has proven to be comp… ### [Docs oriented to recipe authors integrating with Canvas](https://git.drupalcode.org/project/canvas/-/work_items/3564135) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: Contributed project blocker, DX (Developer Experience), Recipes initiative, category::task Description: >>> [!note] Migrated issue Reported by: [penyaskito](https://www.drupal.org/user/959536) >>> Overview We have very technical docs in markdown format at docs/* targeted to developers and contributors. We have (hope not so technical) user docs exposed as a website at https://project.pages.drupalcode.org/canvas/, with sources at docs/user/*, targeted to users and component developers. We miss an "intermediate" technical level here: docs targeted to e.g. recipe authors, where we could document the requirements for e.g. shipping patterns, potential error messages and how to solve them, etc. Pro… ### [Allow Canvas Patterns+PageRegions+ContentTemplates provided by Recipes to NOT specify component versions](https://git.drupalcode.org/project/canvas/-/work_items/3571366) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Matt Glaman (mglaman) | Labels: AI-accelerated, Chicago2026, DX (Developer Experience), Drupal CMS dependency critical Description: >>> [!note] Migrated issue Reported by: [penyaskito](https://www.drupal.org/user/959536) Related to !811 >>> Overview In https://git.drupalcode.org/project/canvas/-/work_items/3567413 we added the infra for updating component instances to the latest (active) version if there is no data impact. That is pretty defensive per nature, so we ensure no data loss. But there are some cases where e.g. contrib should be able to impact that. e.g. In \Drupal\canvas\Hook\ShapeMatchingHooks::mediaLibraryStorablePropShapeAlter we implement hook_canvas_storable_prop_shape_alter for media_library, and for… ### [component_tree sequence keys sorted lexicographically instead of numerically, breaking component order at 10+ instances per level](https://git.drupalcode.org/project/canvas/-/work_items/3582200) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: hanmant.sapkal, Ted Bowman (tedbow) | Labels: Release Blocker, category::bug, data integrity, dataModel Description: >>> [!note] Migrated issue Reported by: [hanmant.sapkal](https://www.drupal.org/user/956996) Related to !818 >>> Overview ContentTemplate::set('component_tree', ...) and similar Canvas config entities call ComponentTreeItemListInstantiatorTrait::generateComponentTreeKeys() to normalize component tree order. That method ends by calling ksort($keyed_tree), which sorts keys lexicographically as strings instead of as hierarchical paths. This breaks layout order once there are more than 10 top-level components because keys like 10, 11, and 12 are sorted before 5, 6, 7, 8, and 9. Child keys suc… ### [Strengthen AutoSaveManager to generate stable hashes](https://git.drupalcode.org/project/canvas/-/work_items/3591785) State: opened | Updated: 2026-08-10 | Author: Feliksas Mazeikis (f.mazeikis) | Assigned: Feliksas Mazeikis (f.mazeikis) | Labels: 1.x-dev, Conflict resolution, auto-save, autoSave Description: When AutoSaveManager normalizes entity, it is doing so without using strictly casted values. The set of normalized entity calues is used for `data_hash` hash computation. As the contents of the normalized entities are not strictly casted, the resulting hashes cannot be relied upon. The aim of this issue is to strengthen, simplify and standardise normalization and hashing processes happening in AutoSaveManager. ### [Checkmark and options menu disappear from LanguageSelect on preview page refresh](https://git.drupalcode.org/project/canvas/-/work_items/3591798) State: closed | Updated: 2026-08-10 | Author: Kunal Sachdev (kunal.sachdev) | Assigned: unassigned | Labels: category::bug, priority::normal, state::fixed, translation Description: **Overview** When a user selects a non-default language from the LanguageSelect dropdown in the Canvas UI and is taken to the preview page, the language dropdown correctly shows: - checkmark beside languages that have an existing translation. - (3-dot) options menu beside those languages. However, if the user refreshes the browser on that preview URL, or navigates directly to it, all checkmarks and 3-dot menus disappear from every language in the dropdown. ### [Publishing a symmetrically-translated canvas_page 422s when a default-language edit changes a non-translatable component input](https://git.drupalcode.org/project/canvas/-/work_items/3591820) State: closed | Updated: 2026-08-10 | Author: Nodar Davituri (Davituri) | Assigned: Ted Bowman (tedbow) | Labels: Conflict resolution, Release Blocker, auto-save, category::bug Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1363 [fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish](https://git.drupalcode.org/project/canvas/-/merge_requests/1363) | State: merged 2026-07-28 | Author: Nodar Davituri (Davituri), 848 diff lines Description: ### Overview Publishing an auto-saved `canvas_page` fails with HTTP 422 when the default-language edit changed a non-translatable ("symmetric") component input — e.g. an image `width`/`loading` attribute, a section `padding_bottom`, or a `heading` component's `element` (h1-h6) — on a component instance that also exists in a non-default-language translation. `ApiAutoSaveController::post()` validates the entity (`getConflictAwareContentEntityViolations()` -> `$entity->validate()`) before `$entity->save()` runs `content_translation`'s presave field synchronizer. The auto-save snapshot applied i… ### [Prefix-strip redirect misses default-language prefixes and is overridden by ?destination](https://git.drupalcode.org/project/canvas/-/work_items/3591839) State: opened | Updated: 2026-08-10 | Author: Fons Vandamme (f0ns) | Assigned: unassigned | Labels: Drupal canvas, category::bug, priority::major, state::needsReview Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1387 [bug: #3591839 Preserve the query string when stripping the language prefix; a...](https://git.drupalcode.org/project/canvas/-/merge_requests/1387) | State: opened | Author: Fons Vandamme (f0ns), 331 diff lines Description: ## Problem/Motivation Follow-up to #3591585. That issue added `CanvasRouteOptionsEventSubscriber::redirectCanvasToDefaultLanguage()`, which strips the language prefix from `/canvas` paths with a 302 redirect. It has two gaps: 1. The redirect only runs when the current language differs from the default. Drupal allows a URL prefix for the default language too. In that case current equals default, the redirect is skipped, and the editor receives a prefixed path. The React app cannot route it and renders an empty gray screen. 2. The redirect drops the query string, and a `destination` query pa… ### [PHPStan failing on global $argv usage](https://git.drupalcode.org/project/canvas/-/work_items/3591931) State: closed | Updated: 2026-08-10 | Author: Tim Plunkett (tim.plunkett) | Assigned: Tim Plunkett (tim.plunkett) | Labels: DX (Developer Experience), PHPStan, category::task, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1485 [fix: #3591931 Do not rely on $argv being a global](https://git.drupalcode.org/project/canvas/-/merge_requests/1485) | State: merged 2026-08-10 | Author: Tim Plunkett (tim.plunkett), 16 diff lines Description: A few recent pipelines are failing with ``` ------ ----------------------------------------------------------------- Line tests/src/Playwright/scripts/exclude-config-schema-checking.php ------ ----------------------------------------------------------------- 43 Variable $argv might not be defined. 🪪 variable.undefined ------ ----------------------------------------------------------------- ``` But it's only failing sometimes, and I can't find out why. Google says that $argv can't be trusted o… ### [Code editor: developers cannot see what a content-entity-reference prop delivers to their component](https://git.drupalcode.org/project/canvas/-/work_items/3591805) State: opened | Updated: 2026-08-10 | Author: Lauri Timmanee (lauriii) | Assigned: Lauri Timmanee (lauriii) | Labels: DX (Developer Experience), JavaScript, category::feature, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1351 [Add a entity reference prop data shape preview to code editor](https://git.drupalcode.org/project/canvas/-/merge_requests/1351) | State: opened | Author: Lauri Timmanee (lauriii), 3691 diff lines Description: ## Problem/Motivation When a code component has a content-entity-reference prop, the developer picks an entity type, bundle, and fields, but the props panel gives no indication of the payload shape the component will actually receive. The payload keys do not always match the picked field names (entity keys are normalized, e.g. a node's title arrives as "label", uid as "owner"; referenced entities nest as objects with a "\__type" key), so developers have to guess, read module internals, or debug at runtime. There is also no way to try the prop against real content while editing. ## Proposed r… ### [PHPStan rule: needs*() config detectors must not mutate the entity they inspect](https://git.drupalcode.org/project/canvas/-/work_items/3591855) State: closed | Updated: 2026-08-10 | Author: Christian López Espínola (penyaskito) | Assigned: Adam G-H (phenaproxima) | Labels: DX (Developer Experience), PHPStan, category::task, data integrity Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1416 [Add PHPStan rule: needs*() config detectors must not mutate the entity they inspect](https://git.drupalcode.org/project/canvas/-/merge_requests/1416) | State: merged 2026-08-08 | Author: Christian López Espínola (penyaskito), 241 diff lines Description: ### Overview Canvas's data-health "escaped config" check (`Doctor::runUpdatesEscapedConfigCheck()`) reflects and runs every `needs*()` detector on `CanvasConfigUpdater` against a single, shared, loaded config entity to decide whether that config has a pending data-model migration. These detectors must be side-effect-free: if one mutates the entity it is passed, the change leaks into every detector that runs after it on the same entity, silently corrupting the audit's result. Today that contract is enforced only by convention and review. It has already been violated twice in practice: one det… ### [Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing](https://git.drupalcode.org/project/canvas/-/work_items/3581133) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: Adam G-H (phenaproxima), Wim Leers (wimleers) | Labels: AI-accelerated, Chicago2026, DX (Developer Experience), Novice Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1297 [#3581133: Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing](https://git.drupalcode.org/project/canvas/-/merge_requests/1297) | State: merged 2026-07-30 | Author: Wim Leers (wimleers), 6040 diff lines Description: >>> [!note] Migrated issue Reported by: [wim leers](https://www.drupal.org/user/99777) Related to !797 >>> Overview :pray: Let's use the `FQCN::class` wherever we can. Reduces magic, makes it easier to navigate & understand these tests. — yours truly at https://git.drupalcode.org/project/canvas/-/merge_requests/651#note_727491 Proposed resolution Automate this feedback. User interface changes None. ### [Canvas AI: Add Tools dropdown to chat UI](https://git.drupalcode.org/project/canvas/-/work_items/3591856) State: opened | Updated: 2026-08-10 | Author: AKHIL BABU (AkhilBabu) | Assigned: Bruno Bruno (bbruno) | Labels: 1.x-dev, 2026Sprint15, 2026Sprint16, AI Initiative Sprint Description: ## Background — how Canvas AI works today The Canvas AI chat is an **orchestrator system**. Every message goes first to a single orchestrator agent. The orchestrator reads the message, infers the intent, and launches the matching sub-agent: - "Build me a landing page" → orchestrator → page-builder sub-agent - "Create a React component" → orchestrator → component sub-agent - "Write a title / meta description" → orchestrator → the relevant sub-agent The routing is implicit — the user never chooses which sub-agent runs; the orchestrator decides on every turn. Roadmap: https://git.drupalcode.o… ### [[upstream] Data loss: `drush config:import` deletes config (e.g. code component + component config entities) and bypasses config system data integrity checks](https://git.drupalcode.org/project/canvas/-/work_items/3573022) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: Christian López Espínola (penyaskito) | Labels: 2026Sprint16, AI Initiative Sprint, Needs tests, Needs upstream bugfix Description: >>> [!note] Migrated issue Reported by: [bernardm28](https://www.drupal.org/user/3624259) >>> Overview I have a hosted website, and I used 3 code components to overcome minor issues that were minor and were mostly just client-side or specific overrides from some css styles. Everything seems to work well until I go back to the website, and my page is WSOD. Upon further examination and local testing, I guess that something upstream at the hosting level created a deployment, and Drush did a Drush deploy and deleted the configuration of my code components. Here are the steps to reproduce it: … --- MERGE REQUESTS (24h) --- ### [chore(deps): update dependency cspell to v10](https://git.drupalcode.org/project/canvas/-/merge_requests/1273) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/major-cspell-monorepo | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [cspell](https://cspell.org/) ([source](https://github.com/streetsidesoftware/cspell/tree/HEAD/packages/cspell)) | [`^9.2.0` → `^10.0.0`](https://renovatebot.com/diffs/npm/cspell/9.7.0/10.0.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/cspell/10.0.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/cspell/9.7.0/10.0.1?slim=true) | > :exclamation: **I… ### [chore(deps): update dependency @eslint/compat to v2](https://git.drupalcode.org/project/canvas/-/merge_requests/1306) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/eslint-compat-2.x | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@eslint/compat](https://github.com/eslint/rewrite/tree/main/packages/compat#readme) ([source](https://github.com/eslint/rewrite/tree/HEAD/packages/compat)) | [`^1.3.1` → `^2.0.0`](https://renovatebot.com/diffs/npm/@eslint%2fcompat/1.4.1/2.1.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@eslint%2fcompat/2.1.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confide… ### [chore(deps): update dependency @chromatic-com/storybook to v5](https://git.drupalcode.org/project/canvas/-/merge_requests/1305) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/chromatic-com-storybook-5.x | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@chromatic-com/storybook](https://github.com/chromaui/addon-visual-tests) | [`^3.2.2` → `^5.0.0`](https://renovatebot.com/diffs/npm/@chromatic-com%2fstorybook/3.2.7/5.2.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@chromatic-com%2fstorybook/5.2.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@chromatic-com%2fstorybook/3.2.7/5.2.1?slim=true) | >… ### [fix(deps): update npm minor and patch](https://git.drupalcode.org/project/canvas/-/merge_requests/1238) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/npm-minor-and-patch | 55 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@axe-core/playwright](https://github.com/dequelabs/axe-core-npm) | [`4.11.1` → `4.12.1`](https://renovatebot.com/diffs/npm/@axe-core%2fplaywright/4.11.1/4.12.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@axe-core%2fplaywright/4.12.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@axe-core%2fplaywright/4.11.1/4.12.1?slim=true) | | [@babel/parser](… ### [chore(deps): update mysql docker tag to v8.4](https://git.drupalcode.org/project/canvas/-/merge_requests/1272) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/mysql-8.x | 13 diff lines Description: This MR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [mysql](https://hub.docker.com/_/mysql) ([source](https://github.com/docker-library/mysql)) | service-image | minor | `8.0` → `8.4` | > :exclamation: **Important** > > Release Notes retrieval for this MR were skipped because no github.com credentials were available. > If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes). --- ### Configuration 📅 **Schedule**: (UTC) - Br… ### [#3591838 [PHASE 2] introduce color props](https://git.drupalcode.org/project/canvas/-/merge_requests/1432) State: opened | Author: Ben Mullins (bnjmnm) | Branch: 3591838-phase-2-color-props | 4531 diff lines Description: This adds support for a 'color' prop type that supports two modes * **Freeform**, which has a color picker and all available brand kit colors * **Brand Kit** Which is limited to Brand Kit colors only, and can be filtered to only show colors from specific folders This MR also adds the widget for editing props of the 'color' type. Note that the color prop is stored as a string, which is either the CSS color value (rgb, hsl, etc) or a reference to a color entity. The prop value provided to templates is not this string value, but an object with the CSS color value, the W3C Color Token value, a… ### [Draft: #3591838 Phase 3: Usage data + deletion](https://git.drupalcode.org/project/canvas/-/merge_requests/1479) State: opened | Author: Ben Mullins (bnjmnm) | Branch: 3591838-phase-3-usage-data | 7191 diff lines Description: [Description of changes] ## Testing instructions - [ ] First step for someone to test the changes in this MR Closes #3591838 ### [Add the entity type's list cache contexts as cache contexts, not as cache tags.](https://git.drupalcode.org/project/canvas/-/merge_requests/1486) State: opened | Author: Lauri Timmanee (lauriii) | Branch: 3591933-fix-cache-contexts-being-added-as-cache-tags-in-contenttemplatenormalizeforclientside | 133 diff lines Description: Co-created with Claude Code. ## Testing instructions - [ ] First step for someone to test the changes in this MR Closes ### [task: #3567225 Make the component tree loader extensible](https://git.drupalcode.org/project/canvas/-/merge_requests/948) State: closed | Author: Rajab Natshah (RajabNatshah) | Branch: 3567225-allow-per-node-override | 29 diff lines Description: Refs #3567225 ## Summary Removes `final` from `ComponentTreeLoader` and widens its two promoted constructor properties to `protected`, so a contrib module can subclass it and swap the service. That is the whole change: one file, one hunk. ## Why this merge request shrank It previously carried the full per-node Content Template override feature across 11 files. That has been reverted here, leaving only the extension point, for two reasons. **The extension point is the part with a caller waiting on it.** [Canvas Override](https://www.drupal.org/project/canvas_override) subclasses `Componen… ### [Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields](https://git.drupalcode.org/project/canvas/-/merge_requests/1376) State: merged 2026-07-23 | Author: Christian López Espínola (penyaskito) | Branch: 3591829-multi-bundle-cer-branch-coalescing | 453 diff lines Description: Closes #3591829. Low-level prop-expression infrastructure for authoring multi-target-bundle `content-entity-reference` picks whose per-bundle field selections differ. Blocks #3591656, which exposes and renders the feature and owns the constraint/validator changes and the CER integration tests. ## What this MR does - **Parser + serializer** (`FieldObjectPropsExpression`): round-trips a bundle-specific branch nested in an object prop (`label↝entity␜[branch][branch]`). Nested branching stays rejected via the existing `parseBranches()` depth guard. - **Coalescer**: groups standalone references … ### [#3591851: Allow editing stored patterns](https://git.drupalcode.org/project/canvas/-/merge_requests/1403) State: merged 2026-08-04 | Author: Dave Long (longwave) | Branch: 3591851-edit-stored-patterns | 1757 diff lines Description: * Adds "Edit pattern" to the pattern library * Patterns can have components added, changed and removed * Patterns can be renamed * Save/publish works in the same way as pages and content templates AI-Generated: Yes (Used Claude Code to develop almost all the changes and write the tests, with manual testing in between) ## Testing instructions - [ ] Create a pattern then click "Edit pattern" in the pattern library - [ ] Add, update, remove components in the pattern - [ ] Save the changes - [ ] Ensure the changes remain after reloading the editor or placing the pattern elsewhere - [ ] Rename th… ### [fix(ui): #3591716 boolean props auto-enable when another prop is changed](https://git.drupalcode.org/project/canvas/-/merge_requests/1285) State: closed | Author: Alamgir Hossain (alamgir.hossain.cse) | Branch: 3591716-fix-boolean-props-auto-enable | 96 diff lines Description: ## Summary - Boolean props in Canvas component forms auto-enable when any other prop is changed. - Two root causes identified and fixed across 3 files. ## Root causes & fixes **1. `|| []` coerces `false` to `[]` — `layoutModelSlice.ts` lines 559 & 566** During component drop, `buildInitialData()` ran `prop.default_values?.resolved || []`. For boolean props with default `false`: `false || [] = []` (truthy empty array). Changed to `?? []` so `false` is preserved. **2. Twig renders `element['#value']` as `'0'` during AJAX rebuilds — `input--checkbox--inwidget-boolean-checkbox.html.twig`** D… ### [fix(ui): #3591716 boolean props auto-enable when another prop is changed (1.6.0)](https://git.drupalcode.org/project/canvas/-/merge_requests/1286) State: closed | Author: Rajab Natshah (RajabNatshah) | Branch: 3591716-1.6.0 | 4888 diff lines Description: Variant of MR !1285 based on the 1.6.0 release tag, for sites on Canvas 1.6.0. Same fix: twig checkbox template, DrupalToggle, react-hook-form getCurrentValueFromProps, and layoutModelSlice falsy-default preservation. Built ui/dist bundle is provided via the release patch (gitignored on dev). ### [refactor(Conflict resolution): #3591785 Strengthen AutoSaveManager to generate stable hashes](https://git.drupalcode.org/project/canvas/-/merge_requests/1356) State: merged 2026-08-04 | Author: Feliksas Mazeikis (f.mazeikis) | Branch: 3591785-strengthen-autosave-normalization | 977 diff lines Description: ## Summary This branch consolidates the typed-data normalization logic that `AutoSaveManager` and `ComponentSourceBase` previously duplicated into a single method, `TypedDataHelper::castRawPhpTypes()`. ## What changed and why `AutoSaveManager::normalizeEntity()` (hash source) and `ComponentSourceBase::castRawTypedConfigToPhpTypes()` (component-shape normalization) each contained their own primitive-casting and traversal logic. These are merged into `TypedDataHelper::castRawPhpTypes()`, which already existed for the config typed-data path but was not wired into `toStorableArray()`. During c… ### [feat: #3518272 support all entity types with configurable displays for content templates](https://git.drupalcode.org/project/canvas/-/merge_requests/791) State: opened | Author: Adam G-H (phenaproxima) | Branch: 3518272-field-ui-base-route | 2319 diff lines Description: Closes #3518272 . ### [#3591875: "Translatable props missing from TMGMT form when component instances cannot be auto-updated to active version"](https://git.drupalcode.org/project/canvas/-/merge_requests/1418) State: opened | Author: Kunal Sachdev (kunal.sachdev) | Branch: 3591875-translatable-props-missing-from-tmgmt-form-when-component-instances-cannot-be-auto-updated-to-active-version | 1056 diff lines Description: AI-Generated: Yes (Used Github Copilot(Claude Sonnet 4.6) for the solution and test coverage). ### [Resolve #3591907 "Balance cypress E2E parallel split by runtime weight"](https://git.drupalcode.org/project/canvas/-/merge_requests/1463) State: merged 2026-08-06 | Author: Christian López Espínola (penyaskito) | Branch: 3591907-cypress-e2e-parallel-runtime-distribute | 279 diff lines Description: Closes #3591907 Cuts the slowest E2E node by ~25% on average (15–30% across runs). The improvement depends on the CI nodes assigned, but it's consistently faster feedback in any case. ## What this MR does `ui/tests/support/parallel.js` split the 46 Cypress E2E specs across the 4 CI nodes by dealing them round-robin by filename — balancing spec *count*, not runtime. The heaviest specs therefore stacked on whichever node the alphabetical order happened to fill (slowest node ~21 min vs fastest ~7). `parallel.js` now reads a `// @canvas-ci weight=N flaky` marker on the first line of a spec: -… --- COMMITS (24h) --- - [fb733321](https://git.drupalcode.org/project/canvas/-/commit/fb73332172bef99f76084a618694ba5b76cd9206) chore(Theme Builder): #3591869 canvas_test_code_components_content_entity_ref config/install fields conflict on the standard profile — Christian López Espínola (2026-08-10T15:41:08.000+00:00) - [68bb76ed](https://git.drupalcode.org/project/canvas/-/commit/68bb76ed58673c5cafa8514954c907c9853402b7) test: #3591931 Do not rely on $argv being a global — Tim Plunkett (2026-08-10T12:18:37.000+00:00) ======================================================================== ## [8] summariseModule:ai_context:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Context Control Center (CCC) (machine name: ai_context) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Abhinav Jha (ajabhinavjha30), Kristen Pol (kepol) [2]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

              Context Control Center (CCC)

              then use

              ,

              ,

                /
              • , and as needed. Output only the HTML fragment with no surrounding , , or
                tags. After the project summary prose, add a single subsection titled "

                How can I help on this project?

                " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Add context item Priority field and use it for selection ordering](https://git.drupalcode.org/project/ai_context/-/work_items/3586376) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: Kristen Pol (kepol) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::feature Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !245 [Issue #3586376: Add context item priority field and selection tie-breakers.](https://git.drupalcode.org/project/ai_context/-/merge_requests/245) | State: opened | Author: Kristen Pol (kepol), 1630 diff lines Description: ## Summary Follow-up to: #3586364+s Context selection currently breaks ties between equally weighted candidates using the item `changed` timestamp. That is opaque to editors and does not reflect editorial intent when multiple items compete for the same slots. Add a **Priority** field on context items and use it consistently when the selector chooses and orders candidates within each selection group. ## Problem When more context items qualify than fit under `max_items` (or `max_global_items`), the selector must decide which items to keep and in what order. Today: - Global, scored, and ma… ### [Remove max_items context limit and rely on the token budget](https://git.drupalcode.org/project/ai_context/-/work_items/3586378) State: closed | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !244 [Issue #3586378: Remove max_items context limit and rely on token budget.](https://git.drupalcode.org/project/ai_context/-/merge_requests/244) | State: merged 2026-08-11 | Author: Kristen Pol (kepol), 3093 diff lines Description: ## Summary Follow-up to: - #3586337+s The **Max context items to inject** setting (`max_items`) adds UX and DX complexity without providing a meaningful limit on its own. Context items vary widely in size, so a token budget is the more accurate control for how much context can reach an agent prompt. Remove `max_items` from configuration, forms, validation, selection logic, documentation, and tests. After this change, the token budget (`max_tokens`) is the primary module-wide limit on injected context. ## Problem Site builders currently configure two overlapping limits: - **Max context i… ### [Clarify and stabilize the scope plugin extension boundary for 1.0](https://git.drupalcode.org/project/ai_context/-/work_items/3586392) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !249 [Issue #3586392: Clarify and stabilize scope plugin extension boundary for 1.0.](https://git.drupalcode.org/project/ai_context/-/merge_requests/249) | State: opened | Author: Kristen Pol (kepol), 1007 diff lines Description: ## Summary Follow-up to: #3586243+s Before 1.0, lock down what custom scope authors and contrib can safely depend on, without landing the full persistence/orchestration refactor from #3586243+. This issue is documentation and internal seam-setting only: no new public interface methods and no user-visible behavior changes. The current scope plugin API is already broad enough for map-backed custom scopes, but docs and code send mixed signals. The scope manager is marked `@internal` while developer docs show injection patterns; the resolver interface docblock calls itself public while `api-st… ### [Align scope scoring, language service, and contextual selection behavior](https://git.drupalcode.org/project/ai_context/-/work_items/3586388) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, blocker::stable Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !242 [Issue #3586388: Align scope scoring and contextual detection.](https://git.drupalcode.org/project/ai_context/-/merge_requests/242) | State: opened | Author: Kristen Pol (kepol), 2318 diff lines Description: ## Summary **IMPORTANT: If #3586365+s is merged first, this issue's MR needs fixing based on that (and vice versa).** Follow-up to: #3586365 Before 1.0, align scope weight, subscription scoring, UI ordering, language handling, hard contextual filtering, and function-call listing so selection behavior is predictable, consistently documented, and safe for agent use. ### 1. Align scope display order with scoring weight Use the existing plugin weight for both subscription scoring and UI display order. A higher weight means: - Greater influence during subscription scoring - Earlier placemen… ### [CCC QA scripts for 1.0 testing](https://git.drupalcode.org/project/ai_context/-/work_items/3586226) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: Bruna Emerich (brunaemerich) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, blocker::stable Description: ## Problem/motivation Need to make sure we're ready for the QA team to do pre-1.0 testing. ## Solution From Bruna Emerich (Zoocha): Documentation covering the functionality, along with a test script (such as the example in this ticket, where an .md file is included), is sufficient for us to carry out testing. If any questions come up, we’ll raise them directly in the channel and tag you. Regarding lead time, it depends on the size of the functionality, but generally one week’s notice is sufficient. If there’s a fixed release date, allowing around 14 days is preferable, as it gives enough … ### [Redesign selection modes as a nested Minimal / Relevant / Broad ladder and remove match_all](https://git.drupalcode.org/project/ai_context/-/work_items/3586394) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: Kristen Pol (kepol) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::feature Description: ## Problem/motivation Follow-up to: #3586237+s Add this one follow-up from https://git.drupalcode.org/project/ai_context/-/merge_requests/244#note_1709155: "The token budget is a soft ceiling (truncation at item boundaries + prefix overhead can slightly exceed it, with a warning logged) — pre-existing renderer behavior" --- Agent context selection is confusing today because the two selection modes encode mechanisms instead of user intent, and they are not supersets of each other: - **Minimal** (default) with **no subscriptions** injects almost nothing except Global, Always include, an… ### [Switch CCC documentation link to clean version](https://git.drupalcode.org/project/ai_context/-/work_items/3586370) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint17, ai::internal, category::task, priority::normal Description: **Note that this could be done after the 1.0 release.** ## Problem I tried switching the documentation link: https://ai-context-b13f05.pages.drupalcode.org/ to https://ai-context.pages.drupalcode.org/ via the settings in gitlab including rerunning a CI build to get it in place. But it never worked. ## Solution Figure out how to get it to work properly. Note it shows up here ./ai_context.module: ':docs' => 'https://ai-context-b13f05.pages.drupalcode.org/', and is linked from the d.o project page ### [Document real-world use cases for CCC 1.0](https://git.drupalcode.org/project/ai_context/-/work_items/3586372) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint17, category::task, priority::normal, sprint candidate Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !256 [Issue #3586372: Document real-world use cases for CCC](https://git.drupalcode.org/project/ai_context/-/merge_requests/256) | State: opened | Author: Abhinav Jha (ajabhinavjha30), 169 diff lines Description: **Note that this could be done after the 1.0 release.** Fable 5 pass Here's a documentation-ready set of use cases, grouped by consumer and framed for the post-[#3586346](https://git.drupalcode.org/project/ai_context/-/work_items/3586346) world where anything — agents, CKEditor, translation, automators — can be a context consumer. Each one names the CCC features it exercises so readers connect the scenario to the mechanics. --- ## Writing assistance (AI CKEditor) **1. Brand voice everywhere, enforced once.** The marketing team maintains one "Voice and tone" context item — reading level, b… ### [Document how to use RAG with CCC 1.0](https://git.drupalcode.org/project/ai_context/-/work_items/3586371) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint17, category::task, priority::normal, sprint candidate Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !255 [Issue #3586371: Document how to use RAG with CCC](https://git.drupalcode.org/project/ai_context/-/merge_requests/255) | State: opened | Author: Abhinav Jha (ajabhinavjha30), 173 diff lines Description: **Note that this could be done after the 1.0 release.** Fable 5 notes Good news: everything needed already exists in the public API — `AiContextRequest::getTask()` gives you a free-text retrieval query, and the `text_rendered` event exposes remaining token budget and lets you rewrite the output. Here's how I'd wire RAG up with ai_context **today**, no changes to the module. ## Pattern A — agentic RAG via tools (no custom code) Use ai_context for what it's best at: injecting *instructions about retrieval* rather than retrieved content. 1. Index your corpus with the AI module's `ai_search` … ### [Resolve `use_default` provider config for conditional subcontext selection](https://git.drupalcode.org/project/ai_context/-/work_items/3586391) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: Tekla Aivazashvili (aivazashvilit) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::bug Description: ## Problem / motivation Follow-up to: - #3586351+s - #3586207+s During real-provider conditional subcontext testing (#3586351+), conditional children were **silently excluded** even though: - **Enable conditional subcontext AI decisions** was on - Published conditional subcontext items existed - The site had a working chat default at **AI → Settings → Default providers** Root cause: `ai_context` stores settings in `ai_context.settings:provider_config`, but runtime code only reads **`provider`** and **`model`**. It ignores **`use_default`**. Install config ships with: ```yaml provider_co… ### [Implement plugin-based generic context consumers and unified consumer configuration](https://git.drupalcode.org/project/ai_context/-/work_items/3586346) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: Kristen Pol (kepol) | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::outside Description: ## Summary **Review the plan carefully before proceeding with implementation in case it needs adjustments.** Implement the architecture accepted in [#3586319](https://git.drupalcode.org/project/ai_context/-/work_items/3586319): AI Context will treat everything that receives context as a consumer, with agents becoming one consumer type. Consumer types will use Drupal attribute plugins, all configured consumers will use one configuration store, and agent and non-agent requests will share the same request-building and selection pipeline. This is a clean-slate beta change. Agent-specific factor… ### [Persist context-item token counts and show token-budget usage in CCC UI](https://git.drupalcode.org/project/ai_context/-/work_items/3586379) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !248 [Issue #3586379: Persist token counts and show budget usage in CCC UI.](https://git.drupalcode.org/project/ai_context/-/merge_requests/248) | State: opened | Author: Kristen Pol (kepol), 5325 diff lines Description: ## Summary Follow-up to: - #3586337+s - #3586348+s Implement the subscription-limit UX decisions from the Emma+Aidan review on #3586337. Persist each context item's estimated token count at save time, base token badges on percentage of the configured token budget, and add budget summary messaging on the agent subscription settings page. This issue implements the indicator behavior. It does not add new warning components beyond text, badges, and tooltips agreed in the design review. **Implementation:** [MR !248](https://git.drupalcode.org/project/ai_context/-/merge_requests/248) on branch … ### ["Global context" checkbox description renders a literal
                instead of a line break](https://git.drupalcode.org/project/ai_context/-/work_items/3586369) State: opened | Updated: 2026-08-10 | Author: Sohail Lajevardi (doxigo) | Assigned: Shashank Rai (shqshqnk) | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::inside Description: On the AI context item edit form, the description under the **Global context** checkbox displays the tag as text: > Always include this context for every agent.\Saving the form with this > enabled will clear previous scope settings. `AiContextScopeGlobal::getFormDescription()` exists specifically so this checkbox can carry a line break. Its own docblock says so: ```php /** * Gets the checkbox description for the context item form. * * Uses a line break that is not safe for settings pages escaped with * Html::escape(), so keep plain text in getDescription() instead. */ protected functio… ### [Install `target_entities` field storage when Dynamic Entity Reference is enabled on existing sites](https://git.drupalcode.org/project/ai_context/-/work_items/3586375) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: Joshua Fernandes (joshua1234511) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::bug Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !251 [Issue #3586375: Install target_entities storage when DER is enabled later.](https://git.drupalcode.org/project/ai_context/-/merge_requests/251) | State: opened | Author: Kristen Pol (kepol), 636 diff lines Description: ## Problem Sites that already have `ai_context` installed can fatal when `dynamic_entity_reference` is enabled (or was enabled without a matching schema update). The context item listing and other entity loads fail with: `Table 'db.ai_context_item__target_entities' doesn't exist` Example stack: `SqlContentEntityStorage->loadFromDedicatedTables()` while `AiContextItemListBuilder->load()` renders `/admin/config/ai/context/items`. ### Root cause `target_entities` is not defined in `AiContextItem::baseFieldDefinitions()`. It is added at runtime via `DynamicEntityReferenceHooks::entityBaseFiel… ### [Document the AI Context role and permission matrix for 1.0](https://git.drupalcode.org/project/ai_context/-/work_items/3586395) State: closed | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::internal, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !254 [Issue #3586395: Document the AI Context role and permission matrix for 1.0.](https://git.drupalcode.org/project/ai_context/-/merge_requests/254) | State: merged 2026-08-10 | Author: Kristen Pol (kepol), 304 diff lines Description: ## Problem/Motivation Follow-up to: #3586358+s The current AI Context permission model is sufficient for the 1.0 role patterns, and #3586356+ completed the required access hardening. However, site builders do not yet have a documented role/permission matrix. In particular, the documentation should distinguish: - Published-context consumers using AI features - Context authors managing their own items - Editors managing context across authors - Administrators managing settings, agents, and usage The documentation must also cover editorial workflow transition permissions, which are generate… ### [Create multi-vocabulary taxonomy scope plugin](https://git.drupalcode.org/project/ai_context/-/work_items/3586237) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::feature Description: ## Problem/motivation _**Note that this isn't a must have for 1.0 but a nice to have. Given that people think the current "tags" scope plugin previous the behavior this plugin would provide then it is really nice to have.**_ _**Note that weight = 20 should be used as follow-up to #3586388+s.**_ Follow up to: #3586198+s We do not have a scope plugin that allows associated context with the terms for content entities. Example: * Article **has terms**: foo, bar, hello * Blog post **has terms**: foo, whatever * One context item **has term**: foo * Another context item **has terms**: foo, bar… ### [Pre-1.0 context selection reliability and diagnostics follow-up to issue 3586363](https://git.drupalcode.org/project/ai_context/-/work_items/3586383) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !252 [Issue #3586383: Pre-1.0 context selection reliability and diagnostics follow-up.](https://git.drupalcode.org/project/ai_context/-/merge_requests/252) | State: opened | Author: Kristen Pol (kepol), 1013 diff lines Description: **Blocker: Assess #3586348+s before proceeding on this issue.** ## Follow-up issue Follow-up to: #3586363 Child of the "Before 1.0" triage in #3586363+s. Improves selection transparency, conditional-subcontext failure visibility, and debug diagnostics before 1.0. **Scope:** #3, #4, #9 from the Before 1.0 list in #3586363. **Non-goals:** documentation/trust/compatibility work (#1, #2, #5, #6, #8 — separate issue), performance benchmarks (#7 — 1.1), usage vs observability (#10 — #3567803 / #3586213), rich selection diagnostics UI or persistence ([#3586242](https://git.drupalcode.org/projec… --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- - [ca38e632](https://git.drupalcode.org/project/ai_context/-/commit/ca38e632dfc2e1584b6898e06e848ff49ae4560e) Issue #3586378: Remove max_items context limit and rely on token budget. — Kristen Pol (2026-08-11T03:55:13.000+00:00) - [732e1b33](https://git.drupalcode.org/project/ai_context/-/commit/732e1b3350b8cdab7f6935e3cdd786e05750d8bc) Issue #3586395: Document the AI Context role and permission matrix for 1.0. — Kristen Pol (2026-08-10T06:40:22.000+00:00) ======================================================================== ## [9] summariseModule:ai_dashboard:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI Dashboard (machine name: ai_dashboard) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Rob Loach [1]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                AI Dashboard

                then use

                ,

                ,

                  /
                • , and as needed. Output only the HTML fragment with no surrounding , , or
                  tags. After the project summary prose, add a single subsection titled "

                  How can I help on this project?

                  " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). (none) --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- - [54340669](https://git.drupalcode.org/project/ai_dashboard/-/commit/54340669a7170687e073bd1130fcf14c7bb03af1) Issue #3585223: Fix description font size — Rob Loach (2026-08-10T14:15:37.000-04:00) ======================================================================== ## [10] summariseModule:ai_translate:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI translate (machine name: ai_translate) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Christoph Breidert (breidert)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                  AI translate

                  then use

                  ,

                  ,

                    /
                  • , and as needed. Output only the HTML fragment with no surrounding , , or
                    tags. After the project summary prose, add a single subsection titled "

                    How can I help on this project?

                    " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Feature: Translation result caching and cross-field deduplication](https://git.drupalcode.org/project/ai_translate/-/work_items/3585529) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Rodel Duterte (rduterte) | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::inside Description: ## Problem/Motivation `ai_translate` re-sends every field to the LLM on every translation run, with no memory of previous translations. This causes two avoidable costs: 1. **Re-translation of unchanged content.** On a re-translation run (fixing one typo, updating a single field), every unchanged field is sent to the LLM again, even though the output would be identical to the previous run. 2. **Repeated translation of identical strings.** Paragraph-heavy entities and Layout Builder pages often contain the same short string in multiple components (shared CTA labels, navigation titles, standard… ### [Update translation cropping](https://git.drupalcode.org/project/ai_translate/-/work_items/3479612) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: category::task, code, priority::normal, state::accepted Description: >>> [!note] Migrated issue Reported by: [scott_euser](https://www.drupal.org/user/3267594) >>> Problem/Motivation As per https://www.drupal.org/project/ai/issues/3479027#comment-15806901 comment #11 and #12, trimming the text can be a surprise/go unnoticed by the user. Steps to reproduce Get AI to respond with text that is longer than max length Proposed resolution For a follow-up should we have it immediately make a tiny follow-up attempt. Like "The following text between the ____ seperator is longer than the character limit of ___: ------- Text here ------- - Keep the same tone of voice … ### [Compatible with Address module](https://git.drupalcode.org/project/ai_translate/-/work_items/3468992) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: category::feature, code, priority::normal, state::postponed Description: >>> [!note] Migrated issue Reported by: [w01f](https://www.drupal.org/user/2488816) >>> I have this working to great effect on an English/Japanese site. The sole exception is an issue where addresses stored using the popular Address module do not translate correctly. It seems to get the country and the prefecture, but leaves the rest of the address blank. > Related issue: [Issue #3464024](https://www.drupal.org/node/3464024) ### [one-click link should show human name, not machine name](https://git.drupalcode.org/project/ai_translate/-/work_items/3580314) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Jordan Koplowicz (koppie) | Labels: category::bug, code, needs port to 2.x, priority::minor Description: >>> [!note] Migrated issue Reported by: [koppie](https://www.drupal.org/user/261840) Related to !16 >>> Problem/Motivation The AI module works off of providers. Each provider defines models with both human name, and "machine name." The machine name usually avoids spaces and other "special" characters. The problem: the "one click" link on the translate page uses the machine name, not the human name. This can be hard to read, and leads to a bad Editor Experience (EX). Steps to reproduce Configure multiple languages Enable the ai_translate module Enable at least one provider (with a lon… ### [backport: one-click link should show human name](https://git.drupalcode.org/project/ai_translate/-/work_items/3585535) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: Jordan Koplowicz (koppie) | Labels: category::bug, priority::normal, state::closed, v1.3.x-dev Description: >>> [!note] Migrated issue Reported by: [koppie](https://www.drupal.org/user/261840) Related to ai!1334 >>> [Tracker] Update Summary: New issue, backported from https://www.drupal.org/project/ai_translate Short Description: one-click link should show human name, not machine name Check-in Date: 03/19/2026 Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation The AI module works off of providers. Each provider defines models with both human name, and "machine name." The machine name usually avoids spaces and other "special" characters. The pr… ### [Refactor translation workflow to support Tool API and agent-driven translation](https://git.drupalcode.org/project/ai_translate/-/work_items/3585523) State: opened | Updated: 2026-08-10 | Author: Sven Decabooter (svendecabooter) | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::inside Description: I am investigating whether I can have an AI Agent perform an entity translation, when a user requests this as part of an administrative AI agent interface. This would probably need some major refactoring of the module logic, since there are currently 2 endpoints: - UI batch translation - Drush command translation This would add a third one: Tool API translation So logic should be abstracted as much as possible where relevant, so all 3 entry points use the same code, rather than replicating it. I haven't investigated this further in detail, but already raising an issue here, in case someone … ### [Auto-translate referenced taxonomy terms (and other translatable entities) when translating a node](https://git.drupalcode.org/project/ai_translate/-/work_items/3585539) State: opened | Updated: 2026-08-10 | Author: Carlos Romero (o0Charly0o) | Assigned: unassigned | Labels: category::feature, code, priority::normal, state::accepted Description: When translating a node via AI Translate, referenced translatable entities (e.g. taxonomy terms) are not automatically translated. Editors must translate each term separately, which is tedious on multilingual sites. Proposed solution Add a batch operation translateReferencedEntities() that runs after insertTranslation(). It scans all entity reference fields of the source entity (including fields marked as non-translatable on the node), and for each referenced ContentEntityInterface that: belongs to a translatable entity type does not yet have a translation in the target language …extracts i… ### [AI Translate: Issue with translating blocks which has language code as und on layout builder page](https://git.drupalcode.org/project/ai_translate/-/work_items/3567453) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Punam Aseem Beedkar (PunamShelke) | Labels: category::bug, code, priority::normal, state::postponed Description: >>> [!note] Migrated issue Reported by: [punamshelke](https://www.drupal.org/user/3509619) >>> I have landing page which has multiple blocks and few blocks doesnt have any language attached so while translating that page it failed with error mention below - InvalidArgumentException: The entity cannot be translated since it is language neutral (und). in Drupal\Core\Entity\ContentEntityBase->addTranslation() (line 990 of /app/docroot/core/lib/Drupal/Core/Entity/ContentEntityBase.php). backtrace - /app/docroot/modules/contrib/ai/modules/ai_translate/src/Plugin/FieldTextExtractor/LbFieldEx… ### [Translation seems to affect workflow](https://git.drupalcode.org/project/ai_translate/-/work_items/3472755) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: category::bug, priority::normal, state::postponed, userInterface Description: >>> [!note] Migrated issue Reported by: [briwan](https://www.drupal.org/user/3829967) >>> Error when using Translate with AI button Create a content in english, translate them with the AI button, an error occured, drupal try to save a translated workflow and crash. In screenshot we can see "publié" for french and "publicado" for spanish. Backtrace #0 /var/www/html/web/core/modules/content_moderation/src/Plugin/WorkflowType/ContentModeration.php(101): Drupal\workflows\Plugin\WorkflowTypeBase->getState() #1 /var/www/html/web/core/modules/content_moderation/src/EntityOperations.php(… ### [Classes fail to resolve correctly in unit tests because of ai_translate variant in AI core module](https://git.drupalcode.org/project/ai_translate/-/work_items/3585544) State: opened | Updated: 2026-08-10 | Author: Sven Decabooter (svendecabooter) | Assigned: unassigned | Labels: category::bug, code, needs port to 2.x, priority::major Description: Since this module depends on the drupal.org/project/ai module in a testing environment, it also loads the deprecated ai_translate submodule from within that module, causing issues for unit tests. See https://git.drupalcode.org/project/ai_translate/-/merge_requests/37: > **9. A duplicate module in the test environment, and the workaround it forced.** The AI module still bundles the deprecated `ai_translate` submodule this project replaced. `core/tests/bootstrap.php` registers one PSR-4 path per extension _name_ and the **last one discovered wins** — which is the bundled copy, deterministicall… ### [[META] AI Translation — DrupalCon Rotterdam 2026 demo](https://git.drupalcode.org/project/ai_translate/-/work_items/3585543) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Valery Lourie (valthebald) | Labels: AI Initiative Sprint, No Estimation Available, category::meta, priority::normal Description: ## Description This is the AI Translation area meta issue for the [2026 AI Inside Roadmap to DrupalCon Rotterdam](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586657). Leads: Sven Decabooter, Valery Lourie. For Rotterdam, AI Translate needs to work end-to-end against the Drupal AI Demo's multilingual corpus: an editor translates a page from the editing interface, reviews the result, and a visitor can then get a grounded search answer in another configured language. See the roadmap issue for the full delivery criteria for this area. ## Tasks * [ ] Ship the fixes and featur… ### [Recipe: translate Drupal AI Demo content to Spanish, German, and French](https://git.drupalcode.org/project/ai_translate/-/work_items/3585542) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Valery Lourie (valthebald) | Labels: AI Initiative Sprint, category::feature, priority::normal, state::accepted Description: ## Description The [AI Translation area](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586657) of the AI Inside roadmap needs a concrete, presentable "delivered" state for the Drupal AI Demo: an editor translates a page from the editing interface, and search/answers work in the translated languages too. That requires a recipe that configures multilingual translation for the demo corpus. This issue is scoped to **configuration only** — adding the languages and configuring ai_translate with working defaults. Translating the demo corpus content itself is separate, later work, d… ### [Add ai_translate-specific issue and merge request templates](https://git.drupalcode.org/project/ai_translate/-/work_items/3585541) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Valery Lourie (valthebald) | Labels: AI Initiative Sprint, category::task, priority::minor, state::accepted Description: ## Description `ai_translate` does not yet have issue/MR templates. This issue is for adding these templates re-using existing templates from other projects (for example the ai project). ## Tasks * [ ] Commit the 5 issue templates in `.gitlab/issue_templates/` (bug_report, feature_request, plan, support_request, task) * [ ] Commit the merge request template in `.gitlab/merge_request_templates/Default.md` * [ ] Push to the default branch and verify GitLab offers the templates in the "New issue" / "New merge request" dropdowns ## Acceptance criteria * Selecting any of the 5 templates from t… ### [InvalidArgumentException: Invalid translation language (und) when translating media entities](https://git.drupalcode.org/project/ai_translate/-/work_items/3585532) State: opened | Updated: 2026-08-10 | Author: szato (odi) | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, Quick Win Description: When using AI Translate to translate a media entity (e.g. media.image), the batch fails with: ``` InvalidArgumentException: Invalid translation language (und) specified. in Drupal\Core\Entity\ContentEntityBase->getTranslation() ``` **Steps to reproduce** - Enable AI Translate, configure an AI provider - Have a media type (e.g. image) with content translation enabled and field sync configured - Go to a media entity's translation overview, click "Translate using AI" for a non-existing language - Batch fails with the above exception **Proposed resolution** ``` --- a/src/Controller/AiTranslateC… --- MERGE REQUESTS (24h) --- ### [feat: #3585541 Add ai_translate-specific issue and merge request templates](https://git.drupalcode.org/project/ai_translate/-/merge_requests/38) State: opened | Author: Christoph Breidert (breidert) | Branch: 3585541-add-ai-translate-specific-issue-and-merge-request-templates | 422 diff lines Description: ## Description Adds the `.gitlab/issue_templates/` and `.gitlab/merge_request_templates/Default.md` templates, adapted from the parent `drupal/ai` project to fit `ai_translate`'s own scope: - Component label options now reflect this module's real areas (content translation, interface translation, field text extractors, provider, settings, drush) instead of `drupal/ai` submodule labels (aiAgent, aiApiExplorer, aiChatbot, …). - Added an "AI Usage" disclosure checkbox to all 5 issue templates. - Testing-setup snippets now include enabling `content_translation`/`ai_translate` and translating a n… --- COMMITS (24h) --- (none) ======================================================================== ## [11] summariseModule:flowdrop:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: FlowDrop (machine name: flowdrop) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Shibin Das [60]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                    FlowDrop

                    then use

                    ,

                    ,

                      /
                    • , and as needed. Output only the HTML fragment with no surrounding , , or
                      tags. After the project summary prose, add a single subsection titled "

                      How can I help on this project?

                      " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). (none) --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- - [1a1c117b](https://git.drupalcode.org/project/flowdrop/-/commit/1a1c117b1b9e01264eb928ce46f0bfdb9ac7067f) fix(flowdrop_chat): Narrow AiModelService return values for standalone analysis — Shibin Das (2026-08-10T23:17:15.000+02:00) - [ef548efa](https://git.drupalcode.org/project/flowdrop/-/commit/ef548efa46d7acb1ca86c7cb9d35584e28a01460) ci: Add the three words the first cspell run on 2.x reported — Shibin Das (2026-08-10T23:13:18.000+02:00) - [963c1d0b](https://git.drupalcode.org/project/flowdrop/-/commit/963c1d0bc2f9e8d200bffc5d08dbc4796c38d2c2) docs(flowdrop): Record the British English spelling convention — Shibin Das (2026-08-10T23:01:40.000+02:00) - [08920d10](https://git.drupalcode.org/project/flowdrop/-/commit/08920d10f5b2047c85ca53709cb714d3dc8b8046) ci: Add cspell project dictionary and ignore generated artefacts — Shibin Das (2026-08-10T23:01:34.000+02:00) - [51fb22f1](https://git.drupalcode.org/project/flowdrop/-/commit/51fb22f1d068aea9cde220af4b388b671288826c) fix(flowdrop): correct spellings flagged by the cspell check — Shibin Das (2026-08-10T23:01:25.000+02:00) - [435c6864](https://git.drupalcode.org/project/flowdrop/-/commit/435c68642f55942267d72d0a45f6a64341b2368d) ci: Fix empty variables block breaking all pipeline jobs — Shibin Das (2026-08-10T22:27:07.000+02:00) - [eff96d97](https://git.drupalcode.org/project/flowdrop/-/commit/eff96d976d62d9f4f6665ec0788272e578c7b1bb) ci: Re-enable cspell check — Shibin Das (2026-08-10T22:24:09.000+02:00) - [2d73c987](https://git.drupalcode.org/project/flowdrop/-/commit/2d73c987232032ba1d8f73d692499d407adbb9b3) feat(flowdrop): raise PHPStan to level 10 — Shibin Das (2026-08-10T22:08:46.000+02:00) - [a8aa250e](https://git.drupalcode.org/project/flowdrop/-/commit/a8aa250ec22e8909eee79e308d71d6b464b788d9) test(flowdrop_orchestration_connector): narrow implicit mixed in poll tests for PHPStan level 10 — Shibin Das (2026-08-10T22:08:34.000+02:00) - [1332737b](https://git.drupalcode.org/project/flowdrop/-/commit/1332737b7c958a0caa4c20119a37a91ae150d857) refactor(flowdrop_runtime): narrow implicit mixed in runtime services for PHPStan level 10 — Shibin Das (2026-08-10T22:08:21.000+02:00) - [85971935](https://git.drupalcode.org/project/flowdrop/-/commit/859719351b4f45e076278c2e3bae110aab313f50) refactor(flowdrop_trigger): narrow implicit mixed in trigger forms for PHPStan level 10 — Shibin Das (2026-08-10T22:07:33.000+02:00) - [aae136b8](https://git.drupalcode.org/project/flowdrop/-/commit/aae136b890fbeec840d6d1cb52371f31aebd0ae9) refactor(flowdrop_stategraph): narrow implicit mixed in state DTOs for PHPStan level 10 — Shibin Das (2026-08-10T22:07:07.000+02:00) - [92a9bd53](https://git.drupalcode.org/project/flowdrop/-/commit/92a9bd53f0985190aa28fbe10b64129bc2389325) refactor(flowdrop_session): narrow implicit mixed in the session entity and services for PHPStan level 10 — Shibin Das (2026-08-10T22:07:07.000+02:00) - [e3444bb3](https://git.drupalcode.org/project/flowdrop/-/commit/e3444bb37d4a002245d0de24540be1d043483cf6) refactor(flowdrop_pipeline): narrow implicit mixed in the pipeline entity and lists for PHPStan level 10 — Shibin Das (2026-08-10T22:07:07.000+02:00) - [f7229103](https://git.drupalcode.org/project/flowdrop/-/commit/f7229103aaaada6d6fc071214b69b80a52b834fc) refactor(flowdrop_interrupt): narrow implicit mixed in the inbox and entity for PHPStan level 10 — Shibin Das (2026-08-10T22:06:27.000+02:00) - [e2867019](https://git.drupalcode.org/project/flowdrop/-/commit/e286701954c4d7ab2d271113199dfbf3b7ddc0e0) refactor(flowdrop_workflow_executor): narrow implicit mixed for PHPStan level 10 — Shibin Das (2026-08-10T22:06:11.000+02:00) - [c20a477a](https://git.drupalcode.org/project/flowdrop/-/commit/c20a477a049f0042817ee5c3254bbc9a54d58c0b) refactor(flowdrop_workflow): narrow implicit mixed in navbar, resolver and tests for PHPStan level 10 — Shibin Das (2026-08-10T22:06:11.000+02:00) - [bb38de50](https://git.drupalcode.org/project/flowdrop/-/commit/bb38de506a64555d9cceca3403f4d1c62c7d6d36) refactor(flowdrop_job): narrow implicit mixed in the job entity and list builders for PHPStan level 10 — Shibin Das (2026-08-10T22:06:11.000+02:00) - [cfa45f78](https://git.drupalcode.org/project/flowdrop/-/commit/cfa45f789159beb16d9480997aff09e2811213ec) refactor(flowdrop_node_processor): narrow implicit mixed in processors for PHPStan level 10 — Shibin Das (2026-08-10T22:05:44.000+02:00) - [645939d4](https://git.drupalcode.org/project/flowdrop/-/commit/645939d4f18f09784cd85a8959b0ddb550e8710c) refactor(flowdrop_node_type): narrow implicit mixed in forms and list builder for PHPStan level 10 — Shibin Das (2026-08-10T22:05:29.000+02:00) - [7c19ed3a](https://git.drupalcode.org/project/flowdrop/-/commit/7c19ed3a8765c6befde5a595528caea562dcf82b) refactor(flowdrop_ui_components): narrow implicit mixed for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [8e08d584](https://git.drupalcode.org/project/flowdrop/-/commit/8e08d5843e30210b4b0b890196bf0c3f8f3e2988) refactor(flowdrop_playground): narrow implicit mixed in the API controller for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [41287525](https://git.drupalcode.org/project/flowdrop/-/commit/412875255b38627565df170d9ddf49ad401735e9) refactor(flowdrop_orchestration): narrow implicit mixed in the plugin manager for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [f93f5d84](https://git.drupalcode.org/project/flowdrop/-/commit/f93f5d846819d466f991b0d1772aaa3f43752b57) refactor(flowdrop_node_category): narrow implicit mixed in list builder and form for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [01f9879a](https://git.drupalcode.org/project/flowdrop/-/commit/01f9879a2290f3acaa389bf90839d775bc21c13c) refactor(flowdrop_memory): narrow implicit mixed for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [64adb4f9](https://git.drupalcode.org/project/flowdrop/-/commit/64adb4f9791b06fde39d78c834082c775747e617) refactor(flowdrop_chat): narrow implicit mixed in the LLM client for PHPStan level 10 — Shibin Das (2026-08-10T22:04:38.000+02:00) - [18e054d7](https://git.drupalcode.org/project/flowdrop/-/commit/18e054d7064769d818a77f4f9f2657a5ab220ce5) test(flowdrop): narrow implicit mixed in shared test traits for PHPStan level 10 — Shibin Das (2026-08-10T22:04:06.000+02:00) - [ab3f5624](https://git.drupalcode.org/project/flowdrop/-/commit/ab3f56245a7b4149c937737cfc56bf3c074daaeb) refactor(flowdrop): narrow implicit mixed in root services for PHPStan level 10 — Shibin Das (2026-08-10T22:03:55.000+02:00) - [17d145d4](https://git.drupalcode.org/project/flowdrop/-/commit/17d145d450fb68a563b4f03b1833c0ff9bc68280) feat(flowdrop): raise PHPStan to level 9 — Shibin Das (2026-08-10T14:40:22.000+02:00) - [01c4d059](https://git.drupalcode.org/project/flowdrop/-/commit/01c4d059664893c37139c73318a2fb863971caa5) test(flowdrop_runtime): narrow mixed flows in tests for PHPStan level 9 — Shibin Das (2026-08-10T14:35:17.000+02:00) - [9238fbf8](https://git.drupalcode.org/project/flowdrop/-/commit/9238fbf811cdf48ca437795269d2082c0a1a6043) refactor(flowdrop_runtime): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:35:17.000+02:00) - [0833220b](https://git.drupalcode.org/project/flowdrop/-/commit/0833220bcf9acba587d731ccf0291eb44d446796) refactor(flowdrop_session): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:28:56.000+02:00) - [6a9c8bb2](https://git.drupalcode.org/project/flowdrop/-/commit/6a9c8bb217978c20b70e0c67acf3daadb6bd6b25) refactor(flowdrop_stategraph): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:28:56.000+02:00) - [c7df842e](https://git.drupalcode.org/project/flowdrop/-/commit/c7df842edc8643e650a318a1f785f97058588c39) refactor(flowdrop_pipeline): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:18:14.000+02:00) - [9aa9bfd8](https://git.drupalcode.org/project/flowdrop/-/commit/9aa9bfd84a10a7c71570c6d93945be0bc769427b) refactor(flowdrop_interrupt): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:18:14.000+02:00) - [fd72fd0f](https://git.drupalcode.org/project/flowdrop/-/commit/fd72fd0f3e6ee5ea9795a5d21579d629b96503af) fix(flowdrop_node_type): guard update_10004 output-schema read for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [a041eece](https://git.drupalcode.org/project/flowdrop/-/commit/a041eeceb3fde5c9342800f0c713e245a487f25c) refactor(flowdrop_playground): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [ced50463](https://git.drupalcode.org/project/flowdrop/-/commit/ced50463a867f980df575c15620e1debfa1c72f4) refactor(flowdrop_orchestration_connector): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [339c25f4](https://git.drupalcode.org/project/flowdrop/-/commit/339c25f424876c5b2d3c32a7671ccfa6c4ef92c3) refactor(flowdrop_workflow_executor): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [8992ba7b](https://git.drupalcode.org/project/flowdrop/-/commit/8992ba7bc0052c1bf50fc866e3de7db14ea780d3) refactor(flowdrop_memory): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [5b2ba7e6](https://git.drupalcode.org/project/flowdrop/-/commit/5b2ba7e651320f784b865bd54007ca4d99b3b807) test(flowdrop_node_processor): narrow mixed flows in tests for PHPStan level 9 — Shibin Das (2026-08-10T13:43:43.000+02:00) - [336d0d93](https://git.drupalcode.org/project/flowdrop/-/commit/336d0d9357ade1652be2d61409d1317ee0519dea) refactor(flowdrop_node_processor): narrow mixed flows in processors for PHPStan level 9 — Shibin Das (2026-08-10T13:43:43.000+02:00) - [f3e4a6c2](https://git.drupalcode.org/project/flowdrop/-/commit/f3e4a6c297acec2c092d2b72e566974c70f0634c) refactor(flowdrop): type the processor schema surface for PHPStan level 9 — Shibin Das (2026-08-10T13:43:43.000+02:00) - [36cbf1b5](https://git.drupalcode.org/project/flowdrop/-/commit/36cbf1b5685728b43ac14214c2007d416aae3465) test(flowdrop_workflow): narrow mixed flows in tests for PHPStan level 9 — Shibin Das (2026-08-10T13:37:28.000+02:00) - [55a343d5](https://git.drupalcode.org/project/flowdrop/-/commit/55a343d574fe68efb9451d97ba47da244a9515bc) refactor(flowdrop_workflow): narrow mixed flows in forms and hooks for PHPStan level 9 — Shibin Das (2026-08-10T13:37:28.000+02:00) - [9b46a6bd](https://git.drupalcode.org/project/flowdrop/-/commit/9b46a6bdc0227655605f0494cf91e1d51701b270) refactor(flowdrop_node_type): narrow mixed flows in forms and generator for PHPStan level 9 — Shibin Das (2026-08-10T13:29:42.000+02:00) - [1a960d83](https://git.drupalcode.org/project/flowdrop/-/commit/1a960d836d060a36256b54928b462534b2db0b68) refactor(flowdrop): narrow mixed flows in root module for PHPStan level 9 — Shibin Das (2026-08-10T13:24:45.000+02:00) - [86d01c77](https://git.drupalcode.org/project/flowdrop/-/commit/86d01c77fab38f5d8c8ace78a9000d9c45583eea) refactor(flowdrop_trigger): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T13:04:50.000+02:00) - [86a2263a](https://git.drupalcode.org/project/flowdrop/-/commit/86a2263ab684fc607a4310f884e3d6531b8aa545) test(flowdrop_node_type): narrow mixed flows in tests for PHPStan level 9 — Shibin Das (2026-08-10T13:04:29.000+02:00) - [3fbed819](https://git.drupalcode.org/project/flowdrop/-/commit/3fbed819c97dfc1a1e616c5713fb5a8d8195412b) test(flowdrop): extract array assertions trait, seal NodeMetadata toArray shapes — Shibin Das (2026-08-10T13:04:29.000+02:00) - [f5bb7a44](https://git.drupalcode.org/project/flowdrop/-/commit/f5bb7a448f3b49c92dfad7d003140e25bc946b3a) refactor(flowdrop_workflow): narrow mixed flows in services for PHPStan level 9 — Shibin Das (2026-08-10T13:00:09.000+02:00) - [6cd1a6cf](https://git.drupalcode.org/project/flowdrop/-/commit/6cd1a6cf0d4bf0f9b2aa68cf5f904be1e4bd3027) refactor(flowdrop_workflow): flip getNodes()/getEdges() to shaped returns — Shibin Das (2026-08-10T13:00:09.000+02:00) - [ca483f10](https://git.drupalcode.org/project/flowdrop/-/commit/ca483f108739cf008a9b00d2e22d63c457c31914) refactor(flowdrop_ui_components): narrow config and render flows for PHPStan level 9 — Shibin Das (2026-08-10T12:58:48.000+02:00) - [9309f6ac](https://git.drupalcode.org/project/flowdrop/-/commit/9309f6aca08eeb983a9e1e747c43e1c163eb1a82) refactor(flowdrop_orchestration): type snapshot DTO hydration for PHPStan level 9 — Shibin Das (2026-08-10T12:58:48.000+02:00) - [a3d48394](https://git.drupalcode.org/project/flowdrop/-/commit/a3d48394a9c5cebdfd8890d8db8e652054be03bb) refactor(flowdrop_job): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T12:58:48.000+02:00) - [79e96290](https://git.drupalcode.org/project/flowdrop/-/commit/79e962903eb17880a8a26819181d971f20893b97) refactor(flowdrop_chat): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T12:58:48.000+02:00) - [c1f275be](https://git.drupalcode.org/project/flowdrop/-/commit/c1f275be1621d33130aa8544cd0e6a4218991f37) refactor(flowdrop_workflow): define raw stored workflow shape aliases for PHPStan level 9 — Shibin Das (2026-08-10T12:31:41.000+02:00) - [deb6ea4d](https://git.drupalcode.org/project/flowdrop/-/commit/deb6ea4d498cca5a56fa9ada54654632494fdc87) refactor(flowdrop_node_type): type node-metadata producers for PHPStan level 9 — Shibin Das (2026-08-10T12:30:25.000+02:00) - [21c99583](https://git.drupalcode.org/project/flowdrop/-/commit/21c99583175a469ccfcdebda9070b3cbcd6aefa7) refactor(flowdrop): type root DTO hydration for PHPStan level 9 — Shibin Das (2026-08-10T12:22:07.000+02:00) - [f1d459f7](https://git.drupalcode.org/project/flowdrop/-/commit/f1d459f7d2c02654d3e5c1bbfeccd067846edee1) test(flowdrop): type FlowDropKernelTestTrait for PHPStan level 9 — Shibin Das (2026-08-10T12:15:49.000+02:00) ======================================================================== ## [12] summariseModule:langfuse:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Langfuse (machine name: langfuse) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Abhisek Mazumdar (abhisekmazumdar) [1]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                      Langfuse

                      then use

                      ,

                      ,

                        /
                      • , and as needed. Output only the HTML fragment with no surrounding , , or
                        tags. After the project summary prose, add a single subsection titled "

                        How can I help on this project?

                        " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). (none) --- MERGE REQUESTS (24h) --- ### [Issue #3548465: Add createScore() for feedback and a langfuse_feedback submodule](https://git.drupalcode.org/project/langfuse/-/merge_requests/6) State: merged 2026-08-10 | Author: Abhisek Mazumdar (abhisekmazumdar) | Branch: 3548465-implement-feedback | 814 diff lines Description: Closes #3548465 --- COMMITS (24h) --- - [ff44ae0a](https://git.drupalcode.org/project/langfuse/-/commit/ff44ae0ae9b3d63940ac7c51f704789763ca63fe) Issue #3548465: Add createScore() for feedback and a langfuse_feedback submodule — Abhisek Mazumdar (2026-08-10T10:13:42.000+00:00) ======================================================================== ## [13] summariseModule:agui:developer ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AG-UI (machine name: agui) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a technical developer audience. Focus on: what was merged or shipped, specific bugs fixed, APIs changed, and what is blocking progress. Be specific — mention function names, module names, and MR references where relevant. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. Do not name any individual people in this section. No one was active enough this period to list. Format your response as an HTML fragment. Start with

                        AG-UI

                        then use

                        ,

                        ,

                          /
                        • , and as needed. Output only the HTML fragment with no surrounding , , or
                          tags. After the project summary prose, add a single subsection titled "

                          How can I help on this project?

                          " aimed at a developer. Suggest 2-3 concrete technical actions a contributor could take right now. Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, check the data for each issue: - If an issue shows a Related MR with state 'opened', do NOT suggest creating a patch or MR — one already exists. Suggest reviewing it instead. - If all Related MRs for an issue are merged, do NOT suggest reviewing them — they are already done. - If an issue is unassigned with no Related MRs, it is a good candidate to pick up. - Only suggest actions that are genuinely still needed given the current state in the data above. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [chunkDelay/chunkPadding applied per-event compounds into real latency/timeout risk on long or tool-heavy runs](https://git.drupalcode.org/project/agui/-/work_items/3590049) State: opened | Updated: 2026-08-10 | Author: Bryan Sharpe (b_sharpe) | Assigned: unassigned | Labels: Description: **What we found:** sendSseEvent() applies the full configured chunkPaddingSize and chunkDelayMicroseconds to every SSE event — not just TEXT_MESSAGE_CONTENT chunks, but also TOOL_CALL_START/ARGS/END/RESULT, RUN_STARTED, RUN_FINISHED, etc. For an agent that makes several tool calls per turn plus a streamed text response, that overhead compounds linearly with the number of events — in our case, 80ms + 4096 bytes per event across a few dozen events added several seconds and a few hundred KB of pure artificial overhead to a single response, on top of real LLM latency. That matters because… --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [14] generateTldr:developer ======================================================================== You are an editor distilling a Drupal AI project newsletter into its most important highlights. You are writing for a technical developer audience. Be specific — name modules, merged features, and critical bugs. Read all the module summaries below. Separate the highlights into two categories: - SHIPPED: things that were merged, fixed, released, or completed during this period. - ONGOING: things that are actively in progress, under review, or blocked. Be specific — name the module, what happened, and why it matters. Do not use emoticons or mdashes. Do not include any text outside the two sections. When you mention a specific issue or merge request, add an inline citation using [N] where N is the reference number from the list below. You may cite multiple references per item, e.g. [1][3]. Place citations immediately after the relevant phrase, before any punctuation. Format as two HTML sections. Use exactly this structure (all
                        • elements must be inside the
                            , never outside it):

                            Shipped

                            1. Title here — One sentence explanation [1].
                            2. Another title — One sentence explanation.

                            Ongoing

                            1. Title here — One sentence explanation [2].
                            Up to 5 items per section. Do not output any text, tags, or characters outside these two sections. Output only the HTML fragment, no surrounding tags. --- REFERENCE LIST --- [1] Add AIDmi to Other modules/recipes that work with the AI module (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586566 [2] Drupal AI Contribution meeting 2026-08-10 (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586662 [3] Drupal AI Contribution meeting 2026-07-27 (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586618 [4] Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{ context }} and {{ raw_context }} before they reach the provider (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586661 [5] If only one tool, cannot delete it, gives an error: Undefined array key 1 in Drupal\ai\Element\ToolsLibrary::processToolsLibrary() (line 89 of modules/contrib/ai/src/Element/ToolsLibrary.php) & more (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586652 [6] Chatbot closes itself when adding a modal (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3499451 [7] Document FunctionalJavascript test conventions and add CI check for ungrouped/unrecorded tests (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3582633 [8] `AiReranker::extractItemText()` should prefer chunk text over configured indexed fields (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586637 [9] Add thumbs-up and thumbs-down icons to the shared AI icon set (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586660 [10] ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586425 [11] LLM: Text / LLM: Text (simple) automators silently drop Base Field content when Base Field and Target Field are both long-text types (Basic input mode) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586659 [12] [PLAN] Propagate and enforce an explicit executor for sessionless, queued, and outside-in AI runs (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3573899 [13] Issue #3586475: Rename the RegExp Guardrail labels to RegEx (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1689 [14] bug: #3586661 Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1924 [15] #3582633: Add Functional JavaScript testing conventions and validation script (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1432 [16] Resolve #3586495 "Add support embeddings via symfony/ai" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1856 [17] Drupal AI UX meeting 10 August 2026 (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586608 [18] Update AI partner badges to use Partner instead of Sponsor (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586636 [19] Communication Binarywork to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586718 [20] Communication Genero inc to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586720 [21] Communication Smile to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586719 [22] Communication Evolvingweb to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586717 [23] Communication Digital polygon to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586716 [24] Communication Sparkfabrik to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586715 [25] Communication Promet source to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586714 [26] Communication Redhat to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586713 [27] Communication Omedia to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586712 [28] Communication Faktorial to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586711 [29] Communication NTTdata to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586710 [30] Communication Swis to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586709 [31] Communication Hintogroup to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586708 [32] Communication Mobomo to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586707 [33] Communication Kadabra IT to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586706 [34] Communication EPAM joining (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586705 [35] Communication iTech4Web (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586704 [36] Call Pronovix to join (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586703 [37] Call Zivtech to join Initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586702 [38] Communication Joshi consulting (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586701 [39] Communication Civiactions (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586700 [40] Call IOgroup CEO (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586699 [41] Call 2 calibrate (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586698 [42] Call 1 calibrate (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586697 [43] Call with Oomph (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586696 [44] Communication with Specbee (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586695 [45] Call with Cambridge press (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586694 [46] Call with Reading room to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586693 [47] Went to see Vesa from Wunder in Cascais to join AI initaitive (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586691 [48] Met with team Mearra in Athens (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586692 [49] Call 2 with Drupalforge (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586690 [50] Call 1 with drupalforge (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586689 [51] Call/mail with Yorgos E-sepia (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586688 [52] Call with integral vision (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586687 [53] Call with Brainsum (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586686 [54] Call with Optasy (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586685 [55] Call with wolfgang Drunomics (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586684 [56] Call with Kalamuna (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586683 [57] Call 2 with Josh from Pantheon (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586682 [58] Call 1 with Josh from Pantheon (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586681 [59] Call with Esinergia (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586680 [60] Call with Aidan Foster interactive (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586679 [61] [META] 2026 AI Inside Roadmap to DrupalCon Rotterdam 2026 (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586657 [62] Create a skill for manual before/after testing of any issue, with optional glab upload (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586629 [63] Token Auth is not working (mcp, Issue) — https://git.drupalcode.org/project/mcp/-/work_items/3584901 [64] Add OAuth Scope Validation for MCP Authentication (mcp, Issue) — https://git.drupalcode.org/project/mcp/-/work_items/3569845 [65] MCP Server: Entity Seeder uses wrong type for content (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586031 [66] Make it possible to restrict the order of tools during agent executions (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3560681 [67] Use the `ai_json_schema` editor for the AI Agent structured-output schema field (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586042 [68] Explore export/sync plugin system for AI Agents to external agent platforms (Claude Code, VAPI, etc.) (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3577241 [69] ContentEntitySeeder stores multi-property field values as Array (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/345 [70] Issue#3586025:GetEntityFieldInformation-Leaks-Target_entity_type-Target_bundle... (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/344 [71] Issue (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/343 [72] Issue3569280:AI-Agents-Explorer-Chat-Generation-Does-Not-Support-Series-Models fixes (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/342 [73] Issue#3566126:Force-Value-Dropped-Tool-Property-Restrictions fixes. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/341 [74] Issue #3560681: Add per-tool execution ordering constraints for agent loops. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/252 [75] Issue#3565169:Schema-Error-AI-Agents-CKEditor-Plugin fixes. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/340 [76] #3586042: Use the ai_json_schema editor for the structured output schema field. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/298 [77] Issue #3586042 Use the `ai_json_schema` editor for the AI Agent structured-output schema field (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/284 [78] test: #3586021 Add regression test for ai_agent plugin cache invalidation (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/337 [79] Bare regex patterns are dropped from emitted JSON Schemas (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582987 [80] Define checkRequirements() as a configuration-time signal (indicator + add-prevention), not a runtime gate (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582975 [81] ToolBase's promoted $logger property conflicts with subclasses declaring their own logger (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582986 [82] SchemaToolsPropertyConverter fatals on empty-map schemas: \ArrayObject reaches ToolsPropertyInput's array-typed setters (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582985 [83] tool_ai_connector: ToolPluginBase::getReadableOutput() fatals when wrapped tool has no result object (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582941 [84] fromDataDefinition() breaks on plain typed-data lists and unlabeled definitions (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582984 [85] Coerce JSON numbers to strings for decimal inputs (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582983 [86] Complete kernel coverage of the typed input/output traits and definition pipeline (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582974 [87] Rework the tool execution contract: result naming, concrete typing, and decoupling from core ExecutableInterface (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582964 [88] Correct API signatures before the RC1 freeze (batch) (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582962 [89] Implement getCacheContexts() or drop CacheableDependencyInterface from ToolInterface (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582965 [90] Prefix module-owned identifiers: alter hook, cache key, and 'text' data type ID (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582963 [91] Move orphaned "FieldExistConstraint' and 'FieldExistsConstraintValidator' to Tool Belt. (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582951 [92] ListInputDefinition item values are never validated (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582982 [93] Make violation messages translatable and stop surfacing raw exception text (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582971 [94] ToolBase::access() throws on invalid/missing input instead of returning forbidden (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582961 [95] Non-array value for a map input throws instead of failing validation (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582981 [96] validateInputValue() only validates the first item of a multiple input (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582960 [97] Extend input coercion for unambiguous LLM value shapes (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582973 [98] Emit richer JSON Schema: map remaining constraints and type formats (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582972 [99] Write documentation and enable project pages (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582955 [100] Create a skill for generating Tool plugins (best practices, how-to, placement) (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582945 [101] [META] Tool API - Path to Beta and Inclusion in AI (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3558327 [102] Proposal: make Tool's declarations introspectable over the CLI, and enrich input schema (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582943 [103] Introduce support for Discovery, Planning and Execute calls for MCP and Agents (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3546292 [104] fix: #3582986 require the logger channel and document the subclass redeclaration contract (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/128 [105] fix: #3582985 cast ArrayObject schema values to arrays before building AI tool properties (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/127 [106] Fix fromDataDefinition: fall back for missing labels and toArray type keys. (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/126 [107] Resolve "Coerce JSON numbers to strings for decimal inputs" (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/125 [108] Enforce checkRequirements() in execute() and exclude unmet tools from the AI function list. (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/124 [109] Add kernel coverage: locked/configuration inputs, refiner flow, definition... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/123 [110] fix: #3582964 own execution contract: result value interfaces, accessors on... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/122 [111] fix: #3582947 tool_ai_connector does not handle tools returning list of entities (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/96 [112] fix: #3582962 correct API signatures: factory overrides, null context values,... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/121 [113] fix: #3582965 drop the unimplemented cacheability contract from ToolInterface (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/120 [114] fix: #3582963 prefix the adapter alter hook and cache key; keep the generic... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/119 [115] fix: #3582982 validate list definition items and name failing positions (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/118 [116] Make input violation messages translatable; log unexpected exceptions instead... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/117 [117] fix: #3582961 fail closed when tool input is invalid or missing (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/113 [118] Rethrow un-storable input values as InputException naming the input. (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/116 [119] fix: #3582960 validate every multiple input item (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/112 [120] Extend input coercion: JSON-string structures, enum near-misses, datetime... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/115 [121] Resolve "Emit richer JSON Schema: map remaining constraints and type formats" (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/114 [122] Canvas AI: Add a dev page builder agent and wire the placement tools (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591921 [123] Canvas AI: Expose Props of Blocks to the Agent (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3569120 [124] Canvas AI: page builder discards the whole build when the LLM names a region that does not exist (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591876 [125] Header region height is calculated incorrectly in Canvas editor (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591935 [126] Dependency Dashboard (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591657 [127] Add component label to settings form (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591934 [128] Fix cache contexts being added as cache tags in ContentTemplate::normalizeForClientSide() (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591933 [129] Canvas AI: Client-side orchestration loop for Canvas AI(POC) (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591615 [130] canvas_test_code_components_content_entity_ref config/install fields conflict on the standard profile (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591869 [131] Enforce "Delete Translations" permission on the Canvas API translation delete route (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591784 [132] Align Canvas UI translation operations and access with content_translation/TMGMT (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591932 [133] Apply saved config language override to auto-saved versions in layout (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3583043 [134] Stage Canvas autosaves in a dedicated Workspace (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3588540 [135] Multi-bundle content-entity-reference picks reading multiple fields per bundle coalesce into an unrenderable object (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591873 [136] Expand conflict detection and resolution entity types other than Page (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591544 [137] Missing upgrade path: stored `default-relative-url` prop sources written before 1.8 contain `$id` and fail `DefaultRelativeUrlPropSource::parse()` (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591904 [138] Array prop shapes don't inherit their item shape's cache tags, so prop-shape invalidation misses them (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591917 [139] Automatically create components when themes are installed (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591898 [140] Docs oriented to recipe authors integrating with Canvas (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3564135 [141] Allow Canvas Patterns+PageRegions+ContentTemplates provided by Recipes to NOT specify component versions (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3571366 [142] component_tree sequence keys sorted lexicographically instead of numerically, breaking component order at 10+ instances per level (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3582200 [143] Strengthen AutoSaveManager to generate stable hashes (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591785 [144] Checkmark and options menu disappear from LanguageSelect on preview page refresh (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591798 [145] Publishing a symmetrically-translated canvas_page 422s when a default-language edit changes a non-translatable component input (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591820 [146] Prefix-strip redirect misses default-language prefixes and is overridden by ?destination (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591839 [147] PHPStan failing on global $argv usage (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591931 [148] Code editor: developers cannot see what a content-entity-reference prop delivers to their component (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591805 [149] PHPStan rule: needs*() config detectors must not mutate the entity they inspect (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591855 [150] Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3581133 [151] Canvas AI: Add Tools dropdown to chat UI (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591856 [152] [upstream] Data loss: `drush config:import` deletes config (e.g. code component + component config entities) and bypasses config system data integrity checks (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3573022 [153] fix: #3591876 Validate the target region before placing components (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1423 [154] chore(deps): update dependency cspell to v10 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1273 [155] chore(deps): update dependency @eslint/compat to v2 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1306 [156] chore(deps): update dependency @chromatic-com/storybook to v5 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1305 [157] fix(deps): update npm minor and patch (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1238 [158] chore(deps): update mysql docker tag to v8.4 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1272 [159] #3591838 [PHASE 2] introduce color props (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1432 [160] Draft: #3591838 Phase 3: Usage data + deletion (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1479 [161] Add the entity type's list cache contexts as cache contexts, not as cache tags. (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1486 [162] Add a entity reference prop data shape preview to code editor (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1351 [163] task: #3567225 Make the component tree loader extensible (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/948 [164] bug: #3591839 Preserve the query string when stripping the language prefix; a... (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1387 [165] Resolve multi-bundle CER picks reading several fields per bundle (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1431 [166] #3591869: Provide the code-components content-entity-ref test module's shared fields via a recipe so it installs on any profile (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1414 [167] Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1376 [168] #3591784: Revert MR !1342 "delete content translations" permission requirement (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1398 [169] #3591917 Array prop shapes inherit their item shape's cache tags (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1475 [170] #3591851: Allow editing stored patterns (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1403 [171] fix(ui): #3591716 boolean props auto-enable when another prop is changed (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1285 [172] fix(ui): #3591716 boolean props auto-enable when another prop is changed (1.6.0) (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1286 [173] refactor(Conflict resolution): #3591785 Strengthen AutoSaveManager to generate stable hashes (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1356 [174] fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1363 [175] feat: #3518272 support all entity types with configurable displays for content templates (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/791 [176] fix: #3591931 Do not rely on $argv being a global (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1485 [177] #3591875: "Translatable props missing from TMGMT form when component instances cannot be auto-updated to active version" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1418 [178] Add PHPStan rule: needs*() config detectors must not mutate the entity they inspect (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1416 [179] #3581133: Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1297 [180] Resolve #3591907 "Balance cypress E2E parallel split by runtime weight" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1463 [181] Add context item Priority field and use it for selection ordering (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586376 [182] Remove max_items context limit and rely on the token budget (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586378 [183] Clarify and stabilize the scope plugin extension boundary for 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586392 [184] Align scope scoring, language service, and contextual selection behavior (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586388 [185] CCC QA scripts for 1.0 testing (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586226 [186] Redesign selection modes as a nested Minimal / Relevant / Broad ladder and remove match_all (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586394 [187] Switch CCC documentation link to clean version (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586370 [188] Document real-world use cases for CCC 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586372 [189] Document how to use RAG with CCC 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586371 [190] Resolve `use_default` provider config for conditional subcontext selection (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586391 [191] Implement plugin-based generic context consumers and unified consumer configuration (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586346 [192] Persist context-item token counts and show token-budget usage in CCC UI (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586379 [193] "Global context" checkbox description renders a literal
                            instead of a line break (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586369 [194] Install `target_entities` field storage when Dynamic Entity Reference is enabled on existing sites (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586375 [195] Document the AI Context role and permission matrix for 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586395 [196] Create multi-vocabulary taxonomy scope plugin (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586237 [197] Pre-1.0 context selection reliability and diagnostics follow-up to issue 3586363 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586383 [198] Issue #3586376: Add context item priority field and selection tie-breakers. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/245 [199] Issue #3586392: Clarify and stabilize scope plugin extension boundary for 1.0. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/249 [200] Issue #3586388: Align scope scoring and contextual detection. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/242 [201] Issue #3586378: Remove max_items context limit and rely on token budget. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/244 [202] Issue #3586372: Document real-world use cases for CCC (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/256 [203] Issue #3586371: Document how to use RAG with CCC (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/255 [204] Issue #3586379: Persist token counts and show budget usage in CCC UI. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/248 [205] Issue #3586395: Document the AI Context role and permission matrix for 1.0. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/254 [206] Issue #3586375: Install target_entities storage when DER is enabled later. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/251 [207] Issue #3586383: Pre-1.0 context selection reliability and diagnostics follow-up. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/252 [208] Feature: Translation result caching and cross-field deduplication (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585529 [209] Update translation cropping (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3479612 [210] Compatible with Address module (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3468992 [211] one-click link should show human name, not machine name (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3580314 [212] backport: one-click link should show human name (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585535 [213] Refactor translation workflow to support Tool API and agent-driven translation (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585523 [214] Auto-translate referenced taxonomy terms (and other translatable entities) when translating a node (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585539 [215] AI Translate: Issue with translating blocks which has language code as und on layout builder page (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3567453 [216] Translation seems to affect workflow (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3472755 [217] Classes fail to resolve correctly in unit tests because of ai_translate variant in AI core module (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585544 [218] [META] AI Translation — DrupalCon Rotterdam 2026 demo (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585543 [219] Recipe: translate Drupal AI Demo content to Spanish, German, and French (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585542 [220] Add ai_translate-specific issue and merge request templates (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585541 [221] InvalidArgumentException: Invalid translation language (und) when translating media entities (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585532 [222] feat: #3585541 Add ai_translate-specific issue and merge request templates (ai_translate, MR) — https://git.drupalcode.org/project/ai_translate/-/merge_requests/38 [223] Issue #3548465: Add createScore() for feedback and a langfuse_feedback submodule (langfuse, MR) — https://git.drupalcode.org/project/langfuse/-/merge_requests/6 [224] chunkDelay/chunkPadding applied per-event compounds into real latency/timeout risk on long or tool-heavy runs (agui, Issue) — https://git.drupalcode.org/project/agui/-/work_items/3590049 --- MODULE SUMMARIES ---

                            AI (Artificial Intelligence)

                            The past 24 hours brought steady progress across several fronts, though most work remains in review. A critical bug was identified where Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{ context }} and {{ raw_context }} before they reach the provider. The issue stems from Drupal's HTML autoescaping in the Twig environment, which double-escapes entities and strips HTML from tokens meant to carry raw content. An open MR addresses this.

                            Two related bugs affecting automators and search were also reported: LLM: Text / LLM: Text (simple) automators silently drop Base Field content when Base Field and Target Field are both long-text types, and AiReranker::extractItemText() should prefer chunk text over configured indexed fields. The latter causes chunk-mode retrieval to rerank against full entity text rather than individual chunks.

                            A fix for Undefined array key errors when deleting the only tool in ToolsLibrary::processToolsLibrary() reached RTBC status. The ai_ckeditor streaming issue with Gemini 2.x models remains under investigation.

                            How can I help on this project?

                            Review MR !1924 addressing the Twig autoescaping corruption bug. Pick up the Base Field content dropping issue or the Gemini streaming 400 error, both unassigned with no open patches. Test the RTBC ToolsLibrary fix and help move it to merge.

                            Contributors: Abhisek Mazumdar (abhisekmazumdar), Adrian McKee (Adrianm6254), Aidan Foster (aidanfoster), Ann Mary Sruthy (annmarysruthy), Eric Homanchuk (erichomanchuk), Mike Feranda (mferanda), Prabhavathi Vanipenta (prabha1997), Rob Loach (robloach), Scott Euser (scotteuser), Shivam Sen (shivamsen_12579), Valery Lourie (valthebald), drupalbot, josecarlosmedero ---

                            Drupal AI Initiative

                            Over the past 24 hours, activity in the Drupal AI Initiative centered on partnership outreach and planning for the Rotterdam demo. A large volume of partner communication issues were closed, documenting outcomes from recent outreach efforts. Several organizations have joined the initiative as partners, while others remain under consideration or declined.

                            A UX working group meeting took place on August 10, focusing on the 2026 AI Inside Roadmap to DrupalCon Rotterdam 2026. The meeting reviewed the roadmap structure, discussed the EU AI Act Article 50 disclosure requirements, and planned demo content and theming strategy. Demo content structure and volume requirements were identified as a key focus area.

                            Design work is underway to Update AI partner badges to use Partner instead of Sponsor across three badge levels (founding, gold, and silver), reflecting the collaborative nature of the initiative's partnerships. The task has been assigned to the design team.

                            No merge requests were merged or commits pushed during this period. Planning and organizational tasks dominated the day's activity.

                            How can I help on this project?

                            Review and contribute to the Rotterdam roadmap planning, particularly around demo content requirements. Pick up Create a skill for manual before/after testing of any issue, with optional glab upload to help improve the developer experience for issue review workflows.

                            ---

                            Model Context Protocol

                            The MCP module saw no merge activity or commits during this period. Two authentication-related issues remain under active discussion. The Token Auth is not working issue covers two problems: a #states selector incorrectly targeting :input[name="enable_token_auth"] instead of :input[name="auth_settings[enable_token_auth]"], preventing the token configuration UI from appearing; and a separate functional issue with token validation even when properly configured. Meanwhile, Add OAuth Scope Validation for MCP Authentication addresses the lack of scope restrictions when MCP clients authenticate to the server, which currently accepts all requested dynamic scopes without validation or configuration options.

                            Both issues are assigned and tagged for sprint work, but no merge requests or patches have been submitted yet. The token authentication problem blocks proper configuration of token-based auth workflows, while the OAuth scope issue represents a security hardening opportunity.

                            How can I help on this project?

                            ---

                            AI Agents

                            The module saw no commits merged during this period, but several merge requests advanced. Work continued on cleaning up field-value handling bugs: ContentEntitySeeder stores multi-property field values as Array (MR !345) addresses an issue where the content entity seeder tool drops one level of nesting when storing multi-property field values, causing literal "Array" strings to be written instead of the intended data structure. This affects the MCP server's ability to create content.

                            Improvements to the AI Agent configuration UI also progressed. #3586042: Use the ai_json_schema editor for the structured output schema field (MR !298) replaces the plain textarea for structured-output JSON schemas with the dedicated ai_json_schema CodeMirror element, adding syntax highlighting and JSON linting. The MR wires up config-level validation, modeller schema resolution via getPluginSchemaKey(), and fixes visibility toggling.

                            Six additional merge requests addressing tool output bugs, model compatibility, and plugin cache invalidation were opened. One issue closed during the period: Explore export/sync plugin system for AI Agents to external agent platforms.

                            How can I help on this project?

                            Review MR !345 (ContentEntitySeeder field values) or MR !298 (JSON schema editor) for correctness and test coverage. Help define tool-ordering constraints in MR !252 by testing with real agent workflows.

                            Contributors: Ahmad Khader (Ahmad-Khader), Bharat Kelotra (bharatkelotra), Joshua Fernandes (joshua1234511), Prabhavathi Vanipenta (prabha1997) ---

                            Tool API

                            The Tool API module merged a major batch of API finalization work ahead of the RC1 freeze, addressing signature corrections, execution contract rework, and input/output pipeline hardening. Sixteen merge requests landed in the reporting period, covering bugs, contract gaps, and schema enhancements.

                            Several critical bugs in the typed input/output traits were resolved: validateInputValue() only validates the first item of a multiple input was fixed to validate all items; ListInputDefinition item values are never validated now properly validates list items and names failing positions; and Non-array value for a map input throws instead of failing validation now rethrows storage exceptions as InputException with proper context.

                            API contracts were corrected in Correct API signatures before the RC1 freeze (batch), fixing factory overrides, null context values, and return type unions. Rework the tool execution contract introduced ExecutableResultValueInterface and renamed ExecutableResultInterface to ExecutableHasResultInterface. Implement getCacheContexts() or drop CacheableDependencyInterface from ToolInterface dropped the unimplemented cacheability contract. Prefix module-owned identifiers renamed hook_data_type_adapter_info_alter to hook_tool_data_type_adapter_info_alter and prefixed cache keys.

                            Schema and coercion improvements shipped: Emit richer JSON Schema added PCRE-to-ECMA pattern conversion, datetime formats, and constraint mapping; Extend input coercion for unambiguous LLM value shapes added JSON-string structure parsing, enum near-miss handling, and datetime coercion; Coerce JSON numbers to strings for decimal inputs handles numeric-to-string conversion in InputTypeCoercionSubscriber.

                            Integration and compatibility fixes included: SchemaToolsPropertyConverter fatals on empty-map schemas now casts ArrayObject to arrays before building AI tool properties; ToolBase's promoted $logger property conflicts with subclasses documented the redeclaration contract; fromDataDefinition() breaks on plain typed-data lists and unlabeled definitions added fallbacks for missing labels.

                            Make violation messages translatable and stop surfacing raw exception text replaced sprintf() with t() and added logger injection. ToolBase::access() throws on invalid/missing input now fails closed and returns forbidden AccessResult instead of throwing. Complete kernel coverage added 752 lines of test coverage for locked/configuration inputs and the definition pipeline. Define checkRequirements() as a configuration-time signal enforces requirements in execute() and excludes unmet tools from AI function lists.

                            A new issue was opened: Bare regex patterns are dropped from emitted JSON Schemas, which affects tools using undelimited PCRE patterns.

                            How can I help on this project?

                            Investigate and fix Bare regex patterns are dropped from emitted JSON Schemas, where convertPcreToEcma() incorrectly treats bare patterns as delimited. Contribute to Proposal: make Tool's declarations introspectable over the CLI by designing or implementing Drush commands for tool discovery and schema output.

                            Contributors: Ajit Shinde (ajits), Alex Urevick-Ackelsberg (alexua) [2], Michael Lander (michaellander) [15]

                            ---

                            Drupal Canvas

                            Canvas focused on cache integrity, data health, and developer tooling this period. A cache-context bug was fixed where ContentTemplate::normalizeForClientSide() incorrectly registered list cache contexts as cache tags — for example, user.node_grants:view appeared in cache tags and was never invalidated. A parallel fix merged ensuring array prop shapes now inherit cache tags from their item shapes, closing a gap where multi-value field-backed components missed invalidation when field config changed.

                            Several closed issues hardened data integrity. Canvas test module config/install field conflict on the standard profile was resolved by moving shared field definitions into a recipe. Publishing symmetrically-translated canvas_page 422s was fixed by synchronizing non-translatable component inputs before validation. A PHPStan rule was added to prevent needs*() config detectors from mutating inspected entities, catching a class of silent data corruption. The component_tree sequence-key lexicographic sort bug (breaking order at 10+ instances) was closed.

                            A new MR opened for color props, introducing a freeform/brand-kit mode widget. Editing stored patterns merged, allowing component addition, removal, and renaming. Cypress E2E parallel split was rebalanced by runtime weight, cutting the slowest node by ~25%. Header region height calculation regression since 1.9.0 was reported but remains open. Page builder region-name validation has an open MR proposing graceful degradation instead of full-build abort.

                            How can I help on this project?

                            Test the region validation MR against the AI page builder to verify graceful fallback. Investigate and patch the header region height regression in 1.9.0+. Review the cache contexts fix MR for ContentTemplate.

                            Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Adam G-H (phenaproxima), Alamgir Hossain (alamgir.hossain.cse), Ben Mullins (bnjmnm), Christian López Espínola (penyaskito) [1], Dave Long (longwave), Feliksas Mazeikis (f.mazeikis), Fons Vandamme (f0ns), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Nodar Davituri (Davituri), Rajab Natshah (RajabNatshah), Ted Bowman (tedbow), Tim Plunkett (tim.plunkett) [1], Wim Leers (wimleers)

                            ---

                            Context Control Center (CCC)

                            The max_items configuration limit has been removed in favor of relying solely on the token budget for context selection. The Remove max_items context limit and rely on the token budget work eliminates the overlapping UX complexity of configuring both max_items and max_tokens, with the token budget now serving as the primary module-wide limit. This change touched configuration schemas, forms, validation logic, selection code, and tests across 3093 diff lines.

                            Documentation work also merged: the AI Context role and permission matrix for 1.0 is now complete, covering permissions for context consumers, authors, editors, and administrators, including editorial workflow transition permissions.

                            Several opened merge requests are awaiting review for 1.0 readiness. MR !245 adds a Priority field to context items for explicit editorial control over selection ordering, replacing the opaque changed timestamp tie-breaker. MR !242 aligns scope scoring, language handling, and contextual filtering for predictable selection behavior. MR !248 implements token count persistence and budget usage indicators in the UI.

                            Progress is blocked on scope scoring alignment and related work, which have merge ordering dependencies that need resolution.

                            How can I help on this project?

                            Review MR !245 on priority field selection ordering, MR !242 on scope scoring alignment, or MR !248 on token budget UI. Help develop QA test scripts for the 1.0 testing issue, which has no open MRs and needs testing documentation.

                            Contributors: Abhinav Jha (ajabhinavjha30), Kristen Pol (kepol) [2]

                            ---

                            AI Dashboard

                            The AI Dashboard module saw a single commit during the reporting period. A fix for description font size was committed, addressing Issue #3585223. No merge requests were merged, and no issues saw comment or status activity in the last 24 hours.

                            How can I help on this project?

                            Review the issue queue for unresolved bugs or feature requests that need attention. Help triage or reproduce reported issues. Contribute test coverage or documentation improvements to strengthen the module's stability and adoption.

                            Contributors: Rob Loach [1]

                            ---

                            AI translate

                            Activity this period focused on planning and issue triage for the DrupalCon Rotterdam 2026 demo. A new meta issue, [META] AI Translation — DrupalCon Rotterdam 2026 demo, was opened to coordinate end-to-end multilingual translation functionality for the Drupal AI Demo corpus. Supporting issues were created covering Recipe: translate Drupal AI Demo content to Spanish, German, and French and Add ai_translate-specific issue and merge request templates, with an MR opened for the latter.

                            Several new bugs and feature requests were filed. InvalidArgumentException: Invalid translation language (und) when translating media entities was tagged as a Quick Win and proposes a fix to EntityIsTranslatable::validateTranslatability(). Classes fail to resolve correctly in unit tests because of ai_translate variant in AI core module describes PSR-4 autoloader conflicts caused by the deprecated ai_translate submodule bundled in the parent AI project. Feature requests include Translation result caching and cross-field deduplication to avoid re-translating unchanged content, Auto-translate referenced taxonomy terms, and Refactor translation workflow to support Tool API and agent-driven translation.

                            How can I help on this project?

                            Pick up the Quick Win InvalidArgumentException media translation bug and apply the proposed EntityIsTranslatable patch. Review the open issue/MR templates MR. Investigate the unit test autoloader conflict and propose a workaround or upstream fix.

                            Contributors: Christoph Breidert (breidert), Sven Decabooter (svendecabooter), Valery Lourie (valthebald), Jordan Koplowicz (koppie), Rodel Duterte (rduterte), Punam Aseem Beedkar (PunamShelke), Carlos Romero (o0Charly0o), szato (odi)

                            ---

                            FlowDrop

                            FlowDrop saw extensive static analysis hardening over the past 24 hours. PHPStan analysis was raised from level 8 to level 10, eliminating implicit mixed types across the entire codebase. Type narrowing was applied systematically to entities, services, forms, list builders, and DTOs in flowdrop_session, flowdrop_pipeline, flowdrop_interrupt, flowdrop_workflow, flowdrop_job, flowdrop_runtime, flowdrop_stategraph, flowdrop_node_processor, and several other submodules. Key API surfaces received explicit type annotations, including the processor schema surface, node metadata producers, and workflow storage shapes. Shaped array returns were introduced for getNodes() and getEdges() in flowdrop_workflow.

                            Additional quality improvements included enabling cspell checks with a project dictionary, documenting British English spelling conventions, and correcting flagged spelling errors across the codebase. A fix was applied to flowdrop_node_type's update_10004 hook to guard output-schema reads. In flowdrop_chat, AiModelService return values were narrowed for standalone analysis. CI pipeline fixes addressed an empty variables block that broke all jobs. Test infrastructure also received type annotations, including shared test traits and the FlowDropKernelTestTrait.

                            How can I help on this project?

                            Review recent code quality commits to identify any edge cases or opportunities for further type refinement. Test the cspell and PHPStan level 10 configurations in your local environment and report any false positives. Explore open issues in the queue for tasks needing attention.

                            Contributors: Shibin Das [60]

                            ---

                            Langfuse

                            The Langfuse module saw significant progress with the merge of Issue #3548465: Add createScore() for feedback and a langfuse_feedback submodule. This introduces a new createScore() API method for submitting feedback data to Langfuse, packaged in a dedicated langfuse_feedback submodule. The merge includes 814 lines of changes, expanding the module's functionality to support user feedback mechanisms alongside its existing observability features.

                            No blocking issues or API deprecations were reported during this period. The module appears to be progressing steadily with feature additions.

                            How can I help on this project?

                            Review the recently merged langfuse_feedback submodule to identify any edge cases or integration issues with the createScore() API. Test the feedback functionality against live Langfuse endpoints. Check the issue queue for unassigned tasks or open feature requests that could benefit from development or documentation contributions.

                            Contributors: Abhisek Mazumdar (abhisekmazumdar) [1]

                            ---

                            AG-UI

                            A latency issue was identified in the SSE event streaming implementation. The chunkDelay/chunkPadding applied per-event compounds into real latency/timeout risk on long or tool-heavy runs issue documents how sendSseEvent() currently applies the full configured chunkPaddingSize and chunkDelayMicroseconds to every SSE event type, including TOOL_CALL_START, TOOL_CALL_ARGS, TOOL_CALL_END, TOOL_CALL_RESULT, RUN_STARTED, and RUN_FINISHED, not just TEXT_MESSAGE_CONTENT chunks. In scenarios involving multiple tool calls plus streamed text responses, this overhead compounds linearly with event count. Testing revealed that 80ms delay plus 4096 bytes of padding per event across several dozen events added multiple seconds and hundreds of kilobytes of artificial overhead on top of actual LLM latency, creating potential timeout risks for agent-heavy workflows.

                            How can I help on this project?

                            The chunkDelay/chunkPadding per-event latency issue is unassigned with no merge request. Investigate selective application of chunk padding and delays based on event type, or consider making these parameters configurable per event class to reduce overhead in tool-heavy scenarios.

                            ======================================================================== ## [15] factcheck:tldr:developer ======================================================================== Layer-1 corrections: 0 Judge flags: 0 ======================================================================== ## [16] summariseModule:ai:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI (Artificial Intelligence) (machine name: ai) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ann Mary Sruthy (annmarysruthy), Rob Loach (robloach), Scott Euser (scotteuser), Shivam Sen (shivamsen_12579)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                            AI (Artificial Intelligence)

                            then use

                            ,

                            ,

                              /
                            • , and as needed. Output only the HTML fragment with no surrounding , , or
                              tags. After the project summary prose, add a single subsection titled "

                              How can I help on this project?

                              " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Add AIDmi to Other modules/recipes that work with the AI module](https://git.drupalcode.org/project/ai/-/work_items/3586566) State: opened | Updated: 2026-08-10 | Author: Mike Feranda (mferanda) | Assigned: unassigned | Labels: category::task, priority::minor, state::accepted Description: Please add AIDmi to your list of Drupal AI other modules. [AIDmi](https://www.drupal.org/project/aidmi) - AI, describe my image! - CKEditor image accessibility plugin for Alt/Caption text generation https://www.drupal.org/project/aidmi ### [Drupal AI Contribution meeting 2026-08-10](https://git.drupalcode.org/project/ai/-/work_items/3586662) State: opened | Updated: 2026-08-10 | Author: Valery Lourie (valthebald) | Assigned: unassigned | Labels: No Estimation Available Description: Drupal AI Contribution meeting from August 10 at 18:00 to August 11, 2026 19:00 (Central European time, check your local time at https://www.timebie.com/std/berlin.php?q=18) Previous meeting https://git.drupalcode.org/project/ai/-/work_items/3586618 ## Where #ai-contrib channel in [Drupal Slack](https://www.drupal.org/slack/) ## Agenda ### Attendees self-intro and interests ### Follow-up to topics of previous meeting ### Suggest your topic in comments ### Add the issue you want to discuss as a comment or related issue to this meeting ## Transcript ### [Drupal AI Contribution meeting 2026-07-27](https://git.drupalcode.org/project/ai/-/work_items/3586618) State: opened | Updated: 2026-08-10 | Author: Valery Lourie (valthebald) | Assigned: Valery Lourie (valthebald) | Labels: No Estimation Available, meetings Description: Drupal AI Contribution meeting from July 27 at 18:00 to July 28, 2026 19:00 (Central European time, check your local time at https://www.timebie.com/std/berlin.php?q=18) Previous meeting https://git.drupalcode.org/project/ai/-/work_items/3586591 Next meeting https://git.drupalcode.org/project/ai/-/work_items/3586662 ## Where #ai-contrib channel in [Drupal Slack](https://www.drupal.org/slack/) ## Agenda ### Attendees self-intro and interests ### Follow-up to topics of previous meeting ### Suggest your topic in comments ### Add the issue you want to discuss as a comment or related issue… ### [Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{ context }} and {{ raw_context }} before they reach the provider](https://git.drupalcode.org/project/ai/-/work_items/3586661) State: opened | Updated: 2026-08-10 | Author: Ann Mary Sruthy (annmarysruthy) | Assigned: unassigned | Labels: category::bug, priority::normal, state::needs review Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1924 [bug: #3586661 Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{...](https://git.drupalcode.org/project/ai/-/merge_requests/1924) | State: opened | Author: Ann Mary Sruthy (annmarysruthy), 324 diff lines Description: Problem/Motivation AiPromptHelper::renderPrompt() builds the prompt with this-\>twig-\>createTemplate(htmlspecialchars_decode(prompt)), using Drupal's Twig environment with HTML autoescaping enabled. Every token value is HTML-escaped on its way into the string sent to the provider. {{ raw_context }}, documented as "The raw text from the base field. Can include HTML", cannot pass HTML at all — tags arrive as \. {{ context }} can arrive double-escaped: generateTokens() uses strip_tags(), which removes tags but leaves entities like & intact, and Twig escapes that again into &. Given a Body valu… ### [If only one tool, cannot delete it, gives an error: Undefined array key 1 in Drupal\ai\Element\ToolsLibrary::processToolsLibrary() (line 89 of modules/contrib/ai/src/Element/ToolsLibrary.php) & more](https://git.drupalcode.org/project/ai/-/work_items/3586652) State: opened | Updated: 2026-08-10 | Author: Prabhavathi Vanipenta (prabha1997) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::rtbc Description: Am on Drupal 11.3.16, PHP 8.4, ai 1.4.5, ai_agents 1.3.2 If my AI Agent has one tool, and I try to delete it using its trashcan icon at the upper right, the tool still remains... If I then Save the AI Agent, and go back into it, the following errors/warnings appear at the top: ``` Warning: Undefined array key 1 in Drupal\ai\Element\ToolsLibrary::processToolsLibrary() (line 89 of modules/contrib/ai/src/Element/ToolsLibrary.php). Warning: Trying to access array offset on null in Drupal\ai\Element\ToolsLibrary::processToolsLibrary() (line 89 of modules/contrib/ai/src/Element/ToolsLibra… ### [Chatbot closes itself when adding a modal](https://git.drupalcode.org/project/ai/-/work_items/3499451) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, Has Testing Steps, ai::inside Description: >>> [!note] Migrated issue Reported by: [heyyo](https://www.drupal.org/user/474388) Related to !1277 >>> Problem/Motivation ChatBot closes itself, and impossible to reopen-it, without refreshing the page Steps to reproduce 1. Create new content with CKEditor, for example basic page 2. Open ChatBot 3. Add Media into Ckeditor, we can see ChatBot closes 4. Include the Media 5. It's impossible to reopen the ChatBot ### [Document FunctionalJavascript test conventions and add CI check for ungrouped/unrecorded tests](https://git.drupalcode.org/project/ai/-/work_items/3582633) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Abhisek Mazumdar (abhisekmazumdar) | Labels: 2026Sprint14, 2026Sprint15, 2026Sprint16, AI Initiative Sprint Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !1432 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: Document FunctionalJavascript test conventions and add CI check for ungrouped/unrecorded tests Check-in Date: MM/DD/YYYY [/Tracker] Problem/Motivation The AI module has a system for running FunctionalJavascript tests in CI that relies on two conventions: Every new FJS test class must have a @group annotation with the issue number it belongs to, so the filter script (scripts/filter-functio… ### [`AiReranker::extractItemText()` should prefer chunk text over configured indexed fields](https://git.drupalcode.org/project/ai/-/work_items/3586637) State: opened | Updated: 2026-08-10 | Author: Abhisek Mazumdar (abhisekmazumdar) | Assigned: Abhisek Mazumdar (abhisekmazumdar) | Labels: ai::inside, category::bug, priority::normal, sprint candidate Description: ## Problem/Motivation `ai_search`'s chunk-mode retrieval (used by `RagTool` and any other consumer querying with `search_api_ai_get_chunks_result`) carries the actual chunk text in `$item->getExtraData('content')`, not in the item's configured indexed source fields. `AiReranker::extractItemText()` only reads the processor's configured `source_fields` off each result item. For chunk-mode results this means every chunk belonging to the same entity reranks against the same text: the entity's full configured field content, not the individual chunk. Chunk-level rerank quality regresses to entity-… ### [Add thumbs-up and thumbs-down icons to the shared AI icon set](https://git.drupalcode.org/project/ai/-/work_items/3586660) State: opened | Updated: 2026-08-10 | Author: Aidan Foster (aidanfoster) | Assigned: Eric Homanchuk (erichomanchuk) | Labels: Quick Win, category::feature, priority::minor, state::accepted Description: The shared AI icon set added in #3571220 does not include thumbs-up or thumbs-down. Feedback controls are appearing across the AI ecosystem (AI Answers, AI Content Review) and each one is currently rolling its own, mostly as raw emoji, so the glyph varies by operating system and browser and does not match the rest of the AI admin UI. ## Proposed resolution Add `ai-icon--thumbs-up` and `ai-icon--thumbs-down` variations to `ai_global.css`, sourced from Phosphor per the icon source hierarchy agreed in #3567389. Use these specific icons: - Thumbs up: https://phosphoricons.com/?q=ThumbsUp - Thu… ### [ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models](https://git.drupalcode.org/project/ai/-/work_items/3586425) State: opened | Updated: 2026-08-10 | Author: josecarlosmedero | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint15, 2026Sprint16, AI Initiative Sprint Description: **Problem / Motivation** `AiRequest.php` calls `setStreamedOutput(TRUE)` for all providers. The PHP client `gemini-api-php` sends a malformed request body when calling `streamGenerateContent` against Gemini 2.x models, resulting in `400 Bad Request`. The non-streaming endpoint `generateContent` works correctly with the same payload. The error in logs: `Error invoking model response: Client error: POST https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:streamGenerateContent resulted in a 400 Bad Request response` Confirmed: the identical payload sent to `generateConten… ### [LLM: Text / LLM: Text (simple) automators silently drop Base Field content when Base Field and Target Field are both long-text types (Basic input mode)](https://git.drupalcode.org/project/ai/-/work_items/3586659) State: opened | Updated: 2026-08-10 | Author: Adrian McKee (Adrianm6254) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Description: Problem/Motivation When configuring an LLM: Text (llm_text_long) or LLM: Text (simple) (llm_simple_text_long) automator in Basic input mode, with Automator Base Field set to another long-text field on the same entity (e.g. Body → a new summary field, both text_long/string_long type), the Base Field's content is not included in the request sent to the AI provider. The model consistently responds as though no source content was provided at all, e.g.: "I don't see an article provided in your message. Please share the article you'd like me to summarize..." This happens regardless of whether the… ### [[PLAN] Propagate and enforce an explicit executor for sessionless, queued, and outside-in AI runs](https://git.drupalcode.org/project/ai/-/work_items/3573899) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::outside Description: **Problem/Motivation** The AI subsystem largely assumes tool execution and access checks rely on the active web session (`\Drupal::currentUser()`). For background agents, cron, queue workers (Symfony Messenger), and outside-in entry points (MCP, orchestration APIs), that assumption breaks down: queued work loses the account it was initiated under, cron paths run as anonymous, and helpers read ambient `currentUser()` state. The result is incorrect access checks and incorrect authorship. Attempts to fill the gap with synthetic users or temporary role mutation (e.g. [#3518167](https://git.drupa… --- MERGE REQUESTS (24h) --- ### [Issue #3586475: Rename the RegExp Guardrail labels to RegEx](https://git.drupalcode.org/project/ai/-/merge_requests/1689) State: opened | Author: Rob Loach (robloach) | Branch: 3586475-guardrails-regex-plugin-name | 205 diff lines Description: ## Description This renames the regexp guardrail labels to "RegEx" for consistency within the UI. It doesn't change the machine IDs, or class names, just the labels. ## Testing instructions 1. Visit the Guardrails administration screen 2. Expect to see RegEx, instead of regexp Closes #3586475 ## Checklist - [x] I have linked the related issue in the MR title or description - [x] I have performed a self-review of my own code - [x] I have added or updated tests, or explained in the description why this change is not covered by tests - [x] I have updated documentation for any new or chan… ### [#3582633: Add Functional JavaScript testing conventions and validation script](https://git.drupalcode.org/project/ai/-/merge_requests/1432) State: opened | Author: Shivam Sen (shivamsen_12579) | Branch: 3582633-document-functionaljavascript-test | 237 diff lines Description: (cherry picked from commit 20c8ac18d15a25ffd0db807b6e427e8b41d34cf7) Closes #3582633 ### [Resolve #3586495 "Add support embeddings via symfony/ai"](https://git.drupalcode.org/project/ai/-/merge_requests/1856) State: opened | Author: Scott Euser (scotteuser) | Branch: 3586495-add-support-embedings-via-symfonyai | 348 diff lines Description: Closes #3586495 --- COMMITS (24h) --- (none) ======================================================================== ## [17] summariseModule:ai_initiative:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Drupal AI Initiative (machine name: ai_initiative) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. Do not name any individual people in this section. No one was active enough this period to list. Format your response as an HTML fragment. Start with

                              Drupal AI Initiative

                              then use

                              ,

                              ,

                                /
                              • , and as needed. Output only the HTML fragment with no surrounding , , or
                                tags. After the project summary prose, add a single subsection titled "

                                How can I help on this project?

                                " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Drupal AI UX meeting 10 August 2026](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586608) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: category::task, meetings, priority::normal, state::accepted Description: **Date:** Monday, August 10, 2026 **Attendees:** Aidan, Emma, Bruno, Darren, Ángela, Christoph #### Roadmap to Rotterdam — #3586657+s - Reviewed as the demo's organizing structure; sub-leads per area still being filled. #### EU AI Act Article 50 disclosure — #3586640+s - Read as approved; demoted to a backup task and offered to new contributors as a labels and padding review. #### Demo content, structure and theme - Content and structure first, theme applied after; Emma's CCC content as the starting point but far more volume needed - Tone and voice guidelines must load before content is… ### [Update AI partner badges to use Partner instead of Sponsor](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586636) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: Tanisha Kalia (tanishakalia), Ryan Witcombe (ryan_witcombe), Molly Shenberger (mollyshenberger) | Labels: category::task, daRequest, design, priority::normal Description: ## Problem The AI initiative badges were created before we settled on the "Partner" naming (used to "Maker"). They show Sponsor now which doesn't capture the collaborative nature of the involvement with the initiative. ## Solution Update the badges to use "Partner" rather than "Sponsor": https://new.drupal.org/themes/contrib/bluecheese/images/badges/drupal_ai_founding_sponsor_badge.svg https://new.drupal.org/themes/contrib/bluecheese/images/badges/drupal_ai_gold_sponsor_badge.svg https://new.drupal.org/themes/contrib/bluecheese/images/badges/drupal_ai_silver_sponsor_badge.svg ### [Communication Binarywork to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586718) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Genero inc to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586720) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Smile to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586719) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Evolvingweb to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586717) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Digital polygon to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586716) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Sparkfabrik to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586715) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Promet source to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586714) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Redhat to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586713) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Omedia to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586712) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join, work through pantheon ### [Communication Faktorial to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586711) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication NTTdata to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586710) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: Didnt join ### [Communication Swis to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586709) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Didnt join ### [Communication Hintogroup to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586708) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: Considering ### [Communication Mobomo to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586707) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: didnt join ### [Communication Kadabra IT to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586706) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: They think about it ### [Communication EPAM joining](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586705) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: they joined ### [Communication iTech4Web](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586704) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call Pronovix to join](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586703) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call Zivtech to join Initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586702) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Communication Joshi consulting](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586701) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Joined but removed later ### [Communication Civiactions](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586700) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: Considering to join ### [Call IOgroup CEO](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586699) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they think about it, eventually didnt join. ### [Call 2 calibrate](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586698) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: They joined ### [Call 1 calibrate](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586697) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: They think about it ### [Call with Oomph](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586696) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Communication with Specbee](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586695) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with Cambridge press](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586694) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with Reading room to join initiative](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586693) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: result they joined ### [Went to see Vesa from Wunder in Cascais to join AI initaitive](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586691) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: he said he'd join ### [Met with team Mearra in Athens](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586692) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result they joined ### [Call 2 with Drupalforge](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586690) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call 1 with drupalforge](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586689) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Proposed special deal for non profit ### [Call/mail with Yorgos E-sepia](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586688) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Restuls: they joined ### [Call with integral vision](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586687) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result they joined ### [Call with Brainsum](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586686) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with Optasy](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586685) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with wolfgang Drunomics](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586684) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call with Kalamuna](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586683) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call 2 with Josh from Pantheon](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586682) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they joined ### [Call 1 with Josh from Pantheon](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586681) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: they think about it ### [Call with Esinergia](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586680) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: Result: They joined! ### [Call with Aidan Foster interactive](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586679) State: closed | Updated: 2026-08-10 | Author: Dominique De Cooman (domidc) | Assigned: Dominique De Cooman (domidc) | Labels: Description: they joined ### [[META] 2026 AI Inside Roadmap to DrupalCon Rotterdam 2026](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586657) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Christoph Breidert (breidert) | Labels: AI Initiative, ai::inside, roadmap Description: ## Why this roadmap exists At DrupalCon Rotterdam at the end of September we want to show a single Drupal site where AI Search, AI content review, AI translation, an editor-facing chat, observability and guardrails all work together on real, multilingual content. Rather than describing these features one by one, we let people see them working together on one site, and we let anyone launch that site for themselves in a few seconds on Drupal Forge. Most of these features already work today. The gap is almost never the core capability. The gap is that we have not yet shipped the recipes and dem… ### [Create a skill for manual before/after testing of any issue, with optional glab upload](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586629) State: opened | Updated: 2026-08-10 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: Marcus Johansson (Marcus_Johansson) | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, DX (Developer Experience) Description: ## Problem/Motivation Reviewing an issue manually is repetitive and easy to do inconsistently. To judge whether a merge request actually fixes what it claims, a reviewer has to set up the site, reproduce the original behaviour, apply the change, and then walk the exact same path again. In practice the "before" step is often skipped, so the review says "it works" without ever showing that it was broken to begin with. There is no shared, repeatable way to do this, and nothing that produces evidence a maintainer can look at without rebuilding the environment themselves. ## Proposed resolution … --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [18] summariseModule:mcp:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Model Context Protocol (machine name: mcp) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. Do not name any individual people in this section. No one was active enough this period to list. Format your response as an HTML fragment. Start with

                                Model Context Protocol

                                then use

                                ,

                                ,

                                  /
                                • , and as needed. Output only the HTML fragment with no surrounding , , or
                                  tags. After the project summary prose, add a single subsection titled "

                                  How can I help on this project?

                                  " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Token Auth is not working](https://git.drupalcode.org/project/mcp/-/work_items/3584901) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Giorgi Jibladze (jibla) | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::outside Description: >>> [!note] Migrated issue Reported by: [aalin](https://www.drupal.org/user/2941961) >>> Problem/Motivation There are actually 2 issues here: 1. Inside /admin/config/mcp , when you click on "Enable Token Auth" checkbox nothing happens. This is because #states selector on token_with_generation is not correctly set: 'visible' => [   ':input[name="enable_token_auth"]' => ['checked' => TRUE],], instead of 'visible' => [  ':input[name="auth_settings[enable_token_auth]"]' => ['checked' => TRUE],],2. Even when configured manually via config export/import, the … ### [Add OAuth Scope Validation for MCP Authentication](https://git.drupalcode.org/project/mcp/-/work_items/3569845) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Shubham Goel (shubhamgoel) | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::outside Description: >>> [!note] Migrated issue Reported by: [shubhamgoel](https://www.drupal.org/user/3682434) Related to !44 >>> When authenticating from the MCP client to the server, the authentication succeeds with all the dynamic scopes requested. There should be an option to enable or configure only the supported OAuth fields/scopes. --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [19] summariseModule:ai_agents:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI Agents (machine name: ai_agents) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ahmad Khader (Ahmad-Khader), Bharat Kelotra (bharatkelotra), Joshua Fernandes (joshua1234511), Prabhavathi Vanipenta (prabha1997)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                  AI Agents

                                  then use

                                  ,

                                  ,

                                    /
                                  • , and as needed. Output only the HTML fragment with no surrounding , , or
                                    tags. After the project summary prose, add a single subsection titled "

                                    How can I help on this project?

                                    " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [MCP Server: Entity Seeder uses wrong type for content](https://git.drupalcode.org/project/ai_agents/-/work_items/3586031) State: opened | Updated: 2026-08-10 | Author: Kelly Ferrone (burbular) | Assigned: unassigned | Labels: automation::suggestionExists, category::bug, priority::major, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !345 [ContentEntitySeeder stores multi-property field values as Array](https://git.drupalcode.org/project/ai_agents/-/merge_requests/345) | State: opened | Author: Prabhavathi Vanipenta (prabha1997), 270 diff lines Description: **Project:** AI Agents (`ai_agents`) **Version:** 1.3.0 **Component:** Code — `Drupal\ai_agents\Plugin\AiFunctionCall\ContentEntitySeeder` (`ai_agent:content_entity_seeder`) I was using the mcp server on a brand new install. I tried getting Claude to make an article with some example text but it didn't work out. ContentEntitySeeder stores multi-property field values as literal "Array" (one nesting level dropped) **Problem** When the `content_entity_seeder` tool writes a field whose value goes through the `field_values` → `values` structure, it unwraps only **one** level of the nesting the… ### [Make it possible to restrict the order of tools during agent executions](https://git.drupalcode.org/project/ai_agents/-/work_items/3560681) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::inside Description: >>> [!note] Migrated issue Reported by: [shashikanth171](https://www.drupal.org/user/3516867) Related to !252 >>> Problem/Motivation AI Agent can sometimes execute tools in an order that doesn't make any sense. We can avoid this by improving the prompt template, making it more verbose with trial and error. Need to somehow allow configuration of each tool, to set which tool should be run prior to it. We can also expand it by including conditions like should be executed 1. only once, 2. first, 3. last etc. Depending on the tool and use case, configuring the agent with such restrictions will… ### [Use the `ai_json_schema` editor for the AI Agent structured-output schema field](https://git.drupalcode.org/project/ai_agents/-/work_items/3586042) State: opened | Updated: 2026-08-10 | Author: Ahmad Khader (Ahmad-Khader) | Assigned: Joshua Fernandes (joshua1234511) | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::inside Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !284 [Issue #3586042 Use the `ai_json_schema` editor for the AI Agent structured-output schema field](https://git.drupalcode.org/project/ai_agents/-/merge_requests/284) | State: opened | Author: Ahmad Khader (Ahmad-Khader), 91 diff lines Description: ## Description The AI Agent form renders the **structured output** JSON schema as a plain `textarea` (`AiAgentForm::buildFormMetadata()`, `$form['prompt_detail']['structured_output_detail']['structured_output_schema']`). That makes a schema cumbersome to add (no validation or editor affordances, easy to ship malformed JSON) and hard to read once saved (a wall of escaped JSON). Switch it to the AI module's dedicated `'#type' => 'ai_json_schema'` element (`Drupal\ai\Element\AiJsonSchema`), so adding a schema uses a purpose-built CodeMirror editor (syntax highlighting, JSON linting) and a saved… ### [Explore export/sync plugin system for AI Agents to external agent platforms (Claude Code, VAPI, etc.)](https://git.drupalcode.org/project/ai_agents/-/work_items/3577241) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, AI Product Development Description: >>> [!note] Migrated issue Reported by: [marcus_johansson](https://www.drupal.org/user/385947) Related to !249 >>> [Tracker] Update Summary: [One-line status update for stakeholders] Short Description: Explore export/sync plugin system for AI Agents to external agent platforms (Claude Code, VAPI, etc.) Check-in Date: MM/DD/YYYY [/Tracker] Problem/Motivation The AI Agents module currently allows defining and configuring agents inside Drupal. However, many modern AI ecosystems expect agents to exist inside external platforms such as Claude Code or services like VAPI. In many cases Drupal sh… --- MERGE REQUESTS (24h) --- ### [Issue#3586025:GetEntityFieldInformation-Leaks-Target_entity_type-Target_bundle...](https://git.drupalcode.org/project/ai_agents/-/merge_requests/344) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3586025-GetEntityFieldInformation-Leaks-Target_entity_type-Target_bundle_type-Across-Fields | 1759 diff lines Description: Issue#3586025:GetEntityFieldInformation-Leaks-Target_entity_type-Target_bundle_type-Across-Fields fixes. Closes #3586025 ### [Issue](https://git.drupalcode.org/project/ai_agents/-/merge_requests/343) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3585983-Ai_agents-Status-Subscriber-Fatals-When-Tool-Status-Output-Function-Name | 2111 diff lines Description: Closes #3585983 ### [Issue3569280:AI-Agents-Explorer-Chat-Generation-Does-Not-Support-Series-Models fixes](https://git.drupalcode.org/project/ai_agents/-/merge_requests/342) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3569280-AI-Agents-Explorer-Chat-Generation-Does-Not-Support-Series-Models | 1654 diff lines Description: Closes #3569280 ### [Issue#3566126:Force-Value-Dropped-Tool-Property-Restrictions fixes.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/341) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3566126-Force-Value-Dropped-Tool-Property-Restrictions | 1822 diff lines Description: Closes #3566126 ### [Issue #3560681: Add per-tool execution ordering constraints for agent loops.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/252) State: opened | Author: Joshua Fernandes (joshua1234511) | Branch: 3560681-make-it-possible | 3477 diff lines Description: Closes #3560681 ### [Issue#3565169:Schema-Error-AI-Agents-CKEditor-Plugin fixes.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/340) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3565169-Schema-Error-AI-Agents-CKEditor-Plugin | 3077 diff lines Description: Closes #3565169 ### [#3586042: Use the ai_json_schema editor for the structured output schema field.](https://git.drupalcode.org/project/ai_agents/-/merge_requests/298) State: opened | Author: Joshua Fernandes (joshua1234511) | Branch: 3586042-use-the-ai-json-schema-editor-for-the-ai-agent-structured-output-schema-field-4x | 91 diff lines Description: Closes #3586042 Completes the wiring for the `ai_json_schema` (CodeMirror) editor on the AI Agent **Structured Output Schema** field: adds config-level JSON validation, lets the modeller resolve the field's schema, and fixes visibility toggling. ## Changes * **`config/schema/ai_agents.schema.yml`** — `structured_output_schema`: `string` → `text`, plus a `ValidJsonSchemaStructure` constraint (`checkAiConstraints: false` = plain valid-JSON, matching the form). * **`Agent.php`** — added `getPluginSchemaKey()` mapping the START component to `ai_agents.ai_agent.*` so the modeller (BPMN/off-canva… ### [test: #3586021 Add regression test for ai_agent plugin cache invalidation](https://git.drupalcode.org/project/ai_agents/-/merge_requests/337) State: opened | Author: Bharat Kelotra (bharatkelotra) | Branch: 3564033-connecting-an-agent-to-an-assistant-doesnt-work-until-cache-clear-and-tool-api | 1407 diff lines Description: Adds a kernel test covering the fix in ai_agents_ai_agent_insert()/ _update()/_delete() that clears the plugin.manager.ai_agents and plugin.manager.ai.function_calls caches when an ai_agent config entity is saved or deleted. Reproduces the reported scenario (create an Agent, do not clear caches, explore/attach it) and asserts the agent is immediately usable without a manual cache clear. Co-Authored-By: Claude Sonnet 5 Closes #3564033 --- COMMITS (24h) --- (none) ======================================================================== ## [20] summariseModule:tool:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Tool API (machine name: tool) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Ajit Shinde (ajits), Alex Urevick-Ackelsberg (alexua) [2], Michael Lander (michaellander) [15]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                    Tool API

                                    then use

                                    ,

                                    ,

                                      /
                                    • , and as needed. Output only the HTML fragment with no surrounding , , or
                                      tags. After the project summary prose, add a single subsection titled "

                                      How can I help on this project?

                                      " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Bare regex patterns are dropped from emitted JSON Schemas](https://git.drupalcode.org/project/tool/-/work_items/3582987) State: opened | Updated: 2026-08-11 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Description: ## Problem/Motivation `ContextDefinitionNormalizer::convertPcreToEcma()` (#3582972) assumes every Regex constraint pattern is a delimited PCRE. A pattern authored bare — `'^[a-z]+(-[a-z]+)*$'`, the form JSON Schema itself expects — has its first character read as a PCRE delimiter; the parse fails and no `pattern` is emitted at all. Surfaced by mcp_server_tool_bridge's `ToolApiRegistrationTest` under 1.0.0-beta4: its fixture deliberately covers the bare authoring style (which the bridge's pre-integration converter passed through), and the schema now emits `pattern: null` for it. Tool authors … ### [Define checkRequirements() as a configuration-time signal (indicator + add-prevention), not a runtime gate](https://git.drupalcode.org/project/tool/-/work_items/3582975) State: closed | Updated: 2026-08-11 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !124 [Enforce checkRequirements() in execute() and exclude unmet tools from the AI function list.](https://git.drupalcode.org/project/tool/-/merge_requests/124) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 64 diff lines Description: ## Problem/Motivation `checkRequirements()` is declared on the frozen interface but called by nothing, which this issue originally read as "wire it into execution." On reflection that was the wrong direction: the method was always intended to be **configuration-facing** — surface a visual indicator when a tool's requirements are unmet, and allow curation surfaces to prevent such a tool from being _added_ to something — while deliberately **not** blocking runtime. The reason the non-enforcement is deliberate: if `execute()`/`access()` enforced requirements, tool authors would be incentivized … ### [ToolBase's promoted $logger property conflicts with subclasses declaring their own logger](https://git.drupalcode.org/project/tool/-/work_items/3582986) State: closed | Updated: 2026-08-11 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !128 [fix: #3582986 require the logger channel and document the subclass redeclaration contract](https://git.drupalcode.org/project/tool/-/merge_requests/128) | State: merged 2026-08-11 | Author: Michael Lander (michaellander), 37 diff lines Description: ## Problem/Motivation #3582971 added a logger to `ToolBase` as a promoted constructor property named `$logger`, typed `?LoggerChannelInterface`. Because `ToolBase::__construct()` is `final`, subclasses inject their own services by declaring a property and overriding `create()` — and the conventional name for a logger property in that pattern is exactly `$logger`. A subclass declaring the property with any _other_ type hits a compile-time PHP fatal (property redeclaration with a mismatched type). Confirmed casualties in tool_belt: `LogMessage` (`protected LoggerInterface $logger` + `create()`… ### [SchemaToolsPropertyConverter fatals on empty-map schemas: \ArrayObject reaches ToolsPropertyInput's array-typed setters](https://git.drupalcode.org/project/tool/-/work_items/3582985) State: closed | Updated: 2026-08-11 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !127 [fix: #3582985 cast ArrayObject schema values to arrays before building AI tool properties](https://git.drupalcode.org/project/tool/-/merge_requests/127) | State: merged 2026-08-11 | Author: Michael Lander (michaellander), 80 diff lines Description: ## Problem/Motivation Opening the AI agent form (`AiAgentForm`) with a tool that has an empty map input crashes with a PHP `TypeError`. Since #3582972, the Tool module's serializer intentionally emits empty schema objects (e.g. a map input with no declared properties) as `\ArrayObject` instead of `[]`, so JSON encoding produces `{}` rather than `[]` — strict providers such as Anthropic reject an array where a JSON Schema object is expected. `SchemaToolsPropertyConverter::convert()` in tool_ai_connector passed that normalized schema straight into the AI module's `ToolsPropertyInput`, whose co… ### [tool_ai_connector: ToolPluginBase::getReadableOutput() fatals when wrapped tool has no result object](https://git.drupalcode.org/project/tool/-/work_items/3582941) State: closed | Updated: 2026-08-10 | Author: Sven Decabooter (svendecabooter) | Assigned: unassigned | Labels: Has Testing Steps, category::bug, state::fixed, why::outdated Description: ### Steps to reproduce 1. Enable `tool` and `tool_ai_connector`. 2. Use a Tool API plugin through `tool_ai_connector` in a flow where `ToolPluginBase::getReadableOutput()` is called. 3. Ensure the wrapped tool plugin does not have a result object set when `getReadableOutput()` runs. Examples: - access denied - execution exits early - execution failed before a result was stored - wrapper-level error path still reaches `getReadableOutput()` ### Expected behavior `ToolPluginBase::getReadableOutput()` should handle the missing-result state gracefully and return a safe fallback mess… ### [fromDataDefinition() breaks on plain typed-data lists and unlabeled definitions](https://git.drupalcode.org/project/tool/-/work_items/3582984) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !126 [Fix fromDataDefinition: fall back for missing labels and toArray type keys.](https://git.drupalcode.org/project/tool/-/merge_requests/126) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 110 diff lines Description: ## Problem/Motivation Found by the #3582974 coverage sweep. `InputDefinition::fromDataDefinition()` mishandles plain (non-config) typed-data definitions in two ways: 1. **Unlabeled definitions crash.** Typed-data labels are optional, but the factory passes `$definition->getLabel()` (NULL) straight into the `InputDefinition` constructor, whose `$label` parameter is `string|TranslatableMarkup` — a `TypeError`. 2. **List item definitions lose their type.** For a plain `ListDataDefinition`, the recursive item conversion reads `$definition->toArray()['type']`, which is not set on item definitions… ### [Coerce JSON numbers to strings for decimal inputs](https://git.drupalcode.org/project/tool/-/work_items/3582983) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !125 [Resolve "Coerce JSON numbers to strings for decimal inputs"](https://git.drupalcode.org/project/tool/-/merge_requests/125) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 137 diff lines Description: ## Problem/Motivation Decimal inputs travel as strings to preserve precision (#3582972 emits `type: string` + pattern), but the schema's numeric look invites models to send bare JSON numbers (`19.99`). Nothing coerces those to their string form, so validation rejects an unambiguous value and costs a correction round-trip — exactly the class of recoverable shape #3582973 exists for; decimal was simply missing from its list. ## Proposed resolution In `InputTypeCoercionSubscriber`, coerce `int`/`float` values for `decimal` inputs to their canonical string form (`19.99` → `"19.99"`, `5` → `"5"`… ### [Complete kernel coverage of the typed input/output traits and definition pipeline](https://git.drupalcode.org/project/tool/-/work_items/3582974) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::task, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !123 [Add kernel coverage: locked/configuration inputs, refiner flow, definition...](https://git.drupalcode.org/project/tool/-/merge_requests/123) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 752 diff lines Description: ### Problem/Motivation Every serious bug found this release cycle — the `getOutputValue()` throw on optional outputs (#3582954), the multi-value validation early-return, the configuration-source fatal, the coercion regressions — lived in `TypedInputsTrait`/`TypedOutputsTrait`, in paths with no test coverage. These traits are the API being frozen at RC1; untested frozen behavior is behavior we cannot safely refactor later. **Scope note:** the RC1 fix issues each carry their own tests — config-source precedence (config-value issue), multi-value item validation (validation issue), access-on-inv… ### [Rework the tool execution contract: result naming, concrete typing, and decoupling from core ExecutableInterface](https://git.drupalcode.org/project/tool/-/work_items/3582964) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::task, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !122 [fix: #3582964 own execution contract: result value interfaces, accessors on...](https://git.drupalcode.org/project/tool/-/merge_requests/122) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 309 diff lines Description: ### Problem/Motivation Three related contract problems that freeze at RC1: 1. **`ExecutableResultInterface` is misnamed.** It is implemented by the _tool plugin_ (`ToolInterface extends ExecutableResultInterface`) — it describes "a thing that carries an execution result" (`getResult()`, `getResultMessage()`, `getResultStatus()`, now `hasResult()`), not the result itself. Meanwhile `ExecutableResult` — the actual result — is a `final readonly` class implementing no interface. 2. **Concrete final classes are hard-typed into the frozen interface.** `getResult(): ExecutableResult` and (new since… ### [Correct API signatures before the RC1 freeze (batch)](https://git.drupalcode.org/project/tool/-/work_items/3582962) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !121 [fix: #3582962 correct API signatures: factory overrides, null context values,...](https://git.drupalcode.org/project/tool/-/merge_requests/121) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 461 diff lines Description: ### Problem/Motivation Five small signature/semantic mistakes that are one-to-five-line fixes today and BC breaks after RC1. Batched because none warrants its own issue. 1. **`getInputDefinition(): InputDefinitionInterface|InputException`** (src/TypedInputsInterface.php:55 and the trait): the exception is thrown, never returned. The union forces consumers to handle an impossible return. Fix: `: InputDefinitionInterface` + `@throws`. 2. **`ExecutableResult` nullable context values**: constructor and `success()`/`failure()` accept `?array $contextValues` but `getContextValues(): array` returns… ### [Implement getCacheContexts() or drop CacheableDependencyInterface from ToolInterface](https://git.drupalcode.org/project/tool/-/work_items/3582965) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !120 [fix: #3582965 drop the unimplemented cacheability contract from ToolInterface](https://git.drupalcode.org/project/tool/-/merge_requests/120) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 112 diff lines Description: ### Problem/Motivation `ToolInterface` extends `CacheableDependencyInterface`, but `ToolBase::getCacheContexts()` is a stub: ```php public function getCacheContexts() { // @todo Implement getCacheContexts() method. return []; } ``` Shipping a knowingly-unimplemented contract is worse than not implementing the interface — consumers caching tool results (render caching in explorers, AI response caching) will silently under-vary. Notably, a complete implementation already exists under the wrong name: `TypedInputsTrait::getCacheInputs()` (\~line 379) aggregates cache contexts from input de… ### [Prefix module-owned identifiers: alter hook, cache key, and 'text' data type ID](https://git.drupalcode.org/project/tool/-/work_items/3582963) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !119 [fix: #3582963 prefix the adapter alter hook and cache key; keep the generic...](https://git.drupalcode.org/project/tool/-/merge_requests/119) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 134 diff lines Description: ### Problem/Motivation Three globally-namespaced identifiers are unprefixed. Identifier renames after RC1 break other modules, so this is a freeze item. 1. **Alter hook**: `TypedDataAdapterManager` (src/TypedData/Adapter/TypedDataAdapterManager.php:24) calls `$this->alterInfo('data_type_adapter_info')`, creating `hook_data_type_adapter_info_alter()`. Drupal convention requires module-prefixed alter hooks; a collision with another module implementing a generic "data type adapter" concept is plausible. 2. **Cache key**: same class, `setCacheBackend($cache_backend, 'data_type_adapter_plugins')`… ### [Move orphaned "FieldExistConstraint' and 'FieldExistsConstraintValidator' to Tool Belt.](https://git.drupalcode.org/project/tool/-/work_items/3582951) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::task, priority::minor, state::closed, why::wontFix Description: ### Problem/Motivation The `FieldExistsConstraint` and `FieldExistsConstraintValidator` classes in `src/Plugin/Validation/Constraint/` are entity-specific validation logic that doesn't belong in the base Tool API module. A "field exists on an entity type and bundle" constraint is specific to tools that operate on entities — it's not a general-purpose tool concern. The Tool API module should remain focused on the tool plugin system, typed inputs/outputs, and execution lifecycle. Additionally, the constraint was using the deprecated `@Constraint` annotation (triggering a deprecation notice on… ### [ListInputDefinition item values are never validated](https://git.drupalcode.org/project/tool/-/work_items/3582982) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !118 [fix: #3582982 validate list definition items and name failing positions](https://git.drupalcode.org/project/tool/-/merge_requests/118) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 219 diff lines Description: ## Problem/Motivation Items inside a `ListInputDefinition` input bypass constraint validation entirely, so tools receive type-invalid item values and the invoker correction loop never fires. This is the companion gap to #3582960 (multiple inputs validating only their first item) and is **not** fixed by that issue's MR: `validateInputValue()` branches on `$definition->isMultiple()`, but a `ListInputDefinition` has `isMultiple()` FALSE with data type `list`, so it falls to the `Context::validate()` path, which does not surface item-level violations. Reproduction (kernel, verified on the #3582… ### [Make violation messages translatable and stop surfacing raw exception text](https://git.drupalcode.org/project/tool/-/work_items/3582971) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !117 [Make input violation messages translatable; log unexpected exceptions instead...](https://git.drupalcode.org/project/tool/-/merge_requests/117) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 179 diff lines Description: ### Problem/Motivation `src/TypedInputsTrait.php` builds user-surfaced text with `sprintf()`, bypassing translation: - \~line 205: `"The %s context is not a valid context."` - \~line 268: locked-input exception message - \~line 310: `'Input %s: %s'` violation prefix - \~line 349: `'The %s input must be an entity.'` - \~line 364: `'The %s input is invalid: %s'` These surface to end users via form errors, result messages, Drush output, and AI responses. Additionally, \~line 364 concatenates raw `$e->getMessage()` into the violation, and `ToolBase::execute()`'s catch-all does the same into fa… ### [ToolBase::access() throws on invalid/missing input instead of returning forbidden](https://git.drupalcode.org/project/tool/-/work_items/3582961) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !113 [fix: #3582961 fail closed when tool input is invalid or missing](https://git.drupalcode.org/project/tool/-/merge_requests/113) | State: merged 2026-08-10 | Author: Alex Urevick-Ackelsberg (alexua), 225 diff lines Description: ### Problem/Motivation `ToolBase::access()` (src/Tool/ToolBase.php, \~line 201) calls `$this->getExecutableValues()`, which throws `\InvalidArgumentException` when validation fails. So checking access on a tool whose inputs are not yet valid produces an uncaught exception rather than an access result. `execute()` catches this exception; `access()` does not. Consequences: - Any consumer that checks access _before_ prompting for or validating values (the natural order) gets an exception where it expects an `AccessResult`. - Access checks should never throw on bad user input — a WSOD/stack tra… ### [Non-array value for a map input throws instead of failing validation](https://git.drupalcode.org/project/tool/-/work_items/3582981) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !116 [Rethrow un-storable input values as InputException naming the input.](https://git.drupalcode.org/project/tool/-/merge_requests/116) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 90 diff lines Description: ## Problem/Motivation Setting a non-array value on a map input throws an uncaught `InvalidArgumentException` from `Map::setValue()` ("Invalid values given. Values must be represented as an associative array.") during `ToolBase::setInputValue()` — before validation ever runs. The exception carries no input name and no `input_schema` echo, so an LLM invoker surfaces a generic execution error instead of the structured validation-failure correction loop. The asymmetry: `validateInputValue()` already converts typed-data exceptions into named violations ("The X input is invalid: …"), but value _st… ### [validateInputValue() only validates the first item of a multiple input](https://git.drupalcode.org/project/tool/-/work_items/3582960) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: Quick Win, category::bug, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !112 [fix: #3582960 validate every multiple input item](https://git.drupalcode.org/project/tool/-/merge_requests/112) | State: merged 2026-08-10 | Author: Alex Urevick-Ackelsberg (alexua), 137 diff lines Description: ### Problem/Motivation `src/TypedInputsTrait.php` (\~lines 337-341), inside `validateInputValue()`: ```php if ($definition->isMultiple() && is_array($value)) { foreach ($value as $item) { $item_definition = clone $definition; $item_definition->setMultiple(FALSE); return $this->validateInputValue($item_definition, $item); } } ``` The `return` inside the first loop iteration means items 2..n of a multiple input are never validated — invalid values in later positions pass validation and reach `doExecute()`. This is a validation bypass, which matters doubly now that the AI conne… ### [Extend input coercion for unambiguous LLM value shapes](https://git.drupalcode.org/project/tool/-/work_items/3582973) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::feature, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !115 [Extend input coercion: JSON-string structures, enum near-misses, datetime...](https://git.drupalcode.org/project/tool/-/merge_requests/115) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 635 diff lines Description: ### Problem/Motivation `InputTypeCoercionSubscriber` (priority 50) currently handles list-wrapping, boolean strings, and numeric strings. Real LLM traffic produces more recoverable shapes; each currently costs a validation-failure round-trip (failure message + `input_schema` echo → model retry). Principle: **coerce only when unambiguous** — anything doubtful stays for validation, whose correction loop already works. Nested coverage is free via the recursive subscriber's child dispatch. ### Proposed resolution (priority order) | \# | Gap | Fix | |----|-----|-----| | B1 | JSON _string_ for ma… ### [Emit richer JSON Schema: map remaining constraints and type formats](https://git.drupalcode.org/project/tool/-/work_items/3582972) State: closed | Updated: 2026-08-10 | Author: Michael Lander (michaellander) | Assigned: unassigned | Labels: category::feature, priority::normal, state::accepted Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !114 [Resolve "Emit richer JSON Schema: map remaining constraints and type formats"](https://git.drupalcode.org/project/tool/-/merge_requests/114) | State: merged 2026-08-10 | Author: Michael Lander (michaellander), 1190 diff lines Description: ### Problem/Motivation The emitted input schemas omit several constraints and formats that tools already declare, so LLM/MCP consumers get weaker contracts than the typed-data layer enforces — costing correction round-trips. Constraint mapping is centralized in `ContextDefinitionNormalizer::getNormalizationSchema()` (currently: FixedValue, Choice, AllowedValues, PluginExists, Length, Range) and applies on both scalar paths (10.5 legacy normalizer / 11.1+ core normalizers — the selection bug was fixed in the beta3 cycle, and previous-major CI now tests both). Overlaps with #3582943 "Deliverab… ### [Write documentation and enable project pages](https://git.drupalcode.org/project/tool/-/work_items/3582955) State: opened | Updated: 2026-08-10 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::outside Description: There is project pages documentation that can autocreated on main merges. We should enable that. I have a skill that can do this automatically. ### [Create a skill for generating Tool plugins (best practices, how-to, placement)](https://git.drupalcode.org/project/tool/-/work_items/3582945) State: opened | Updated: 2026-08-10 | Author: Marcus Johansson (Marcus_Johansson) | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::outside Description: ### Problem/Motivation The Tool API lets modules expose well-defined, typed actions as `#[Tool]` plugins, and the `tool_ai_connector` submodule automatically surfaces those same tools to AI agents as `AiFunctionCall`s. Authoring a *correct* tool, though, means getting several moving parts right at once: - the `#[Tool]` attribute — `id`, `label`, `description`, the `ToolOperation` enum (`Explain` / `Read` / `Transform` / `Trigger` / `Write`) and the `destructive` flag; - typed `input_definitions` / `output_definitions` (`InputDefinition`, the list/map variants, `constraints`, `default_value`,… ### [[META] Tool API - Path to Beta and Inclusion in AI](https://git.drupalcode.org/project/tool/-/work_items/3558327) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai::outside Description: >>> [!note] Migrated issue Reported by: [michaellander](https://www.drupal.org/user/636494) >>> Problem/Motivation In this issue we'll outline beta blockers and can record any higher level conversation around a path to Tool API beta. Remaining tasks As of now, these are the issues I'd like to sort out prior to beta. #3557721: Move tools out of Tool API #3555051: Add isAvailable method to the ToolInterface and ToolBase Finish config schema in InputAdapters Finish 'configure' form #3554069: Add an 'operation' property to tool definitions #3558039: [Discuss] Make 'Label' and 'Description' re… ### [Proposal: make Tool's declarations introspectable over the CLI, and enrich input schema](https://git.drupalcode.org/project/tool/-/work_items/3582943) State: opened | Updated: 2026-08-10 | Author: Matt Glaman (mglaman) | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, AI Innovation Description: ## Goal Tool stays consumer-agnostic. Give consumers — the Drush CLI, `mcp_server`, a future planner — enough *introspectable* metadata to understand and present a tool they didn't author, **before** invoking it. Most of what's needed already exists in the Tool API model; the work is mostly **surfacing** it over the CLI, plus **one genuinely additive** piece (richer input schema). Two deliverables (A additive, B surfacing); each can ship as its own MR. This issue is the umbrella proposal for a shared discussion. ## Background This comes out of building [`canvas_tools`](https://www.drupal.o… ### [Introduce support for Discovery, Planning and Execute calls for MCP and Agents](https://git.drupalcode.org/project/tool/-/work_items/3546292) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, AI Innovation Description: >>> [!note] Migrated issue Reported by: [michaellander](https://www.drupal.org/user/636494) >>> Problem/Motivation The challenge with MCP right now is there seems to be a soft cap around 40 tools, and because all tools are sent on every request, more noise = more hallucinations and more failures. AI Agents on the other hand have similar degradation with tool counts, but are also currently lacking a reliable short term memory layer for better context management, meaning chaining many tool calls together quickly hits caps for requests/tokens. Proposed resolution We can reduce some of the to… --- MERGE REQUESTS (24h) --- ### [fix: #3582947 tool_ai_connector does not handle tools returning list of entities](https://git.drupalcode.org/project/tool/-/merge_requests/96) State: closed | Author: Ajit Shinde (ajits) | Branch: 3582947-issue-branch | 87 diff lines Description: Closes #3582947 --- COMMITS (24h) --- - [f9fc6353](https://git.drupalcode.org/project/tool/-/commit/f9fc6353c1bddbd4e73df282241d0f1e622c6f8f) fix: #3582986 require the logger channel and document the subclass redeclaration contract — Michael Lander (2026-08-11T03:22:20.000+00:00) - [c62aa6f8](https://git.drupalcode.org/project/tool/-/commit/c62aa6f8986dec160828b44457b34ba2124bfa3e) fix: #3582985 cast ArrayObject schema values to arrays before building AI tool properties — Michael Lander (2026-08-10T20:30:47.000-06:00) - [a7001a31](https://git.drupalcode.org/project/tool/-/commit/a7001a3118e302606d8f92e647cf747645e60394) Fix fromDataDefinition: fall back for missing labels and toArray type keys. — Michael Lander (2026-08-10T16:25:32.000-06:00) - [6f40d777](https://git.drupalcode.org/project/tool/-/commit/6f40d777f9ac75198bcd89cdf474d08d9bfe2a13) Resolve "Coerce JSON numbers to strings for decimal inputs" — Michael Lander (2026-08-10T22:48:09.000+00:00) - [c8d44c33](https://git.drupalcode.org/project/tool/-/commit/c8d44c33904f0538174203bfcdb90abdb8a9a5d4) Enforce checkRequirements() in execute() and exclude unmet tools from the AI function list. — Michael Lander (2026-08-10T22:21:05.000+00:00) - [a52c5712](https://git.drupalcode.org/project/tool/-/commit/a52c571295fca44de59fe1f97ad0888eb24858b3) Add kernel coverage: locked/configuration inputs, refiner flow, definition... — Michael Lander (2026-08-10T21:56:59.000+00:00) - [46ca7054](https://git.drupalcode.org/project/tool/-/commit/46ca7054deea0da5710a18f844340aac54264ae9) fix: #3582964 own execution contract: result value interfaces, accessors on... — Michael Lander (2026-08-10T21:04:41.000+00:00) - [87a448f3](https://git.drupalcode.org/project/tool/-/commit/87a448f3a562546dd7f98ec457f1783546c82b6b) fix: #3582962 correct API signatures: factory overrides, null context values,... — Michael Lander (2026-08-10T20:44:43.000+00:00) - [c4729a51](https://git.drupalcode.org/project/tool/-/commit/c4729a512f7f76b2f752fe0062a8740be7ec0bd6) fix: #3582965 drop the unimplemented cacheability contract from ToolInterface — Michael Lander (2026-08-10T14:07:27.000-06:00) - [8facc7b2](https://git.drupalcode.org/project/tool/-/commit/8facc7b243b00984978ee230ad1354156c00b732) fix: #3582963 prefix the adapter alter hook and cache key; keep the generic... — Michael Lander (2026-08-10T19:55:09.000+00:00) - [d35b29d1](https://git.drupalcode.org/project/tool/-/commit/d35b29d170f65088c1cf321fe34da48736502a88) fix: #3582982 validate list definition items and name failing positions — Michael Lander (2026-08-10T13:22:39.000-06:00) - [9b6ed79b](https://git.drupalcode.org/project/tool/-/commit/9b6ed79bec9b441ab549c9a79ef5d2f66bc53097) Make input violation messages translatable; log unexpected exceptions instead... — Michael Lander (2026-08-10T19:15:06.000+00:00) - [8c36e7d4](https://git.drupalcode.org/project/tool/-/commit/8c36e7d45a0b1923468b342485725479131985b8) fix: #3582961 fail closed when tool input is invalid or missing — Alex Urevick-Ackelsberg (2026-08-10T18:44:19.000+00:00) - [e90e3c7e](https://git.drupalcode.org/project/tool/-/commit/e90e3c7eff1c200aa6689d7d34196aca5ec5e92e) Rethrow un-storable input values as InputException naming the input. — Michael Lander (2026-08-10T18:17:21.000+00:00) - [c9989e57](https://git.drupalcode.org/project/tool/-/commit/c9989e57112b34f83d6769556fcf5c1b0b4c68a8) fix: #3582960 validate every multiple input item — Alex Urevick-Ackelsberg (2026-08-10T18:00:18.000+00:00) - [7cee117c](https://git.drupalcode.org/project/tool/-/commit/7cee117cc1860dd418fe1ea2209bf3cf33d81fb6) Extend input coercion: JSON-string structures, enum near-misses, datetime... — Michael Lander (2026-08-10T17:47:05.000+00:00) - [9cf12485](https://git.drupalcode.org/project/tool/-/commit/9cf12485966600d2baf3132924dffe3a5c2752b9) Resolve "Emit richer JSON Schema: map remaining constraints and type formats" — Michael Lander (2026-08-10T17:07:47.000+00:00) ======================================================================== ## [21] summariseModule:canvas:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Drupal Canvas (machine name: canvas) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Adam G-H (phenaproxima), Alamgir Hossain (alamgir.hossain.cse), Ben Mullins (bnjmnm), Christian López Espínola (penyaskito) [1], Dave Long (longwave), Feliksas Mazeikis (f.mazeikis), Fons Vandamme (f0ns), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Nodar Davituri (Davituri), Rajab Natshah (RajabNatshah), Ted Bowman (tedbow), Tim Plunkett (tim.plunkett) [1], Wim Leers (wimleers)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                      Drupal Canvas

                                      then use

                                      ,

                                      ,

                                        /
                                      • , and as needed. Output only the HTML fragment with no surrounding , , or
                                        tags. After the project summary prose, add a single subsection titled "

                                        How can I help on this project?

                                        " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Canvas AI: Add a dev page builder agent and wire the placement tools](https://git.drupalcode.org/project/canvas/-/work_items/3591921) State: opened | Updated: 2026-08-11 | Author: AKHIL BABU (AkhilBabu) | Assigned: AKHIL BABU (AkhilBabu) | Labels: 2026Sprint16, AI Initiative Sprint, ai, ai::inside Description: ## Summary Add an `ai_agent` config entity to `canvas_dev_ai` that builds a page by placing one component row per hop, and wire the four placement tools that currently ship inert. Part of https://git.drupalcode.org/project/canvas/-/work_items/3591777. ## Current behavior `canvas_dev_ai` runs one agent per chat turn as a client-side hop loop, and only `canvas_component_agent` is wired to it — so the dev flow can build JS code components but cannot build a page. `canvas_ai:place_components`, `canvas_ai:edit_components`, `canvas_ai:set_page_value` and `canvas_ai:get_component_details` are all … ### [Canvas AI: Expose Props of Blocks to the Agent](https://git.drupalcode.org/project/canvas/-/work_items/3569120) State: closed | Updated: 2026-08-11 | Author: drupalbot | Assigned: unassigned | Labels: 2026Sprint14, 2026Sprint16, AI Initiative, AI Initiative Sprint Description: >>> [!note] Migrated issue Reported by: [akhil babu](https://www.drupal.org/user/3632866) Related to !498 >>> Overview Currently CanvasAiPageBuilderHelper::getAllComponentsKeyedBySource() does this <?php      if ($source === SingleDirectoryComponent::SOURCE_PLUGIN_ID) {        $this->processSdc($component, $sdc_definitions, $output);      }      elseif ($source === JsComponent::SOURCE_PLUGIN_ID) {        $this->processCodeComponents($co… ### [Canvas AI: page builder discards the whole build when the LLM names a region that does not exist](https://git.drupalcode.org/project/canvas/-/work_items/3591876) State: opened | Updated: 2026-08-11 | Author: Rajab Natshah (RajabNatshah) | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1423 [fix: #3591876 Validate the target region before placing components](https://git.drupalcode.org/project/canvas/-/merge_requests/1423) | State: opened | Author: Rajab Natshah (RajabNatshah), 544 diff lines Description: ## Problem/Motivation `CanvasAiPageBuilderHelper` throws when the AI names a target region that is not present in the current layout: ``` Region "%s" not found in layout ``` The LLM commonly guesses a generic region name that does not exist on the entity's actual layout (for example `content` capitalized, `0`, or `header` on a single-region layout). The exception aborts the entire page-build operation, so the whole AI response is discarded instead of degrading gracefully into a usable page. ## Steps to reproduce 1. Use the Canvas AI page builder to add components on a page whose layout do… ### [Header region height is calculated incorrectly in Canvas editor](https://git.drupalcode.org/project/canvas/-/work_items/3591935) State: opened | Updated: 2026-08-11 | Author: Pamela Barone (pameeela) | Assigned: unassigned | Labels: Description: Since the 1.9.0 release, the height of the header region in the Canvas editor is calculated incorrectly, it is too large, and covers the content section below. On some sites it's massive and blocks components at the top of the page from being selected, you have to use the tree to click on them. Reproduced using the Blank site template with Drupal CMS. Before (1.8.0) After (1.9.0+) ### [Dependency Dashboard](https://git.drupalcode.org/project/canvas/-/work_items/3591657) State: opened | Updated: 2026-08-11 | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Assigned: unassigned | Labels: projectManagement Description: This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more. ## Repository Problems Renovate tried to run on this repository, but found these problems. - ⚠️ WARN: Failed to set branch status - ⚠️ WARN: No github.com token has been configured. Skipping release notes retrieval - ⚠️ WARN: Rate limit exceeded for api.github.com, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN - ⚠️ WARN: No tool releases found. ## Deprecations / Replacements > ⚠️ **Warning** > The foll… ### [Add component label to settings form](https://git.drupalcode.org/project/canvas/-/work_items/3591934) State: opened | Updated: 2026-08-11 | Author: Andrew Morton (mortona2k) | Assigned: Lauri Timmanee (lauriii) | Labels: Needs design Description: Sometimes the context of what you're editing can get lost. For example, if the selected component is scrolled out of view or the UI has glitched from a recent action, or delayed update. I've seen this happen when doing things quickly. A simple fix that would help is adding the component label to the top of the settings form. ### [Fix cache contexts being added as cache tags in ContentTemplate::normalizeForClientSide()](https://git.drupalcode.org/project/canvas/-/work_items/3591933) State: opened | Updated: 2026-08-10 | Author: Lauri Timmanee (lauriii) | Assigned: unassigned | Labels: Description: ### Overview `ContentTemplate::normalizeForClientSide()` passes the result of `EntityTypeInterface::getListCacheContexts()` to `addCacheTags()`. Cache contexts are registered as cache tags. For nodes this emits `user.node_grants:view` as a cache tag, which is not a valid tag and never gets invalidated. The existing expectations in `CanvasConfigEntityHttpApiTest` assert this value in the cache tags list, so the bug is currently locked in by tests. To reproduce, request `/canvas/api/v0/config/content_template` or a single content template and inspect the `X-Drupal-Cache-Tags` header. It conta… ### [Canvas AI: Client-side orchestration loop for Canvas AI(POC)](https://git.drupalcode.org/project/canvas/-/work_items/3591615) State: opened | Updated: 2026-08-10 | Author: AKHIL BABU (AkhilBabu) | Assigned: Ricardo Castañeda (cadence96) | Labels: 2026Sprint14, 2026Sprint16, AI Initiative Sprint, ai Description: ## Problem Every Canvas AI request is a single synchronous PHP call. The full chain — orchestrator → sub-agent → tool calls → validation — must complete before the server responds. This causes two concrete failures: - **Timeouts on hosted platforms (e.g. DrupalForge).** A full page build exceeds the request time limit. The user gets nothing. - **Full regeneration on any error.** If one component in a large response fails validation, the entire response is regenerated — wasting time and tokens. There is no streaming and no partial feedback. ## How `ai_chatbot` already solves this The `ai_c… ### [canvas_test_code_components_content_entity_ref config/install fields conflict on the standard profile](https://git.drupalcode.org/project/canvas/-/work_items/3591869) State: closed | Updated: 2026-08-10 | Author: Christian López Espínola (penyaskito) | Assigned: unassigned | Labels: DX (Developer Experience), category::task, priority::normal, state::fixed Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1414 [#3591869: Provide the code-components content-entity-ref test module's shared fields via a recipe so it installs on any profile](https://git.drupalcode.org/project/canvas/-/merge_requests/1414) | State: merged 2026-08-10 | Author: Christian López Espínola (penyaskito), 85 diff lines Description: ### Overview The `canvas_test_code_components_content_entity_ref` test module ships three field config objects in `config/install`: - `field.field.user.user.user_picture.yml` - `field.storage.user.user_picture.yml` - `field.storage.node.body.yml` Tests run on the `testing` profile, where those objects do not exist, so installing the module there works. But the standard profile already provides `user.user_picture` and `node.body`. Installing the module on a standard-profile site — for example to manually test the content-entity-reference picker — fails with a config-install conflict: the con… ### [Enforce "Delete Translations" permission on the Canvas API translation delete route](https://git.drupalcode.org/project/canvas/-/work_items/3591784) State: opened | Updated: 2026-08-10 | Author: Kunal Sachdev (kunal.sachdev) | Assigned: Narendra Singh Rathore (NarendraR) | Labels: category::task, priority::normal, state::toBePorted, translation Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1398 [#3591784: Revert MR !1342 "delete content translations" permission requirement](https://git.drupalcode.org/project/canvas/-/merge_requests/1398) | State: merged 2026-07-23 | Author: Ted Bowman (tedbow), 108 diff lines Description: **Overview** The `delete content translations` permission (provided by the `content_translation` module) is intended to control whether a user can delete translations for content entities. However, the Canvas API route responsible for deleting content (canvas_page) translations does not currently require this permission. The route `canvas.api.content.translation.delete `(`/canvas/api/v0/content/canvas_page/{canvas_page}/translations`) only checks `_entity_access: 'canvas_page.update'`. A user who has the canvas_page update permission but not the delete content translations permission can curr… ### [Align Canvas UI translation operations and access with content_translation/TMGMT](https://git.drupalcode.org/project/canvas/-/work_items/3591932) State: opened | Updated: 2026-08-10 | Author: Ted Bowman (tedbow) | Assigned: unassigned | Labels: category::task, priority::normal, translation, v1.x-dev Description: **Overview** Follow-up to https://git.drupalcode.org/project/canvas/-/work_items/3591784, which reverted !1342 in !1398. That issue's scope was narrowed to the revert only; the underlying problems are broader than which route requires which permission. The Canvas editor's language dropdown offers a single translation operation — "Delete translation" — gated on `_entity_access: 'canvas_page.update'` (route `canvas.api.content.translation.delete`, `canvas.routing.yml`). Core gates translation operations through `content_translation_translate_access()`, where a "Create|Update|Delete translation… ### [Apply saved config language override to auto-saved versions in layout](https://git.drupalcode.org/project/canvas/-/work_items/3583043) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: autoSave, category::task, priority::normal, state::postponed Description: >>> [!note] Migrated issue Reported by: [tedbow](https://www.drupal.org/user/240860) Related to !864 >>> Overview Experiment with applying Config Language Config override on API layout routes Proposed resolution User interface changes ### [Stage Canvas autosaves in a dedicated Workspace](https://git.drupalcode.org/project/canvas/-/work_items/3588540) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: autoSave, category::task, priority::normal, state::accepted Description: >>> [!note] Migrated issue Reported by: [lauriii](https://www.drupal.org/user/1078742) Related to !1056 >>> Overview Autosave relies on key-value storage today and bypass the entity system. That means the current autosave solution is completely out of normal entity save flows. The goal for a long time has been to replace that by staging pending edits in Drupal Workspaces. Proposed resolution Make Workspaces the primary autosave staging layer so autosave no longer depends on key-value store as the main store: migrate existing key-value rows to revisions in a Workspace, persist new autosave… ### [Multi-bundle content-entity-reference picks reading multiple fields per bundle coalesce into an unrenderable object](https://git.drupalcode.org/project/canvas/-/work_items/3591873) State: opened | Updated: 2026-08-10 | Author: Christian López Espínola (penyaskito) | Assigned: Christian López Espínola (penyaskito), Wim Leers (wimleers) | Labels: category::bug, data integrity, dataModel, priority::major Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1431 [Resolve multi-bundle CER picks reading several fields per bundle](https://git.drupalcode.org/project/canvas/-/merge_requests/1431) | State: opened | Author: Christian López Espínola (penyaskito), 1821 diff lines Description: ## Overview When a multi-target-bundle `content-entity-reference` prop reads **more than one field from a bundle**, the Coalescer folds the picks into a single `FieldObjectPropsExpression` on the referencer field, with one object property per field read (`Coalescer::coalesceReferencerFieldGroup()`, documented at its docblock). That object descends the multi-bundle reference and holds **bundle-specific properties**. Such an object is **unrenderable**. At render, `Evaluator::evaluate()` evaluates every object property against the one resolved referenced entity, and `Evaluator::shouldOmitUnmatc… ### [Expand conflict detection and resolution entity types other than Page](https://git.drupalcode.org/project/canvas/-/work_items/3591544) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Feliksas Mazeikis (f.mazeikis) | Labels: Conflict resolution, auto-save, autoSave, backend Description: >>> [!note] Migrated issue Reported by: [f.mazeikis](https://www.drupal.org/user/3513671) >>> Overview Initial implementation of #3587587 will expand current conflict detection and will add new "review of changes" and "conflict resolution UI". To limit the scope of work, new functionality will be added only to Page entities. This issue describes how this new functionality will be expanded to additional Canvas entity types. Specifically, this is a placeholder issue that will be used in BE child issues of #3587587 to document planned changes and link various @todo sections as the work progre… ### [Missing upgrade path: stored `default-relative-url` prop sources written before 1.8 contain `$id` and fail `DefaultRelativeUrlPropSource::parse()`](https://git.drupalcode.org/project/canvas/-/work_items/3591904) State: opened | Updated: 2026-08-10 | Author: Marco (marco.nett) | Assigned: unassigned | Labels: AI-accelerated, Regression, category::bug, data integrity Description: ## Problem / Motivation After updating Canvas 1.4.1 → 1.8.0, opening the editor for any page whose component tree contains a `default-relative-url` prop source returns a 500 from `/canvas/api/v0/layout/{entity_type}/{id}`: ``` LogicException: Extraneous JSON Schema information detected: { "$id": "json-schema-definitions://canvas.module/image", ... } should have been just { ... } ``` ## Root cause - Canvas ≤ 1.4 stored the resolved JSON schema of `default-relative-url` prop sources including the `$id` keys the schema resolver emits (e.g. `json-schema-definitions://canvas.module/imag… ### [Array prop shapes don't inherit their item shape's cache tags, so prop-shape invalidation misses them](https://git.drupalcode.org/project/canvas/-/work_items/3591917) State: closed | Updated: 2026-08-10 | Author: Christian López Espínola (penyaskito) | Assigned: Christian López Espínola (penyaskito) | Labels: category::bug, priority::normal, shapeMatching, state::fixed Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1475 [#3591917 Array prop shapes inherit their item shape's cache tags](https://git.drupalcode.org/project/canvas/-/merge_requests/1475) | State: merged 2026-08-07 | Author: Christian López Espínola (penyaskito), 284 diff lines Description: ### Overview Components with an array prop (e.g. an array-of-images prop, mapped to a multi-value field) do not get a new version when config changes the storable prop shape of the array's *items* — even in situations where components using the same item shape directly *do* get one. Cause: when an array shape's storable prop shape is computed, the item shape is resolved through the prop shape repository and its field type, widget, and settings are copied into the array's `StorablePropShape` — but the cache tags that alter hooks attach to the *item* candidate (e.g. `config:media_type_list` fr… ### [Automatically create components when themes are installed](https://git.drupalcode.org/project/canvas/-/work_items/3591898) State: opened | Updated: 2026-08-10 | Author: Adam G-H (phenaproxima) | Assigned: unassigned | Labels: Recipes initiative, configManagement, priority::major Description: With certain narrow exceptions, site templates -- and recipes more broadly -- should not be in the business of shipping `component` config entities. Component entities are ill-suited to be included in recipes because they are, fundamentally, **non-transferable**. They are the version history of a component as it has existed _in a particular site_. But a recipe is not a snapshot of a particular site; it is a generic package of configuration and setup steps. Up until now, Drupal CMS has worked around this by including the component entities in recipes' configuration. This has proven to be comp… ### [Docs oriented to recipe authors integrating with Canvas](https://git.drupalcode.org/project/canvas/-/work_items/3564135) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: Contributed project blocker, DX (Developer Experience), Recipes initiative, category::task Description: >>> [!note] Migrated issue Reported by: [penyaskito](https://www.drupal.org/user/959536) >>> Overview We have very technical docs in markdown format at docs/* targeted to developers and contributors. We have (hope not so technical) user docs exposed as a website at https://project.pages.drupalcode.org/canvas/, with sources at docs/user/*, targeted to users and component developers. We miss an "intermediate" technical level here: docs targeted to e.g. recipe authors, where we could document the requirements for e.g. shipping patterns, potential error messages and how to solve them, etc. Pro… ### [Allow Canvas Patterns+PageRegions+ContentTemplates provided by Recipes to NOT specify component versions](https://git.drupalcode.org/project/canvas/-/work_items/3571366) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Matt Glaman (mglaman) | Labels: AI-accelerated, Chicago2026, DX (Developer Experience), Drupal CMS dependency critical Description: >>> [!note] Migrated issue Reported by: [penyaskito](https://www.drupal.org/user/959536) Related to !811 >>> Overview In https://git.drupalcode.org/project/canvas/-/work_items/3567413 we added the infra for updating component instances to the latest (active) version if there is no data impact. That is pretty defensive per nature, so we ensure no data loss. But there are some cases where e.g. contrib should be able to impact that. e.g. In \Drupal\canvas\Hook\ShapeMatchingHooks::mediaLibraryStorablePropShapeAlter we implement hook_canvas_storable_prop_shape_alter for media_library, and for… ### [component_tree sequence keys sorted lexicographically instead of numerically, breaking component order at 10+ instances per level](https://git.drupalcode.org/project/canvas/-/work_items/3582200) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: hanmant.sapkal, Ted Bowman (tedbow) | Labels: Release Blocker, category::bug, data integrity, dataModel Description: >>> [!note] Migrated issue Reported by: [hanmant.sapkal](https://www.drupal.org/user/956996) Related to !818 >>> Overview ContentTemplate::set('component_tree', ...) and similar Canvas config entities call ComponentTreeItemListInstantiatorTrait::generateComponentTreeKeys() to normalize component tree order. That method ends by calling ksort($keyed_tree), which sorts keys lexicographically as strings instead of as hierarchical paths. This breaks layout order once there are more than 10 top-level components because keys like 10, 11, and 12 are sorted before 5, 6, 7, 8, and 9. Child keys suc… ### [Strengthen AutoSaveManager to generate stable hashes](https://git.drupalcode.org/project/canvas/-/work_items/3591785) State: opened | Updated: 2026-08-10 | Author: Feliksas Mazeikis (f.mazeikis) | Assigned: Feliksas Mazeikis (f.mazeikis) | Labels: 1.x-dev, Conflict resolution, auto-save, autoSave Description: When AutoSaveManager normalizes entity, it is doing so without using strictly casted values. The set of normalized entity calues is used for `data_hash` hash computation. As the contents of the normalized entities are not strictly casted, the resulting hashes cannot be relied upon. The aim of this issue is to strengthen, simplify and standardise normalization and hashing processes happening in AutoSaveManager. ### [Checkmark and options menu disappear from LanguageSelect on preview page refresh](https://git.drupalcode.org/project/canvas/-/work_items/3591798) State: closed | Updated: 2026-08-10 | Author: Kunal Sachdev (kunal.sachdev) | Assigned: unassigned | Labels: category::bug, priority::normal, state::fixed, translation Description: **Overview** When a user selects a non-default language from the LanguageSelect dropdown in the Canvas UI and is taken to the preview page, the language dropdown correctly shows: - checkmark beside languages that have an existing translation. - (3-dot) options menu beside those languages. However, if the user refreshes the browser on that preview URL, or navigates directly to it, all checkmarks and 3-dot menus disappear from every language in the dropdown. ### [Publishing a symmetrically-translated canvas_page 422s when a default-language edit changes a non-translatable component input](https://git.drupalcode.org/project/canvas/-/work_items/3591820) State: closed | Updated: 2026-08-10 | Author: Nodar Davituri (Davituri) | Assigned: Ted Bowman (tedbow) | Labels: Conflict resolution, Release Blocker, auto-save, category::bug Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1363 [fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish](https://git.drupalcode.org/project/canvas/-/merge_requests/1363) | State: merged 2026-07-28 | Author: Nodar Davituri (Davituri), 848 diff lines Description: ### Overview Publishing an auto-saved `canvas_page` fails with HTTP 422 when the default-language edit changed a non-translatable ("symmetric") component input — e.g. an image `width`/`loading` attribute, a section `padding_bottom`, or a `heading` component's `element` (h1-h6) — on a component instance that also exists in a non-default-language translation. `ApiAutoSaveController::post()` validates the entity (`getConflictAwareContentEntityViolations()` -> `$entity->validate()`) before `$entity->save()` runs `content_translation`'s presave field synchronizer. The auto-save snapshot applied i… ### [Prefix-strip redirect misses default-language prefixes and is overridden by ?destination](https://git.drupalcode.org/project/canvas/-/work_items/3591839) State: opened | Updated: 2026-08-10 | Author: Fons Vandamme (f0ns) | Assigned: unassigned | Labels: Drupal canvas, category::bug, priority::major, state::needsReview Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1387 [bug: #3591839 Preserve the query string when stripping the language prefix; a...](https://git.drupalcode.org/project/canvas/-/merge_requests/1387) | State: opened | Author: Fons Vandamme (f0ns), 331 diff lines Description: ## Problem/Motivation Follow-up to #3591585. That issue added `CanvasRouteOptionsEventSubscriber::redirectCanvasToDefaultLanguage()`, which strips the language prefix from `/canvas` paths with a 302 redirect. It has two gaps: 1. The redirect only runs when the current language differs from the default. Drupal allows a URL prefix for the default language too. In that case current equals default, the redirect is skipped, and the editor receives a prefixed path. The React app cannot route it and renders an empty gray screen. 2. The redirect drops the query string, and a `destination` query pa… ### [PHPStan failing on global $argv usage](https://git.drupalcode.org/project/canvas/-/work_items/3591931) State: closed | Updated: 2026-08-10 | Author: Tim Plunkett (tim.plunkett) | Assigned: Tim Plunkett (tim.plunkett) | Labels: DX (Developer Experience), PHPStan, category::task, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1485 [fix: #3591931 Do not rely on $argv being a global](https://git.drupalcode.org/project/canvas/-/merge_requests/1485) | State: merged 2026-08-10 | Author: Tim Plunkett (tim.plunkett), 16 diff lines Description: A few recent pipelines are failing with ``` ------ ----------------------------------------------------------------- Line tests/src/Playwright/scripts/exclude-config-schema-checking.php ------ ----------------------------------------------------------------- 43 Variable $argv might not be defined. 🪪 variable.undefined ------ ----------------------------------------------------------------- ``` But it's only failing sometimes, and I can't find out why. Google says that $argv can't be trusted o… ### [Code editor: developers cannot see what a content-entity-reference prop delivers to their component](https://git.drupalcode.org/project/canvas/-/work_items/3591805) State: opened | Updated: 2026-08-10 | Author: Lauri Timmanee (lauriii) | Assigned: Lauri Timmanee (lauriii) | Labels: DX (Developer Experience), JavaScript, category::feature, priority::normal Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1351 [Add a entity reference prop data shape preview to code editor](https://git.drupalcode.org/project/canvas/-/merge_requests/1351) | State: opened | Author: Lauri Timmanee (lauriii), 3691 diff lines Description: ## Problem/Motivation When a code component has a content-entity-reference prop, the developer picks an entity type, bundle, and fields, but the props panel gives no indication of the payload shape the component will actually receive. The payload keys do not always match the picked field names (entity keys are normalized, e.g. a node's title arrives as "label", uid as "owner"; referenced entities nest as objects with a "\__type" key), so developers have to guess, read module internals, or debug at runtime. There is also no way to try the prop against real content while editing. ## Proposed r… ### [PHPStan rule: needs*() config detectors must not mutate the entity they inspect](https://git.drupalcode.org/project/canvas/-/work_items/3591855) State: closed | Updated: 2026-08-10 | Author: Christian López Espínola (penyaskito) | Assigned: Adam G-H (phenaproxima) | Labels: DX (Developer Experience), PHPStan, category::task, data integrity Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1416 [Add PHPStan rule: needs*() config detectors must not mutate the entity they inspect](https://git.drupalcode.org/project/canvas/-/merge_requests/1416) | State: merged 2026-08-08 | Author: Christian López Espínola (penyaskito), 241 diff lines Description: ### Overview Canvas's data-health "escaped config" check (`Doctor::runUpdatesEscapedConfigCheck()`) reflects and runs every `needs*()` detector on `CanvasConfigUpdater` against a single, shared, loaded config entity to decide whether that config has a pending data-model migration. These detectors must be side-effect-free: if one mutates the entity it is passed, the change leaks into every detector that runs after it on the same entity, silently corrupting the audit's result. Today that contract is enforced only by convention and review. It has already been violated twice in practice: one det… ### [Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing](https://git.drupalcode.org/project/canvas/-/work_items/3581133) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: Adam G-H (phenaproxima), Wim Leers (wimleers) | Labels: AI-accelerated, Chicago2026, DX (Developer Experience), Novice Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !1297 [#3581133: Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing](https://git.drupalcode.org/project/canvas/-/merge_requests/1297) | State: merged 2026-07-30 | Author: Wim Leers (wimleers), 6040 diff lines Description: >>> [!note] Migrated issue Reported by: [wim leers](https://www.drupal.org/user/99777) Related to !797 >>> Overview :pray: Let's use the `FQCN::class` wherever we can. Reduces magic, makes it easier to navigate & understand these tests. — yours truly at https://git.drupalcode.org/project/canvas/-/merge_requests/651#note_727491 Proposed resolution Automate this feedback. User interface changes None. ### [Canvas AI: Add Tools dropdown to chat UI](https://git.drupalcode.org/project/canvas/-/work_items/3591856) State: opened | Updated: 2026-08-10 | Author: AKHIL BABU (AkhilBabu) | Assigned: Bruno Bruno (bbruno) | Labels: 1.x-dev, 2026Sprint15, 2026Sprint16, AI Initiative Sprint Description: ## Background — how Canvas AI works today The Canvas AI chat is an **orchestrator system**. Every message goes first to a single orchestrator agent. The orchestrator reads the message, infers the intent, and launches the matching sub-agent: - "Build me a landing page" → orchestrator → page-builder sub-agent - "Create a React component" → orchestrator → component sub-agent - "Write a title / meta description" → orchestrator → the relevant sub-agent The routing is implicit — the user never chooses which sub-agent runs; the orchestrator decides on every turn. Roadmap: https://git.drupalcode.o… ### [[upstream] Data loss: `drush config:import` deletes config (e.g. code component + component config entities) and bypasses config system data integrity checks](https://git.drupalcode.org/project/canvas/-/work_items/3573022) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: Christian López Espínola (penyaskito) | Labels: 2026Sprint16, AI Initiative Sprint, Needs tests, Needs upstream bugfix Description: >>> [!note] Migrated issue Reported by: [bernardm28](https://www.drupal.org/user/3624259) >>> Overview I have a hosted website, and I used 3 code components to overcome minor issues that were minor and were mostly just client-side or specific overrides from some css styles. Everything seems to work well until I go back to the website, and my page is WSOD. Upon further examination and local testing, I guess that something upstream at the hosting level created a deployment, and Drush did a Drush deploy and deleted the configuration of my code components. Here are the steps to reproduce it: … --- MERGE REQUESTS (24h) --- ### [chore(deps): update dependency cspell to v10](https://git.drupalcode.org/project/canvas/-/merge_requests/1273) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/major-cspell-monorepo | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [cspell](https://cspell.org/) ([source](https://github.com/streetsidesoftware/cspell/tree/HEAD/packages/cspell)) | [`^9.2.0` → `^10.0.0`](https://renovatebot.com/diffs/npm/cspell/9.7.0/10.0.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/cspell/10.0.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/cspell/9.7.0/10.0.1?slim=true) | > :exclamation: **I… ### [chore(deps): update dependency @eslint/compat to v2](https://git.drupalcode.org/project/canvas/-/merge_requests/1306) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/eslint-compat-2.x | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@eslint/compat](https://github.com/eslint/rewrite/tree/main/packages/compat#readme) ([source](https://github.com/eslint/rewrite/tree/HEAD/packages/compat)) | [`^1.3.1` → `^2.0.0`](https://renovatebot.com/diffs/npm/@eslint%2fcompat/1.4.1/2.1.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@eslint%2fcompat/2.1.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confide… ### [chore(deps): update dependency @chromatic-com/storybook to v5](https://git.drupalcode.org/project/canvas/-/merge_requests/1305) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/chromatic-com-storybook-5.x | 13 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@chromatic-com/storybook](https://github.com/chromaui/addon-visual-tests) | [`^3.2.2` → `^5.0.0`](https://renovatebot.com/diffs/npm/@chromatic-com%2fstorybook/3.2.7/5.2.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@chromatic-com%2fstorybook/5.2.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@chromatic-com%2fstorybook/3.2.7/5.2.1?slim=true) | >… ### [fix(deps): update npm minor and patch](https://git.drupalcode.org/project/canvas/-/merge_requests/1238) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/npm-minor-and-patch | 55 diff lines Description: This MR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@axe-core/playwright](https://github.com/dequelabs/axe-core-npm) | [`4.11.1` → `4.12.1`](https://renovatebot.com/diffs/npm/@axe-core%2fplaywright/4.11.1/4.12.1) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@axe-core%2fplaywright/4.12.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@axe-core%2fplaywright/4.11.1/4.12.1?slim=true) | | [@babel/parser](… ### [chore(deps): update mysql docker tag to v8.4](https://git.drupalcode.org/project/canvas/-/merge_requests/1272) State: opened | Author: **** (project_19391_bot_cb443e60680723bba08a5351bf595251) | Branch: renovate/mysql-8.x | 13 diff lines Description: This MR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [mysql](https://hub.docker.com/_/mysql) ([source](https://github.com/docker-library/mysql)) | service-image | minor | `8.0` → `8.4` | > :exclamation: **Important** > > Release Notes retrieval for this MR were skipped because no github.com credentials were available. > If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes). --- ### Configuration 📅 **Schedule**: (UTC) - Br… ### [#3591838 [PHASE 2] introduce color props](https://git.drupalcode.org/project/canvas/-/merge_requests/1432) State: opened | Author: Ben Mullins (bnjmnm) | Branch: 3591838-phase-2-color-props | 4531 diff lines Description: This adds support for a 'color' prop type that supports two modes * **Freeform**, which has a color picker and all available brand kit colors * **Brand Kit** Which is limited to Brand Kit colors only, and can be filtered to only show colors from specific folders This MR also adds the widget for editing props of the 'color' type. Note that the color prop is stored as a string, which is either the CSS color value (rgb, hsl, etc) or a reference to a color entity. The prop value provided to templates is not this string value, but an object with the CSS color value, the W3C Color Token value, a… ### [Draft: #3591838 Phase 3: Usage data + deletion](https://git.drupalcode.org/project/canvas/-/merge_requests/1479) State: opened | Author: Ben Mullins (bnjmnm) | Branch: 3591838-phase-3-usage-data | 7191 diff lines Description: [Description of changes] ## Testing instructions - [ ] First step for someone to test the changes in this MR Closes #3591838 ### [Add the entity type's list cache contexts as cache contexts, not as cache tags.](https://git.drupalcode.org/project/canvas/-/merge_requests/1486) State: opened | Author: Lauri Timmanee (lauriii) | Branch: 3591933-fix-cache-contexts-being-added-as-cache-tags-in-contenttemplatenormalizeforclientside | 133 diff lines Description: Co-created with Claude Code. ## Testing instructions - [ ] First step for someone to test the changes in this MR Closes ### [task: #3567225 Make the component tree loader extensible](https://git.drupalcode.org/project/canvas/-/merge_requests/948) State: closed | Author: Rajab Natshah (RajabNatshah) | Branch: 3567225-allow-per-node-override | 29 diff lines Description: Refs #3567225 ## Summary Removes `final` from `ComponentTreeLoader` and widens its two promoted constructor properties to `protected`, so a contrib module can subclass it and swap the service. That is the whole change: one file, one hunk. ## Why this merge request shrank It previously carried the full per-node Content Template override feature across 11 files. That has been reverted here, leaving only the extension point, for two reasons. **The extension point is the part with a caller waiting on it.** [Canvas Override](https://www.drupal.org/project/canvas_override) subclasses `Componen… ### [Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields](https://git.drupalcode.org/project/canvas/-/merge_requests/1376) State: merged 2026-07-23 | Author: Christian López Espínola (penyaskito) | Branch: 3591829-multi-bundle-cer-branch-coalescing | 453 diff lines Description: Closes #3591829. Low-level prop-expression infrastructure for authoring multi-target-bundle `content-entity-reference` picks whose per-bundle field selections differ. Blocks #3591656, which exposes and renders the feature and owns the constraint/validator changes and the CER integration tests. ## What this MR does - **Parser + serializer** (`FieldObjectPropsExpression`): round-trips a bundle-specific branch nested in an object prop (`label↝entity␜[branch][branch]`). Nested branching stays rejected via the existing `parseBranches()` depth guard. - **Coalescer**: groups standalone references … ### [#3591851: Allow editing stored patterns](https://git.drupalcode.org/project/canvas/-/merge_requests/1403) State: merged 2026-08-04 | Author: Dave Long (longwave) | Branch: 3591851-edit-stored-patterns | 1757 diff lines Description: * Adds "Edit pattern" to the pattern library * Patterns can have components added, changed and removed * Patterns can be renamed * Save/publish works in the same way as pages and content templates AI-Generated: Yes (Used Claude Code to develop almost all the changes and write the tests, with manual testing in between) ## Testing instructions - [ ] Create a pattern then click "Edit pattern" in the pattern library - [ ] Add, update, remove components in the pattern - [ ] Save the changes - [ ] Ensure the changes remain after reloading the editor or placing the pattern elsewhere - [ ] Rename th… ### [fix(ui): #3591716 boolean props auto-enable when another prop is changed](https://git.drupalcode.org/project/canvas/-/merge_requests/1285) State: closed | Author: Alamgir Hossain (alamgir.hossain.cse) | Branch: 3591716-fix-boolean-props-auto-enable | 96 diff lines Description: ## Summary - Boolean props in Canvas component forms auto-enable when any other prop is changed. - Two root causes identified and fixed across 3 files. ## Root causes & fixes **1. `|| []` coerces `false` to `[]` — `layoutModelSlice.ts` lines 559 & 566** During component drop, `buildInitialData()` ran `prop.default_values?.resolved || []`. For boolean props with default `false`: `false || [] = []` (truthy empty array). Changed to `?? []` so `false` is preserved. **2. Twig renders `element['#value']` as `'0'` during AJAX rebuilds — `input--checkbox--inwidget-boolean-checkbox.html.twig`** D… ### [fix(ui): #3591716 boolean props auto-enable when another prop is changed (1.6.0)](https://git.drupalcode.org/project/canvas/-/merge_requests/1286) State: closed | Author: Rajab Natshah (RajabNatshah) | Branch: 3591716-1.6.0 | 4888 diff lines Description: Variant of MR !1285 based on the 1.6.0 release tag, for sites on Canvas 1.6.0. Same fix: twig checkbox template, DrupalToggle, react-hook-form getCurrentValueFromProps, and layoutModelSlice falsy-default preservation. Built ui/dist bundle is provided via the release patch (gitignored on dev). ### [refactor(Conflict resolution): #3591785 Strengthen AutoSaveManager to generate stable hashes](https://git.drupalcode.org/project/canvas/-/merge_requests/1356) State: merged 2026-08-04 | Author: Feliksas Mazeikis (f.mazeikis) | Branch: 3591785-strengthen-autosave-normalization | 977 diff lines Description: ## Summary This branch consolidates the typed-data normalization logic that `AutoSaveManager` and `ComponentSourceBase` previously duplicated into a single method, `TypedDataHelper::castRawPhpTypes()`. ## What changed and why `AutoSaveManager::normalizeEntity()` (hash source) and `ComponentSourceBase::castRawTypedConfigToPhpTypes()` (component-shape normalization) each contained their own primitive-casting and traversal logic. These are merged into `TypedDataHelper::castRawPhpTypes()`, which already existed for the config typed-data path but was not wired into `toStorableArray()`. During c… ### [feat: #3518272 support all entity types with configurable displays for content templates](https://git.drupalcode.org/project/canvas/-/merge_requests/791) State: opened | Author: Adam G-H (phenaproxima) | Branch: 3518272-field-ui-base-route | 2319 diff lines Description: Closes #3518272 . ### [#3591875: "Translatable props missing from TMGMT form when component instances cannot be auto-updated to active version"](https://git.drupalcode.org/project/canvas/-/merge_requests/1418) State: opened | Author: Kunal Sachdev (kunal.sachdev) | Branch: 3591875-translatable-props-missing-from-tmgmt-form-when-component-instances-cannot-be-auto-updated-to-active-version | 1056 diff lines Description: AI-Generated: Yes (Used Github Copilot(Claude Sonnet 4.6) for the solution and test coverage). ### [Resolve #3591907 "Balance cypress E2E parallel split by runtime weight"](https://git.drupalcode.org/project/canvas/-/merge_requests/1463) State: merged 2026-08-06 | Author: Christian López Espínola (penyaskito) | Branch: 3591907-cypress-e2e-parallel-runtime-distribute | 279 diff lines Description: Closes #3591907 Cuts the slowest E2E node by ~25% on average (15–30% across runs). The improvement depends on the CI nodes assigned, but it's consistently faster feedback in any case. ## What this MR does `ui/tests/support/parallel.js` split the 46 Cypress E2E specs across the 4 CI nodes by dealing them round-robin by filename — balancing spec *count*, not runtime. The heaviest specs therefore stacked on whichever node the alphabetical order happened to fill (slowest node ~21 min vs fastest ~7). `parallel.js` now reads a `// @canvas-ci weight=N flaky` marker on the first line of a spec: -… --- COMMITS (24h) --- - [fb733321](https://git.drupalcode.org/project/canvas/-/commit/fb73332172bef99f76084a618694ba5b76cd9206) chore(Theme Builder): #3591869 canvas_test_code_components_content_entity_ref config/install fields conflict on the standard profile — Christian López Espínola (2026-08-10T15:41:08.000+00:00) - [68bb76ed](https://git.drupalcode.org/project/canvas/-/commit/68bb76ed58673c5cafa8514954c907c9853402b7) test: #3591931 Do not rely on $argv being a global — Tim Plunkett (2026-08-10T12:18:37.000+00:00) ======================================================================== ## [22] summariseModule:ai_context:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Context Control Center (CCC) (machine name: ai_context) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Abhinav Jha (ajabhinavjha30), Kristen Pol (kepol) [2]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                        Context Control Center (CCC)

                                        then use

                                        ,

                                        ,

                                          /
                                        • , and as needed. Output only the HTML fragment with no surrounding , , or
                                          tags. After the project summary prose, add a single subsection titled "

                                          How can I help on this project?

                                          " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Add context item Priority field and use it for selection ordering](https://git.drupalcode.org/project/ai_context/-/work_items/3586376) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: Kristen Pol (kepol) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::feature Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !245 [Issue #3586376: Add context item priority field and selection tie-breakers.](https://git.drupalcode.org/project/ai_context/-/merge_requests/245) | State: opened | Author: Kristen Pol (kepol), 1630 diff lines Description: ## Summary Follow-up to: #3586364+s Context selection currently breaks ties between equally weighted candidates using the item `changed` timestamp. That is opaque to editors and does not reflect editorial intent when multiple items compete for the same slots. Add a **Priority** field on context items and use it consistently when the selector chooses and orders candidates within each selection group. ## Problem When more context items qualify than fit under `max_items` (or `max_global_items`), the selector must decide which items to keep and in what order. Today: - Global, scored, and ma… ### [Remove max_items context limit and rely on the token budget](https://git.drupalcode.org/project/ai_context/-/work_items/3586378) State: closed | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !244 [Issue #3586378: Remove max_items context limit and rely on token budget.](https://git.drupalcode.org/project/ai_context/-/merge_requests/244) | State: merged 2026-08-11 | Author: Kristen Pol (kepol), 3093 diff lines Description: ## Summary Follow-up to: - #3586337+s The **Max context items to inject** setting (`max_items`) adds UX and DX complexity without providing a meaningful limit on its own. Context items vary widely in size, so a token budget is the more accurate control for how much context can reach an agent prompt. Remove `max_items` from configuration, forms, validation, selection logic, documentation, and tests. After this change, the token budget (`max_tokens`) is the primary module-wide limit on injected context. ## Problem Site builders currently configure two overlapping limits: - **Max context i… ### [Clarify and stabilize the scope plugin extension boundary for 1.0](https://git.drupalcode.org/project/ai_context/-/work_items/3586392) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !249 [Issue #3586392: Clarify and stabilize scope plugin extension boundary for 1.0.](https://git.drupalcode.org/project/ai_context/-/merge_requests/249) | State: opened | Author: Kristen Pol (kepol), 1007 diff lines Description: ## Summary Follow-up to: #3586243+s Before 1.0, lock down what custom scope authors and contrib can safely depend on, without landing the full persistence/orchestration refactor from #3586243+. This issue is documentation and internal seam-setting only: no new public interface methods and no user-visible behavior changes. The current scope plugin API is already broad enough for map-backed custom scopes, but docs and code send mixed signals. The scope manager is marked `@internal` while developer docs show injection patterns; the resolver interface docblock calls itself public while `api-st… ### [Align scope scoring, language service, and contextual selection behavior](https://git.drupalcode.org/project/ai_context/-/work_items/3586388) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, blocker::stable Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !242 [Issue #3586388: Align scope scoring and contextual detection.](https://git.drupalcode.org/project/ai_context/-/merge_requests/242) | State: opened | Author: Kristen Pol (kepol), 2318 diff lines Description: ## Summary **IMPORTANT: If #3586365+s is merged first, this issue's MR needs fixing based on that (and vice versa).** Follow-up to: #3586365 Before 1.0, align scope weight, subscription scoring, UI ordering, language handling, hard contextual filtering, and function-call listing so selection behavior is predictable, consistently documented, and safe for agent use. ### 1. Align scope display order with scoring weight Use the existing plugin weight for both subscription scoring and UI display order. A higher weight means: - Greater influence during subscription scoring - Earlier placemen… ### [CCC QA scripts for 1.0 testing](https://git.drupalcode.org/project/ai_context/-/work_items/3586226) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: Bruna Emerich (brunaemerich) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, blocker::stable Description: ## Problem/motivation Need to make sure we're ready for the QA team to do pre-1.0 testing. ## Solution From Bruna Emerich (Zoocha): Documentation covering the functionality, along with a test script (such as the example in this ticket, where an .md file is included), is sufficient for us to carry out testing. If any questions come up, we’ll raise them directly in the channel and tag you. Regarding lead time, it depends on the size of the functionality, but generally one week’s notice is sufficient. If there’s a fixed release date, allowing around 14 days is preferable, as it gives enough … ### [Redesign selection modes as a nested Minimal / Relevant / Broad ladder and remove match_all](https://git.drupalcode.org/project/ai_context/-/work_items/3586394) State: opened | Updated: 2026-08-11 | Author: Kristen Pol (kepol) | Assigned: Kristen Pol (kepol) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::feature Description: ## Problem/motivation Follow-up to: #3586237+s Add this one follow-up from https://git.drupalcode.org/project/ai_context/-/merge_requests/244#note_1709155: "The token budget is a soft ceiling (truncation at item boundaries + prefix overhead can slightly exceed it, with a warning logged) — pre-existing renderer behavior" --- Agent context selection is confusing today because the two selection modes encode mechanisms instead of user intent, and they are not supersets of each other: - **Minimal** (default) with **no subscriptions** injects almost nothing except Global, Always include, an… ### [Switch CCC documentation link to clean version](https://git.drupalcode.org/project/ai_context/-/work_items/3586370) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint17, ai::internal, category::task, priority::normal Description: **Note that this could be done after the 1.0 release.** ## Problem I tried switching the documentation link: https://ai-context-b13f05.pages.drupalcode.org/ to https://ai-context.pages.drupalcode.org/ via the settings in gitlab including rerunning a CI build to get it in place. But it never worked. ## Solution Figure out how to get it to work properly. Note it shows up here ./ai_context.module: ':docs' => 'https://ai-context-b13f05.pages.drupalcode.org/', and is linked from the d.o project page ### [Document real-world use cases for CCC 1.0](https://git.drupalcode.org/project/ai_context/-/work_items/3586372) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint17, category::task, priority::normal, sprint candidate Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !256 [Issue #3586372: Document real-world use cases for CCC](https://git.drupalcode.org/project/ai_context/-/merge_requests/256) | State: opened | Author: Abhinav Jha (ajabhinavjha30), 169 diff lines Description: **Note that this could be done after the 1.0 release.** Fable 5 pass Here's a documentation-ready set of use cases, grouped by consumer and framed for the post-[#3586346](https://git.drupalcode.org/project/ai_context/-/work_items/3586346) world where anything — agents, CKEditor, translation, automators — can be a context consumer. Each one names the CCC features it exercises so readers connect the scenario to the mechanics. --- ## Writing assistance (AI CKEditor) **1. Brand voice everywhere, enforced once.** The marketing team maintains one "Voice and tone" context item — reading level, b… ### [Document how to use RAG with CCC 1.0](https://git.drupalcode.org/project/ai_context/-/work_items/3586371) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint17, category::task, priority::normal, sprint candidate Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !255 [Issue #3586371: Document how to use RAG with CCC](https://git.drupalcode.org/project/ai_context/-/merge_requests/255) | State: opened | Author: Abhinav Jha (ajabhinavjha30), 173 diff lines Description: **Note that this could be done after the 1.0 release.** Fable 5 notes Good news: everything needed already exists in the public API — `AiContextRequest::getTask()` gives you a free-text retrieval query, and the `text_rendered` event exposes remaining token budget and lets you rewrite the output. Here's how I'd wire RAG up with ai_context **today**, no changes to the module. ## Pattern A — agentic RAG via tools (no custom code) Use ai_context for what it's best at: injecting *instructions about retrieval* rather than retrieved content. 1. Index your corpus with the AI module's `ai_search` … ### [Resolve `use_default` provider config for conditional subcontext selection](https://git.drupalcode.org/project/ai_context/-/work_items/3586391) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: Tekla Aivazashvili (aivazashvilit) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::bug Description: ## Problem / motivation Follow-up to: - #3586351+s - #3586207+s During real-provider conditional subcontext testing (#3586351+), conditional children were **silently excluded** even though: - **Enable conditional subcontext AI decisions** was on - Published conditional subcontext items existed - The site had a working chat default at **AI → Settings → Default providers** Root cause: `ai_context` stores settings in `ai_context.settings:provider_config`, but runtime code only reads **`provider`** and **`model`**. It ignores **`use_default`**. Install config ships with: ```yaml provider_co… ### [Implement plugin-based generic context consumers and unified consumer configuration](https://git.drupalcode.org/project/ai_context/-/work_items/3586346) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: Kristen Pol (kepol) | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::outside Description: ## Summary **Review the plan carefully before proceeding with implementation in case it needs adjustments.** Implement the architecture accepted in [#3586319](https://git.drupalcode.org/project/ai_context/-/work_items/3586319): AI Context will treat everything that receives context as a consumer, with agents becoming one consumer type. Consumer types will use Drupal attribute plugins, all configured consumers will use one configuration store, and agent and non-agent requests will share the same request-building and selection pipeline. This is a clean-slate beta change. Agent-specific factor… ### [Persist context-item token counts and show token-budget usage in CCC UI](https://git.drupalcode.org/project/ai_context/-/work_items/3586379) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !248 [Issue #3586379: Persist token counts and show budget usage in CCC UI.](https://git.drupalcode.org/project/ai_context/-/merge_requests/248) | State: opened | Author: Kristen Pol (kepol), 5325 diff lines Description: ## Summary Follow-up to: - #3586337+s - #3586348+s Implement the subscription-limit UX decisions from the Emma+Aidan review on #3586337. Persist each context item's estimated token count at save time, base token badges on percentage of the configured token budget, and add budget summary messaging on the agent subscription settings page. This issue implements the indicator behavior. It does not add new warning components beyond text, badges, and tooltips agreed in the design review. **Implementation:** [MR !248](https://git.drupalcode.org/project/ai_context/-/merge_requests/248) on branch … ### ["Global context" checkbox description renders a literal
                                          instead of a line break](https://git.drupalcode.org/project/ai_context/-/work_items/3586369) State: opened | Updated: 2026-08-10 | Author: Sohail Lajevardi (doxigo) | Assigned: Shashank Rai (shqshqnk) | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::inside Description: On the AI context item edit form, the description under the **Global context** checkbox displays the tag as text: > Always include this context for every agent.\Saving the form with this > enabled will clear previous scope settings. `AiContextScopeGlobal::getFormDescription()` exists specifically so this checkbox can carry a line break. Its own docblock says so: ```php /** * Gets the checkbox description for the context item form. * * Uses a line break that is not safe for settings pages escaped with * Html::escape(), so keep plain text in getDescription() instead. */ protected functio… ### [Install `target_entities` field storage when Dynamic Entity Reference is enabled on existing sites](https://git.drupalcode.org/project/ai_context/-/work_items/3586375) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: Joshua Fernandes (joshua1234511) | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::bug Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !251 [Issue #3586375: Install target_entities storage when DER is enabled later.](https://git.drupalcode.org/project/ai_context/-/merge_requests/251) | State: opened | Author: Kristen Pol (kepol), 636 diff lines Description: ## Problem Sites that already have `ai_context` installed can fatal when `dynamic_entity_reference` is enabled (or was enabled without a matching schema update). The context item listing and other entity loads fail with: `Table 'db.ai_context_item__target_entities' doesn't exist` Example stack: `SqlContentEntityStorage->loadFromDedicatedTables()` while `AiContextItemListBuilder->load()` renders `/admin/config/ai/context/items`. ### Root cause `target_entities` is not defined in `AiContextItem::baseFieldDefinitions()`. It is added at runtime via `DynamicEntityReferenceHooks::entityBaseFiel… ### [Document the AI Context role and permission matrix for 1.0](https://git.drupalcode.org/project/ai_context/-/work_items/3586395) State: closed | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::internal, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !254 [Issue #3586395: Document the AI Context role and permission matrix for 1.0.](https://git.drupalcode.org/project/ai_context/-/merge_requests/254) | State: merged 2026-08-10 | Author: Kristen Pol (kepol), 304 diff lines Description: ## Problem/Motivation Follow-up to: #3586358+s The current AI Context permission model is sufficient for the 1.0 role patterns, and #3586356+ completed the required access hardening. However, site builders do not yet have a documented role/permission matrix. In particular, the documentation should distinguish: - Published-context consumers using AI features - Context authors managing their own items - Editors managing context across authors - Administrators managing settings, agents, and usage The documentation must also cover editorial workflow transition permissions, which are generate… ### [Create multi-vocabulary taxonomy scope plugin](https://git.drupalcode.org/project/ai_context/-/work_items/3586237) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::feature Description: ## Problem/motivation _**Note that this isn't a must have for 1.0 but a nice to have. Given that people think the current "tags" scope plugin previous the behavior this plugin would provide then it is really nice to have.**_ _**Note that weight = 20 should be used as follow-up to #3586388+s.**_ Follow up to: #3586198+s We do not have a scope plugin that allows associated context with the terms for content entities. Example: * Article **has terms**: foo, bar, hello * Blog post **has terms**: foo, whatever * One context item **has term**: foo * Another context item **has terms**: foo, bar… ### [Pre-1.0 context selection reliability and diagnostics follow-up to issue 3586363](https://git.drupalcode.org/project/ai_context/-/work_items/3586383) State: opened | Updated: 2026-08-10 | Author: Kristen Pol (kepol) | Assigned: unassigned | Labels: 2026Sprint16, AI Initiative Sprint, ai::inside, category::task Related MRs (already exist for this issue — check state before suggesting new contributions): - MR !252 [Issue #3586383: Pre-1.0 context selection reliability and diagnostics follow-up.](https://git.drupalcode.org/project/ai_context/-/merge_requests/252) | State: opened | Author: Kristen Pol (kepol), 1013 diff lines Description: **Blocker: Assess #3586348+s before proceeding on this issue.** ## Follow-up issue Follow-up to: #3586363 Child of the "Before 1.0" triage in #3586363+s. Improves selection transparency, conditional-subcontext failure visibility, and debug diagnostics before 1.0. **Scope:** #3, #4, #9 from the Before 1.0 list in #3586363. **Non-goals:** documentation/trust/compatibility work (#1, #2, #5, #6, #8 — separate issue), performance benchmarks (#7 — 1.1), usage vs observability (#10 — #3567803 / #3586213), rich selection diagnostics UI or persistence ([#3586242](https://git.drupalcode.org/projec… --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- - [ca38e632](https://git.drupalcode.org/project/ai_context/-/commit/ca38e632dfc2e1584b6898e06e848ff49ae4560e) Issue #3586378: Remove max_items context limit and rely on token budget. — Kristen Pol (2026-08-11T03:55:13.000+00:00) - [732e1b33](https://git.drupalcode.org/project/ai_context/-/commit/732e1b3350b8cdab7f6935e3cdd786e05750d8bc) Issue #3586395: Document the AI Context role and permission matrix for 1.0. — Kristen Pol (2026-08-10T06:40:22.000+00:00) ======================================================================== ## [23] summariseModule:ai_dashboard:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI Dashboard (machine name: ai_dashboard) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Rob Loach [1]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                          AI Dashboard

                                          then use

                                          ,

                                          ,

                                            /
                                          • , and as needed. Output only the HTML fragment with no surrounding , , or
                                            tags. After the project summary prose, add a single subsection titled "

                                            How can I help on this project?

                                            " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). (none) --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- - [54340669](https://git.drupalcode.org/project/ai_dashboard/-/commit/54340669a7170687e073bd1130fcf14c7bb03af1) Issue #3585223: Fix description font size — Rob Loach (2026-08-10T14:15:37.000-04:00) ======================================================================== ## [24] summariseModule:ai_translate:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AI translate (machine name: ai_translate) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Christoph Breidert (breidert)". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                            AI translate

                                            then use

                                            ,

                                            ,

                                              /
                                            • , and as needed. Output only the HTML fragment with no surrounding , , or
                                              tags. After the project summary prose, add a single subsection titled "

                                              How can I help on this project?

                                              " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [Feature: Translation result caching and cross-field deduplication](https://git.drupalcode.org/project/ai_translate/-/work_items/3585529) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Rodel Duterte (rduterte) | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::inside Description: ## Problem/Motivation `ai_translate` re-sends every field to the LLM on every translation run, with no memory of previous translations. This causes two avoidable costs: 1. **Re-translation of unchanged content.** On a re-translation run (fixing one typo, updating a single field), every unchanged field is sent to the LLM again, even though the output would be identical to the previous run. 2. **Repeated translation of identical strings.** Paragraph-heavy entities and Layout Builder pages often contain the same short string in multiple components (shared CTA labels, navigation titles, standard… ### [Update translation cropping](https://git.drupalcode.org/project/ai_translate/-/work_items/3479612) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: category::task, code, priority::normal, state::accepted Description: >>> [!note] Migrated issue Reported by: [scott_euser](https://www.drupal.org/user/3267594) >>> Problem/Motivation As per https://www.drupal.org/project/ai/issues/3479027#comment-15806901 comment #11 and #12, trimming the text can be a surprise/go unnoticed by the user. Steps to reproduce Get AI to respond with text that is longer than max length Proposed resolution For a follow-up should we have it immediately make a tiny follow-up attempt. Like "The following text between the ____ seperator is longer than the character limit of ___: ------- Text here ------- - Keep the same tone of voice … ### [Compatible with Address module](https://git.drupalcode.org/project/ai_translate/-/work_items/3468992) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: category::feature, code, priority::normal, state::postponed Description: >>> [!note] Migrated issue Reported by: [w01f](https://www.drupal.org/user/2488816) >>> I have this working to great effect on an English/Japanese site. The sole exception is an issue where addresses stored using the popular Address module do not translate correctly. It seems to get the country and the prefecture, but leaves the rest of the address blank. > Related issue: [Issue #3464024](https://www.drupal.org/node/3464024) ### [one-click link should show human name, not machine name](https://git.drupalcode.org/project/ai_translate/-/work_items/3580314) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Jordan Koplowicz (koppie) | Labels: category::bug, code, needs port to 2.x, priority::minor Description: >>> [!note] Migrated issue Reported by: [koppie](https://www.drupal.org/user/261840) Related to !16 >>> Problem/Motivation The AI module works off of providers. Each provider defines models with both human name, and "machine name." The machine name usually avoids spaces and other "special" characters. The problem: the "one click" link on the translate page uses the machine name, not the human name. This can be hard to read, and leads to a bad Editor Experience (EX). Steps to reproduce Configure multiple languages Enable the ai_translate module Enable at least one provider (with a lon… ### [backport: one-click link should show human name](https://git.drupalcode.org/project/ai_translate/-/work_items/3585535) State: closed | Updated: 2026-08-10 | Author: drupalbot | Assigned: Jordan Koplowicz (koppie) | Labels: category::bug, priority::normal, state::closed, v1.3.x-dev Description: >>> [!note] Migrated issue Reported by: [koppie](https://www.drupal.org/user/261840) Related to ai!1334 >>> [Tracker] Update Summary: New issue, backported from https://www.drupal.org/project/ai_translate Short Description: one-click link should show human name, not machine name Check-in Date: 03/19/2026 Metadata is used by the AI Tracker. Docs and additional fields here. [/Tracker] Problem/Motivation The AI module works off of providers. Each provider defines models with both human name, and "machine name." The machine name usually avoids spaces and other "special" characters. The pr… ### [Refactor translation workflow to support Tool API and agent-driven translation](https://git.drupalcode.org/project/ai_translate/-/work_items/3585523) State: opened | Updated: 2026-08-10 | Author: Sven Decabooter (svendecabooter) | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, ai::inside Description: I am investigating whether I can have an AI Agent perform an entity translation, when a user requests this as part of an administrative AI agent interface. This would probably need some major refactoring of the module logic, since there are currently 2 endpoints: - UI batch translation - Drush command translation This would add a third one: Tool API translation So logic should be abstracted as much as possible where relevant, so all 3 entry points use the same code, rather than replicating it. I haven't investigated this further in detail, but already raising an issue here, in case someone … ### [Auto-translate referenced taxonomy terms (and other translatable entities) when translating a node](https://git.drupalcode.org/project/ai_translate/-/work_items/3585539) State: opened | Updated: 2026-08-10 | Author: Carlos Romero (o0Charly0o) | Assigned: unassigned | Labels: category::feature, code, priority::normal, state::accepted Description: When translating a node via AI Translate, referenced translatable entities (e.g. taxonomy terms) are not automatically translated. Editors must translate each term separately, which is tedious on multilingual sites. Proposed solution Add a batch operation translateReferencedEntities() that runs after insertTranslation(). It scans all entity reference fields of the source entity (including fields marked as non-translatable on the node), and for each referenced ContentEntityInterface that: belongs to a translatable entity type does not yet have a translation in the target language …extracts i… ### [AI Translate: Issue with translating blocks which has language code as und on layout builder page](https://git.drupalcode.org/project/ai_translate/-/work_items/3567453) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: Punam Aseem Beedkar (PunamShelke) | Labels: category::bug, code, priority::normal, state::postponed Description: >>> [!note] Migrated issue Reported by: [punamshelke](https://www.drupal.org/user/3509619) >>> I have landing page which has multiple blocks and few blocks doesnt have any language attached so while translating that page it failed with error mention below - InvalidArgumentException: The entity cannot be translated since it is language neutral (und). in Drupal\Core\Entity\ContentEntityBase->addTranslation() (line 990 of /app/docroot/core/lib/Drupal/Core/Entity/ContentEntityBase.php). backtrace - /app/docroot/modules/contrib/ai/modules/ai_translate/src/Plugin/FieldTextExtractor/LbFieldEx… ### [Translation seems to affect workflow](https://git.drupalcode.org/project/ai_translate/-/work_items/3472755) State: opened | Updated: 2026-08-10 | Author: drupalbot | Assigned: unassigned | Labels: category::bug, priority::normal, state::postponed, userInterface Description: >>> [!note] Migrated issue Reported by: [briwan](https://www.drupal.org/user/3829967) >>> Error when using Translate with AI button Create a content in english, translate them with the AI button, an error occured, drupal try to save a translated workflow and crash. In screenshot we can see "publié" for french and "publicado" for spanish. Backtrace #0 /var/www/html/web/core/modules/content_moderation/src/Plugin/WorkflowType/ContentModeration.php(101): Drupal\workflows\Plugin\WorkflowTypeBase->getState() #1 /var/www/html/web/core/modules/content_moderation/src/EntityOperations.php(… ### [Classes fail to resolve correctly in unit tests because of ai_translate variant in AI core module](https://git.drupalcode.org/project/ai_translate/-/work_items/3585544) State: opened | Updated: 2026-08-10 | Author: Sven Decabooter (svendecabooter) | Assigned: unassigned | Labels: category::bug, code, needs port to 2.x, priority::major Description: Since this module depends on the drupal.org/project/ai module in a testing environment, it also loads the deprecated ai_translate submodule from within that module, causing issues for unit tests. See https://git.drupalcode.org/project/ai_translate/-/merge_requests/37: > **9. A duplicate module in the test environment, and the workaround it forced.** The AI module still bundles the deprecated `ai_translate` submodule this project replaced. `core/tests/bootstrap.php` registers one PSR-4 path per extension _name_ and the **last one discovered wins** — which is the bundled copy, deterministicall… ### [[META] AI Translation — DrupalCon Rotterdam 2026 demo](https://git.drupalcode.org/project/ai_translate/-/work_items/3585543) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Valery Lourie (valthebald) | Labels: AI Initiative Sprint, No Estimation Available, category::meta, priority::normal Description: ## Description This is the AI Translation area meta issue for the [2026 AI Inside Roadmap to DrupalCon Rotterdam](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586657). Leads: Sven Decabooter, Valery Lourie. For Rotterdam, AI Translate needs to work end-to-end against the Drupal AI Demo's multilingual corpus: an editor translates a page from the editing interface, reviews the result, and a visitor can then get a grounded search answer in another configured language. See the roadmap issue for the full delivery criteria for this area. ## Tasks * [ ] Ship the fixes and featur… ### [Recipe: translate Drupal AI Demo content to Spanish, German, and French](https://git.drupalcode.org/project/ai_translate/-/work_items/3585542) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Valery Lourie (valthebald) | Labels: AI Initiative Sprint, category::feature, priority::normal, state::accepted Description: ## Description The [AI Translation area](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586657) of the AI Inside roadmap needs a concrete, presentable "delivered" state for the Drupal AI Demo: an editor translates a page from the editing interface, and search/answers work in the translated languages too. That requires a recipe that configures multilingual translation for the demo corpus. This issue is scoped to **configuration only** — adding the languages and configuring ai_translate with working defaults. Translating the demo corpus content itself is separate, later work, d… ### [Add ai_translate-specific issue and merge request templates](https://git.drupalcode.org/project/ai_translate/-/work_items/3585541) State: opened | Updated: 2026-08-10 | Author: Christoph Breidert (breidert) | Assigned: Valery Lourie (valthebald) | Labels: AI Initiative Sprint, category::task, priority::minor, state::accepted Description: ## Description `ai_translate` does not yet have issue/MR templates. This issue is for adding these templates re-using existing templates from other projects (for example the ai project). ## Tasks * [ ] Commit the 5 issue templates in `.gitlab/issue_templates/` (bug_report, feature_request, plan, support_request, task) * [ ] Commit the merge request template in `.gitlab/merge_request_templates/Default.md` * [ ] Push to the default branch and verify GitLab offers the templates in the "New issue" / "New merge request" dropdowns ## Acceptance criteria * Selecting any of the 5 templates from t… ### [InvalidArgumentException: Invalid translation language (und) when translating media entities](https://git.drupalcode.org/project/ai_translate/-/work_items/3585532) State: opened | Updated: 2026-08-10 | Author: szato (odi) | Assigned: unassigned | Labels: 2026Sprint15, 2026Sprint16, AI Initiative Sprint, Quick Win Description: When using AI Translate to translate a media entity (e.g. media.image), the batch fails with: ``` InvalidArgumentException: Invalid translation language (und) specified. in Drupal\Core\Entity\ContentEntityBase->getTranslation() ``` **Steps to reproduce** - Enable AI Translate, configure an AI provider - Have a media type (e.g. image) with content translation enabled and field sync configured - Go to a media entity's translation overview, click "Translate using AI" for a non-existing language - Batch fails with the above exception **Proposed resolution** ``` --- a/src/Controller/AiTranslateC… --- MERGE REQUESTS (24h) --- ### [feat: #3585541 Add ai_translate-specific issue and merge request templates](https://git.drupalcode.org/project/ai_translate/-/merge_requests/38) State: opened | Author: Christoph Breidert (breidert) | Branch: 3585541-add-ai-translate-specific-issue-and-merge-request-templates | 422 diff lines Description: ## Description Adds the `.gitlab/issue_templates/` and `.gitlab/merge_request_templates/Default.md` templates, adapted from the parent `drupal/ai` project to fit `ai_translate`'s own scope: - Component label options now reflect this module's real areas (content translation, interface translation, field text extractors, provider, settings, drush) instead of `drupal/ai` submodule labels (aiAgent, aiApiExplorer, aiChatbot, …). - Added an "AI Usage" disclosure checkbox to all 5 issue templates. - Testing-setup snippets now include enabling `content_translation`/`ai_translate` and translating a n… --- COMMITS (24h) --- (none) ======================================================================== ## [25] summariseModule:flowdrop:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: FlowDrop (machine name: flowdrop) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Shibin Das [60]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                              FlowDrop

                                              then use

                                              ,

                                              ,

                                                /
                                              • , and as needed. Output only the HTML fragment with no surrounding , , or
                                                tags. After the project summary prose, add a single subsection titled "

                                                How can I help on this project?

                                                " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). (none) --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- - [1a1c117b](https://git.drupalcode.org/project/flowdrop/-/commit/1a1c117b1b9e01264eb928ce46f0bfdb9ac7067f) fix(flowdrop_chat): Narrow AiModelService return values for standalone analysis — Shibin Das (2026-08-10T23:17:15.000+02:00) - [ef548efa](https://git.drupalcode.org/project/flowdrop/-/commit/ef548efa46d7acb1ca86c7cb9d35584e28a01460) ci: Add the three words the first cspell run on 2.x reported — Shibin Das (2026-08-10T23:13:18.000+02:00) - [963c1d0b](https://git.drupalcode.org/project/flowdrop/-/commit/963c1d0bc2f9e8d200bffc5d08dbc4796c38d2c2) docs(flowdrop): Record the British English spelling convention — Shibin Das (2026-08-10T23:01:40.000+02:00) - [08920d10](https://git.drupalcode.org/project/flowdrop/-/commit/08920d10f5b2047c85ca53709cb714d3dc8b8046) ci: Add cspell project dictionary and ignore generated artefacts — Shibin Das (2026-08-10T23:01:34.000+02:00) - [51fb22f1](https://git.drupalcode.org/project/flowdrop/-/commit/51fb22f1d068aea9cde220af4b388b671288826c) fix(flowdrop): correct spellings flagged by the cspell check — Shibin Das (2026-08-10T23:01:25.000+02:00) - [435c6864](https://git.drupalcode.org/project/flowdrop/-/commit/435c68642f55942267d72d0a45f6a64341b2368d) ci: Fix empty variables block breaking all pipeline jobs — Shibin Das (2026-08-10T22:27:07.000+02:00) - [eff96d97](https://git.drupalcode.org/project/flowdrop/-/commit/eff96d976d62d9f4f6665ec0788272e578c7b1bb) ci: Re-enable cspell check — Shibin Das (2026-08-10T22:24:09.000+02:00) - [2d73c987](https://git.drupalcode.org/project/flowdrop/-/commit/2d73c987232032ba1d8f73d692499d407adbb9b3) feat(flowdrop): raise PHPStan to level 10 — Shibin Das (2026-08-10T22:08:46.000+02:00) - [a8aa250e](https://git.drupalcode.org/project/flowdrop/-/commit/a8aa250ec22e8909eee79e308d71d6b464b788d9) test(flowdrop_orchestration_connector): narrow implicit mixed in poll tests for PHPStan level 10 — Shibin Das (2026-08-10T22:08:34.000+02:00) - [1332737b](https://git.drupalcode.org/project/flowdrop/-/commit/1332737b7c958a0caa4c20119a37a91ae150d857) refactor(flowdrop_runtime): narrow implicit mixed in runtime services for PHPStan level 10 — Shibin Das (2026-08-10T22:08:21.000+02:00) - [85971935](https://git.drupalcode.org/project/flowdrop/-/commit/859719351b4f45e076278c2e3bae110aab313f50) refactor(flowdrop_trigger): narrow implicit mixed in trigger forms for PHPStan level 10 — Shibin Das (2026-08-10T22:07:33.000+02:00) - [aae136b8](https://git.drupalcode.org/project/flowdrop/-/commit/aae136b890fbeec840d6d1cb52371f31aebd0ae9) refactor(flowdrop_stategraph): narrow implicit mixed in state DTOs for PHPStan level 10 — Shibin Das (2026-08-10T22:07:07.000+02:00) - [92a9bd53](https://git.drupalcode.org/project/flowdrop/-/commit/92a9bd53f0985190aa28fbe10b64129bc2389325) refactor(flowdrop_session): narrow implicit mixed in the session entity and services for PHPStan level 10 — Shibin Das (2026-08-10T22:07:07.000+02:00) - [e3444bb3](https://git.drupalcode.org/project/flowdrop/-/commit/e3444bb37d4a002245d0de24540be1d043483cf6) refactor(flowdrop_pipeline): narrow implicit mixed in the pipeline entity and lists for PHPStan level 10 — Shibin Das (2026-08-10T22:07:07.000+02:00) - [f7229103](https://git.drupalcode.org/project/flowdrop/-/commit/f7229103aaaada6d6fc071214b69b80a52b834fc) refactor(flowdrop_interrupt): narrow implicit mixed in the inbox and entity for PHPStan level 10 — Shibin Das (2026-08-10T22:06:27.000+02:00) - [e2867019](https://git.drupalcode.org/project/flowdrop/-/commit/e286701954c4d7ab2d271113199dfbf3b7ddc0e0) refactor(flowdrop_workflow_executor): narrow implicit mixed for PHPStan level 10 — Shibin Das (2026-08-10T22:06:11.000+02:00) - [c20a477a](https://git.drupalcode.org/project/flowdrop/-/commit/c20a477a049f0042817ee5c3254bbc9a54d58c0b) refactor(flowdrop_workflow): narrow implicit mixed in navbar, resolver and tests for PHPStan level 10 — Shibin Das (2026-08-10T22:06:11.000+02:00) - [bb38de50](https://git.drupalcode.org/project/flowdrop/-/commit/bb38de506a64555d9cceca3403f4d1c62c7d6d36) refactor(flowdrop_job): narrow implicit mixed in the job entity and list builders for PHPStan level 10 — Shibin Das (2026-08-10T22:06:11.000+02:00) - [cfa45f78](https://git.drupalcode.org/project/flowdrop/-/commit/cfa45f789159beb16d9480997aff09e2811213ec) refactor(flowdrop_node_processor): narrow implicit mixed in processors for PHPStan level 10 — Shibin Das (2026-08-10T22:05:44.000+02:00) - [645939d4](https://git.drupalcode.org/project/flowdrop/-/commit/645939d4f18f09784cd85a8959b0ddb550e8710c) refactor(flowdrop_node_type): narrow implicit mixed in forms and list builder for PHPStan level 10 — Shibin Das (2026-08-10T22:05:29.000+02:00) - [7c19ed3a](https://git.drupalcode.org/project/flowdrop/-/commit/7c19ed3a8765c6befde5a595528caea562dcf82b) refactor(flowdrop_ui_components): narrow implicit mixed for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [8e08d584](https://git.drupalcode.org/project/flowdrop/-/commit/8e08d5843e30210b4b0b890196bf0c3f8f3e2988) refactor(flowdrop_playground): narrow implicit mixed in the API controller for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [41287525](https://git.drupalcode.org/project/flowdrop/-/commit/412875255b38627565df170d9ddf49ad401735e9) refactor(flowdrop_orchestration): narrow implicit mixed in the plugin manager for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [f93f5d84](https://git.drupalcode.org/project/flowdrop/-/commit/f93f5d846819d466f991b0d1772aaa3f43752b57) refactor(flowdrop_node_category): narrow implicit mixed in list builder and form for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [01f9879a](https://git.drupalcode.org/project/flowdrop/-/commit/01f9879a2290f3acaa389bf90839d775bc21c13c) refactor(flowdrop_memory): narrow implicit mixed for PHPStan level 10 — Shibin Das (2026-08-10T22:04:39.000+02:00) - [64adb4f9](https://git.drupalcode.org/project/flowdrop/-/commit/64adb4f9791b06fde39d78c834082c775747e617) refactor(flowdrop_chat): narrow implicit mixed in the LLM client for PHPStan level 10 — Shibin Das (2026-08-10T22:04:38.000+02:00) - [18e054d7](https://git.drupalcode.org/project/flowdrop/-/commit/18e054d7064769d818a77f4f9f2657a5ab220ce5) test(flowdrop): narrow implicit mixed in shared test traits for PHPStan level 10 — Shibin Das (2026-08-10T22:04:06.000+02:00) - [ab3f5624](https://git.drupalcode.org/project/flowdrop/-/commit/ab3f56245a7b4149c937737cfc56bf3c074daaeb) refactor(flowdrop): narrow implicit mixed in root services for PHPStan level 10 — Shibin Das (2026-08-10T22:03:55.000+02:00) - [17d145d4](https://git.drupalcode.org/project/flowdrop/-/commit/17d145d450fb68a563b4f03b1833c0ff9bc68280) feat(flowdrop): raise PHPStan to level 9 — Shibin Das (2026-08-10T14:40:22.000+02:00) - [01c4d059](https://git.drupalcode.org/project/flowdrop/-/commit/01c4d059664893c37139c73318a2fb863971caa5) test(flowdrop_runtime): narrow mixed flows in tests for PHPStan level 9 — Shibin Das (2026-08-10T14:35:17.000+02:00) - [9238fbf8](https://git.drupalcode.org/project/flowdrop/-/commit/9238fbf811cdf48ca437795269d2082c0a1a6043) refactor(flowdrop_runtime): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:35:17.000+02:00) - [0833220b](https://git.drupalcode.org/project/flowdrop/-/commit/0833220bcf9acba587d731ccf0291eb44d446796) refactor(flowdrop_session): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:28:56.000+02:00) - [6a9c8bb2](https://git.drupalcode.org/project/flowdrop/-/commit/6a9c8bb217978c20b70e0c67acf3daadb6bd6b25) refactor(flowdrop_stategraph): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:28:56.000+02:00) - [c7df842e](https://git.drupalcode.org/project/flowdrop/-/commit/c7df842edc8643e650a318a1f785f97058588c39) refactor(flowdrop_pipeline): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:18:14.000+02:00) - [9aa9bfd8](https://git.drupalcode.org/project/flowdrop/-/commit/9aa9bfd84a10a7c71570c6d93945be0bc769427b) refactor(flowdrop_interrupt): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:18:14.000+02:00) - [fd72fd0f](https://git.drupalcode.org/project/flowdrop/-/commit/fd72fd0f3e6ee5ea9795a5d21579d629b96503af) fix(flowdrop_node_type): guard update_10004 output-schema read for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [a041eece](https://git.drupalcode.org/project/flowdrop/-/commit/a041eeceb3fde5c9342800f0c713e245a487f25c) refactor(flowdrop_playground): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [ced50463](https://git.drupalcode.org/project/flowdrop/-/commit/ced50463a867f980df575c15620e1debfa1c72f4) refactor(flowdrop_orchestration_connector): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [339c25f4](https://git.drupalcode.org/project/flowdrop/-/commit/339c25f424876c5b2d3c32a7671ccfa6c4ef92c3) refactor(flowdrop_workflow_executor): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [8992ba7b](https://git.drupalcode.org/project/flowdrop/-/commit/8992ba7bc0052c1bf50fc866e3de7db14ea780d3) refactor(flowdrop_memory): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T14:10:10.000+02:00) - [5b2ba7e6](https://git.drupalcode.org/project/flowdrop/-/commit/5b2ba7e651320f784b865bd54007ca4d99b3b807) test(flowdrop_node_processor): narrow mixed flows in tests for PHPStan level 9 — Shibin Das (2026-08-10T13:43:43.000+02:00) - [336d0d93](https://git.drupalcode.org/project/flowdrop/-/commit/336d0d9357ade1652be2d61409d1317ee0519dea) refactor(flowdrop_node_processor): narrow mixed flows in processors for PHPStan level 9 — Shibin Das (2026-08-10T13:43:43.000+02:00) - [f3e4a6c2](https://git.drupalcode.org/project/flowdrop/-/commit/f3e4a6c297acec2c092d2b72e566974c70f0634c) refactor(flowdrop): type the processor schema surface for PHPStan level 9 — Shibin Das (2026-08-10T13:43:43.000+02:00) - [36cbf1b5](https://git.drupalcode.org/project/flowdrop/-/commit/36cbf1b5685728b43ac14214c2007d416aae3465) test(flowdrop_workflow): narrow mixed flows in tests for PHPStan level 9 — Shibin Das (2026-08-10T13:37:28.000+02:00) - [55a343d5](https://git.drupalcode.org/project/flowdrop/-/commit/55a343d574fe68efb9451d97ba47da244a9515bc) refactor(flowdrop_workflow): narrow mixed flows in forms and hooks for PHPStan level 9 — Shibin Das (2026-08-10T13:37:28.000+02:00) - [9b46a6bd](https://git.drupalcode.org/project/flowdrop/-/commit/9b46a6bdc0227655605f0494cf91e1d51701b270) refactor(flowdrop_node_type): narrow mixed flows in forms and generator for PHPStan level 9 — Shibin Das (2026-08-10T13:29:42.000+02:00) - [1a960d83](https://git.drupalcode.org/project/flowdrop/-/commit/1a960d836d060a36256b54928b462534b2db0b68) refactor(flowdrop): narrow mixed flows in root module for PHPStan level 9 — Shibin Das (2026-08-10T13:24:45.000+02:00) - [86d01c77](https://git.drupalcode.org/project/flowdrop/-/commit/86d01c77fab38f5d8c8ace78a9000d9c45583eea) refactor(flowdrop_trigger): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T13:04:50.000+02:00) - [86a2263a](https://git.drupalcode.org/project/flowdrop/-/commit/86a2263ab684fc607a4310f884e3d6531b8aa545) test(flowdrop_node_type): narrow mixed flows in tests for PHPStan level 9 — Shibin Das (2026-08-10T13:04:29.000+02:00) - [3fbed819](https://git.drupalcode.org/project/flowdrop/-/commit/3fbed819c97dfc1a1e616c5713fb5a8d8195412b) test(flowdrop): extract array assertions trait, seal NodeMetadata toArray shapes — Shibin Das (2026-08-10T13:04:29.000+02:00) - [f5bb7a44](https://git.drupalcode.org/project/flowdrop/-/commit/f5bb7a448f3b49c92dfad7d003140e25bc946b3a) refactor(flowdrop_workflow): narrow mixed flows in services for PHPStan level 9 — Shibin Das (2026-08-10T13:00:09.000+02:00) - [6cd1a6cf](https://git.drupalcode.org/project/flowdrop/-/commit/6cd1a6cf0d4bf0f9b2aa68cf5f904be1e4bd3027) refactor(flowdrop_workflow): flip getNodes()/getEdges() to shaped returns — Shibin Das (2026-08-10T13:00:09.000+02:00) - [ca483f10](https://git.drupalcode.org/project/flowdrop/-/commit/ca483f108739cf008a9b00d2e22d63c457c31914) refactor(flowdrop_ui_components): narrow config and render flows for PHPStan level 9 — Shibin Das (2026-08-10T12:58:48.000+02:00) - [9309f6ac](https://git.drupalcode.org/project/flowdrop/-/commit/9309f6aca08eeb983a9e1e747c43e1c163eb1a82) refactor(flowdrop_orchestration): type snapshot DTO hydration for PHPStan level 9 — Shibin Das (2026-08-10T12:58:48.000+02:00) - [a3d48394](https://git.drupalcode.org/project/flowdrop/-/commit/a3d48394a9c5cebdfd8890d8db8e652054be03bb) refactor(flowdrop_job): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T12:58:48.000+02:00) - [79e96290](https://git.drupalcode.org/project/flowdrop/-/commit/79e962903eb17880a8a26819181d971f20893b97) refactor(flowdrop_chat): narrow mixed flows for PHPStan level 9 — Shibin Das (2026-08-10T12:58:48.000+02:00) - [c1f275be](https://git.drupalcode.org/project/flowdrop/-/commit/c1f275be1621d33130aa8544cd0e6a4218991f37) refactor(flowdrop_workflow): define raw stored workflow shape aliases for PHPStan level 9 — Shibin Das (2026-08-10T12:31:41.000+02:00) - [deb6ea4d](https://git.drupalcode.org/project/flowdrop/-/commit/deb6ea4d498cca5a56fa9ada54654632494fdc87) refactor(flowdrop_node_type): type node-metadata producers for PHPStan level 9 — Shibin Das (2026-08-10T12:30:25.000+02:00) - [21c99583](https://git.drupalcode.org/project/flowdrop/-/commit/21c99583175a469ccfcdebda9070b3cbcd6aefa7) refactor(flowdrop): type root DTO hydration for PHPStan level 9 — Shibin Das (2026-08-10T12:22:07.000+02:00) - [f1d459f7](https://git.drupalcode.org/project/flowdrop/-/commit/f1d459f7d2c02654d3e5c1bbfeccd067846edee1) test(flowdrop): type FlowDropKernelTestTrait for PHPStan level 9 — Shibin Das (2026-08-10T12:15:49.000+02:00) ======================================================================== ## [26] summariseModule:langfuse:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: Langfuse (machine name: langfuse) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. End your section with a single line listing the people who were active this period, exactly in this form (plain text, no ): "Contributors: Abhisek Mazumdar (abhisekmazumdar) [1]". Use only the names from that list, verbatim, keeping any trailing "[N]" commit count exactly as shown. Do not introduce any other names. Format your response as an HTML fragment. Start with

                                                Langfuse

                                                then use

                                                ,

                                                ,

                                                  /
                                                • , and as needed. Output only the HTML fragment with no surrounding , , or
                                                  tags. After the project summary prose, add a single subsection titled "

                                                  How can I help on this project?

                                                  " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). (none) --- MERGE REQUESTS (24h) --- ### [Issue #3548465: Add createScore() for feedback and a langfuse_feedback submodule](https://git.drupalcode.org/project/langfuse/-/merge_requests/6) State: merged 2026-08-10 | Author: Abhisek Mazumdar (abhisekmazumdar) | Branch: 3548465-implement-feedback | 814 diff lines Description: Closes #3548465 --- COMMITS (24h) --- - [ff44ae0a](https://git.drupalcode.org/project/langfuse/-/commit/ff44ae0ae9b3d63940ac7c51f704789763ca63fe) Issue #3548465: Add createScore() for feedback and a langfuse_feedback submodule — Abhisek Mazumdar (2026-08-10T10:13:42.000+00:00) ======================================================================== ## [27] summariseModule:agui:executive ======================================================================== You are a technical writer producing a newsletter section about recent Drupal module activity. Module: AG-UI (machine name: agui) Reporting period: last 24h (2026-08-10T05:00:07+00:00 to 2026-08-11T05:00:07+00:00) You are writing for a non-technical executive audience (CEO/leadership level). Focus on: business impact, strategic progress, risks, and what is being delivered. Avoid technical jargon. Do not mention branch names, function names, or API details. Explain what each piece of work means for users or the project's goals. Keep risk language proportionate to the stage of the software. For alpha or beta modules, unassigned bugs or open issues are normal and expected — do not describe them as 'reputational risks' or use alarmist framing. Reserve strong risk language for issues that are genuinely critical or blocking a stable release. Focus your report on activity that occurred within the reporting period (comments, MRs merged, commits pushed, status changes). Use the issue description to understand what each issue is about and provide context, but do not report on the description itself as news — it is background information only. Do not list every issue/MR individually — synthesise into prose. Keep it under 200 words. Do not use emoticons or mdashes. Do not wrap usernames or contributor names in tags — mention them as plain text. When mentioning a specific issue or MR, always hyperlink it using the URL provided in the data (e.g. Issue Title or the Markdown equivalent). Do not reference issues or MRs by number alone — always use their title as the link text. Do NOT attribute any action to a named individual. Do not say who merged, fixed, reviewed, authored, or opened anything. The "Author" and "Assigned" labels in the data are context only — never surface them as "X did Y". Describe the work itself in the passive voice (e.g. "the provider refactor was merged"), not the person who did it. The author of a merge request is often not the person who completed or merged the work, so naming them is misleading. Do not name any individual people in this section. No one was active enough this period to list. Format your response as an HTML fragment. Start with

                                                  AG-UI

                                                  then use

                                                  ,

                                                  ,

                                                    /
                                                  • , and as needed. Output only the HTML fragment with no surrounding , , or
                                                    tags. After the project summary prose, add a single subsection titled "

                                                    How can I help on this project?

                                                    " aimed at a non-technical executive. Suggest 2-3 concrete, high-level ways a leader could support or unblock progress (e.g. resourcing, stakeholder alignment, decision-making, funding, advocacy). Keep it under 60 words. Do not add any other 'How can I help' text anywhere else in the section. CRITICAL: Before writing each suggestion, verify it against the issue data. Do not suggest actions that are already in progress or covered by an existing MR — for example, do not suggest that work needs to be started if an issue already has a Related MR. --- ISSUES UPDATED IN LAST 24h --- Each issue includes its description (for context) and the most recent comments from the last 24h (or last 5 if fewer than 5 occurred in that window). ### [chunkDelay/chunkPadding applied per-event compounds into real latency/timeout risk on long or tool-heavy runs](https://git.drupalcode.org/project/agui/-/work_items/3590049) State: opened | Updated: 2026-08-10 | Author: Bryan Sharpe (b_sharpe) | Assigned: unassigned | Labels: Description: **What we found:** sendSseEvent() applies the full configured chunkPaddingSize and chunkDelayMicroseconds to every SSE event — not just TEXT_MESSAGE_CONTENT chunks, but also TOOL_CALL_START/ARGS/END/RESULT, RUN_STARTED, RUN_FINISHED, etc. For an agent that makes several tool calls per turn plus a streamed text response, that overhead compounds linearly with the number of events — in our case, 80ms + 4096 bytes per event across a few dozen events added several seconds and a few hundred KB of pure artificial overhead to a single response, on top of real LLM latency. That matters because… --- MERGE REQUESTS (24h) --- (none) --- COMMITS (24h) --- (none) ======================================================================== ## [28] generateTldr:executive ======================================================================== You are an editor distilling a Drupal AI project newsletter into its most important highlights. You are writing for a non-technical executive audience. Focus on business impact, strategic progress, and delivery milestones. Avoid all technical jargon. Read all the module summaries below. Separate the highlights into two categories: - SHIPPED: things that were merged, fixed, released, or completed during this period. - ONGOING: things that are actively in progress, under review, or blocked. Be specific — name the module, what happened, and why it matters. Do not use emoticons or mdashes. Do not include any text outside the two sections. When you mention a specific issue or merge request, add an inline citation using [N] where N is the reference number from the list below. You may cite multiple references per item, e.g. [1][3]. Place citations immediately after the relevant phrase, before any punctuation. Format as two HTML sections. Use exactly this structure (all
                                                  • elements must be inside the
                                                      , never outside it):

                                                      Shipped

                                                      1. Title here — One sentence explanation [1].
                                                      2. Another title — One sentence explanation.

                                                      Ongoing

                                                      1. Title here — One sentence explanation [2].
                                                      Up to 5 items per section. Do not output any text, tags, or characters outside these two sections. Output only the HTML fragment, no surrounding tags. --- REFERENCE LIST --- [1] Add AIDmi to Other modules/recipes that work with the AI module (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586566 [2] Drupal AI Contribution meeting 2026-08-10 (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586662 [3] Drupal AI Contribution meeting 2026-07-27 (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586618 [4] Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{ context }} and {{ raw_context }} before they reach the provider (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586661 [5] If only one tool, cannot delete it, gives an error: Undefined array key 1 in Drupal\ai\Element\ToolsLibrary::processToolsLibrary() (line 89 of modules/contrib/ai/src/Element/ToolsLibrary.php) & more (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586652 [6] Chatbot closes itself when adding a modal (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3499451 [7] Document FunctionalJavascript test conventions and add CI check for ungrouped/unrecorded tests (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3582633 [8] `AiReranker::extractItemText()` should prefer chunk text over configured indexed fields (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586637 [9] Add thumbs-up and thumbs-down icons to the shared AI icon set (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586660 [10] ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586425 [11] LLM: Text / LLM: Text (simple) automators silently drop Base Field content when Base Field and Target Field are both long-text types (Basic input mode) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586659 [12] [PLAN] Propagate and enforce an explicit executor for sessionless, queued, and outside-in AI runs (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3573899 [13] Issue #3586475: Rename the RegExp Guardrail labels to RegEx (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1689 [14] bug: #3586661 Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1924 [15] #3582633: Add Functional JavaScript testing conventions and validation script (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1432 [16] Resolve #3586495 "Add support embeddings via symfony/ai" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1856 [17] Drupal AI UX meeting 10 August 2026 (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586608 [18] Update AI partner badges to use Partner instead of Sponsor (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586636 [19] Communication Binarywork to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586718 [20] Communication Genero inc to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586720 [21] Communication Smile to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586719 [22] Communication Evolvingweb to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586717 [23] Communication Digital polygon to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586716 [24] Communication Sparkfabrik to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586715 [25] Communication Promet source to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586714 [26] Communication Redhat to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586713 [27] Communication Omedia to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586712 [28] Communication Faktorial to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586711 [29] Communication NTTdata to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586710 [30] Communication Swis to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586709 [31] Communication Hintogroup to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586708 [32] Communication Mobomo to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586707 [33] Communication Kadabra IT to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586706 [34] Communication EPAM joining (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586705 [35] Communication iTech4Web (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586704 [36] Call Pronovix to join (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586703 [37] Call Zivtech to join Initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586702 [38] Communication Joshi consulting (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586701 [39] Communication Civiactions (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586700 [40] Call IOgroup CEO (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586699 [41] Call 2 calibrate (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586698 [42] Call 1 calibrate (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586697 [43] Call with Oomph (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586696 [44] Communication with Specbee (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586695 [45] Call with Cambridge press (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586694 [46] Call with Reading room to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586693 [47] Went to see Vesa from Wunder in Cascais to join AI initaitive (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586691 [48] Met with team Mearra in Athens (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586692 [49] Call 2 with Drupalforge (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586690 [50] Call 1 with drupalforge (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586689 [51] Call/mail with Yorgos E-sepia (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586688 [52] Call with integral vision (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586687 [53] Call with Brainsum (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586686 [54] Call with Optasy (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586685 [55] Call with wolfgang Drunomics (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586684 [56] Call with Kalamuna (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586683 [57] Call 2 with Josh from Pantheon (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586682 [58] Call 1 with Josh from Pantheon (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586681 [59] Call with Esinergia (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586680 [60] Call with Aidan Foster interactive (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586679 [61] [META] 2026 AI Inside Roadmap to DrupalCon Rotterdam 2026 (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586657 [62] Create a skill for manual before/after testing of any issue, with optional glab upload (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586629 [63] Token Auth is not working (mcp, Issue) — https://git.drupalcode.org/project/mcp/-/work_items/3584901 [64] Add OAuth Scope Validation for MCP Authentication (mcp, Issue) — https://git.drupalcode.org/project/mcp/-/work_items/3569845 [65] MCP Server: Entity Seeder uses wrong type for content (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586031 [66] Make it possible to restrict the order of tools during agent executions (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3560681 [67] Use the `ai_json_schema` editor for the AI Agent structured-output schema field (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586042 [68] Explore export/sync plugin system for AI Agents to external agent platforms (Claude Code, VAPI, etc.) (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3577241 [69] ContentEntitySeeder stores multi-property field values as Array (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/345 [70] Issue#3586025:GetEntityFieldInformation-Leaks-Target_entity_type-Target_bundle... (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/344 [71] Issue (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/343 [72] Issue3569280:AI-Agents-Explorer-Chat-Generation-Does-Not-Support-Series-Models fixes (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/342 [73] Issue#3566126:Force-Value-Dropped-Tool-Property-Restrictions fixes. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/341 [74] Issue #3560681: Add per-tool execution ordering constraints for agent loops. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/252 [75] Issue#3565169:Schema-Error-AI-Agents-CKEditor-Plugin fixes. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/340 [76] #3586042: Use the ai_json_schema editor for the structured output schema field. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/298 [77] Issue #3586042 Use the `ai_json_schema` editor for the AI Agent structured-output schema field (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/284 [78] test: #3586021 Add regression test for ai_agent plugin cache invalidation (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/337 [79] Bare regex patterns are dropped from emitted JSON Schemas (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582987 [80] Define checkRequirements() as a configuration-time signal (indicator + add-prevention), not a runtime gate (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582975 [81] ToolBase's promoted $logger property conflicts with subclasses declaring their own logger (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582986 [82] SchemaToolsPropertyConverter fatals on empty-map schemas: \ArrayObject reaches ToolsPropertyInput's array-typed setters (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582985 [83] tool_ai_connector: ToolPluginBase::getReadableOutput() fatals when wrapped tool has no result object (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582941 [84] fromDataDefinition() breaks on plain typed-data lists and unlabeled definitions (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582984 [85] Coerce JSON numbers to strings for decimal inputs (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582983 [86] Complete kernel coverage of the typed input/output traits and definition pipeline (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582974 [87] Rework the tool execution contract: result naming, concrete typing, and decoupling from core ExecutableInterface (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582964 [88] Correct API signatures before the RC1 freeze (batch) (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582962 [89] Implement getCacheContexts() or drop CacheableDependencyInterface from ToolInterface (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582965 [90] Prefix module-owned identifiers: alter hook, cache key, and 'text' data type ID (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582963 [91] Move orphaned "FieldExistConstraint' and 'FieldExistsConstraintValidator' to Tool Belt. (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582951 [92] ListInputDefinition item values are never validated (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582982 [93] Make violation messages translatable and stop surfacing raw exception text (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582971 [94] ToolBase::access() throws on invalid/missing input instead of returning forbidden (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582961 [95] Non-array value for a map input throws instead of failing validation (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582981 [96] validateInputValue() only validates the first item of a multiple input (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582960 [97] Extend input coercion for unambiguous LLM value shapes (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582973 [98] Emit richer JSON Schema: map remaining constraints and type formats (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582972 [99] Write documentation and enable project pages (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582955 [100] Create a skill for generating Tool plugins (best practices, how-to, placement) (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582945 [101] [META] Tool API - Path to Beta and Inclusion in AI (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3558327 [102] Proposal: make Tool's declarations introspectable over the CLI, and enrich input schema (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582943 [103] Introduce support for Discovery, Planning and Execute calls for MCP and Agents (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3546292 [104] fix: #3582986 require the logger channel and document the subclass redeclaration contract (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/128 [105] fix: #3582985 cast ArrayObject schema values to arrays before building AI tool properties (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/127 [106] Fix fromDataDefinition: fall back for missing labels and toArray type keys. (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/126 [107] Resolve "Coerce JSON numbers to strings for decimal inputs" (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/125 [108] Enforce checkRequirements() in execute() and exclude unmet tools from the AI function list. (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/124 [109] Add kernel coverage: locked/configuration inputs, refiner flow, definition... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/123 [110] fix: #3582964 own execution contract: result value interfaces, accessors on... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/122 [111] fix: #3582947 tool_ai_connector does not handle tools returning list of entities (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/96 [112] fix: #3582962 correct API signatures: factory overrides, null context values,... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/121 [113] fix: #3582965 drop the unimplemented cacheability contract from ToolInterface (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/120 [114] fix: #3582963 prefix the adapter alter hook and cache key; keep the generic... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/119 [115] fix: #3582982 validate list definition items and name failing positions (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/118 [116] Make input violation messages translatable; log unexpected exceptions instead... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/117 [117] fix: #3582961 fail closed when tool input is invalid or missing (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/113 [118] Rethrow un-storable input values as InputException naming the input. (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/116 [119] fix: #3582960 validate every multiple input item (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/112 [120] Extend input coercion: JSON-string structures, enum near-misses, datetime... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/115 [121] Resolve "Emit richer JSON Schema: map remaining constraints and type formats" (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/114 [122] Canvas AI: Add a dev page builder agent and wire the placement tools (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591921 [123] Canvas AI: Expose Props of Blocks to the Agent (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3569120 [124] Canvas AI: page builder discards the whole build when the LLM names a region that does not exist (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591876 [125] Header region height is calculated incorrectly in Canvas editor (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591935 [126] Dependency Dashboard (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591657 [127] Add component label to settings form (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591934 [128] Fix cache contexts being added as cache tags in ContentTemplate::normalizeForClientSide() (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591933 [129] Canvas AI: Client-side orchestration loop for Canvas AI(POC) (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591615 [130] canvas_test_code_components_content_entity_ref config/install fields conflict on the standard profile (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591869 [131] Enforce "Delete Translations" permission on the Canvas API translation delete route (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591784 [132] Align Canvas UI translation operations and access with content_translation/TMGMT (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591932 [133] Apply saved config language override to auto-saved versions in layout (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3583043 [134] Stage Canvas autosaves in a dedicated Workspace (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3588540 [135] Multi-bundle content-entity-reference picks reading multiple fields per bundle coalesce into an unrenderable object (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591873 [136] Expand conflict detection and resolution entity types other than Page (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591544 [137] Missing upgrade path: stored `default-relative-url` prop sources written before 1.8 contain `$id` and fail `DefaultRelativeUrlPropSource::parse()` (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591904 [138] Array prop shapes don't inherit their item shape's cache tags, so prop-shape invalidation misses them (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591917 [139] Automatically create components when themes are installed (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591898 [140] Docs oriented to recipe authors integrating with Canvas (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3564135 [141] Allow Canvas Patterns+PageRegions+ContentTemplates provided by Recipes to NOT specify component versions (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3571366 [142] component_tree sequence keys sorted lexicographically instead of numerically, breaking component order at 10+ instances per level (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3582200 [143] Strengthen AutoSaveManager to generate stable hashes (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591785 [144] Checkmark and options menu disappear from LanguageSelect on preview page refresh (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591798 [145] Publishing a symmetrically-translated canvas_page 422s when a default-language edit changes a non-translatable component input (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591820 [146] Prefix-strip redirect misses default-language prefixes and is overridden by ?destination (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591839 [147] PHPStan failing on global $argv usage (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591931 [148] Code editor: developers cannot see what a content-entity-reference prop delivers to their component (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591805 [149] PHPStan rule: needs*() config detectors must not mutate the entity they inspect (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591855 [150] Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3581133 [151] Canvas AI: Add Tools dropdown to chat UI (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591856 [152] [upstream] Data loss: `drush config:import` deletes config (e.g. code component + component config entities) and bypasses config system data integrity checks (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3573022 [153] fix: #3591876 Validate the target region before placing components (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1423 [154] chore(deps): update dependency cspell to v10 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1273 [155] chore(deps): update dependency @eslint/compat to v2 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1306 [156] chore(deps): update dependency @chromatic-com/storybook to v5 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1305 [157] fix(deps): update npm minor and patch (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1238 [158] chore(deps): update mysql docker tag to v8.4 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1272 [159] #3591838 [PHASE 2] introduce color props (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1432 [160] Draft: #3591838 Phase 3: Usage data + deletion (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1479 [161] Add the entity type's list cache contexts as cache contexts, not as cache tags. (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1486 [162] Add a entity reference prop data shape preview to code editor (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1351 [163] task: #3567225 Make the component tree loader extensible (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/948 [164] bug: #3591839 Preserve the query string when stripping the language prefix; a... (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1387 [165] Resolve multi-bundle CER picks reading several fields per bundle (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1431 [166] #3591869: Provide the code-components content-entity-ref test module's shared fields via a recipe so it installs on any profile (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1414 [167] Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1376 [168] #3591784: Revert MR !1342 "delete content translations" permission requirement (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1398 [169] #3591917 Array prop shapes inherit their item shape's cache tags (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1475 [170] #3591851: Allow editing stored patterns (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1403 [171] fix(ui): #3591716 boolean props auto-enable when another prop is changed (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1285 [172] fix(ui): #3591716 boolean props auto-enable when another prop is changed (1.6.0) (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1286 [173] refactor(Conflict resolution): #3591785 Strengthen AutoSaveManager to generate stable hashes (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1356 [174] fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1363 [175] feat: #3518272 support all entity types with configurable displays for content templates (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/791 [176] fix: #3591931 Do not rely on $argv being a global (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1485 [177] #3591875: "Translatable props missing from TMGMT form when component instances cannot be auto-updated to active version" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1418 [178] Add PHPStan rule: needs*() config detectors must not mutate the entity they inspect (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1416 [179] #3581133: Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1297 [180] Resolve #3591907 "Balance cypress E2E parallel split by runtime weight" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1463 [181] Add context item Priority field and use it for selection ordering (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586376 [182] Remove max_items context limit and rely on the token budget (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586378 [183] Clarify and stabilize the scope plugin extension boundary for 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586392 [184] Align scope scoring, language service, and contextual selection behavior (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586388 [185] CCC QA scripts for 1.0 testing (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586226 [186] Redesign selection modes as a nested Minimal / Relevant / Broad ladder and remove match_all (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586394 [187] Switch CCC documentation link to clean version (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586370 [188] Document real-world use cases for CCC 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586372 [189] Document how to use RAG with CCC 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586371 [190] Resolve `use_default` provider config for conditional subcontext selection (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586391 [191] Implement plugin-based generic context consumers and unified consumer configuration (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586346 [192] Persist context-item token counts and show token-budget usage in CCC UI (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586379 [193] "Global context" checkbox description renders a literal
                                                      instead of a line break (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586369 [194] Install `target_entities` field storage when Dynamic Entity Reference is enabled on existing sites (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586375 [195] Document the AI Context role and permission matrix for 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586395 [196] Create multi-vocabulary taxonomy scope plugin (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586237 [197] Pre-1.0 context selection reliability and diagnostics follow-up to issue 3586363 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586383 [198] Issue #3586376: Add context item priority field and selection tie-breakers. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/245 [199] Issue #3586392: Clarify and stabilize scope plugin extension boundary for 1.0. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/249 [200] Issue #3586388: Align scope scoring and contextual detection. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/242 [201] Issue #3586378: Remove max_items context limit and rely on token budget. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/244 [202] Issue #3586372: Document real-world use cases for CCC (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/256 [203] Issue #3586371: Document how to use RAG with CCC (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/255 [204] Issue #3586379: Persist token counts and show budget usage in CCC UI. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/248 [205] Issue #3586395: Document the AI Context role and permission matrix for 1.0. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/254 [206] Issue #3586375: Install target_entities storage when DER is enabled later. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/251 [207] Issue #3586383: Pre-1.0 context selection reliability and diagnostics follow-up. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/252 [208] Feature: Translation result caching and cross-field deduplication (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585529 [209] Update translation cropping (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3479612 [210] Compatible with Address module (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3468992 [211] one-click link should show human name, not machine name (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3580314 [212] backport: one-click link should show human name (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585535 [213] Refactor translation workflow to support Tool API and agent-driven translation (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585523 [214] Auto-translate referenced taxonomy terms (and other translatable entities) when translating a node (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585539 [215] AI Translate: Issue with translating blocks which has language code as und on layout builder page (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3567453 [216] Translation seems to affect workflow (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3472755 [217] Classes fail to resolve correctly in unit tests because of ai_translate variant in AI core module (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585544 [218] [META] AI Translation — DrupalCon Rotterdam 2026 demo (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585543 [219] Recipe: translate Drupal AI Demo content to Spanish, German, and French (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585542 [220] Add ai_translate-specific issue and merge request templates (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585541 [221] InvalidArgumentException: Invalid translation language (und) when translating media entities (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585532 [222] feat: #3585541 Add ai_translate-specific issue and merge request templates (ai_translate, MR) — https://git.drupalcode.org/project/ai_translate/-/merge_requests/38 [223] Issue #3548465: Add createScore() for feedback and a langfuse_feedback submodule (langfuse, MR) — https://git.drupalcode.org/project/langfuse/-/merge_requests/6 [224] chunkDelay/chunkPadding applied per-event compounds into real latency/timeout risk on long or tool-heavy runs (agui, Issue) — https://git.drupalcode.org/project/agui/-/work_items/3590049 --- MODULE SUMMARIES ---

                                                      AI (Artificial Intelligence)

                                                      The AI module saw continued community coordination and issue triage over the past 24 hours. A contribution meeting was held to align the community on priorities and discuss active work. Several new defects and integration requests were identified and are now being addressed.

                                                      Key issues moving forward include a prompt rendering bug where HTML content is unintentionally escaped before being sent to AI providers, and a content loss issue affecting text generation workflows when using certain field configurations. A UI error preventing tool deletion has reached ready-to-be-committed status. Work continues on embedding support via Symfony AI and test infrastructure documentation to improve contributor onboarding. An incompatibility with newer Gemini models has been documented and is under investigation.

                                                      The plan to support background AI execution remains an open architectural challenge that will unblock use cases like scheduled content generation and queue-based processing.

                                                      How can I help on this project?

                                                      • Champion a decision on the background execution architecture to unblock queued and scheduled AI workflows.
                                                      • Consider resourcing for compatibility testing across major AI providers (OpenAI, Gemini, Anthropic) to reduce integration defects.

                                                      Contributors: Ann Mary Sruthy (annmarysruthy), Rob Loach (robloach), Scott Euser (scotteuser), Shivam Sen (shivamsen_12579)

                                                      ---

                                                      Drupal AI Initiative

                                                      Activity over the past 24 hours focused on two main areas: partnership outreach and planning for the upcoming DrupalCon Rotterdam demonstration.

                                                      Significant effort was invested in expanding the initiative's partner base. More than 30 outreach conversations were documented and closed, resulting in commitments from multiple organizations including Calibrate, Oomph, Specbee, Cambridge Press, Reading Room, Wunder, Mearra, Drupalforge, E-sepia, Integral Vision, Brainsum, Optasy, Drunomics, Kalamuna, Pantheon, Esinergia, Foster Interactive, EPAM, iTech4Web, Pronovix, and Zivtech. Several additional organizations are still considering participation. This partnership growth directly supports the initiative's funding and collaborative development capacity.

                                                      Planning continued for the Rotterdam demonstration, which aims to showcase multiple AI capabilities working together in a single site that attendees can deploy themselves. The UX team met to discuss content requirements, tone guidelines, and compliance with EU AI Act disclosure requirements. Work is also underway to update partner badges to reflect the collaborative "Partner" terminology rather than "Sponsor."

                                                      How can I help on this project?

                                                      • Ensure design resources are allocated to complete the partner badge updates before Rotterdam
                                                      • Support partnership follow-up with organizations still considering participation to secure additional funding commitments
                                                      • Help prioritize demo content creation to meet the Rotterdam timeline
                                                      ---

                                                      Model Context Protocol

                                                      The Model Context Protocol module saw limited activity during this period, with two authentication-related issues receiving updates. Both items involve improving how the module handles secure connections between clients and servers.

                                                      Work continues on Token Auth is not working, which addresses problems preventing administrators from enabling token-based authentication through the configuration interface. This issue affects the usability of security features that control how external systems connect to Drupal.

                                                      Additionally, Add OAuth Scope Validation for MCP Authentication remains under development. This work aims to give administrators better control over what permissions are granted when external clients authenticate, ensuring that only necessary access rights are approved rather than automatically accepting all requests.

                                                      No code was merged or committed during this period. Both issues are assigned and part of ongoing sprint work, indicating steady progress within the AI Initiative's development roadmap.

                                                      How can I help on this project?

                                                      • Ensure the team has sufficient review capacity to evaluate and merge authentication fixes once development is complete.
                                                      • Clarify security policy requirements for OAuth scope handling to guide technical implementation decisions.
                                                      ---

                                                      AI Agents

                                                      The AI Agents module saw significant development activity focused on fixing defects and improving the authoring experience. Seven new merge requests were opened addressing issues ranging from data handling bugs to interface improvements.

                                                      Work is underway to fix a bug where the content creation tool was storing field values incorrectly, which prevented AI assistants from successfully creating articles and other content. Separately, improvements are being made to the schema editor used when configuring agents, replacing a basic text box with a specialized code editor that validates JSON syntax and highlights errors as administrators work.

                                                      Additional merge requests target bugs in field information handling, tool status reporting, and support for newer AI model series. A regression test was added to ensure agents remain immediately usable after creation without manual cache clearing.

                                                      One exploration issue was closed during the period: work investigating how to export and synchronize Drupal-defined agents to external AI platforms like Claude Code. This signals a decision point on integration strategy with third-party agent ecosystems.

                                                      All open merge requests are in review. The module continues to mature its content creation capabilities and administrative tooling.

                                                      How can I help on this project?

                                                      • Allocate reviewer capacity to accelerate the seven open merge requests, particularly the content creation bug fix which blocks practical use cases.
                                                      • Clarify strategic direction on external platform integration following closure of the export/sync exploration work.

                                                      Contributors: Ahmad Khader (Ahmad-Khader), Bharat Kelotra (bharatkelotra), Joshua Fernandes (joshua1234511), Prabhavathi Vanipenta (prabha1997)

                                                      ---

                                                      Tool API

                                                      The Tool API module made significant progress toward its RC1 release during this period, with 18 issues closed and 17 merge requests integrated. The work focused on hardening the plugin contract and input/output system ahead of the interface freeze.

                                                      A major area of activity was fixing validation and input handling bugs that could have caused tools to fail in production. Multiple inputs now validate all items instead of just the first one, and list-type inputs are now checked properly. Input values that cannot be stored now produce clear error messages instead of generic exceptions. Error messages throughout the system are now translatable and no longer expose raw technical details to end users.

                                                      The execution contract was reworked to use clearer naming and properly typed interfaces. An unimplemented caching interface was removed rather than shipped incomplete. Several identifiers were prefixed to follow Drupal naming conventions and avoid namespace collisions with other modules.

                                                      Integration with AI systems was strengthened: the connector now handles tools with unmet requirements gracefully, input schemas now include richer constraint information, and the system automatically corrects common formatting variations that AI models produce (such as sending JSON numbers instead of strings for decimal inputs, or wrapping single values in arrays).

                                                      Comprehensive test coverage was added for the typed input and output system, configuration precedence, and validation flows. One open issue tracks a schema conversion bug affecting tools that use bare regex patterns.

                                                      How can I help on this project?

                                                      • Confirm timeline and scope expectations for the RC1 release to ensure the remaining schema bug can be resolved without delaying the freeze.
                                                      • Support documentation resourcing: project page automation is ready but needs enablement, and tool authoring guidance would benefit from dedicated technical writing.

                                                      Contributors: Ajit Shinde (ajits), Alex Urevick-Ackelsberg (alexua) [2], Michael Lander (michaellander) [15]

                                                      ---

                                                      Drupal Canvas

                                                      Drupal Canvas made progress across data integrity, translation workflows, and AI capabilities during this reporting period.

                                                      A field configuration conflict affecting test modules on the standard profile was resolved, improving compatibility for developers manually testing content-entity-reference features. A fix for array prop shape cache tag inheritance was merged, ensuring components with array-based properties (such as multi-value image fields) correctly invalidate when underlying configuration changes. Work advanced on normalizing autosave hash generation, consolidating duplicated typed-data logic to strengthen conflict detection reliability.

                                                      Two translation-related issues moved forward: a publishing validation bug affecting symmetrically-translated pages was merged, and discussion continued on aligning Canvas translation operations with core content_translation and TMGMT. An AI page-builder issue where incorrect region names abort entire builds is under review, with a fix proposed to validate regions before placement.

                                                      A header region height calculation bug introduced in 1.9.0 was reported, blocking editor interaction on some sites. Work on editable stored patterns was merged, allowing users to rename and modify patterns after creation. A cache context tagging error in content template normalization was identified and is being corrected.

                                                      How can I help on this project?

                                                      Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Adam G-H (phenaproxima), Alamgir Hossain (alamgir.hossain.cse), Ben Mullins (bnjmnm), Christian López Espínola (penyaskito) [1], Dave Long (longwave), Feliksas Mazeikis (f.mazeikis), Fons Vandamme (f0ns), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Nodar Davituri (Davituri), Rajab Natshah (RajabNatshah), Ted Bowman (tedbow), Tim Plunkett (tim.plunkett) [1], Wim Leers (wimleers)

                                                      ---

                                                      Context Control Center (CCC)

                                                      The project advanced toward its 1.0 stable release during this period with two significant changes merged. The first simplifies how the system limits the amount of information sent to AI agents. Previously, site administrators configured both a maximum number of context items and a token budget (a measure of content size). This created unnecessary complexity, since context items vary widely in length. The change to Remove max_items context limit and rely on the token budget means administrators now configure only the token budget, providing more accurate control over what reaches AI agents while reducing setup complexity.

                                                      The second merged change provides documentation for the role and permission matrix, giving site builders clear guidance on how to assign permissions to different types of users—from AI feature consumers to content authors to system administrators.

                                                      Work continues on several fronts preparing for stable release. Progress is underway on improving how the system selects and orders context when multiple items compete for limited space, persisting token counts to give editors better visibility into budget usage, and aligning scoring behavior to make selection more predictable. Documentation covering real-world use cases and integration patterns is also in development.

                                                      How can I help on this project?

                                                      Support resourcing for the QA testing phase, which requires test scripts and coordination before final release. Consider whether roadmap decisions are needed around post-1.0 features currently proposed for future sprints. Ensure documentation and use-case materials receive stakeholder review to confirm they address real deployment scenarios.

                                                      Contributors: Abhinav Jha (ajabhinavjha30), Kristen Pol (kepol) [2] ---

                                                      AI Dashboard

                                                      The AI Dashboard module saw focused maintenance work during this period. A visual refinement was completed to ensure consistent display of descriptive text throughout the interface, improving overall readability and user experience.

                                                      This represents steady progress on polish and usability as the module matures. No major risks or blockers were identified during this period.

                                                      How can I help on this project?

                                                      • Consider whether the project needs dedicated design or user experience support to identify further usability improvements.
                                                      • Assess whether additional testing resources could help accelerate the path to a stable release.

                                                      Contributors: Rob Loach [1]

                                                      ---

                                                      AI translate

                                                      The AI translate project saw significant planning activity over the past 24 hours, with fourteen issues updated as teams prepare for a demonstration at DrupalCon Rotterdam 2026. Work is underway to make the module a production-ready alternative to manual content translation, with particular focus on cost reduction, editor experience, and integration with multilingual search.

                                                      Key areas of progress include:

                                                      Several bugs affecting media translation and layout builder workflows remain open and postponed, which is typical for a module at this stage.

                                                      How can I help on this project?

                                                      Confirm resource allocation for the DrupalCon Rotterdam demo delivery. Clarify whether automatic translation of referenced entities should be opt-in or default behaviour to unblock the design decision. Consider funding a dedicated QA cycle for the postponed media and workflow bugs once core features stabilise.

                                                      Contributors: Christoph Breidert (breidert) ---

                                                      FlowDrop

                                                      During the past 24 hours, FlowDrop reached a significant quality milestone by strengthening its internal code analysis to the highest available standard. The project advanced through two major quality levels in succession, improving type safety throughout the platform. This work touched every component of the system, including workflows, pipelines, sessions, jobs, memory systems, chat functionality, and the orchestration layer.

                                                      These improvements reduce the likelihood of runtime errors and make the codebase more maintainable over time. The changes ensure that data flowing through the system is more predictable and easier to validate, which should result in more reliable behaviour for users. Additionally, spelling checks were reinstated and British English was adopted as the project's documentation standard, improving consistency across all written materials.

                                                      This type of foundational work does not deliver immediately visible features but positions the project for faster, safer development of new capabilities in the future.

                                                      How can I help on this project?

                                                      Consider clarifying the roadmap priorities for user-facing features now that code quality has been strengthened. If the project is approaching a release milestone, allocating time for user testing or documentation review could ensure a smooth launch.

                                                      Contributors: Shibin Das [60]

                                                      ---

                                                      Langfuse

                                                      The Langfuse module made notable progress in the last 24 hours with the completion of work to enable user feedback collection. A new feedback capability was merged, adding a dedicated submodule that allows sites to capture and score user responses. This enhancement will enable organizations to gather structured feedback data, which can inform product improvements and better understand how users interact with AI-powered features.

                                                      The change represents a significant expansion of the module's functionality, moving beyond basic tracking to include mechanisms for measuring user satisfaction and response quality. This positions the module to support more comprehensive observability of AI features in production environments.

                                                      How can I help on this project?

                                                      Consider allocating resources for user testing of the new feedback features to validate real-world usability. Support outreach to early adopters who could provide case studies demonstrating business value. Evaluate whether additional investment is needed to accelerate progress toward a stable release.

                                                      Contributors: Abhisek Mazumdar (abhisekmazumdar) [1]

                                                      ---

                                                      AG-UI

                                                      No development activity was recorded during this period. One new performance issue was opened concerning chunkDelay/chunkPadding applied per-event compounds into real latency/timeout risk on long or tool-heavy runs. The report identifies that artificial delays and padding are being applied to every event sent to the browser, not just content chunks. For conversations involving multiple steps or tool usage, this overhead accumulates and can add several seconds of unnecessary delay to each response, which may affect user experience in production deployments.

                                                      The issue remains unassigned and no solution is yet in development. Given the module's maturity stage, open performance issues are expected as the project evolves.

                                                      How can I help on this project?

                                                      • Allocate developer time to investigate and resolve the performance overhead issue, particularly if this module supports user-facing or time-sensitive workflows.
                                                      • Clarify priority: decide whether optimising response times is critical for the current release or can be deferred to a later phase.
                                                      ======================================================================== ## [29] factcheck:tldr:executive ======================================================================== Layer-1 corrections: 1 Judge flags: 5 ======================================================================== ## [30] generate2026Capabilities ======================================================================== You are an editor writing a strategic section for a non-technical executive audience. The Drupal AI initiative has 8 planned capabilities for 2026. Your task is to read the module activity summaries below and explain how today's progress moves each capability forward — or note where there was no relevant progress today. Be concise and direct. Focus on what matters to a business leader: is progress happening, what is the next milestone, and are there any risks? When you describe progress on a capability, add inline citations using [N] where N is the reference number from the list below. You may cite multiple references per item, e.g. [1][3]. Place citations at the end of the relevant sentence, before the closing punctuation. Output an HTML fragment using exactly this structure:

                                                      2026 Capabilities Progress

                                                      1. Capability name — One or two sentences on how today's activity relates to this goal, or "No direct progress today" if nothing relevant occurred.
                                                      Use only the 8 capabilities listed below, in the same order. Do not add, remove, or rename them. Do not output any text outside the

                                                      and
                                                        tags. --- 2026 CAPABILITIES --- 1. Page generation — Describe what you need and get a usable page, built from your actual design system components 2. Context management — A central place to define brand voice, style guides, audience profiles, and governance rules that AI can use 3. Background agents — AI that works without being prompted, responding to triggers and schedules while respecting editorial workflows 4. Design system integration — AI that builds with your components and can propose new ones when needed 5. Content creation and discovery — Smarter search, AI-powered optimization, and content drafting assistance 6. Advanced governance — Batch approvals, branch-based versioning, and comprehensive audit trails for AI changes 7. Intelligent website improvements — AI that learns from performance data, proposes concrete changes, and gets smarter over time through editorial review 8. Multi-channel campaigns — Create content for websites, social, email, and automation platforms from a single campaign goal --- REFERENCE LIST --- [1] Add AIDmi to Other modules/recipes that work with the AI module (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586566 [2] Drupal AI Contribution meeting 2026-08-10 (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586662 [3] Drupal AI Contribution meeting 2026-07-27 (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586618 [4] Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{ context }} and {{ raw_context }} before they reach the provider (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586661 [5] If only one tool, cannot delete it, gives an error: Undefined array key 1 in Drupal\ai\Element\ToolsLibrary::processToolsLibrary() (line 89 of modules/contrib/ai/src/Element/ToolsLibrary.php) & more (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586652 [6] Chatbot closes itself when adding a modal (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3499451 [7] Document FunctionalJavascript test conventions and add CI check for ungrouped/unrecorded tests (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3582633 [8] `AiReranker::extractItemText()` should prefer chunk text over configured indexed fields (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586637 [9] Add thumbs-up and thumbs-down icons to the shared AI icon set (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586660 [10] ai_ckeditor: streamGenerateContent causes 400 Bad Request with Gemini 2.x models (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586425 [11] LLM: Text / LLM: Text (simple) automators silently drop Base Field content when Base Field and Target Field are both long-text types (Basic input mode) (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3586659 [12] [PLAN] Propagate and enforce an explicit executor for sessionless, queued, and outside-in AI runs (ai, Issue) — https://git.drupalcode.org/project/ai/-/work_items/3573899 [13] Issue #3586475: Rename the RegExp Guardrail labels to RegEx (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1689 [14] bug: #3586661 Twig autoescaping in AiPromptHelper::renderPrompt() corrupts {{... (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1924 [15] #3582633: Add Functional JavaScript testing conventions and validation script (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1432 [16] Resolve #3586495 "Add support embeddings via symfony/ai" (ai, MR) — https://git.drupalcode.org/project/ai/-/merge_requests/1856 [17] Drupal AI UX meeting 10 August 2026 (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586608 [18] Update AI partner badges to use Partner instead of Sponsor (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586636 [19] Communication Binarywork to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586718 [20] Communication Genero inc to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586720 [21] Communication Smile to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586719 [22] Communication Evolvingweb to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586717 [23] Communication Digital polygon to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586716 [24] Communication Sparkfabrik to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586715 [25] Communication Promet source to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586714 [26] Communication Redhat to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586713 [27] Communication Omedia to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586712 [28] Communication Faktorial to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586711 [29] Communication NTTdata to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586710 [30] Communication Swis to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586709 [31] Communication Hintogroup to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586708 [32] Communication Mobomo to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586707 [33] Communication Kadabra IT to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586706 [34] Communication EPAM joining (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586705 [35] Communication iTech4Web (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586704 [36] Call Pronovix to join (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586703 [37] Call Zivtech to join Initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586702 [38] Communication Joshi consulting (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586701 [39] Communication Civiactions (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586700 [40] Call IOgroup CEO (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586699 [41] Call 2 calibrate (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586698 [42] Call 1 calibrate (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586697 [43] Call with Oomph (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586696 [44] Communication with Specbee (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586695 [45] Call with Cambridge press (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586694 [46] Call with Reading room to join initiative (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586693 [47] Went to see Vesa from Wunder in Cascais to join AI initaitive (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586691 [48] Met with team Mearra in Athens (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586692 [49] Call 2 with Drupalforge (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586690 [50] Call 1 with drupalforge (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586689 [51] Call/mail with Yorgos E-sepia (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586688 [52] Call with integral vision (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586687 [53] Call with Brainsum (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586686 [54] Call with Optasy (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586685 [55] Call with wolfgang Drunomics (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586684 [56] Call with Kalamuna (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586683 [57] Call 2 with Josh from Pantheon (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586682 [58] Call 1 with Josh from Pantheon (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586681 [59] Call with Esinergia (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586680 [60] Call with Aidan Foster interactive (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586679 [61] [META] 2026 AI Inside Roadmap to DrupalCon Rotterdam 2026 (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586657 [62] Create a skill for manual before/after testing of any issue, with optional glab upload (ai_initiative, Issue) — https://git.drupalcode.org/project/ai_initiative/-/work_items/3586629 [63] Token Auth is not working (mcp, Issue) — https://git.drupalcode.org/project/mcp/-/work_items/3584901 [64] Add OAuth Scope Validation for MCP Authentication (mcp, Issue) — https://git.drupalcode.org/project/mcp/-/work_items/3569845 [65] MCP Server: Entity Seeder uses wrong type for content (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586031 [66] Make it possible to restrict the order of tools during agent executions (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3560681 [67] Use the `ai_json_schema` editor for the AI Agent structured-output schema field (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3586042 [68] Explore export/sync plugin system for AI Agents to external agent platforms (Claude Code, VAPI, etc.) (ai_agents, Issue) — https://git.drupalcode.org/project/ai_agents/-/work_items/3577241 [69] ContentEntitySeeder stores multi-property field values as Array (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/345 [70] Issue#3586025:GetEntityFieldInformation-Leaks-Target_entity_type-Target_bundle... (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/344 [71] Issue (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/343 [72] Issue3569280:AI-Agents-Explorer-Chat-Generation-Does-Not-Support-Series-Models fixes (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/342 [73] Issue#3566126:Force-Value-Dropped-Tool-Property-Restrictions fixes. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/341 [74] Issue #3560681: Add per-tool execution ordering constraints for agent loops. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/252 [75] Issue#3565169:Schema-Error-AI-Agents-CKEditor-Plugin fixes. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/340 [76] #3586042: Use the ai_json_schema editor for the structured output schema field. (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/298 [77] Issue #3586042 Use the `ai_json_schema` editor for the AI Agent structured-output schema field (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/284 [78] test: #3586021 Add regression test for ai_agent plugin cache invalidation (ai_agents, MR) — https://git.drupalcode.org/project/ai_agents/-/merge_requests/337 [79] Bare regex patterns are dropped from emitted JSON Schemas (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582987 [80] Define checkRequirements() as a configuration-time signal (indicator + add-prevention), not a runtime gate (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582975 [81] ToolBase's promoted $logger property conflicts with subclasses declaring their own logger (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582986 [82] SchemaToolsPropertyConverter fatals on empty-map schemas: \ArrayObject reaches ToolsPropertyInput's array-typed setters (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582985 [83] tool_ai_connector: ToolPluginBase::getReadableOutput() fatals when wrapped tool has no result object (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582941 [84] fromDataDefinition() breaks on plain typed-data lists and unlabeled definitions (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582984 [85] Coerce JSON numbers to strings for decimal inputs (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582983 [86] Complete kernel coverage of the typed input/output traits and definition pipeline (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582974 [87] Rework the tool execution contract: result naming, concrete typing, and decoupling from core ExecutableInterface (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582964 [88] Correct API signatures before the RC1 freeze (batch) (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582962 [89] Implement getCacheContexts() or drop CacheableDependencyInterface from ToolInterface (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582965 [90] Prefix module-owned identifiers: alter hook, cache key, and 'text' data type ID (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582963 [91] Move orphaned "FieldExistConstraint' and 'FieldExistsConstraintValidator' to Tool Belt. (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582951 [92] ListInputDefinition item values are never validated (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582982 [93] Make violation messages translatable and stop surfacing raw exception text (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582971 [94] ToolBase::access() throws on invalid/missing input instead of returning forbidden (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582961 [95] Non-array value for a map input throws instead of failing validation (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582981 [96] validateInputValue() only validates the first item of a multiple input (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582960 [97] Extend input coercion for unambiguous LLM value shapes (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582973 [98] Emit richer JSON Schema: map remaining constraints and type formats (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582972 [99] Write documentation and enable project pages (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582955 [100] Create a skill for generating Tool plugins (best practices, how-to, placement) (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582945 [101] [META] Tool API - Path to Beta and Inclusion in AI (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3558327 [102] Proposal: make Tool's declarations introspectable over the CLI, and enrich input schema (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3582943 [103] Introduce support for Discovery, Planning and Execute calls for MCP and Agents (tool, Issue) — https://git.drupalcode.org/project/tool/-/work_items/3546292 [104] fix: #3582986 require the logger channel and document the subclass redeclaration contract (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/128 [105] fix: #3582985 cast ArrayObject schema values to arrays before building AI tool properties (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/127 [106] Fix fromDataDefinition: fall back for missing labels and toArray type keys. (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/126 [107] Resolve "Coerce JSON numbers to strings for decimal inputs" (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/125 [108] Enforce checkRequirements() in execute() and exclude unmet tools from the AI function list. (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/124 [109] Add kernel coverage: locked/configuration inputs, refiner flow, definition... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/123 [110] fix: #3582964 own execution contract: result value interfaces, accessors on... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/122 [111] fix: #3582947 tool_ai_connector does not handle tools returning list of entities (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/96 [112] fix: #3582962 correct API signatures: factory overrides, null context values,... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/121 [113] fix: #3582965 drop the unimplemented cacheability contract from ToolInterface (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/120 [114] fix: #3582963 prefix the adapter alter hook and cache key; keep the generic... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/119 [115] fix: #3582982 validate list definition items and name failing positions (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/118 [116] Make input violation messages translatable; log unexpected exceptions instead... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/117 [117] fix: #3582961 fail closed when tool input is invalid or missing (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/113 [118] Rethrow un-storable input values as InputException naming the input. (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/116 [119] fix: #3582960 validate every multiple input item (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/112 [120] Extend input coercion: JSON-string structures, enum near-misses, datetime... (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/115 [121] Resolve "Emit richer JSON Schema: map remaining constraints and type formats" (tool, MR) — https://git.drupalcode.org/project/tool/-/merge_requests/114 [122] Canvas AI: Add a dev page builder agent and wire the placement tools (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591921 [123] Canvas AI: Expose Props of Blocks to the Agent (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3569120 [124] Canvas AI: page builder discards the whole build when the LLM names a region that does not exist (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591876 [125] Header region height is calculated incorrectly in Canvas editor (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591935 [126] Dependency Dashboard (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591657 [127] Add component label to settings form (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591934 [128] Fix cache contexts being added as cache tags in ContentTemplate::normalizeForClientSide() (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591933 [129] Canvas AI: Client-side orchestration loop for Canvas AI(POC) (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591615 [130] canvas_test_code_components_content_entity_ref config/install fields conflict on the standard profile (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591869 [131] Enforce "Delete Translations" permission on the Canvas API translation delete route (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591784 [132] Align Canvas UI translation operations and access with content_translation/TMGMT (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591932 [133] Apply saved config language override to auto-saved versions in layout (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3583043 [134] Stage Canvas autosaves in a dedicated Workspace (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3588540 [135] Multi-bundle content-entity-reference picks reading multiple fields per bundle coalesce into an unrenderable object (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591873 [136] Expand conflict detection and resolution entity types other than Page (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591544 [137] Missing upgrade path: stored `default-relative-url` prop sources written before 1.8 contain `$id` and fail `DefaultRelativeUrlPropSource::parse()` (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591904 [138] Array prop shapes don't inherit their item shape's cache tags, so prop-shape invalidation misses them (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591917 [139] Automatically create components when themes are installed (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591898 [140] Docs oriented to recipe authors integrating with Canvas (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3564135 [141] Allow Canvas Patterns+PageRegions+ContentTemplates provided by Recipes to NOT specify component versions (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3571366 [142] component_tree sequence keys sorted lexicographically instead of numerically, breaking component order at 10+ instances per level (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3582200 [143] Strengthen AutoSaveManager to generate stable hashes (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591785 [144] Checkmark and options menu disappear from LanguageSelect on preview page refresh (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591798 [145] Publishing a symmetrically-translated canvas_page 422s when a default-language edit changes a non-translatable component input (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591820 [146] Prefix-strip redirect misses default-language prefixes and is overridden by ?destination (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591839 [147] PHPStan failing on global $argv usage (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591931 [148] Code editor: developers cannot see what a content-entity-reference prop delivers to their component (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591805 [149] PHPStan rule: needs*() config detectors must not mutate the entity they inspect (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591855 [150] Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3581133 [151] Canvas AI: Add Tools dropdown to chat UI (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3591856 [152] [upstream] Data loss: `drush config:import` deletes config (e.g. code component + component config entities) and bypasses config system data integrity checks (canvas, Issue) — https://git.drupalcode.org/project/canvas/-/work_items/3573022 [153] fix: #3591876 Validate the target region before placing components (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1423 [154] chore(deps): update dependency cspell to v10 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1273 [155] chore(deps): update dependency @eslint/compat to v2 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1306 [156] chore(deps): update dependency @chromatic-com/storybook to v5 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1305 [157] fix(deps): update npm minor and patch (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1238 [158] chore(deps): update mysql docker tag to v8.4 (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1272 [159] #3591838 [PHASE 2] introduce color props (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1432 [160] Draft: #3591838 Phase 3: Usage data + deletion (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1479 [161] Add the entity type's list cache contexts as cache contexts, not as cache tags. (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1486 [162] Add a entity reference prop data shape preview to code editor (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1351 [163] task: #3567225 Make the component tree loader extensible (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/948 [164] bug: #3591839 Preserve the query string when stripping the language prefix; a... (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1387 [165] Resolve multi-bundle CER picks reading several fields per bundle (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1431 [166] #3591869: Provide the code-components content-entity-ref test module's shared fields via a recipe so it installs on any profile (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1414 [167] Resolve #3591829: Coalesce multi-bundle references with differing per-bundle fields (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1376 [168] #3591784: Revert MR !1342 "delete content translations" permission requirement (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1398 [169] #3591917 Array prop shapes inherit their item shape's cache tags (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1475 [170] #3591851: Allow editing stored patterns (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1403 [171] fix(ui): #3591716 boolean props auto-enable when another prop is changed (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1285 [172] fix(ui): #3591716 boolean props auto-enable when another prop is changed (1.6.0) (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1286 [173] refactor(Conflict resolution): #3591785 Strengthen AutoSaveManager to generate stable hashes (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1356 [174] fix: #3591820 Synchronize non-translatable component inputs before validating auto-save publish (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1363 [175] feat: #3518272 support all entity types with configurable displays for content templates (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/791 [176] fix: #3591931 Do not rely on $argv being a global (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1485 [177] #3591875: "Translatable props missing from TMGMT form when component instances cannot be auto-updated to active version" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1418 [178] Add PHPStan rule: needs*() config detectors must not mutate the entity they inspect (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1416 [179] #3581133: Automate MR review using PHPCS: disallow `\Drupal::service('something')`, require `\Drupal::service(Something::class)` whenever possible, with automatic fixing (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1297 [180] Resolve #3591907 "Balance cypress E2E parallel split by runtime weight" (canvas, MR) — https://git.drupalcode.org/project/canvas/-/merge_requests/1463 [181] Add context item Priority field and use it for selection ordering (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586376 [182] Remove max_items context limit and rely on the token budget (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586378 [183] Clarify and stabilize the scope plugin extension boundary for 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586392 [184] Align scope scoring, language service, and contextual selection behavior (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586388 [185] CCC QA scripts for 1.0 testing (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586226 [186] Redesign selection modes as a nested Minimal / Relevant / Broad ladder and remove match_all (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586394 [187] Switch CCC documentation link to clean version (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586370 [188] Document real-world use cases for CCC 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586372 [189] Document how to use RAG with CCC 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586371 [190] Resolve `use_default` provider config for conditional subcontext selection (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586391 [191] Implement plugin-based generic context consumers and unified consumer configuration (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586346 [192] Persist context-item token counts and show token-budget usage in CCC UI (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586379 [193] "Global context" checkbox description renders a literal
                                                        instead of a line break (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586369 [194] Install `target_entities` field storage when Dynamic Entity Reference is enabled on existing sites (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586375 [195] Document the AI Context role and permission matrix for 1.0 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586395 [196] Create multi-vocabulary taxonomy scope plugin (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586237 [197] Pre-1.0 context selection reliability and diagnostics follow-up to issue 3586363 (ai_context, Issue) — https://git.drupalcode.org/project/ai_context/-/work_items/3586383 [198] Issue #3586376: Add context item priority field and selection tie-breakers. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/245 [199] Issue #3586392: Clarify and stabilize scope plugin extension boundary for 1.0. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/249 [200] Issue #3586388: Align scope scoring and contextual detection. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/242 [201] Issue #3586378: Remove max_items context limit and rely on token budget. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/244 [202] Issue #3586372: Document real-world use cases for CCC (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/256 [203] Issue #3586371: Document how to use RAG with CCC (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/255 [204] Issue #3586379: Persist token counts and show budget usage in CCC UI. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/248 [205] Issue #3586395: Document the AI Context role and permission matrix for 1.0. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/254 [206] Issue #3586375: Install target_entities storage when DER is enabled later. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/251 [207] Issue #3586383: Pre-1.0 context selection reliability and diagnostics follow-up. (ai_context, MR) — https://git.drupalcode.org/project/ai_context/-/merge_requests/252 [208] Feature: Translation result caching and cross-field deduplication (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585529 [209] Update translation cropping (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3479612 [210] Compatible with Address module (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3468992 [211] one-click link should show human name, not machine name (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3580314 [212] backport: one-click link should show human name (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585535 [213] Refactor translation workflow to support Tool API and agent-driven translation (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585523 [214] Auto-translate referenced taxonomy terms (and other translatable entities) when translating a node (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585539 [215] AI Translate: Issue with translating blocks which has language code as und on layout builder page (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3567453 [216] Translation seems to affect workflow (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3472755 [217] Classes fail to resolve correctly in unit tests because of ai_translate variant in AI core module (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585544 [218] [META] AI Translation — DrupalCon Rotterdam 2026 demo (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585543 [219] Recipe: translate Drupal AI Demo content to Spanish, German, and French (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585542 [220] Add ai_translate-specific issue and merge request templates (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585541 [221] InvalidArgumentException: Invalid translation language (und) when translating media entities (ai_translate, Issue) — https://git.drupalcode.org/project/ai_translate/-/work_items/3585532 [222] feat: #3585541 Add ai_translate-specific issue and merge request templates (ai_translate, MR) — https://git.drupalcode.org/project/ai_translate/-/merge_requests/38 [223] Issue #3548465: Add createScore() for feedback and a langfuse_feedback submodule (langfuse, MR) — https://git.drupalcode.org/project/langfuse/-/merge_requests/6 [224] chunkDelay/chunkPadding applied per-event compounds into real latency/timeout risk on long or tool-heavy runs (agui, Issue) — https://git.drupalcode.org/project/agui/-/work_items/3590049 --- TODAY'S MODULE SUMMARIES ---

                                                        AI (Artificial Intelligence)

                                                        The AI module saw continued community coordination and issue triage over the past 24 hours. A contribution meeting was held to align the community on priorities and discuss active work. Several new defects and integration requests were identified and are now being addressed.

                                                        Key issues moving forward include a prompt rendering bug where HTML content is unintentionally escaped before being sent to AI providers, and a content loss issue affecting text generation workflows when using certain field configurations. A UI error preventing tool deletion has reached ready-to-be-committed status. Work continues on embedding support via Symfony AI and test infrastructure documentation to improve contributor onboarding. An incompatibility with newer Gemini models has been documented and is under investigation.

                                                        The plan to support background AI execution remains an open architectural challenge that will unblock use cases like scheduled content generation and queue-based processing.

                                                        How can I help on this project?

                                                        • Champion a decision on the background execution architecture to unblock queued and scheduled AI workflows.
                                                        • Consider resourcing for compatibility testing across major AI providers (OpenAI, Gemini, Anthropic) to reduce integration defects.

                                                        Contributors: Ann Mary Sruthy (annmarysruthy), Rob Loach (robloach), Scott Euser (scotteuser), Shivam Sen (shivamsen_12579)

                                                        ---

                                                        Drupal AI Initiative

                                                        Activity over the past 24 hours focused on two main areas: partnership outreach and planning for the upcoming DrupalCon Rotterdam demonstration.

                                                        Significant effort was invested in expanding the initiative's partner base. More than 30 outreach conversations were documented and closed, resulting in commitments from multiple organizations including Calibrate, Oomph, Specbee, Cambridge Press, Reading Room, Wunder, Mearra, Drupalforge, E-sepia, Integral Vision, Brainsum, Optasy, Drunomics, Kalamuna, Pantheon, Esinergia, Foster Interactive, EPAM, iTech4Web, Pronovix, and Zivtech. Several additional organizations are still considering participation. This partnership growth directly supports the initiative's funding and collaborative development capacity.

                                                        Planning continued for the Rotterdam demonstration, which aims to showcase multiple AI capabilities working together in a single site that attendees can deploy themselves. The UX team met to discuss content requirements, tone guidelines, and compliance with EU AI Act disclosure requirements. Work is also underway to update partner badges to reflect the collaborative "Partner" terminology rather than "Sponsor."

                                                        How can I help on this project?

                                                        • Ensure design resources are allocated to complete the partner badge updates before Rotterdam
                                                        • Support partnership follow-up with organizations still considering participation to secure additional funding commitments
                                                        • Help prioritize demo content creation to meet the Rotterdam timeline
                                                        ---

                                                        Model Context Protocol

                                                        The Model Context Protocol module saw limited activity during this period, with two authentication-related issues receiving updates. Both items involve improving how the module handles secure connections between clients and servers.

                                                        Work continues on Token Auth is not working, which addresses problems preventing administrators from enabling token-based authentication through the configuration interface. This issue affects the usability of security features that control how external systems connect to Drupal.

                                                        Additionally, Add OAuth Scope Validation for MCP Authentication remains under development. This work aims to give administrators better control over what permissions are granted when external clients authenticate, ensuring that only necessary access rights are approved rather than automatically accepting all requests.

                                                        No code was merged or committed during this period. Both issues are assigned and part of ongoing sprint work, indicating steady progress within the AI Initiative's development roadmap.

                                                        How can I help on this project?

                                                        • Ensure the team has sufficient review capacity to evaluate and merge authentication fixes once development is complete.
                                                        • Clarify security policy requirements for OAuth scope handling to guide technical implementation decisions.
                                                        ---

                                                        AI Agents

                                                        The AI Agents module saw significant development activity focused on fixing defects and improving the authoring experience. Seven new merge requests were opened addressing issues ranging from data handling bugs to interface improvements.

                                                        Work is underway to fix a bug where the content creation tool was storing field values incorrectly, which prevented AI assistants from successfully creating articles and other content. Separately, improvements are being made to the schema editor used when configuring agents, replacing a basic text box with a specialized code editor that validates JSON syntax and highlights errors as administrators work.

                                                        Additional merge requests target bugs in field information handling, tool status reporting, and support for newer AI model series. A regression test was added to ensure agents remain immediately usable after creation without manual cache clearing.

                                                        One exploration issue was closed during the period: work investigating how to export and synchronize Drupal-defined agents to external AI platforms like Claude Code. This signals a decision point on integration strategy with third-party agent ecosystems.

                                                        All open merge requests are in review. The module continues to mature its content creation capabilities and administrative tooling.

                                                        How can I help on this project?

                                                        • Allocate reviewer capacity to accelerate the seven open merge requests, particularly the content creation bug fix which blocks practical use cases.
                                                        • Clarify strategic direction on external platform integration following closure of the export/sync exploration work.

                                                        Contributors: Ahmad Khader (Ahmad-Khader), Bharat Kelotra (bharatkelotra), Joshua Fernandes (joshua1234511), Prabhavathi Vanipenta (prabha1997)

                                                        ---

                                                        Tool API

                                                        The Tool API module made significant progress toward its RC1 release during this period, with 18 issues closed and 17 merge requests integrated. The work focused on hardening the plugin contract and input/output system ahead of the interface freeze.

                                                        A major area of activity was fixing validation and input handling bugs that could have caused tools to fail in production. Multiple inputs now validate all items instead of just the first one, and list-type inputs are now checked properly. Input values that cannot be stored now produce clear error messages instead of generic exceptions. Error messages throughout the system are now translatable and no longer expose raw technical details to end users.

                                                        The execution contract was reworked to use clearer naming and properly typed interfaces. An unimplemented caching interface was removed rather than shipped incomplete. Several identifiers were prefixed to follow Drupal naming conventions and avoid namespace collisions with other modules.

                                                        Integration with AI systems was strengthened: the connector now handles tools with unmet requirements gracefully, input schemas now include richer constraint information, and the system automatically corrects common formatting variations that AI models produce (such as sending JSON numbers instead of strings for decimal inputs, or wrapping single values in arrays).

                                                        Comprehensive test coverage was added for the typed input and output system, configuration precedence, and validation flows. One open issue tracks a schema conversion bug affecting tools that use bare regex patterns.

                                                        How can I help on this project?

                                                        • Confirm timeline and scope expectations for the RC1 release to ensure the remaining schema bug can be resolved without delaying the freeze.
                                                        • Support documentation resourcing: project page automation is ready but needs enablement, and tool authoring guidance would benefit from dedicated technical writing.

                                                        Contributors: Ajit Shinde (ajits), Alex Urevick-Ackelsberg (alexua) [2], Michael Lander (michaellander) [15]

                                                        ---

                                                        Drupal Canvas

                                                        Drupal Canvas made progress across data integrity, translation workflows, and AI capabilities during this reporting period.

                                                        A field configuration conflict affecting test modules on the standard profile was resolved, improving compatibility for developers manually testing content-entity-reference features. A fix for array prop shape cache tag inheritance was merged, ensuring components with array-based properties (such as multi-value image fields) correctly invalidate when underlying configuration changes. Work advanced on normalizing autosave hash generation, consolidating duplicated typed-data logic to strengthen conflict detection reliability.

                                                        Two translation-related issues moved forward: a publishing validation bug affecting symmetrically-translated pages was merged, and discussion continued on aligning Canvas translation operations with core content_translation and TMGMT. An AI page-builder issue where incorrect region names abort entire builds is under review, with a fix proposed to validate regions before placement.

                                                        A header region height calculation bug introduced in 1.9.0 was reported, blocking editor interaction on some sites. Work on editable stored patterns was merged, allowing users to rename and modify patterns after creation. A cache context tagging error in content template normalization was identified and is being corrected.

                                                        How can I help on this project?

                                                        Contributors: **** (project_19391_bot_cb443e60680723bba08a5351bf595251), Adam G-H (phenaproxima), Alamgir Hossain (alamgir.hossain.cse), Ben Mullins (bnjmnm), Christian López Espínola (penyaskito) [1], Dave Long (longwave), Feliksas Mazeikis (f.mazeikis), Fons Vandamme (f0ns), Kunal Sachdev (kunal.sachdev), Lauri Timmanee (lauriii), Nodar Davituri (Davituri), Rajab Natshah (RajabNatshah), Ted Bowman (tedbow), Tim Plunkett (tim.plunkett) [1], Wim Leers (wimleers)

                                                        ---

                                                        Context Control Center (CCC)

                                                        The project advanced toward its 1.0 stable release during this period with two significant changes merged. The first simplifies how the system limits the amount of information sent to AI agents. Previously, site administrators configured both a maximum number of context items and a token budget (a measure of content size). This created unnecessary complexity, since context items vary widely in length. The change to Remove max_items context limit and rely on the token budget means administrators now configure only the token budget, providing more accurate control over what reaches AI agents while reducing setup complexity.

                                                        The second merged change provides documentation for the role and permission matrix, giving site builders clear guidance on how to assign permissions to different types of users—from AI feature consumers to content authors to system administrators.

                                                        Work continues on several fronts preparing for stable release. Progress is underway on improving how the system selects and orders context when multiple items compete for limited space, persisting token counts to give editors better visibility into budget usage, and aligning scoring behavior to make selection more predictable. Documentation covering real-world use cases and integration patterns is also in development.

                                                        How can I help on this project?

                                                        Support resourcing for the QA testing phase, which requires test scripts and coordination before final release. Consider whether roadmap decisions are needed around post-1.0 features currently proposed for future sprints. Ensure documentation and use-case materials receive stakeholder review to confirm they address real deployment scenarios.

                                                        Contributors: Abhinav Jha (ajabhinavjha30), Kristen Pol (kepol) [2] ---

                                                        AI Dashboard

                                                        The AI Dashboard module saw focused maintenance work during this period. A visual refinement was completed to ensure consistent display of descriptive text throughout the interface, improving overall readability and user experience.

                                                        This represents steady progress on polish and usability as the module matures. No major risks or blockers were identified during this period.

                                                        How can I help on this project?

                                                        • Consider whether the project needs dedicated design or user experience support to identify further usability improvements.
                                                        • Assess whether additional testing resources could help accelerate the path to a stable release.

                                                        Contributors: Rob Loach [1]

                                                        ---

                                                        AI translate

                                                        The AI translate project saw significant planning activity over the past 24 hours, with fourteen issues updated as teams prepare for a demonstration at DrupalCon Rotterdam 2026. Work is underway to make the module a production-ready alternative to manual content translation, with particular focus on cost reduction, editor experience, and integration with multilingual search.

                                                        Key areas of progress include:

                                                        Several bugs affecting media translation and layout builder workflows remain open and postponed, which is typical for a module at this stage.

                                                        How can I help on this project?

                                                        Confirm resource allocation for the DrupalCon Rotterdam demo delivery. Clarify whether automatic translation of referenced entities should be opt-in or default behaviour to unblock the design decision. Consider funding a dedicated QA cycle for the postponed media and workflow bugs once core features stabilise.

                                                        Contributors: Christoph Breidert (breidert) ---

                                                        FlowDrop

                                                        During the past 24 hours, FlowDrop reached a significant quality milestone by strengthening its internal code analysis to the highest available standard. The project advanced through two major quality levels in succession, improving type safety throughout the platform. This work touched every component of the system, including workflows, pipelines, sessions, jobs, memory systems, chat functionality, and the orchestration layer.

                                                        These improvements reduce the likelihood of runtime errors and make the codebase more maintainable over time. The changes ensure that data flowing through the system is more predictable and easier to validate, which should result in more reliable behaviour for users. Additionally, spelling checks were reinstated and British English was adopted as the project's documentation standard, improving consistency across all written materials.

                                                        This type of foundational work does not deliver immediately visible features but positions the project for faster, safer development of new capabilities in the future.

                                                        How can I help on this project?

                                                        Consider clarifying the roadmap priorities for user-facing features now that code quality has been strengthened. If the project is approaching a release milestone, allocating time for user testing or documentation review could ensure a smooth launch.

                                                        Contributors: Shibin Das [60]

                                                        ---

                                                        Langfuse

                                                        The Langfuse module made notable progress in the last 24 hours with the completion of work to enable user feedback collection. A new feedback capability was merged, adding a dedicated submodule that allows sites to capture and score user responses. This enhancement will enable organizations to gather structured feedback data, which can inform product improvements and better understand how users interact with AI-powered features.

                                                        The change represents a significant expansion of the module's functionality, moving beyond basic tracking to include mechanisms for measuring user satisfaction and response quality. This positions the module to support more comprehensive observability of AI features in production environments.

                                                        How can I help on this project?

                                                        Consider allocating resources for user testing of the new feedback features to validate real-world usability. Support outreach to early adopters who could provide case studies demonstrating business value. Evaluate whether additional investment is needed to accelerate progress toward a stable release.

                                                        Contributors: Abhisek Mazumdar (abhisekmazumdar) [1]

                                                        ---

                                                        AG-UI

                                                        No development activity was recorded during this period. One new performance issue was opened concerning chunkDelay/chunkPadding applied per-event compounds into real latency/timeout risk on long or tool-heavy runs. The report identifies that artificial delays and padding are being applied to every event sent to the browser, not just content chunks. For conversations involving multiple steps or tool usage, this overhead accumulates and can add several seconds of unnecessary delay to each response, which may affect user experience in production deployments.

                                                        The issue remains unassigned and no solution is yet in development. Given the module's maturity stage, open performance issues are expected as the project evolves.

                                                        How can I help on this project?

                                                        • Allocate developer time to investigate and resolve the performance overhead issue, particularly if this module supports user-facing or time-sensitive workflows.
                                                        • Clarify priority: decide whether optimising response times is critical for the current release or can be deferred to a later phase.
                                                        ======================================================================== ## [31] factcheck:capabilities:executive ======================================================================== Layer-1 corrections: 0 Judge flags: 0