Prepare v0.1.0: MIT license, /devsecops-engineer commands, README, and release scaffolding - #6
Conversation
…g fixes Release requirements -------------------- - License is now MIT. Replaces PolyForm Noncommercial across LICENSE.md, SKILL.md, README.md, CONTRIBUTING.md, MAINTAINERS.md, the CLA relicensing clause, and the issue-template contact links. Removes docs/legal/COMMERCIAL-LICENSING.md, which described a restriction that no longer exists. TRADEMARKS.md now states the boundary explicitly, since it used to lean on the noncommercial license: the code is MIT, the DSB names, logos, and curriculum are not. - Adds /devsecops-engineer:advise, :design, and :assess via .claude-plugin/plugin.json and commands/. Each command selects an operating mode, passes $ARGUMENTS through, and reads SKILL.md — nothing more. A command that restates a rule creates a second catalog nobody validates, so tests/test_commands.py fails any command containing a rule ID or an enforcement level, and the policy is written down in CONTRIBUTING.md. - README rewritten as a product front door: what it is, why (four outcomes), 60-second install, three runnable prompts, workflows, how the reasoning works, documentation index, status. Adds a table of contents and links every file under docs/ — docs/legal/CLA.md had never been reachable from it. tests/test_readme.py holds both properties. - Adds CHANGELOG.md with the v0.1.0 entry and explicit pre-1.0 language. A test asserts plugin.json and the changelog agree on the version, so they cannot diverge at tag time. - Moves project documentation into docs/. LICENSE.md stays at the root, where GitHub looks for it. Correctness fixes ----------------- - Re-keys 21 rules onto capabilities that describe what actually satisfies them, and adds the 10 capabilities they needed. Resolution keys on capability, so DSB-SRC-001, DSB-ID-002, DSB-EVD-001 and others previously resolved to REUSE the moment an organization declared any pipeline-configuration scanner — reporting branch protection and least privilege as satisfied by a tool that does neither. Likewise sbom-generation on DSB-BUILD-001, and secret-scanning on DSB-ID-003, which requires a secret store rather than a detector. - Fixes the GitHub Actions reference pipeline's DSB-EXC-003 assertion, whose grep pattern contained the literal string it searched for and so failed on a clean repository. Patterns now live in env, bracket-escaped, and allow a line annotated `# DSB-WARN:` because continue-on-error is how this platform expresses a WARN-level control. - Replaces `aws ecs deploy`, which is not an AWS CLI command, with describe/register/update-service by digest; adds the ECR registry and login that DSB-ART-001 requires; separates the publish role from the deployment roles; gates the scan jobs on test per DSB-TEST-001. - Pins the Jenkins shared library to a commit. `@v3` is a mutable reference and is the defect DSB-SC-002 exists to catch. - Adds five Workload Profile fields that SKILL.md documents and rules depend on but the schema rejected, and lets array fields express `unknown`. Two of the three published example profiles failed their own schema. - Pins tools/requirements.txt exactly. `>=` floors mean a commit does not resolve a fixed dependency set, which is what DSB-BUILD-002 forbids. - Corrects TESTING.md's validator demonstration, which targeted a string not present in SKILL.md and therefore proved nothing, and CONTRIBUTING.md's documented rule format, which omitted the curriculum module title the validator requires. Verification: validate_skill.py reports 42 rules across 11 families with no violations, the generated mapping index is current, and the suite is at 106 tests, up from 56. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a0d3c614e2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| **DSB-ID-002 — Deployment identity follows least privilege** | ||
| · cross-cutting · `pipeline-configuration-scanning` · BLOCK · applies when `deploy.targets exists` | ||
| · cross-cutting · `workload-identity-management` · BLOCK · applies when `deploy.targets exists` |
There was a problem hiding this comment.
Split identity controls before resolving them once
When existing_controls.workload-identity-management contains a full-scope OIDC provider, Step 3 resolves this capability once and consequently marks DSB-ID-002 as REUSE, even though federation does not prove that deployment roles are least-privileged; the same alias also suppresses DSB-ID-004 environment-separation findings. Give federation, privilege scoping, and environment isolation distinct capabilities, or support per-rule scope, so an identity tool cannot incorrectly satisfy unrelated BLOCK requirements.
Useful? React with 👍 / 👎.
| run: | | ||
| aws ecs deploy --service payments-api-staging \ | ||
| --image "${{ needs.image.outputs.digest }}" | ||
| aws ecs describe-task-definition --task-definition "$SERVICE" \ |
There was a problem hiding this comment.
Resolve the task definition from the ECS service
When an ECS service name differs from its task-definition family, this deployment fails before registering a revision because the AWS CLI option documentation limits --task-definition to a family, family:revision, or task-definition ARN, while this line passes the service name. Query the service's current taskDefinition ARN with describe-services, or introduce a separate task-definition-family setting, rather than assuming both names match.
Useful? React with 👍 / 👎.
leeclay95
left a comment
There was a problem hiding this comment.
Verified locally: validate_skill.py OK (42 rules / 11 families), generate_mappings.py --check current, 106 tests pass.
Closes the v0.1.0 scope from #180.
@damienjburks — this is scoped to the four things you asked for. The research, the alternate rule-catalog layout, and the methodology comparisons are tabled for v0.2.0+ as you requested; none of that is here.
There is a second section below containing correctness fixes found while working in the repo. One of them changes the normative catalog and needs your explicit sign-off — it is called out. Happy to split it into its own PR if you would rather review the release on its own.
Release requirements
1. License is now MIT
LICENSE.mdis the standard MIT text, kept at the repository root and free of appended clauses so GitHub detects it as MIT rather than "Other".Updated everywhere PolyForm was asserted:
SKILL.mdheader,README.md,docs/CONTRIBUTING.md,docs/MAINTAINERS.md, and the issue-template contact links. Deleteddocs/legal/COMMERCIAL-LICENSING.md— under MIT it describes a restriction that no longer exists.Two legal edits worth a second pair of eyes:
docs/legal/CLA.mdnamed PolyForm in its relicensing clause; changed to "the MIT License or another open-source or source-available license". The broad grant still functions, but whether you want a CLA at all under MIT is your call.docs/legal/TRADEMARKS.mdnow states the boundary explicitly. It previously leaned on the noncommercial license to keep branding separate; under MIT it has to say so itself — the code is MIT, the DSB names, logos, and curriculum are not.2. Command entry points
.claude-plugin/plugin.json(devsecops-engineer, v0.1.0, MIT) plus three commands:/devsecops-engineer:advise/devsecops-engineer:design/devsecops-engineer:assessEach is ~15 lines: select a mode, pass
$ARGUMENTSthrough, read${CLAUDE_PLUGIN_ROOT}/SKILL.md.assessdiscovers pipelines in the current repository when given no argument.Commands stay thin, and it is enforced. A command that restates a rule creates a second catalog nobody validates, and then
/devsecops-engineer:assessand a plain "review this pipeline" start giving different answers.tests/test_commands.pyfails any command containing a rule ID or an enforcement level, and the policy is written down indocs/CONTRIBUTING.md.SKILL.mdstays at the repository root. The single-file install path and the standalone guarantee are unchanged.3. README and onboarding
Rewritten as a product front door: what it is → why (four concrete outcomes) → 60-second install (skill and plugin) → three copy-paste prompts, each linked to the matching worked example → common workflows → how the reasoning works → documentation index → status → license.
Adds a table of contents, and links every file under
docs/.docs/legal/CLA.mdhad never been reachable from the README.tests/test_readme.pyasserts every ToC anchor resolves to a real heading and everydocs/**/*.mdis linked, so neither can drift.4. v0.1.0 release prep
CHANGELOG.mdwith the v0.1.0 entry and explicit pre-1.0 language: the catalog and output structure will evolve with real usage; rule IDs are already stable and are deprecated rather than renumbered. A test assertsplugin.jsonand the changelog agree on the version, so they cannot diverge at tag time.Also moved project documentation into
docs/to keep the root to the files people actually look for —README.md,SKILL.md,LICENSE.md,CHANGELOG.md. All moves are git renames, so history follows.Correctness fixes
Found while working in the repo. Each is verifiable, and each has a regression test.
Needs your sign-off: 21 rules were keyed to the wrong capability
SKILL.md§2 step 3 resolves each rule'scapabilityonce, so one declared tool satisfies every rule naming it. That made these resolve to REUSE — requirement satisfied the moment an organization declared any pipeline-configuration scanner:DSB-SRC-001branch protection,DSB-SRC-002review before merge,DSB-SRC-003fork trigger isolationDSB-ID-001/002/004federated identity, least privilege, environment separationDSB-EVD-001/002/003evidence retention, auditability, findings routingDSB-BUILD-004ephemeral build environmentsA Checkov-class tool does none of those things. Same shape elsewhere:
sbom-generationonDSB-BUILD-001meant Syft satisfied "builds execute from version-controlled source", andsecret-scanningonDSB-ID-003meant a detector satisfied a rule requiring a secret store.The fix adds 10 capabilities to the registry and re-keys 21 rules onto them:
build-traceability,dependency-resolution-control,build-environment-isolation,source-control-hardening,secrets-management,workload-identity-management,deployment-gating,pipeline-evidence-retention,security-findings-management,exception-management. §4's table is updated, and a paragraph explains why adjacent-sounding capabilities must stay distinct.This is a change to the normative catalog. No rule IDs, requirements, rationale, enforcement levels, or applicability conditions changed — only the capability each rule resolves against.
docs/CONTRIBUTING.mdgains a checklist item so it does not recur.The GitHub Actions reference pipeline failed on itself
delivery.yml's DSB-EXC-003 assertion grepped forcontinue-on-error: true, and its own source line contains that literal. Verified: it matched itself and exited 1 on a clean repository. That is indistinguishable from a real finding, and is how a check ends up deleted.Patterns now live in
env, bracket-escaped so they cannot self-match. The check also allows a line annotated# DSB-WARN: <rule-id>— §5.2 sayscontinue-on-erroris how this platform expresses WARN, so the blanket ban contradicted the skill. Both assertions verified: they pass on the file and still fire on real violations.Other example defects
aws ecs deployis not an AWS CLI command. Replaced withdescribe-task-definition→register-task-definition→update-service, pinned to the digest the scan passed against.docker push payments-api:…targeted the public default registry with no login, contradicting DSB-ART-001. Added the ECR registry and login, and split the publish role from the deployment roles per DSB-ID-002.test, contradicting DSB-TEST-001 (BLOCK) which the same file annotates as enforced. Nowneeds: test.@v3, a mutable reference — the exact defect DSB-SC-002 exists to catch. Pinned to a commit;tests/test_examples.pynow covers it.Schema rejected fields the rules depend on
schema/workload-profile.schema.jsonisadditionalProperties: falsebut omittedsource.fork_prs_allowed(DSB-SRC-003),policy.signing_required(DSB-ART-002),policy.provenance_required(DSB-ART-003),registry.*(DSB-SC-001), andcicd.shared_library— all documented in §2's closed vocabulary. Two of the three published example profiles failed their own schema. Array fields also could not expressunknown, though §2 says every field is tri-state. Fixed, with a test that walks §2's vocabulary block and fails on any field the schema rejects.Repository now follows its own rules
tools/requirements.txtpinned exactly.>=floors mean a commit does not resolve a fixed dependency set — DSB-BUILD-002 (BLOCK). Note this overlaps deps: update pyyaml requirement from >=6.0.2 to >=6.0.3 in /tools #3, deps: update pytest requirement from >=8.3.0 to >=9.1.1 in /tools #4, and deps: update jsonschema requirement from >=4.23.0 to >=4.26.0 in /tools #5; the pins match the versions Dependabot proposed, so those can likely be closed.generate_mappings.py --checkso the failure names its own fix.Documented procedures that did not work
TESTING.md's "prove the checks actually fire" exercise targetedmodule-2-6, module-3-1, a string not present inSKILL.md— a verified no-op that left the validator passing and taught the reader the opposite lesson. Rewritten and verified to fail.CONTRIBUTING.md's documented rule format omitted the curriculum module title the validator requires, so a contributor copying it got a CI failure.test_curriculum.pypinnedsnapshot_date == "2026-08-12", which turned following the documented refresh procedure into a broken build.Verification
Up from 56 tests. Every fix above has a test that fails without it. All relative Markdown links across the repository resolve.
Not in this PR
The alternate rule-catalog layout from the implementation report —
rules/build.yamlfamily files,scripts/validate_rules.py,references/capability-catalog.md,enforcement-model.md,applicability.md, restructuredexamples/advise|generate|review/— is a parallel implementation of what already works here, and is the research you asked to table.One correction to that report: it lists
DSB-SCAN-001..010andDSB-TEST-001..003. The live catalog has 8 SCAN rules and 2 TEST rules, and no-bloat behavior is carried by principles 5–7 plus the capability-resolution step rather than a dedicatedDSB-SCAN-010. The 42/11 totals are right; the per-family breakdown is not.After merge
Tag and publish
v0.1.0.🤖 Generated with Claude Code