Governance & Contribution
WAF++ is an open community project. This page describes how decisions are made and how you can contribute concretely – whether as a control author, reviewer, or pillar maintainer.
Governance Model
WAF++ follows established open-source governance models (inspired by CNCF and OpenSSF).
| Role | Responsibility |
|---|---|
Technical Steering Committee (TSC) |
Technical direction, breaking changes, pillar structure, schema changes. Decisions by consensus, majority vote in case of disagreement. |
Pillar Maintainer |
Responsible for all controls and narrative pages of a pillar. Review and merge of control PRs. At least one maintainer per active pillar. |
Contributor |
Submits controls, corrections, narrative pages, or best practices via pull request. No formal onboarding process required. |
User Advisory Group |
Brings practical perspective from projects, operations, and audits. No merge rights, but veto option for controls with direct compliance implications. |
All decisions are discussed and documented publicly on GitHub. There are no private decision channels.
Contributing – Quick Start
Contributing a New Control
Controls are the core of the framework. A good control is:
-
Normative – says "MUST", not "should"
-
Testable – has at least one automated check (
automated: true) -
Justified –
rationaleexplains the risk, not just the rule -
Practical –
example.compliantandexample.non_compliantare real Terraform
Workflow
-
Check on GitHub whether a similar control already exists or is being discussed (Issues / Discussions).
-
Assign a control ID: next free number in the pillar (e.g.
WAF-COST-110). Numbers are not reused. -
Create the YAML file according to Control Schema:
# Storage location modules/controls/controls/WAF-COST-110.yml -
Test checks locally against fixture Terraform:
wafpass check ./tests/fixtures/ --controls WAF-COST-110 --verbose -
Create narrative page (English):
# For Cost controls: modules/pillar-cost/pages/controls/WAF-COST-110.adoc # For Sovereign controls: modules/pillar-sovereign/pages/controls/WAF-SOV-NNN.adoc -
Open pull request – title:
feat: add WAF-COST-110 – [short title]
Checklist for Control PRs
-
YAML file created in
modules/controls/controls/ -
All required fields filled (
id,title,pillar,status,severity,category,description,rationale,checks) -
At least one check with
automated: true -
example.compliantandexample.non_compliantpresent -
regulatory_mappingfilled where applicable -
Narrative page created and linked in
references.narrative -
wafpass checkagainst fixture runs without errors -
Maturity levels (all 5) filled
Contributing Narrative Pages
Narrative pages are the human-readable explanation behind the controls. They are written in English (AsciiDoc).
Storage Locations
| Page type | Path |
|---|---|
Control detail page |
|
Best practice |
|
Case study |
|
Pillar main pages (definition, scope, etc.) |
|
Issues and Discussions
| Channel | Usage |
|---|---|
GitHub Issues |
Concrete bugs, incorrect controls, broken links, wrong assertions. Please include the control ID in the title. |
GitHub Discussions |
Conceptual discussions, new pillar ideas, feedback on maturity levels, questions about usage |
Pull Requests |
All code and documentation changes. Every PR should reference an issue. |
Issue Template for New Controls
## Control Proposal: WAF-\{PILLAR}-\{NNN}
**Pillar:** Cost / Sovereign / Security / ...
**Severity:** critical / high / medium / low
**Category:** (e.g. tagging, egress, encryption)
### Problem / Risk
[Which risk is currently not covered by existing controls?]
### Proposed Requirement
[What should the control require? Normative formulation: "All resources MUST ..."]
### Automated Check Possible?
[ ] Yes – via Terraform assertions
[ ] No – manual review required
### Regulatory Relevance
[GDPR / BSI C5 / ISO 27001 / FinOps / none]
RFC Process (Schema Changes)
Changes to the control schema or pillar structures that constitute breaking changes go through an RFC process:
-
Open an RFC issue with label
rfc– description of the change and justification -
Comment period – open for at least 14 days for community feedback
-
TSC decision – documented in the issue comment
-
Implementation – in branch
rfc/NNN-description, then PR againstmain
Breaking changes always receive a migration note in the changelog page.
Versioning and Releases
WAF++ uses semantic versioning (MAJOR.MINOR.PATCH):
| Version type | Trigger |
|---|---|
|
Incompatible schema changes, pillar restructuring, control IDs retired |
|
New controls, new narrative pages, new best practices |
|
Corrections to assertions, typos, and wording fixes, link fixes |
Releases are published as GitHub Releases with changelog. Control IDs are stable across minor versions – an assigned ID is never reused.
Further Reading
-
Control Schema Reference – complete YAML documentation for control authors
-
WAF++ PASS – CLI – test controls locally
-
Assessment Methodology – controls in practice
-
Roadmap – what’s coming next