Thank you for helping build the OWASP Top 10 for Large Language Model Applications — 2026 release. This document is the step-by-step guide for contributing to this folder (2026/). It covers two distinct tracks:
- Track A — Propose a new entry — community members who want to write up a vulnerability or risk that is not currently in the list.
- Track B — Upgrade an existing entry — existing entry owners (and their sub-teams) who are iterating on an
LLM01–LLM10entry already in the repo.
Both tracks share the same pull-request workflow, style guide, and review rules. Those shared rules live in Shared workflow — read that section once; you will use it for every PR.
Important
All changes to this repository must be made through a pull request. There are no exceptions for contributors — direct pushes to main are blocked by branch protection. This applies to every change: new entries, entry upgrades, typo fixes, link repairs, artifact additions, style-guide edits, and README tweaks. If you are unsure whether your change qualifies, open a PR.
For the broader project-level contributor overview, see the repository-root README.md. The style guide lives in documentation/style/ and is required reading before submitting any prose.
| You are... | Use this track |
|---|---|
| Writing a brand-new risk/vulnerability proposal for the 2026 list | Track A |
Named in CODEOWNERS or on an entry sub-team and improving LLM01–LLM10 content |
Track B |
| Fixing a typo, broken link, or small style nit in any 2026 file | Track B (treat it as a small upgrade) |
| Adding glossary terms, diagrams, or style updates | Open a PR against documentation/ — outside the scope of this file |
Complete these once, before your first PR:
- GitHub account. Every change lands on
mainthrough a pull request — no exceptions. Direct pushes tomainare blocked by branch protection and will be rejected by the server. You work on a feature branch (in your fork or the upstream repo), open a PR, and merge only after it satisfies every rule in Branch protection and what reviewers will check. - Read the style guide. Every entry must follow:
documentation/style/README.md— overviewdocumentation/style/general.md— Markdown, headings, tone, US Englishdocumentation/style/entries.md— required sections and structure forLLMXXentriesdocumentation/style/branding.md— if you reuse project assets
- Skim the template. Every entry (new or upgraded) conforms to
2026/_template.md. It defines the five required sections: Description, Common Examples of Risk, Prevention and Mitigation Strategies, Example Attack Scenarios, Reference Links. - Enable signed commits. Required by branch protection on
main. See Signing your commits. - Review existing entries in
2026/so you understand tone, depth, and scope before you write.
2026/
├── CONTRIBUTING.md # this file
├── _template.md # entry template — copy this for new entries
├── LLM00_Preface.md # preface (non-numbered)
├── LLM01_PromptInjection.md # existing numbered entries LLM01..LLM10
├── ...
├── LLM10_UnboundedConsumption.md
├── new_entry_candidates/ # staging area for proposed (Track A) entries
└── artifacts/ # diagrams, PDFs, supporting images
Other directories you may touch indirectly:
.github/CODEOWNERS— required reviewers (see Review process).documentation/style/— style guide.
Use this track when you want to nominate a new risk/vulnerability for inclusion in the 2026 list. Your proposal lives in 2026/new_entry_candidates/ until the core team evaluates it for inclusion; if accepted, it is later promoted to a numbered LLMXX_*.md slot.
Before writing a full entry, open a GitHub issue describing the proposed risk in a sentence or two. This lets the core team flag overlaps with existing entries (LLM01–LLM10) early and saves you writing work.
The issue is optional but strongly recommended. Skip it only if the risk is clearly novel.
- Fork this repository to your GitHub account.
- Clone your fork locally:
git clone git@github.com:<your-username>/GenAI-LLM-Top10.git cd GenAI-LLM-Top10
- Add the upstream remote so you can stay in sync:
git remote add upstream git@github.com:GenAI-Security-Project/GenAI-LLM-Top10.git git fetch upstream
Branch from the latest main. Use the naming convention new-entry/<short-slug>:
git checkout -b new-entry/model-inversion upstream/mainCopy 2026/_template.md into 2026/new_entry_candidates/ and rename it using a descriptive slug (lowercase, hyphenated, no LLMXX prefix — numbering is assigned by the core team during promotion):
cp 2026/_template.md 2026/new_entry_candidates/model-inversion.mdYour entry must include all five sections defined in 2026/_template.md, in the same order, at the same heading levels:
## <Risk Name>— level-2 heading. Omit theLLMXX:prefix for Track A; numbering is assigned at promotion.### Description— what the risk is, at a high level. Follow the paragraph style indocumentation/style/entries.md.### Common Examples of Risk— at least one numbered example. High-level categorization, not attack code. See the Example of Risk vs. Attack Scenario guidance.### Prevention and Mitigation Strategies— at least one actionable mitigation. Numbered list.### Example Attack Scenarios— at least one concrete scenario, including sample prompts, code, or request flows where applicable. This is where technical specifics belong.### Reference Links— numbered list of citations. For arXiv papers, follow the arXiv-provided citation guidance. Format:[Title](URL): **Publisher/Outlet**.
Follow the project-wide Markdown and tone rules in documentation/style/general.md: ATX-style headings, US English spellings, no idioms, define jargon on first use, never skip heading levels.
See Signing your commits. Keep commits small and focused; one logical change per commit.
git add 2026/new_entry_candidates/model-inversion.md
git commit -S -m "Propose new entry: Model Inversion"git push -u origin new-entry/model-inversionOpen the PR against GenAI-Security-Project/GenAI-LLM-Top10:main. Use a clear title in the form New entry: <Risk Name>. Fill out the PR description with:
- A one-paragraph summary of the proposed risk.
- Why it is distinct from existing
LLM01–LLM10entries. - Any open questions you want reviewers to weigh in on.
- A link to the discussion issue from Step 1, if you opened one.
See Review process. New-entry PRs typically go through several rounds of revision; expect scope, wording, and scenario feedback from CODEOWNERS.
If the core team accepts the proposal, a CODEOWNER (not you) will:
- Rename your file from
2026/new_entry_candidates/<slug>.mdto the next available2026/LLMXX_<PascalCaseName>.md. - Add the
LLMXX:prefix to the level-2 heading. - Assign a sub-team owner in
CODEOWNERSfor ongoing maintenance (which moves the entry into Track B).
Use this track if you own, or are on the sub-team for, one of the numbered entries already present in 2026/ (LLM01_PromptInjection.md through LLM10_UnboundedConsumption.md), or if you are making a small fix (typo, link repair, style alignment) to any 2026 file.
Check CODEOWNERS to confirm you (or your sub-team) are the owner for the file you plan to edit. If you are not listed and the change is non-trivial, coordinate with the listed owner first — they control merge approval.
If you already have a fork from previous work, sync it:
git checkout main
git fetch upstream
git merge --ff-only upstream/mainOtherwise, follow Track A Step 2 — Fork and clone.
Branch from the latest main. Use one of these naming conventions:
upgrade/LLM0X-<short-slug>— substantive upgrades. Example:upgrade/LLM01-prompt-injection-multimodal.fix/<short-slug>— typos, broken links, small style corrections. Example:fix/llm03-dead-reference-link.
git checkout -b upgrade/LLM01-prompt-injection-multimodal upstream/mainEdit the existing file directly — do not copy it into new_entry_candidates/. Preserve the structure required by 2026/_template.md and documentation/style/entries.md: the same five sections, the same heading levels, the LLMXX: prefix on the level-2 heading.
Scope guidance for sub-teams:
- Prefer small, incremental PRs over one large rewrite. Each PR should address one coherent topic (e.g., "add multimodal attack scenarios", "refresh references", "clarify mitigation #3"). Large PRs slow reviews and invite merge conflicts.
- Coordinate cross-entry changes. If your upgrade touches terminology, examples, or mitigations referenced by other
LLMXXentries, notify the affected CODEOWNERS in your PR description. - Artifacts go in
2026/artifacts/. Diagrams and images live there; reference them with relative links (e.g.,). - Do not renumber entries. Numbering is owned by the core team; propose renumbering in a separate issue.
Before opening the PR, reread documentation/style/general.md and documentation/style/entries.md and confirm:
- Heading levels are sequential (no jumps from
##to####). - Bullet lists use
*; numbered lists use explicit numbers (1.,2.,3.). - US English spellings throughout.
- No undefined jargon or acronyms.
- All internal links resolve (click through each one).
- Reference entries follow the
[Title](URL): **Publisher**format.
See Signing your commits. Group related changes into one commit; keep unrelated changes in separate commits to ease review.
git add 2026/LLM01_PromptInjection.md 2026/artifacts/llm01-multimodal.png
git commit -S -m "LLM01: add multimodal prompt-injection attack scenario"git push -u origin upgrade/LLM01-prompt-injection-multimodalOpen the PR against GenAI-Security-Project/GenAI-LLM-Top10:main. Title format: LLM0X: <short description>. In the description:
- Summarize what changed and why.
- Note whether the sub-team has internally reviewed the change already.
- Flag any cross-entry impact (affected entries, owners notified).
- Link to the issue or discussion the upgrade responds to, if any.
See Review process.
Everything below applies to both tracks.
All changes to main must go through a pull request. Direct pushes, force-pushes, and branch deletions from contributor accounts are rejected at the server. Every PR must satisfy all of the following before it can merge:
- Opened as a pull request. The only path to
mainis a PR from a feature branch. There is no "direct commit" escape hatch for contributors. - Two approving reviews. Dismissed on new pushes. One must come from a
CODEOWNERSentry (enforced for every path). - Approval of the last push. Any new commits after approval require re-approval.
- All review conversations resolved.
- All commits signed. Unsigned commits are rejected.
- Linear history. No merge commits into your branch — rebase, don't merge. See Keeping your branch current.
- No force-pushes or deletions on
main(admins may bypass in emergencies; contributors cannot).
Repository admins can bypass these rules only in emergencies. Contributors should assume full enforcement at all times — if in doubt, open a PR.
Branch protection requires every commit to main to be signed. Set this up once per machine.
Option 1 — SSH signing (simplest if you already push via SSH).
- In GitHub → Settings → SSH and GPG keys, add your SSH public key a second time, this time with the type "Signing Key".
- Configure git locally:
git config --global gpg.format ssh git config --global user.signingkey ~/.ssh/id_ed25519.pub git config --global commit.gpgsign true
Option 2 — GPG signing.
- Generate or import a GPG key. Export the public key and paste it into GitHub → Settings → SSH and GPG keys.
- Configure git locally:
git config --global user.signingkey <YOUR-GPG-KEY-ID> git config --global commit.gpgsign true
Option 3 — Edit in the GitHub web UI. Commits made through the GitHub web editor are signed automatically by GitHub's web-flow key. This is the easiest path for small fixes.
Verify a commit is signed with git log --show-signature -1.
main requires linear history, so merge commits are rejected. Keep your branch current with rebase:
git fetch upstream
git rebase upstream/main
# resolve conflicts if any, then:
git push --force-with-leaseUse --force-with-lease (not --force) so you do not clobber reviewer commits that might have been pushed to your branch.
- Use the imperative mood:
LLM01: add multimodal attack scenario(notAdded...). - For entry changes, prefix with the entry ID:
LLM03:,LLM10:, etc. - For cross-cutting changes, use a plain description.
- Keep the subject line under ~72 characters; elaborate in the body if needed.
- Open your PR. Fill out the description completely.
- CI and any hooks run. Address any automated feedback.
- Request review from at least two reviewers — at least one must be a
CODEOWNERSentry (GitHub auto-requests them for changed paths). - Reviewers leave comments. Respond to each one. Either apply the suggestion or explain why not.
- When a conversation is resolved, click "Resolve conversation" on it — branch protection requires all threads resolved before merge.
- If you push new commits after approval, the existing approvals are dismissed. Re-request review.
- Once you have two approvals (including one CODEOWNER), all threads resolved, and a clean linear history, a maintainer (or you, if you have merge permissions) squashes or rebases the PR onto
main.
- Delete your feature branch from your fork.
- If your change affects other in-flight PRs (e.g., terminology shift), leave a comment on those PRs.
The full style guide is authoritative: documentation/style/. Highlights:
- Markdown. ATX-style headings (
#,##, ...), no skipped levels. - Language. US English. Clear, international, jargon-defined.
- Lists.
*for unordered; explicit numbers for ordered. - Emphasis.
**bold**,*italic*. - Links. Inline, to local paths where a local equivalent exists.
- Code. Backticks for inline, triple backticks for blocks.
- Tables. Markdown pipe syntax (see
documentation/style/general.md). - Images.
, with assets stored in2026/artifacts/.
Entry-specific rules (section order, heading level per section, Example of Risk vs. Example Attack Scenario) are detailed in documentation/style/entries.md.
- Content questions (what belongs in which section, scope of your entry): open a GitHub issue and tag the relevant CODEOWNERS.
- Style questions: reread
documentation/style/entries.md; if unclear, open an issue so the ambiguity gets fixed in the style guide itself. - Workflow / tooling questions (signing, rebasing, branch protection): open an issue or ask in your PR description — reviewers will help.
Thank you for contributing.