ODS Adoption Guide
For teams that want to adopt ODS without reading the spec first.
This guide walks through adopting ODS L1 in a real team, from zero to full enforcement. It is designed to be copied, adapted, and shared with your engineering organization.
Overview
| Step | What you do | Time | Who |
|---|---|---|---|
| 1 | Add PR template | 2 min | One person |
| 2 | Add CI validation | 5 min | One person |
| 3 | Badge, report, PR comment | 5 min | One person |
| 4 | Progressive rollout | 1-2 weeks | Team lead |
| 5 | AI disclosure (optional) | 5 min | Team |
| 6 | Customize .ods.yaml | 15 min | Team lead |
Step 1: Add the PR Template
Goal: Every new PR starts with the right structure.
Run ods init to scaffold everything, or copy just the PR template:
# One-command scaffold (recommended)
ods init github
Or manually:
# Copy the PR template
curl -o .github/PULL_REQUEST_TEMPLATE.md \
https://raw.githubusercontent.com/open-delivery-spec/spec/main/examples/ods-pr-template.md
What changes:
.github/PULL_REQUEST_TEMPLATE.md— developers see this when opening a PR- Developers fill in Summary, Changes, Testing, AI Disclosure sections
- No CI enforcement yet — this is just a template
Success check: Open a test PR. The template appears in the description box.
Step 2: Add the validate-action
Goal: CI validates that every PR has the required metadata before merge.
Add these two workflow files to .github/workflows/:
ods-l1.yml — validates branch name and PR description on every PR:
name: ODS L1
on:
pull_request:
types: [opened, edited, synchronize, reopened]
permissions:
contents: read
pull-requests: write
issues: write
jobs:
ods:
runs-on: ubuntu-latest
steps:
- uses: open-delivery-spec/validate-action@v1
with:
check: all
branch_name: $
pr_body: $
strict: "true"
ods-commit-message.yml — validates commit messages on push:
name: ODS Commit Message
on: [push]
jobs:
ods-commit:
runs-on: ubuntu-latest
steps:
- uses: open-delivery-spec/validate-action@v1
with:
check: commit-message
commit_message: $
strict: "true"
[!TIP] Start with
strict: "false"to treat warnings as non-blocking. Switch to"true"after the team adjusts.
What changes:
- Every PR gets validated for branch naming and PR description
- Every push gets validated for commit message format
- Failed checks block merge (if branch protection is configured)
Success check: Open a PR with a branch like fix-bug. The check fails. Rename to bugfix/fix-null-pointer. The check passes.
Step 3: Make the Report Visible
Goal: Developers see compliance status without digging into CI logs.
The validate-action outputs three surfaces by default:
- PR comment — a compliance report is posted as a comment on every PR
- Job summary — a Markdown summary appears in the Actions run page
- Workflow artifact — HTML, JSON, SVG, and Markdown files downloadable from the run
Add an ODS badge to your README:
[](https://github.com/open-delivery-spec/spec)
Success check: Open a PR. The ODS bot posts a compliance comment. The Actions run shows the summary.
Step 4: Team Rollout
Goal: Adopt ODS across the team without friction.
Use progressive enforcement:
Week 1: Observe
strict: "false"
- All checks run but warnings don’t block merge
- Team gets used to the PR template and branch naming
- Review the ODS compliance report in PR comments — note common failures
Week 2: Warn
Enable branch protection:
- Require the ODS L1 check to pass before merge
- Team chat: share the most common failures and how to fix them
- Keep
strict: "false"so only hard errors block
Week 3+: Enforce
strict: "true"
- Warnings become errors
- AI disclosure becomes mandatory (if enabled)
- All PRs are fully ODS L1 compliant before merge
Team communication template:
We’re adopting Open Delivery Spec (ODS) to make our PRs easier to review — especially for AI-assisted changes. Starting this week, CI will check that every PR has a structured description and follows branch/commit conventions. The ODS bot posts a compliance report on each PR. This week is observe-only; next week we’ll require the check to pass. Questions? See our adoption guide.
Step 5: Add AI Disclosure
Goal: Make AI involvement in code changes explicit and machine-checkable.
If your team uses AI coding tools (Copilot, Cursor, Claude, etc.), enable AI disclosure:
Commit messages
Add AI attribution trailers to commit messages:
feat(auth): add OAuth login
AI-assisted: true
AI-tool: GitHub Copilot
AI-scope: token exchange, session management
AI-review: pending
PR descriptions
The PR template already includes the AI Disclosure section:
## AI Disclosure
- [x] This PR contains AI-generated code
- **AI Tool:** GitHub Copilot
- **AI Scope:** Provider abstraction, token exchange
- **Human Review:** Verified OAuth flow, redirect validation
Configure enforcement
In .ods.yaml:
policy:
ai_disclosure:
required: true
strict_tool_name: true
require_human_review: true
Success check: Create a PR with AI-generated code but no disclosure. The check warns or fails.
Step 6: Customize Policy
Goal: Tune ODS to your team’s conventions.
Create or edit .ods.yaml in your repo root:
profile: enterprise
policy:
branch:
allowed_types:
- feature
- bugfix
- hotfix
- release
- chore
- docs # add your team's types
require_ticket: false # set true if you use Jira tickets in branch names
max_description_length: 100
commit:
allowed_types:
- feat
- fix
- docs
- refactor
- test
- chore
require_scope: true
max_subject_length: 72
pr:
required_sections:
- "## Summary"
- "## Changes"
- "## Testing"
- "## Checklist"
# remove sections your team doesn't need
severity:
branch_type: error
branch_format: error
pr_sections: error
commit_type: error
commit_scope: warning # treat missing scope as a warning
Available profiles:
oss— no AI disclosure required, relaxed rulesenterprise— full L1 + AI disclosure (recommended)regulated— maximum enforcement with ticket requirements
Troubleshooting
“My branch name fails but our convention uses a different prefix”
Add your prefix to .ods.yaml:
policy:
branch:
allowed_types: [feature, bugfix, hotfix, release, chore, exp]
“My commit messages don’t use scopes”
Either add scopes, or relax the rule:
policy:
commit:
require_scope: false
severity:
commit_scope: warning
“The PR template has too many sections”
Remove sections from required_sections in .ods.yaml:
policy:
pr:
required_sections:
- "## Summary"
- "## Changes"
- "## Testing"
“I want to disable PR comments (too noisy)”
- uses: open-delivery-spec/validate-action@v1
with:
check: all
comment: "false"
Next Steps
- Read the spec to understand the schema details
- Explore scenarios for your project type
- Check the roadmap for upcoming features
- Contribute — ODS is open source