Repository navigation
PoC: AI Skills - #25976
PoC: AI Skills#25976thykel wants to merge 101 commits into
Conversation
The Automations update service drops actions that fail validation and applies the rest. Callers that need all-or-nothing pass strict: true. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One private conversation per user and work package. Answers can propose changes, which the user applies like the fixes of a finding. The prompt is an instance setting, not code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Generated by 🚫 Danger |
…s to AI::Assistance Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Seed QA assistance with Check health, Chat and Generate test cases, with prompts - Share the LLM call, the event log, the user locale, polling and the feature guard - Move lost references, comment-only and the proposal state into AI::Proposal - One list of changeable attributes (ChangeOptions::ATTRIBUTE_KEYS) - Run Comment after Notify, so Notify cannot replace a proposed comment - Neutral apply errors for chats, and a translated review state in Details - Remove unused code, columns (uuid, error_message) and the failed run status - Use Primer utilities instead of inline styles where they exist - Share the admin form views, validate the skill type in the model - Update the concept doc and outdated specs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nsistent Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The run service spec created a skill with an unknown key, which the skill_key validation now refuses. The run spec called terminal?, which the cleanup removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Users with the global permission manage_own_ai_assistants create their own assistants and skills at My account > AI assistants. A personal assistant shows only in its owner's menu, after the global ones, and uses the default model of the LLM connection. It is deleted with its owner. The admin list shows every assistant with its owner and filters by owner. The admin and the My account controllers share their actions and views. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add the associations on User that Danger asks for, as for AI text transform runs, and cover the deletion in the Principals::DeleteJob integration spec. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The rules report pull request findings in that area, but the review schema did not offer it to the model. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A pronoun guessed from a name can be wrong, so the output rules of every skill ask the model to refer to people by name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…heck dev adds a migration with the version 20261012120000, which the AI assistants migration had. The AI one is now 20261012120001. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Temporary, for previews, and not meant for dev: - The development people (departments, users, Tom Admin, the COMMS team and the AI assistants) are seeded also outside development. They need no factory_bot, unlike the rest of the development data. - After the demo data, the COMMS developers' workloads and a Refresh work package demo are seeded: the conference work package with the comments and meeting outcomes that its subject, description and fields do not show yet. - Pull previews switch on the ai_assistance feature flag. The LLM connection is still configured by hand. - The root seeder spec is skipped, because its counts no longer match. A fresh seed without development data was checked: all assistants, the team, the workloads and the Refresh case are there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Flaky specs
🤖 Ask Copilot to investigateCopy the prompt below into a new comment on this PR to delegate the investigation to GitHub Copilot. It will look into the flakiness and open a separate pull request with you as reviewer. |
GLM 5.3 often gives a finding a severity and the area "none". The answer format dropped such findings, also with a valid change, so the number of proposals changed from run to run. - Derive the area of a finding from its changed fields, else use the model's area; a finding with the area "none" is kept without one. - Tell the model that a finding uses a listed area, and that the newest comment or meeting wins when two disagree. - Log each dropped proposal with its reason in the "stored" event. - Ask the model once more, with the reasons, when an answer loses all its proposals. - Store proposals in a fixed order within a severity: by the first changed field, then by area. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replace the separate count_work_packages MCP tool with a generic,
optional grouping feature of SearchTool. A search tool can declare
groups (`group :status, column: ..., association: ...` or
`group :assignee, with: :method`). It then accepts `group_by` and
returns `groups: [{name, count}]` next to `total`. The new
`level_of_detail: "count"` returns only the total and the groups.
search_work_packages declares the groups status, type, priority,
project and assignee. The assignee logic is unchanged. The tool
descriptions, the AI Assistance tool rule, the seeded prompt and the
docs now name search_work_packages.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…heck Register the ai_assistance feature flag and LLM feature in the openproject-llm engine, now that dev moved the LLM connection there, and build proposal actions from the STI automation action templates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moves the AI Assistance app code, specs, factory, spec support and its five migrations under modules/llm, next to the LLM connection it uses. Class names, table names, route helpers and i18n keys stay the same. The core-file hunks move into the engine and module files: - routes, the admin and My account menus, both permissions, the inflections and the header button hook now live in the engine or in modules/llm/config - the Principal and User associations become engine patches - the en.yml additions move to modules/llm/config/locales/en.yml - BasicData::AiAssistantSeeder becomes BasicData::Llm::AiAssistantSeeder, with its data and the member role permission in the module common.yml Staying in core: the journal cause, the Automations actions, the MCP tool changes, and the demo-data seeders that the core seeders call. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- define ai_assistants on User and Group: a has_many patched onto Principal does not reach its already loaded STI subclasses - inherit the module seeder from BasicData::ModelSeeder - put require_module_spec_helper on its own line in the moved specs - expect the search_work_packages tool title in the chat poll spec Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Dev renamed core-stimulus/helpers/my-work-entry-menus to my-time-management-entry-menus, which broke the frontend build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The admin pages list and open only global and group assistants. A personal assistant belongs to its user, who manages it in My account. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restores the Angular op-wp-ai-assistance-slot from before 578d590: a labelled "AI Assistance" dropdown in the full view, and an icon button in the split view. It loads the menu from /ai_assistance/menu with the work package as the place. The app header button is removed: its view hook, component, Stimulus controller and engine wiring. The menu is now offered on work packages only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A skill that answers at once opens with its answer and a "Chat about this" button. The button shows the question field and the New chat and Send buttons. Once the user asked a question, and for chat skills, the dialog shows the full form. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Put on hold, Escalate and Assign to me: automations with a button, seeded with the rest of the AI Assistance demo on every install of this branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- sort the AI Assistance locale keys - split the methods that RuboCop finds too large into smaller ones, without changing their behavior - use params.expect for the record ids in the assistant controllers - break the multi-line render calls in the chat templates Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Warning Flaky specs
🤖 Ask Copilot to investigateCopy the prompt below into a new comment on this PR to delegate the investigation to GitHub Copilot. It will look into the flakiness and open a separate pull request with you as reviewer. |
Note
Proof of concept. It is not ready for a merge.
What this is
An AI Assistance menu in the app header, on every page. It offers skills from assistants that an admin sets up. Every skill opens a conversation, uses the permissions of the user who clicked, and writes nothing until that user applies a proposal.
search_work_packagestakesopen(true or false), a list of status ids and a list of assignee ids; the newcount_work_packagescounts work packages, optionally per status, type, priority, project or assignee, and lists every requested assignee, also with 0;search_userstakes a group, by id or name;search_custom_field_itemsalso returns the values of plain list fields.Llm::Runtime(fromdev) resolves the model of the "AI Assistance" feature: the assistant's own model, then the feature binding on the LLM connection, then the connection default. Tests on the demo data: Claude Sonnet 4.5 and 5.5 used the tools well and answered every test question correctly.gpt-4o-minioften skipped the tools and answered "none", so it is not enough for skills with tools.Automations::UpdateWorkPackageServicein strict mode, with alockVersioncheck and a journal cause. The activity entry names the assistant and the user who applied the change, for example "proposed by OP assistant and applied by Jane Doe". For the owner of the chat, it also links to the chat. Other users see the text without the link, because chats are private. A chat whose skill is no longer offered opens read-only. Each skill has a proposal scope: Changes, Comment only, or Read-only.Principals::DeleteJob, covered by its integration spec).Plan and review split
The concept, the decisions and the proposed split into stacked pull requests are in
docs/development/concepts/ai-assistance/README.md. Each commit is one step of that split. Steps 21–26 replaced runs, rules and the three skill types with conversations. For review, they are best folded into the earlier steps that they change. The MCP tool commits come after them, and the MCP tool changes can be reviewed on their own. The header button uses only extension points that a module has (a view hook, a dynamic Stimulus controller, and Angular services from the plugin context), so it can move into a plugin as it is.How to try
A fresh install of this branch, a pull preview included, seeds a demo (temporary, not for
dev):Steps:
ai_assistancefeature flag is on. Elsewhere, enable it in Administration → Experimental.Not in this pull request
mcp_serverfeature and the admin's MCP tool switches apply to external MCP clients only.format_textkeeps images from any host, and the image policy isimg-src *, so an injected instruction could make an answer load a URL that carries data. The planned fix runs the answer throughSanitizeagain with relative image sources only.search_time_entriesis not offered.2026-10-14-agents.md.🤖 Generated with Claude Code