Thanks for wanting to improve the DSB DevSecOps Engineering Skill.
This repository is maintained by The DevSec Blueprint. Contributions are welcome, with one constraint that shapes everything below: DSB rules define capabilities and outcomes, never vendors.
By contributing you agree to the Contributor License Agreement. Contributions are licensed under the MIT License, matching the repository.
For anything larger than a typo, open an issue first. A rule change is a change to engineering guidance that other people will apply to production pipelines — it deserves discussion before implementation.
Never make a specific product a requirement.
Wrong: "Projects must use Trivy to scan container images."
Right: "Container images must be scanned for known vulnerabilities.
Examples: Trivy, Grype, Prisma Cloud, Black Duck, Wiz."
If a contribution requires a named product, it will be rejected regardless of how good that product is. Organizations already own security tooling; the skill's job is to use what they have, not to sell them something else.
git clone https://github.com/devsecblueprint/devsecops-claude-skill.git
cd devsecops-claude-skill
uv venv && source .venv/bin/activate
uv pip install -r tools/requirements.txt
python tools/validate_skill.py
python -m pytestInstall your working copy to test it against a live agent:
mkdir -p ~/.claude/skills/dsb-devsecops
cp SKILL.md ~/.claude/skills/dsb-devsecops/Then start a fresh agent session and exercise it. SKILL.md changes are only real if
they change agent behavior — verify that, do not assume it.
Rules live in SKILL.md under section 3, grouped by family.
**DSB-SCAN-004 — Container image vulnerability scanning**
· scan · `container-image-scanning` · BLOCK · applies when `artifacts.container`, and not `runtime.serverless`
**Requirement.** What must be true. Written as an outcome, not an implementation.
**Why.** The engineering reason. This is the part people actually read.
*SSDF PW.4.1 · SLSA build-L2 · OWASP CICD-SEC-4 · Curriculum: module-2-6 (Container Security Overview)*Every curriculum citation carries the module's real title, exactly as
references/dsb-curriculum.yaml spells it. validate_skill.py rejects a bare
module-2-6, because without the title an agent invents a plausible-sounding one
and sends a learner looking for a module that does not exist under that name.
- ID is new and permanent. Never reuse a retired ID — they appear in audit records. Take the next free number in the family.
- Family is correct.
DSB-SCANis application-layer scanning; IaC scanning belongs inDSB-IAC; pipeline security belongs inDSB-SRC,DSB-ID, orDSB-SC. - Capability exists in
references/capabilities.yaml. Add it there first if genuinely new — and check it is not an existing capability under another name. - Capability is what actually satisfies the rule, not the nearest-sounding entry in the registry. Resolution keys on capability, so a rule pointed at an adjacent capability reports itself REUSE the moment the organization declares any tool providing that other thing. Ask: would a tool that does only this capability genuinely satisfy this requirement? If not, the rule needs a different capability, or a new one.
- Applicability references only closed-vocabulary fields from the Workload
Profile in
SKILL.md§2. - Applicability never references
ownershiporexisting_controls. Those decide who satisfies a control, not whether it applies. Putting them in applicability destroys the DELEGATED outcome and erases the record that the control matters. - Enforcement default is justified. BLOCK means delivery genuinely should stop. Reserve it for controls where shipping past a finding is the wrong outcome.
- At least one framework mapping — SSDF, SLSA, OWASP CI/CD, OWASP SAMM, or CNCF.
- At least one curriculum module, and it must exist in
references/dsb-curriculum.yaml. - Tooling examples are plural and vendor-neutral. Never one product.
-
python tools/validate_skill.pypasses. -
python tools/generate_mappings.pyre-run, and the result committed.
Applicability answers one question: does this risk exist for this workload?
It is evaluated with three-valued logic, so state predicates in terms that can come back TRUE, FALSE, or UNKNOWN. A rule that can never be FALSE is a rule that will be recommended to everyone, which is the checklist thinking this methodology rejects.
Ask yourself: what workload would make this rule Not Applicable? If you cannot answer, the rule is probably too broad.
commands/ holds the /devsecops-engineer:* entry points. Each one selects an
operating mode, passes the user's arguments in, and points at SKILL.md. That is all
they may do.
No rule logic in a command. No rule IDs, no enforcement levels, no applicability
conditions, no capability lists, no output tables. The moment a command restates part
of the catalog, there are two catalogs, and the one nobody validates starts drifting —
so /devsecops-engineer:assess and a plain "review this pipeline" begin giving
different answers. tests/test_commands.py enforces this.
If a command feels like it needs a rule, the rule belongs in SKILL.md where the
validator can see it, and the command should say which mode to run instead.
The four phases, the twenty baseline principles, and the enforcement model come from DSB curriculum. They are not changed through pull requests to this repository — open an issue in devsecblueprint/devsecblueprint instead.
This skill implements DSB teaching. It is not the source of it, and it must never diverge from it.
docs/framework-mappings.md is generated from the mappings lines in SKILL.md.
Do not edit it by hand:
python tools/generate_mappings.py # rewrite it
python tools/generate_mappings.py --check # exit 1 if it is out of datetests/test_mappings.py fails when the committed file drifts, so a rule change that
touches mappings will fail CI until it is regenerated.
The YAML files under rules/ are a partial projection of the catalog with a
deliberately limited scope — read rules/README.md before adding
to them.
references/dsb-curriculum.yaml mirrors frontend/lib/curriculum-data.ts from the
platform repository. It is refreshed manually so this repository stays self-contained
with no cross-repository CI coupling.
When the curriculum changes:
- Read the current
CURRICULUM_STAGESin the platform repo. - Update stage and module IDs and names here. Quote every name — several contain
?, which YAML flow mappings reject. - Update
snapshot_date. - Run
python tools/validate_skill.py— it fails if any rule cites a module that no longer exists.
SKILL.md is the entire product. A user should need nothing else.
- No references to other files in this repository. No relative links, no "see
references/…". If a user copiesSKILL.mdalone, it must be complete. - Keep tables narrow. Agent output is often read in an 80-column terminal. Wide tables render as unreadable overlapping text.
- Watch the size. Every invocation loads the whole file. Prefer tightening existing prose over appending.
An installed skill directory must contain SKILL.md and nothing else:
ls ~/.claude/skills/dsb-devsecops/Anything alongside it is a file a user would also have to download, which breaks the distribution model.
- One logical change per PR. A new rule family is several PRs, not one.
- Explain the engineering reasoning, not just what changed.
- Note any behavior change you observed when testing against a live agent.
- CI must pass.
Open an issue, or ask in the DSB Discord.